{"id":"advanced-samples/2-vtext","title":"2 vtext","description":"Vertical text layout: two columns of digits running top to bottom on yellow and red panels, under a Hello World heading. #text #layout","source":"origami","authoring":[],"apis":["expressions","interaction","layout","text"],"flags":["animated","expressions"],"tags":["layout","text"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":19915,"ops":1863,"width":600,"height":600,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/advanced-samples/2-vtext/doc.rc","json":null}
{"id":"advanced-samples/alignment-and-justification","title":"alignment and justification","description":"Side-by-side lorem ipsum blocks comparing left alignment against basic justification. #text #layout #validation","source":"origami","authoring":[],"apis":["layout","text"],"flags":[],"tags":["layout","text","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1867,"ops":150,"width":600,"height":600,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/advanced-samples/alignment-and-justification/doc.rc","json":null}
{"id":"advanced-samples/balls-animation-example","title":"balls animation example","description":"Coloured balls falling on a dark grid, each leaving a fading trail. #animation","source":"origami","authoring":[],"apis":["drawCircle","drawLine","drawRect","expressions","paint","text"],"flags":["animated","expressions"],"tags":["animation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":4466,"ops":139,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/advanced-samples/balls-animation-example/doc.rc","json":null}
{"id":"advanced-samples/base","title":"base","description":"Simple Timer","source":"origami","authoring":[],"apis":["expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1395,"ops":67,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/advanced-samples/base/doc.rc","json":null}
{"id":"advanced-samples/canvas","title":"canvas","description":"Canvas basics: a blue field crossed by red diagonals with a centred cyan Hello, World! panel. #validation","source":"origami","authoring":[],"apis":["drawLine","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":605,"ops":44,"width":600,"height":600,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/advanced-samples/canvas/doc.rc","json":null}
{"id":"advanced-samples/check-touch-x","title":"check touch x","description":"Touch probe: a small blue half-disc pinned to the left edge, used to check horizontal touch coordinates. #interaction #validation","source":"origami","authoring":["json"],"apis":["drawCircle","interaction","layout","paint"],"flags":[],"tags":["interaction","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":184,"ops":20,"width":0,"height":0,"hasJson":true,"jsonReproduces":"differs","src":[],"rc":"docs/advanced-samples/check-touch-x/doc.rc","json":"docs/advanced-samples/check-touch-x/doc.json"}
{"id":"advanced-samples/cube3d","title":"cube3d","description":"Wireframe-shaded 3D cube, cyan top face and red front, inside a dark circular vignette. #3d","source":"origami","authoring":[],"apis":["conditionals","drawCircle","drawPath","expressions","layout","paint","transforms"],"flags":["animated","expressions"],"tags":["3d"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2738,"ops":117,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/advanced-samples/cube3d/doc.rc","json":null}
{"id":"advanced-samples/demo-graphs1","title":"demo graphs1","description":"Line and area chart, red curves over a navy grid with labelled axes and a legend. #graph","source":"origami","authoring":[],"apis":["drawLine","drawPath","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["graph"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":3191,"ops":131,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/advanced-samples/demo-graphs1/doc.rc","json":null}
{"id":"advanced-samples/demo-text-transform","title":"demo text transform","description":"Simple Timer","source":"origami","authoring":[],"apis":["drawCircle","drawRoundRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1502,"ops":101,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/advanced-samples/demo-text-transform/doc.rc","json":null}
{"id":"advanced-samples/double-pendulum-example","title":"double pendulum example","description":"Double pendulum swinging on black, drawing a decaying trail of its path. #animation","source":"origami","authoring":[],"apis":["drawCircle","drawLine","drawRect","expressions","paint","text"],"flags":["animated","expressions"],"tags":["animation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2461,"ops":102,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/advanced-samples/double-pendulum-example/doc.rc","json":null}
{"id":"advanced-samples/linear-regression","title":"linear regression","description":"Linear Regression Demo","source":"origami","authoring":[],"apis":["drawCircle","drawLine","drawPath","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T10:56:47-07:00","bytes":3387,"ops":117,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/advanced-samples/linear-regression/doc.rc","json":null}
{"id":"advanced-samples/paths-demos","title":"paths demos","description":"Overlapping red and blue path shapes, demonstrating path construction and fill. #drawPath","source":"origami","authoring":[],"apis":["clip","conditionals","drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","interaction","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["drawpath"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":24850,"ops":449,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/advanced-samples/paths-demos/doc.rc","json":null}
{"id":"advanced-samples/pressure-gauge","title":"pressure gauge","description":"Radial pressure gauge with a fine tick scale reading 799 mmHg between Low and High. #iot #widget","source":"origami","authoring":[],"apis":["conditionals","drawArc","drawLine","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot","widget"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1907,"ops":78,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/advanced-samples/pressure-gauge/doc.rc","json":null}
{"id":"advanced-samples/rc-flow","title":"rc flow","description":"Flow layout of vertical digit columns on yellow and red panels beneath a Hello World heading. #layout #text","source":"origami","authoring":[],"apis":["layout"],"flags":[],"tags":["layout","text"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":514,"ops":38,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/advanced-samples/rc-flow/doc.rc","json":null}
{"id":"advanced-samples/stock","title":"stock","description":"Stock watchlist card showing Dow Jones at 47,739.32, down 0.45%, with a refresh control. #widget","source":"origami","authoring":[],"apis":["clip","drawLine","drawPath","expressions","interaction","layout","loop","paint","text","theming","transforms"],"flags":["animated","expressions"],"tags":["widget"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":21406,"ops":588,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/advanced-samples/stock/doc.rc","json":null}
{"id":"androidx-demos/activity-rings","title":"activity rings","description":"Three concentric activity rings in red, green and blue showing 78%, 62% and 91%. #widget","source":"androidx","authoring":[],"apis":["drawArc","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["androidx","widget"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":3417,"ops":93,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/activity-rings/doc.rc","json":null}
{"id":"androidx-demos/anchored-text","title":"anchored text","description":"Text anchoring reference: the same string drawn at top, centre, bottom and baseline against guide lines. #text #validation","source":"androidx","authoring":[],"apis":["conditionals","drawLine","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["androidx","text","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1346,"ops":74,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/anchored-text/doc.rc","json":null}
{"id":"androidx-demos/attribute-string","title":"attribute string","description":"Attributed text demo: bold, italic, coloured, underlined, highlighted, oversized and superscript runs in one string. #text","source":"androidx","authoring":[],"apis":["drawLine","expressions","layout","text"],"flags":["animated","expressions"],"tags":["androidx","text"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2459,"ops":266,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/attribute-string/doc.rc","json":null}
{"id":"androidx-demos/base","title":"base","description":"Simple Timer","source":"androidx","authoring":[],"apis":["expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1427,"ops":68,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/base/doc.rc","json":null}
{"id":"androidx-demos/battery-radial-gauge","title":"battery radial gauge","description":"Battery gauge as a green radial arc at 67%, with 8.5 hours remaining. #iot #widget","source":"androidx","authoring":[],"apis":["drawArc","drawLine","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["androidx","iot","widget"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":3317,"ops":78,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/battery-radial-gauge/doc.rc","json":null}
{"id":"androidx-demos/bitmap-font-watch","title":"bitmap font watch","description":"Analogue watch face with Roman numerals and copper hour markers, drawn with a bitmap font. #clock","source":"androidx","authoring":[],"apis":["conditionals","drawCircle","drawLine","drawRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","clock"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1756,"ops":123,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/bitmap-font-watch/doc.rc","json":null}
{"id":"androidx-demos/c-box","title":"c box","description":"Component check: a single red box. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":128,"ops":8,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-box/doc.rc","json":null}
{"id":"androidx-demos/c-collapsible-column","title":"c collapsible column","description":"Component check: a collapsible column of red and blue bands. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":284,"ops":20,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-collapsible-column/doc.rc","json":null}
{"id":"androidx-demos/c-collapsible-row","title":"c collapsible row","description":"Component check: a collapsible row of red and blue columns. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":284,"ops":20,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-collapsible-row/doc.rc","json":null}
{"id":"androidx-demos/c-column","title":"c column","description":"Component check: a column stacking red, green, blue and grey children. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":348,"ops":24,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-column/doc.rc","json":null}
{"id":"androidx-demos/c-fit-box","title":"c fit box","description":"DemoFitBox","source":"androidx","authoring":[],"apis":["layout","text"],"flags":[],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":267,"ops":22,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-fit-box/doc.rc","json":null}
{"id":"androidx-demos/c-flow","title":"c flow","description":"DemoFlow","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1037,"ops":69,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-flow/doc.rc","json":null}
{"id":"androidx-demos/c-image","title":"c image","description":"Component check: an image child rendered as a grey placeholder block. #images #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","images","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1455,"ops":9,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-image/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-align-by-baseline","title":"c modifier align by baseline","description":"DemoModifierAlignByBaseline","source":"androidx","authoring":[],"apis":["layout","text"],"flags":[],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":250,"ops":21,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-align-by-baseline/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-background","title":"c modifier background","description":"Component check: background modifier, a red band above a blue one. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":247,"ops":19,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-background/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-background-id","title":"c modifier background id","description":"Component check: background supplied by resource id rather than a literal colour. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":145,"ops":9,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-background-id/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-border","title":"c modifier border","description":"Modifier check: border, drawn as a red-outlined square above a blue-outlined one. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":262,"ops":18,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-border/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-clip-circle","title":"c modifier clip circle","description":"Modifier check: clip to a circle, applied to a green block. #clip #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","clip","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":128,"ops":8,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-clip-circle/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-clip-rect","title":"c modifier clip rect","description":"Modifier check: clip to a rectangle, applied to a red block. #clip #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","clip","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":129,"ops":9,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-clip-rect/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-clip-rounded-rect","title":"c modifier clip rounded rect","description":"Modifier check: clip to a rounded rectangle, applied to a blue block. #clip #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","clip","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":145,"ops":9,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-clip-rounded-rect/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-collapsible-priority","title":"c modifier collapsible priority","description":"Modifier check: collapsible priority deciding which of three children gives up space first. #layout #validation","source":"androidx","authoring":[],"apis":[],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":302,"ops":0,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-collapsible-priority/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-component-id","title":"c modifier component id","description":"Modifier check: a component addressed by id, shown as a small red block. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":128,"ops":8,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-component-id/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-compute-measure","title":"c modifier compute measure","description":"DemoModifierComputeMeasure","source":"androidx","authoring":[],"apis":["expressions","layout"],"flags":["animated","expressions"],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":207,"ops":12,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-compute-measure/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-compute-position","title":"c modifier compute position","description":"DemoModifierComputePosition","source":"androidx","authoring":[],"apis":["expressions","layout"],"flags":["animated","expressions"],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":370,"ops":22,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-compute-position/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-dynamic-border","title":"c modifier dynamic border","description":"Modifier check: a border whose width is driven by an expression rather than a constant. #layout #expressions #validation","source":"androidx","authoring":[],"apis":["expressions","layout"],"flags":["animated","expressions"],"tags":["androidx","expressions","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":157,"ops":9,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-dynamic-border/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-fill-max-height","title":"c modifier fill max height","description":"Modifier check: fillMaxHeight, a magenta column stretched to the full height available. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":174,"ops":14,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-fill-max-height/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-fill-max-size","title":"c modifier fill max size","description":"Modifier check: fillMaxSize, a yellow block expanded to fill both axes. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":128,"ops":8,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-fill-max-size/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-fill-max-width","title":"c modifier fill max width","description":"Modifier check: fillMaxWidth, a cyan band stretched across the full width. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":174,"ops":14,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-fill-max-width/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-fill-parent-max-height","title":"c modifier fill parent max height","description":"Modifier check: fillParentMaxHeight. Draws nothing at the default size, so it is only meaningful inside a sized parent. #layout #validation","source":"androidx","authoring":[],"apis":["interaction","layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":330,"ops":26,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-fill-parent-max-height/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-fill-parent-max-size","title":"c modifier fill parent max size","description":"Modifier check: fillParentMaxSize. Draws nothing at the default size, so it is only meaningful inside a sized parent. #layout #validation","source":"androidx","authoring":[],"apis":["interaction","layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":251,"ops":19,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-fill-parent-max-size/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-fill-parent-max-width","title":"c modifier fill parent max width","description":"Modifier check: fillParentMaxWidth. Draws nothing at the default size, so it is only meaningful inside a sized parent. #layout #validation","source":"androidx","authoring":[],"apis":["interaction","layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":330,"ops":26,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-fill-parent-max-width/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-height","title":"c modifier height","description":"Modifier check: a fixed height applied to a green block. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":128,"ops":8,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-height/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-height-in","title":"c modifier height in","description":"Modifier check: heightIn bounds, a short red and blue pair constrained to a height range. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":229,"ops":17,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-height-in/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-horizontal-scroll","title":"c modifier horizontal scroll","description":"DemoModifierHorizontalScroll","source":"androidx","authoring":[],"apis":["interaction","layout","text"],"flags":[],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2954,"ops":275,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-horizontal-scroll/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-horizontal-weight","title":"c modifier horizontal weight","description":"Modifier check: horizontal weight splitting a row between a red and a wider blue child. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":247,"ops":19,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-horizontal-weight/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-on-click","title":"c modifier on click","description":"DemoModifierOnClick","source":"androidx","authoring":[],"apis":["layout","text"],"flags":[],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":217,"ops":19,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-on-click/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-on-touch-cancel","title":"c modifier on touch cancel","description":"DemoModifierOnTouchCancel","source":"androidx","authoring":[],"apis":["layout","text"],"flags":[],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":229,"ops":19,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-on-touch-cancel/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-on-touch-down","title":"c modifier on touch down","description":"DemoModifierOnTouchDown","source":"androidx","authoring":[],"apis":["layout","text"],"flags":[],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":225,"ops":19,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-on-touch-down/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-on-touch-up","title":"c modifier on touch up","description":"DemoModifierOnTouchUp","source":"androidx","authoring":[],"apis":["layout","text"],"flags":[],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":223,"ops":19,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-on-touch-up/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-padding","title":"c modifier padding","description":"Modifier check: padding, insetting a blue block from the red one above it. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":318,"ops":22,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-padding/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-size","title":"c modifier size","description":"Modifier check: an explicit size on each of two children, one red and one blue. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":229,"ops":17,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-size/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-spaced-by","title":"c modifier spaced by","description":"Modifier check: spacedBy, three small red, green and blue squares separated by a fixed gap. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":320,"ops":24,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-spaced-by/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-vertical-scroll","title":"c modifier vertical scroll","description":"DemoModifierVerticalScroll","source":"androidx","authoring":[],"apis":["interaction","layout","text"],"flags":[],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1372,"ops":135,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-vertical-scroll/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-vertical-weight","title":"c modifier vertical weight","description":"Modifier check: vertical weight splitting a column between a red child and a taller blue one. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":247,"ops":19,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-vertical-weight/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-visibility","title":"c modifier visibility","description":"Modifier check: visibility, with the visible child shown as a red block. #layout #validation","source":"androidx","authoring":[],"apis":["expressions","layout"],"flags":["animated","expressions"],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":154,"ops":10,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-visibility/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-width","title":"c modifier width","description":"Modifier check: a fixed width applied to a blue block. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":128,"ops":8,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-width/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-wrap-content-height","title":"c modifier wrap content height","description":"Modifier check: wrapContentHeight, collapsing the child to a small dark square. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":207,"ops":15,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-wrap-content-height/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-wrap-content-size","title":"c modifier wrap content size","description":"Modifier check: wrapContentSize. Collapses the child to nothing at the default size. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":207,"ops":15,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-wrap-content-size/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-wrap-content-width","title":"c modifier wrap content width","description":"Modifier check: wrapContentWidth, collapsing the child to a small dark square. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":207,"ops":15,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-wrap-content-width/doc.rc","json":null}
{"id":"androidx-demos/c-modifier-zindex","title":"c modifier zindex","description":"Modifier check: zIndex, a blue square drawn over an offset red one to show stacking order. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":265,"ops":21,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-modifier-zindex/doc.rc","json":null}
{"id":"androidx-demos/c-row","title":"c row","description":"Component check: a row placing red, green and blue children beside a grey remainder. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":348,"ops":24,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-row/doc.rc","json":null}
{"id":"androidx-demos/c-state-layout","title":"c state layout","description":"Component check: a state-driven layout, shown here in its blue state. #layout #validation","source":"androidx","authoring":[],"apis":["expressions","layout"],"flags":["animated","expressions"],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":268,"ops":20,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-state-layout/doc.rc","json":null}
{"id":"androidx-demos/c-text","title":"c text","description":"DemoText","source":"androidx","authoring":[],"apis":["layout","text"],"flags":[],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":265,"ops":21,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-text/doc.rc","json":null}
{"id":"androidx-demos/c-text-auto-size","title":"c text auto size","description":"DemoTextAutoSize","source":"androidx","authoring":[],"apis":["layout","text"],"flags":[],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":236,"ops":17,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/c-text-auto-size/doc.rc","json":null}
{"id":"androidx-demos/calendar-heatmap-grid","title":"calendar heatmap grid","description":"Contribution heatmap over the last 35 days, green cells scaled from Less to More. #graph #widget","source":"androidx","authoring":[],"apis":["drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["androidx","graph","widget"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":3728,"ops":126,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/calendar-heatmap-grid/doc.rc","json":null}
{"id":"androidx-demos/clock","title":"clock","description":"Simple Timer","source":"androidx","authoring":[],"apis":["drawCircle","drawLine","drawPath","expressions","layout","loop","paint","text","theming","transforms"],"flags":["animated","expressions"],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2050,"ops":133,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/clock/doc.rc","json":null}
{"id":"androidx-demos/clock-demo1-clock1","title":"clock demo1 clock1","description":"Analogue clock on a brushed grey dial with a black knurled bezel. #clock","source":"androidx","authoring":[],"apis":["clip","drawCircle","drawLine","drawPath","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","clock"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2369,"ops":127,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/clock-demo1-clock1/doc.rc","json":null}
{"id":"androidx-demos/clock-demo2-jancy-clock2","title":"clock demo2 jancy clock2","description":"Analogue clock with a blue steel dial, tick bezel and a red second hand. #clock","source":"androidx","authoring":[],"apis":["clip","conditionals","drawCircle","drawLine","drawPath","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","clock","featured"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1989,"ops":113,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/clock-demo2-jancy-clock2/doc.rc","json":null}
{"id":"androidx-demos/clock-demo2-jclock2","title":"clock demo2 jclock2","description":"World clock: a central dial ringed by eight sub-dials showing New York, Denver, Los Angeles, Anchorage, Hawaii, Buenos Aires and Caracas. #clock","source":"androidx","authoring":[],"apis":["clip","conditionals","drawCircle","drawLine","drawPath","expressions","interaction","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","clock"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":23190,"ops":1553,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/clock-demo2-jclock2/doc.rc","json":null}
{"id":"androidx-demos/cm-odifier-width-in","title":"cm odifier width in","description":"Modifier check: widthIn bounds, a red and a blue block constrained to a width range. #layout #validation","source":"androidx","authoring":[],"apis":["layout"],"flags":[],"tags":["androidx","layout","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":229,"ops":17,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/cm-odifier-width-in/doc.rc","json":null}
{"id":"androidx-demos/color","title":"color","description":"Simple Timer","source":"androidx","authoring":[],"apis":["drawRoundRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":880,"ops":60,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/color/doc.rc","json":null}
{"id":"androidx-demos/color-list","title":"color list","description":"Simple Timer","source":"androidx","authoring":[],"apis":["expressions","interaction","layout","loop","text","theming"],"flags":["animated","expressions"],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":70053,"ops":6193,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/color-list/doc.rc","json":null}
{"id":"androidx-demos/color-table","title":"color table","description":"Simple Timer","source":"androidx","authoring":[],"apis":["expressions","interaction","layout","text"],"flags":["animated","expressions"],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":81385,"ops":5731,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/color-table/doc.rc","json":null}
{"id":"androidx-demos/color-theme","title":"color theme","description":"Simple Timer","source":"androidx","authoring":[],"apis":["interaction","layout","text"],"flags":[],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":53346,"ops":4150,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/color-theme/doc.rc","json":null}
{"id":"androidx-demos/count-down","title":"count down","description":"Overlapping translucent colour discs arranged as a flower, labelled with the current hue value. #animation","source":"androidx","authoring":[],"apis":["drawCircle","expressions","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","animation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":705,"ops":37,"width":600,"height":600,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/count-down/doc.rc","json":null}
{"id":"androidx-demos/countdown","title":"countdown","description":"Large countdown digit on a grey gradient, split by a vertical seam where the flip occurs. #clock #animation","source":"androidx","authoring":[],"apis":["drawArc","drawLine","drawRoundRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","animation","clock"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1024,"ops":48,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/countdown/doc.rc","json":null}
{"id":"androidx-demos/cube3d","title":"cube3d","description":"Shaded 3D cube, cyan top face and red front, inside a dark circular vignette. #3d","source":"androidx","authoring":[],"apis":["conditionals","drawCircle","drawPath","expressions","layout","paint","transforms"],"flags":["animated","expressions"],"tags":["3d","androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2767,"ops":119,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/cube3d/doc.rc","json":null}
{"id":"androidx-demos/demo-bitmap-drawing-bit-draw1","title":"demo bitmap drawing bit draw1","description":"Bitmap tiling: a repeated red, green and blue motif clipped to a circle. #images","source":"androidx","authoring":[],"apis":["drawCircle","expressions","images","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","images"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":3602,"ops":108,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/demo-bitmap-drawing-bit-draw1/doc.rc","json":null}
{"id":"androidx-demos/demo-bitmap-drawing-bit-draw2","title":"demo bitmap drawing bit draw2","description":"Bitmap tiling: black discs on a yellow grid, repeated across the canvas. #images","source":"androidx","authoring":[],"apis":["drawCircle","expressions","images","layout","paint","text"],"flags":["animated","expressions"],"tags":["androidx","images"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":3527,"ops":97,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/demo-bitmap-drawing-bit-draw2/doc.rc","json":null}
{"id":"androidx-demos/demo-flick-flick-test","title":"demo flick flick test","description":"Flick gesture test: a vertical track with a draggable green handle and a numeric readout. #interaction","source":"androidx","authoring":[],"apis":["drawCircle","drawRect","drawRoundRect","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["androidx","interaction"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":978,"ops":48,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/demo-flick-flick-test/doc.rc","json":null}
{"id":"androidx-demos/demo-graphs0","title":"demo graphs0","description":"Simple Timer","source":"androidx","authoring":[],"apis":["drawLine","drawPath","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","featured"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2642,"ops":90,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/demo-graphs0/doc.rc","json":null}
{"id":"androidx-demos/demo-graphs1","title":"demo graphs1","description":"Simple Timer","source":"androidx","authoring":[],"apis":["drawLine","drawPath","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":3223,"ops":131,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/demo-graphs1/doc.rc","json":null}
{"id":"androidx-demos/demo-path-expression-path-test1","title":"demo path expression path test1","description":"Path driven by an expression: concentric scalloped rings in red, blue and yellow over a tan field. #drawPath #expressions","source":"androidx","authoring":[],"apis":["drawCircle","drawPath","drawRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["androidx","drawpath","expressions"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1344,"ops":50,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/demo-path-expression-path-test1/doc.rc","json":null}
{"id":"androidx-demos/demo-path-expression-path-test2","title":"demo path expression path test2","description":"Path driven by an expression: a magenta star with a white outline on a violet field. #drawPath #expressions","source":"androidx","authoring":[],"apis":["drawCircle","drawPath","drawRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["androidx","drawpath","expressions"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":758,"ops":36,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/demo-path-expression-path-test2/doc.rc","json":null}
{"id":"androidx-demos/demo-path-expression-path-test3","title":"demo path expression path test3","description":"Path driven by an expression: a sharper magenta star with a white outline on a violet field. #drawPath #expressions","source":"androidx","authoring":[],"apis":["drawCircle","drawPath","drawRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["androidx","drawpath","expressions"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":847,"ops":37,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/demo-path-expression-path-test3/doc.rc","json":null}
{"id":"androidx-demos/demo-text-transform","title":"demo text transform","description":"Simple Timer","source":"androidx","authoring":[],"apis":["drawCircle","drawRoundRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1678,"ops":112,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/demo-text-transform/doc.rc","json":null}
{"id":"androidx-demos/demo-use-of-global","title":"demo use of global","description":"Global value demo: a large digit on a grey gradient, redrawn from shared state. #expressions","source":"androidx","authoring":[],"apis":["drawArc","drawLine","drawRoundRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","expressions"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1394,"ops":77,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/demo-use-of-global/doc.rc","json":null}
{"id":"androidx-demos/demo-winding-rule-path-winding","title":"demo winding rule path winding","description":"Winding rule comparison: the same spiral path filled four ways over blue, green, red and yellow quadrants. #drawPath #validation","source":"androidx","authoring":[],"apis":["clip","drawCircle","drawPath","drawRect","expressions","layout","paint","transforms"],"flags":["animated","expressions"],"tags":["androidx","drawpath","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":8864,"ops":66,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/demo-winding-rule-path-winding/doc.rc","json":null}
{"id":"androidx-demos/digital-clock1","title":"digital clock1","description":"Digital clock rendered as tall cyan seven-segment panels inside a green frame. #clock","source":"androidx","authoring":[],"apis":[],"flags":[],"tags":["androidx","clock"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":39275,"ops":0,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/digital-clock1/doc.rc","json":null}
{"id":"androidx-demos/experimental-fancy-clock","title":"experimental fancy clock","description":"Analogue clock on a black dial with a fine tick bezel and a red second hand. #clock","source":"androidx","authoring":[],"apis":["clip","drawCircle","drawLine","drawPath","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","clock"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2650,"ops":141,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/experimental-fancy-clock/doc.rc","json":null}
{"id":"androidx-demos/experimental-gmt","title":"experimental gmt","description":"GMT watch face with a 24-hour outer ring, red arrow hand and a WED 31 date window. #clock","source":"androidx","authoring":[],"apis":["clip","drawCircle","drawLine","drawPath","drawRect","expressions","interaction","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","clock","featured"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":6709,"ops":364,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/experimental-gmt/doc.rc","json":null}
{"id":"androidx-demos/experimental-solar-gmt","title":"experimental solar gmt","description":"Solar GMT watch face: blue 24-hour dial with a red sunrise arrow, dual time readout and an Anchorage city label. #clock","source":"androidx","authoring":[],"apis":["clip","drawArc","drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","interaction","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","clock"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":9067,"ops":479,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/experimental-solar-gmt/doc.rc","json":null}
{"id":"androidx-demos/experimental-sweep-clock1","title":"experimental sweep clock1","description":"Analogue clock with a sweeping second hand on a brushed grey dial and knurled black bezel. #clock","source":"androidx","authoring":[],"apis":["clip","drawCircle","drawLine","drawPath","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","clock"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2540,"ops":134,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/experimental-sweep-clock1/doc.rc","json":null}
{"id":"androidx-demos/fancy-clock2","title":"fancy clock2","description":"Analogue clock on a blue steel dial with a tick bezel and red second hand. #clock","source":"androidx","authoring":[],"apis":["clip","conditionals","drawCircle","drawLine","drawPath","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","clock"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2010,"ops":114,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/fancy-clock2/doc.rc","json":null}
{"id":"androidx-demos/fancy-clocks-fancy-clock1","title":"fancy clocks fancy clock1","description":"Analogue clock on a green radial-brushed dial with a tick bezel. #clock","source":"androidx","authoring":[],"apis":["clip","drawCircle","drawLine","drawPath","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","clock"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2474,"ops":132,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/fancy-clocks-fancy-clock1/doc.rc","json":null}
{"id":"androidx-demos/fancy-clocks-fancy-clock2","title":"fancy clocks fancy clock2","description":"Analogue clock on a blue steel dial, numerals at 12, 3 and 6. #clock","source":"androidx","authoring":[],"apis":["clip","conditionals","drawCircle","drawLine","drawPath","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","clock"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1937,"ops":109,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/fancy-clocks-fancy-clock2/doc.rc","json":null}
{"id":"androidx-demos/fancy-clocks-fancy-clock3","title":"fancy clocks fancy clock3","description":"Analogue clock on a pure black dial with a fine tick bezel and red second hand. #clock","source":"androidx","authoring":[],"apis":["clip","drawCircle","drawLine","drawPath","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","clock"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2508,"ops":135,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/fancy-clocks-fancy-clock3/doc.rc","json":null}
{"id":"androidx-demos/flow-control-checks-flow-control-checks1","title":"flow control checks flow control checks1","description":"Flow-control check. Renders black at rest; the behaviour under test is branching, not drawing. #conditionals #validation","source":"androidx","authoring":[],"apis":["conditionals","drawRoundRect","expressions","layout","loop","text"],"flags":["animated","expressions"],"tags":["androidx","conditionals","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1158,"ops":85,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/flow-control-checks-flow-control-checks1/doc.rc","json":null}
{"id":"androidx-demos/flow-control-checks-flow-control-checks2","title":"flow control checks flow control checks2","description":"Flow-control check. Renders black at rest; the behaviour under test is branching, not drawing. #conditionals #validation","source":"androidx","authoring":[],"apis":["conditionals","drawRoundRect","expressions","layout","loop","text"],"flags":["animated","expressions"],"tags":["androidx","conditionals","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":330,"ops":32,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/flow-control-checks-flow-control-checks2/doc.rc","json":null}
{"id":"androidx-demos/flow-control-checks-test-conditional","title":"flow control checks test conditional","description":"Conditional check: yellow text drawn only when a branch is taken. #conditionals #validation","source":"androidx","authoring":[],"apis":["conditionals","drawCircle","drawRect","drawRoundRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["androidx","conditionals","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":527,"ops":41,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/flow-control-checks-test-conditional/doc.rc","json":null}
{"id":"androidx-demos/good-pie-chart","title":"good pie chart","description":"Pie Chart Demo","source":"androidx","authoring":[],"apis":["drawArc","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":944,"ops":53,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/good-pie-chart/doc.rc","json":null}
{"id":"androidx-demos/graph-graph1","title":"graph graph1","description":"Bar chart with a green trend curve overlaid and value labels inside each bar. #graph","source":"androidx","authoring":[],"apis":["drawLine","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["androidx","graph"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1202,"ops":65,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/graph-graph1/doc.rc","json":null}
{"id":"androidx-demos/graph-graph2","title":"graph graph2","description":"Bar chart with a thick red curve tracing the peaks, on a light frame. #graph","source":"androidx","authoring":[],"apis":["clip","drawLine","drawPath","drawRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","graph"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1370,"ops":76,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/graph-graph2/doc.rc","json":null}
{"id":"androidx-demos/haptic-demo-demo-haptic1","title":"haptic demo demo haptic1","description":"Haptic feedback catalogue: a grid of buttons, one per constant, from keyboard tap to segment tick. #interaction","source":"androidx","authoring":[],"apis":["animation","drawCircle","drawRoundRect","expressions","interaction","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","interaction"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2792,"ops":187,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/haptic-demo-demo-haptic1/doc.rc","json":null}
{"id":"androidx-demos/heart-rate-timeline","title":"heart rate timeline","description":"Heart-rate timeline: a red trace over banded zones with a 60 BPM marker. #graph #widget","source":"androidx","authoring":[],"apis":["drawPath","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["androidx","graph","widget"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2484,"ops":81,"width":500,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/heart-rate-timeline/doc.rc","json":null}
{"id":"androidx-demos/hostile-actor1","title":"hostile actor1","description":"Stress test: several hundred overlapping translucent grey bubbles with a live count. #particles #animation","source":"androidx","authoring":[],"apis":["expressions","images","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","animation","particles"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1388,"ops":18,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/hostile-actor1/doc.rc","json":null}
{"id":"androidx-demos/hostile-actor1-c","title":"hostile actor1 c","description":"Stress test: several hundred overlapping translucent coloured discs with a live count. #particles #animation","source":"androidx","authoring":[],"apis":["drawRoundRect","expressions","images","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","animation","particles"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":3569,"ops":36,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/hostile-actor1-c/doc.rc","json":null}
{"id":"androidx-demos/hydration-wave","title":"hydration wave","description":"Hydration Progress Wave","source":"androidx","authoring":[],"apis":["clip","drawPath","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1796,"ops":80,"width":400,"height":450,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/hydration-wave/doc.rc","json":null}
{"id":"androidx-demos/impulse-demo-confetti-demo","title":"impulse demo confetti demo","description":"Impulse-driven confetti burst, shown here before the impulse fires. #animation","source":"androidx","authoring":[],"apis":[],"flags":[],"tags":["androidx","animation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2481,"ops":0,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/impulse-demo-confetti-demo/doc.rc","json":null}
{"id":"androidx-demos/impulse-demo-hearts-demo","title":"impulse demo hearts demo","description":"Impulse-driven hearts burst, shown here before the impulse fires. #animation","source":"androidx","authoring":[],"apis":[],"flags":[],"tags":["androidx","animation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":878,"ops":0,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/impulse-demo-hearts-demo/doc.rc","json":null}
{"id":"androidx-demos/indexing-demo-path-index","title":"indexing demo path index","description":"Indexing demo: a black 1 with a red 0 offset beside it, addressing glyphs by index. #text #validation","source":"androidx","authoring":[],"apis":["drawPath","drawRoundRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","text","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":9050,"ops":40,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/indexing-demo-path-index/doc.rc","json":null}
{"id":"androidx-demos/issue","title":"issue","description":"Anniversary card: 274 days to 20 May 2027, inside a soft scalloped badge. #widget","source":"androidx","authoring":[],"apis":[],"flags":[],"tags":["androidx","widget"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":6516,"ops":0,"width":470,"height":520,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/issue/doc.rc","json":null}
{"id":"androidx-demos/linear-regression","title":"linear regression","description":"Linear Regression Demo","source":"androidx","authoring":[],"apis":["drawCircle","drawLine","drawPath","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":3387,"ops":117,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/linear-regression/doc.rc","json":null}
{"id":"androidx-demos/maze","title":"maze","description":"Maze rendered as blue corridors on black, coarse grid. #game","source":"androidx","authoring":[],"apis":[],"flags":[],"tags":["androidx","game"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":5179,"ops":0,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/maze/doc.rc","json":null}
{"id":"androidx-demos/maze1","title":"maze1","description":"Maze rendered as blue corridors on black, fine grid. #game","source":"androidx","authoring":[],"apis":[],"flags":[],"tags":["androidx","game"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":34299,"ops":0,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/maze1/doc.rc","json":null}
{"id":"androidx-demos/maze2","title":"maze2","description":"Maze rendered as blue corridors on black, medium grid. #game","source":"androidx","authoring":[],"apis":[],"flags":[],"tags":["androidx","featured","game"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":10299,"ops":0,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/maze2/doc.rc","json":null}
{"id":"androidx-demos/moon-phase-dial","title":"moon phase dial","description":"Moon phase dial: waxing gibbous, 72% illuminated, with craters picked out. #widget","source":"androidx","authoring":[],"apis":["clip","drawCircle","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","widget"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1875,"ops":93,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/moon-phase-dial/doc.rc","json":null}
{"id":"androidx-demos/moon-phases","title":"moon phases","description":"Moon Phases Demo","source":"androidx","authoring":[],"apis":["conditionals","drawArc","drawCircle","drawOval","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2281,"ops":82,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/moon-phases/doc.rc","json":null}
{"id":"androidx-demos/particle","title":"particle","description":"Portrait avatar with a rounded mask on a mauve backdrop. #images","source":"androidx","authoring":[],"apis":[],"flags":[],"tags":["androidx","images"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":293613,"ops":0,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/particle/doc.rc","json":null}
{"id":"androidx-demos/path-demo-path-tween-demo","title":"path demo path tween demo","description":"Path tween: a rounded blob part-way through a morph between two shapes. #drawPath #animation","source":"androidx","authoring":[],"apis":["drawPath","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","animation","drawpath"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":4153,"ops":48,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/path-demo-path-tween-demo/doc.rc","json":null}
{"id":"androidx-demos/path-demo-path2","title":"path demo path2","description":"Minimal path: an L-shaped stroke forming two axes. #drawPath #validation","source":"androidx","authoring":[],"apis":["drawLine","drawPath","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","drawpath","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":4367,"ops":58,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/path-demo-path2/doc.rc","json":null}
{"id":"androidx-demos/path-demo-remote-construction","title":"path demo remote construction","description":"Path built remotely rather than supplied whole: a green disc with a thick olive rim. #drawPath","source":"androidx","authoring":[],"apis":["drawCircle","drawPath","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["androidx","drawpath"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":477,"ops":36,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/path-demo-remote-construction/doc.rc","json":null}
{"id":"androidx-demos/path-procedural-checks-all-path","title":"path procedural checks all path","description":"Procedural path check: stacked blue arcs exercising the full set of path segment types. #drawPath #validation","source":"androidx","authoring":[],"apis":["drawPath","paint","text"],"flags":[],"tags":["androidx","drawpath","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":224,"ops":7,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/path-procedural-checks-all-path/doc.rc","json":null}
{"id":"androidx-demos/path-procedural-checks-basic-path","title":"path procedural checks basic path","description":"Procedural path check: a single thick blue curve, the simplest case. #drawPath #validation","source":"androidx","authoring":[],"apis":["drawPath","paint","text"],"flags":[],"tags":["androidx","drawpath","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":152,"ops":7,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/path-procedural-checks-basic-path/doc.rc","json":null}
{"id":"androidx-demos/paths-demos","title":"paths demos","description":"Overlapping red and blue path shapes over a thin vertical rule. #drawPath","source":"androidx","authoring":[],"apis":["clip","conditionals","drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","interaction","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","drawpath"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":24850,"ops":449,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/paths-demos/doc.rc","json":null}
{"id":"androidx-demos/pie-chart","title":"pie chart","description":"Pie Chart Demo","source":"androidx","authoring":[],"apis":["drawArc","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":3936,"ops":130,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/pie-chart/doc.rc","json":null}
{"id":"androidx-demos/pie-chart2","title":"pie chart2","description":"Pie Chart Demo","source":"androidx","authoring":[],"apis":["drawArc","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1300,"ops":59,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/pie-chart2/doc.rc","json":null}
{"id":"androidx-demos/player-info","title":"player info","description":"Pressure Gauge","source":"androidx","authoring":[],"apis":["expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":3603,"ops":174,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/player-info/doc.rc","json":null}
{"id":"androidx-demos/plot-wave","title":"plot wave","description":"Simple Timer","source":"androidx","authoring":[],"apis":["drawLine","drawPath","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2192,"ops":95,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/plot-wave/doc.rc","json":null}
{"id":"androidx-demos/plot2","title":"plot2","description":"Simple Timer","source":"androidx","authoring":[],"apis":["drawLine","drawPath","expressions","interaction","layout","paint"],"flags":["animated","expressions"],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":572,"ops":28,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/plot2/doc.rc","json":null}
{"id":"androidx-demos/plot3","title":"plot3","description":"Simple Timer","source":"androidx","authoring":[],"apis":["drawPath","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":528,"ops":28,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/plot3/doc.rc","json":null}
{"id":"androidx-demos/plot4","title":"plot4","description":"Simple Timer","source":"androidx","authoring":[],"apis":["drawPath","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["androidx"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":481,"ops":29,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/plot4/doc.rc","json":null}
{"id":"androidx-demos/pressure-gauge","title":"pressure gauge","description":"Radial pressure gauge with a fine tick scale reading 799 mmHg between Low and High. #iot #widget","source":"androidx","authoring":[],"apis":["conditionals","drawArc","drawLine","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","iot","widget"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1907,"ops":78,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/pressure-gauge/doc.rc","json":null}
{"id":"androidx-demos/procedure-center-text1","title":"procedure center text1","description":"Text centring check: the value 98 boxed at the centre of a red ellipse. #text #validation","source":"androidx","authoring":[],"apis":["drawOval","drawRect","expressions","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","text","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":449,"ops":24,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/procedure-center-text1/doc.rc","json":null}
{"id":"androidx-demos/procedure-gradient1","title":"procedure gradient1","description":"Linear gradient from green to blue, filling an ellipse behind the word gradient. #paint","source":"androidx","authoring":[],"apis":["drawOval","expressions","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","paint"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":267,"ops":14,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/procedure-gradient1/doc.rc","json":null}
{"id":"androidx-demos/procedure-gradient2","title":"procedure gradient2","description":"Vertical white-to-blue gradient in an ellipse behind the word gradient. #paint","source":"androidx","authoring":[],"apis":["drawOval","expressions","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","paint"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":317,"ops":16,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/procedure-gradient2/doc.rc","json":null}
{"id":"androidx-demos/procedure-gradient3","title":"procedure gradient3","description":"Radial gradient, white centre fading to blue, behind the word gradient. #paint","source":"androidx","authoring":[],"apis":["drawOval","expressions","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","paint"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":313,"ops":16,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/procedure-gradient3/doc.rc","json":null}
{"id":"androidx-demos/procedure-gradient4","title":"procedure gradient4","description":"Off-centre radial gradient in an ellipse behind the word gradient. #paint","source":"androidx","authoring":[],"apis":["drawOval","expressions","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","paint"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":309,"ops":16,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/procedure-gradient4/doc.rc","json":null}
{"id":"androidx-demos/procedure-look-up1","title":"procedure look up1","description":"Lookup-table demo: a plain red ellipse whose fill is chosen by table index. #expressions #validation","source":"androidx","authoring":[],"apis":[],"flags":[],"tags":["androidx","expressions","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":514,"ops":0,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/procedure-look-up1/doc.rc","json":null}
{"id":"androidx-demos/procedure-simple-clock-fast","title":"procedure simple clock fast","description":"Fast-running clock: a single green hand sweeping a black dial. #clock #animation","source":"androidx","authoring":[],"apis":["drawLine","drawRoundRect","expressions","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","animation","clock"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":230,"ops":12,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/procedure-simple-clock-fast/doc.rc","json":null}
{"id":"androidx-demos/procedure-simple1","title":"procedure simple1","description":"Simplest case: one small black circle. #drawCircle #validation","source":"androidx","authoring":[],"apis":["drawCircle","text"],"flags":[],"tags":["androidx","drawcircle","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":61,"ops":4,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/procedure-simple1/doc.rc","json":null}
{"id":"androidx-demos/procedure-simple2","title":"procedure simple2","description":"Simplest case: one large black circle filling the frame. #drawCircle #validation","source":"androidx","authoring":[],"apis":["drawOval","text"],"flags":[],"tags":["androidx","drawcircle","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":82,"ops":5,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/procedure-simple2/doc.rc","json":null}
{"id":"androidx-demos/procedure-simple3","title":"procedure simple3","description":"Simplest case: one red circle. #drawCircle #validation","source":"androidx","authoring":[],"apis":["drawOval","interaction","paint","text"],"flags":[],"tags":["androidx","drawcircle","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":148,"ops":9,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/procedure-simple3/doc.rc","json":null}
{"id":"androidx-demos/procedure-simple4","title":"procedure simple4","description":"Simplest case: a solid red rectangle filling the frame. #drawRect #validation","source":"androidx","authoring":[],"apis":["drawRoundRect","expressions","paint","text"],"flags":["animated","expressions"],"tags":["androidx","drawrect","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":144,"ops":7,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/procedure-simple4/doc.rc","json":null}
{"id":"androidx-demos/procedure-simple5","title":"procedure simple5","description":"Simplest case: a red ellipse. #drawOval #validation","source":"androidx","authoring":[],"apis":["drawOval","expressions","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","drawoval","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":185,"ops":12,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/procedure-simple5/doc.rc","json":null}
{"id":"androidx-demos/procedure-simple6","title":"procedure simple6","description":"Clock on a scalloped dark blue dial with red and grey hands. #clock","source":"androidx","authoring":[],"apis":["drawCircle","drawLine","drawPath","expressions","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","clock"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1002,"ops":38,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/procedure-simple6/doc.rc","json":null}
{"id":"androidx-demos/procedure-text-path-effects","title":"procedure text path effects","description":"Text path effects: the digits 0-9 repeated with blur and gradient treatments over a soft disc. #text #paint","source":"androidx","authoring":[],"apis":["drawOval","drawPath","expressions","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","paint","text"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":8986,"ops":27,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/procedure-text-path-effects/doc.rc","json":null}
{"id":"androidx-demos/procedure-version","title":"procedure version","description":"Version banner reading Version 8.0 on a red ellipse. #text","source":"androidx","authoring":[],"apis":["drawOval","expressions","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","text"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":289,"ops":17,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/procedure-version/doc.rc","json":null}
{"id":"androidx-demos/sensor-demo-acc-sensor1","title":"sensor demo acc sensor1","description":"Accelerometer demo: a yellow dot on a blue field that moves with device tilt. #sensors #interaction","source":"androidx","authoring":[],"apis":["drawCircle","drawLine","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["androidx","interaction","sensors"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":515,"ops":38,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/sensor-demo-acc-sensor1/doc.rc","json":null}
{"id":"androidx-demos/sensor-demo-compass","title":"sensor demo compass","description":"Compass demo: a dark needle on a blue field, rotating with device heading. #sensors #interaction","source":"androidx","authoring":[],"apis":["drawCircle","drawLine","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","interaction","sensors"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":432,"ops":35,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/sensor-demo-compass/doc.rc","json":null}
{"id":"androidx-demos/sensor-demo-gyro-sensor1","title":"sensor demo gyro sensor1","description":"Gyroscope demo: a red bar on a blue field that swings with rotation rate. #sensors #interaction","source":"androidx","authoring":[],"apis":["drawLine","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","interaction","sensors"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":449,"ops":44,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/sensor-demo-gyro-sensor1/doc.rc","json":null}
{"id":"androidx-demos/sensor-demo-light-sensor1","title":"sensor demo light sensor1","description":"Ambient light demo: a numeric lux readout between dark and bright half-discs. #sensors #interaction","source":"androidx","authoring":[],"apis":["drawArc","drawCircle","drawLine","drawRoundRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","interaction","sensors"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":665,"ops":52,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/sensor-demo-light-sensor1/doc.rc","json":null}
{"id":"androidx-demos/sensor-demo-mag-sensor1","title":"sensor demo mag sensor1","description":"Magnetometer demo: a yellow dot on a blue field driven by field strength. #sensors #interaction","source":"androidx","authoring":[],"apis":["drawCircle","drawLine","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["androidx","interaction","sensors"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":515,"ops":38,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/sensor-demo-mag-sensor1/doc.rc","json":null}
{"id":"androidx-demos/server-clock","title":"server clock","description":"Clock driven by a server-supplied time rather than the local one, drawn as plain hands on blue. #clock","source":"androidx","authoring":[],"apis":["drawLine","drawRoundRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","clock"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":733,"ops":44,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/server-clock/doc.rc","json":null}
{"id":"androidx-demos/shader-calendar","title":"shader calendar","description":"Calendar strip rendered through a shader, a tall column of tinted day cells. #shaders","source":"androidx","authoring":[],"apis":["drawRect","drawRoundRect","paint","shaders","text"],"flags":["animated","shaders"],"tags":["androidx","shaders"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":7816,"ops":206,"width":1000,"height":6739,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/shader-calendar/doc.rc","json":null}
{"id":"androidx-demos/simple-java-anim","title":"simple java anim","description":"Minimal animation: a single red circle pulsing in size. #animation #drawCircle","source":"androidx","authoring":[],"apis":["drawOval","expressions","interaction","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","animation","drawcircle"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":408,"ops":31,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/simple-java-anim/doc.rc","json":null}
{"id":"androidx-demos/sleep-quality-rings","title":"sleep quality rings","description":"Sleep summary ring totalling 6h 40m, segmented into Deep, Light, REM and Awake. #widget #graph","source":"androidx","authoring":[],"apis":["drawArc","drawCircle","drawLine","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","graph","widget"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":3436,"ops":138,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/sleep-quality-rings/doc.rc","json":null}
{"id":"androidx-demos/small-animated","title":"small animated","description":"Minimal animated value, drawn as the number 1.5 counting on a plain field. #animation #text","source":"androidx","authoring":[],"apis":["paint","text"],"flags":[],"tags":["androidx","animation","text"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":106,"ops":4,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/small-animated/doc.rc","json":null}
{"id":"androidx-demos/spline-demo-spline-demo1","title":"spline demo spline demo1","description":"Spline demo: a heart outline built from smooth curve segments. #drawPath","source":"androidx","authoring":[],"apis":["expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","drawpath"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":351,"ops":31,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/spline-demo-spline-demo1/doc.rc","json":null}
{"id":"androidx-demos/spread-sheet","title":"spread sheet","description":"Spreadsheet stress test: a dense grid of overlapping headers and numeric cells. #text #layout","source":"androidx","authoring":[],"apis":["drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["androidx","layout","text"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2422,"ops":129,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/spread-sheet/doc.rc","json":null}
{"id":"androidx-demos/step-progress-arc","title":"step progress arc","description":"Step progress arc showing 7250 of 10000 steps, with quarter markers around the sweep. #widget #graph","source":"androidx","authoring":[],"apis":["drawArc","drawLine","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["androidx","graph","widget"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":3902,"ops":96,"width":400,"height":350,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/step-progress-arc/doc.rc","json":null}
{"id":"androidx-demos/stock","title":"stock","description":"Stock watchlist card showing Dow Jones at 47,739.32, down 0.45%. #widget","source":"androidx","authoring":[],"apis":["clip","drawLine","drawPath","expressions","interaction","layout","loop","paint","text","theming","transforms"],"flags":["animated","expressions"],"tags":["androidx","widget"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":21406,"ops":588,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/stock/doc.rc","json":null}
{"id":"androidx-demos/stock-sparkline","title":"stock sparkline","description":"Stock sparkline: 44850, up 6.41%, drawn as a green trend line with a filled gradient. #graph #widget","source":"androidx","authoring":[],"apis":["drawPath","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["androidx","graph","widget"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1656,"ops":69,"width":500,"height":350,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/stock-sparkline/doc.rc","json":null}
{"id":"androidx-demos/stop-absolute-pos","title":"stop absolute pos","description":"Scroll stop mode STOP_ABSOLUTE_POS, shown on a red dial marked at 0.50. #interaction #validation","source":"androidx","authoring":[],"apis":["drawArc","drawCircle","drawRoundRect","expressions","interaction","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","interaction","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":901,"ops":55,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/stop-absolute-pos/doc.rc","json":null}
{"id":"androidx-demos/stop-ends","title":"stop ends","description":"Scroll stop mode STOP_ENDS, shown on a red dial marked at 0.50. #interaction #validation","source":"androidx","authoring":[],"apis":["drawArc","drawCircle","drawRoundRect","expressions","interaction","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","interaction","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":893,"ops":55,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/stop-ends/doc.rc","json":null}
{"id":"androidx-demos/stop-gently","title":"stop gently","description":"Scroll stop mode STOP_GENTLY, shown on a red dial marked at 0.50. #interaction #validation","source":"androidx","authoring":[],"apis":["drawArc","drawCircle","drawRoundRect","expressions","interaction","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","interaction","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":895,"ops":55,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/stop-gently/doc.rc","json":null}
{"id":"androidx-demos/stop-instantly","title":"stop instantly","description":"Scroll stop mode STOP_INSTANTLY, shown on a red dial marked at 0.50. #interaction #validation","source":"androidx","authoring":[],"apis":["drawArc","drawCircle","drawRoundRect","expressions","interaction","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","interaction","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":898,"ops":55,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/stop-instantly/doc.rc","json":null}
{"id":"androidx-demos/stop-notches-absolute","title":"stop notches absolute","description":"Scroll stop mode STOP_NOTCHES_ABSOLUTE, the dial gaining detent marks around its rim. #interaction #validation","source":"androidx","authoring":[],"apis":["drawArc","drawCircle","drawLine","drawRoundRect","expressions","interaction","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","interaction","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1049,"ops":71,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/stop-notches-absolute/doc.rc","json":null}
{"id":"androidx-demos/stop-notches-even","title":"stop notches even","description":"Scroll stop mode STOP_NOTCHES_EVEN, with evenly spaced detents around the dial. #interaction #validation","source":"androidx","authoring":[],"apis":["drawArc","drawCircle","drawLine","drawRoundRect","expressions","interaction","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","interaction","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1257,"ops":99,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/stop-notches-even/doc.rc","json":null}
{"id":"androidx-demos/stop-notches-percents","title":"stop notches percents","description":"Scroll stop mode STOP_NOTCHES_PERCENTS, with detents placed at percentage points. #interaction #validation","source":"androidx","authoring":[],"apis":["drawArc","drawCircle","drawLine","drawRoundRect","expressions","interaction","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","interaction","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1157,"ops":83,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/stop-notches-percents/doc.rc","json":null}
{"id":"androidx-demos/text-baseline","title":"text baseline","description":"Text baseline reference: Hello World repeated at several sizes on yellow, aligned to a common baseline. #text #validation","source":"androidx","authoring":[],"apis":["layout","text"],"flags":[],"tags":["androidx","text","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":950,"ops":124,"width":600,"height":600,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/text-baseline/doc.rc","json":null}
{"id":"androidx-demos/text-refresh-bug","title":"text refresh bug","description":"Price card for BTC at $109,846.26, up 0.3%, used to reproduce a text refresh problem. #text #widget","source":"androidx","authoring":[],"apis":["drawPath","drawRect","expressions","layout","loop","paint","text","theming","transforms"],"flags":["animated","expressions"],"tags":["androidx","text","widget"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2943,"ops":196,"width":475,"height":260,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/text-refresh-bug/doc.rc","json":null}
{"id":"androidx-demos/texture-demo-basic-texture","title":"texture demo basic texture","description":"Texture fill: cyan spheres tiled across a shaded circular field. #images #paint","source":"androidx","authoring":[],"apis":["drawCircle","expressions","images","layout","paint","text"],"flags":["animated","expressions"],"tags":["androidx","images","paint"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":3466,"ops":24,"width":300,"height":300,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/texture-demo-basic-texture/doc.rc","json":null}
{"id":"androidx-demos/texture-demo-texture-clock","title":"texture demo texture clock","description":"Clock on a heavily grained noise texture, with a small dark hub and thin hands. #clock #images","source":"androidx","authoring":[],"apis":["drawCircle","drawRoundRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","clock","images"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":44480,"ops":62,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/texture-demo-texture-clock/doc.rc","json":null}
{"id":"androidx-demos/texture-demo-texture-clock-test","title":"texture demo texture clock test","description":"Textured clock: a chequered hand over a grey hub, ringed by black saw-tooth markers. #clock #images","source":"androidx","authoring":[],"apis":["drawCircle","drawRoundRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","clock","images"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1863,"ops":62,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/texture-demo-texture-clock-test/doc.rc","json":null}
{"id":"androidx-demos/themed-plot1","title":"themed plot1","description":"Simple Timer","source":"androidx","authoring":[],"apis":["drawLine","drawPath","drawRect","drawRoundRect","expressions","interaction","layout","loop","paint","text","theming"],"flags":["animated","expressions"],"tags":["androidx","featured"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2132,"ops":106,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/themed-plot1/doc.rc","json":null}
{"id":"androidx-demos/thumb-wheel1","title":"thumb wheel1","description":"Thumb wheel: a digit drum behind a rounded lens, scrolled by dragging. #interaction #widget","source":"androidx","authoring":[],"apis":["drawRoundRect","expressions","interaction","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","interaction","widget"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":749,"ops":44,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/thumb-wheel1/doc.rc","json":null}
{"id":"androidx-demos/thumb-wheel2","title":"thumb wheel2","description":"Thumb wheel scrolling through haptic constant names, with the selected row picked out in green. #interaction #widget","source":"androidx","authoring":[],"apis":["expressions","interaction","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","interaction","widget"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1746,"ops":89,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/thumb-wheel2/doc.rc","json":null}
{"id":"androidx-demos/touch-wrap","title":"touch wrap","description":"Touch wrapping: a red field with a cyan handle whose value wraps past its limits. #interaction #validation","source":"androidx","authoring":[],"apis":["drawLine","drawRoundRect","expressions","interaction","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","interaction","validation"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":787,"ops":50,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/touch-wrap/doc.rc","json":null}
{"id":"androidx-demos/touch1","title":"touch1","description":"Horizontal touch slider with a red thumb on a grey track and a 0.50 readout. #interaction","source":"androidx","authoring":[],"apis":["drawRect","drawRoundRect","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["androidx","interaction"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":757,"ops":51,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/touch1/doc.rc","json":null}
{"id":"androidx-demos/touch2","title":"touch2","description":"Vertical touch slider with a red thumb, showing both the raw and scaled values. #interaction","source":"androidx","authoring":[],"apis":["drawRect","drawRoundRect","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["androidx","interaction"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":721,"ops":49,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/touch2/doc.rc","json":null}
{"id":"androidx-demos/wake-demo-wake-clock","title":"wake demo wake clock","description":"Wake-on-tap clock: grained dial with hands, drawn only while the display is awake. #clock","source":"androidx","authoring":[],"apis":["drawCircle","drawRoundRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["androidx","clock"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":78594,"ops":65,"width":300,"height":300,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/wake-demo-wake-clock/doc.rc","json":null}
{"id":"androidx-demos/weather-forecast-bars","title":"weather forecast bars","description":"Hourly temperature forecast as stacked horizontal bars on a green-to-yellow scale. #graph #widget","source":"androidx","authoring":[],"apis":["drawCircle","drawLine","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["androidx","graph","widget"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":4324,"ops":135,"width":500,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/androidx-demos/weather-forecast-bars/doc.rc","json":null}
{"id":"androidx-kotlin/01dslclock","title":"01dslClock","description":"Minimal clock on a soft scalloped badge, hands only. Built with the Kotlin DSL. #clock #kotlin","source":"androidx","authoring":["kt"],"apis":["drawCircle","drawLine","drawPath","expressions","layout","loop","paint","text","theming","transforms"],"flags":["animated","expressions"],"tags":["clock","kotlin"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":2146,"ops":129,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":["RcDslClock.kt"],"rc":"docs/androidx-kotlin/01dslclock/doc.rc","json":null}
{"id":"androidx-kotlin/activityrings","title":"ActivityRings","description":"Three concentric activity rings in red, green and blue reading 78% Move, 62% Exercise, 91% Stand. #widget #kotlin","source":"androidx","authoring":["kt"],"apis":["drawArc","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["kotlin","widget"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":3419,"ops":91,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":["DslDataVizActivityRings.kt"],"rc":"docs/androidx-kotlin/activityrings/doc.rc","json":null}
{"id":"androidx-kotlin/animated","title":"animated","description":"Animated Area","source":"androidx","authoring":["kt"],"apis":["drawLine","drawPath","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":23656,"ops":452,"width":800,"height":500,"hasJson":false,"jsonReproduces":null,"src":["Graph2dLineDemos.kt"],"rc":"docs/androidx-kotlin/animated/doc.rc","json":null}
{"id":"androidx-kotlin/areabasic","title":"areaBasic","description":"Cumulative Signups","source":"androidx","authoring":["kt"],"apis":["drawLine","drawPath","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":18159,"ops":451,"width":800,"height":500,"hasJson":false,"jsonReproduces":null,"src":["Graph2dLineDemos.kt"],"rc":"docs/androidx-kotlin/areabasic/doc.rc","json":null}
{"id":"androidx-kotlin/areapercent","title":"areaPercent","description":"Traffic Composition","source":"androidx","authoring":["kt"],"apis":["drawLine","drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":7941,"ops":314,"width":900,"height":520,"hasJson":false,"jsonReproduces":null,"src":["Graph2dLineDemos.kt"],"rc":"docs/androidx-kotlin/areapercent/doc.rc","json":null}
{"id":"androidx-kotlin/areastacked","title":"areaStacked","description":"Traffic by Source","source":"androidx","authoring":["kt"],"apis":["drawLine","drawPath","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":7842,"ops":312,"width":900,"height":520,"hasJson":false,"jsonReproduces":null,"src":["Graph2dLineDemos.kt"],"rc":"docs/androidx-kotlin/areastacked/doc.rc","json":null}
{"id":"androidx-kotlin/band","title":"band","description":"Forecast with CI","source":"androidx","authoring":["kt"],"apis":["drawLine","drawPath","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":5062,"ops":206,"width":820,"height":520,"hasJson":false,"jsonReproduces":null,"src":["Graph2dIntervalDemos.kt"],"rc":"docs/androidx-kotlin/band/doc.rc","json":null}
{"id":"androidx-kotlin/bar","title":"bar","description":"Wind by Direction","source":"androidx","authoring":["kt"],"apis":["drawArc","drawCircle","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":2790,"ops":116,"width":640,"height":640,"hasJson":false,"jsonReproduces":null,"src":["Graph2dPolarDemos.kt"],"rc":"docs/androidx-kotlin/bar/doc.rc","json":null}
{"id":"androidx-kotlin/basic","title":"basic","description":"Monthly Active Users","source":"androidx","authoring":["kt"],"apis":["drawCircle","drawLine","drawPath","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":4297,"ops":180,"width":800,"height":500,"hasJson":false,"jsonReproduces":null,"src":["Graph2dLineDemos.kt"],"rc":"docs/androidx-kotlin/basic/doc.rc","json":null}
{"id":"androidx-kotlin/basictimer","title":"BasicTimer","description":"Flip-style timer digit on a grey gradient, split by the seam where the flip occurs. #clock #animation #kotlin","source":"androidx","authoring":["kt"],"apis":["drawArc","drawLine","drawRoundRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["animation","clock","kotlin"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":1009,"ops":45,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":["DslExampleTimer.kt"],"rc":"docs/androidx-kotlin/basictimer/doc.rc","json":null}
{"id":"androidx-kotlin/batterygauge","title":"BatteryGauge","description":"Battery Radial Gauge","source":"androidx","authoring":["kt"],"apis":["drawArc","drawLine","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":3319,"ops":76,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":["DslDataVizBatteryRadialGauge.kt"],"rc":"docs/androidx-kotlin/batterygauge/doc.rc","json":null}
{"id":"androidx-kotlin/bubble","title":"bubble","description":"Market Map","source":"androidx","authoring":["kt"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":4690,"ops":205,"width":720,"height":560,"hasJson":false,"jsonReproduces":null,"src":["Graph2dRelationDemos.kt"],"rc":"docs/androidx-kotlin/bubble/doc.rc","json":null}
{"id":"androidx-kotlin/bullet","title":"bullet","description":"KPIs vs Target","source":"androidx","authoring":["kt"],"apis":["drawLine","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":4985,"ops":151,"width":760,"height":420,"hasJson":false,"jsonReproduces":null,"src":["Graph2dFinancialDemos.kt"],"rc":"docs/androidx-kotlin/bullet/doc.rc","json":null}
{"id":"androidx-kotlin/calendarheatmap","title":"CalendarHeatmap","description":"Calendar Heatmap Grid","source":"androidx","authoring":["kt"],"apis":["drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":3744,"ops":125,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":["DslDataVizCalendarHeatmap.kt"],"rc":"docs/androidx-kotlin/calendarheatmap/doc.rc","json":null}
{"id":"androidx-kotlin/clock","title":"Clock","description":"Android-themed watch face: bugdroid at the centre, date window, music glyphs and a tick bezel. #clock #kotlin","source":"androidx","authoring":["kt"],"apis":["clip","drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["clock","kotlin"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":6462,"ops":549,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":["Clock.kt"],"rc":"docs/androidx-kotlin/clock/doc.rc","json":null}
{"id":"androidx-kotlin/confusion","title":"confusion","description":"Confusion Matrix","source":"androidx","authoring":["kt"],"apis":["drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":6759,"ops":218,"width":640,"height":600,"hasJson":false,"jsonReproduces":null,"src":["Graph2dMoreDemos.kt"],"rc":"docs/androidx-kotlin/confusion/doc.rc","json":null}
{"id":"androidx-kotlin/connectedscatter","title":"connectedScatter","description":"Phase Trajectory","source":"androidx","authoring":["kt"],"apis":["drawCircle","drawLine","drawPath","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":4914,"ops":208,"width":720,"height":560,"hasJson":false,"jsonReproduces":null,"src":["Graph2dRelationDemos.kt"],"rc":"docs/androidx-kotlin/connectedscatter/doc.rc","json":null}
{"id":"androidx-kotlin/cube3d","title":"Cube3D","description":"Shaded 3D cube, cyan top face and red front, inside a dark circular vignette. #3d #kotlin","source":"androidx","authoring":["kt"],"apis":["conditionals","drawCircle","drawPath","expressions","layout","paint","transforms"],"flags":["animated","expressions"],"tags":["3d","kotlin"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":2775,"ops":119,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":["Cube3D.kt"],"rc":"docs/androidx-kotlin/cube3d/doc.rc","json":null}
{"id":"androidx-kotlin/cubesphere","title":"CubeSphere","description":"CubeSphereTransitionShader","source":"androidx","authoring":["kt"],"apis":["drawRect","paint","shaders","text"],"flags":["animated","shaders"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":72607,"ops":11,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":["CubeSphereTransitionShader.kt"],"rc":"docs/androidx-kotlin/cubesphere/doc.rc","json":null}
{"id":"androidx-kotlin/cubesphere2","title":"CubeSphere2","description":"CubeSphereTransitionShader2","source":"androidx","authoring":["kt"],"apis":["drawRect","paint","shaders","text"],"flags":["animated","shaders"],"tags":["featured"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":72546,"ops":11,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":["CubeSphereTransitionShader2.kt"],"rc":"docs/androidx-kotlin/cubesphere2/doc.rc","json":null}
{"id":"androidx-kotlin/dark","title":"dark","description":"Requests per Minute","source":"androidx","authoring":["kt"],"apis":["drawCircle","drawLine","drawPath","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":6393,"ops":256,"width":900,"height":520,"hasJson":false,"jsonReproduces":null,"src":["Graph2dLineDemos.kt"],"rc":"docs/androidx-kotlin/dark/doc.rc","json":null}
{"id":"androidx-kotlin/dogecalendar","title":"DogeCalendar","description":"Calendar card with dense overlaid text on a rounded dark panel. #text #layout #kotlin","source":"androidx","authoring":["kt"],"apis":["expressions","layout","text"],"flags":["animated","expressions"],"tags":["kotlin","layout","text"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":4927705,"ops":780,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":["DogeCalendar.kt"],"rc":"docs/androidx-kotlin/dogecalendar/doc.rc","json":null}
{"id":"androidx-kotlin/donut","title":"donut","description":"Platform Share","source":"androidx","authoring":["kt"],"apis":["drawArc","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":3223,"ops":126,"width":640,"height":640,"hasJson":false,"jsonReproduces":null,"src":["Graph2dRelationDemos.kt"],"rc":"docs/androidx-kotlin/donut/doc.rc","json":null}
{"id":"androidx-kotlin/errorbar","title":"errorBar","description":"Measurements","source":"androidx","authoring":["kt"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":5043,"ops":212,"width":800,"height":500,"hasJson":false,"jsonReproduces":null,"src":["Graph2dIntervalDemos.kt"],"rc":"docs/androidx-kotlin/errorbar/doc.rc","json":null}
{"id":"androidx-kotlin/fan","title":"fan","description":"Forecast Fan","source":"androidx","authoring":["kt"],"apis":["drawLine","drawPath","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":8505,"ops":335,"width":820,"height":520,"hasJson":false,"jsonReproduces":null,"src":["Graph2dIntervalDemos.kt"],"rc":"docs/androidx-kotlin/fan/doc.rc","json":null}
{"id":"androidx-kotlin/forest","title":"forest","description":"Meta-analysis","source":"androidx","authoring":["kt"],"apis":["drawLine","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":5623,"ops":228,"width":820,"height":520,"hasJson":false,"jsonReproduces":null,"src":["Graph2dIntervalDemos.kt"],"rc":"docs/androidx-kotlin/forest/doc.rc","json":null}
{"id":"androidx-kotlin/function","title":"function","description":"Plot of f(x) = sin(x)\u00b7e^(\u2212x\u00b2/20) with labelled axes and gridlines. #graph #expressions #kotlin","source":"androidx","authoring":["kt"],"apis":["drawLine","drawPath","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["expressions","graph","kotlin"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":16869,"ops":614,"width":820,"height":520,"hasJson":false,"jsonReproduces":null,"src":["Graph2dMoreDemos.kt"],"rc":"docs/androidx-kotlin/function/doc.rc","json":null}
{"id":"androidx-kotlin/funnel","title":"funnel","description":"Conversion Funnel","source":"androidx","authoring":["kt"],"apis":["drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":2423,"ops":105,"width":720,"height":560,"hasJson":false,"jsonReproduces":null,"src":["Graph2dFinancialDemos.kt"],"rc":"docs/androidx-kotlin/funnel/doc.rc","json":null}
{"id":"androidx-kotlin/gantt","title":"Gantt","description":"Schedule","source":"androidx","authoring":["kt"],"apis":["drawLine","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":3551,"ops":138,"width":840,"height":520,"hasJson":false,"jsonReproduces":null,"src":["Graph2dMoreDemos.kt"],"rc":"docs/androidx-kotlin/gantt/doc.rc","json":null}
{"id":"androidx-kotlin/gauge","title":"gauge","description":"Performance","source":"androidx","authoring":["kt"],"apis":["drawArc","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":1009,"ops":45,"width":560,"height":560,"hasJson":false,"jsonReproduces":null,"src":["Graph2dPolarDemos.kt"],"rc":"docs/androidx-kotlin/gauge/doc.rc","json":null}
{"id":"androidx-kotlin/heartrate","title":"HeartRate","description":"Heart Rate Timeline","source":"androidx","authoring":["kt"],"apis":["drawPath","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":2500,"ops":80,"width":500,"height":400,"hasJson":false,"jsonReproduces":null,"src":["DslDataVizHeartRate.kt"],"rc":"docs/androidx-kotlin/heartrate/doc.rc","json":null}
{"id":"androidx-kotlin/hydrationwave","title":"HydrationWave","description":"Hydration Progress Wave","source":"androidx","authoring":["kt"],"apis":["clip","drawPath","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":1913,"ops":80,"width":400,"height":450,"hasJson":false,"jsonReproduces":null,"src":["DslDataVizHydrationWave.kt"],"rc":"docs/androidx-kotlin/hydrationwave/doc.rc","json":null}
{"id":"androidx-kotlin/interactive","title":"interactive","description":"Interactive multi-series line chart, Drag to Inspect, with a readout for Products A, B and C. #graph #interaction #kotlin","source":"androidx","authoring":["kt"],"apis":["drawCircle","drawLine","drawPath","drawRect","expressions","interaction","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["graph","interaction","kotlin"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":9315,"ops":372,"width":900,"height":560,"hasJson":false,"jsonReproduces":null,"src":["Graph2dLineDemos.kt"],"rc":"docs/androidx-kotlin/interactive/doc.rc","json":null}
{"id":"androidx-kotlin/likert","title":"likert","description":"Customer survey as diverging Likert bars from Disagree through Strongly agree. #graph #kotlin","source":"androidx","authoring":["kt"],"apis":["drawLine","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["graph","kotlin"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":4743,"ops":195,"width":820,"height":520,"hasJson":false,"jsonReproduces":null,"src":["Graph2dMoreDemos.kt"],"rc":"docs/androidx-kotlin/likert/doc.rc","json":null}
{"id":"androidx-kotlin/linearregression3","title":"LinearRegression3","description":"Linear Regression Demo","source":"androidx","authoring":["kt"],"apis":["drawCircle","drawLine","drawPath","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":3387,"ops":117,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":["LinearRegression.kt"],"rc":"docs/androidx-kotlin/linearregression3/doc.rc","json":null}
{"id":"androidx-kotlin/maze","title":"maze","description":"Maze rendered as blue corridors on black. #game #kotlin","source":"androidx","authoring":["kt"],"apis":[],"flags":[],"tags":["game","kotlin"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":5179,"ops":0,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":["DemoParticles.kt"],"rc":"docs/androidx-kotlin/maze/doc.rc","json":null}
{"id":"androidx-kotlin/metronome","title":"Metronome","description":"Metronome: a blue weight sliding along a red beam. #animation #widget #kotlin","source":"androidx","authoring":["kt"],"apis":["conditionals","drawCircle","drawLine","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["animation","kotlin","widget"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":615,"ops":30,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":["DslMetronome.kt"],"rc":"docs/androidx-kotlin/metronome/doc.rc","json":null}
{"id":"androidx-kotlin/modernshowcase","title":"ModernShowcase","description":"Title card: Premium Kotlin DSL Showcase, a fully architected modern type-safe DSL. #text #kotlin","source":"androidx","authoring":["kt"],"apis":[],"flags":[],"tags":["kotlin","text"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":1776,"ops":0,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":["DslModernShowcaseDemo.kt"],"rc":"docs/androidx-kotlin/modernshowcase/doc.rc","json":null}
{"id":"androidx-kotlin/moonphasedial","title":"MoonPhaseDial","description":"Moon phase dial: waxing gibbous, 72% illuminated, craters picked out. #widget #kotlin","source":"androidx","authoring":["kt"],"apis":["clip","drawCircle","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["kotlin","widget"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":1877,"ops":91,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":["DslDataVizMoonPhaseDial.kt"],"rc":"docs/androidx-kotlin/moonphasedial/doc.rc","json":null}
{"id":"androidx-kotlin/multi","title":"multi","description":"Active Users by Product","source":"androidx","authoring":["kt"],"apis":["drawCircle","drawLine","drawPath","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":8254,"ops":324,"width":900,"height":520,"hasJson":false,"jsonReproduces":null,"src":["Graph2dLineDemos.kt"],"rc":"docs/androidx-kotlin/multi/doc.rc","json":null}
{"id":"androidx-kotlin/pareto","title":"pareto","description":"Defect Causes","source":"androidx","authoring":["kt"],"apis":["drawCircle","drawLine","drawPath","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":5981,"ops":221,"width":820,"height":520,"hasJson":false,"jsonReproduces":null,"src":["Graph2dFinancialDemos.kt"],"rc":"docs/androidx-kotlin/pareto/doc.rc","json":null}
{"id":"androidx-kotlin/particledots","title":"ParticleDots","description":"Particle field forming a soft blue disc on black. #particles #kotlin","source":"androidx","authoring":["kt"],"apis":[],"flags":[],"tags":["kotlin","particles"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":1310,"ops":0,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":["ParticleDots.kt"],"rc":"docs/androidx-kotlin/particledots/doc.rc","json":null}
{"id":"androidx-kotlin/particledots2","title":"ParticleDots2","description":"Particle disc with a live 0.0 counter at its centre. #particles #kotlin","source":"androidx","authoring":["kt"],"apis":[],"flags":[],"tags":["kotlin","particles"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":1312,"ops":0,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":["ParticleDots.kt"],"rc":"docs/androidx-kotlin/particledots2/doc.rc","json":null}
{"id":"androidx-kotlin/particlesphere","title":"particleSphere","description":"Particles arranged as a lit sphere with a counter at the centre. #particles #3d #kotlin","source":"androidx","authoring":["kt"],"apis":[],"flags":[],"tags":["3d","featured","kotlin","particles"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":1004,"ops":0,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":["ParticleSphere.kt"],"rc":"docs/androidx-kotlin/particlesphere/doc.rc","json":null}
{"id":"androidx-kotlin/pie","title":"pie","description":"Platform Share","source":"androidx","authoring":["kt"],"apis":["drawArc","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":2916,"ops":119,"width":640,"height":640,"hasJson":false,"jsonReproduces":null,"src":["Graph2dRelationDemos.kt"],"rc":"docs/androidx-kotlin/pie/doc.rc","json":null}
{"id":"androidx-kotlin/pressuregauge","title":"PressureGauge","description":"Radial pressure gauge with a fine tick scale reading 799 mmHg between Low and High. #iot #widget #kotlin","source":"androidx","authoring":["kt"],"apis":["conditionals","drawArc","drawLine","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot","kotlin","widget"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":1915,"ops":77,"width":500,"height":500,"hasJson":false,"jsonReproduces":null,"src":["DslPressureGauge.kt"],"rc":"docs/androidx-kotlin/pressuregauge/doc.rc","json":null}
{"id":"androidx-kotlin/qq","title":"qq","description":"Normal Q-Q plot: sample quantiles against theoretical, with a fitted reference line. #graph #kotlin","source":"androidx","authoring":["kt"],"apis":["drawCircle","drawLine","drawPath","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["graph","kotlin"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":12500,"ops":537,"width":620,"height":600,"hasJson":false,"jsonReproduces":null,"src":["Graph2dMoreDemos.kt"],"rc":"docs/androidx-kotlin/qq/doc.rc","json":null}
{"id":"androidx-kotlin/quadrant","title":"quadrant","description":"Portfolio","source":"androidx","authoring":["kt"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":4086,"ops":179,"width":720,"height":600,"hasJson":false,"jsonReproduces":null,"src":["Graph2dMoreDemos.kt"],"rc":"docs/androidx-kotlin/quadrant/doc.rc","json":null}
{"id":"androidx-kotlin/radar","title":"radar","description":"Product Comparison","source":"androidx","authoring":["kt"],"apis":["drawCircle","drawLine","drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":6525,"ops":262,"width":680,"height":680,"hasJson":false,"jsonReproduces":null,"src":["Graph2dRelationDemos.kt"],"rc":"docs/androidx-kotlin/radar/doc.rc","json":null}
{"id":"androidx-kotlin/radialbar","title":"radialBar","description":"Daily Activity","source":"androidx","authoring":["kt"],"apis":["drawArc","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":2054,"ops":72,"width":620,"height":620,"hasJson":false,"jsonReproduces":null,"src":["Graph2dPolarDemos.kt"],"rc":"docs/androidx-kotlin/radialbar/doc.rc","json":null}
{"id":"androidx-kotlin/ridgeline","title":"ridgeline","description":"Distributions","source":"androidx","authoring":["kt"],"apis":["drawLine","drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":33108,"ops":1168,"width":720,"height":620,"hasJson":false,"jsonReproduces":null,"src":["Graph2dMoreDemos.kt"],"rc":"docs/androidx-kotlin/ridgeline/doc.rc","json":null}
{"id":"androidx-kotlin/rose","title":"rose","description":"Monthly Rainfall","source":"androidx","authoring":["kt"],"apis":["drawArc","drawCircle","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":4549,"ops":184,"width":640,"height":640,"hasJson":false,"jsonReproduces":null,"src":["Graph2dPolarDemos.kt"],"rc":"docs/androidx-kotlin/rose/doc.rc","json":null}
{"id":"androidx-kotlin/scatter","title":"scatter","description":"Spend vs Revenue","source":"androidx","authoring":["kt"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":7568,"ops":325,"width":720,"height":540,"hasJson":false,"jsonReproduces":null,"src":["Graph2dRelationDemos.kt"],"rc":"docs/androidx-kotlin/scatter/doc.rc","json":null}
{"id":"androidx-kotlin/sleeprings","title":"SleepRings","description":"Sleep Quality Rings","source":"androidx","authoring":["kt"],"apis":["drawArc","drawCircle","drawLine","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":3389,"ops":139,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":["DslDataVizSleepQualityRings.kt"],"rc":"docs/androidx-kotlin/sleeprings/doc.rc","json":null}
{"id":"androidx-kotlin/spheretimeshader","title":"SphereTimeShader","description":"Shaded sphere with the month name wrapped around it, driven by a time shader. #shaders #3d #kotlin","source":"androidx","authoring":["kt"],"apis":["drawRect","paint","shaders","text"],"flags":["animated","shaders"],"tags":["3d","kotlin","shaders"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":15253,"ops":6,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":["SphereTimeShader.kt"],"rc":"docs/androidx-kotlin/spheretimeshader/doc.rc","json":null}
{"id":"androidx-kotlin/spline","title":"spline","description":"Smoothed Trend","source":"androidx","authoring":["kt"],"apis":["drawCircle","drawLine","drawPath","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":11077,"ops":312,"width":800,"height":500,"hasJson":false,"jsonReproduces":null,"src":["Graph2dLineDemos.kt"],"rc":"docs/androidx-kotlin/spline/doc.rc","json":null}
{"id":"androidx-kotlin/step","title":"step","description":"Pricing Tier Over Time","source":"androidx","authoring":["kt"],"apis":["drawLine","drawPath","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":3896,"ops":160,"width":800,"height":500,"hasJson":false,"jsonReproduces":null,"src":["Graph2dLineDemos.kt"],"rc":"docs/androidx-kotlin/step/doc.rc","json":null}
{"id":"androidx-kotlin/stepprogressarc","title":"StepProgressArc","description":"Step progress arc reading 7250 of 10000 steps with quarter markers. #widget #graph #kotlin","source":"androidx","authoring":["kt"],"apis":["drawArc","drawLine","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["graph","kotlin","widget"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":3904,"ops":94,"width":400,"height":350,"hasJson":false,"jsonReproduces":null,"src":["DslDataVizStepProgressArc.kt"],"rc":"docs/androidx-kotlin/stepprogressarc/doc.rc","json":null}
{"id":"androidx-kotlin/stocksparkline","title":"StockSparkline","description":"Stock sparkline at 44850, up 6.41%, as a green trend line over a filled gradient. #graph #widget #kotlin","source":"androidx","authoring":["kt"],"apis":["drawPath","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["graph","kotlin","widget"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":1672,"ops":68,"width":500,"height":350,"hasJson":false,"jsonReproduces":null,"src":["DslDataVizStockSparkline.kt"],"rc":"docs/androidx-kotlin/stocksparkline/doc.rc","json":null}
{"id":"androidx-kotlin/stopwatch","title":"Stopwatch","description":"Stopwatch at 00:00.00 inside a teal progress ring. #clock #widget #kotlin","source":"androidx","authoring":["kt"],"apis":["drawCircle","expressions","interaction","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["clock","kotlin","widget"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":2039,"ops":163,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":["DslStopwatch.kt"],"rc":"docs/androidx-kotlin/stopwatch/doc.rc","json":null}
{"id":"androidx-kotlin/ticker","title":"Ticker","description":"Watchlist ticker scrolling a value across a pale card. #animation #widget #kotlin","source":"androidx","authoring":["kt"],"apis":[],"flags":[],"tags":["animation","kotlin","widget"],"addedAt":"2026-09-29T13:05:53-07:00","bytes":7500,"ops":0,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":["RcDslTicker.kt"],"rc":"docs/androidx-kotlin/ticker/doc.rc","json":null}
{"id":"androidx-kotlin/treemap","title":"treemap","description":"Market Caps","source":"androidx","authoring":["kt"],"apis":["drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":2797,"ops":106,"width":760,"height":600,"hasJson":false,"jsonReproduces":null,"src":["Graph2dMoreDemos.kt"],"rc":"docs/androidx-kotlin/treemap/doc.rc","json":null}
{"id":"androidx-kotlin/waterfall","title":"waterfall","description":"Revenue Bridge","source":"androidx","authoring":["kt"],"apis":["drawLine","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":3762,"ops":160,"width":820,"height":520,"hasJson":false,"jsonReproduces":null,"src":["Graph2dFinancialDemos.kt"],"rc":"docs/androidx-kotlin/waterfall/doc.rc","json":null}
{"id":"androidx-kotlin/weatherforecast","title":"WeatherForecast","description":"Weather Forecast Bars","source":"androidx","authoring":["kt"],"apis":["drawCircle","drawLine","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T13:05:53-07:00","bytes":4324,"ops":134,"width":500,"height":400,"hasJson":false,"jsonReproduces":null,"src":["DslDataVizWeatherForecast.kt"],"rc":"docs/androidx-kotlin/weatherforecast/doc.rc","json":null}
{"id":"architecture3d/architecture3d","title":"architecture3d","description":"RemoteCompose architecture diagram","source":"droidkaigi26","authoring":["json"],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T16:08:26-07:00","bytes":5168,"ops":0,"width":1600,"height":900,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/architecture3d/architecture3d/doc.rc","json":"docs/architecture3d/architecture3d/doc.json"}
{"id":"charts2d/annotations","title":"annotations","description":"Annotated KPI line chart","source":"droidkaigi26","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T16:08:26-07:00","bytes":2288,"ops":118,"width":900,"height":560,"hasJson":true,"jsonReproduces":"yes","src":["make.py"],"rc":"docs/charts2d/annotations/doc.rc","json":"docs/charts2d/annotations/doc.json"}
{"id":"charts2d/bar-grouped","title":"bar grouped","description":"Grouped bar chart, sales by region","source":"droidkaigi26","authoring":["json","py"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T16:08:26-07:00","bytes":1991,"ops":99,"width":900,"height":520,"hasJson":true,"jsonReproduces":"yes","src":["make.py"],"rc":"docs/charts2d/bar-grouped/doc.rc","json":"docs/charts2d/bar-grouped/doc.json"}
{"id":"charts2d/box-plot","title":"box plot","description":"Box plot, response by treatment","source":"droidkaigi26","authoring":["json","py"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T16:08:26-07:00","bytes":1755,"ops":88,"width":800,"height":520,"hasJson":true,"jsonReproduces":"yes","src":["make.py"],"rc":"docs/charts2d/box-plot/doc.rc","json":"docs/charts2d/box-plot/doc.json"}
{"id":"charts2d/bubble","title":"bubble","description":"Bubble chart, market map","source":"droidkaigi26","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T16:08:26-07:00","bytes":2169,"ops":101,"width":720,"height":560,"hasJson":true,"jsonReproduces":"yes","src":["make.py"],"rc":"docs/charts2d/bubble/doc.rc","json":"docs/charts2d/bubble/doc.json"}
{"id":"charts2d/bullet","title":"bullet","description":"Bullet chart, KPIs against target","source":"droidkaigi26","authoring":["json","py"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T16:08:26-07:00","bytes":1672,"ops":85,"width":760,"height":420,"hasJson":true,"jsonReproduces":"yes","src":["make.py"],"rc":"docs/charts2d/bullet/doc.rc","json":"docs/charts2d/bullet/doc.json"}
{"id":"charts2d/forest","title":"forest","description":"Forest plot of a meta-analysis","source":"droidkaigi26","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T16:08:26-07:00","bytes":2140,"ops":102,"width":820,"height":520,"hasJson":true,"jsonReproduces":"yes","src":["make.py"],"rc":"docs/charts2d/forest/doc.rc","json":"docs/charts2d/forest/doc.json"}
{"id":"charts2d/heatmap","title":"heatmap","description":"Heatmap of sessions by day and hour","source":"droidkaigi26","authoring":["json","py"],"apis":["drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T16:08:26-07:00","bytes":4475,"ops":206,"width":820,"height":520,"hasJson":true,"jsonReproduces":"yes","src":["make.py"],"rc":"docs/charts2d/heatmap/doc.rc","json":"docs/charts2d/heatmap/doc.json"}
{"id":"charts2d/radar","title":"radar","description":"Radar chart comparing two products","source":"droidkaigi26","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T16:08:26-07:00","bytes":1955,"ops":108,"width":680,"height":680,"hasJson":true,"jsonReproduces":"yes","src":["make.py"],"rc":"docs/charts2d/radar/doc.rc","json":"docs/charts2d/radar/doc.json"}
{"id":"charts2d/rose","title":"rose","description":"Rose / polar area chart of monthly rainfall","source":"droidkaigi26","authoring":["json","py"],"apis":["drawArc","drawOval","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T16:08:26-07:00","bytes":1950,"ops":90,"width":640,"height":640,"hasJson":true,"jsonReproduces":"yes","src":["make.py"],"rc":"docs/charts2d/rose/doc.rc","json":"docs/charts2d/rose/doc.json"}
{"id":"charts2d/waffle","title":"waffle","description":"Waffle chart of energy mix","source":"droidkaigi26","authoring":["json","py"],"apis":["drawRect","drawRoundRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T16:08:26-07:00","bytes":5873,"ops":247,"width":640,"height":680,"hasJson":true,"jsonReproduces":"yes","src":["make.py"],"rc":"docs/charts2d/waffle/doc.rc","json":"docs/charts2d/waffle/doc.json"}
{"id":"charts2d/waterfall","title":"waterfall","description":"Waterfall / revenue bridge chart","source":"droidkaigi26","authoring":["json","py"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T16:08:26-07:00","bytes":1896,"ops":91,"width":820,"height":520,"hasJson":true,"jsonReproduces":"yes","src":["make.py"],"rc":"docs/charts2d/waterfall/doc.rc","json":"docs/charts2d/waterfall/doc.json"}
{"id":"charts3d/01-scatter","title":"01 scatter","description":"3D scatter / bubble plot, 46 points sized and coloured by magnitude \u2014 drag to orbit","source":"rc-experiments","authoring":["json"],"apis":[],"flags":[],"tags":["3d","featured","graph"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":11073,"ops":0,"width":340,"height":340,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/charts3d/01-scatter/doc.rc","json":"docs/charts3d/01-scatter/doc.json"}
{"id":"charts3d/02-surface","title":"02 surface","description":"3D surface plot, animated radial sinc \u2014 drag to orbit","source":"rc-experiments","authoring":["json"],"apis":[],"flags":[],"tags":["3d","featured","graph"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2094,"ops":0,"width":340,"height":340,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/charts3d/02-surface/doc.rc","json":"docs/charts3d/02-surface/doc.json"}
{"id":"charts3d/03-wireframe","title":"03 wireframe","description":"wireframe mesh over a shaded saddle \u2014 drag to orbit","source":"rc-experiments","authoring":["json"],"apis":[],"flags":[],"tags":["3d","graph"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2065,"ops":0,"width":340,"height":340,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/charts3d/03-wireframe/doc.rc","json":"docs/charts3d/03-wireframe/doc.json"}
{"id":"charts3d/04-bars","title":"04 bars","description":"3D bar chart, 8x8 columns on an XY floor \u2014 drag to orbit","source":"rc-experiments","authoring":["json"],"apis":[],"flags":[],"tags":["3d","graph"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":15176,"ops":0,"width":340,"height":340,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/charts3d/04-bars/doc.rc","json":"docs/charts3d/04-bars/doc.json"}
{"id":"charts3d/05-trajectory","title":"05 trajectory","description":"3D trajectory, Lorenz attractor coloured along its path \u2014 drag to orbit","source":"rc-experiments","authoring":["json"],"apis":[],"flags":[],"tags":["3d","featured","graph"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":94718,"ops":0,"width":340,"height":340,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/charts3d/05-trajectory/doc.rc","json":"docs/charts3d/05-trajectory/doc.json"}
{"id":"charts3d/06-waterfall","title":"06 waterfall","description":"waterfall / ribbon plot, eleven offset traces \u2014 drag to orbit","source":"rc-experiments","authoring":["json"],"apis":[],"flags":[],"tags":["3d","graph"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":5061,"ops":0,"width":340,"height":340,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/charts3d/06-waterfall/doc.rc","json":"docs/charts3d/06-waterfall/doc.json"}
{"id":"charts3d/07-contour","title":"07 contour","description":"3D contour plot, nine quantised level slabs \u2014 drag to orbit","source":"rc-experiments","authoring":["json"],"apis":[],"flags":[],"tags":["3d","graph"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":4287,"ops":0,"width":340,"height":340,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/charts3d/07-contour/doc.rc","json":"docs/charts3d/07-contour/doc.json"}
{"id":"charts3d/08-histogram","title":"08 histogram","description":"3D histogram, 2600 samples binned 10x10 \u2014 drag to orbit","source":"rc-experiments","authoring":["json"],"apis":[],"flags":[],"tags":["3d","graph"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":18101,"ops":0,"width":340,"height":340,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/charts3d/08-histogram/doc.rc","json":"docs/charts3d/08-histogram/doc.json"}
{"id":"charts3d/09-quiver","title":"09 quiver","description":"3D vector field, 5x5x5 swirl about the y axis \u2014 drag to orbit","source":"rc-experiments","authoring":["json"],"apis":[],"flags":[],"tags":["3d","featured","graph"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":32716,"ops":0,"width":340,"height":340,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/charts3d/09-quiver/doc.rc","json":"docs/charts3d/09-quiver/doc.json"}
{"id":"charts3d/10-voxel","title":"10 voxel","description":"voxel density plot, two gaussian blobs in a 7x7x7 grid \u2014 drag to orbit","source":"rc-experiments","authoring":["json"],"apis":[],"flags":[],"tags":["3d","graph"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":11927,"ops":0,"width":340,"height":340,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/charts3d/10-voxel/doc.rc","json":"docs/charts3d/10-voxel/doc.json"}
{"id":"games/bubble-drop","title":"bubble drop","description":"Bubble Drop: tap to release bubbles and land all three in the bin","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["game"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":5384,"ops":0,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["build.py"],"rc":"docs/games/bubble-drop/doc.rc","json":"docs/games/bubble-drop/doc.json"}
{"id":"games/chain-reaction","title":"chain reaction","description":"Chain Reaction: tap a mote to detonate it and chain to the others","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["game"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":8304,"ops":0,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["build.py"],"rc":"docs/games/chain-reaction/doc.rc","json":"docs/games/chain-reaction/doc.json"}
{"id":"games/gravity-beacon","title":"gravity beacon","description":"Gravity Beacon: tap to place a gravity well and curve the ball into the goal","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["featured","game"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":4433,"ops":0,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["build.py"],"rc":"docs/games/gravity-beacon/doc.rc","json":"docs/games/gravity-beacon/doc.json"}
{"id":"games/input","title":"input","description":"input probe 2","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["game"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":579,"ops":0,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["build.py"],"rc":"docs/games/input/doc.rc","json":"docs/games/input/doc.json"}
{"id":"games/one-tap-pinball","title":"one tap pinball","description":"One-Tap Pinball: tap to fire the bumpers, hit the rings in order","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["game"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":5251,"ops":0,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["build.py"],"rc":"docs/games/one-tap-pinball/doc.rc","json":"docs/games/one-tap-pinball/doc.json"}
{"id":"games/orbit-hop","title":"orbit hop","description":"Orbit Hop: tap to leave orbit and fly to the next planet","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["featured","game"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":3997,"ops":0,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["build.py"],"rc":"docs/games/orbit-hop/doc.rc","json":"docs/games/orbit-hop/doc.json"}
{"id":"games/order","title":"order","description":"equation order probe","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["game"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":296,"ops":0,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["build.py"],"rc":"docs/games/order/doc.rc","json":"docs/games/order/doc.json"}
{"id":"games/particle-shepherd","title":"particle shepherd","description":"Particle Shepherd: tap to repel the sparks and herd them into the pen","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["game"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":5084,"ops":0,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["build.py"],"rc":"docs/games/particle-shepherd/doc.rc","json":"docs/games/particle-shepherd/doc.json"}
{"id":"games/polarity","title":"polarity","description":"Polarity: tap to switch between attract and repel and ride the magnetic field to the goal","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["game"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":4211,"ops":0,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["build.py"],"rc":"docs/games/polarity/doc.rc","json":"docs/games/polarity/doc.json"}
{"id":"games/pulse-push","title":"pulse push","description":"Pulse Push: tap to push the ball to the goal without hitting a hazard","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["game"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":5075,"ops":0,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["build.py"],"rc":"docs/games/pulse-push/doc.rc","json":"docs/games/pulse-push/doc.json"}
{"id":"games/safe-zone","title":"safe zone","description":"Safe Zone: tap to shield the drifters from incoming projectiles","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["game"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":4127,"ops":0,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["build.py"],"rc":"docs/games/safe-zone/doc.rc","json":"docs/games/safe-zone/doc.json"}
{"id":"games/skeleton","title":"skeleton","description":"skeleton: one actor bouncing in a box","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["game"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":489,"ops":0,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["build.py"],"rc":"docs/games/skeleton/doc.rc","json":"docs/games/skeleton/doc.json"}
{"id":"games/wall-bounce","title":"wall bounce","description":"Wall Bounce: tap to place bumpers and steer the ball through the checkpoints","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["featured","game"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":3949,"ops":0,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["build.py"],"rc":"docs/games/wall-bounce/doc.rc","json":"docs/games/wall-bounce/doc.json"}
{"id":"iot-panels-light/01-smart-bulb","title":"01 smart bulb","description":"Smart Bulb \u2014 warm white \u00b7 82%","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1987,"ops":87,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/01-smart-bulb/doc.rc","json":"docs/iot-panels-light/01-smart-bulb/doc.json"}
{"id":"iot-panels-light/02-led-strip","title":"02 led strip","description":"LED Light Strip \u2014 chase \u00b7 60 fps","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1694,"ops":80,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/02-led-strip/doc.rc","json":"docs/iot-panels-light/02-led-strip/doc.json"}
{"id":"iot-panels-light/03-dimmer-switch","title":"03 dimmer switch","description":"Dimmer Switch \u2014 rotary \u00b7 scene 2","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1677,"ops":82,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/03-dimmer-switch/doc.rc","json":"docs/iot-panels-light/03-dimmer-switch/doc.json"}
{"id":"iot-panels-light/04-motion-night-light","title":"04 motion night light","description":"Motion Night Light \u2014 PIR \u00b7 auto-on","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1961,"ops":88,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/04-motion-night-light/doc.rc","json":"docs/iot-panels-light/04-motion-night-light/doc.json"}
{"id":"iot-panels-light/05-mood-lamp","title":"05 mood lamp","description":"Mood Lamp \u2014 colour cycle \u00b7 12s","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1579,"ops":77,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/05-mood-lamp/doc.rc","json":"docs/iot-panels-light/05-mood-lamp/doc.json"}
{"id":"iot-panels-light/06-thermostat","title":"06 thermostat","description":"Smart Thermostat \u2014 heating \u00b7 target 22\u00b0","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2024,"ops":98,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/06-thermostat/doc.rc","json":"docs/iot-panels-light/06-thermostat/doc.json"}
{"id":"iot-panels-light/07-radiator-valve","title":"07 radiator valve","description":"Radiator Valve \u2014 TRV \u00b7 opening to 60%","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2065,"ops":99,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/07-radiator-valve/doc.rc","json":"docs/iot-panels-light/07-radiator-valve/doc.json"}
{"id":"iot-panels-light/08-air-purifier","title":"08 air purifier","description":"Air Purifier \u2014 HEPA \u00b7 auto \u00b7 PM2.5 12","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1875,"ops":83,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/08-air-purifier/doc.rc","json":"docs/iot-panels-light/08-air-purifier/doc.json"}
{"id":"iot-panels-light/09-humidifier","title":"09 humidifier","description":"Humidifier \u2014 ultrasonic \u00b7 48% RH","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1625,"ops":74,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/09-humidifier/doc.rc","json":"docs/iot-panels-light/09-humidifier/doc.json"}
{"id":"iot-panels-light/10-ceiling-fan","title":"10 ceiling fan","description":"Ceiling Fan \u2014 speed 3 \u00b7 reverse off","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1749,"ops":91,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/10-ceiling-fan/doc.rc","json":"docs/iot-panels-light/10-ceiling-fan/doc.json"}
{"id":"iot-panels-light/11-video-doorbell","title":"11 video doorbell","description":"Video Doorbell \u2014 1440p \u00b7 chime \u00b7 motion","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1837,"ops":90,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/11-video-doorbell/doc.rc","json":"docs/iot-panels-light/11-video-doorbell/doc.json"}
{"id":"iot-panels-light/12-security-camera","title":"12 security camera","description":"Security Camera \u2014 PTZ \u00b7 night vision \u00b7 REC","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawLine","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2017,"ops":98,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/12-security-camera/doc.rc","json":"docs/iot-panels-light/12-security-camera/doc.json"}
{"id":"iot-panels-light/13-smart-lock","title":"13 smart lock","description":"Smart Lock \u2014 deadbolt \u00b7 auto-lock 30s","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2200,"ops":100,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/13-smart-lock/doc.rc","json":"docs/iot-panels-light/13-smart-lock/doc.json"}
{"id":"iot-panels-light/14-motion-sensor","title":"14 motion sensor","description":"Motion Sensor \u2014 PIR \u00b7 7 zones \u00b7 12m","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1719,"ops":76,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/14-motion-sensor/doc.rc","json":"docs/iot-panels-light/14-motion-sensor/doc.json"}
{"id":"iot-panels-light/15-contact-sensor","title":"15 contact sensor","description":"Door/Window Sensor \u2014 reed contact \u00b7 open","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1894,"ops":88,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/15-contact-sensor/doc.rc","json":"docs/iot-panels-light/15-contact-sensor/doc.json"}
{"id":"iot-panels-light/16-smoke-alarm","title":"16 smoke alarm","description":"Smoke Alarm \u2014 photoelectric \u00b7 alarm","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1829,"ops":91,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/16-smoke-alarm/doc.rc","json":"docs/iot-panels-light/16-smoke-alarm/doc.json"}
{"id":"iot-panels-light/17-co-detector","title":"17 co detector","description":"CO Detector \u2014 electrochemical \u00b7 ppm","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2068,"ops":91,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/17-co-detector/doc.rc","json":"docs/iot-panels-light/17-co-detector/doc.json"}
{"id":"iot-panels-light/18-water-leak","title":"18 water leak","description":"Water Leak Sensor \u2014 probe pair \u00b7 alarm","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2374,"ops":106,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/18-water-leak/doc.rc","json":"docs/iot-panels-light/18-water-leak/doc.json"}
{"id":"iot-panels-light/19-glass-break","title":"19 glass break","description":"Glass-Break Sensor \u2014 acoustic \u00b7 dual-stage","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2276,"ops":89,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/19-glass-break/doc.rc","json":"docs/iot-panels-light/19-glass-break/doc.json"}
{"id":"iot-panels-light/20-siren-keypad","title":"20 siren keypad","description":"Siren Keypad \u2014 entry delay \u00b7 arming","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2403,"ops":103,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/20-siren-keypad/doc.rc","json":"docs/iot-panels-light/20-siren-keypad/doc.json"}
{"id":"iot-panels-light/21-smart-fridge","title":"21 smart fridge","description":"Smart Fridge \u2014 3\u00b0C \u00b7 door closed","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2141,"ops":97,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/21-smart-fridge/doc.rc","json":"docs/iot-panels-light/21-smart-fridge/doc.json"}
{"id":"iot-panels-light/22-smart-oven","title":"22 smart oven","description":"Smart Oven \u2014 fan bake \u00b7 190\u00b0C","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2332,"ops":107,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/22-smart-oven/doc.rc","json":"docs/iot-panels-light/22-smart-oven/doc.json"}
{"id":"iot-panels-light/23-coffee-maker","title":"23 coffee maker","description":"Coffee Maker \u2014 brewing \u00b7 4 cups","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2275,"ops":98,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/23-coffee-maker/doc.rc","json":"docs/iot-panels-light/23-coffee-maker/doc.json"}
{"id":"iot-panels-light/24-smart-kettle","title":"24 smart kettle","description":"Smart Kettle \u2014 heating \u00b7 88\u00b0C","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2655,"ops":109,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/24-smart-kettle/doc.rc","json":"docs/iot-panels-light/24-smart-kettle/doc.json"}
{"id":"iot-panels-light/25-dishwasher","title":"25 dishwasher","description":"Dishwasher \u2014 eco 50\u00b0 \u00b7 42 min","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2175,"ops":102,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/25-dishwasher/doc.rc","json":"docs/iot-panels-light/25-dishwasher/doc.json"}
{"id":"iot-panels-light/26-microwave","title":"26 microwave","description":"Microwave \u2014 900W \u00b7 2:30 remaining","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2291,"ops":110,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/26-microwave/doc.rc","json":"docs/iot-panels-light/26-microwave/doc.json"}
{"id":"iot-panels-light/27-sous-vide","title":"27 sous vide","description":"Sous-Vide \u2014 circulator \u00b7 56.5\u00b0C","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2336,"ops":93,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/27-sous-vide/doc.rc","json":"docs/iot-panels-light/27-sous-vide/doc.json"}
{"id":"iot-panels-light/28-kitchen-scale","title":"28 kitchen scale","description":"Kitchen Scale \u2014 tare \u00b7 grams","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1925,"ops":86,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/28-kitchen-scale/doc.rc","json":"docs/iot-panels-light/28-kitchen-scale/doc.json"}
{"id":"iot-panels-light/29-toaster","title":"29 toaster","description":"Toaster \u2014 medium \u00b7 2 slice","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2277,"ops":109,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/29-toaster/doc.rc","json":"docs/iot-panels-light/29-toaster/doc.json"}
{"id":"iot-panels-light/30-wine-fridge","title":"30 wine fridge","description":"Wine Fridge \u2014 cellar \u00b7 12\u00b0C \u00b7 18 bottles","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2378,"ops":107,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/30-wine-fridge/doc.rc","json":"docs/iot-panels-light/30-wine-fridge/doc.json"}
{"id":"iot-panels-light/31-robot-vacuum","title":"31 robot vacuum","description":"Robot Vacuum \u2014 mapping \u00b7 5 passes","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2030,"ops":93,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/31-robot-vacuum/doc.rc","json":"docs/iot-panels-light/31-robot-vacuum/doc.json"}
{"id":"iot-panels-light/32-robot-mop","title":"32 robot mop","description":"Robot Mop \u2014 wet pass \u00b7 tank 60%","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1920,"ops":90,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/32-robot-mop/doc.rc","json":"docs/iot-panels-light/32-robot-mop/doc.json"}
{"id":"iot-panels-light/33-washing-machine","title":"33 washing machine","description":"Washing Machine \u2014 cottons 40\u00b0 \u00b7 spin","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1963,"ops":101,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/33-washing-machine/doc.rc","json":"docs/iot-panels-light/33-washing-machine/doc.json"}
{"id":"iot-panels-light/34-tumble-dryer","title":"34 tumble dryer","description":"Tumble Dryer \u2014 heat pump \u00b7 46 min","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2297,"ops":109,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/34-tumble-dryer/doc.rc","json":"docs/iot-panels-light/34-tumble-dryer/doc.json"}
{"id":"iot-panels-light/35-trash-compactor","title":"35 trash compactor","description":"Trash Compactor \u2014 4:1 \u00b7 ram down","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2162,"ops":96,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/35-trash-compactor/doc.rc","json":"docs/iot-panels-light/35-trash-compactor/doc.json"}
{"id":"iot-panels-light/36-smart-plug","title":"36 smart plug","description":"Smart Plug \u2014 relay \u00b7 metering","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2333,"ops":103,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/36-smart-plug/doc.rc","json":"docs/iot-panels-light/36-smart-plug/doc.json"}
{"id":"iot-panels-light/37-energy-monitor","title":"37 energy monitor","description":"Energy Monitor \u2014 whole home \u00b7 live","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["featured","iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1793,"ops":84,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/37-energy-monitor/doc.rc","json":"docs/iot-panels-light/37-energy-monitor/doc.json"}
{"id":"iot-panels-light/38-solar-inverter","title":"38 solar inverter","description":"Solar Inverter \u2014 string \u00b7 MPPT","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2415,"ops":108,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/38-solar-inverter/doc.rc","json":"docs/iot-panels-light/38-solar-inverter/doc.json"}
{"id":"iot-panels-light/39-home-battery","title":"39 home battery","description":"Home Battery \u2014 13.5 kWh \u00b7 cycling","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2314,"ops":103,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/39-home-battery/doc.rc","json":"docs/iot-panels-light/39-home-battery/doc.json"}
{"id":"iot-panels-light/40-ev-charger","title":"40 ev charger","description":"EV Charger \u2014 7.4 kW \u00b7 62%","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2572,"ops":115,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/40-ev-charger/doc.rc","json":"docs/iot-panels-light/40-ev-charger/doc.json"}
{"id":"iot-panels-light/41-sprinkler","title":"41 sprinkler","description":"Sprinkler Controller \u2014 6 zones \u00b7 zone 3 live","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2162,"ops":96,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/41-sprinkler/doc.rc","json":"docs/iot-panels-light/41-sprinkler/doc.json"}
{"id":"iot-panels-light/42-soil-moisture","title":"42 soil moisture","description":"Soil Moisture Sensor \u2014 VWC \u00b7 capacitive","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2098,"ops":93,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/42-soil-moisture/doc.rc","json":"docs/iot-panels-light/42-soil-moisture/doc.json"}
{"id":"iot-panels-light/43-hose-valve","title":"43 hose valve","description":"Hose Valve \u2014 flow \u00b7 9.2 L/min","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2243,"ops":105,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/43-hose-valve/doc.rc","json":"docs/iot-panels-light/43-hose-valve/doc.json"}
{"id":"iot-panels-light/44-pool-monitor","title":"44 pool monitor","description":"Pool Monitor \u2014 pH 7.4 \u00b7 27.4\u00b0C","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2424,"ops":113,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/44-pool-monitor/doc.rc","json":"docs/iot-panels-light/44-pool-monitor/doc.json"}
{"id":"iot-panels-light/45-rain-sensor","title":"45 rain sensor","description":"Rain Sensor \u2014 tipping bucket \u00b7 mm","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2421,"ops":106,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/45-rain-sensor/doc.rc","json":"docs/iot-panels-light/45-rain-sensor/doc.json"}
{"id":"iot-panels-light/46-smart-speaker","title":"46 smart speaker","description":"Smart Speaker \u2014 listening \u00b7 far-field","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2010,"ops":87,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/46-smart-speaker/doc.rc","json":"docs/iot-panels-light/46-smart-speaker/doc.json"}
{"id":"iot-panels-light/47-smart-display","title":"47 smart display","description":"Smart Display \u2014 ambient \u00b7 7in","source":"rcjson","authoring":["json","py"],"apis":["clip","drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1945,"ops":101,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/47-smart-display/doc.rc","json":"docs/iot-panels-light/47-smart-display/doc.json"}
{"id":"iot-panels-light/48-smart-tv","title":"48 smart tv","description":"Smart TV \u2014 4K HDR \u00b7 playing","source":"rcjson","authoring":["json","py"],"apis":["clip","drawCircle","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["featured","iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1871,"ops":86,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/48-smart-tv/doc.rc","json":"docs/iot-panels-light/48-smart-tv/doc.json"}
{"id":"iot-panels-light/49-streaming-box","title":"49 streaming box","description":"Streaming Box \u2014 buffering \u00b7 adaptive","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2853,"ops":128,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/49-streaming-box/doc.rc","json":"docs/iot-panels-light/49-streaming-box/doc.json"}
{"id":"iot-panels-light/50-projector","title":"50 projector","description":"Projector \u2014 lamp 78% \u00b7 1080p","source":"rcjson","authoring":["json","py"],"apis":["clip","drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2270,"ops":102,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/50-projector/doc.rc","json":"docs/iot-panels-light/50-projector/doc.json"}
{"id":"iot-panels-light/51-mesh-router","title":"51 mesh router","description":"Mesh Router \u2014 Wi-Fi 6E \u00b7 12 clients","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2082,"ops":99,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/51-mesh-router/doc.rc","json":"docs/iot-panels-light/51-mesh-router/doc.json"}
{"id":"iot-panels-light/52-range-extender","title":"52 range extender","description":"Range Extender \u2014 repeater \u00b7 5 GHz","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2184,"ops":97,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/52-range-extender/doc.rc","json":"docs/iot-panels-light/52-range-extender/doc.json"}
{"id":"iot-panels-light/53-smart-hub","title":"53 smart hub","description":"Smart Hub \u2014 Thread \u00b7 24 paired","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1790,"ops":84,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/53-smart-hub/doc.rc","json":"docs/iot-panels-light/53-smart-hub/doc.json"}
{"id":"iot-panels-light/54-network-switch","title":"54 network switch","description":"Network Switch \u2014 8-port gigabit \u00b7 PoE","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1909,"ops":86,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/54-network-switch/doc.rc","json":"docs/iot-panels-light/54-network-switch/doc.json"}
{"id":"iot-panels-light/55-doorbell-chime","title":"55 doorbell chime","description":"Doorbell Chime \u2014 two-tone \u00b7 indoor","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2012,"ops":90,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/55-doorbell-chime/doc.rc","json":"docs/iot-panels-light/55-doorbell-chime/doc.json"}
{"id":"iot-panels-light/56-smart-blinds","title":"56 smart blinds","description":"Smart Blinds \u2014 tilt 60\u00b0 \u00b7 lift 30%","source":"rcjson","authoring":["json","py"],"apis":["clip","drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2116,"ops":98,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/56-smart-blinds/doc.rc","json":"docs/iot-panels-light/56-smart-blinds/doc.json"}
{"id":"iot-panels-light/57-smart-curtains","title":"57 smart curtains","description":"Smart Curtains \u2014 track \u00b7 70% open","source":"rcjson","authoring":["json","py"],"apis":["clip","drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1692,"ops":82,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/57-smart-curtains/doc.rc","json":"docs/iot-panels-light/57-smart-curtains/doc.json"}
{"id":"iot-panels-light/58-garage-door","title":"58 garage door","description":"Garage Door \u2014 sectional \u00b7 opening","source":"rcjson","authoring":["json","py"],"apis":["clip","drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1886,"ops":89,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/58-garage-door/doc.rc","json":"docs/iot-panels-light/58-garage-door/doc.json"}
{"id":"iot-panels-light/59-window-opener","title":"59 window opener","description":"Window Opener \u2014 chain actuator \u00b7 40%","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2209,"ops":99,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/59-window-opener/doc.rc","json":"docs/iot-panels-light/59-window-opener/doc.json"}
{"id":"iot-panels-light/60-gate-opener","title":"60 gate opener","description":"Gate Opener \u2014 rack & pinion \u00b7 sliding","source":"rcjson","authoring":["json","py"],"apis":["clip","drawCircle","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2119,"ops":107,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/60-gate-opener/doc.rc","json":"docs/iot-panels-light/60-gate-opener/doc.json"}
{"id":"iot-panels-light/61-body-scale","title":"61 body scale","description":"Body Scale \u2014 bio-impedance \u00b7 settling","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2122,"ops":95,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/61-body-scale/doc.rc","json":"docs/iot-panels-light/61-body-scale/doc.json"}
{"id":"iot-panels-light/62-sleep-tracker","title":"62 sleep tracker","description":"Sleep Tracker \u2014 hypnogram \u00b7 6h 42m","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2111,"ops":100,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/62-sleep-tracker/doc.rc","json":"docs/iot-panels-light/62-sleep-tracker/doc.json"}
{"id":"iot-panels-light/63-smart-mattress","title":"63 smart mattress","description":"Smart Mattress \u2014 zones \u00b7 dual climate","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2066,"ops":98,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/63-smart-mattress/doc.rc","json":"docs/iot-panels-light/63-smart-mattress/doc.json"}
{"id":"iot-panels-light/64-air-quality","title":"64 air quality","description":"Air Quality Monitor \u2014 PM2.5 \u00b7 laser","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2050,"ops":92,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/64-air-quality/doc.rc","json":"docs/iot-panels-light/64-air-quality/doc.json"}
{"id":"iot-panels-light/65-smart-mirror","title":"65 smart mirror","description":"Smart Mirror \u2014 presence \u00b7 widgets","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1919,"ops":91,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/65-smart-mirror/doc.rc","json":"docs/iot-panels-light/65-smart-mirror/doc.json"}
{"id":"iot-panels-light/66-pet-feeder","title":"66 pet feeder","description":"Pet Feeder \u2014 auger \u00b7 1 portion","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2836,"ops":114,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/66-pet-feeder/doc.rc","json":"docs/iot-panels-light/66-pet-feeder/doc.json"}
{"id":"iot-panels-light/67-water-fountain","title":"67 water fountain","description":"Water Fountain \u2014 circulating \u00b7 filtered","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2335,"ops":104,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/67-water-fountain/doc.rc","json":"docs/iot-panels-light/67-water-fountain/doc.json"}
{"id":"iot-panels-light/68-pet-camera","title":"68 pet camera","description":"Pet Camera \u2014 1080p \u00b7 treat toss","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2394,"ops":110,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/68-pet-camera/doc.rc","json":"docs/iot-panels-light/68-pet-camera/doc.json"}
{"id":"iot-panels-light/69-litter-box","title":"69 litter box","description":"Litter Box \u2014 rake cycle \u00b7 drawer","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2167,"ops":98,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/69-litter-box/doc.rc","json":"docs/iot-panels-light/69-litter-box/doc.json"}
{"id":"iot-panels-light/70-pet-door","title":"70 pet door","description":"Pet Door \u2014 microchip \u00b7 unlocked","source":"rcjson","authoring":["json","py"],"apis":["clip","drawCircle","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2625,"ops":113,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/70-pet-door/doc.rc","json":"docs/iot-panels-light/70-pet-door/doc.json"}
{"id":"iot-panels-light/71-aroma-diffuser","title":"71 aroma diffuser","description":"Aroma Diffuser \u2014 ultrasonic \u00b7 4h","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2090,"ops":91,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/71-aroma-diffuser/doc.rc","json":"docs/iot-panels-light/71-aroma-diffuser/doc.json"}
{"id":"iot-panels-light/72-alarm-clock","title":"72 alarm clock","description":"Alarm Clock \u2014 sunrise \u00b7 alarm 07:00","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1980,"ops":90,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/72-alarm-clock/doc.rc","json":"docs/iot-panels-light/72-alarm-clock/doc.json"}
{"id":"iot-panels-light/73-weather-station","title":"73 weather station","description":"Weather Station \u2014 anemometer \u00b7 vane","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2675,"ops":119,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/73-weather-station/doc.rc","json":"docs/iot-panels-light/73-weather-station/doc.json"}
{"id":"iot-panels-light/74-smart-planter","title":"74 smart planter","description":"Smart Planter \u2014 self-watering \u00b7 grow light","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2824,"ops":122,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/74-smart-planter/doc.rc","json":"docs/iot-panels-light/74-smart-planter/doc.json"}
{"id":"iot-panels-light/75-aquarium","title":"75 aquarium","description":"Aquarium Controller \u2014 26.5\u00b0C \u00b7 day cycle","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2593,"ops":115,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/75-aquarium/doc.rc","json":"docs/iot-panels-light/75-aquarium/doc.json"}
{"id":"iot-panels-light/76-baby-monitor","title":"76 baby monitor","description":"Baby Monitor \u2014 night vision \u00b7 20.4\u00b0C","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2389,"ops":105,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/76-baby-monitor/doc.rc","json":"docs/iot-panels-light/76-baby-monitor/doc.json"}
{"id":"iot-panels-light/77-mailbox-sensor","title":"77 mailbox sensor","description":"Mailbox Sensor \u2014 post detected \u00b7 flag up","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2301,"ops":103,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/77-mailbox-sensor/doc.rc","json":"docs/iot-panels-light/77-mailbox-sensor/doc.json"}
{"id":"iot-panels-light/78-smart-vent","title":"78 smart vent","description":"Smart Vent \u2014 zone 4 \u00b7 62% open","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2085,"ops":99,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/78-smart-vent/doc.rc","json":"docs/iot-panels-light/78-smart-vent/doc.json"}
{"id":"iot-panels-light/79-bird-feeder","title":"79 bird feeder","description":"Bird Feeder \u2014 camera \u00b7 species ID","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2670,"ops":116,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/79-bird-feeder/doc.rc","json":"docs/iot-panels-light/79-bird-feeder/doc.json"}
{"id":"iot-panels-light/80-smart-bin","title":"80 smart bin","description":"Smart Bin \u2014 proximity lid \u00b7 64% full","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2681,"ops":111,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels-light/80-smart-bin/doc.rc","json":"docs/iot-panels-light/80-smart-bin/doc.json"}
{"id":"iot-panels/01-smart-bulb","title":"01 smart bulb","description":"Smart Bulb \u2014 warm white \u00b7 82%","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1987,"ops":87,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/01-smart-bulb/doc.rc","json":"docs/iot-panels/01-smart-bulb/doc.json"}
{"id":"iot-panels/02-led-strip","title":"02 led strip","description":"LED Light Strip \u2014 chase \u00b7 60 fps","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1694,"ops":80,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/02-led-strip/doc.rc","json":"docs/iot-panels/02-led-strip/doc.json"}
{"id":"iot-panels/03-dimmer-switch","title":"03 dimmer switch","description":"Dimmer Switch \u2014 rotary \u00b7 scene 2","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1677,"ops":82,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/03-dimmer-switch/doc.rc","json":"docs/iot-panels/03-dimmer-switch/doc.json"}
{"id":"iot-panels/04-motion-night-light","title":"04 motion night light","description":"Motion Night Light \u2014 PIR \u00b7 auto-on","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1961,"ops":88,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/04-motion-night-light/doc.rc","json":"docs/iot-panels/04-motion-night-light/doc.json"}
{"id":"iot-panels/05-mood-lamp","title":"05 mood lamp","description":"Mood Lamp \u2014 colour cycle \u00b7 12s","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1579,"ops":77,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/05-mood-lamp/doc.rc","json":"docs/iot-panels/05-mood-lamp/doc.json"}
{"id":"iot-panels/06-thermostat","title":"06 thermostat","description":"Smart Thermostat \u2014 heating \u00b7 target 22\u00b0","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["featured","iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2024,"ops":98,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/06-thermostat/doc.rc","json":"docs/iot-panels/06-thermostat/doc.json"}
{"id":"iot-panels/07-radiator-valve","title":"07 radiator valve","description":"Radiator Valve \u2014 TRV \u00b7 opening to 60%","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2065,"ops":99,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/07-radiator-valve/doc.rc","json":"docs/iot-panels/07-radiator-valve/doc.json"}
{"id":"iot-panels/08-air-purifier","title":"08 air purifier","description":"Air Purifier \u2014 HEPA \u00b7 auto \u00b7 PM2.5 12","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1875,"ops":83,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/08-air-purifier/doc.rc","json":"docs/iot-panels/08-air-purifier/doc.json"}
{"id":"iot-panels/09-humidifier","title":"09 humidifier","description":"Humidifier \u2014 ultrasonic \u00b7 48% RH","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1625,"ops":74,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/09-humidifier/doc.rc","json":"docs/iot-panels/09-humidifier/doc.json"}
{"id":"iot-panels/10-ceiling-fan","title":"10 ceiling fan","description":"Ceiling Fan \u2014 speed 3 \u00b7 reverse off","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1749,"ops":91,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/10-ceiling-fan/doc.rc","json":"docs/iot-panels/10-ceiling-fan/doc.json"}
{"id":"iot-panels/11-video-doorbell","title":"11 video doorbell","description":"Video Doorbell \u2014 1440p \u00b7 chime \u00b7 motion","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1837,"ops":90,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/11-video-doorbell/doc.rc","json":"docs/iot-panels/11-video-doorbell/doc.json"}
{"id":"iot-panels/12-security-camera","title":"12 security camera","description":"Security Camera \u2014 PTZ \u00b7 night vision \u00b7 REC","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawLine","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2017,"ops":98,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/12-security-camera/doc.rc","json":"docs/iot-panels/12-security-camera/doc.json"}
{"id":"iot-panels/13-smart-lock","title":"13 smart lock","description":"Smart Lock \u2014 deadbolt \u00b7 auto-lock 30s","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2200,"ops":100,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/13-smart-lock/doc.rc","json":"docs/iot-panels/13-smart-lock/doc.json"}
{"id":"iot-panels/14-motion-sensor","title":"14 motion sensor","description":"Motion Sensor \u2014 PIR \u00b7 7 zones \u00b7 12m","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["featured","iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1719,"ops":76,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/14-motion-sensor/doc.rc","json":"docs/iot-panels/14-motion-sensor/doc.json"}
{"id":"iot-panels/15-contact-sensor","title":"15 contact sensor","description":"Door/Window Sensor \u2014 reed contact \u00b7 open","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1894,"ops":88,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/15-contact-sensor/doc.rc","json":"docs/iot-panels/15-contact-sensor/doc.json"}
{"id":"iot-panels/16-smoke-alarm","title":"16 smoke alarm","description":"Smoke Alarm \u2014 photoelectric \u00b7 alarm","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1829,"ops":91,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/16-smoke-alarm/doc.rc","json":"docs/iot-panels/16-smoke-alarm/doc.json"}
{"id":"iot-panels/17-co-detector","title":"17 co detector","description":"CO Detector \u2014 electrochemical \u00b7 ppm","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2068,"ops":91,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/17-co-detector/doc.rc","json":"docs/iot-panels/17-co-detector/doc.json"}
{"id":"iot-panels/18-water-leak","title":"18 water leak","description":"Water Leak Sensor \u2014 probe pair \u00b7 alarm","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2374,"ops":106,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/18-water-leak/doc.rc","json":"docs/iot-panels/18-water-leak/doc.json"}
{"id":"iot-panels/19-glass-break","title":"19 glass break","description":"Glass-Break Sensor \u2014 acoustic \u00b7 dual-stage","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2276,"ops":89,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/19-glass-break/doc.rc","json":"docs/iot-panels/19-glass-break/doc.json"}
{"id":"iot-panels/20-siren-keypad","title":"20 siren keypad","description":"Siren Keypad \u2014 entry delay \u00b7 arming","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2403,"ops":103,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/20-siren-keypad/doc.rc","json":"docs/iot-panels/20-siren-keypad/doc.json"}
{"id":"iot-panels/21-smart-fridge","title":"21 smart fridge","description":"Smart Fridge \u2014 3\u00b0C \u00b7 door closed","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2141,"ops":97,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/21-smart-fridge/doc.rc","json":"docs/iot-panels/21-smart-fridge/doc.json"}
{"id":"iot-panels/22-smart-oven","title":"22 smart oven","description":"Smart Oven \u2014 fan bake \u00b7 190\u00b0C","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2332,"ops":107,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/22-smart-oven/doc.rc","json":"docs/iot-panels/22-smart-oven/doc.json"}
{"id":"iot-panels/23-coffee-maker","title":"23 coffee maker","description":"Coffee Maker \u2014 brewing \u00b7 4 cups","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2275,"ops":98,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/23-coffee-maker/doc.rc","json":"docs/iot-panels/23-coffee-maker/doc.json"}
{"id":"iot-panels/24-smart-kettle","title":"24 smart kettle","description":"Smart Kettle \u2014 heating \u00b7 88\u00b0C","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2655,"ops":109,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/24-smart-kettle/doc.rc","json":"docs/iot-panels/24-smart-kettle/doc.json"}
{"id":"iot-panels/25-dishwasher","title":"25 dishwasher","description":"Dishwasher \u2014 eco 50\u00b0 \u00b7 42 min","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2175,"ops":102,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/25-dishwasher/doc.rc","json":"docs/iot-panels/25-dishwasher/doc.json"}
{"id":"iot-panels/26-microwave","title":"26 microwave","description":"Microwave \u2014 900W \u00b7 2:30 remaining","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2291,"ops":110,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/26-microwave/doc.rc","json":"docs/iot-panels/26-microwave/doc.json"}
{"id":"iot-panels/27-sous-vide","title":"27 sous vide","description":"Sous-Vide \u2014 circulator \u00b7 56.5\u00b0C","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2336,"ops":93,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/27-sous-vide/doc.rc","json":"docs/iot-panels/27-sous-vide/doc.json"}
{"id":"iot-panels/28-kitchen-scale","title":"28 kitchen scale","description":"Kitchen Scale \u2014 tare \u00b7 grams","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1925,"ops":86,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/28-kitchen-scale/doc.rc","json":"docs/iot-panels/28-kitchen-scale/doc.json"}
{"id":"iot-panels/29-toaster","title":"29 toaster","description":"Toaster \u2014 medium \u00b7 2 slice","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2277,"ops":109,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/29-toaster/doc.rc","json":"docs/iot-panels/29-toaster/doc.json"}
{"id":"iot-panels/30-wine-fridge","title":"30 wine fridge","description":"Wine Fridge \u2014 cellar \u00b7 12\u00b0C \u00b7 18 bottles","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2378,"ops":107,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/30-wine-fridge/doc.rc","json":"docs/iot-panels/30-wine-fridge/doc.json"}
{"id":"iot-panels/31-robot-vacuum","title":"31 robot vacuum","description":"Robot Vacuum \u2014 mapping \u00b7 5 passes","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2030,"ops":93,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/31-robot-vacuum/doc.rc","json":"docs/iot-panels/31-robot-vacuum/doc.json"}
{"id":"iot-panels/32-robot-mop","title":"32 robot mop","description":"Robot Mop \u2014 wet pass \u00b7 tank 60%","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1920,"ops":90,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/32-robot-mop/doc.rc","json":"docs/iot-panels/32-robot-mop/doc.json"}
{"id":"iot-panels/33-washing-machine","title":"33 washing machine","description":"Washing Machine \u2014 cottons 40\u00b0 \u00b7 spin","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1963,"ops":101,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/33-washing-machine/doc.rc","json":"docs/iot-panels/33-washing-machine/doc.json"}
{"id":"iot-panels/34-tumble-dryer","title":"34 tumble dryer","description":"Tumble Dryer \u2014 heat pump \u00b7 46 min","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2297,"ops":109,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/34-tumble-dryer/doc.rc","json":"docs/iot-panels/34-tumble-dryer/doc.json"}
{"id":"iot-panels/35-trash-compactor","title":"35 trash compactor","description":"Trash Compactor \u2014 4:1 \u00b7 ram down","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2162,"ops":96,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/35-trash-compactor/doc.rc","json":"docs/iot-panels/35-trash-compactor/doc.json"}
{"id":"iot-panels/36-smart-plug","title":"36 smart plug","description":"Smart Plug \u2014 relay \u00b7 metering","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2333,"ops":103,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/36-smart-plug/doc.rc","json":"docs/iot-panels/36-smart-plug/doc.json"}
{"id":"iot-panels/37-energy-monitor","title":"37 energy monitor","description":"Energy Monitor \u2014 whole home \u00b7 live","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1793,"ops":84,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/37-energy-monitor/doc.rc","json":"docs/iot-panels/37-energy-monitor/doc.json"}
{"id":"iot-panels/38-solar-inverter","title":"38 solar inverter","description":"Solar Inverter \u2014 string \u00b7 MPPT","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2415,"ops":108,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/38-solar-inverter/doc.rc","json":"docs/iot-panels/38-solar-inverter/doc.json"}
{"id":"iot-panels/39-home-battery","title":"39 home battery","description":"Home Battery \u2014 13.5 kWh \u00b7 cycling","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2314,"ops":103,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/39-home-battery/doc.rc","json":"docs/iot-panels/39-home-battery/doc.json"}
{"id":"iot-panels/40-ev-charger","title":"40 ev charger","description":"EV Charger \u2014 7.4 kW \u00b7 62%","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2572,"ops":115,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/40-ev-charger/doc.rc","json":"docs/iot-panels/40-ev-charger/doc.json"}
{"id":"iot-panels/41-sprinkler","title":"41 sprinkler","description":"Sprinkler Controller \u2014 6 zones \u00b7 zone 3 live","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2162,"ops":96,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/41-sprinkler/doc.rc","json":"docs/iot-panels/41-sprinkler/doc.json"}
{"id":"iot-panels/42-soil-moisture","title":"42 soil moisture","description":"Soil Moisture Sensor \u2014 VWC \u00b7 capacitive","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2098,"ops":93,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/42-soil-moisture/doc.rc","json":"docs/iot-panels/42-soil-moisture/doc.json"}
{"id":"iot-panels/43-hose-valve","title":"43 hose valve","description":"Hose Valve \u2014 flow \u00b7 9.2 L/min","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2243,"ops":105,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/43-hose-valve/doc.rc","json":"docs/iot-panels/43-hose-valve/doc.json"}
{"id":"iot-panels/44-pool-monitor","title":"44 pool monitor","description":"Pool Monitor \u2014 pH 7.4 \u00b7 27.4\u00b0C","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2424,"ops":113,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/44-pool-monitor/doc.rc","json":"docs/iot-panels/44-pool-monitor/doc.json"}
{"id":"iot-panels/45-rain-sensor","title":"45 rain sensor","description":"Rain Sensor \u2014 tipping bucket \u00b7 mm","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2421,"ops":106,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/45-rain-sensor/doc.rc","json":"docs/iot-panels/45-rain-sensor/doc.json"}
{"id":"iot-panels/46-smart-speaker","title":"46 smart speaker","description":"Smart Speaker \u2014 listening \u00b7 far-field","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2010,"ops":87,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/46-smart-speaker/doc.rc","json":"docs/iot-panels/46-smart-speaker/doc.json"}
{"id":"iot-panels/47-smart-display","title":"47 smart display","description":"Smart Display \u2014 ambient \u00b7 7in","source":"rcjson","authoring":["json","py"],"apis":["clip","drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1945,"ops":101,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/47-smart-display/doc.rc","json":"docs/iot-panels/47-smart-display/doc.json"}
{"id":"iot-panels/48-smart-tv","title":"48 smart tv","description":"Smart TV \u2014 4K HDR \u00b7 playing","source":"rcjson","authoring":["json","py"],"apis":["clip","drawCircle","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1871,"ops":86,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/48-smart-tv/doc.rc","json":"docs/iot-panels/48-smart-tv/doc.json"}
{"id":"iot-panels/49-streaming-box","title":"49 streaming box","description":"Streaming Box \u2014 buffering \u00b7 adaptive","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2853,"ops":128,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/49-streaming-box/doc.rc","json":"docs/iot-panels/49-streaming-box/doc.json"}
{"id":"iot-panels/50-projector","title":"50 projector","description":"Projector \u2014 lamp 78% \u00b7 1080p","source":"rcjson","authoring":["json","py"],"apis":["clip","drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2270,"ops":102,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/50-projector/doc.rc","json":"docs/iot-panels/50-projector/doc.json"}
{"id":"iot-panels/51-mesh-router","title":"51 mesh router","description":"Mesh Router \u2014 Wi-Fi 6E \u00b7 12 clients","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2082,"ops":99,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/51-mesh-router/doc.rc","json":"docs/iot-panels/51-mesh-router/doc.json"}
{"id":"iot-panels/52-range-extender","title":"52 range extender","description":"Range Extender \u2014 repeater \u00b7 5 GHz","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2184,"ops":97,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/52-range-extender/doc.rc","json":"docs/iot-panels/52-range-extender/doc.json"}
{"id":"iot-panels/53-smart-hub","title":"53 smart hub","description":"Smart Hub \u2014 Thread \u00b7 24 paired","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1790,"ops":84,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/53-smart-hub/doc.rc","json":"docs/iot-panels/53-smart-hub/doc.json"}
{"id":"iot-panels/54-network-switch","title":"54 network switch","description":"Network Switch \u2014 8-port gigabit \u00b7 PoE","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1909,"ops":86,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/54-network-switch/doc.rc","json":"docs/iot-panels/54-network-switch/doc.json"}
{"id":"iot-panels/55-doorbell-chime","title":"55 doorbell chime","description":"Doorbell Chime \u2014 two-tone \u00b7 indoor","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2012,"ops":90,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/55-doorbell-chime/doc.rc","json":"docs/iot-panels/55-doorbell-chime/doc.json"}
{"id":"iot-panels/56-smart-blinds","title":"56 smart blinds","description":"Smart Blinds \u2014 tilt 60\u00b0 \u00b7 lift 30%","source":"rcjson","authoring":["json","py"],"apis":["clip","drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2116,"ops":98,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/56-smart-blinds/doc.rc","json":"docs/iot-panels/56-smart-blinds/doc.json"}
{"id":"iot-panels/57-smart-curtains","title":"57 smart curtains","description":"Smart Curtains \u2014 track \u00b7 70% open","source":"rcjson","authoring":["json","py"],"apis":["clip","drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1692,"ops":82,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/57-smart-curtains/doc.rc","json":"docs/iot-panels/57-smart-curtains/doc.json"}
{"id":"iot-panels/58-garage-door","title":"58 garage door","description":"Garage Door \u2014 sectional \u00b7 opening","source":"rcjson","authoring":["json","py"],"apis":["clip","drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1886,"ops":89,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/58-garage-door/doc.rc","json":"docs/iot-panels/58-garage-door/doc.json"}
{"id":"iot-panels/59-window-opener","title":"59 window opener","description":"Window Opener \u2014 chain actuator \u00b7 40%","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2209,"ops":99,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/59-window-opener/doc.rc","json":"docs/iot-panels/59-window-opener/doc.json"}
{"id":"iot-panels/60-gate-opener","title":"60 gate opener","description":"Gate Opener \u2014 rack & pinion \u00b7 sliding","source":"rcjson","authoring":["json","py"],"apis":["clip","drawCircle","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2119,"ops":107,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/60-gate-opener/doc.rc","json":"docs/iot-panels/60-gate-opener/doc.json"}
{"id":"iot-panels/61-body-scale","title":"61 body scale","description":"Body Scale \u2014 bio-impedance \u00b7 settling","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2122,"ops":95,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/61-body-scale/doc.rc","json":"docs/iot-panels/61-body-scale/doc.json"}
{"id":"iot-panels/62-sleep-tracker","title":"62 sleep tracker","description":"Sleep Tracker \u2014 hypnogram \u00b7 6h 42m","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2111,"ops":100,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/62-sleep-tracker/doc.rc","json":"docs/iot-panels/62-sleep-tracker/doc.json"}
{"id":"iot-panels/63-smart-mattress","title":"63 smart mattress","description":"Smart Mattress \u2014 zones \u00b7 dual climate","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2066,"ops":98,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/63-smart-mattress/doc.rc","json":"docs/iot-panels/63-smart-mattress/doc.json"}
{"id":"iot-panels/64-air-quality","title":"64 air quality","description":"Air Quality Monitor \u2014 PM2.5 \u00b7 laser","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2050,"ops":92,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/64-air-quality/doc.rc","json":"docs/iot-panels/64-air-quality/doc.json"}
{"id":"iot-panels/65-smart-mirror","title":"65 smart mirror","description":"Smart Mirror \u2014 presence \u00b7 widgets","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1919,"ops":91,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/65-smart-mirror/doc.rc","json":"docs/iot-panels/65-smart-mirror/doc.json"}
{"id":"iot-panels/66-pet-feeder","title":"66 pet feeder","description":"Pet Feeder \u2014 auger \u00b7 1 portion","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2836,"ops":114,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/66-pet-feeder/doc.rc","json":"docs/iot-panels/66-pet-feeder/doc.json"}
{"id":"iot-panels/67-water-fountain","title":"67 water fountain","description":"Water Fountain \u2014 circulating \u00b7 filtered","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2335,"ops":104,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/67-water-fountain/doc.rc","json":"docs/iot-panels/67-water-fountain/doc.json"}
{"id":"iot-panels/68-pet-camera","title":"68 pet camera","description":"Pet Camera \u2014 1080p \u00b7 treat toss","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2394,"ops":110,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/68-pet-camera/doc.rc","json":"docs/iot-panels/68-pet-camera/doc.json"}
{"id":"iot-panels/69-litter-box","title":"69 litter box","description":"Litter Box \u2014 rake cycle \u00b7 drawer","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2167,"ops":98,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/69-litter-box/doc.rc","json":"docs/iot-panels/69-litter-box/doc.json"}
{"id":"iot-panels/70-pet-door","title":"70 pet door","description":"Pet Door \u2014 microchip \u00b7 unlocked","source":"rcjson","authoring":["json","py"],"apis":["clip","drawCircle","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2625,"ops":113,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/70-pet-door/doc.rc","json":"docs/iot-panels/70-pet-door/doc.json"}
{"id":"iot-panels/71-aroma-diffuser","title":"71 aroma diffuser","description":"Aroma Diffuser \u2014 ultrasonic \u00b7 4h","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawCircle","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2090,"ops":91,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/71-aroma-diffuser/doc.rc","json":"docs/iot-panels/71-aroma-diffuser/doc.json"}
{"id":"iot-panels/72-alarm-clock","title":"72 alarm clock","description":"Alarm Clock \u2014 sunrise \u00b7 alarm 07:00","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1980,"ops":90,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/72-alarm-clock/doc.rc","json":"docs/iot-panels/72-alarm-clock/doc.json"}
{"id":"iot-panels/73-weather-station","title":"73 weather station","description":"Weather Station \u2014 anemometer \u00b7 vane","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2675,"ops":119,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/73-weather-station/doc.rc","json":"docs/iot-panels/73-weather-station/doc.json"}
{"id":"iot-panels/74-smart-planter","title":"74 smart planter","description":"Smart Planter \u2014 self-watering \u00b7 grow light","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2824,"ops":122,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/74-smart-planter/doc.rc","json":"docs/iot-panels/74-smart-planter/doc.json"}
{"id":"iot-panels/75-aquarium","title":"75 aquarium","description":"Aquarium Controller \u2014 26.5\u00b0C \u00b7 day cycle","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2593,"ops":115,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/75-aquarium/doc.rc","json":"docs/iot-panels/75-aquarium/doc.json"}
{"id":"iot-panels/76-baby-monitor","title":"76 baby monitor","description":"Baby Monitor \u2014 night vision \u00b7 20.4\u00b0C","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawOval","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2389,"ops":105,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/76-baby-monitor/doc.rc","json":"docs/iot-panels/76-baby-monitor/doc.json"}
{"id":"iot-panels/77-mailbox-sensor","title":"77 mailbox sensor","description":"Mailbox Sensor \u2014 post detected \u00b7 flag up","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2301,"ops":103,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/77-mailbox-sensor/doc.rc","json":"docs/iot-panels/77-mailbox-sensor/doc.json"}
{"id":"iot-panels/78-smart-vent","title":"78 smart vent","description":"Smart Vent \u2014 zone 4 \u00b7 62% open","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2085,"ops":99,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/78-smart-vent/doc.rc","json":"docs/iot-panels/78-smart-vent/doc.json"}
{"id":"iot-panels/79-bird-feeder","title":"79 bird feeder","description":"Bird Feeder \u2014 camera \u00b7 species ID","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2670,"ops":116,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/79-bird-feeder/doc.rc","json":"docs/iot-panels/79-bird-feeder/doc.json"}
{"id":"iot-panels/80-smart-bin","title":"80 smart bin","description":"Smart Bin \u2014 proximity lid \u00b7 64% full","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["iot"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2681,"ops":111,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["emit.py","mkindex.py"],"rc":"docs/iot-panels/80-smart-bin/doc.rc","json":"docs/iot-panels/80-smart-bin/doc.json"}
{"id":"layout/a01-child-fixed","title":"a01 child fixed","description":"A01 fixed 120x80 child in a filled root","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":246,"ops":15,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/a01-child-fixed/doc.rc","json":"docs/layout/a01-child-fixed/doc.json"}
{"id":"layout/a02-child-fillmaxsize","title":"a02 child fillmaxsize","description":"A02 child fillMaxSize inside filled root","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":247,"ops":15,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/a02-child-fillmaxsize/doc.rc","json":"docs/layout/a02-child-fillmaxsize/doc.json"}
{"id":"layout/a03-child-fillmaxwidth","title":"a03 child fillmaxwidth","description":"A03 child fillMaxWidth, fixed height","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":243,"ops":15,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/a03-child-fillmaxwidth/doc.rc","json":"docs/layout/a03-child-fillmaxwidth/doc.json"}
{"id":"layout/a04-child-fillmaxheight","title":"a04 child fillmaxheight","description":"A04 child fillMaxHeight, fixed width","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":243,"ops":15,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/a04-child-fillmaxheight/doc.rc","json":"docs/layout/a04-child-fillmaxheight/doc.json"}
{"id":"layout/a05-fill-fraction","title":"a05 fill fraction","description":"A05 fractional fill: 0.5 width, 0.25 height","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":250,"ops":15,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/a05-fill-fraction/doc.rc","json":"docs/layout/a05-fill-fraction/doc.json"}
{"id":"layout/a06-size-modifier","title":"a06 size modifier","description":"A06 size modifier as a pair","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":234,"ops":15,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/a06-size-modifier/doc.rc","json":"docs/layout/a06-size-modifier/doc.json"}
{"id":"layout/a07-wrap-default","title":"a07 wrap default","description":"A07 no size modifier anywhere: everything wraps","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":236,"ops":13,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/a07-wrap-default/doc.rc","json":"docs/layout/a07-wrap-default/doc.json"}
{"id":"layout/a08-fill-in-wrap-parent","title":"a08 fill in wrap parent","description":"A08 fillMaxSize child inside a WRAP parent - no maximum to fill","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":252,"ops":13,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/a08-fill-in-wrap-parent/doc.rc","json":"docs/layout/a08-fill-in-wrap-parent/doc.json"}
{"id":"layout/a09-fixed-bigger-than-root","title":"a09 fixed bigger than root","description":"A09 child larger than the root","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":237,"ops":15,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/a09-fixed-bigger-than-root/doc.rc","json":"docs/layout/a09-fixed-bigger-than-root/doc.json"}
{"id":"layout/a10-root-fixed-size","title":"a10 root fixed size","description":"A10 root has a fixed size smaller than the document","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":258,"ops":15,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/a10-root-fixed-size/doc.rc","json":"docs/layout/a10-root-fixed-size/doc.json"}
{"id":"layout/a11-child-exceeds-fixed-parent","title":"a11 child exceeds fixed parent","description":"A11 child larger than a fixed-size parent that is NOT the root, so overflow is visible","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":372,"ops":22,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/a11-child-exceeds-fixed-parent/doc.rc","json":"docs/layout/a11-child-exceeds-fixed-parent/doc.json"}
{"id":"layout/b01-box-start-top","title":"b01 box start top","description":"B box alignment start/top","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":232,"ops":15,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/b01-box-start-top/doc.rc","json":"docs/layout/b01-box-start-top/doc.json"}
{"id":"layout/b02-box-start-center","title":"b02 box start center","description":"B box alignment start/center","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":235,"ops":15,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/b02-box-start-center/doc.rc","json":"docs/layout/b02-box-start-center/doc.json"}
{"id":"layout/b03-box-start-bottom","title":"b03 box start bottom","description":"B box alignment start/bottom","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":235,"ops":15,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/b03-box-start-bottom/doc.rc","json":"docs/layout/b03-box-start-bottom/doc.json"}
{"id":"layout/b04-box-center-top","title":"b04 box center top","description":"B box alignment center/top","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":233,"ops":15,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/b04-box-center-top/doc.rc","json":"docs/layout/b04-box-center-top/doc.json"}
{"id":"layout/b05-box-center-center","title":"b05 box center center","description":"B box alignment center/center","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":236,"ops":15,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/b05-box-center-center/doc.rc","json":"docs/layout/b05-box-center-center/doc.json"}
{"id":"layout/b06-box-center-bottom","title":"b06 box center bottom","description":"B box alignment center/bottom","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":236,"ops":15,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/b06-box-center-bottom/doc.rc","json":"docs/layout/b06-box-center-bottom/doc.json"}
{"id":"layout/b07-box-end-top","title":"b07 box end top","description":"B box alignment end/top","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":230,"ops":15,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/b07-box-end-top/doc.rc","json":"docs/layout/b07-box-end-top/doc.json"}
{"id":"layout/b08-box-end-center","title":"b08 box end center","description":"B box alignment end/center","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":233,"ops":15,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/b08-box-end-center/doc.rc","json":"docs/layout/b08-box-end-center/doc.json"}
{"id":"layout/b09-box-end-bottom","title":"b09 box end bottom","description":"B box alignment end/bottom","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":233,"ops":15,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/b09-box-end-bottom/doc.rc","json":"docs/layout/b09-box-end-bottom/doc.json"}
{"id":"layout/b10-box-two-children","title":"b10 box two children","description":"B10 two children of different size, centred - they stack","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":336,"ops":20,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/b10-box-two-children/doc.rc","json":"docs/layout/b10-box-two-children/doc.json"}
{"id":"layout/b11-box-fixed-parent","title":"b11 box fixed parent","description":"B11 alignment inside a fixed-size box, not the root","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":337,"ops":22,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/b11-box-fixed-parent/doc.rc","json":"docs/layout/b11-box-fixed-parent/doc.json"}
{"id":"layout/c01-row-arrange-start","title":"c01 row arrange start","description":"C row horizontalArrangement=start","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":390,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/c01-row-arrange-start/doc.rc","json":"docs/layout/c01-row-arrange-start/doc.json"}
{"id":"layout/c02-row-arrange-center","title":"c02 row arrange center","description":"C row horizontalArrangement=center","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":391,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/c02-row-arrange-center/doc.rc","json":"docs/layout/c02-row-arrange-center/doc.json"}
{"id":"layout/c03-row-arrange-end","title":"c03 row arrange end","description":"C row horizontalArrangement=end","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":388,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/c03-row-arrange-end/doc.rc","json":"docs/layout/c03-row-arrange-end/doc.json"}
{"id":"layout/c04-row-arrange-spacebetween","title":"c04 row arrange spacebetween","description":"C row horizontalArrangement=spaceBetween","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":397,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/c04-row-arrange-spacebetween/doc.rc","json":"docs/layout/c04-row-arrange-spacebetween/doc.json"}
{"id":"layout/c05-row-arrange-spaceevenly","title":"c05 row arrange spaceevenly","description":"C row horizontalArrangement=spaceEvenly","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":396,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/c05-row-arrange-spaceevenly/doc.rc","json":"docs/layout/c05-row-arrange-spaceevenly/doc.json"}
{"id":"layout/c06-row-arrange-spacearound","title":"c06 row arrange spacearound","description":"C row horizontalArrangement=spaceAround","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":396,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/c06-row-arrange-spacearound/doc.rc","json":"docs/layout/c06-row-arrange-spacearound/doc.json"}
{"id":"layout/c07-row-valign-top","title":"c07 row valign top","description":"C row verticalAlignment=top","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":384,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/c07-row-valign-top/doc.rc","json":"docs/layout/c07-row-valign-top/doc.json"}
{"id":"layout/c08-row-valign-center","title":"c08 row valign center","description":"C row verticalAlignment=center","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":387,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/c08-row-valign-center/doc.rc","json":"docs/layout/c08-row-valign-center/doc.json"}
{"id":"layout/c09-row-valign-bottom","title":"c09 row valign bottom","description":"C row verticalAlignment=bottom","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":387,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/c09-row-valign-bottom/doc.rc","json":"docs/layout/c09-row-valign-bottom/doc.json"}
{"id":"layout/c10-row-spacedby","title":"c10 row spacedby","description":"C10 row with spacedBy 20","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":381,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":["gen.py"],"rc":"docs/layout/c10-row-spacedby/doc.rc","json":"docs/layout/c10-row-spacedby/doc.json"}
{"id":"layout/c11-row-wrap-width","title":"c11 row wrap width","description":"C11 row that wraps its width - arrangement has no slack to distribute","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":408,"ops":23,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/c11-row-wrap-width/doc.rc","json":"docs/layout/c11-row-wrap-width/doc.json"}
{"id":"layout/c12-row-single-child-spacebetween","title":"c12 row single child spacebetween","description":"C12 spaceBetween with one child - degenerate case","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":260,"ops":15,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/c12-row-single-child-spacebetween/doc.rc","json":"docs/layout/c12-row-single-child-spacebetween/doc.json"}
{"id":"layout/c13-row-fixed-height-children-fill","title":"c13 row fixed height children fill","description":"C13 children filling the cross axis inside a row","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":332,"ops":20,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/c13-row-fixed-height-children-fill/doc.rc","json":"docs/layout/c13-row-fixed-height-children-fill/doc.json"}
{"id":"layout/c1a-row-single-spacearound","title":"c1a row single spacearound","description":"C single child with spaceAround","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":242,"ops":15,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/c1a-row-single-spacearound/doc.rc","json":"docs/layout/c1a-row-single-spacearound/doc.json"}
{"id":"layout/c1e-row-single-spaceevenly","title":"c1e row single spaceevenly","description":"C single child with spaceEvenly","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":242,"ops":15,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/c1e-row-single-spaceevenly/doc.rc","json":"docs/layout/c1e-row-single-spaceevenly/doc.json"}
{"id":"layout/d01-col-arrange-top","title":"d01 col arrange top","description":"D column verticalArrangement=top","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":389,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/d01-col-arrange-top/doc.rc","json":"docs/layout/d01-col-arrange-top/doc.json"}
{"id":"layout/d02-col-arrange-center","title":"d02 col arrange center","description":"D column verticalArrangement=center","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":392,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/d02-col-arrange-center/doc.rc","json":"docs/layout/d02-col-arrange-center/doc.json"}
{"id":"layout/d03-col-arrange-bottom","title":"d03 col arrange bottom","description":"D column verticalArrangement=bottom","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":392,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/d03-col-arrange-bottom/doc.rc","json":"docs/layout/d03-col-arrange-bottom/doc.json"}
{"id":"layout/d04-col-arrange-spacebetween","title":"d04 col arrange spacebetween","description":"D column verticalArrangement=spaceBetween","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":398,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/d04-col-arrange-spacebetween/doc.rc","json":"docs/layout/d04-col-arrange-spacebetween/doc.json"}
{"id":"layout/d05-col-arrange-spaceevenly","title":"d05 col arrange spaceevenly","description":"D column verticalArrangement=spaceEvenly","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":397,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/d05-col-arrange-spaceevenly/doc.rc","json":"docs/layout/d05-col-arrange-spaceevenly/doc.json"}
{"id":"layout/d06-col-arrange-spacearound","title":"d06 col arrange spacearound","description":"D column verticalArrangement=spaceAround","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":397,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/d06-col-arrange-spacearound/doc.rc","json":"docs/layout/d06-col-arrange-spacearound/doc.json"}
{"id":"layout/d07-col-halign-start","title":"d07 col halign start","description":"D column horizontalAlignment=start","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":391,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/d07-col-halign-start/doc.rc","json":"docs/layout/d07-col-halign-start/doc.json"}
{"id":"layout/d08-col-halign-center","title":"d08 col halign center","description":"D column horizontalAlignment=center","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":392,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/d08-col-halign-center/doc.rc","json":"docs/layout/d08-col-halign-center/doc.json"}
{"id":"layout/d09-col-halign-end","title":"d09 col halign end","description":"D column horizontalAlignment=end","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":389,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/d09-col-halign-end/doc.rc","json":"docs/layout/d09-col-halign-end/doc.json"}
{"id":"layout/d10-col-spacedby","title":"d10 col spacedby","description":"D10 column with spacedBy 20","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":384,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":["gen.py"],"rc":"docs/layout/d10-col-spacedby/doc.rc","json":"docs/layout/d10-col-spacedby/doc.json"}
{"id":"layout/d11-col-wrap-height","title":"d11 col wrap height","description":"D11 column that wraps its height - arrangement has no slack","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":398,"ops":23,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/d11-col-wrap-height/doc.rc","json":"docs/layout/d11-col-wrap-height/doc.json"}
{"id":"layout/d12-col-single-child-spacebetween","title":"d12 col single child spacebetween","description":"D12 spaceBetween with one child - degenerate case","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":260,"ops":15,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/d12-col-single-child-spacebetween/doc.rc","json":"docs/layout/d12-col-single-child-spacebetween/doc.json"}
{"id":"layout/d13-col-children-fill-width","title":"d13 col children fill width","description":"D13 children filling the cross axis inside a column","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":335,"ops":20,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/d13-col-children-fill-width/doc.rc","json":"docs/layout/d13-col-children-fill-width/doc.json"}
{"id":"layout/e01-row-one-weight","title":"e01 row one weight","description":"E01 single weighted child takes the whole row","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":247,"ops":14,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/e01-row-one-weight/doc.rc","json":"docs/layout/e01-row-one-weight/doc.json"}
{"id":"layout/e02-row-two-equal","title":"e02 row two equal","description":"E02 two children, weight 1 and 1","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":298,"ops":18,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/e02-row-two-equal/doc.rc","json":"docs/layout/e02-row-two-equal/doc.json"}
{"id":"layout/e03-row-two-unequal","title":"e03 row two unequal","description":"E03 two children, weight 1 and 2","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":298,"ops":18,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/e03-row-two-unequal/doc.rc","json":"docs/layout/e03-row-two-unequal/doc.json"}
{"id":"layout/e04-row-weight-beside-fixed","title":"e04 row weight beside fixed","description":"E04 fixed 100 beside weight 1 - the weighted child gets what is left","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":343,"ops":19,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/e04-row-weight-beside-fixed/doc.rc","json":"docs/layout/e04-row-weight-beside-fixed/doc.json"}
{"id":"layout/e05-row-padding-on-row","title":"e05 row padding on row","description":"E05 weights inside a padded row - slack is the padded width","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":342,"ops":19,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/e05-row-padding-on-row/doc.rc","json":"docs/layout/e05-row-padding-on-row/doc.json"}
{"id":"layout/e06-row-padding-on-weighted-child","title":"e06 row padding on weighted child","description":"E06 padding on the weighted child itself","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":323,"ops":19,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/e06-row-padding-on-weighted-child/doc.rc","json":"docs/layout/e06-row-padding-on-weighted-child/doc.json"}
{"id":"layout/e07-row-weight-in-wrap-row","title":"e07 row weight in wrap row","description":"E07 weight inside a row that wraps its width - there is no slack to share","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":330,"ops":17,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/e07-row-weight-in-wrap-row/doc.rc","json":"docs/layout/e07-row-weight-in-wrap-row/doc.json"}
{"id":"layout/e08-col-vertical-weight","title":"e08 col vertical weight","description":"E08 verticalWeight in a column","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":296,"ops":18,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/e08-col-vertical-weight/doc.rc","json":"docs/layout/e08-col-vertical-weight/doc.json"}
{"id":"layout/e09-col-horizontal-weight-wrong-axis","title":"e09 col horizontal weight wrong axis","description":"E09 horizontalWeight used in a column - weight on the cross axis","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":348,"ops":20,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/e09-col-horizontal-weight-wrong-axis/doc.rc","json":"docs/layout/e09-col-horizontal-weight-wrong-axis/doc.json"}
{"id":"layout/e10-row-three-weights","title":"e10 row three weights","description":"E10 three children, weights 1, 2, 3","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":365,"ops":22,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/e10-row-three-weights/doc.rc","json":"docs/layout/e10-row-three-weights/doc.json"}
{"id":"layout/e11-row-weight-cross-fill","title":"e11 row weight cross fill","description":"E11 weighted child also filling the cross axis","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":321,"ops":19,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/e11-row-weight-cross-fill/doc.rc","json":"docs/layout/e11-row-weight-cross-fill/doc.json"}
{"id":"layout/e12-row-fractional-weights","title":"e12 row fractional weights","description":"E12 fractional weights 0.5 and 1.5","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":300,"ops":18,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/e12-row-fractional-weights/doc.rc","json":"docs/layout/e12-row-fractional-weights/doc.json"}
{"id":"layout/f01-padding-uniform","title":"f01 padding uniform","description":"F01 uniform padding on the root","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":255,"ops":16,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/f01-padding-uniform/doc.rc","json":"docs/layout/f01-padding-uniform/doc.json"}
{"id":"layout/f02-padding-per-side","title":"f02 padding per side","description":"F02 per-side padding object","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":251,"ops":16,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/f02-padding-per-side/doc.rc","json":"docs/layout/f02-padding-per-side/doc.json"}
{"id":"layout/f03-padding-pair","title":"f03 padding pair","description":"F03 padding as [horizontal, vertical]","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":261,"ops":16,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":["gen.py"],"rc":"docs/layout/f03-padding-pair/doc.rc","json":"docs/layout/f03-padding-pair/doc.json"}
{"id":"layout/f04-padding-quad","title":"f04 padding quad","description":"F04 padding as [left, top, right, bottom]","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":265,"ops":16,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/f04-padding-quad/doc.rc","json":"docs/layout/f04-padding-quad/doc.json"}
{"id":"layout/f05-padding-on-child","title":"f05 padding on child","description":"F05 padding on the child, not the parent","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":343,"ops":23,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/f05-padding-on-child/doc.rc","json":"docs/layout/f05-padding-on-child/doc.json"}
{"id":"layout/f06-padding-nested","title":"f06 padding nested","description":"F06 padding at two levels","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":345,"ops":24,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/f06-padding-nested/doc.rc","json":"docs/layout/f06-padding-nested/doc.json"}
{"id":"layout/f07-padding-then-fill","title":"f07 padding then fill","description":"F07 does a filling child fill inside or outside the parent padding?","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":291,"ops":16,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/f07-padding-then-fill/doc.rc","json":"docs/layout/f07-padding-then-fill/doc.json"}
{"id":"layout/f08-padding-exceeds-space","title":"f08 padding exceeds space","description":"F08 padding larger than the box it is on","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":343,"ops":23,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/f08-padding-exceeds-space/doc.rc","json":"docs/layout/f08-padding-exceeds-space/doc.json"}
{"id":"layout/f09-padding-row-arrangement","title":"f09 padding row arrangement","description":"F09 padding on a row changes the slack the arrangement distributes","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":367,"ops":21,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/f09-padding-row-arrangement/doc.rc","json":"docs/layout/f09-padding-row-arrangement/doc.json"}
{"id":"layout/f10-padding-asymmetric-center","title":"f10 padding asymmetric center","description":"F10 centring inside an asymmetrically padded box","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":272,"ops":16,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/f10-padding-asymmetric-center/doc.rc","json":"docs/layout/f10-padding-asymmetric-center/doc.json"}
{"id":"layout/f11-padding-before-size","title":"f11 padding before size","description":"F11 padding declared BEFORE width - Compose: padding outside, total 260","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":374,"ops":23,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/f11-padding-before-size/doc.rc","json":"docs/layout/f11-padding-before-size/doc.json"}
{"id":"layout/g01-widthin-min-forces-growth","title":"g01 widthin min forces growth","description":"G01 widthIn min larger than the requested width","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":263,"ops":16,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/g01-widthin-min-forces-growth/doc.rc","json":"docs/layout/g01-widthin-min-forces-growth/doc.json"}
{"id":"layout/g02-widthin-max-caps","title":"g02 widthin max caps","description":"G02 widthIn max smaller than the requested width","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":264,"ops":16,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/g02-widthin-max-caps/doc.rc","json":"docs/layout/g02-widthin-max-caps/doc.json"}
{"id":"layout/g03-widthin-within-range","title":"g03 widthin within range","description":"G03 requested width already inside the range","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":260,"ops":16,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/g03-widthin-within-range/doc.rc","json":"docs/layout/g03-widthin-within-range/doc.json"}
{"id":"layout/g04-heightin-min-and-max","title":"g04 heightin min and max","description":"G04 heightIn clamping a requested height","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":256,"ops":16,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/g04-heightin-min-and-max/doc.rc","json":"docs/layout/g04-heightin-min-and-max/doc.json"}
{"id":"layout/g05-widthin-on-fill","title":"g05 widthin on fill","description":"G05 widthIn max applied to a filling child","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":258,"ops":16,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/g05-widthin-on-fill/doc.rc","json":"docs/layout/g05-widthin-on-fill/doc.json"}
{"id":"layout/g06-required-widthin","title":"g06 required widthin","description":"G06 requiredWidthIn - required constraints ignore the incoming ones","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":284,"ops":0,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":["gen.py"],"rc":"docs/layout/g06-required-widthin/doc.rc","json":"docs/layout/g06-required-widthin/doc.json"}
{"id":"layout/g07-required-heightin","title":"g07 required heightin","description":"Layout check: requiredHeightIn, a blue block held to a height range in the corner of a dark frame. #layout #validation","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["layout","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":237,"ops":0,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":["gen.py"],"rc":"docs/layout/g07-required-heightin/doc.rc","json":"docs/layout/g07-required-heightin/doc.json"}
{"id":"layout/g08-widthin-wrap-parent","title":"g08 widthin wrap parent","description":"G08 widthIn min inside a wrapping parent","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":229,"ops":13,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/g08-widthin-wrap-parent/doc.rc","json":"docs/layout/g08-widthin-wrap-parent/doc.json"}
{"id":"layout/g09-dimension-constraints","title":"g09 dimension constraints","description":"G09 dimensionConstraints modifier","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":250,"ops":0,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":["gen.py"],"rc":"docs/layout/g09-dimension-constraints/doc.rc","json":"docs/layout/g09-dimension-constraints/doc.json"}
{"id":"layout/g10-widthin-exceeds-parent","title":"g10 widthin exceeds parent","description":"G10 widthIn min larger than the parent - does the parent still bound it?","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":288,"ops":16,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/g10-widthin-exceeds-parent/doc.rc","json":"docs/layout/g10-widthin-exceeds-parent/doc.json"}
{"id":"layout/h01-row-in-column","title":"h01 row in column","description":"H01 a row nested inside a column","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":463,"ops":31,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/h01-row-in-column/doc.rc","json":"docs/layout/h01-row-in-column/doc.json"}
{"id":"layout/h02-column-in-row","title":"h02 column in row","description":"H02 a column nested inside a row","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":463,"ops":31,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/h02-column-in-row/doc.rc","json":"docs/layout/h02-column-in-row/doc.json"}
{"id":"layout/h03-box-in-row-aligned","title":"h03 box in row aligned","description":"H03 a box inside a row, aligned within its own bounds","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":416,"ops":27,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/h03-box-in-row-aligned/doc.rc","json":"docs/layout/h03-box-in-row-aligned/doc.json"}
{"id":"layout/h04-three-levels","title":"h04 three levels","description":"H04 three levels of nesting, each inset","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":404,"ops":29,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/h04-three-levels/doc.rc","json":"docs/layout/h04-three-levels/doc.json"}
{"id":"layout/h05-alignment-through-nesting","title":"h05 alignment through nesting","description":"H05 outer centres, inner pushes to the end - alignment does not inherit","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":357,"ops":22,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/h05-alignment-through-nesting/doc.rc","json":"docs/layout/h05-alignment-through-nesting/doc.json"}
{"id":"layout/h06-nested-fills","title":"h06 nested fills","description":"H06 fill inside fill inside a fixed box","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":404,"ops":29,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/h06-nested-fills/doc.rc","json":"docs/layout/h06-nested-fills/doc.json"}
{"id":"layout/h07-nested-weights","title":"h07 nested weights","description":"H07 a weighted row inside a weighted column","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":447,"ops":28,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/h07-nested-weights/doc.rc","json":"docs/layout/h07-nested-weights/doc.json"}
{"id":"layout/h08-nested-padding-alignment","title":"h08 nested padding alignment","description":"H08 padding at two levels with centring at both","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":367,"ops":24,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/h08-nested-padding-alignment/doc.rc","json":"docs/layout/h08-nested-padding-alignment/doc.json"}
{"id":"layout/h09-wrap-inside-fill","title":"h09 wrap inside fill","description":"H09 a wrapping box inside a filling one","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":307,"ops":20,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/h09-wrap-inside-fill/doc.rc","json":"docs/layout/h09-wrap-inside-fill/doc.json"}
{"id":"layout/h10-row-of-columns","title":"h10 row of columns","description":"H10 a row of three columns, each with its own arrangement","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":855,"ops":58,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/h10-row-of-columns/doc.rc","json":"docs/layout/h10-row-of-columns/doc.json"}
{"id":"layout/i01-row-children-overflow","title":"i01 row children overflow","description":"I01 row whose children total more than its width","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":405,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/i01-row-children-overflow/doc.rc","json":"docs/layout/i01-row-children-overflow/doc.json"}
{"id":"layout/i02-column-children-overflow","title":"i02 column children overflow","description":"I02 column whose children total more than its height","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":409,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/i02-column-children-overflow/doc.rc","json":"docs/layout/i02-column-children-overflow/doc.json"}
{"id":"layout/i03-nested-overflow","title":"i03 nested overflow","description":"I03 a grandchild larger than its grandparent","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":330,"ops":22,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/i03-nested-overflow/doc.rc","json":"docs/layout/i03-nested-overflow/doc.json"}
{"id":"layout/i04-clip-oversized-child","title":"i04 clip oversized child","description":"I04 clip on a parent holding an oversized child","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":334,"ops":23,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":["gen.py"],"rc":"docs/layout/i04-clip-oversized-child/doc.rc","json":"docs/layout/i04-clip-oversized-child/doc.json"}
{"id":"layout/i05-clip-with-padding","title":"i05 clip with padding","description":"I05 clip combined with padding","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":334,"ops":24,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":["gen.py"],"rc":"docs/layout/i05-clip-with-padding/doc.rc","json":"docs/layout/i05-clip-with-padding/doc.json"}
{"id":"layout/i06-row-overflow-spacebetween","title":"i06 row overflow spacebetween","description":"I06 overflowing row with spaceBetween - no slack, possibly negative","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":424,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/i06-row-overflow-spacebetween/doc.rc","json":"docs/layout/i06-row-overflow-spacebetween/doc.json"}
{"id":"layout/j01-spacedby-with-center","title":"j01 spacedby with center","description":"J01 spacedBy combined with a centring arrangement","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":333,"ops":20,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":["gen.py"],"rc":"docs/layout/j01-spacedby-with-center/doc.rc","json":"docs/layout/j01-spacedby-with-center/doc.json"}
{"id":"layout/j02-spacedby-column","title":"j02 spacedby column","description":"J02 spacedBy on a column","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":381,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":["gen.py"],"rc":"docs/layout/j02-spacedby-column/doc.rc","json":"docs/layout/j02-spacedby-column/doc.json"}
{"id":"layout/j03-offset","title":"j03 offset","description":"J03 offset modifier on a child","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":246,"ops":16,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/j03-offset/doc.rc","json":"docs/layout/j03-offset/doc.json"}
{"id":"layout/j04-offset-negative","title":"j04 offset negative","description":"J04 negative offset pushing a child out of its parent","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":269,"ops":16,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/j04-offset-negative/doc.rc","json":"docs/layout/j04-offset-negative/doc.json"}
{"id":"layout/j05-visibility-gone","title":"j05 visibility gone","description":"J05 a GONE child in a row - does it still take space?","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":415,"ops":26,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/j05-visibility-gone/doc.rc","json":"docs/layout/j05-visibility-gone/doc.json"}
{"id":"layout/j06-visibility-invisible","title":"j06 visibility invisible","description":"J06 an INVISIBLE child in a row - space should be kept","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":416,"ops":26,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/j06-visibility-invisible/doc.rc","json":"docs/layout/j06-visibility-invisible/doc.json"}
{"id":"layout/j07-zindex","title":"j07 zindex","description":"J07 zIndex should reorder painting, not layout","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":335,"ops":21,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":["gen.py"],"rc":"docs/layout/j07-zindex/doc.rc","json":"docs/layout/j07-zindex/doc.json"}
{"id":"layout/j08-spacedby-exceeds","title":"j08 spacedby exceeds","description":"J08 spacedBy larger than the space left over","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":328,"ops":20,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":["gen.py"],"rc":"docs/layout/j08-spacedby-exceeds/doc.rc","json":"docs/layout/j08-spacedby-exceeds/doc.json"}
{"id":"layout/j09-visibility-control","title":"j09 visibility control","description":"J09 control: same row with no visibility modifier","source":"rcjson","authoring":["json","py"],"apis":["layout"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":406,"ops":25,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/j09-visibility-control/doc.rc","json":"docs/layout/j09-visibility-control/doc.json"}
{"id":"layout/k01-text-wrap","title":"k01 text wrap","description":"K01 text sizing itself - pure font metrics, expected to differ","source":"rcjson","authoring":["json","py"],"apis":["layout","text"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":286,"ops":16,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":["gen.py"],"rc":"docs/layout/k01-text-wrap/doc.rc","json":"docs/layout/k01-text-wrap/doc.json"}
{"id":"layout/k02-text-in-fixed-box","title":"k02 text in fixed box","description":"K02 text inside a fixed 200-wide box - the BOX must be 200 everywhere","source":"rcjson","authoring":["json","py"],"apis":["layout","text"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":397,"ops":23,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":["gen.py"],"rc":"docs/layout/k02-text-in-fixed-box/doc.rc","json":"docs/layout/k02-text-in-fixed-box/doc.json"}
{"id":"layout/k03-text-maxlines-1","title":"k03 text maxlines 1","description":"K03 maxLines 1 in a narrow box - height should be one line","source":"rcjson","authoring":["json","py"],"apis":["layout","text"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":382,"ops":22,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":["gen.py"],"rc":"docs/layout/k03-text-maxlines-1/doc.rc","json":"docs/layout/k03-text-maxlines-1/doc.json"}
{"id":"layout/k04-text-maxlines-3","title":"k04 text maxlines 3","description":"K04 the same text with maxLines 3 - height should be taller than K03","source":"rcjson","authoring":["json","py"],"apis":["layout","text"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":392,"ops":22,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":["gen.py"],"rc":"docs/layout/k04-text-maxlines-3/doc.rc","json":"docs/layout/k04-text-maxlines-3/doc.json"}
{"id":"layout/k05-text-weight-in-row","title":"k05 text weight in row","description":"K05 text with weight beside a fixed sibling - the weighted BOX is pure logic","source":"rcjson","authoring":["json","py"],"apis":["layout","text"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":384,"ops":22,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":["gen.py"],"rc":"docs/layout/k05-text-weight-in-row/doc.rc","json":"docs/layout/k05-text-weight-in-row/doc.json"}
{"id":"layout/k06-text-padding","title":"k06 text padding","description":"K06 padding around text inside a fixed box","source":"rcjson","authoring":["json","py"],"apis":["layout","text"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":358,"ops":24,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":["gen.py"],"rc":"docs/layout/k06-text-padding/doc.rc","json":"docs/layout/k06-text-padding/doc.json"}
{"id":"layout/k07-text-fontsize","title":"k07 text fontsize","description":"K07 two font sizes stacked - relative heights should track the sizes","source":"rcjson","authoring":["json","py"],"apis":["layout","text"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":376,"ops":22,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":["gen.py"],"rc":"docs/layout/k07-text-fontsize/doc.rc","json":"docs/layout/k07-text-fontsize/doc.json"}
{"id":"layout/k08-text-fill-width","title":"k08 text fill width","description":"K08 text filling the width - the box is logic, the wrapping is metrics","source":"rcjson","authoring":["json","py"],"apis":["layout","text"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":434,"ops":23,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":["gen.py"],"rc":"docs/layout/k08-text-fill-width/doc.rc","json":"docs/layout/k08-text-fill-width/doc.json"}
{"id":"layout/k09-text-in-collapsible-column","title":"k09 text in collapsible column","description":"K09 text inside a CollapsibleColumnLayout, as foo.rc does","source":"rcjson","authoring":["json","py"],"apis":["layout","text"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":458,"ops":30,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":["gen.py"],"rc":"docs/layout/k09-text-in-collapsible-column/doc.rc","json":"docs/layout/k09-text-in-collapsible-column/doc.json"}
{"id":"layout/l01-flow-no-spacing","title":"l01 flow no spacing","description":"L01 flow, four children that exactly fit one row with no spacing","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":502,"ops":0,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["gen.py"],"rc":"docs/layout/l01-flow-no-spacing/doc.rc","json":"docs/layout/l01-flow-no-spacing/doc.json"}
{"id":"layout/l02-flow-spacedby-wraps","title":"l02 flow spacedby wraps","description":"L02 same flow with spacedBy 30 - the spacing alone must force a wrap","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":506,"ops":0,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":["gen.py"],"rc":"docs/layout/l02-flow-spacedby-wraps/doc.rc","json":"docs/layout/l02-flow-spacedby-wraps/doc.json"}
{"id":"layout/l03-flow-spacedby-large","title":"l03 flow spacedby large","description":"L03 flow spacing larger than the children, so each row holds fewer","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":504,"ops":0,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":["gen.py"],"rc":"docs/layout/l03-flow-spacedby-large/doc.rc","json":"docs/layout/l03-flow-spacedby-large/doc.json"}
{"id":"python-samples/anim-bounce","title":"anim bounce","description":"Circle bouncing up and down with a sin wave against a dark background","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","drawOval","drawRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":633,"ops":35,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/anim-bounce/doc.rc","json":"docs/python-samples/anim-bounce/doc.json"}
{"id":"python-samples/anim-breathing","title":"anim breathing","description":"Concentric circles that slowly expand and contract \u2014 breathing effect","source":"origami","authoring":["json"],"apis":["drawCircle","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":769,"ops":41,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/anim-breathing/doc.rc","json":"docs/python-samples/anim-breathing/doc.json"}
{"id":"python-samples/anim-clock-simple","title":"anim clock simple","description":"Simple clock face with second hand rotating based on time.seconds","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":880,"ops":53,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/anim-clock-simple/doc.rc","json":"docs/python-samples/anim-clock-simple/doc.json"}
{"id":"python-samples/anim-loading-bar","title":"anim loading bar","description":"Horizontal loading bar that fills left-to-right then resets, using fract","source":"origami","authoring":["json"],"apis":["drawCircle","drawRect","drawRoundRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1116,"ops":58,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/anim-loading-bar/doc.rc","json":"docs/python-samples/anim-loading-bar/doc.json"}
{"id":"python-samples/anim-metronome","title":"anim metronome","description":"Metronome arm swinging side to side, with pivot at bottom","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1044,"ops":62,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/anim-metronome/doc.rc","json":"docs/python-samples/anim-metronome/doc.json"}
{"id":"python-samples/anim-orbit","title":"anim orbit","description":"Small circle orbiting around center using sin/cos","source":"origami","authoring":["json"],"apis":["drawCircle","drawRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":809,"ops":44,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/anim-orbit/doc.rc","json":"docs/python-samples/anim-orbit/doc.json"}
{"id":"python-samples/anim-pendulum","title":"anim pendulum","description":"Line swinging like a pendulum from top-center using sin for angle","source":"origami","authoring":["json"],"apis":["drawArc","drawCircle","drawLine","drawRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":713,"ops":37,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/anim-pendulum/doc.rc","json":"docs/python-samples/anim-pendulum/doc.json"}
{"id":"python-samples/anim-pulse","title":"anim pulse","description":"Circle pulsing in size using sin modulation","source":"origami","authoring":["json"],"apis":["drawCircle","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":580,"ops":31,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/anim-pulse/doc.rc","json":"docs/python-samples/anim-pulse/doc.json"}
{"id":"python-samples/anim-radar","title":"anim radar","description":"Radar sweep: circle outline + rotating line from center using save/rotate/restore","source":"origami","authoring":["json"],"apis":["drawArc","drawCircle","drawLine","drawRect","expressions","layout","paint","transforms"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1114,"ops":61,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/anim-radar/doc.rc","json":"docs/python-samples/anim-radar/doc.json"}
{"id":"python-samples/anim-rotate-square","title":"anim rotate square","description":"Square rotating around canvas center at constant speed","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","paint","transforms"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":631,"ops":39,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/anim-rotate-square/doc.rc","json":"docs/python-samples/anim-rotate-square/doc.json"}
{"id":"python-samples/anim-spinner","title":"anim spinner","description":"8 dots arranged in circle, with rotating arc sweep to simulate spinner","source":"origami","authoring":["json"],"apis":["drawArc","drawCircle","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":742,"ops":40,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/anim-spinner/doc.rc","json":"docs/python-samples/anim-spinner/doc.json"}
{"id":"python-samples/anim-wave","title":"anim wave","description":"Animated sine wave drawn with a loop of small line segments across screen","source":"origami","authoring":["json"],"apis":["drawLine","drawRect","expressions","layout","loop","paint"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":864,"ops":40,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/anim-wave/doc.rc","json":"docs/python-samples/anim-wave/doc.json"}
{"id":"python-samples/canvas-arcs","title":"canvas arcs","description":"Fan of arc segments in rainbow colors","source":"origami","authoring":["json"],"apis":["drawArc","layout","paint"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":548,"ops":30,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/canvas-arcs/doc.rc","json":"docs/python-samples/canvas-arcs/doc.json"}
{"id":"python-samples/canvas-bar-chart","title":"canvas bar chart","description":"Simple 5-bar chart with labels","source":"origami","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":909,"ops":51,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/canvas-bar-chart/doc.rc","json":"docs/python-samples/canvas-bar-chart/doc.json"}
{"id":"python-samples/canvas-concentric","title":"canvas concentric","description":"Concentric circles with alternating fill colors","source":"origami","authoring":["json"],"apis":["drawCircle","layout","paint"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":404,"ops":28,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/canvas-concentric/doc.rc","json":"docs/python-samples/canvas-concentric/doc.json"}
{"id":"python-samples/canvas-donut","title":"canvas donut","description":"Donut/ring chart using overlapping arcs with stroke style","source":"origami","authoring":["json"],"apis":["drawArc","drawCircle","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":884,"ops":46,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/canvas-donut/doc.rc","json":"docs/python-samples/canvas-donut/doc.json"}
{"id":"python-samples/canvas-gauge","title":"canvas gauge","description":"Semi-circular gauge with needle and scale marks","source":"origami","authoring":["json"],"apis":["drawArc","drawCircle","drawLine","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1280,"ops":72,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/canvas-gauge/doc.rc","json":"docs/python-samples/canvas-gauge/doc.json"}
{"id":"python-samples/canvas-gradient-bars","title":"canvas gradient bars","description":"Horizontal bars with progressively shifting colors creating a gradient effect","source":"origami","authoring":["json"],"apis":["drawRect","layout","paint"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":680,"ops":42,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/canvas-gradient-bars/doc.rc","json":"docs/python-samples/canvas-gradient-bars/doc.json"}
{"id":"python-samples/canvas-grid","title":"canvas grid","description":"Grid pattern using loops for horizontal and vertical lines","source":"origami","authoring":["json"],"apis":["drawLine","drawRect","expressions","layout","loop","paint"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":386,"ops":28,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/canvas-grid/doc.rc","json":"docs/python-samples/canvas-grid/doc.json"}
{"id":"python-samples/canvas-line-chart","title":"canvas line chart","description":"Line chart with 6 data points connected by lines, dots at each point","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1375,"ops":79,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/canvas-line-chart/doc.rc","json":"docs/python-samples/canvas-line-chart/doc.json"}
{"id":"python-samples/canvas-ovals","title":"canvas ovals","description":"Several overlapping ovals in different colors","source":"origami","authoring":["json"],"apis":["drawOval","layout","paint"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":333,"ops":22,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/canvas-ovals/doc.rc","json":"docs/python-samples/canvas-ovals/doc.json"}
{"id":"python-samples/canvas-pie-segments","title":"canvas pie segments","description":"4-segment pie chart using draw_sector","source":"origami","authoring":["json"],"apis":["drawArc","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":826,"ops":43,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/canvas-pie-segments/doc.rc","json":"docs/python-samples/canvas-pie-segments/doc.json"}
{"id":"python-samples/canvas-radar","title":"canvas radar","description":"Simple radar/spider chart outline (hexagonal) with data shape","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1162,"ops":67,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/canvas-radar/doc.rc","json":"docs/python-samples/canvas-radar/doc.json"}
{"id":"python-samples/canvas-round-rects","title":"canvas round rects","description":"Grid of rounded rectangles with varying corner radii","source":"origami","authoring":["json"],"apis":["drawRoundRect","layout","paint"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":806,"ops":42,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/canvas-round-rects/doc.rc","json":"docs/python-samples/canvas-round-rects/doc.json"}
{"id":"python-samples/canvas-scatter","title":"canvas scatter","description":"Scatter plot with dots (small filled circles) and axis lines","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":937,"ops":58,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/canvas-scatter/doc.rc","json":"docs/python-samples/canvas-scatter/doc.json"}
{"id":"python-samples/canvas-stacked-bars","title":"canvas stacked bars","description":"Stacked bar chart with 3 categories across 4 groups","source":"origami","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1200,"ops":67,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/canvas-stacked-bars/doc.rc","json":"docs/python-samples/canvas-stacked-bars/doc.json"}
{"id":"python-samples/canvas-star","title":"canvas star","description":"Star shape using rotated lines from center","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","expressions","layout","loop","paint","transforms"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":400,"ops":30,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/canvas-star/doc.rc","json":"docs/python-samples/canvas-star/doc.json"}
{"id":"python-samples/canvas-target","title":"canvas target","description":"Bullseye target with alternating red and white rings","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","layout","paint"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":429,"ops":29,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/canvas-target/doc.rc","json":"docs/python-samples/canvas-target/doc.json"}
{"id":"python-samples/chart-100-stacked-bar","title":"chart 100 stacked bar","description":"100% Stacked Bar Chart - Browser Market Share","source":"origami","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2012,"ops":96,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-100-stacked-bar/doc.rc","json":"docs/python-samples/chart-100-stacked-bar/doc.json"}
{"id":"python-samples/chart-area","title":"chart area","description":"Area chart showing website traffic over a week","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1793,"ops":93,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-area/doc.rc","json":"docs/python-samples/chart-area/doc.json"}
{"id":"python-samples/chart-box-plot","title":"chart box plot","description":"Box-and-whisker plot showing score distributions across 5 groups","source":"origami","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1876,"ops":89,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-box-plot/doc.rc","json":"docs/python-samples/chart-box-plot/doc.json"}
{"id":"python-samples/chart-bubble","title":"chart bubble","description":"Bubble chart showing market analysis with 3 color groups","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1403,"ops":74,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-bubble/doc.rc","json":"docs/python-samples/chart-bubble/doc.json"}
{"id":"python-samples/chart-bullet","title":"chart bullet","description":"Bullet chart showing 4 performance metrics with ranges and targets","source":"origami","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1756,"ops":74,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-bullet/doc.rc","json":"docs/python-samples/chart-bullet/doc.json"}
{"id":"python-samples/chart-candlestick","title":"chart candlestick","description":"Candlestick chart showing 10 days of stock price data","source":"origami","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2227,"ops":102,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-candlestick/doc.rc","json":"docs/python-samples/chart-candlestick/doc.json"}
{"id":"python-samples/chart-comparison-bar","title":"chart comparison bar","description":"Comparison Bar Chart - Budget vs Actual","source":"origami","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1384,"ops":69,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-comparison-bar/doc.rc","json":"docs/python-samples/chart-comparison-bar/doc.json"}
{"id":"python-samples/chart-diverging-bar","title":"chart diverging bar","description":"Survey Results - Diverging bar chart with positive and negative responses","source":"origami","authoring":["json"],"apis":["drawLine","drawRoundRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1457,"ops":70,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-diverging-bar/doc.rc","json":"docs/python-samples/chart-diverging-bar/doc.json"}
{"id":"python-samples/chart-donut-thick","title":"chart donut thick","description":"Thick Donut Chart - Energy Sources","source":"origami","authoring":["json"],"apis":["drawArc","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1566,"ops":68,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-donut-thick/doc.rc","json":"docs/python-samples/chart-donut-thick/doc.json"}
{"id":"python-samples/chart-dot-plot","title":"chart dot plot","description":"Dot plot showing response time distributions across 5 categories","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1632,"ops":91,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-dot-plot/doc.rc","json":"docs/python-samples/chart-dot-plot/doc.json"}
{"id":"python-samples/chart-dumbbell","title":"chart dumbbell","description":"Dumbbell chart showing before vs after comparison for 6 items","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1392,"ops":71,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-dumbbell/doc.rc","json":"docs/python-samples/chart-dumbbell/doc.json"}
{"id":"python-samples/chart-error-bar","title":"chart error bar","description":"Bar Chart with Error Bars - Experiment Results","source":"origami","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1337,"ops":68,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-error-bar/doc.rc","json":"docs/python-samples/chart-error-bar/doc.json"}
{"id":"python-samples/chart-funnel","title":"chart funnel","description":"Funnel chart showing sales pipeline stages","source":"origami","authoring":["json"],"apis":["drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1218,"ops":53,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-funnel/doc.rc","json":"docs/python-samples/chart-funnel/doc.json"}
{"id":"python-samples/chart-gauge-full","title":"chart gauge full","description":"Full circle gauge showing temperature like a speedometer","source":"origami","authoring":["json"],"apis":["drawArc","drawCircle","drawLine","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1384,"ops":63,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-gauge-full/doc.rc","json":"docs/python-samples/chart-gauge-full/doc.json"}
{"id":"python-samples/chart-gauge-half","title":"chart gauge half","description":"Half-circle gauge showing CPU usage at 65%","source":"origami","authoring":["json"],"apis":["drawArc","drawCircle","drawLine","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":915,"ops":40,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-gauge-half/doc.rc","json":"docs/python-samples/chart-gauge-half/doc.json"}
{"id":"python-samples/chart-grouped-bar","title":"chart grouped bar","description":"Grouped bar chart showing sales by product","source":"origami","authoring":["json"],"apis":["drawLine","drawRect","drawRoundRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1647,"ops":74,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-grouped-bar/doc.rc","json":"docs/python-samples/chart-grouped-bar/doc.json"}
{"id":"python-samples/chart-heatmap","title":"chart heatmap","description":"Heatmap grid showing weekly activity across 7 days and 5 time slots","source":"origami","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":3158,"ops":137,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-heatmap/doc.rc","json":"docs/python-samples/chart-heatmap/doc.json"}
{"id":"python-samples/chart-histogram","title":"chart histogram","description":"Histogram - Test Score Distribution","source":"origami","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1611,"ops":83,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-histogram/doc.rc","json":"docs/python-samples/chart-histogram/doc.json"}
{"id":"python-samples/chart-horizontal-bar","title":"chart horizontal bar","description":"Horizontal bar chart showing top programming languages","source":"origami","authoring":["json"],"apis":["drawLine","drawRoundRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1508,"ops":70,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-horizontal-bar/doc.rc","json":"docs/python-samples/chart-horizontal-bar/doc.json"}
{"id":"python-samples/chart-icon-bar","title":"chart icon bar","description":"Pictorial Bar Chart - Fruit Count","source":"origami","authoring":["json"],"apis":["drawCircle","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1380,"ops":78,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-icon-bar/doc.rc","json":"docs/python-samples/chart-icon-bar/doc.json"}
{"id":"python-samples/chart-kpi-dashboard","title":"chart kpi dashboard","description":"Business Dashboard - KPI dashboard with 4 mini-charts","source":"origami","authoring":["json"],"apis":["drawArc","drawCircle","drawLine","drawRect","drawRoundRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1763,"ops":86,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-kpi-dashboard/doc.rc","json":"docs/python-samples/chart-kpi-dashboard/doc.json"}
{"id":"python-samples/chart-lollipop","title":"chart lollipop","description":"Lollipop chart showing category scores with thin lines and dots","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1642,"ops":84,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-lollipop/doc.rc","json":"docs/python-samples/chart-lollipop/doc.json"}
{"id":"python-samples/chart-marimekko","title":"chart marimekko","description":"Marimekko chart showing market segments with variable-width columns","source":"origami","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2157,"ops":96,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-marimekko/doc.rc","json":"docs/python-samples/chart-marimekko/doc.json"}
{"id":"python-samples/chart-matrix-bubble","title":"chart matrix bubble","description":"Correlation Matrix - 5x5 bubble matrix with size and color encoding","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1557,"ops":88,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-matrix-bubble/doc.rc","json":"docs/python-samples/chart-matrix-bubble/doc.json"}
{"id":"python-samples/chart-multi-line","title":"chart multi line","description":"Multi-line chart showing stock performance of three companies","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2273,"ops":118,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-multi-line/doc.rc","json":"docs/python-samples/chart-multi-line/doc.json"}
{"id":"python-samples/chart-nested-donut","title":"chart nested donut","description":"Nested donut chart showing budget allocation with outer categories and inner subcategories","source":"origami","authoring":["json"],"apis":["drawArc","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2358,"ops":90,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-nested-donut/doc.rc","json":"docs/python-samples/chart-nested-donut/doc.json"}
{"id":"python-samples/chart-network","title":"chart network","description":"Network Graph - Team Connections","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1229,"ops":63,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-network/doc.rc","json":"docs/python-samples/chart-network/doc.json"}
{"id":"python-samples/chart-nightingale","title":"chart nightingale","description":"Monthly Rainfall - Nightingale rose chart with 12 sectors","source":"origami","authoring":["json"],"apis":["drawArc","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1304,"ops":65,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-nightingale/doc.rc","json":"docs/python-samples/chart-nightingale/doc.json"}
{"id":"python-samples/chart-pareto","title":"chart pareto","description":"Pareto Chart - Defect Analysis","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1722,"ops":88,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-pareto/doc.rc","json":"docs/python-samples/chart-pareto/doc.json"}
{"id":"python-samples/chart-pie","title":"chart pie","description":"Pie chart showing market share distribution","source":"origami","authoring":["json"],"apis":["drawArc","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1989,"ops":84,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-pie/doc.rc","json":"docs/python-samples/chart-pie/doc.json"}
{"id":"python-samples/chart-polar-area","title":"chart polar area","description":"Polar area (Nightingale) chart showing wind direction data","source":"origami","authoring":["json"],"apis":["drawArc","drawCircle","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1123,"ops":51,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-polar-area/doc.rc","json":"docs/python-samples/chart-polar-area/doc.json"}
{"id":"python-samples/chart-progress-ring","title":"chart progress ring","description":"Daily Goals - Three concentric progress rings","source":"origami","authoring":["json"],"apis":["drawArc","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":801,"ops":37,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-progress-ring/doc.rc","json":"docs/python-samples/chart-progress-ring/doc.json"}
{"id":"python-samples/chart-pyramid","title":"chart pyramid","description":"Population pyramid with back-to-back horizontal bars for age distribution","source":"origami","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1767,"ops":76,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-pyramid/doc.rc","json":"docs/python-samples/chart-pyramid/doc.json"}
{"id":"python-samples/chart-radar-filled","title":"chart radar filled","description":"Radar chart with two overlapping filled polygons for player stats","source":"origami","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1708,"ops":87,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-radar-filled/doc.rc","json":"docs/python-samples/chart-radar-filled/doc.json"}
{"id":"python-samples/chart-radial-bar","title":"chart radial bar","description":"Department Scores - Radial bar chart with 5 categories","source":"origami","authoring":["json"],"apis":["drawArc","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1076,"ops":47,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-radial-bar/doc.rc","json":"docs/python-samples/chart-radial-bar/doc.json"}
{"id":"python-samples/chart-range-bar","title":"chart range bar","description":"Range bar chart showing project timeline like a Gantt chart","source":"origami","authoring":["json"],"apis":["drawLine","drawRect","drawRoundRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1745,"ops":78,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-range-bar/doc.rc","json":"docs/python-samples/chart-range-bar/doc.json"}
{"id":"python-samples/chart-sankey-simple","title":"chart sankey simple","description":"Traffic Sources - Simplified Sankey flow diagram","source":"origami","authoring":["json"],"apis":["drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1132,"ops":58,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-sankey-simple/doc.rc","json":"docs/python-samples/chart-sankey-simple/doc.json"}
{"id":"python-samples/chart-scatter-regression","title":"chart scatter regression","description":"Scatter plot with trend line showing study hours vs test score","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1373,"ops":73,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-scatter-regression/doc.rc","json":"docs/python-samples/chart-scatter-regression/doc.json"}
{"id":"python-samples/chart-semi-donut","title":"chart semi donut","description":"Semi-circle donut chart showing goal progress at 73 percent","source":"origami","authoring":["json"],"apis":["drawArc","drawCircle","drawRoundRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1177,"ops":49,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-semi-donut/doc.rc","json":"docs/python-samples/chart-semi-donut/doc.json"}
{"id":"python-samples/chart-slope","title":"chart slope","description":"Rankings 2023 vs 2024 - Slope chart showing rank changes","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1478,"ops":74,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-slope/doc.rc","json":"docs/python-samples/chart-slope/doc.json"}
{"id":"python-samples/chart-span","title":"chart span","description":"Span/Range Chart - Temperature Range","source":"origami","authoring":["json"],"apis":["drawLine","drawRoundRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1649,"ops":78,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-span/doc.rc","json":"docs/python-samples/chart-span/doc.json"}
{"id":"python-samples/chart-sparkline","title":"chart sparkline","description":"Multiple sparklines showing key metrics","source":"origami","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1692,"ops":83,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-sparkline/doc.rc","json":"docs/python-samples/chart-sparkline/doc.json"}
{"id":"python-samples/chart-stacked-area","title":"chart stacked area","description":"Stacked Area Chart - Revenue Streams","source":"origami","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1786,"ops":88,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-stacked-area/doc.rc","json":"docs/python-samples/chart-stacked-area/doc.json"}
{"id":"python-samples/chart-stacked-bar","title":"chart stacked bar","description":"Stacked bar chart showing quarterly revenue by region","source":"origami","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1501,"ops":71,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-stacked-bar/doc.rc","json":"docs/python-samples/chart-stacked-bar/doc.json"}
{"id":"python-samples/chart-step-line","title":"chart step line","description":"Step line chart showing server load over time","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1707,"ops":89,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-step-line/doc.rc","json":"docs/python-samples/chart-step-line/doc.json"}
{"id":"python-samples/chart-timeline","title":"chart timeline","description":"Project Milestones - Horizontal timeline with 6 events","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1905,"ops":97,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-timeline/doc.rc","json":"docs/python-samples/chart-timeline/doc.json"}
{"id":"python-samples/chart-tornado","title":"chart tornado","description":"Sensitivity Analysis - Tornado butterfly chart with 8 parameter pairs","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","drawRoundRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1624,"ops":79,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-tornado/doc.rc","json":"docs/python-samples/chart-tornado/doc.json"}
{"id":"python-samples/chart-treemap","title":"chart treemap","description":"Treemap chart showing disk usage by file category","source":"origami","authoring":["json"],"apis":["drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1254,"ops":53,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-treemap/doc.rc","json":"docs/python-samples/chart-treemap/doc.json"}
{"id":"python-samples/chart-waffle","title":"chart waffle","description":"Waffle chart showing 73% task completion","source":"origami","authoring":["json"],"apis":["drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2262,"ops":125,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-waffle/doc.rc","json":"docs/python-samples/chart-waffle/doc.json"}
{"id":"python-samples/chart-waterfall","title":"chart waterfall","description":"Waterfall chart showing profit analysis","source":"origami","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1541,"ops":74,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/chart-waterfall/doc.rc","json":"docs/python-samples/chart-waterfall/doc.json"}
{"id":"python-samples/demo-background","title":"demo background","description":"Port of DemoModifierBackground.kt \u2014 ARGB int and float backgrounds","source":"origami","authoring":["json"],"apis":["layout"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":273,"ops":23,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/demo-background/doc.rc","json":"docs/python-samples/demo-background/doc.json"}
{"id":"python-samples/demo-border","title":"demo border","description":"Port of DemoModifierBorder.kt \u2014 rectangular and rounded borders","source":"origami","authoring":["json"],"apis":["layout"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":284,"ops":22,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/demo-border/doc.rc","json":"docs/python-samples/demo-border/doc.json"}
{"id":"python-samples/demo-box","title":"demo box","description":"Port of DemoBox.kt \u2014 simple container with a red background","source":"origami","authoring":["json"],"apis":["layout"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":133,"ops":10,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/demo-box/doc.rc","json":"docs/python-samples/demo-box/doc.json"}
{"id":"python-samples/demo-canvas-cross","title":"demo canvas cross","description":"Port of RcCanvasComponents1 \u2014 canvas with X cross and centered text box","source":"origami","authoring":["json"],"apis":["drawLine","layout","paint"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":288,"ops":21,"width":600,"height":600,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/demo-canvas-cross/doc.rc","json":"docs/python-samples/demo-canvas-cross/doc.json"}
{"id":"python-samples/demo-canvas-shapes","title":"demo canvas shapes","description":"Canvas drawing with various shapes \u2014 rect, circle, oval, round_rect, arc, line","source":"origami","authoring":["json"],"apis":["drawArc","drawCircle","drawLine","drawOval","drawRect","drawRoundRect","layout","paint"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":396,"ops":24,"width":500,"height":500,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/demo-canvas-shapes/doc.rc","json":"docs/python-samples/demo-canvas-shapes/doc.json"}
{"id":"python-samples/demo-clock","title":"demo clock","description":"Port of ExampleClock.kt basicClock() \u2014 animated clock with hour/minute/second hands","source":"origami","authoring":["json"],"apis":["drawLine","drawRoundRect","expressions","layout","paint","transforms"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":619,"ops":41,"width":500,"height":500,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/demo-clock/doc.rc","json":"docs/python-samples/demo-clock/doc.json"}
{"id":"python-samples/demo-column","title":"demo column","description":"Port of DemoColumn.kt \u2014 vertical stacking of colored boxes","source":"origami","authoring":["json"],"apis":["layout"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":368,"ops":30,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/demo-column/doc.rc","json":"docs/python-samples/demo-column/doc.json"}
{"id":"python-samples/demo-fit-box","title":"demo fit box","description":"Port of DemoFitBox.kt \u2014 content scaled to fit bounds","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":259,"ops":22,"width":500,"height":500,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/demo-fit-box/doc.rc","json":"docs/python-samples/demo-fit-box/doc.json"}
{"id":"python-samples/demo-flow","title":"demo flow","description":"Port of DemoFlow.kt \u2014 children wrapping to next line","source":"origami","authoring":["json"],"apis":["layout"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1089,"ops":89,"width":500,"height":500,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/demo-flow/doc.rc","json":"docs/python-samples/demo-flow/doc.json"}
{"id":"python-samples/demo-nested-layout","title":"demo nested layout","description":"Nested layout demo \u2014 column with header text, row of weighted columns with bordered items (inspired by CanvasComponents5)","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":858,"ops":76,"width":600,"height":600,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/demo-nested-layout/doc.rc","json":"docs/python-samples/demo-nested-layout/doc.json"}
{"id":"python-samples/demo-new-syntax","title":"demo new syntax","description":"Demonstrates new JSON format features: infix expressions, inline paint, inline expression refs, readable var names, ordered modifiers","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":722,"ops":46,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/demo-new-syntax/doc.rc","json":"docs/python-samples/demo-new-syntax/doc.json"}
{"id":"python-samples/demo-padding","title":"demo padding","description":"Port of DemoModifierPadding.kt \u2014 uniform and per-side padding","source":"origami","authoring":["json"],"apis":["layout"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":341,"ops":26,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/demo-padding/doc.rc","json":"docs/python-samples/demo-padding/doc.json"}
{"id":"python-samples/demo-pressure-gauge","title":"demo pressure gauge","description":"Port of PressureGauge.kt \u2014 animated circular gauge with tick marks, needle, and text","source":"origami","authoring":["json"],"apis":["drawLine","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":973,"ops":53,"width":500,"height":500,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/demo-pressure-gauge/doc.rc","json":"docs/python-samples/demo-pressure-gauge/doc.json"}
{"id":"python-samples/demo-row","title":"demo row","description":"Port of DemoRow.kt \u2014 horizontal stacking of colored boxes","source":"origami","authoring":["json"],"apis":["layout"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":365,"ops":30,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/demo-row/doc.rc","json":"docs/python-samples/demo-row/doc.json"}
{"id":"python-samples/demo-spaced-by","title":"demo spaced by","description":"Port of DemoModifierSpacedBy.kt \u2014 automatic spacing between items","source":"origami","authoring":["json"],"apis":["layout"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":350,"ops":30,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/demo-spaced-by/doc.rc","json":"docs/python-samples/demo-spaced-by/doc.json"}
{"id":"python-samples/demo-text","title":"demo text","description":"Port of DemoText.kt \u2014 text with bold and italic styles","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":257,"ops":21,"width":500,"height":500,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/demo-text/doc.rc","json":"docs/python-samples/demo-text/doc.json"}
{"id":"python-samples/gauge-altimeter","title":"gauge altimeter","description":"Altimeter Gauge","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1545,"ops":87,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/gauge-altimeter/doc.rc","json":"docs/python-samples/gauge-altimeter/doc.json"}
{"id":"python-samples/gauge-battery","title":"gauge battery","description":"Battery Gauge","source":"origami","authoring":["json"],"apis":["drawLine","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":971,"ops":46,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/gauge-battery/doc.rc","json":"docs/python-samples/gauge-battery/doc.json"}
{"id":"python-samples/gauge-compass","title":"gauge compass","description":"Compass Gauge","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1335,"ops":96,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/gauge-compass/doc.rc","json":"docs/python-samples/gauge-compass/doc.json"}
{"id":"python-samples/gauge-fuel","title":"gauge fuel","description":"Fuel Gauge","source":"origami","authoring":["json"],"apis":["drawArc","drawCircle","drawLine","drawRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1428,"ops":86,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/gauge-fuel/doc.rc","json":"docs/python-samples/gauge-fuel/doc.json"}
{"id":"python-samples/gauge-level","title":"gauge level","description":"Horizontal Level Indicator","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1151,"ops":59,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/gauge-level/doc.rc","json":"docs/python-samples/gauge-level/doc.json"}
{"id":"python-samples/gauge-progress-ring","title":"gauge progress ring","description":"Progress Ring Gauge","source":"origami","authoring":["json"],"apis":["drawArc","drawCircle","drawLine","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":777,"ops":46,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/gauge-progress-ring/doc.rc","json":"docs/python-samples/gauge-progress-ring/doc.json"}
{"id":"python-samples/gauge-rpm","title":"gauge rpm","description":"RPM Tachometer Gauge","source":"origami","authoring":["json"],"apis":["drawArc","drawCircle","drawLine","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1769,"ops":119,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/gauge-rpm/doc.rc","json":"docs/python-samples/gauge-rpm/doc.json"}
{"id":"python-samples/gauge-signal","title":"gauge signal","description":"Signal Strength Gauge","source":"origami","authoring":["json"],"apis":["drawRoundRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1387,"ops":52,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/gauge-signal/doc.rc","json":"docs/python-samples/gauge-signal/doc.json"}
{"id":"python-samples/gauge-speedometer","title":"gauge speedometer","description":"Speedometer Gauge","source":"origami","authoring":["json"],"apis":["drawArc","drawCircle","drawLine","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1535,"ops":101,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/gauge-speedometer/doc.rc","json":"docs/python-samples/gauge-speedometer/doc.json"}
{"id":"python-samples/gauge-stopwatch","title":"gauge stopwatch","description":"Stopwatch Face","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1426,"ops":89,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/gauge-stopwatch/doc.rc","json":"docs/python-samples/gauge-stopwatch/doc.json"}
{"id":"python-samples/gauge-thermometer","title":"gauge thermometer","description":"Thermometer Gauge","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1082,"ops":51,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/gauge-thermometer/doc.rc","json":"docs/python-samples/gauge-thermometer/doc.json"}
{"id":"python-samples/gauge-vu-meter","title":"gauge vu meter","description":"VU Meter Gauge","source":"origami","authoring":["json"],"apis":["drawArc","drawCircle","drawLine","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1395,"ops":88,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/gauge-vu-meter/doc.rc","json":"docs/python-samples/gauge-vu-meter/doc.json"}
{"id":"python-samples/layout-card","title":"layout card","description":"Card Layout","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1032,"ops":90,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/layout-card/doc.rc","json":"docs/python-samples/layout-card/doc.json"}
{"id":"python-samples/layout-centered","title":"layout centered","description":"Centered with Borders","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":565,"ops":47,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/layout-centered/doc.rc","json":"docs/python-samples/layout-centered/doc.json"}
{"id":"python-samples/layout-clip-circle","title":"layout clip circle","description":"Circular Clip","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":365,"ops":34,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/layout-clip-circle/doc.rc","json":"docs/python-samples/layout-clip-circle/doc.json"}
{"id":"python-samples/layout-clip-rounded","title":"layout clip rounded","description":"Rounded Corner Clip","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":398,"ops":35,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/layout-clip-rounded/doc.rc","json":"docs/python-samples/layout-clip-rounded/doc.json"}
{"id":"python-samples/layout-deep-nesting","title":"layout deep nesting","description":"Deep Nesting","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1175,"ops":101,"width":600,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/layout-deep-nesting/doc.rc","json":"docs/python-samples/layout-deep-nesting/doc.json"}
{"id":"python-samples/layout-fill-max-height","title":"layout fill max height","description":"Fill Max Height Column","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":597,"ops":49,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/layout-fill-max-height/doc.rc","json":"docs/python-samples/layout-fill-max-height/doc.json"}
{"id":"python-samples/layout-fill-max-width","title":"layout fill max width","description":"Fill Max Width Row","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":567,"ops":49,"width":600,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/layout-fill-max-width/doc.rc","json":"docs/python-samples/layout-fill-max-width/doc.json"}
{"id":"python-samples/layout-form","title":"layout form","description":"Form Layout","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1679,"ops":160,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/layout-form/doc.rc","json":"docs/python-samples/layout-form/doc.json"}
{"id":"python-samples/layout-grid","title":"layout grid","description":"3x3 Grid","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1508,"ops":146,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/layout-grid/doc.rc","json":"docs/python-samples/layout-grid/doc.json"}
{"id":"python-samples/layout-header-content-footer","title":"layout header content footer","description":"Header Content Footer","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1230,"ops":114,"width":600,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/layout-header-content-footer/doc.rc","json":"docs/python-samples/layout-header-content-footer/doc.json"}
{"id":"python-samples/layout-sidebar","title":"layout sidebar","description":"Sidebar Layout","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1462,"ops":143,"width":600,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/layout-sidebar/doc.rc","json":"docs/python-samples/layout-sidebar/doc.json"}
{"id":"python-samples/layout-weighted-column","title":"layout weighted column","description":"Weighted Column 1:3:1","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":609,"ops":50,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/layout-weighted-column/doc.rc","json":"docs/python-samples/layout-weighted-column/doc.json"}
{"id":"python-samples/layout-weighted-row","title":"layout weighted row","description":"Weighted Row 1:2:1","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":586,"ops":49,"width":600,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/layout-weighted-row/doc.rc","json":"docs/python-samples/layout-weighted-row/doc.json"}
{"id":"python-samples/layout-z-index","title":"layout z index","description":"Z-Index Stacking","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":587,"ops":52,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/layout-z-index/doc.rc","json":"docs/python-samples/layout-z-index/doc.json"}
{"id":"python-samples/text-alignment","title":"text alignment","description":"Three tinted bands demonstrating left, centre and right text alignment. #text #layout","source":"origami","authoring":["json"],"apis":["layout"],"flags":[],"tags":["layout","python","text"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":588,"ops":42,"width":400,"height":600,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/text-alignment/doc.rc","json":"docs/python-samples/text-alignment/doc.json"}
{"id":"python-samples/text-badges","title":"text badges","description":"Step progress arc reading 7250 of 10000, with percentage badges around the sweep. #widget #graph","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["graph","python","widget"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1595,"ops":135,"width":400,"height":600,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/text-badges/doc.rc","json":"docs/python-samples/text-badges/doc.json"}
{"id":"python-samples/text-cards","title":"text cards","description":"Stacked information cards - Getting Started, Components, Advanced Topics - each with a coloured header. #layout #text","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["layout","python","text"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1079,"ops":87,"width":400,"height":600,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/text-cards/doc.rc","json":"docs/python-samples/text-cards/doc.json"}
{"id":"python-samples/text-heading-body","title":"text heading body","description":"Document page: a RemoteCompose heading, subtitle and body paragraph. #text","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["python","text"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1009,"ops":58,"width":400,"height":600,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/text-heading-body/doc.rc","json":"docs/python-samples/text-heading-body/doc.json"}
{"id":"python-samples/text-layered-borders","title":"text layered borders","description":"Border treatments compared: layered borders, a double border and a gradient effect. #layout #paint","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["layout","paint","python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1269,"ops":88,"width":400,"height":600,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/text-layered-borders/doc.rc","json":"docs/python-samples/text-layered-borders/doc.json"}
{"id":"python-samples/text-list","title":"text list","description":"Numbered checklist of eight setup steps on alternating row stripes. #text #layout","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["layout","python","text"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1294,"ops":106,"width":400,"height":600,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/text-list/doc.rc","json":"docs/python-samples/text-list/doc.json"}
{"id":"python-samples/text-sizes","title":"text sizes","description":"Type scale: the same label repeated at sizes 16 through 64. #text","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["python","text"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":467,"ops":46,"width":400,"height":600,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/text-sizes/doc.rc","json":"docs/python-samples/text-sizes/doc.json"}
{"id":"python-samples/text-stats-row","title":"text stats row","description":"Statistics row: three coloured tiles reading 1,284 Users, 847 Active and 99.7% Uptime. #widget #layout","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["layout","python","widget"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":938,"ops":93,"width":500,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/text-stats-row/doc.rc","json":"docs/python-samples/text-stats-row/doc.json"}
{"id":"python-samples/viewport-basic","title":"viewport basic","description":"Viewport test: shapes drawn in 1000x1000 virtual space, rendered at any size","source":"origami","authoring":["json"],"apis":["drawCircle","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":557,"ops":32,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/viewport-basic/doc.rc","json":"docs/python-samples/viewport-basic/doc.json"}
{"id":"python-samples/viewport-chart","title":"viewport chart","description":"USD/SGD chart rewritten using viewport - scalable to any size","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":2294,"ops":124,"width":500,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/viewport-chart/doc.rc","json":"docs/python-samples/viewport-chart/doc.json"}
{"id":"python-samples/viewport-flipy","title":"viewport flipy","description":"Viewport with flip_y: y=0 at bottom, bars grow upward naturally","source":"origami","authoring":["json"],"apis":["drawLine","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":653,"ops":40,"width":400,"height":300,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/viewport-flipy/doc.rc","json":"docs/python-samples/viewport-flipy/doc.json"}
{"id":"python-samples/widget-dashboard","title":"widget dashboard","description":"2x2 dashboard grid with four mini-gauge panels: speed, temp, fuel, battery","source":"origami","authoring":["json"],"apis":["drawArc","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":3743,"ops":238,"width":600,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/widget-dashboard/doc.rc","json":"docs/python-samples/widget-dashboard/doc.json"}
{"id":"python-samples/widget-metric","title":"widget metric","description":"Single metric card: large animated number, label, trend arrow drawn in canvas","source":"origami","authoring":["json"],"apis":["drawLine","drawRoundRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1508,"ops":102,"width":300,"height":200,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/widget-metric/doc.rc","json":"docs/python-samples/widget-metric/doc.json"}
{"id":"python-samples/widget-music","title":"widget music","description":"Music player widget: album art area, song info, playback controls as canvas shapes","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1601,"ops":117,"width":400,"height":200,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/widget-music/doc.rc","json":"docs/python-samples/widget-music/doc.json"}
{"id":"python-samples/widget-notification","title":"widget notification","description":"Notification card: icon circle, title + message, colored left accent via ordered modifiers","source":"origami","authoring":["json"],"apis":["drawArc","drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":961,"ops":71,"width":400,"height":120,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/widget-notification/doc.rc","json":"docs/python-samples/widget-notification/doc.json"}
{"id":"python-samples/widget-profile","title":"widget profile","description":"Profile card: avatar circle, name, role, 3 metric values","source":"origami","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1184,"ops":119,"width":400,"height":200,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/widget-profile/doc.rc","json":"docs/python-samples/widget-profile/doc.json"}
{"id":"python-samples/widget-score","title":"widget score","description":"Game score display: Home vs Away with large canvas-drawn score numbers","source":"origami","authoring":["json"],"apis":["expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1548,"ops":132,"width":400,"height":200,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/widget-score/doc.rc","json":"docs/python-samples/widget-score/doc.json"}
{"id":"python-samples/widget-settings","title":"widget settings","description":"Settings panel: 5 rows with icon box, label, and toggle indicator","source":"origami","authoring":["json"],"apis":["drawArc","drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":4059,"ops":365,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/widget-settings/doc.rc","json":"docs/python-samples/widget-settings/doc.json"}
{"id":"python-samples/widget-stats","title":"widget stats","description":"Stats bar: 4 equal-weight stat boxes with value, label, and mini sparkline canvas","source":"origami","authoring":["json"],"apis":["drawLine","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":3554,"ops":249,"width":500,"height":200,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/widget-stats/doc.rc","json":"docs/python-samples/widget-stats/doc.json"}
{"id":"python-samples/widget-timer","title":"widget timer","description":"Countdown timer: circular progress ring with animated time display in center","source":"origami","authoring":["json"],"apis":["drawArc","drawCircle","drawLine","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1275,"ops":66,"width":300,"height":300,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/widget-timer/doc.rc","json":"docs/python-samples/widget-timer/doc.json"}
{"id":"python-samples/widget-weather","title":"widget weather","description":"Weather card: city name, animated temperature, 3-day forecast with canvas icons","source":"origami","authoring":["json"],"apis":["drawCircle","drawLine","drawRoundRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["python"],"addedAt":"2026-09-29T10:56:47-07:00","bytes":1764,"ops":160,"width":400,"height":300,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/python-samples/widget-weather/doc.rc","json":"docs/python-samples/widget-weather/doc.json"}
{"id":"render/00-header-only","title":"00 header only","description":"Hello RcJson","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":61,"ops":1,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/00-header-only/doc.rc","json":"docs/render/00-header-only/doc.json"}
{"id":"render/00-ring","title":"00 ring","description":"live \u2014 a ring of bars with a wave travelling around it","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":610,"ops":37,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/00-ring/doc.rc","json":"docs/render/00-ring/doc.json"}
{"id":"render/01-draw-commands","title":"01 draw commands","description":"A ring, a sweeping arc and an orbiting dot, all driven by the clock","source":"rcjson","authoring":["json"],"apis":["drawArc","drawCircle","drawRect","expressions","layout","paint","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":480,"ops":29,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/01-draw-commands/doc.rc","json":"docs/render/01-draw-commands/doc.json"}
{"id":"render/01-hello","title":"01 hello","description":"Hello RcJson","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":307,"ops":21,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/01-hello/doc.rc","json":"docs/render/01-hello/doc.json"}
{"id":"render/01-sakura-season","title":"01 sakura season","description":"Sakura Season \u2014 animated loading panel matching reference artwork","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["featured"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":22819,"ops":0,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/01-sakura-season/doc.rc","json":"docs/render/01-sakura-season/doc.json"}
{"id":"render/01-simple-demo","title":"01 simple demo","description":"Simple Demo","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":269,"ops":21,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/01-simple-demo/doc.rc","json":"docs/render/01-simple-demo/doc.json"}
{"id":"render/02-loop","title":"02 loop","description":"36 radial bars whose lengths follow a wave travelling around the circle","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":516,"ops":28,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/02-loop/doc.rc","json":"docs/render/02-loop/doc.json"}
{"id":"render/02-text-layout","title":"02 text layout","description":"Match card: Arsenal vs Bayern Munich on yellow, with competition and date lines and an image slot. #text #layout","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["layout","text"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":720,"ops":56,"width":600,"height":600,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/02-text-layout/doc.rc","json":"docs/render/02-text-layout/doc.json"}
{"id":"render/02-ticker","title":"02 ticker","description":"Watchlist ticker scrolling a value across a pale card. #animation #widget","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["animation","widget"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":7500,"ops":0,"width":0,"height":0,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/02-ticker/doc.rc","json":"docs/render/02-ticker/doc.json"}
{"id":"render/03-canvas-draw","title":"03 canvas draw","description":"Canvas draw ops","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRoundRect","layout","paint"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":307,"ops":24,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/03-canvas-draw/doc.rc","json":"docs/render/03-canvas-draw/doc.json"}
{"id":"render/03-new-years-fireworks","title":"03 new years fireworks","description":"New Year's Fireworks \u2014 rockets launching and bursting fireworks countdown","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["featured"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":14030,"ops":0,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/03-new-years-fireworks/doc.rc","json":"docs/render/03-new-years-fireworks/doc.json"}
{"id":"render/03-particles","title":"03 particles","description":"120 snowflakes falling and swaying, each one a particle with its own speed, size and opacity","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":536,"ops":0,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/03-particles/doc.rc","json":"docs/render/03-particles/doc.json"}
{"id":"render/03-thermostat-light","title":"03 thermostat light","description":"Thermostat \u2014 detail","source":"rcjson","authoring":["json"],"apis":["drawArc","drawCircle","drawLine","drawPath","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":6154,"ops":261,"width":360,"height":780,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/03-thermostat-light/doc.rc","json":"docs/render/03-thermostat-light/doc.json"}
{"id":"render/04-align-padding","title":"04 align padding","description":"Alignment and padding check: left and right labels pinned to opposite edges with a stacked marker. #layout #validation","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["layout","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":326,"ops":34,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/04-align-padding/doc.rc","json":"docs/render/04-align-padding/doc.json"}
{"id":"render/04-path-expression","title":"04 path expression","description":"Three Lissajous curves generated from expressions, drifting in phase","source":"rcjson","authoring":["json"],"apis":["drawPath","drawRect","layout","paint"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":656,"ops":24,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/04-path-expression/doc.rc","json":"docs/render/04-path-expression/doc.json"}
{"id":"render/05-box-sizes","title":"05 box sizes","description":"Box sizing check: the word hi on a dark red block sized to its content. #layout #validation","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["layout","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":241,"ops":21,"width":200,"height":200,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/05-box-sizes/doc.rc","json":"docs/render/05-box-sizes/doc.json"}
{"id":"render/06-canvas-paints","title":"06 canvas paints","description":"Paint styles on one canvas: a filled rounded rectangle, a stroked green circle and a red rule. #paint #validation","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRoundRect","layout","paint"],"flags":[],"tags":["paint","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":209,"ops":17,"width":256,"height":256,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/06-canvas-paints/doc.rc","json":"docs/render/06-canvas-paints/doc.json"}
{"id":"render/07-box-canvas","title":"07 box canvas","description":"Canvas inside a box: a single hairline diagonal across a black field. #layout #validation","source":"rcjson","authoring":["json"],"apis":["drawLine","layout","paint"],"flags":[],"tags":["layout","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":222,"ops":20,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/07-box-canvas/doc.rc","json":"docs/render/07-box-canvas/doc.json"}
{"id":"render/08-transforms","title":"08 transforms","description":"Transform demo: a circle quartered in green, blue and red with a rotated yellow square at its centre. #transforms","source":"rcjson","authoring":["json"],"apis":["clip","drawArc","drawCircle","drawLine","drawRoundRect","layout","paint","transforms"],"flags":[],"tags":["transforms"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":454,"ops":32,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/08-transforms/doc.rc","json":"docs/render/08-transforms/doc.json"}
{"id":"render/09-expressions","title":"09 expressions","description":"Expression basics: a green circle with a tangent line whose endpoint is computed. #expressions #drawCircle","source":"rcjson","authoring":["json"],"apis":["drawArc","drawCircle","drawLine","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["drawcircle","expressions"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":452,"ops":28,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/09-expressions/doc.rc","json":"docs/render/09-expressions/doc.json"}
{"id":"render/10-variables","title":"10 variables","description":"Variables demo: a yellow smiley face assembled from values held in named variables. #expressions","source":"rcjson","authoring":["json"],"apis":["drawArc","drawCircle","drawRoundRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":539,"ops":35,"width":320,"height":320,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/10-variables/doc.rc","json":"docs/render/10-variables/doc.json"}
{"id":"render/11-layout-expr","title":"11 layout expr","description":"Layout driven by an expression: a blue block sized to half the width, labelled sized by expr. #layout #expressions","source":"rcjson","authoring":["json"],"apis":["expressions","layout","text"],"flags":["animated","expressions"],"tags":["expressions","layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":424,"ops":32,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/11-layout-expr/doc.rc","json":"docs/render/11-layout-expr/doc.json"}
{"id":"render/12-compvalue","title":"12 compvalue","description":"Component value demo: a green circle centred inside a rounded outline using component dimensions. #layout #expressions","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRoundRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":356,"ops":24,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/12-compvalue/doc.rc","json":"docs/render/12-compvalue/doc.json"}
{"id":"render/13-draw-more","title":"13 draw more","description":"Drawing primitives together: a red rectangle, a blue ellipse and a Hello Canvas caption. #drawRect #drawOval","source":"rcjson","authoring":["json"],"apis":["drawOval","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["drawoval","drawrect"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":286,"ops":22,"width":320,"height":320,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/13-draw-more/doc.rc","json":"docs/render/13-draw-more/doc.json"}
{"id":"render/14-colors","title":"14 colors","description":"Themed palette: a named brand colour bar above a teal accent disc. #theming #paint","source":"rcjson","authoring":["json"],"apis":["drawCircle","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["paint","theming"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":515,"ops":46,"width":320,"height":360,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/14-colors/doc.rc","json":"docs/render/14-colors/doc.json"}
{"id":"render/15-paint","title":"15 paint","description":"Paint features: a blue-to-purple gradient panel with a translucent overlay, above a colour wheel. #paint","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","drawRoundRect","layout","paint"],"flags":[],"tags":["paint"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":292,"ops":20,"width":320,"height":320,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/15-paint/doc.rc","json":"docs/render/15-paint/doc.json"}
{"id":"render/16-paths","title":"16 paths","description":"Path fill and stroke: a yellow triangle outlined in red. #drawPath","source":"rcjson","authoring":["json"],"apis":["drawPath","drawRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["drawpath"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":295,"ops":23,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/16-paths/doc.rc","json":"docs/render/16-paths/doc.json"}
{"id":"render/17-components","title":"17 components","description":"Component nesting: numbered children inside a fit box, with left and right edge labels. #layout","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":703,"ops":0,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/17-components/doc.rc","json":"docs/render/17-components/doc.json"}
{"id":"render/18-modifiers","title":"18 modifiers","description":"Modifier stack: a rounded purple pill labelled styled, with background, padding and corner radius. #layout #paint","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["layout","paint"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":363,"ops":26,"width":320,"height":320,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/18-modifiers/doc.rc","json":"docs/render/18-modifiers/doc.json"}
{"id":"render/19-loops","title":"19 loops","description":"Loop demo: a row of red squares above a row of circles growing in size across the sweep. #loop","source":"rcjson","authoring":["json"],"apis":["conditionals","drawCircle","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["loop"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":352,"ops":29,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/19-loops/doc.rc","json":"docs/render/19-loops/doc.json"}
{"id":"render/20-varcolor","title":"20 varcolor","description":"Variable colour: a disc whose fill is computed rather than fixed. #expressions #paint","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","layout","paint"],"flags":[],"tags":["expressions","paint"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":199,"ops":19,"width":300,"height":200,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/20-varcolor/doc.rc","json":"docs/render/20-varcolor/doc.json"}
{"id":"render/21-dinosaurs","title":"21 dinosaurs","description":"Dinosaurs \u2014 cute baby triceratops with dinosaur egg, cracking shell with animated clipRect, swaying clouds, and erupting volcano with rising smoke","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":7857,"ops":0,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/21-dinosaurs/doc.rc","json":"docs/render/21-dinosaurs/doc.json"}
{"id":"render/21-floatarrays","title":"21 floatarrays","description":"Float array demo: a bar chart drawn straight from an array of values. #graph #expressions","source":"rcjson","authoring":["json"],"apis":["drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["expressions","graph"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":349,"ops":24,"width":320,"height":220,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/21-floatarrays/doc.rc","json":"docs/render/21-floatarrays/doc.json"}
{"id":"render/22-anim","title":"22 anim","description":"Animation demo: a yellow dot moving across a bright green field. #animation","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["animation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":263,"ops":19,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/22-anim/doc.rc","json":"docs/render/22-anim/doc.json"}
{"id":"render/22-friendly-aliens-ufo","title":"22 friendly aliens ufo","description":"Friendly Aliens \u2014 UFOs with pulsating tractor beams abducting animals strictly vertically to spaceships","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["featured"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":8412,"ops":0,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/22-friendly-aliens-ufo/doc.rc","json":"docs/render/22-friendly-aliens-ufo/doc.json"}
{"id":"render/23-textfromfloat","title":"23 textfromfloat","description":"text from float","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":250,"ops":20,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/23-textfromfloat/doc.rc","json":"docs/render/23-textfromfloat/doc.json"}
{"id":"render/23-under-the-sea","title":"23 under the sea","description":"Under the Sea \u2014 yellow submarine exploring coral reef with swimming fish that flip direction and bubbles floating up from the sub","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["featured"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":14949,"ops":0,"width":360,"height":360,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/23-under-the-sea/doc.rc","json":"docs/render/23-under-the-sea/doc.json"}
{"id":"render/24-textfromfloat-expr","title":"24 textfromfloat expr","description":"live width","source":"rcjson","authoring":["json"],"apis":["expressions","layout","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":220,"ops":16,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/24-textfromfloat-expr/doc.rc","json":"docs/render/24-textfromfloat-expr/doc.json"}
{"id":"render/37-periodic-table","title":"37 periodic table","description":"All 118 elements, filterable by family and state","source":"rcjson","authoring":["json"],"apis":["expressions","interaction","layout","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-10-15T05:50:06+00:00","bytes":81012,"ops":8126,"width":400,"height":800,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/37-periodic-table/doc.rc","json":"docs/render/37-periodic-table/doc.json"}
{"id":"render/96-perf-limit","title":"96 perf limit","description":"Self-limiting performance probe: ramps path complexity until the frame rate drops below 10 fps, then freezes and reports the limit","source":"rcjson","authoring":[],"apis":["conditionals","drawCircle","drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1651,"ops":106,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/96-perf-limit/doc.rc","json":null}
{"id":"render/a-bar-chart-with-five-colorful-bars","title":"a bar chart with five colorful bars","description":"bar chart","source":"rcjson","authoring":["json"],"apis":["conditionals","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":595,"ops":43,"width":320,"height":240,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/a-bar-chart-with-five-colorful-bars/doc.rc","json":"docs/render/a-bar-chart-with-five-colorful-bars/doc.json"}
{"id":"render/a-battery-icon-at-about-75-percent-green","title":"a battery icon at about 75 percent green","description":"Battery icon at about 75%, green fill inside a white outline. #widget","source":"rcjson","authoring":["json"],"apis":["drawRect","drawRoundRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["widget"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":316,"ops":21,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/a-battery-icon-at-about-75-percent-green/doc.rc","json":"docs/render/a-battery-icon-at-about-75-percent-green/doc.json"}
{"id":"render/a-battery-indicator-showing-40-percent-c","title":"a battery indicator showing 40 percent c","description":"Battery indicator at about 40%, green fill inside a white outline. #widget","source":"rcjson","authoring":[],"apis":["drawRect","drawRoundRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["widget"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":316,"ops":21,"width":300,"height":300,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/a-battery-indicator-showing-40-percent-c/doc.rc","json":null}
{"id":"render/a-bullseye-target-red-and-white","title":"a bullseye target red and white","description":"bullseye","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","layout","paint"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":287,"ops":23,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/a-bullseye-target-red-and-white/doc.rc","json":"docs/render/a-bullseye-target-red-and-white/doc.json"}
{"id":"render/a-cpu-usage-gauge-showing-47-percent","title":"a cpu usage gauge showing 47 percent","description":"cpu usage gauge","source":"rcjson","authoring":["json"],"apis":["drawArc","drawCircle","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":328,"ops":22,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/a-cpu-usage-gauge-showing-47-percent/doc.rc","json":"docs/render/a-cpu-usage-gauge-showing-47-percent/doc.json"}
{"id":"render/a-donut-chart-with-three-colored-segment","title":"a donut chart with three colored segment","description":"donut chart","source":"rcjson","authoring":["json"],"apis":["drawArc","drawRect","layout","paint"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":290,"ops":19,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/a-donut-chart-with-three-colored-segment/doc.rc","json":"docs/render/a-donut-chart-with-three-colored-segment/doc.json"}
{"id":"render/a-speedometer-gauge-with-a-red-needle","title":"a speedometer gauge with a red needle","description":"speedometer","source":"rcjson","authoring":["json"],"apis":["drawArc","drawCircle","drawLine","drawRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":445,"ops":33,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/a-speedometer-gauge-with-a-red-needle/doc.rc","json":"docs/render/a-speedometer-gauge-with-a-red-needle/doc.json"}
{"id":"render/a-tappable-counter-with-plus-and-minus-b","title":"a tappable counter with plus and minus b","description":"Tappable counter with minus and plus controls either side of the value. #interaction #widget","source":"rcjson","authoring":[],"apis":["layout","text"],"flags":[],"tags":["interaction","widget"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":328,"ops":28,"width":320,"height":160,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/a-tappable-counter-with-plus-and-minus-b/doc.rc","json":null}
{"id":"render/a-weather-card-london-12-degrees-rainy-b","title":"a weather card london 12 degrees rainy b","description":"Weather card: London, 12 degrees, Rainy, on a blue panel. #widget","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["widget"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":316,"ops":26,"width":300,"height":320,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/a-weather-card-london-12-degrees-rainy-b/doc.rc","json":"docs/render/a-weather-card-london-12-degrees-rainy-b/doc.json"}
{"id":"render/a1-pulse","title":"a1 pulse","description":"Pulse animation: concentric teal rings expanding from the centre. #animation #drawCircle","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["animation","drawcircle"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":284,"ops":19,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/a1-pulse/doc.rc","json":"docs/render/a1-pulse/doc.json"}
{"id":"render/a2-orbit","title":"a2 orbit","description":"Orbit animation: blue dots circling the centre, growing and shrinking as they travel. #animation #loop","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["animation","featured","loop"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":350,"ops":21,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/a2-orbit/doc.rc","json":"docs/render/a2-orbit/doc.json"}
{"id":"render/a3-wave","title":"a3 wave","description":"Wave animation: amber dots tracing a travelling sine curve. #animation #expressions","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["animation","expressions"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":293,"ops":21,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/a3-wave/doc.rc","json":"docs/render/a3-wave/doc.json"}
{"id":"render/a4-spin","title":"a4 spin","description":"Spin animation: a dense starburst of pink rays radiating from the centre. #animation #loop","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["animation","loop"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":319,"ops":23,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/a4-spin/doc.rc","json":"docs/render/a4-spin/doc.json"}
{"id":"render/ab-eps","title":"ab eps","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":5038,"ops":0,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/ab-eps/doc.rc","json":null}
{"id":"render/ab-ife","title":"ab ife","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":5118,"ops":0,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/ab-ife/doc.rc","json":null}
{"id":"render/al-arith","title":"al arith","description":"Arithmetic check: a green circle whose radius comes from a computed expression. #expressions #validation","source":"rcjson","authoring":[],"apis":["drawCircle","drawRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":237,"ops":17,"width":200,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/al-arith/doc.rc","json":null}
{"id":"render/al-chain","title":"al chain","description":"Chained expressions: a green circle sized by several dependent calculations. #expressions #validation","source":"rcjson","authoring":[],"apis":["drawCircle","drawRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":290,"ops":18,"width":200,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/al-chain/doc.rc","json":null}
{"id":"render/al-plain","title":"al plain","description":"Baseline case: a plain green circle with no expressions, used as the control. #drawCircle #validation","source":"rcjson","authoring":[],"apis":["drawCircle","drawRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["drawcircle","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":196,"ops":16,"width":200,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/al-plain/doc.rc","json":null}
{"id":"render/aliens-loop","title":"aliens loop","description":"Friendly Aliens \u2014 indeterminate loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1941,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/aliens-loop/doc.rc","json":null}
{"id":"render/aliens-progress","title":"aliens progress","description":"Friendly Aliens \u2014 determinate progress loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1757,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/aliens-progress/doc.rc","json":null}
{"id":"render/antarctica-loop","title":"antarctica loop","description":"Antarctica \u2014 indeterminate loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2292,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/antarctica-loop/doc.rc","json":null}
{"id":"render/antarctica-progress","title":"antarctica progress","description":"Antarctica \u2014 determinate progress loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2275,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/antarctica-progress/doc.rc","json":null}
{"id":"render/area-chart","title":"area chart","description":"Area chart: a filled region under a series of y-values. Like a line chart but shaded to the baseline. Use for cumulative/volume-over-time feel.","source":"rcjson","authoring":["json"],"apis":["drawLine","drawPath","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":672,"ops":36,"width":320,"height":240,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/area-chart/doc.rc","json":"docs/render/area-chart/doc.json"}
{"id":"render/area-chart-of-daily-website-visitors-for","title":"area chart of daily website visitors for","description":"area chart of daily website visitors","source":"rcjson","authoring":["json"],"apis":["drawLine","drawPath","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":694,"ops":36,"width":320,"height":240,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/area-chart-of-daily-website-visitors-for/doc.rc","json":"docs/render/area-chart-of-daily-website-visitors-for/doc.json"}
{"id":"render/area-stacked","title":"area stacked","description":"Stacked area chart, traffic by source","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":12755,"ops":613,"width":900,"height":520,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/area-stacked/doc.rc","json":"docs/render/area-stacked/doc.json"}
{"id":"render/arrprobe","title":"arrprobe","description":"probe: does setArrayValue write, and can arrayGet read it back?","source":"rcjson","authoring":[],"apis":["expressions","layout","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":475,"ops":39,"width":400,"height":220,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/arrprobe/doc.rc","json":null}
{"id":"render/asteroids","title":"asteroids","description":"asteroids \u2014 tumbling wireframe rocks","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","expressions","layout","paint","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":20860,"ops":586,"width":480,"height":360,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/asteroids/doc.rc","json":"docs/render/asteroids/doc.json"}
{"id":"render/autumn-loop","title":"autumn loop","description":"Autumn Leaves \u2014 indeterminate loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1957,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/autumn-loop/doc.rc","json":null}
{"id":"render/autumn-progress","title":"autumn progress","description":"Autumn Leaves \u2014 determinate progress loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1773,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/autumn-progress/doc.rc","json":null}
{"id":"render/banner-sf","title":"banner sf","description":"San Francisco banner \u2014 Golden Gate Bridge, Alcatraz, the downtown skyline, Painted Ladies and a cable car, composed to hold from 3:1 to 1:1","source":"rcjson","authoring":[],"apis":["clip","drawCircle","drawPath","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":11472,"ops":282,"width":1200,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/banner-sf/doc.rc","json":null}
{"id":"render/banner-sf-sweep","title":"banner sf sweep","description":"San Francisco banner sweeping its own aspect ratio from 1:1 to 3:1 and back every eight seconds \u2014 the same document as banner_sf.json, reflowing live","source":"rcjson","authoring":[],"apis":["clip","drawCircle","drawPath","drawRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["featured"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":11618,"ops":290,"width":1200,"height":1200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/banner-sf-sweep/doc.rc","json":null}
{"id":"render/bar-horizontal","title":"bar horizontal","description":"Horizontal bar chart: one colored bar per value, growing left-to-right, length proportional to the value. Good for ranked lists / long labels.","source":"rcjson","authoring":["json"],"apis":["conditionals","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":654,"ops":47,"width":320,"height":240,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/bar-horizontal/doc.rc","json":"docs/render/bar-horizontal/doc.json"}
{"id":"render/bar-vertical","title":"bar vertical","description":"Vertical bar chart: one colored bar per value in an array, bar height proportional to the value. Use for comparing quantities across categories.","source":"rcjson","authoring":["json"],"apis":["conditionals","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":694,"ops":49,"width":320,"height":240,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/bar-vertical/doc.rc","json":"docs/render/bar-vertical/doc.json"}
{"id":"render/baseball-loop","title":"baseball loop","description":"Baseball \u2014 indeterminate loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":3522,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/baseball-loop/doc.rc","json":null}
{"id":"render/baseball-progress","title":"baseball progress","description":"Baseball \u2014 determinate progress loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":3338,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/baseball-progress/doc.rc","json":null}
{"id":"render/battery","title":"battery","description":"Battery icon with a charge level (0-100%): outlined body, terminal nub, and a green fill whose width is driven by the percentage.","source":"rcjson","authoring":["json"],"apis":["drawRect","drawRoundRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":316,"ops":21,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/battery/doc.rc","json":"docs/render/battery/doc.json"}
{"id":"render/battery-at-30","title":"battery at 30","description":"Battery indicator at about 30%, green fill inside a white outline. #widget","source":"rcjson","authoring":["json"],"apis":["drawRect","drawRoundRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["widget"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":316,"ops":21,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/battery-at-30/doc.rc","json":"docs/render/battery-at-30/doc.json"}
{"id":"render/battlezone","title":"battlezone","description":"battlezone \u2014 vector world, no tank","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","paint","transforms"],"flags":["animated","expressions"],"tags":["featured"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":13492,"ops":400,"width":480,"height":360,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/battlezone/doc.rc","json":"docs/render/battlezone/doc.json"}
{"id":"render/beach-loop","title":"beach loop","description":"Summer Beach \u2014 indeterminate loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2331,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/beach-loop/doc.rc","json":null}
{"id":"render/beach-progress","title":"beach progress","description":"Summer Beach \u2014 determinate progress loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2147,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/beach-progress/doc.rc","json":null}
{"id":"render/bogus","title":"bogus","description":"unknown canvas command","source":"rcjson","authoring":[],"apis":["drawRect","layout","paint"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":159,"ops":13,"width":360,"height":420,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/bogus/doc.rc","json":null}
{"id":"render/btn-top","title":"btn top","description":"Self-limiting performance probe: ramps path complexity until the frame rate drops below 10 fps, then freezes and reports the limit","source":"rcjson","authoring":[],"apis":["conditionals","drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1345,"ops":98,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/btn-top/doc.rc","json":null}
{"id":"render/bullseye","title":"bullseye","description":"Bullseye/target: concentric alternating-color filled circles. A simple decorative/score graphic.","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","layout","paint"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":285,"ops":23,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/bullseye/doc.rc","json":"docs/render/bullseye/doc.json"}
{"id":"render/c10-grazing-canvas","title":"c10 grazing canvas","description":"C10 grazing textured quad, canvas","source":"rcjson","authoring":["json"],"apis":["drawRect","layout","paint"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":217,"ops":20,"width":320,"height":320,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/c10-grazing-canvas/doc.rc","json":"docs/render/c10-grazing-canvas/doc.json"}
{"id":"render/c10-grazing-software","title":"c10 grazing software","description":"C10 grazing textured quad, software","source":"rcjson","authoring":["json"],"apis":["drawRect","layout","paint"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":219,"ops":20,"width":320,"height":320,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/c10-grazing-software/doc.rc","json":"docs/render/c10-grazing-software/doc.json"}
{"id":"render/canvascomp","title":"canvascomp","description":"component inside canvas","source":"rcjson","authoring":[],"apis":["drawRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":243,"ops":16,"width":360,"height":420,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/canvascomp/doc.rc","json":null}
{"id":"render/catalogue","title":"catalogue","description":"Catalogue index document. Renders blank on its own; it is a container for other entries. #validation","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":["validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":17,"ops":0,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/catalogue/doc.rc","json":null}
{"id":"render/ch-d1","title":"ch d1","description":"Colour check: a green circle on a dark field, variant 1. #drawCircle #validation","source":"rcjson","authoring":[],"apis":["drawCircle","drawRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["drawcircle","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":226,"ops":17,"width":200,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/ch-d1/doc.rc","json":null}
{"id":"render/ch-d2","title":"ch d2","description":"Colour check: a green circle on a dark field, variant 2. #drawCircle #validation","source":"rcjson","authoring":[],"apis":["drawCircle","drawRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["drawcircle","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":247,"ops":18,"width":200,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/ch-d2/doc.rc","json":null}
{"id":"render/ch-d3","title":"ch d3","description":"Colour check: a green circle on a dark field, variant 3. #drawCircle #validation","source":"rcjson","authoring":[],"apis":["drawCircle","drawRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["drawcircle","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":268,"ops":19,"width":200,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/ch-d3/doc.rc","json":null}
{"id":"render/ch-d4","title":"ch d4","description":"Colour check: a green circle on a dark field, variant 4. #drawCircle #validation","source":"rcjson","authoring":[],"apis":["drawCircle","drawRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["drawcircle","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":289,"ops":20,"width":200,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/ch-d4/doc.rc","json":null}
{"id":"render/clamp-probe","title":"clamp probe","description":"probe: clamp argument order and the floor 0/1 flag","source":"rcjson","authoring":[],"apis":["expressions","layout","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":797,"ops":54,"width":400,"height":300,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/clamp-probe/doc.rc","json":null}
{"id":"render/clock-analog","title":"clock analog","description":"Analog clock: a circular face with tick marks and white hour and minute hands that animate via the time variable. Use for clocks/timers.","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":447,"ops":37,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/clock-analog/doc.rc","json":"docs/render/clock-analog/doc.json"}
{"id":"render/clock-with-green-face-min-and-hour-hand","title":"clock with green face min and hour hand","description":"green clock","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","paint","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":364,"ops":29,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/clock-with-green-face-min-and-hour-hand/doc.rc","json":"docs/render/clock-with-green-face-min-and-hour-hand/doc.json"}
{"id":"render/clock-with-green-face-min-and-hour-hand-batch","title":"clock with green face min and hour hand   batch","description":"green clock","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","paint","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":402,"ops":31,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/clock-with-green-face-min-and-hour-hand-batch/doc.rc","json":"docs/render/clock-with-green-face-min-and-hour-hand-batch/doc.json"}
{"id":"render/color-theme-proof","title":"color theme proof","description":"colour-group themed colour: light, dark, adaptive","source":"rcjson","authoring":[],"apis":["layout","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":966,"ops":89,"width":620,"height":300,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/color-theme-proof/doc.rc","json":null}
{"id":"render/colortheme-proof","title":"colortheme proof","description":"themed colour vs named colour references","source":"rcjson","authoring":["json"],"apis":["drawRect","expressions","layout","loop","paint","text","theming"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":958,"ops":62,"width":480,"height":300,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/colortheme-proof/doc.rc","json":"docs/render/colortheme-proof/doc.json"}
{"id":"render/compass-notilt","title":"compass notilt","description":"compass (simulated)","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":5087,"ops":0,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/compass-notilt/doc.rc","json":null}
{"id":"render/compass-sim","title":"compass sim","description":"compass (simulated)","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":5465,"ops":0,"width":480,"height":480,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/compass-sim/doc.rc","json":"docs/render/compass-sim/doc.json"}
{"id":"render/compass-tiltvar","title":"compass tiltvar","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":5030,"ops":0,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/compass-tiltvar/doc.rc","json":null}
{"id":"render/counter","title":"counter","description":"minimal repro: runAction+setValue self-referencing counter","source":"rcjson","authoring":[],"apis":["expressions","layout","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":375,"ops":34,"width":400,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/counter/doc.rc","json":null}
{"id":"render/counter2","title":"counter2","description":"tappable counter","source":"rcjson","authoring":[],"apis":["expressions","layout","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":618,"ops":53,"width":300,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/counter2/doc.rc","json":null}
{"id":"render/cube-3d","title":"cube 3d","description":"Shaded 3D cube, cyan top face and red front, inside a dark circular vignette. #3d","source":"rcjson","authoring":["json"],"apis":["conditionals","drawCircle","drawPath","expressions","layout","paint","transforms"],"flags":["animated","expressions"],"tags":["3d"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2775,"ops":119,"width":400,"height":400,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/cube-3d/doc.rc","json":"docs/render/cube-3d/doc.json"}
{"id":"render/d01-target","title":"d01 target","description":"Archery target: concentric red and white rings with a dark bullseye. #drawCircle","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRoundRect","layout","paint"],"flags":[],"tags":["drawcircle"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":277,"ops":23,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d01-target/doc.rc","json":"docs/render/d01-target/doc.json"}
{"id":"render/d02-barchart","title":"d02 barchart","description":"Bar chart of six bars stepping through red, orange, yellow, green, blue and purple. #graph","source":"rcjson","authoring":["json"],"apis":["drawRoundRect","layout","paint"],"flags":[],"tags":["graph"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":393,"ops":25,"width":320,"height":240,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d02-barchart/doc.rc","json":"docs/render/d02-barchart/doc.json"}
{"id":"render/d03-rings","title":"d03 rings","description":"Five interlocking Olympic-style rings in blue, black, red, yellow and green. #drawCircle","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRoundRect","layout","paint"],"flags":[],"tags":["drawcircle"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":288,"ops":23,"width":400,"height":280,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d03-rings/doc.rc","json":"docs/render/d03-rings/doc.json"}
{"id":"render/d04-traffic","title":"d04 traffic","description":"Traffic light: red, amber and green lamps in a dark housing. #widget","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRoundRect","layout","paint"],"flags":[],"tags":["widget"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":260,"ops":21,"width":160,"height":380,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d04-traffic/doc.rc","json":"docs/render/d04-traffic/doc.json"}
{"id":"render/d05-dotgrid","title":"d05 dotgrid","description":"Grid of coloured dots cycling through a six-hue palette. #loop #drawCircle","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRoundRect","layout","paint"],"flags":[],"tags":["drawcircle","loop"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":891,"ops":63,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d05-dotgrid/doc.rc","json":"docs/render/d05-dotgrid/doc.json"}
{"id":"render/d06-mondrian","title":"d06 mondrian","description":"mondrian","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRoundRect","layout","paint"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":335,"ops":23,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d06-mondrian/doc.rc","json":"docs/render/d06-mondrian/doc.json"}
{"id":"render/d07-crosshair","title":"d07 crosshair","description":"crosshair","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRoundRect","layout","paint"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":252,"ops":19,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d07-crosshair/doc.rc","json":"docs/render/d07-crosshair/doc.json"}
{"id":"render/d08-equalizer","title":"d08 equalizer","description":"Audio equalizer: cyan and green bars of varying height on black. #graph #animation","source":"rcjson","authoring":["json"],"apis":["drawRoundRect","layout","paint"],"flags":[],"tags":["animation","graph"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":475,"ops":29,"width":340,"height":200,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d08-equalizer/doc.rc","json":"docs/render/d08-equalizer/doc.json"}
{"id":"render/d09-house","title":"d09 house","description":"Illustration: a brown house with a pitched roof on green grass under a yellow sun. #drawPath","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRoundRect","layout","paint"],"flags":[],"tags":["drawpath"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":349,"ops":24,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d09-house/doc.rc","json":"docs/render/d09-house/doc.json"}
{"id":"render/d10-constellation","title":"d10 constellation","description":"Constellation map: pale stars joined by faint lines on a midnight field. #drawPath","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRoundRect","layout","paint"],"flags":[],"tags":["drawpath"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":428,"ops":31,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d10-constellation/doc.rc","json":"docs/render/d10-constellation/doc.json"}
{"id":"render/d11-stats","title":"d11 stats","description":"Statistics strip: 128 Users, 94% Uptime and 3.4k Events in blue, green and purple tiles. #widget #layout","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["layout","widget"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":679,"ops":60,"width":480,"height":150,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d11-stats/doc.rc","json":"docs/render/d11-stats/doc.json"}
{"id":"render/d12-profile","title":"d12 profile","description":"Profile card: JD monogram banner above the name Jane Doe, Product Designer. #layout #text","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["layout","text"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":424,"ops":35,"width":300,"height":380,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d12-profile/doc.rc","json":"docs/render/d12-profile/doc.json"}
{"id":"render/d13-buttons","title":"d13 buttons","description":"Button styles stacked: Primary, Success, Danger and Neutral. #layout #widget","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["layout","widget"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":697,"ops":59,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d13-buttons/doc.rc","json":"docs/render/d13-buttons/doc.json"}
{"id":"render/d14-pricing","title":"d14 pricing","description":"Pricing card: PRO PLAN, 29 USD per month, with a short feature list. #layout #text","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["layout","text"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":552,"ops":44,"width":300,"height":420,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d14-pricing/doc.rc","json":"docs/render/d14-pricing/doc.json"}
{"id":"render/d15-notification","title":"d15 notification","description":"Notification banner: New message, tap to read the full details now, with an info badge. #widget #layout","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["layout","widget"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":476,"ops":39,"width":380,"height":120,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d15-notification/doc.rc","json":"docs/render/d15-notification/doc.json"}
{"id":"render/d16-todo","title":"d16 todo","description":"Today's checklist with two items ticked and two still open. #layout #text","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["layout","text"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1262,"ops":111,"width":320,"height":280,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d16-todo/doc.rc","json":"docs/render/d16-todo/doc.json"}
{"id":"render/d17-chips","title":"d17 chips","description":"Colour chips stacked and labelled red, orange, green, blue, purple and teal. #paint #layout","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["layout","paint"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":950,"ops":83,"width":280,"height":360,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d17-chips/doc.rc","json":"docs/render/d17-chips/doc.json"}
{"id":"render/d18-weather","title":"d18 weather","description":"Weather card: San Francisco, 18 degrees, Partly Cloudy, with high and low. #widget","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["widget"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":406,"ops":32,"width":300,"height":320,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d18-weather/doc.rc","json":"docs/render/d18-weather/doc.json"}
{"id":"render/d19-tabs","title":"d19 tabs","description":"Tab bar with Home selected beside Search, Alerts and Profile. #layout #widget","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["layout","widget"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":585,"ops":53,"width":480,"height":72,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d19-tabs/doc.rc","json":"docs/render/d19-tabs/doc.json"}
{"id":"render/d20-progress","title":"d20 progress","description":"progress","source":"rcjson","authoring":["json"],"apis":["drawRoundRect","layout","paint"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":397,"ops":25,"width":320,"height":180,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d20-progress/doc.rc","json":"docs/render/d20-progress/doc.json"}
{"id":"render/d21-spiral","title":"d21 spiral","description":"Phyllotaxis spiral of blue dots growing outward from the centre. #loop #drawCircle","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["drawcircle","loop"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":320,"ops":21,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d21-spiral/doc.rc","json":"docs/render/d21-spiral/doc.json"}
{"id":"render/d22-sine","title":"d22 sine","description":"Sine wave traced as a smooth green curve on black. #expressions #drawPath","source":"rcjson","authoring":["json"],"apis":["drawPath","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["drawpath","expressions"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":299,"ops":22,"width":320,"height":240,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d22-sine/doc.rc","json":"docs/render/d22-sine/doc.json"}
{"id":"render/d23-starburst","title":"d23 starburst","description":"starburst","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":248,"ops":22,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d23-starburst/doc.rc","json":"docs/render/d23-starburst/doc.json"}
{"id":"render/d24-bars","title":"d24 bars","description":"Bar chart with a violet-to-teal gradient across the bars. #graph #paint","source":"rcjson","authoring":["json"],"apis":["drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["graph","paint"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":402,"ops":24,"width":340,"height":240,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d24-bars/doc.rc","json":"docs/render/d24-bars/doc.json"}
{"id":"render/d25-rings","title":"d25 rings","description":"Concentric blue rings drawn as a single continuous spiral. #loop #drawCircle","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["drawcircle","loop"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":221,"ops":19,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d25-rings/doc.rc","json":"docs/render/d25-rings/doc.json"}
{"id":"render/d26-checker","title":"d26 checker","description":"Checkerboard of blue and black squares. #loop #drawRect","source":"rcjson","authoring":["json"],"apis":["conditionals","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["drawrect","loop"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":366,"ops":28,"width":320,"height":320,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d26-checker/doc.rc","json":"docs/render/d26-checker/doc.json"}
{"id":"render/d27-ringdots","title":"d27 ringdots","description":"ringdots","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":277,"ops":20,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d27-ringdots/doc.rc","json":"docs/render/d27-ringdots/doc.json"}
{"id":"render/d28-squares","title":"d28 squares","description":"Rotating square spiral: nested squares turning slightly at each step. #loop #transforms","source":"rcjson","authoring":["json"],"apis":["drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["loop","transforms"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":398,"ops":26,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d28-squares/doc.rc","json":"docs/render/d28-squares/doc.json"}
{"id":"render/d29-grid","title":"d29 grid","description":"Grid of rounded tiles shading from blue through teal to yellow. #loop #paint","source":"rcjson","authoring":["json"],"apis":["drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["loop","paint"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":349,"ops":23,"width":320,"height":320,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d29-grid/doc.rc","json":"docs/render/d29-grid/doc.json"}
{"id":"render/d30-flower","title":"d30 flower","description":"Rose curve drawn as six crimson petals from a polar equation. #expressions #drawPath","source":"rcjson","authoring":["json"],"apis":["drawPath","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["drawpath","expressions"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":443,"ops":24,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d30-flower/doc.rc","json":"docs/render/d30-flower/doc.json"}
{"id":"render/d31-clock","title":"d31 clock","description":"Clock face reduced to its tick marks, with no hands drawn. #clock #loop","source":"rcjson","authoring":["json"],"apis":["conditionals","drawCircle","drawLine","drawRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["clock","loop"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":285,"ops":26,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d31-clock/doc.rc","json":"docs/render/d31-clock/doc.json"}
{"id":"render/d32-wavefield","title":"d32 wavefield","description":"wavefield","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["featured"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":347,"ops":24,"width":320,"height":320,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d32-wavefield/doc.rc","json":"docs/render/d32-wavefield/doc.json"}
{"id":"render/d33-hist","title":"d33 hist","description":"Histogram of amber bars forming a bell-shaped distribution. #graph","source":"rcjson","authoring":["json"],"apis":["drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["graph"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":362,"ops":24,"width":340,"height":220,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d33-hist/doc.rc","json":"docs/render/d33-hist/doc.json"}
{"id":"render/d34-fan","title":"d34 fan","description":"Fan of straight lines sweeping from a corner, fading blue to white. #loop #drawLine","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["drawline","loop"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":263,"ops":19,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d34-fan/doc.rc","json":"docs/render/d34-fan/doc.json"}
{"id":"render/d35-bubbles","title":"d35 bubbles","description":"Cluster of violet circle outlines at many sizes, densest at the centre. #loop #drawCircle","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["drawcircle","loop"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":349,"ops":21,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d35-bubbles/doc.rc","json":"docs/render/d35-bubbles/doc.json"}
{"id":"render/d36-arcs","title":"d36 arcs","description":"Segmented ring of arcs cycling through the full colour wheel. #drawArc #loop","source":"rcjson","authoring":["json"],"apis":["drawArc","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["drawarc","loop"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":380,"ops":23,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d36-arcs/doc.rc","json":"docs/render/d36-arcs/doc.json"}
{"id":"render/d37-spiralsq","title":"d37 spiralsq","description":"spiralsq","source":"rcjson","authoring":["json"],"apis":["drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":399,"ops":26,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d37-spiralsq/doc.rc","json":"docs/render/d37-spiralsq/doc.json"}
{"id":"render/d38-dotwave","title":"d38 dotwave","description":"Travelling wave sampled as green dots along a sine path. #animation #expressions","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["animation","expressions"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":277,"ops":21,"width":320,"height":200,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d38-dotwave/doc.rc","json":"docs/render/d38-dotwave/doc.json"}
{"id":"render/d39-trifan","title":"d39 trifan","description":"Radial fan of orange spokes filling an ellipse. #loop #drawLine","source":"rcjson","authoring":["json"],"apis":["drawPath","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["drawline","loop"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":457,"ops":26,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d39-trifan/doc.rc","json":"docs/render/d39-trifan/doc.json"}
{"id":"render/d40-cards","title":"d40 cards","description":"Statistics tiles: 128 Users, 94% Uptime and 3.4k Events in purple, teal and pink. #widget #layout","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["layout","widget"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":820,"ops":78,"width":480,"height":180,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/d40-cards/doc.rc","json":"docs/render/d40-cards/doc.json"}
{"id":"render/dashboard-card","title":"dashboard card","description":"Crypto Dashboard Card with AGSL Plasma Shader","source":"rcjson","authoring":["json"],"apis":["drawRect","layout","paint","shaders","text"],"flags":["animated","shaders"],"tags":["featured"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1369,"ops":76,"width":380,"height":220,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/dashboard-card/doc.rc","json":"docs/render/dashboard-card/doc.json"}
{"id":"render/dd-10","title":"dd 10","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":["drawRect","expressions","layout","paint","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":239,"ops":18,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-10/doc.rc","json":null}
{"id":"render/dd-100","title":"dd 100","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":["expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":337,"ops":18,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-100/doc.rc","json":null}
{"id":"render/dd-103","title":"dd 103","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":["layout","paint"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":145,"ops":12,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-103/doc.rc","json":null}
{"id":"render/dd-108","title":"dd 108","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":["expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":304,"ops":17,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-108/doc.rc","json":null}
{"id":"render/dd-111","title":"dd 111","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":["layout","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":156,"ops":13,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-111/doc.rc","json":null}
{"id":"render/dd-112","title":"dd 112","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":260,"ops":15,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-112/doc.rc","json":null}
{"id":"render/dd-115","title":"dd 115","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":["layout"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":112,"ops":11,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-115/doc.rc","json":null}
{"id":"render/dd-118","title":"dd 118","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":301,"ops":16,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-118/doc.rc","json":null}
{"id":"render/dd-119","title":"dd 119","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1355,"ops":0,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-119/doc.rc","json":null}
{"id":"render/dd-14","title":"dd 14","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1430,"ops":0,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-14/doc.rc","json":null}
{"id":"render/dd-142","title":"dd 142","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1322,"ops":0,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-142/doc.rc","json":null}
{"id":"render/dd-164","title":"dd 164","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":268,"ops":15,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-164/doc.rc","json":null}
{"id":"render/dd-165","title":"dd 165","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1203,"ops":0,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-165/doc.rc","json":null}
{"id":"render/dd-2","title":"dd 2","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2696,"ops":0,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-2/doc.rc","json":null}
{"id":"render/dd-21","title":"dd 21","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1845,"ops":0,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-21/doc.rc","json":null}
{"id":"render/dd-29","title":"dd 29","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1735,"ops":0,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-29/doc.rc","json":null}
{"id":"render/dd-42","title":"dd 42","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1685,"ops":0,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-42/doc.rc","json":null}
{"id":"render/dd-5","title":"dd 5","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":3919,"ops":0,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-5/doc.rc","json":null}
{"id":"render/dd-55","title":"dd 55","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1635,"ops":0,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-55/doc.rc","json":null}
{"id":"render/dd-68","title":"dd 68","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1416,"ops":0,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-68/doc.rc","json":null}
{"id":"render/dd-8","title":"dd 8","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2718,"ops":0,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-8/doc.rc","json":null}
{"id":"render/dd-80","title":"dd 80","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":["drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":362,"ops":19,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-80/doc.rc","json":null}
{"id":"render/dd-81","title":"dd 81","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1264,"ops":0,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-81/doc.rc","json":null}
{"id":"render/dd-82","title":"dd 82","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1372,"ops":0,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-82/doc.rc","json":null}
{"id":"render/dd-84","title":"dd 84","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":["drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":354,"ops":19,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-84/doc.rc","json":null}
{"id":"render/dd-94","title":"dd 94","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":["drawRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":318,"ops":17,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-94/doc.rc","json":null}
{"id":"render/dd-95","title":"dd 95","description":"compass (sensors)","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1220,"ops":0,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dd-95/doc.rc","json":null}
{"id":"render/demo-json-kt-1","title":"demo json kt 1","description":"Card layout demo, authored in both JSON and Kotlin: a Card Content heading above a solid panel. #layout #text","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","expressions","layout","text"],"flags":["animated","expressions"],"tags":["layout","text"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":645,"ops":48,"width":0,"height":0,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/demo-json-kt-1/doc.rc","json":"docs/render/demo-json-kt-1/doc.json"}
{"id":"render/demo-json-kt-2","title":"demo json kt 2","description":"Dynamic Visuals title card in white on black, authored in both JSON and Kotlin. #text","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRoundRect","expressions","layout","text"],"flags":["animated","expressions"],"tags":["text"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":506,"ops":35,"width":0,"height":0,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/demo-json-kt-2/doc.rc","json":"docs/render/demo-json-kt-2/doc.json"}
{"id":"render/demo-json-kt-3","title":"demo json kt 3","description":"Sparse green line figure, authored in both JSON and Kotlin. #drawLine","source":"rcjson","authoring":["json"],"apis":["drawLine","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["drawline"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2545,"ops":77,"width":0,"height":0,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/demo-json-kt-3/doc.rc","json":"docs/render/demo-json-kt-3/doc.json"}
{"id":"render/dinosaurs-loop","title":"dinosaurs loop","description":"Dinosaurs \u2014 indeterminate loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2105,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dinosaurs-loop/doc.rc","json":null}
{"id":"render/dinosaurs-progress","title":"dinosaurs progress","description":"Dinosaurs \u2014 determinate progress loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2290,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/dinosaurs-progress/doc.rc","json":null}
{"id":"render/disco-ball","title":"disco ball","description":"rotating mirror ball, 326 mirrors","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":16095,"ops":493,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/disco-ball/doc.rc","json":"docs/render/disco-ball/doc.json"}
{"id":"render/disco-ball2","title":"disco ball2","description":"mirror ball, 366 tiles, sweeping lights","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":23534,"ops":794,"width":400,"height":400,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/disco-ball2/doc.rc","json":"docs/render/disco-ball2/doc.json"}
{"id":"render/donut","title":"donut","description":"monthly budget donut chart","source":"rcjson","authoring":[],"apis":["conditionals","drawArc","drawRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":653,"ops":45,"width":300,"height":300,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/donut/doc.rc","json":null}
{"id":"render/donut-chart-of-a-monthly-budget-rent-35","title":"donut chart of a monthly budget rent 35","description":"monthly budget donut chart","source":"rcjson","authoring":["json"],"apis":["conditionals","drawArc","drawRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":651,"ops":45,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/donut-chart-of-a-monthly-budget-rent-35/doc.rc","json":"docs/render/donut-chart-of-a-monthly-budget-rent-35/doc.json"}
{"id":"render/donut-labeled","title":"donut labeled","description":"Donut chart with a big label in the hole (e.g. a total or headline number). Segments sized by a values array. Use for a KPI-with-breakdown.","source":"rcjson","authoring":["json"],"apis":["conditionals","drawArc","drawRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":752,"ops":53,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/donut-labeled/doc.rc","json":"docs/render/donut-labeled/doc.json"}
{"id":"render/donut-percent","title":"donut percent","description":"Donut/pie chart: a ring split into colored segments sized by an array of values (e.g. percentages of a whole). Use for share/proportion/composition.","source":"rcjson","authoring":["json"],"apis":["conditionals","drawArc","drawRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":699,"ops":50,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/donut-percent/doc.rc","json":"docs/render/donut-percent/doc.json"}
{"id":"render/drag-array","title":"drag array","description":"6 circles positioned from a float array and drawn in a loop; touch selects the nearest by index and drags it","source":"rcjson","authoring":[],"apis":["conditionals","drawCircle","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":3151,"ops":113,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/drag-array/doc.rc","json":null}
{"id":"render/drag-circles","title":"drag circles","description":"Four numbered circles; touch picks up the nearest and drags it","source":"rcjson","authoring":[],"apis":["conditionals","drawCircle","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":3704,"ops":194,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/drag-circles/doc.rc","json":null}
{"id":"render/droidman","title":"droidman","description":"droid-man (all)","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":16807,"ops":0,"width":480,"height":360,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/droidman/doc.rc","json":"docs/render/droidman/doc.json"}
{"id":"render/droidman-dots","title":"droidman dots","description":"Maze game board with score and lives, dots laid out along blue corridors. #game","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["game"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":11042,"ops":0,"width":480,"height":360,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/droidman-dots/doc.rc","json":"docs/render/droidman-dots/doc.json"}
{"id":"render/droidman-motion","title":"droidman motion","description":"Maze game board mid-motion, showing the player moving through blue corridors. #game #animation","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["animation","game"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":10299,"ops":0,"width":480,"height":360,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/droidman-motion/doc.rc","json":"docs/render/droidman-motion/doc.json"}
{"id":"render/droidman-oldchips","title":"droidman oldchips","description":"droid-man (all)","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":["featured"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":17379,"ops":0,"width":480,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/droidman-oldchips/doc.rc","json":null}
{"id":"render/droidman-walls","title":"droidman walls","description":"Maze game walls only, the corridor layout without score or dots. #game","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","expressions","layout","paint","transforms"],"flags":["animated","expressions"],"tags":["game"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":6347,"ops":230,"width":480,"height":360,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/droidman-walls/doc.rc","json":"docs/render/droidman-walls/doc.json"}
{"id":"render/e2e-pie","title":"e2e pie","description":"continents population donut","source":"rcjson","authoring":["json"],"apis":["conditionals","drawArc","drawRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":880,"ops":61,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/e2e-pie/doc.rc","json":"docs/render/e2e-pie/doc.json"}
{"id":"render/festival-loop","title":"festival loop","description":"Festival \u2014 indeterminate loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2346,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/festival-loop/doc.rc","json":null}
{"id":"render/festival-progress","title":"festival progress","description":"Festival \u2014 determinate progress loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2162,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/festival-progress/doc.rc","json":null}
{"id":"render/fireworks-loop","title":"fireworks loop","description":"Fireworks \u2014 indeterminate loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2470,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/fireworks-loop/doc.rc","json":null}
{"id":"render/fireworks-progress","title":"fireworks progress","description":"Fireworks \u2014 determinate progress loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2286,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/fireworks-progress/doc.rc","json":null}
{"id":"render/fitness-ring","title":"fitness ring","description":"Fitness Ring Tracker with AGSL Neon Glow Shader","source":"rcjson","authoring":["json"],"apis":["drawRect","layout","paint","shaders","text"],"flags":["animated","shaders"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1455,"ops":80,"width":360,"height":360,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/fitness-ring/doc.rc","json":"docs/render/fitness-ring/doc.json"}
{"id":"render/formula-loop","title":"formula loop","description":"Formula Racing \u2014 indeterminate loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2767,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/formula-loop/doc.rc","json":null}
{"id":"render/formula-progress","title":"formula progress","description":"Formula Racing \u2014 determinate progress loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2666,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/formula-progress/doc.rc","json":null}
{"id":"render/fruit-sales-horizontal-bars-apple-40-ban","title":"fruit sales horizontal bars apple 40 ban","description":"fruit sales bar chart","source":"rcjson","authoring":["json"],"apis":["conditionals","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":501,"ops":35,"width":320,"height":240,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/fruit-sales-horizontal-bars-apple-40-ban/doc.rc","json":"docs/render/fruit-sales-horizontal-bars-apple-40-ban/doc.json"}
{"id":"render/fuji-loop","title":"fuji loop","description":"Mount Fuji \u2014 indeterminate loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1973,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/fuji-loop/doc.rc","json":null}
{"id":"render/fuji-progress","title":"fuji progress","description":"Mount Fuji \u2014 determinate progress loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1789,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/fuji-progress/doc.rc","json":null}
{"id":"render/gantt","title":"gantt","description":"Gantt chart of a project schedule","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","drawRoundRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1877,"ops":88,"width":840,"height":520,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/gantt/doc.rc","json":"docs/render/gantt/doc.json"}
{"id":"render/gauge-value","title":"gauge value","description":"Speedometer/gauge: a 270\u00b0 dial with tick marks and a needle whose angle is driven by a single value (0-100). Use for a single metric vs a scale.","source":"rcjson","authoring":["json"],"apis":["drawArc","drawCircle","drawLine","drawRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":439,"ops":33,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/gauge-value/doc.rc","json":"docs/render/gauge-value/doc.json"}
{"id":"render/gen-bars","title":"gen bars","description":"bar chart","source":"rcjson","authoring":["json"],"apis":["drawRect","layout","paint"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":308,"ops":23,"width":300,"height":200,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/gen-bars/doc.rc","json":"docs/render/gen-bars/doc.json"}
{"id":"render/gen-gauge","title":"gen gauge","description":"speedometer gauge","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","paint","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":291,"ops":22,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/gen-gauge/doc.rc","json":"docs/render/gen-gauge/doc.json"}
{"id":"render/graphs","title":"graphs","description":"Simple Timer","source":"rcjson","authoring":["json"],"apis":["drawLine","drawPath","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2642,"ops":90,"width":500,"height":500,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/graphs/doc.rc","json":"docs/render/graphs/doc.json"}
{"id":"render/grouptheme","title":"grouptheme","description":"group themed colour (ColorTheme op)","source":"rcjson","authoring":[],"apis":["drawRect","paint","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":241,"ops":11,"width":480,"height":260,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/grouptheme/doc.rc","json":null}
{"id":"render/halloween-loop","title":"halloween loop","description":"Halloween \u2014 indeterminate loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":3930,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/halloween-loop/doc.rc","json":null}
{"id":"render/halloween-progress","title":"halloween progress","description":"Halloween \u2014 determinate progress loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":3706,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/halloween-progress/doc.rc","json":null}
{"id":"render/hash","title":"hash","description":"deterministic hash comparison","source":"rcjson","authoring":[],"apis":["drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":564,"ops":30,"width":420,"height":500,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/hash/doc.rc","json":null}
{"id":"render/hash2","title":"hash2","description":"hash candidates","source":"rcjson","authoring":[],"apis":["drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":974,"ops":46,"width":420,"height":788,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/hash2/doc.rc","json":null}
{"id":"render/histogram","title":"histogram","description":"Histogram: adjacent (touching) bars showing a distribution of bin counts from an array. Single color with outlines. Use for frequency/distribution.","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":449,"ops":26,"width":320,"height":240,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/histogram/doc.rc","json":"docs/render/histogram/doc.json"}
{"id":"render/histogram-of-exam-score-distribution-5-2","title":"histogram of exam score distribution 5 2","description":"histogram","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":441,"ops":26,"width":320,"height":240,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/histogram-of-exam-score-distribution-5-2/doc.rc","json":"docs/render/histogram-of-exam-score-distribution-5-2/doc.json"}
{"id":"render/horizontal-bar-chart-of-fruit-sales-appl","title":"horizontal bar chart of fruit sales appl","description":"fruit sales chart","source":"rcjson","authoring":["json"],"apis":["conditionals","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":550,"ops":39,"width":320,"height":240,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/horizontal-bar-chart-of-fruit-sales-appl/doc.rc","json":"docs/render/horizontal-bar-chart-of-fruit-sales-appl/doc.json"}
{"id":"render/iso-bg","title":"iso bg","description":"Isometric background layer. Renders blank on its own; it is composited beneath other scenes. #layout","source":"rcjson","authoring":[],"apis":["layout","text"],"flags":[],"tags":["layout"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":151,"ops":14,"width":200,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/iso-bg/doc.rc","json":null}
{"id":"render/iso-fill-only","title":"iso fill only","description":"Intrinsic sizing probe: fill only. Draws nothing visible; the behaviour under test is measurement. #layout #validation","source":"rcjson","authoring":[],"apis":["layout"],"flags":[],"tags":["layout","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":141,"ops":12,"width":200,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/iso-fill-only/doc.rc","json":null}
{"id":"render/iso-padding","title":"iso padding","description":"Intrinsic sizing probe: padding. Draws nothing visible; the behaviour under test is measurement. #layout #validation","source":"rcjson","authoring":[],"apis":["layout","text"],"flags":[],"tags":["layout","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":173,"ops":15,"width":200,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/iso-padding/doc.rc","json":null}
{"id":"render/iso-tff","title":"iso tff","description":"Intrinsic sizing probe. Draws nothing visible; the behaviour under test is measurement. #layout #validation","source":"rcjson","authoring":[],"apis":["layout","text"],"flags":[],"tags":["layout","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":159,"ops":14,"width":200,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/iso-tff/doc.rc","json":null}
{"id":"render/iso-w-float","title":"iso w float","description":"Intrinsic sizing probe: width as a float. Draws nothing visible; the behaviour under test is measurement. #layout #validation","source":"rcjson","authoring":[],"apis":["layout"],"flags":[],"tags":["layout","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":139,"ops":12,"width":200,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/iso-w-float/doc.rc","json":null}
{"id":"render/iso-w-only","title":"iso w only","description":"Intrinsic sizing probe: width only. Draws nothing visible; the behaviour under test is measurement. #layout #validation","source":"rcjson","authoring":[],"apis":["layout"],"flags":[],"tags":["layout","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":138,"ops":12,"width":200,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/iso-w-only/doc.rc","json":null}
{"id":"render/iso-width","title":"iso width","description":"Intrinsic sizing probe: width. Draws nothing visible; the behaviour under test is measurement. #layout #validation","source":"rcjson","authoring":[],"apis":["layout","text"],"flags":[],"tags":["layout","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":163,"ops":15,"width":200,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/iso-width/doc.rc","json":null}
{"id":"render/j2-130000","title":"j2 130000","description":"Self-limiting performance probe: ramps path complexity until the frame rate drops below 10 fps, then freezes and reports the limit","source":"rcjson","authoring":[],"apis":["conditionals","drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1520,"ops":101,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/j2-130000/doc.rc","json":null}
{"id":"render/j2-3000","title":"j2 3000","description":"Self-limiting performance probe: ramps path complexity until the frame rate drops below 10 fps, then freezes and reports the limit","source":"rcjson","authoring":[],"apis":["conditionals","drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1520,"ops":101,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/j2-3000/doc.rc","json":null}
{"id":"render/j2-30000","title":"j2 30000","description":"Self-limiting performance probe: ramps path complexity until the frame rate drops below 10 fps, then freezes and reports the limit","source":"rcjson","authoring":[],"apis":["conditionals","drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1520,"ops":101,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/j2-30000/doc.rc","json":null}
{"id":"render/j2-400","title":"j2 400","description":"Self-limiting performance probe: ramps path complexity until the frame rate drops below 10 fps, then freezes and reports the limit","source":"rcjson","authoring":[],"apis":["conditionals","drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1520,"ops":101,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/j2-400/doc.rc","json":null}
{"id":"render/jit-3000","title":"jit 3000","description":"Self-limiting performance probe: ramps path complexity until the frame rate drops below 10 fps, then freezes and reports the limit","source":"rcjson","authoring":[],"apis":["conditionals","drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1528,"ops":101,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/jit-3000/doc.rc","json":null}
{"id":"render/jit-30000","title":"jit 30000","description":"Self-limiting performance probe: ramps path complexity until the frame rate drops below 10 fps, then freezes and reports the limit","source":"rcjson","authoring":[],"apis":["conditionals","drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1528,"ops":101,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/jit-30000/doc.rc","json":null}
{"id":"render/jit-400","title":"jit 400","description":"Self-limiting performance probe: ramps path complexity until the frame rate drops below 10 fps, then freezes and reports the limit","source":"rcjson","authoring":[],"apis":["conditionals","drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1528,"ops":101,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/jit-400/doc.rc","json":null}
{"id":"render/jit-64","title":"jit 64","description":"Self-limiting performance probe: ramps path complexity until the frame rate drops below 10 fps, then freezes and reports the limit","source":"rcjson","authoring":[],"apis":["conditionals","drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1528,"ops":101,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/jit-64/doc.rc","json":null}
{"id":"render/latch-p","title":"latch p","description":"probe: does a one-particle system latch across frames?","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":566,"ops":0,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/latch-p/doc.rc","json":null}
{"id":"render/line-chart","title":"line chart","description":"Line chart: a polyline connecting a series of y-values evenly spaced on the x-axis, with a dot at each point. Use for trends/time series.","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":638,"ops":34,"width":320,"height":240,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/line-chart/doc.rc","json":"docs/render/line-chart/doc.json"}
{"id":"render/linear-regression","title":"linear regression","description":"Linear Regression Demo","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawPath","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":3387,"ops":117,"width":500,"height":500,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/linear-regression/doc.rc","json":"docs/render/linear-regression/doc.json"}
{"id":"render/lollipop","title":"lollipop","description":"Lollipop chart: a thin stem plus a dot at the top for each value. A lighter alternative to a bar chart. Use for comparing values across categories.","source":"rcjson","authoring":["json"],"apis":["conditionals","drawCircle","drawLine","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":749,"ops":53,"width":320,"height":240,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/lollipop/doc.rc","json":"docs/render/lollipop/doc.json"}
{"id":"render/lunar-loop","title":"lunar loop","description":"Lunar New Year \u2014 indeterminate loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2442,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/lunar-loop/doc.rc","json":null}
{"id":"render/lunar-progress","title":"lunar progress","description":"Lunar New Year \u2014 determinate progress loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":["featured"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2776,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/lunar-progress/doc.rc","json":null}
{"id":"render/material-toggle-button","title":"material toggle button","description":"Material Button Toggle Example","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":751,"ops":59,"width":400,"height":450,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/material-toggle-button/doc.rc","json":"docs/render/material-toggle-button/doc.json"}
{"id":"render/material-toggle-button-macro","title":"material toggle button macro","description":"Counter card built from a toggle-button macro, showing COUNTER 0. #interaction #widget","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["interaction","widget"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":846,"ops":0,"width":0,"height":0,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/material-toggle-button-macro/doc.rc","json":"docs/render/material-toggle-button-macro/doc.json"}
{"id":"render/maze","title":"maze","description":"pac-man style maze with the bugdroid","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","paint","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":10528,"ops":612,"width":480,"height":360,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/maze/doc.rc","json":"docs/render/maze/doc.json"}
{"id":"render/mondrian","title":"mondrian","description":"Mondrian composition \u2014 recursive subdivision unrolled into a chain of expressions, so the split of every cell is recomputed from the canvas shape","source":"rcjson","authoring":[],"apis":["drawRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":3486,"ops":139,"width":900,"height":600,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/mondrian/doc.rc","json":null}
{"id":"render/monthly-revenue-line-chart-over-six-mont","title":"monthly revenue line chart over six mont","description":"monthly revenue line chart","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":598,"ops":34,"width":320,"height":240,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/monthly-revenue-line-chart-over-six-mont/doc.rc","json":"docs/render/monthly-revenue-line-chart-over-six-mont/doc.json"}
{"id":"render/music-player","title":"music player","description":"Synthwave Music Player with AGSL Waveform Shader","source":"rcjson","authoring":["json"],"apis":["drawRect","layout","paint","shaders","text"],"flags":["animated","shaders"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1980,"ops":126,"width":400,"height":260,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/music-player/doc.rc","json":"docs/render/music-player/doc.json"}
{"id":"render/olympics-loop","title":"olympics loop","description":"Olympics \u2014 indeterminate loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2743,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/olympics-loop/doc.rc","json":null}
{"id":"render/olympics-progress","title":"olympics progress","description":"Olympics \u2014 determinate progress loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2642,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/olympics-progress/doc.rc","json":null}
{"id":"render/p-eq-arrayget","title":"p eq arrayget","description":"arrayGet in an equation","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2359,"ops":0,"width":480,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/p-eq-arrayget/doc.rc","json":null}
{"id":"render/p-eq-lag","title":"p eq lag","description":"does an equation see this frame's siblings","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":317,"ops":0,"width":480,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/p-eq-lag/doc.rc","json":null}
{"id":"render/p-init-arrayget","title":"p init arrayget","description":"arrayGet in an initial value","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2364,"ops":0,"width":480,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/p-init-arrayget/doc.rc","json":null}
{"id":"render/p-init-rand","title":"p init rand","description":"rand() in an initial value","source":"rcjson","authoring":[],"apis":["animation","drawCircle","drawRect","expressions","layout","paint","particles"],"flags":["animated","expressions","particles"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":331,"ops":21,"width":480,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/p-init-rand/doc.rc","json":null}
{"id":"render/p01-new-modifiers","title":"p01 new modifiers","description":"modifiers added in the current parser","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":655,"ops":47,"width":320,"height":320,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/p01-new-modifiers/doc.rc","json":"docs/render/p01-new-modifiers/doc.json"}
{"id":"render/p02-new-draw","title":"p02 new draw","description":"draw ops added in the current parser","source":"rcjson","authoring":["json"],"apis":["drawArc","drawRect","layout","paint"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":395,"ops":25,"width":320,"height":320,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/p02-new-draw/doc.rc","json":"docs/render/p02-new-draw/doc.json"}
{"id":"render/p03-themed-colors","title":"p03 themed colors","description":"themed colours and an exported variable","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","expressions","layout","loop","paint","theming"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":556,"ops":43,"width":320,"height":200,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/p03-themed-colors/doc.rc","json":"docs/render/p03-themed-colors/doc.json"}
{"id":"render/p04-click-actions","title":"p04 click actions","description":"click handlers driving a variable","source":"rcjson","authoring":["json"],"apis":["expressions","layout","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":477,"ops":41,"width":320,"height":220,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/p04-click-actions/doc.rc","json":"docs/render/p04-click-actions/doc.json"}
{"id":"render/p05-path-resource","title":"p05 path resource","description":"paths resource \u2014 regression fixture for the ResourceParser encoding fix","source":"rcjson","authoring":["json"],"apis":["drawPath","drawRect","layout","paint"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":477,"ops":25,"width":220,"height":220,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/p05-path-resource/doc.rc","json":"docs/render/p05-path-resource/doc.json"}
{"id":"render/paths","title":"paths","description":"isolate: svg path vs pathExpression in the CG backend","source":"rcjson","authoring":[],"apis":["drawPath","drawRect","layout","paint"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":437,"ops":24,"width":400,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/paths/doc.rc","json":null}
{"id":"render/perf-double","title":"perf double","description":"Perf probe \u2014 draw count doubles every second","source":"rcjson","authoring":[],"apis":["drawPath","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1578,"ops":116,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/perf-double/doc.rc","json":null}
{"id":"render/perf-double-s10","title":"perf double S10","description":"Perf probe \u2014 draw count doubles every second","source":"rcjson","authoring":[],"apis":["drawPath","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1550,"ops":116,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/perf-double-s10/doc.rc","json":null}
{"id":"render/perf-double-s11","title":"perf double S11","description":"Perf probe \u2014 draw count doubles every second","source":"rcjson","authoring":[],"apis":["drawPath","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1550,"ops":116,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/perf-double-s11/doc.rc","json":null}
{"id":"render/perf-double-s6","title":"perf double S6","description":"Perf probe \u2014 draw count doubles every second","source":"rcjson","authoring":[],"apis":["drawPath","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1550,"ops":116,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/perf-double-s6/doc.rc","json":null}
{"id":"render/perf-double-s7","title":"perf double S7","description":"Perf probe \u2014 draw count doubles every second","source":"rcjson","authoring":[],"apis":["drawPath","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1550,"ops":116,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/perf-double-s7/doc.rc","json":null}
{"id":"render/perf-double-s8","title":"perf double S8","description":"Perf probe \u2014 draw count doubles every second","source":"rcjson","authoring":[],"apis":["drawPath","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1550,"ops":116,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/perf-double-s8/doc.rc","json":null}
{"id":"render/perf-double-s9","title":"perf double S9","description":"Perf probe \u2014 draw count doubles every second","source":"rcjson","authoring":[],"apis":["drawPath","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1550,"ops":116,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/perf-double-s9/doc.rc","json":null}
{"id":"render/perf-limit","title":"perf limit","description":"Self-limiting performance probe: ramps path complexity until the frame rate drops below 10 fps, then freezes and reports the limit","source":"rcjson","authoring":[],"apis":["conditionals","drawCircle","drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1738,"ops":110,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/perf-limit/doc.rc","json":null}
{"id":"render/perf-path","title":"perf path","description":"Perf probe \u2014 path vertex count vs frame rate","source":"rcjson","authoring":[],"apis":["drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1258,"ops":106,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/perf-path/doc.rc","json":null}
{"id":"render/perf-path-l12","title":"perf path L12","description":"Perf probe \u2014 path vertex count vs frame rate","source":"rcjson","authoring":[],"apis":["drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1234,"ops":106,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/perf-path-l12/doc.rc","json":null}
{"id":"render/perf-path-l15","title":"perf path L15","description":"Perf probe \u2014 path vertex count vs frame rate","source":"rcjson","authoring":[],"apis":["drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1234,"ops":106,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/perf-path-l15/doc.rc","json":null}
{"id":"render/perf-path-l3","title":"perf path L3","description":"Perf probe \u2014 path vertex count vs frame rate","source":"rcjson","authoring":[],"apis":["drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1234,"ops":106,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/perf-path-l3/doc.rc","json":null}
{"id":"render/perf-path-l6","title":"perf path L6","description":"Perf probe \u2014 path vertex count vs frame rate","source":"rcjson","authoring":[],"apis":["drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1234,"ops":106,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/perf-path-l6/doc.rc","json":null}
{"id":"render/perf-path-l9","title":"perf path L9","description":"Perf probe \u2014 path vertex count vs frame rate","source":"rcjson","authoring":[],"apis":["drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1234,"ops":106,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/perf-path-l9/doc.rc","json":null}
{"id":"render/perf-text","title":"perf text","description":"Perf probe \u2014 glyph count vs frame rate","source":"rcjson","authoring":[],"apis":["drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1309,"ops":110,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/perf-text/doc.rc","json":null}
{"id":"render/perf-text-l12","title":"perf text L12","description":"Perf probe \u2014 glyph count vs frame rate","source":"rcjson","authoring":[],"apis":["drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1285,"ops":110,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/perf-text-l12/doc.rc","json":null}
{"id":"render/perf-text-l15","title":"perf text L15","description":"Perf probe \u2014 glyph count vs frame rate","source":"rcjson","authoring":[],"apis":["drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1285,"ops":110,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/perf-text-l15/doc.rc","json":null}
{"id":"render/perf-text-l3","title":"perf text L3","description":"Perf probe \u2014 glyph count vs frame rate","source":"rcjson","authoring":[],"apis":["drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1285,"ops":110,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/perf-text-l3/doc.rc","json":null}
{"id":"render/perf-text-l6","title":"perf text L6","description":"Perf probe \u2014 glyph count vs frame rate","source":"rcjson","authoring":[],"apis":["drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1285,"ops":110,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/perf-text-l6/doc.rc","json":null}
{"id":"render/perf-text-l9","title":"perf text L9","description":"Perf probe \u2014 glyph count vs frame rate","source":"rcjson","authoring":[],"apis":["drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1285,"ops":110,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/perf-text-l9/doc.rc","json":null}
{"id":"render/pidx-ctrl","title":"pidx ctrl","description":"control: constant initial value","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":281,"ops":0,"width":400,"height":120,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/pidx-ctrl/doc.rc","json":null}
{"id":"render/pie-chart-of-continents-by-percent-of-wo","title":"pie chart of continents by percent of wo","description":"continents population pie chart","source":"rcjson","authoring":["json"],"apis":["conditionals","drawArc","drawRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":770,"ops":53,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/pie-chart-of-continents-by-percent-of-wo/doc.rc","json":"docs/render/pie-chart-of-continents-by-percent-of-wo/doc.json"}
{"id":"render/pr-arr","title":"pr arr","description":"Particle probe: array-backed initial values. Renders as a plain dark field at rest. #particles #validation","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":["particles","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2392,"ops":0,"width":480,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/pr-arr/doc.rc","json":null}
{"id":"render/pr-arrk","title":"pr arrk","description":"Particle probe: array-backed initial values, keyed variant. Renders as a plain dark field at rest. #particles #validation","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":["particles","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2381,"ops":0,"width":480,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/pr-arrk/doc.rc","json":null}
{"id":"render/pr-rand","title":"pr rand","description":"Particle probe: randomised initial values. Renders as a plain dark field at rest. #particles #validation","source":"rcjson","authoring":[],"apis":["animation","drawCircle","drawRect","expressions","layout","paint","particles"],"flags":["animated","expressions","particles"],"tags":["particles","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":312,"ops":21,"width":480,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/pr-rand/doc.rc","json":null}
{"id":"render/pressure-gauge","title":"pressure gauge","description":"Pressure Gauge with AGSL Energy Plasma Shader","source":"rcjson","authoring":["json"],"apis":["drawRect","layout","paint","shaders","text"],"flags":["animated","shaders"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1395,"ops":80,"width":360,"height":360,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/pressure-gauge/doc.rc","json":"docs/render/pressure-gauge/doc.json"}
{"id":"render/probe","title":"probe","description":"Sakura loading animation","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1323,"ops":0,"width":360,"height":420,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/probe/doc.rc","json":null}
{"id":"render/probe-alpha","title":"probe alpha","description":"can alpha be an expression?","source":"rcjson","authoring":[],"apis":["drawCircle","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":379,"ops":23,"width":400,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/probe-alpha/doc.rc","json":null}
{"id":"render/probe-array","title":"probe array","description":"arrayGet: arg order and computed index","source":"rcjson","authoring":[],"apis":["drawRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":558,"ops":28,"width":400,"height":260,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/probe-array/doc.rc","json":null}
{"id":"render/probe-idx","title":"probe idx","description":"arrayGet with a computed index, all slots","source":"rcjson","authoring":[],"apis":["drawRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":940,"ops":47,"width":400,"height":300,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/probe-idx/doc.rc","json":null}
{"id":"render/probe-multi","title":"probe multi","description":"do multi-particle initial values vary?","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":324,"ops":0,"width":400,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/probe-multi/doc.rc","json":null}
{"id":"render/probe-parr","title":"probe parr","description":"arrayGet inside a particle equation","source":"rcjson","authoring":[],"apis":["animation","drawRect","expressions","layout","paint","particles"],"flags":["animated","expressions","particles"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":451,"ops":28,"width":400,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/probe-parr/doc.rc","json":null}
{"id":"render/probe-path","title":"probe path","description":"probe: does pathExpression count re-sample per frame?","source":"rcjson","authoring":[],"apis":["drawPath","drawRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":416,"ops":23,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/probe-path/doc.rc","json":null}
{"id":"render/progress-ring","title":"progress ring","description":"Progress ring: a circular gauge showing a single percentage (0-100) as a filled arc over a faint track, with the number in the center.","source":"rcjson","authoring":["json"],"apis":["drawArc","drawCircle","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":326,"ops":22,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/progress-ring/doc.rc","json":"docs/render/progress-ring/doc.json"}
{"id":"render/pulse-rings","title":"pulse rings","description":"Pulsing concentric rings animation: rings whose radii breathe over time. A looping ambient/loading animation.","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":281,"ops":19,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/pulse-rings/doc.rc","json":"docs/render/pulse-rings/doc.json"}
{"id":"render/pulsing-concentric-blue-rings-animation","title":"pulsing concentric blue rings animation","description":"pulsing blue rings","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":294,"ops":19,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/pulsing-concentric-blue-rings-animation/doc.rc","json":"docs/render/pulsing-concentric-blue-rings-animation/doc.json"}
{"id":"render/radial-bars","title":"radial bars","description":"Radial/polar bar chart: bars radiating from the center, one per value, length proportional to value, evenly spaced around the circle.","source":"rcjson","authoring":["json"],"apis":["conditionals","drawLine","drawRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":692,"ops":49,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/radial-bars/doc.rc","json":"docs/render/radial-bars/doc.json"}
{"id":"render/rainy-loop","title":"rainy loop","description":"Rainy Season \u2014 indeterminate loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2487,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/rainy-loop/doc.rc","json":null}
{"id":"render/rainy-progress","title":"rainy progress","description":"Rainy Season \u2014 determinate progress loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2303,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/rainy-progress/doc.rc","json":null}
{"id":"render/rc-json-graphs2","title":"rc json graphs2","description":"Simple Timer","source":"rcjson","authoring":["json"],"apis":["drawLine","drawPath","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2650,"ops":90,"width":500,"height":500,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/rc-json-graphs2/doc.rc","json":"docs/render/rc-json-graphs2/doc.json"}
{"id":"render/rc-json-macro-demo","title":"rc json macro demo","description":"Macro Buttons Demo: a heading on an orange-to-green gradient with a placeholder slot. #text #paint","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["paint","text"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1384,"ops":0,"width":0,"height":0,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/rc-json-macro-demo/doc.rc","json":"docs/render/rc-json-macro-demo/doc.json"}
{"id":"render/rc-json-macro-local-demo","title":"rc json macro local demo","description":"Macro-Local State Demo, explaining that each button below keeps its own state. #text #interaction","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["interaction","text"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":999,"ops":0,"width":0,"height":0,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/rc-json-macro-local-demo/doc.rc","json":"docs/render/rc-json-macro-local-demo/doc.json"}
{"id":"render/rc-json-particle-sphere","title":"rc json particle sphere","description":"spinning","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":902,"ops":0,"width":0,"height":0,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/rc-json-particle-sphere/doc.rc","json":"docs/render/rc-json-particle-sphere/doc.json"}
{"id":"render/rc-json-pressure-gauge","title":"rc json pressure gauge","description":"Pressure Gauge","source":"rcjson","authoring":["json"],"apis":["conditionals","drawArc","drawLine","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1915,"ops":77,"width":500,"height":500,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/rc-json-pressure-gauge/doc.rc","json":"docs/render/rc-json-pressure-gauge/doc.json"}
{"id":"render/rc-json-referenced-operations-macro-demo","title":"rc json referenced operations macro demo","description":"Macros with Content Inclusion: a title page for referenced-operation macros. #text","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["text"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1202,"ops":0,"width":0,"height":0,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/rc-json-referenced-operations-macro-demo/doc.rc","json":"docs/render/rc-json-referenced-operations-macro-demo/doc.json"}
{"id":"render/rc-json-style-macro-demo","title":"rc json style macro demo","description":"Modifier Macros (Style Factories): a title page over sample styled buttons. #text #layout","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["layout","text"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":915,"ops":0,"width":0,"height":0,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/rc-json-style-macro-demo/doc.rc","json":"docs/render/rc-json-style-macro-demo/doc.json"}
{"id":"render/ring","title":"ring","description":"Progress ring at 70%, green sweep on a dark track with the value at the centre. #widget #drawArc","source":"rcjson","authoring":[],"apis":["drawArc","drawCircle","drawRect","layout","paint","text"],"flags":[],"tags":["drawarc","widget"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":275,"ops":20,"width":300,"height":300,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/ring/doc.rc","json":null}
{"id":"render/sakura-loop","title":"sakura loop","description":"Sakura \u2014 indeterminate loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2920,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/sakura-loop/doc.rc","json":null}
{"id":"render/sakura-progress","title":"sakura progress","description":"Sakura \u2014 determinate progress loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2916,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/sakura-progress/doc.rc","json":null}
{"id":"render/scatter-plot","title":"scatter plot","description":"Scatter plot: a dot for each (x,y) pair from two parallel arrays. Use for correlation / point clouds.","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":454,"ops":28,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/scatter-plot/doc.rc","json":"docs/render/scatter-plot/doc.json"}
{"id":"render/scroll-h","title":"scroll h","description":"scroll probe: scroll_h","source":"rcjson","authoring":["json"],"apis":["interaction","layout","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1715,"ops":159,"width":600,"height":600,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/scroll-h/doc.rc","json":"docs/render/scroll-h/doc.json"}
{"id":"render/scroll-nested","title":"scroll nested","description":"nested scrollers: the inner one must take the press","source":"rcjson","authoring":["json"],"apis":["interaction","layout","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1912,"ops":169,"width":600,"height":600,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/scroll-nested/doc.rc","json":"docs/render/scroll-nested/doc.json"}
{"id":"render/scroll-notch","title":"scroll notch","description":"scroll probe: scroll_notch","source":"rcjson","authoring":["json"],"apis":["interaction","layout","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1719,"ops":159,"width":600,"height":600,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/scroll-notch/doc.rc","json":"docs/render/scroll-notch/doc.json"}
{"id":"render/scroll-two","title":"scroll two","description":"two independent scrollers: drag must lock to the press","source":"rcjson","authoring":["json"],"apis":["interaction","layout","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":3400,"ops":318,"width":600,"height":600,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/scroll-two/doc.rc","json":"docs/render/scroll-two/doc.json"}
{"id":"render/scroll-v","title":"scroll v","description":"scroll probe: scroll_v","source":"rcjson","authoring":["json"],"apis":["interaction","layout","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1706,"ops":158,"width":600,"height":600,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/scroll-v/doc.rc","json":"docs/render/scroll-v/doc.json"}
{"id":"render/sea-loop","title":"sea loop","description":"Under the Sea \u2014 indeterminate loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2466,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/sea-loop/doc.rc","json":null}
{"id":"render/sea-progress","title":"sea progress","description":"Under the Sea \u2014 determinate progress loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2282,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/sea-progress/doc.rc","json":null}
{"id":"render/seedcross","title":"seedcross","description":"seeded placement, cross-engine","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":439,"ops":0,"width":480,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/seedcross/doc.rc","json":null}
{"id":"render/sens2","title":"sens2","description":"upstream sensor names","source":"rcjson","authoring":[],"apis":["drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1045,"ops":55,"width":420,"height":420,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/sens2/doc.rc","json":null}
{"id":"render/sensors","title":"sensors","description":"sensor smoke test","source":"rcjson","authoring":[],"apis":["drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":629,"ops":34,"width":400,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/sensors/doc.rc","json":null}
{"id":"render/shader-aurora","title":"shader aurora","description":"AGSL Aurora Shader Demo","source":"rcjson","authoring":["json"],"apis":["drawRect","layout","paint","shaders","text"],"flags":["animated","shaders"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1096,"ops":55,"width":500,"height":500,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/shader-aurora/doc.rc","json":"docs/render/shader-aurora/doc.json"}
{"id":"render/shinkansen-loop","title":"shinkansen loop","description":"Shinkansen \u2014 indeterminate loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1789,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/shinkansen-loop/doc.rc","json":null}
{"id":"render/shinkansen-progress","title":"shinkansen progress","description":"Shinkansen \u2014 determinate progress loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1605,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/shinkansen-progress/doc.rc","json":null}
{"id":"render/simplewatch","title":"SimpleWatch","description":"Simple watch \u2014 a blue face with hour and minute hands, in three draw commands","source":"rcjson","authoring":[],"apis":["drawCircle","drawRect","expressions","layout","paint","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":693,"ops":38,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/simplewatch/doc.rc","json":null}
{"id":"render/smart-home-dial","title":"smart home dial","description":"Smart Climate Dial with AGSL Thermal Glow Shader","source":"rcjson","authoring":["json"],"apis":["drawRect","layout","paint","shaders","text"],"flags":["animated","shaders"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1472,"ops":80,"width":360,"height":360,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/smart-home-dial/doc.rc","json":"docs/render/smart-home-dial/doc.json"}
{"id":"render/snowday-loop","title":"snowday loop","description":"Snow Day \u2014 indeterminate loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":4045,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/snowday-loop/doc.rc","json":null}
{"id":"render/snowday-progress","title":"snowday progress","description":"Snow Day \u2014 determinate progress loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2178,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/snowday-progress/doc.rc","json":null}
{"id":"render/space-loop","title":"space loop","description":"Space \u2014 indeterminate loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2708,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/space-loop/doc.rc","json":null}
{"id":"render/space-progress","title":"space progress","description":"Space \u2014 determinate progress loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":["featured"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2607,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/space-progress/doc.rc","json":null}
{"id":"render/sparkline","title":"sparkline","description":"Sparkline: a tiny, axis-free line of a value series, with the last point marked. Use as an inline trend indicator.","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":544,"ops":29,"width":300,"height":120,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/sparkline/doc.rc","json":"docs/render/sparkline/doc.json"}
{"id":"render/spir-130000","title":"spir 130000","description":"Self-limiting performance probe: ramps path complexity until the frame rate drops below 10 fps, then freezes and reports the limit","source":"rcjson","authoring":[],"apis":["conditionals","drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1456,"ops":101,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/spir-130000/doc.rc","json":null}
{"id":"render/spir-16000","title":"spir 16000","description":"Self-limiting performance probe: ramps path complexity until the frame rate drops below 10 fps, then freezes and reports the limit","source":"rcjson","authoring":[],"apis":["conditionals","drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1456,"ops":101,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/spir-16000/doc.rc","json":null}
{"id":"render/spir-2000","title":"spir 2000","description":"Self-limiting performance probe: ramps path complexity until the frame rate drops below 10 fps, then freezes and reports the limit","source":"rcjson","authoring":[],"apis":["conditionals","drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1456,"ops":101,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/spir-2000/doc.rc","json":null}
{"id":"render/spir-256","title":"spir 256","description":"Self-limiting performance probe: ramps path complexity until the frame rate drops below 10 fps, then freezes and reports the limit","source":"rcjson","authoring":[],"apis":["conditionals","drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1456,"ops":101,"width":800,"height":800,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/spir-256/doc.rc","json":null}
{"id":"render/starfield","title":"starfield","description":"starfield \u2014 stars streaming toward the viewer","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":["featured"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2290,"ops":50,"width":480,"height":360,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/starfield/doc.rc","json":"docs/render/starfield/doc.json"}
{"id":"render/stat-card","title":"stat card","description":"KPI/stat card: a big headline number with a label underneath, centered on a card. Use for a single key metric.","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":272,"ops":21,"width":300,"height":200,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/stat-card/doc.rc","json":"docs/render/stat-card/doc.json"}
{"id":"render/stat-value","title":"stat value","description":"A large single numeric statistic (KPI): one big number shown centered with a small caption label underneath \u2014 e.g. a percentage, temperature, heart rate, count, or score. The number uses textFromFloat so it is a formatted numeric value, with a units/label line beneath it.","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":246,"ops":20,"width":320,"height":320,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/stat-value/doc.rc","json":"docs/render/stat-value/doc.json"}
{"id":"render/sunflower-loop","title":"sunflower loop","description":"Sunflowers \u2014 indeterminate loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":["featured"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2031,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/sunflower-loop/doc.rc","json":null}
{"id":"render/sunflower-progress","title":"sunflower progress","description":"Sunflowers \u2014 determinate progress loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1847,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/sunflower-progress/doc.rc","json":null}
{"id":"render/sv-both","title":"sv both","description":"probe: runAction + setValue feedback latch","source":"rcjson","authoring":[],"apis":["drawCircle","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":581,"ops":50,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/sv-both/doc.rc","json":null}
{"id":"render/sv-probe","title":"sv probe","description":"probe: runAction + setValue feedback latch","source":"rcjson","authoring":[],"apis":["drawCircle","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":602,"ops":51,"width":400,"height":400,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/sv-probe/doc.rc","json":null}
{"id":"render/tempest","title":"tempest","description":"tempest \u2014 the tube, enemies climbing","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","expressions","layout","paint","transforms"],"flags":["animated","expressions"],"tags":["featured"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":6251,"ops":225,"width":480,"height":360,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/tempest/doc.rc","json":"docs/render/tempest/doc.json"}
{"id":"render/textured-sphere","title":"textured sphere","description":"textured sphere: bitmap resource + texture3D by name","source":"rcjson","authoring":["json"],"apis":["drawRect","layout","paint"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":236,"ops":20,"width":256,"height":256,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/textured-sphere/doc.rc","json":"docs/render/textured-sphere/doc.json"}
{"id":"render/themesections","title":"themesections","description":"Theme sections: grey panels with a cyan block and a white bar, showing themed regions. #theming #layout","source":"rcjson","authoring":[],"apis":["drawRect","paint","text","theming"],"flags":[],"tags":["layout","theming"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":192,"ops":14,"width":0,"height":0,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/themesections/doc.rc","json":null}
{"id":"render/themetest","title":"themetest","description":"themed colour resolution on cold start","source":"rcjson","authoring":["json"],"apis":["drawRect","expressions","layout","loop","paint","text","theming"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1103,"ops":74,"width":480,"height":620,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/themetest/doc.rc","json":"docs/render/themetest/doc.json"}
{"id":"render/thermo","title":"thermo","description":"thermometer","source":"rcjson","authoring":[],"apis":["drawCircle","drawRect","drawRoundRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":347,"ops":23,"width":300,"height":300,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/thermo/doc.rc","json":null}
{"id":"render/thermometer","title":"thermometer","description":"Thermometer gauge: a vertical tube with a bulb, filled red from the bottom to a level set by a single value. Use for temperature / a 0-100 reading.","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","drawRoundRect","expressions","layout","paint"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":283,"ops":20,"width":300,"height":300,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/thermometer/doc.rc","json":"docs/render/thermometer/doc.json"}
{"id":"render/tiltchain","title":"tiltchain","description":"Expression readout table listing an, z/an, clamp, acos and tilt with their live values. #expressions #validation","source":"rcjson","authoring":[],"apis":["drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":848,"ops":39,"width":420,"height":240,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/tiltchain/doc.rc","json":null}
{"id":"render/touchprobe","title":"touchprobe","description":"touch probe, animated","source":"rcjson","authoring":[],"apis":["drawCircle","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":650,"ops":35,"width":360,"height":420,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/touchprobe/doc.rc","json":null}
{"id":"render/twinkle","title":"twinkle","description":"twinkling night sky","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","paint","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":12317,"ops":370,"width":480,"height":360,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/twinkle/doc.rc","json":"docs/render/twinkle/doc.json"}
{"id":"render/v-after","title":"v after","description":"Variable probe, after state: a green circle sized from the updated value. #expressions #validation","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":314,"ops":0,"width":200,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v-after/doc.rc","json":null}
{"id":"render/v-before","title":"v before","description":"Variable probe, before state: a green circle sized from the original value. #expressions #validation","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":315,"ops":0,"width":200,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v-before/doc.rc","json":null}
{"id":"render/v-lazy","title":"v lazy","description":"is a variable a cache?","source":"rcjson","authoring":[],"apis":["drawCircle","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":399,"ops":25,"width":480,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v-lazy/doc.rc","json":null}
{"id":"render/v2-constvar","title":"v2 constvar","description":"constvar","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":203,"ops":15,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v2-constvar/doc.rc","json":null}
{"id":"render/v2-radius","title":"v2 radius","description":"Variable probe: radius. Draws nothing visible; the behaviour under test is value propagation. #expressions #validation","source":"rcjson","authoring":[],"apis":["drawCircle","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":185,"ops":15,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v2-radius/doc.rc","json":null}
{"id":"render/v2-sensvar","title":"v2 sensvar","description":"Variable probe: sensor-backed variable. Draws nothing visible; the behaviour under test is value propagation. #expressions #sensors #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","sensors","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":189,"ops":14,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v2-sensvar/doc.rc","json":null}
{"id":"render/v2-sysvar","title":"v2 sysvar","description":"Variable probe: system variable. Draws nothing visible; the behaviour under test is value propagation. #expressions #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":201,"ops":15,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v2-sysvar/doc.rc","json":null}
{"id":"render/v2-timevar","title":"v2 timevar","description":"Variable probe: time variable. Draws nothing visible; the behaviour under test is value propagation. #expressions #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":189,"ops":14,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v2-timevar/doc.rc","json":null}
{"id":"render/v2-varonly","title":"v2 varonly","description":"Variable probe: variable declaration only. Draws nothing visible; the behaviour under test is value propagation. #expressions #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":189,"ops":14,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v2-varonly/doc.rc","json":null}
{"id":"render/v3-dupdiff","title":"v3 dupdiff","description":"Variable probe: duplicate names with differing values. Draws nothing visible. #expressions #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":189,"ops":14,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v3-dupdiff/doc.rc","json":null}
{"id":"render/v3-dupsame","title":"v3 dupsame","description":"Variable probe: duplicate names with identical values. Draws nothing visible. #expressions #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":189,"ops":14,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v3-dupsame/doc.rc","json":null}
{"id":"render/v3-duptime","title":"v3 duptime","description":"Variable probe: duplicate time variables. Draws nothing visible. #expressions #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":189,"ops":14,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v3-duptime/doc.rc","json":null}
{"id":"render/v3-dupwidth","title":"v3 dupwidth","description":"dupwidth","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":203,"ops":15,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v3-dupwidth/doc.rc","json":null}
{"id":"render/v3-onesens","title":"v3 onesens","description":"Variable probe: a single sensor variable. Draws nothing visible. #expressions #sensors #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","sensors","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":189,"ops":14,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v3-onesens/doc.rc","json":null}
{"id":"render/v3-triple","title":"v3 triple","description":"Variable probe: three variables at once. Draws nothing visible; the behaviour under test is value propagation. #expressions #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":196,"ops":14,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v3-triple/doc.rc","json":null}
{"id":"render/v4-direct","title":"v4 direct","description":"Expression probe: a value used directly. Draws nothing visible. #expressions #validation","source":"rcjson","authoring":[],"apis":["drawCircle","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":172,"ops":14,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v4-direct/doc.rc","json":null}
{"id":"render/v4-fn-hyp","title":"v4 fn hyp","description":"Expression probe: the hypot function. Draws nothing visible; the behaviour under test is evaluation. #expressions #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":188,"ops":14,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v4-fn-hyp/doc.rc","json":null}
{"id":"render/v4-fn-min","title":"v4 fn min","description":"Expression probe: the min function. Draws nothing visible; the behaviour under test is evaluation. #expressions #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":188,"ops":14,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v4-fn-min/doc.rc","json":null}
{"id":"render/v4-op-add","title":"v4 op add","description":"Expression probe: the add operator. Draws nothing visible; the behaviour under test is evaluation. #expressions #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":188,"ops":14,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v4-op-add/doc.rc","json":null}
{"id":"render/v4-op-mul","title":"v4 op mul","description":"Expression probe: the multiply operator. Draws nothing visible; the behaviour under test is evaluation. #expressions #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":188,"ops":14,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v4-op-mul/doc.rc","json":null}
{"id":"render/v4-sens-c","title":"v4 sens c","description":"Expression probe: a sensor value combined with a constant. Draws nothing visible. #expressions #sensors #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","sensors","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":196,"ops":14,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v4-sens-c/doc.rc","json":null}
{"id":"render/v5-inf","title":"v5 inf","description":"Edge-case probe: infinity as an expression result. Draws nothing visible. #expressions #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":169,"ops":14,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v5-inf/doc.rc","json":null}
{"id":"render/v5-lognegv","title":"v5 lognegv","description":"Edge-case probe: logarithm of a negative value. Draws nothing visible. #expressions #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":177,"ops":14,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v5-lognegv/doc.rc","json":null}
{"id":"render/v5-nanonly","title":"v5 nanonly","description":"Edge-case probe: NaN alone. An amber disc is drawn, showing the document still renders when a value is NaN. #expressions #validation","source":"rcjson","authoring":[],"apis":["drawCircle","layout","paint"],"flags":[],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":140,"ops":13,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v5-nanonly/doc.rc","json":null}
{"id":"render/v5-nanuse","title":"v5 nanuse","description":"Edge-case probe: NaN used in further arithmetic. Draws nothing visible. #expressions #validation","source":"rcjson","authoring":[],"apis":["drawCircle","expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":185,"ops":15,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v5-nanuse/doc.rc","json":null}
{"id":"render/v5-sqrtneg","title":"v5 sqrtneg","description":"Edge-case probe: square root of a negative value. Draws nothing visible. #expressions #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":177,"ops":14,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v5-sqrtneg/doc.rc","json":null}
{"id":"render/v5-zerodiv","title":"v5 zerodiv","description":"Edge-case probe: division by zero. Draws nothing visible. #expressions #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":173,"ops":14,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/v5-zerodiv/doc.rc","json":null}
{"id":"render/var-base","title":"var base","description":"Variable baseline probe. Draws nothing visible; it is the control for the var- series. #expressions #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":247,"ops":15,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/var-base/doc.rc","json":null}
{"id":"render/var-negonly","title":"var negonly","description":"Variable probe: negative values only. Draws nothing visible. #expressions #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":238,"ops":15,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/var-negonly/doc.rc","json":null}
{"id":"render/var-noacos","title":"var noacos","description":"Variable probe: the same chain without acos. Draws nothing visible. #expressions #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":245,"ops":15,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/var-noacos/doc.rc","json":null}
{"id":"render/var-noneg","title":"var noneg","description":"Variable probe: the same chain without negatives. Draws nothing visible. #expressions #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":248,"ops":15,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/var-noneg/doc.rc","json":null}
{"id":"render/var-nosensor","title":"var nosensor","description":"nosensor","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":214,"ops":14,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/var-nosensor/doc.rc","json":null}
{"id":"render/var-plainneg","title":"var plainneg","description":"plainneg","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":202,"ops":14,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/var-plainneg/doc.rc","json":null}
{"id":"render/w-guard","title":"w guard","description":"Guard probe: a clamped expression protected against out-of-range input. Draws nothing visible. #expressions #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":248,"ops":15,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/w-guard/doc.rc","json":null}
{"id":"render/w-unguard","title":"w unguard","description":"Guard probe: the same expression without its clamp, for comparison. Draws nothing visible. #expressions #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":242,"ops":15,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/w-unguard/doc.rc","json":null}
{"id":"render/watch","title":"watch","description":"Watch \u2014 a blue face with hour, minute and second hands, sized to the largest circle that fits the window","source":"rcjson","authoring":[],"apis":["drawCircle","drawRect","drawRoundRect","expressions","layout","loop","paint","text","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1628,"ops":85,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/watch/doc.rc","json":null}
{"id":"render/watchface","title":"watchface","description":"Sleek WatchFace Demo","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","expressions","layout","paint","transforms"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2156,"ops":144,"width":500,"height":500,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/watchface/doc.rc","json":"docs/render/watchface/doc.json"}
{"id":"render/weather-card","title":"weather card","description":"Weather card: a colored card with a city name, a large temperature, and a condition line, centered. Use for a single-location weather summary.","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":331,"ops":26,"width":300,"height":320,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/render/weather-card/doc.rc","json":"docs/render/weather-card/doc.json"}
{"id":"render/weather-widget","title":"weather widget","description":"Weather Card with AGSL Atmosphere Shader","source":"rcjson","authoring":["json"],"apis":["drawRect","layout","paint","shaders","text"],"flags":["animated","shaders"],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1685,"ops":106,"width":380,"height":240,"hasJson":true,"jsonReproduces":"unsupported","src":[],"rc":"docs/render/weather-widget/doc.rc","json":"docs/render/weather-widget/doc.json"}
{"id":"render/worldcup-loop","title":"worldcup loop","description":"World Cup \u2014 indeterminate loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":2076,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/worldcup-loop/doc.rc","json":null}
{"id":"render/worldcup-progress","title":"worldcup progress","description":"World Cup \u2014 determinate progress loading animation with cancel","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T09:50:33-07:00","bytes":1892,"ops":0,"width":360,"height":360,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/worldcup-progress/doc.rc","json":null}
{"id":"render/x-chain","title":"x chain","description":"Expression chain: a darker green circle whose radius comes from several dependent steps. #expressions #drawCircle","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":["drawcircle","expressions"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":300,"ops":0,"width":200,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/x-chain/doc.rc","json":null}
{"id":"render/x-const","title":"x const","description":"Expression control: a green circle sized by a constant, to compare against the chained version. #expressions #drawCircle","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":["drawcircle","expressions"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":279,"ops":0,"width":200,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/x-const/doc.rc","json":null}
{"id":"render/x-sensor","title":"x sensor","description":"Sensor-driven circle, drawn only once the sensor reports a value. #expressions #sensors #validation","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":["expressions","sensors","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":317,"ops":0,"width":200,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/x-sensor/doc.rc","json":null}
{"id":"render/y-after","title":"y after","description":"Ordering probe, after state: the value is read once it has been written. #expressions #validation","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":287,"ops":0,"width":200,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/y-after/doc.rc","json":null}
{"id":"render/y-both","title":"y both","description":"Ordering probe: a value read both before and after it is written. #expressions #validation","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":["expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":307,"ops":0,"width":200,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/y-both/doc.rc","json":null}
{"id":"render/y-split","title":"y split","description":"Ordering probe: the write split from the read, showing a green circle once resolved. #expressions #drawCircle #validation","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":["drawcircle","expressions","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":279,"ops":0,"width":200,"height":200,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/y-split/doc.rc","json":null}
{"id":"render/z-imp","title":"z imp","description":"Impulse probe: an impulse applied. Draws nothing visible at rest. #animation #validation","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":["animation","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":365,"ops":0,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/z-imp/doc.rc","json":null}
{"id":"render/z-impf","title":"z impf","description":"Impulse probe: an impulse with a float parameter. Draws nothing visible at rest. #animation #validation","source":"rcjson","authoring":[],"apis":[],"flags":[],"tags":["animation","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":366,"ops":0,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/z-impf/doc.rc","json":null}
{"id":"render/z-noimp","title":"z noimp","description":"Impulse probe: the control with no impulse applied. Draws nothing visible. #animation #validation","source":"rcjson","authoring":[],"apis":["expressions","layout","paint"],"flags":["animated","expressions"],"tags":["animation","validation"],"addedAt":"2026-09-29T09:50:33-07:00","bytes":248,"ops":15,"width":480,"height":480,"hasJson":false,"jsonReproduces":null,"src":[],"rc":"docs/render/z-noimp/doc.rc","json":null}
{"id":"shapes3d/shapes3d","title":"shapes3d","description":"A gallery of twenty 3D primitives","source":"droidkaigi26","authoring":["json"],"apis":[],"flags":[],"tags":[],"addedAt":"2026-09-29T16:08:26-07:00","bytes":4490,"ops":0,"width":1000,"height":820,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/shapes3d/shapes3d/doc.rc","json":"docs/shapes3d/shapes3d/doc.json"}
{"id":"surface-plot3d/surface-plot3d","title":"surface plot3d","description":"3D surface plot \u2014 drag to orbit","source":"droidkaigi26","authoring":["json","py"],"apis":[],"flags":[],"tags":["featured"],"addedAt":"2026-09-29T16:08:26-07:00","bytes":181995,"ops":0,"width":1000,"height":1000,"hasJson":true,"jsonReproduces":"unsupported","src":["make.py"],"rc":"docs/surface-plot3d/surface-plot3d/doc.rc","json":"docs/surface-plot3d/surface-plot3d/doc.json"}
{"id":"vis-set-01/bio-mb-00001","title":"DNA double helix","description":"Two sugar-phosphate backbones built as stroked paths, antiparallel, with base pairs between them. #biology #dna #path","source":"rcjson","authoring":["json","py"],"apis":["drawLine","drawPath","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T16:46:09+00:00","bytes":4660,"ops":176,"width":360,"height":440,"hasJson":true,"jsonReproduces":"yes","src":["make_set01.py"],"rc":"docs/vis-set-01/bio-mb-00001/doc.rc","json":"docs/vis-set-01/bio-mb-00001/doc.json"}
{"id":"vis-set-01/bio-mb-00002","title":"RNA strand flexing","description":"A single RNA strand whose every base position is a function of time, so the molecule flexes rather than sitting still. #biology #rna #animated","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated"],"addedAt":"2026-10-03T16:46:09+00:00","bytes":3368,"ops":151,"width":420,"height":300,"hasJson":true,"jsonReproduces":"yes","src":["make_set01.py"],"rc":"docs/vis-set-01/bio-mb-00002/doc.rc","json":"docs/vis-set-01/bio-mb-00002/doc.json"}
{"id":"vis-set-01/bio-mb-00003","title":"Replication fork with free nucleotides","description":"A replication fork opening in 3D while a particle pool of ninety free nucleotides drifts around it. #biology #dna #particles #3d #animated","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["3d","animated"],"addedAt":"2026-10-03T16:46:09+00:00","bytes":3681,"ops":0,"width":440,"height":440,"hasJson":true,"jsonReproduces":"yes","src":["make_set01.py"],"rc":"docs/vis-set-01/bio-mb-00003/doc.rc","json":"docs/vis-set-01/bio-mb-00003/doc.json"}
{"id":"vis-set-01/bio-mb-00004","title":"Transcription, by hand","description":"Drag a polymerase along a gene; the mRNA transcript grows behind it and the percentage transcribed updates live. #biology #rna #interactive #input","source":"rcjson","authoring":["json","py"],"apis":["drawLine","drawRect","drawRoundRect","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["input"],"addedAt":"2026-10-03T16:46:09+00:00","bytes":1084,"ops":47,"width":460,"height":300,"hasJson":true,"jsonReproduces":"yes","src":["make_set01.py"],"rc":"docs/vis-set-01/bio-mb-00004/doc.rc","json":"docs/vis-set-01/bio-mb-00004/doc.json"}
{"id":"vis-set-01/chm-ac-00001","title":"Hydrogen, helium, carbon","description":"Three atoms as panels of proton, neutron and electron counts, laid out so the comparison is structural rather than drawn. #chemistry #atoms #layout","source":"rcjson","authoring":["json","py"],"apis":["layout","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T16:46:09+00:00","bytes":2811,"ops":316,"width":520,"height":300,"hasJson":true,"jsonReproduces":"yes","src":["make_set01.py"],"rc":"docs/vis-set-01/chm-ac-00001/doc.rc","json":"docs/vis-set-01/chm-ac-00001/doc.json"}
{"id":"vis-set-01/csc-algo-00001","title":"Insertion sort, pass by pass","description":"One row per pass, placed elements highlighted, so the whole algorithm is visible at once instead of animated and gone. #computing #algorithms #sorting","source":"rcjson","authoring":["json","py"],"apis":["drawRect","drawRoundRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T16:46:09+00:00","bytes":7492,"ops":310,"width":520,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["make_set01.py"],"rc":"docs/vis-set-01/csc-algo-00001/doc.rc","json":"docs/vis-set-01/csc-algo-00001/doc.json"}
{"id":"vis-set-01/ear-geol-00001","title":"Plate motion, ranked","description":"Twelve tectonic plates by speed in centimetres per year, plotted from a float array. The fast ones are oceanic. #earth #tectonics #chart","source":"rcjson","authoring":["json","py"],"apis":["drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-10-03T16:46:09+00:00","bytes":2866,"ops":134,"width":520,"height":340,"hasJson":true,"jsonReproduces":"yes","src":["make_set01.py"],"rc":"docs/vis-set-01/ear-geol-00001/doc.rc","json":"docs/vis-set-01/ear-geol-00001/doc.json"}
{"id":"vis-set-01/eco-micr-00001","title":"Demand as a surface","description":"Quantity demanded over price and income as a single computed mesh with turning 3D axes. Constant elasticity, so the surface curves. #economics #demand #3d #surface #animated","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["3d","animated"],"addedAt":"2026-10-03T16:46:09+00:00","bytes":30528,"ops":0,"width":460,"height":440,"hasJson":true,"jsonReproduces":"yes","src":["make_set01.py"],"rc":"docs/vis-set-01/eco-micr-00001/doc.rc","json":"docs/vis-set-01/eco-micr-00001/doc.json"}
{"id":"vis-set-01/eco-micr-00002","title":"Elastic and inelastic buyers","description":"Each dot is a buyer placed at the most they will pay. A sweeping price line cuts through both populations; the tightly packed elastic band empties at once while the spread inelastic one barely notices. #economics #elasticity #particles #animated","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["animated"],"addedAt":"2026-10-03T16:46:09+00:00","bytes":2729,"ops":0,"width":480,"height":440,"hasJson":true,"jsonReproduces":"yes","src":["make_set01.py"],"rc":"docs/vis-set-01/eco-micr-00002/doc.rc","json":"docs/vis-set-01/eco-micr-00002/doc.json"}
{"id":"vis-set-01/eco-micr-00003","title":"A household budget, reallocated","description":"Drag to change the budget and watch spending shares move between necessities and luxuries. #economics #consumer #interactive #input","source":"rcjson","authoring":["json","py"],"apis":["drawRect","drawRoundRect","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["input"],"addedAt":"2026-10-03T16:46:09+00:00","bytes":1821,"ops":80,"width":460,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["make_set01.py"],"rc":"docs/vis-set-01/eco-micr-00003/doc.rc","json":"docs/vis-set-01/eco-micr-00003/doc.json"}
{"id":"vis-set-01/eco-micr-00004","title":"Four market structures","description":"The same three questions answered four ways, as a typographic table: sellers, product, price power. #economics #competition #text","source":"rcjson","authoring":["json","py"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T16:46:09+00:00","bytes":2126,"ops":97,"width":560,"height":340,"hasJson":true,"jsonReproduces":"yes","src":["make_set01.py"],"rc":"docs/vis-set-01/eco-micr-00004/doc.rc","json":"docs/vis-set-01/eco-micr-00004/doc.json"}
{"id":"vis-set-01/eng-me-00001","title":"Four-bar linkage and its coupler curve","description":"A four-bar linkage frozen at one angle, with the coupler point's full locus traced as a closed path. #engineering #mechanism #path","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawPath","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T16:46:09+00:00","bytes":6223,"ops":231,"width":440,"height":380,"hasJson":true,"jsonReproduces":"yes","src":["make_set01.py"],"rc":"docs/vis-set-01/eng-me-00001/doc.rc","json":"docs/vis-set-01/eng-me-00001/doc.json"}
{"id":"vis-set-01/mth-an-00001","title":"The number line","description":"Integers from -5 to 5 with halves marked and pi placed where it actually falls. A typography document: the labels carry the meaning. #maths #numbers #text","source":"rcjson","authoring":["json","py"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T16:46:09+00:00","bytes":2231,"ops":107,"width":560,"height":220,"hasJson":true,"jsonReproduces":"yes","src":["make_set01.py"],"rc":"docs/vis-set-01/mth-an-00001/doc.rc","json":"docs/vis-set-01/mth-an-00001/doc.json"}
{"id":"vis-set-01/phy-fpp-00001","title":"Standard Model fermions by mass","description":"Twelve fermions on a log mass axis, quarks against leptons, plotted from a float array. The three neutrinos fall below the axis entirely. #physics #particles #chart","source":"rcjson","authoring":["json","py"],"apis":["drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-10-03T16:46:09+00:00","bytes":2565,"ops":118,"width":520,"height":340,"hasJson":true,"jsonReproduces":"yes","src":["make_set01.py"],"rc":"docs/vis-set-01/phy-fpp-00001/doc.rc","json":"docs/vis-set-01/phy-fpp-00001/doc.json"}
{"id":"vis-set-01/phy-fpp-00002","title":"The six quark flavours","description":"A reflowing card layout of the six quark flavours with their electric charges, and a note on gluon colour. Built from layout containers, no canvas. #physics #particles #layout","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":[],"addedAt":"2026-10-03T16:46:09+00:00","bytes":2373,"ops":0,"width":420,"height":420,"hasJson":true,"jsonReproduces":"yes","src":["make_set01.py"],"rc":"docs/vis-set-01/phy-fpp-00002/doc.rc","json":"docs/vis-set-01/phy-fpp-00002/doc.json"}
{"id":"vis-set-01/phy-fpp-00003","title":"Quarks inside a proton","description":"Two up quarks and one down inside the confining volume, each with a wireframe colour-charge halo, joined by gluon bonds drawn as vibrating standing waves. #physics #particles #3d #animated","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["3d","animated"],"addedAt":"2026-10-03T16:46:09+00:00","bytes":6037,"ops":0,"width":420,"height":420,"hasJson":true,"jsonReproduces":"yes","src":["make_set01.py"],"rc":"docs/vis-set-01/phy-fpp-00003/doc.rc","json":"docs/vis-set-01/phy-fpp-00003/doc.json"}
{"id":"vis-set-02/bio-cb-00007","title":"Animal cell into plant cell","description":"Drag across to cross-fade between the two; shared organelles stay put so only the differences move. #biology #cells #interactive #input","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawOval","drawRect","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["input"],"addedAt":"2026-10-03T18:11:18+00:00","bytes":1522,"ops":72,"width":480,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["make_set02.py"],"rc":"docs/vis-set-02/bio-cb-00007/doc.rc","json":"docs/vis-set-02/bio-cb-00007/doc.json"}
{"id":"vis-set-02/bio-cb-00008","title":"Organelles inside a turning cell","description":"A 3D cell with a bitmap-textured nucleus, organelles placed inside it and a wireframe membrane cage. #biology #cells #3d #texture #animated","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["3d","animated"],"addedAt":"2026-10-03T18:11:18+00:00","bytes":15118,"ops":0,"width":460,"height":460,"hasJson":true,"jsonReproduces":"yes","src":["make_set02.py"],"rc":"docs/vis-set-02/bio-cb-00008/doc.rc","json":"docs/vis-set-02/bio-cb-00008/doc.json"}
{"id":"vis-set-02/bio-mb-00005","title":"Translation along the mRNA","description":"A ribosome walking the message codon by codon, the polypeptide growing behind it and tRNA arriving at the A site. Every position is a function of one clock. #biology #rna #animated","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated"],"addedAt":"2026-10-03T18:11:18+00:00","bytes":3761,"ops":141,"width":520,"height":320,"hasJson":true,"jsonReproduces":"yes","src":["make_set02.py"],"rc":"docs/vis-set-02/bio-mb-00005/doc.rc","json":"docs/vis-set-02/bio-mb-00005/doc.json"}
{"id":"vis-set-02/bio-mb-00006","title":"Gene regulation by binding","description":"Transcription factors as a particle cloud; the more tightly they bind, the further transcription rises. #biology #genetics #particles #animated","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["animated"],"addedAt":"2026-10-03T18:11:18+00:00","bytes":1225,"ops":0,"width":480,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["make_set02.py"],"rc":"docs/vis-set-02/bio-mb-00006/doc.rc","json":"docs/vis-set-02/bio-mb-00006/doc.json"}
{"id":"vis-set-02/chm-ac-00002","title":"Atomic radius over the periodic table","description":"The table's grid is already two axes, so the third carries atomic radius. The sawtooth across each period is invisible on a flat table. #chemistry #periodic #3d #chart #animated","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["3d","animated"],"addedAt":"2026-10-03T18:11:18+00:00","bytes":20674,"ops":0,"width":500,"height":460,"hasJson":true,"jsonReproduces":"yes","src":["make_set02.py"],"rc":"docs/vis-set-02/chm-ac-00002/doc.rc","json":"docs/vis-set-02/chm-ac-00002/doc.json"}
{"id":"vis-set-02/csc-algo-00002","title":"Binary search, step by step","description":"Looking for 23 in ten sorted elements, one row of boxes per step, the live window narrowing down the page. #computing #algorithms #search","source":"rcjson","authoring":["json","py"],"apis":["layout","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T18:11:18+00:00","bytes":5442,"ops":580,"width":560,"height":420,"hasJson":true,"jsonReproduces":"yes","src":["make_set02.py"],"rc":"docs/vis-set-02/csc-algo-00002/doc.rc","json":"docs/vis-set-02/csc-algo-00002/doc.json"}
{"id":"vis-set-02/ear-geol-00002","title":"The rock cycle","description":"Igneous, sedimentary and metamorphic joined by curved arrow paths: weathering, heat and pressure, melting. #earth #geology #path","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawPath","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T18:11:18+00:00","bytes":2798,"ops":115,"width":460,"height":440,"hasJson":true,"jsonReproduces":"yes","src":["make_set02.py"],"rc":"docs/vis-set-02/ear-geol-00002/doc.rc","json":"docs/vis-set-02/ear-geol-00002/doc.json"}
{"id":"vis-set-02/eco-macr-00006","title":"GDP as an identity you can push on","description":"C plus I plus G plus NX, with investment under your finger and the total following. #economics #gdp #interactive #input","source":"rcjson","authoring":["json","py"],"apis":["drawRect","drawRoundRect","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["input"],"addedAt":"2026-10-03T18:11:18+00:00","bytes":1855,"ops":78,"width":520,"height":380,"hasJson":true,"jsonReproduces":"yes","src":["make_set02.py"],"rc":"docs/vis-set-02/eco-macr-00006/doc.rc","json":"docs/vis-set-02/eco-macr-00006/doc.json"}
{"id":"vis-set-02/eco-macr-00007","title":"What a basket costs","description":"The same five goods priced across five decades, set as a table with the money column aligned. #economics #inflation #text","source":"rcjson","authoring":["json","py"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T18:11:18+00:00","bytes":3467,"ops":159,"width":580,"height":380,"hasJson":true,"jsonReproduces":"yes","src":["make_set02.py"],"rc":"docs/vis-set-02/eco-macr-00007/doc.rc","json":"docs/vis-set-02/eco-macr-00007/doc.json"}
{"id":"vis-set-02/eco-micr-00005","title":"The same market, split four ways","description":"One ball is one firm and its area is that firm's market share; every panel holds the same total area. Perfect competition to monopoly. #economics #competition #particles #animated","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["animated"],"addedAt":"2026-10-03T18:11:18+00:00","bytes":3149,"ops":0,"width":540,"height":420,"hasJson":true,"jsonReproduces":"yes","src":["make_set02.py"],"rc":"docs/vis-set-02/eco-micr-00005/doc.rc","json":"docs/vis-set-02/eco-micr-00005/doc.json"}
{"id":"vis-set-02/eng-me-00002","title":"Gear ratio, 25 teeth driving 15","description":"Two meshing gears from a single clock: the second angle is the first times the tooth ratio, so they cannot drift out of step. #engineering #gears #animated","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","paint","text","transforms"],"flags":["animated","expressions"],"tags":["animated"],"addedAt":"2026-10-03T18:11:18+00:00","bytes":4559,"ops":297,"width":500,"height":380,"hasJson":true,"jsonReproduces":"yes","src":["make_set02.py"],"rc":"docs/vis-set-02/eng-me-00002/doc.rc","json":"docs/vis-set-02/eng-me-00002/doc.json"}
{"id":"vis-set-02/mth-an-00002","title":"Equivalent fractions","description":"Halves, quarters, sixths and eighths on a shared width, every bar filling to the same line. #maths #fractions #demonstrate","source":"rcjson","authoring":["json","py"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T18:11:18+00:00","bytes":1724,"ops":88,"width":520,"height":340,"hasJson":true,"jsonReproduces":"yes","src":["make_set02.py"],"rc":"docs/vis-set-02/mth-an-00002/doc.rc","json":"docs/vis-set-02/mth-an-00002/doc.json"}
{"id":"vis-set-02/phy-fpp-00004","title":"Fundamental interactions","description":"The four forces on one log axis, with their ranges and carriers. Gravity is 10^38 times weaker than the strong force, which is why its bar is a sliver. #physics #forces #compare","source":"rcjson","authoring":["json","py"],"apis":["drawLine","drawRect","drawRoundRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T18:11:18+00:00","bytes":2111,"ops":93,"width":540,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["make_set02.py"],"rc":"docs/vis-set-02/phy-fpp-00004/doc.rc","json":"docs/vis-set-02/phy-fpp-00004/doc.json"}
{"id":"vis-set-02/phy-fpp-00005","title":"Three Feynman diagrams","description":"Annihilation, scattering and beta decay as cards, each pairing a small canvas with its caption. Time runs left to right. #physics #particles #layout","source":"rcjson","authoring":["json","py"],"apis":["drawArc","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T18:11:18+00:00","bytes":2523,"ops":198,"width":420,"height":470,"hasJson":true,"jsonReproduces":"yes","src":["make_set02.py"],"rc":"docs/vis-set-02/phy-fpp-00005/doc.rc","json":"docs/vis-set-02/phy-fpp-00005/doc.json"}
{"id":"vis-set-02/phy-fpp-00006","title":"Accelerator energy, 1930 to 2030","description":"The Livingston plot: beam energy per machine on a log axis, a factor of ten every six years for seventy years, with bunches circulating alongside. #physics #accelerators #chart #animated","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":["animated"],"addedAt":"2026-10-03T18:11:18+00:00","bytes":2377,"ops":104,"width":560,"height":380,"hasJson":true,"jsonReproduces":"yes","src":["make_set02.py"],"rc":"docs/vis-set-02/phy-fpp-00006/doc.rc","json":"docs/vis-set-02/phy-fpp-00006/doc.json"}
{"id":"vis-set-02/phy-fpp-00007","title":"Decay tracks in a chamber","description":"Four tracks leaving a vertex, curving by charge and momentum, drawn as 2D paths inside a wireframe 3D chamber. #physics #particles #3d #path","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["3d"],"addedAt":"2026-10-03T18:11:18+00:00","bytes":6542,"ops":0,"width":460,"height":460,"hasJson":true,"jsonReproduces":"yes","src":["make_set02.py"],"rc":"docs/vis-set-02/phy-fpp-00007/doc.rc","json":"docs/vis-set-02/phy-fpp-00007/doc.json"}
{"id":"vis-set-03/bio-cb-00009","title":"Across the membrane","description":"Passive and active transport side by side on one clock, so the rates are comparable: down the gradient is free, against it costs ATP. #biology #membrane #animated","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawRect","drawRoundRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated"],"addedAt":"2026-10-03T18:43:26+00:00","bytes":5085,"ops":251,"width":540,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["make_set03.py"],"rc":"docs/vis-set-03/bio-cb-00009/doc.rc","json":"docs/vis-set-03/bio-cb-00009/doc.json"}
{"id":"vis-set-03/bio-cb-00010","title":"Mitosis, four phases","description":"Sixteen chromosomes scattering, lining up on the metaphase plate, then separating to the poles - position encodes the phase. #biology #mitosis #particles #animated","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["animated"],"addedAt":"2026-10-03T18:43:26+00:00","bytes":1602,"ops":0,"width":520,"height":380,"hasJson":true,"jsonReproduces":"yes","src":["make_set03.py"],"rc":"docs/vis-set-03/bio-cb-00010/doc.rc","json":"docs/vis-set-03/bio-cb-00010/doc.json"}
{"id":"vis-set-03/bio-cb-00011","title":"Meiosis, two divisions","description":"Drag to run both divisions: one diploid cell becomes four haploid ones, in 3D so the two splits stay distinguishable. #biology #meiosis #3d #interactive #input","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["3d","input"],"addedAt":"2026-10-03T18:43:26+00:00","bytes":1837,"ops":0,"width":480,"height":480,"hasJson":true,"jsonReproduces":"yes","src":["make_set03.py"],"rc":"docs/vis-set-03/bio-cb-00011/doc.rc","json":"docs/vis-set-03/bio-cb-00011/doc.json"}
{"id":"vis-set-03/bio-cb-00012","title":"Signal amplification","description":"A cascade is a numbers argument, so it is set as a table: one hormone molecule ends up moving ten million enzymes. #biology #signalling #text","source":"rcjson","authoring":["json","py"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T18:43:26+00:00","bytes":2342,"ops":103,"width":560,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["make_set03.py"],"rc":"docs/vis-set-03/bio-cb-00012/doc.rc","json":"docs/vis-set-03/bio-cb-00012/doc.json"}
{"id":"vis-set-03/chm-ac-00003","title":"Why 4s fills before 3d","description":"Subshells in filling order against energy level, with the crossing that puts the transition metals where they are. #chemistry #electrons #chart","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-10-03T18:43:26+00:00","bytes":3326,"ops":147,"width":560,"height":380,"hasJson":true,"jsonReproduces":"yes","src":["make_set03.py"],"rc":"docs/vis-set-03/chm-ac-00003/doc.rc","json":"docs/vis-set-03/chm-ac-00003/doc.json"}
{"id":"vis-set-03/csc-algo-00003","title":"Recursion as nested frames","description":"A recursive factorial where the layout containers ARE the recursion: each box is a call waiting for the one inside it. #computing #recursion #layout","source":"rcjson","authoring":["json","py"],"apis":["layout","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T18:43:26+00:00","bytes":1858,"ops":166,"width":520,"height":440,"hasJson":true,"jsonReproduces":"yes","src":["make_set03.py"],"rc":"docs/vis-set-03/csc-algo-00003/doc.rc","json":"docs/vis-set-03/csc-algo-00003/doc.json"}
{"id":"vis-set-03/ear-geol-00003","title":"Three volcano profiles","description":"Shield, stratovolcano and cinder cone as filled paths on one baseline and one scale - the shapes are the comparison. #earth #volcanoes #path","source":"rcjson","authoring":["json","py"],"apis":["drawLine","drawPath","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T18:43:26+00:00","bytes":6555,"ops":247,"width":560,"height":380,"hasJson":true,"jsonReproduces":"yes","src":["make_set03.py"],"rc":"docs/vis-set-03/ear-geol-00003/doc.rc","json":"docs/vis-set-03/ear-geol-00003/doc.json"}
{"id":"vis-set-03/eng-me-00003","title":"Slider-crank","description":"Rotation in, straight-line motion out. The slider's travel is computed exactly from the rod length, not faked with a sine, which is why a piston dwells longer at one end. #engineering #mechanism #animated","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated"],"addedAt":"2026-10-03T18:43:26+00:00","bytes":1422,"ops":59,"width":540,"height":340,"hasJson":true,"jsonReproduces":"yes","src":["make_set03.py"],"rc":"docs/vis-set-03/eng-me-00003/doc.rc","json":"docs/vis-set-03/eng-me-00003/doc.json"}
{"id":"vis-set-03/fin-mark-00001","title":"A portfolio in three axes","description":"Ninety holdings as a particle scatter by risk, return and sector. Drag to turn it: the rotation is applied to each point before projecting it. #finance #portfolio #3d #interactive #particles #animated #input","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["3d","animated","input"],"addedAt":"2026-10-03T18:43:26+00:00","bytes":2534,"ops":0,"width":500,"height":480,"hasJson":true,"jsonReproduces":"yes","src":["make_set03.py"],"rc":"docs/vis-set-03/fin-mark-00001/doc.rc","json":"docs/vis-set-03/fin-mark-00001/doc.json"}
{"id":"vis-set-03/fin-mark-00002","title":"Price and yield","description":"Drag the yield and watch a bond's price move the other way along the price-yield curve. A 5% coupon pays par only when yields are 5%. #finance #bonds #interactive #input","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawPath","drawRect","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["input"],"addedAt":"2026-10-03T18:43:26+00:00","bytes":3936,"ops":157,"width":520,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["make_set03.py"],"rc":"docs/vis-set-03/fin-mark-00002/doc.rc","json":"docs/vis-set-03/fin-mark-00002/doc.json"}
{"id":"vis-set-03/fin-mark-00003","title":"What one contract is","description":"Six commodity futures with their venues, contract sizes and quoting units - a price move means a different amount of money in each row. #finance #commodities #text","source":"rcjson","authoring":["json","py"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T18:43:26+00:00","bytes":2811,"ops":126,"width":580,"height":380,"hasJson":true,"jsonReproduces":"yes","src":["make_set03.py"],"rc":"docs/vis-set-03/fin-mark-00003/doc.rc","json":"docs/vis-set-03/fin-mark-00003/doc.json"}
{"id":"vis-set-03/mth-an-00003","title":"Primes on a grid","description":"Primes below 576 as towers on a 24 by 24 grid, where the composite gaps fall into diagonal lanes. #maths #primes #3d #animated","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["3d","animated"],"addedAt":"2026-10-03T18:43:26+00:00","bytes":110882,"ops":0,"width":500,"height":460,"hasJson":true,"jsonReproduces":"yes","src":["make_set03.py"],"rc":"docs/vis-set-03/mth-an-00003/doc.rc","json":"docs/vis-set-03/mth-an-00003/doc.json"}
{"id":"vis-set-03/phy-ap-00010","title":"Ionization energy","description":"First ionization energy against atomic number. Peaks are full shells, troughs are the next shell starting - the sawtooth IS the shell structure. #physics #atoms #chart","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-10-03T18:43:26+00:00","bytes":2732,"ops":127,"width":580,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["make_set03.py"],"rc":"docs/vis-set-03/phy-ap-00010/doc.rc","json":"docs/vis-set-03/phy-ap-00010/doc.json"}
{"id":"vis-set-03/phy-ap-00011","title":"s, p and d orbitals","description":"Orbital cross-sections drawn as closed paths rather than approximated by circles. #physics #orbitals #path","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawPath","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T18:43:26+00:00","bytes":9155,"ops":337,"width":540,"height":380,"hasJson":true,"jsonReproduces":"yes","src":["make_set03.py"],"rc":"docs/vis-set-03/phy-ap-00011/doc.rc","json":"docs/vis-set-03/phy-ap-00011/doc.json"}
{"id":"vis-set-03/phy-fpp-00008","title":"Neutrino oscillation","description":"Three flavour probabilities oscillating with distance over energy, always summing to one: a neutrino is never lost, only changed. #physics #neutrinos #chart","source":"rcjson","authoring":["json","py"],"apis":["drawLine","drawPath","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T18:43:26+00:00","bytes":14535,"ops":520,"width":560,"height":360,"hasJson":true,"jsonReproduces":"yes","src":["make_set03.py"],"rc":"docs/vis-set-03/phy-fpp-00008/doc.rc","json":"docs/vis-set-03/phy-fpp-00008/doc.json"}
{"id":"vis-set-03/phy-fpp-00009","title":"The Higgs potential","description":"The Mexican-hat potential as a 3D surface inside a card layout: the centre is a hill, the brim is the ground state, and mass is the cost of moving through the occupied field. #physics #higgs #3d #layout #animated","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["3d","animated"],"addedAt":"2026-10-03T18:43:26+00:00","bytes":41048,"ops":0,"width":460,"height":520,"hasJson":true,"jsonReproduces":"yes","src":["make_set03.py"],"rc":"docs/vis-set-03/phy-fpp-00009/doc.rc","json":"docs/vis-set-03/phy-fpp-00009/doc.json"}
{"id":"vis-set-04/bio-bioc-00014","title":"A protein backbone, folded","description":"46 residues turning in 3D, with helix, loop and strand coloured separately. #biology #proteins #3d #animated","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["3d","animated"],"addedAt":"2026-10-03T20:53:58+00:00","bytes":6542,"ops":0,"width":460,"height":460,"hasJson":true,"jsonReproduces":"yes","src":["make_set04.py"],"rc":"docs/vis-set-04/bio-bioc-00014/doc.rc","json":"docs/vis-set-04/bio-bioc-00014/doc.json"}
{"id":"vis-set-04/bio-bioc-00015","title":"Enzyme saturation","description":"Substrate molecules as particles beside the saturation curve they produce. Doubling the substrate stops helping once every site is busy. #biology #enzymes #particles #animated","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawPath","drawRect","expressions","layout","paint","particles","text"],"flags":["animated","expressions","particles"],"tags":["animated"],"addedAt":"2026-10-03T20:53:58+00:00","bytes":3288,"ops":93,"width":540,"height":420,"hasJson":true,"jsonReproduces":"yes","src":["make_set04.py"],"rc":"docs/vis-set-04/bio-bioc-00015/doc.rc","json":"docs/vis-set-04/bio-bioc-00015/doc.json"}
{"id":"vis-set-04/bio-bioc-00016","title":"What oxygen is worth","description":"Drag the oxygen supply: with it a glucose molecule yields about 32 ATP, without it glycolysis alone yields 2. #biology #metabolism #interactive #input","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["input"],"addedAt":"2026-10-03T20:53:58+00:00","bytes":1911,"ops":82,"width":540,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["make_set04.py"],"rc":"docs/vis-set-04/bio-bioc-00016/doc.rc","json":"docs/vis-set-04/bio-bioc-00016/doc.json"}
{"id":"vis-set-04/bio-cb-00013","title":"The secretory pathway","description":"Vesicles riding curved routes from nucleus to ER to Golgi to membrane, their positions sampled from the same curves that draw the routes. #biology #cells #path #animated","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated"],"addedAt":"2026-10-03T20:53:58+00:00","bytes":6083,"ops":192,"width":520,"height":420,"hasJson":true,"jsonReproduces":"yes","src":["make_set04.py"],"rc":"docs/vis-set-04/bio-cb-00013/doc.rc","json":"docs/vis-set-04/bio-cb-00013/doc.json"}
{"id":"vis-set-04/chm-ms-00004","title":"Molecular shape","description":"Four molecules compared by bond angle and geometry: lone pairs push bonds closer together. #chemistry #molecules #layout","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T20:53:58+00:00","bytes":3702,"ops":322,"width":500,"height":620,"hasJson":true,"jsonReproduces":"yes","src":["make_set04.py"],"rc":"docs/vis-set-04/chm-ms-00004/doc.rc","json":"docs/vis-set-04/chm-ms-00004/doc.json"}
{"id":"vis-set-04/csc-algo-00004","title":"Edit distance, one table","description":"The full dynamic-programming table between kitten and sitting, with the traceback highlighted. The table IS the algorithm. #computing #algorithms #dp","source":"rcjson","authoring":["json","py"],"apis":["drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T20:53:58+00:00","bytes":6206,"ops":293,"width":560,"height":470,"hasJson":true,"jsonReproduces":"yes","src":["make_set04.py"],"rc":"docs/vis-set-04/csc-algo-00004/doc.rc","json":"docs/vis-set-04/csc-algo-00004/doc.json"}
{"id":"vis-set-04/ear-geol-00004","title":"What one point of magnitude costs","description":"Magnitude beside energy released: one step up is about 32 times the energy, and Tohoku released roughly a million times a minor quake. #earth #earthquakes #chart","source":"rcjson","authoring":["json","py"],"apis":["drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-10-03T20:53:58+00:00","bytes":2772,"ops":120,"width":560,"height":420,"hasJson":true,"jsonReproduces":"yes","src":["make_set04.py"],"rc":"docs/vis-set-04/ear-geol-00004/doc.rc","json":"docs/vis-set-04/ear-geol-00004/doc.json"}
{"id":"vis-set-04/eng-me-00004","title":"Four strokes, one cylinder","description":"A four-stroke cycle with the charge firing at top dead centre. Stroke phase is tied to the crank, so the label and the piston cannot disagree. #engineering #engines #3d #animated","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["3d","animated"],"addedAt":"2026-10-03T20:53:58+00:00","bytes":4237,"ops":0,"width":480,"height":476,"hasJson":true,"jsonReproduces":"yes","src":["make_set04.py"],"rc":"docs/vis-set-04/eng-me-00004/doc.rc","json":"docs/vis-set-04/eng-me-00004/doc.json"}
{"id":"vis-set-04/mth-an-00004","title":"One value, four bases","description":"Seven numbers in decimal, binary, octal and hex, with the binary split into nibbles so the grouping is readable. #maths #numbers #text","source":"rcjson","authoring":["json","py"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T20:53:58+00:00","bytes":7552,"ops":358,"width":560,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["make_set04.py"],"rc":"docs/vis-set-04/mth-an-00004/doc.rc","json":"docs/vis-set-04/mth-an-00004/doc.json"}
{"id":"vis-set-04/phy-ap-00012","title":"Hydrogen energy levels","description":"Levels drawn to scale at -13.6/n^2 eV, so they crowd towards zero. Labels are evenly spaced and led to their level, because the crowding is the physics. #physics #atoms","source":"rcjson","authoring":["json","py"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T20:53:58+00:00","bytes":3534,"ops":162,"width":640,"height":430,"hasJson":true,"jsonReproduces":"yes","src":["make_set04.py"],"rc":"docs/vis-set-04/phy-ap-00012/doc.rc","json":"docs/vis-set-04/phy-ap-00012/doc.json"}
{"id":"vis-set-04/phy-ap-00013","title":"Four emission spectra","description":"Hydrogen, helium, sodium and mercury as cards, each with its own strip over the visible range. #physics #spectra #layout","source":"rcjson","authoring":["json","py"],"apis":["drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T20:53:58+00:00","bytes":3418,"ops":282,"width":480,"height":460,"hasJson":true,"jsonReproduces":"yes","src":["make_set04.py"],"rc":"docs/vis-set-04/phy-ap-00013/doc.rc","json":"docs/vis-set-04/phy-ap-00013/doc.json"}
{"id":"vis-set-04/phy-ap-00014","title":"Stripping an atom","description":"Successive ionization energies of magnesium. The jump after the second says magnesium has two outer electrons. #physics #atoms #chart","source":"rcjson","authoring":["json","py"],"apis":["drawLine","drawRect","drawRoundRect","expressions","layout","loop","paint","text"],"flags":["animated","expressions"],"tags":[],"addedAt":"2026-10-03T20:53:58+00:00","bytes":2796,"ops":126,"width":560,"height":380,"hasJson":true,"jsonReproduces":"yes","src":["make_set04.py"],"rc":"docs/vis-set-04/phy-ap-00014/doc.rc","json":"docs/vis-set-04/phy-ap-00014/doc.json"}
{"id":"vis-set-04/soc-soci-00001","title":"How far news travels","description":"A signal spreading through a thirteen-person network, each node labelled by its distance from the source. #society #networks #animated","source":"rcjson","authoring":["json","py"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated"],"addedAt":"2026-10-03T20:53:58+00:00","bytes":4569,"ops":170,"width":480,"height":460,"hasJson":true,"jsonReproduces":"yes","src":["make_set04.py"],"rc":"docs/vis-set-04/soc-soci-00001/doc.rc","json":"docs/vis-set-04/soc-soci-00001/doc.json"}
{"id":"vis-set-04/soc-soci-00002","title":"A pyramid made of people","description":"A population pyramid where every dot is roughly five people in a thousand, by age band and sex. #society #demography #particles #animated","source":"rcjson","authoring":["json","py"],"apis":[],"flags":[],"tags":["animated"],"addedAt":"2026-10-03T20:53:58+00:00","bytes":6814,"ops":0,"width":540,"height":460,"hasJson":true,"jsonReproduces":"yes","src":["make_set04.py"],"rc":"docs/vis-set-04/soc-soci-00002/doc.rc","json":"docs/vis-set-04/soc-soci-00002/doc.json"}
{"id":"vis-set-04/soc-soci-00003","title":"Where you start, where you land","description":"Drag to choose a child's starting income quintile and see where they end up. The top and bottom are stickier than the middle. #society #mobility #interactive #input","source":"rcjson","authoring":["json","py"],"apis":["drawLine","drawRect","drawRoundRect","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["input"],"addedAt":"2026-10-03T20:53:58+00:00","bytes":7317,"ops":253,"width":540,"height":420,"hasJson":true,"jsonReproduces":"yes","src":["make_set04.py"],"rc":"docs/vis-set-04/soc-soci-00003/doc.rc","json":"docs/vis-set-04/soc-soci-00003/doc.json"}
{"id":"vis-set-04/soc-soci-00004","title":"Who gets what","description":"Income decile shares for four countries with their Gini coefficients: in Brazil the richest tenth takes 42.6%, in Slovakia 20.6%. #society #inequality #text","source":"rcjson","authoring":["json","py"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-10-03T20:53:58+00:00","bytes":3377,"ops":170,"width":580,"height":400,"hasJson":true,"jsonReproduces":"yes","src":["make_set04.py"],"rc":"docs/vis-set-04/soc-soci-00004/doc.rc","json":"docs/vis-set-04/soc-soci-00004/doc.json"}
{"id":"vis-set-05/bio-bioc-00017","title":"BIO BIOC 00017","description":"The ATP cycle as a loop, with a phosphate leaving and returning and energy released and absorbed. #animated #biology","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","drawRoundRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated","biology"],"addedAt":"2026-10-03T21:28:18+00:00","bytes":1562,"ops":62,"width":540,"height":400,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-05/bio-bioc-00017/doc.rc","json":"docs/vis-set-05/bio-bioc-00017/doc.json"}
{"id":"vis-set-05/chm-ms-00005","title":"CHM MS 00005","description":"A methane molecule with a bitmap-textured carbon, over a table of the three bond types. #3d #animated #chemistry","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","animated","chemistry"],"addedAt":"2026-10-03T21:28:18+00:00","bytes":10073,"ops":0,"width":480,"height":500,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-05/chm-ms-00005/doc.rc","json":"docs/vis-set-05/chm-ms-00005/doc.json"}
{"id":"vis-set-05/csc-algo-00005","title":"CSC ALGO 00005","description":"A cost landscape with the starting point under your finger, comparing gradient descent against random search. #animated #computing #interactive #particles #input","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["animated","computing","input","interactive","particles"],"addedAt":"2026-10-03T21:28:18+00:00","bytes":5087,"ops":0,"width":560,"height":470,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-05/csc-algo-00005/doc.rc","json":"docs/vis-set-05/csc-algo-00005/doc.json"}
{"id":"vis-set-05/ear-geol-00005","title":"EAR GEOL 00005","description":"Normal, reverse and strike-slip faults drawn on the same four-layer stratigraphy. #earth","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["earth"],"addedAt":"2026-10-03T21:28:18+00:00","bytes":2358,"ops":112,"width":600,"height":420,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-05/ear-geol-00005/doc.rc","json":"docs/vis-set-05/ear-geol-00005/doc.json"}
{"id":"vis-set-05/eco-macr-00008","title":"ECO MACR 00008","description":"Normal, flat and inverted yield curves on one pair of axes. #economics","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawPath","drawRect","layout","paint","text"],"flags":[],"tags":["economics"],"addedAt":"2026-10-03T21:28:18+00:00","bytes":3562,"ops":173,"width":580,"height":440,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-05/eco-macr-00008/doc.rc","json":"docs/vis-set-05/eco-macr-00008/doc.json"}
{"id":"vis-set-05/eco-macr-00009","title":"ECO MACR 00009","description":"The Beveridge curve traced in year order, with the post-2021 outliers marked. #economics","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawPath","drawRect","layout","paint","text"],"flags":[],"tags":["economics"],"addedAt":"2026-10-03T21:28:18+00:00","bytes":2849,"ops":129,"width":560,"height":460,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-05/eco-macr-00009/doc.rc","json":"docs/vis-set-05/eco-macr-00009/doc.json"}
{"id":"vis-set-05/eco-macr-00010","title":"ECO MACR 00010","description":"A policy rate change propagating to output and inflation with their respective lags. #animated #economics","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated","economics"],"addedAt":"2026-10-03T21:28:18+00:00","bytes":2542,"ops":112,"width":580,"height":440,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-05/eco-macr-00010/doc.rc","json":"docs/vis-set-05/eco-macr-00010/doc.json"}
{"id":"vis-set-05/eco-macr-00011","title":"ECO MACR 00011","description":"Two economies receiving the same fiscal injection, with different shares of each pound re-spent. #animated #economics #particles","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","drawRoundRect","layout","paint","particles","text"],"flags":["animated","particles"],"tags":["animated","economics","particles"],"addedAt":"2026-10-03T21:28:18+00:00","bytes":2971,"ops":97,"width":560,"height":440,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-05/eco-macr-00011/doc.rc","json":"docs/vis-set-05/eco-macr-00011/doc.json"}
{"id":"vis-set-05/eng-me-00005","title":"ENG ME 00005","description":"A turning fourteen-blade rotor above the four stages of a gas turbine. #3d #animated #engineering","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","animated","engineering"],"addedAt":"2026-10-03T21:28:18+00:00","bytes":32606,"ops":0,"width":460,"height":560,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-05/eng-me-00005/doc.rc","json":"docs/vis-set-05/eng-me-00005/doc.json"}
{"id":"vis-set-05/med-ha-00001","title":"MED HA 00001","description":"Drag to peel skin, muscle and organs away from the skeleton, as nested 3D shells. #3d #animated #interactive #medicine #input","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","animated","input","interactive","medicine"],"addedAt":"2026-10-03T21:28:18+00:00","bytes":3545,"ops":0,"width":460,"height":520,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-05/med-ha-00001/doc.rc","json":"docs/vis-set-05/med-ha-00001/doc.json"}
{"id":"vis-set-05/med-phys-00002","title":"MED PHYS 00002","description":"A bedside monitor with four vital signs set large and their traces behind them. #animated #medicine","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated","medicine"],"addedAt":"2026-10-03T21:28:18+00:00","bytes":12523,"ops":529,"width":580,"height":420,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-05/med-phys-00002/doc.rc","json":"docs/vis-set-05/med-phys-00002/doc.json"}
{"id":"vis-set-05/mth-alge-00005","title":"MTH ALGE 00005","description":"150 particles placed at their own input and output, tracing a power function as its exponent changes. #animated #maths #particles","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["animated","maths","particles"],"addedAt":"2026-10-03T21:28:18+00:00","bytes":1705,"ops":0,"width":520,"height":460,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-05/mth-alge-00005/doc.rc","json":"docs/vis-set-05/mth-alge-00005/doc.json"}
{"id":"vis-set-05/phy-ap-00015","title":"PHY AP 00015","description":"Four transitions between the same two energy levels, differing only in direction and photon count. #physics","source":"rcjson","authoring":["json"],"apis":["drawArc","drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["physics"],"addedAt":"2026-10-03T21:28:18+00:00","bytes":3691,"ops":163,"width":600,"height":380,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-05/phy-ap-00015/doc.rc","json":"docs/vis-set-05/phy-ap-00015/doc.json"}
{"id":"vis-set-05/phy-np-00016","title":"PHY NP 00016","description":"Three carbon isotopes and a nitrogen nucleus as cards, each drawing its own protons and neutrons. #physics","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","layout","paint","text"],"flags":[],"tags":["physics"],"addedAt":"2026-10-03T21:28:18+00:00","bytes":4241,"ops":370,"width":500,"height":580,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-05/phy-np-00016/doc.rc","json":"docs/vis-set-05/phy-np-00016/doc.json"}
{"id":"vis-set-05/phy-np-00017","title":"PHY NP 00017","description":"The chart of nuclides as 3D towers, with the valley of stability as a visible ridge. #3d #animated #physics","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","animated","physics"],"addedAt":"2026-10-03T21:28:18+00:00","bytes":227710,"ops":0,"width":520,"height":500,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-05/phy-np-00017/doc.rc","json":"docs/vis-set-05/phy-np-00017/doc.json"}
{"id":"vis-set-05/phy-np-00018","title":"PHY NP 00018","description":"Fission fragment tracks above the yield curve, showing the asymmetric double hump. #physics","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawPath","drawRect","layout","paint","text"],"flags":[],"tags":["physics"],"addedAt":"2026-10-03T21:28:18+00:00","bytes":6693,"ops":255,"width":580,"height":460,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-05/phy-np-00018/doc.rc","json":"docs/vis-set-05/phy-np-00018/doc.json"}
{"id":"vis-set-06/bio-bioc-00018","title":"BIO BIOC 00018","description":"Absorption spectra of chlorophyll a and b against the rate of photosynthesis, over the visible band. #biology","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["biology"],"addedAt":"2026-10-03T23:12:57+00:00","bytes":6305,"ops":345,"width":560,"height":420,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-06/bio-bioc-00018/doc.rc","json":"docs/vis-set-06/bio-bioc-00018/doc.json"}
{"id":"vis-set-06/bio-gene-00019","title":"BIO GENE 00019","description":"A Punnett square drawn as paths, with the 3:1 ratio of appearance shown as a clipped bar. #biology","source":"rcjson","authoring":["json"],"apis":["clip","drawPath","drawRect","layout","paint","text"],"flags":[],"tags":["biology"],"addedAt":"2026-10-03T23:12:57+00:00","bytes":2094,"ops":97,"width":480,"height":560,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-06/bio-gene-00019/doc.rc","json":"docs/vis-set-06/bio-gene-00019/doc.json"}
{"id":"vis-set-06/bio-gene-00020","title":"BIO GENE 00020","description":"Mitosis and meiosis animated side by side on one clock, so the halving of chromosome number is visible. #animated #biology","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated","biology"],"addedAt":"2026-10-03T23:12:57+00:00","bytes":5135,"ops":230,"width":580,"height":440,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-06/bio-gene-00020/doc.rc","json":"docs/vis-set-06/bio-gene-00020/doc.json"}
{"id":"vis-set-06/bio-gene-00021","title":"BIO GENE 00021","description":"A rotating DNA helix in 3D with three damaged bases, under a stream of mutagen particles. #3d #animated #biology #particles","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","animated","biology","particles"],"addedAt":"2026-10-03T23:12:57+00:00","bytes":45055,"ops":0,"width":500,"height":580,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-06/bio-gene-00021/doc.rc","json":"docs/vis-set-06/bio-gene-00021/doc.json"}
{"id":"vis-set-06/chm-ms-00006","title":"CHM MS 00006","description":"The molecular orbital diagram of dioxygen, showing the two unpaired electrons that make it paramagnetic. #chemistry","source":"rcjson","authoring":["json"],"apis":["drawArc","drawCircle","drawLine","drawOval","drawRect","layout","paint","text"],"flags":[],"tags":["chemistry"],"addedAt":"2026-10-03T23:12:57+00:00","bytes":3384,"ops":153,"width":520,"height":620,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-06/chm-ms-00006/doc.rc","json":"docs/vis-set-06/chm-ms-00006/doc.json"}
{"id":"vis-set-06/csc-ds-00006","title":"CSC DS 00006","description":"Ten array cells with their addresses, and the index arithmetic drawn beneath the element it selects. #computing","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["computing"],"addedAt":"2026-10-03T23:12:57+00:00","bytes":3744,"ops":175,"width":580,"height":430,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-06/csc-ds-00006/doc.rc","json":"docs/vis-set-06/csc-ds-00006/doc.json"}
{"id":"vis-set-06/ear-geol-00006","title":"EAR GEOL 00006","description":"Four ways mountains form, each with its own cross-section drawn at the same size. #earth","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["earth"],"addedAt":"2026-10-03T23:12:57+00:00","bytes":3024,"ops":0,"width":560,"height":600,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-06/ear-geol-00006/doc.rc","json":"docs/vis-set-06/ear-geol-00006/doc.json"}
{"id":"vis-set-06/eng-me-00006","title":"ENG ME 00006","description":"Two joint angles over a pick-and-place cycle beside the curved path the hand traces. #engineering","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["engineering"],"addedAt":"2026-10-03T23:12:57+00:00","bytes":3777,"ops":193,"width":600,"height":440,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-06/eng-me-00006/doc.rc","json":"docs/vis-set-06/eng-me-00006/doc.json"}
{"id":"vis-set-06/fin-cf-00005","title":"FIN CF 00005","description":"A revenue bridge as 3D blocks growing from zero, with gains and losses on separate faces. #3d #animated #finance","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","animated","finance"],"addedAt":"2026-10-03T23:12:57+00:00","bytes":7484,"ops":0,"width":520,"height":580,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-06/fin-cf-00005/doc.rc","json":"docs/vis-set-06/fin-cf-00005/doc.json"}
{"id":"vis-set-06/fin-cf-00006","title":"FIN CF 00006","description":"Units of sale falling as particles into a fixed cost bucket that never moves and a variable one that does. #animated #finance #particles","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["animated","finance","particles"],"addedAt":"2026-10-03T23:12:57+00:00","bytes":1663,"ops":0,"width":500,"height":560,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-06/fin-cf-00006/doc.rc","json":"docs/vis-set-06/fin-cf-00006/doc.json"}
{"id":"vis-set-06/fin-cf-00007","title":"FIN CF 00007","description":"Drag through a year of monthly profit against the running cash balance, which stays negative until July. #finance #interactive #input","source":"rcjson","authoring":["json"],"apis":["conditionals","drawLine","drawRect","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["finance","input","interactive"],"addedAt":"2026-10-03T23:12:57+00:00","bytes":2803,"ops":131,"width":560,"height":520,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-06/fin-cf-00007/doc.rc","json":"docs/vis-set-06/fin-cf-00007/doc.json"}
{"id":"vis-set-06/fin-mark-00004","title":"FIN MARK 00004","description":"Three currencies against the dollar over a year, each as a filled path from its own zero line. #finance","source":"rcjson","authoring":["json"],"apis":["clip","drawLine","drawPath","drawRect","layout","paint","text"],"flags":[],"tags":["finance"],"addedAt":"2026-10-03T23:12:57+00:00","bytes":3026,"ops":134,"width":580,"height":460,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-06/fin-mark-00004/doc.rc","json":"docs/vis-set-06/fin-mark-00004/doc.json"}
{"id":"vis-set-06/mth-alge-00006","title":"MTH ALGE 00006","description":"Drag to vary c in a quadratic and watch its two roots meet and disappear as the discriminant crosses zero. #interactive #maths #input","source":"rcjson","authoring":["json"],"apis":["conditionals","drawCircle","drawLine","drawRect","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["input","interactive","maths"],"addedAt":"2026-10-03T23:12:57+00:00","bytes":6292,"ops":196,"width":520,"height":560,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-06/mth-alge-00006/doc.rc","json":"docs/vis-set-06/mth-alge-00006/doc.json"}
{"id":"vis-set-06/phy-np-00019","title":"PHY NP 00019","description":"Two nuclei closing in 3D above the Coulomb barrier they must climb to fuse. #3d #animated #physics","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","animated","physics"],"addedAt":"2026-10-03T23:12:57+00:00","bytes":2893,"ops":0,"width":480,"height":600,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-06/phy-np-00019/doc.rc","json":"docs/vis-set-06/phy-np-00019/doc.json"}
{"id":"vis-set-06/phy-np-00020","title":"PHY NP 00020","description":"Five nuclear reactions as cards, their energies on one shared scale. #physics","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["physics"],"addedAt":"2026-10-03T23:12:57+00:00","bytes":4329,"ops":447,"width":460,"height":620,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-06/phy-np-00020/doc.rc","json":"docs/vis-set-06/phy-np-00020/doc.json"}
{"id":"vis-set-06/soc-psyc-00005","title":"SOC PSYC 00005","description":"The memory pipeline as four bars whose widths are what survives each stage, with the losses named. #society","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["society"],"addedAt":"2026-10-03T23:12:57+00:00","bytes":2332,"ops":103,"width":520,"height":580,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-06/soc-psyc-00005/doc.rc","json":"docs/vis-set-06/soc-psyc-00005/doc.json"}
{"id":"vis-set-07/bio-gene-00022","title":"BIO GENE 00022","description":"A polymerase crossing a gene with mRNA and protein accumulating behind it on a shared clock. #animated #biology","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated","biology"],"addedAt":"2026-10-04T02:00:21+00:00","bytes":2463,"ops":116,"width":580,"height":480,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-07/bio-gene-00022/doc.rc","json":"docs/vis-set-07/bio-gene-00022/doc.json"}
{"id":"vis-set-07/chm-ms-00007","title":"CHM MS 00007","description":"Five VSEPR geometries drawn at their true bond angles, with lone pairs shown. #chemistry","source":"rcjson","authoring":["json"],"apis":["drawArc","drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["chemistry"],"addedAt":"2026-10-04T02:00:21+00:00","bytes":3665,"ops":175,"width":600,"height":470,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-07/chm-ms-00007/doc.rc","json":"docs/vis-set-07/chm-ms-00007/doc.json"}
{"id":"vis-set-07/csc-ds-00007","title":"CSC DS 00007","description":"Drag along a seven-node linked list, counting the pointers that must be followed to reach each node. #computing #interactive #input","source":"rcjson","authoring":["json"],"apis":["conditionals","drawLine","drawRect","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["computing","input","interactive"],"addedAt":"2026-10-04T02:00:21+00:00","bytes":2934,"ops":134,"width":600,"height":440,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-07/csc-ds-00007/doc.rc","json":"docs/vis-set-07/csc-ds-00007/doc.json"}
{"id":"vis-set-07/ear-geop-00007","title":"EAR GEOP 00007","description":"The Earth's internal layers at true relative thickness, with the crust called out as a single line. #earth","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["earth"],"addedAt":"2026-10-04T02:00:21+00:00","bytes":2024,"ops":89,"width":520,"height":600,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-07/ear-geop-00007/doc.rc","json":"docs/vis-set-07/ear-geop-00007/doc.json"}
{"id":"vis-set-07/eng-ee-00007","title":"ENG EE 00007","description":"Two 100 ohm resistors in series and in parallel, with the same battery and the arithmetic for each. #engineering","source":"rcjson","authoring":["json"],"apis":["clip","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["engineering"],"addedAt":"2026-10-04T02:00:21+00:00","bytes":2848,"ops":223,"width":560,"height":560,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-07/eng-ee-00007/doc.rc","json":"docs/vis-set-07/eng-ee-00007/doc.json"}
{"id":"vis-set-07/med-dp-00003","title":"MED DP 00003","description":"Tumour burden as a 3D surface over treatment time and the fraction of resistant cells. #3d #animated #medicine","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","animated","medicine"],"addedAt":"2026-10-04T02:00:21+00:00","bytes":48463,"ops":0,"width":540,"height":620,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-07/med-dp-00003/doc.rc","json":"docs/vis-set-07/med-dp-00003/doc.json"}
{"id":"vis-set-07/med-dp-00004","title":"MED DP 00004","description":"Drag to narrow an artery and watch flow fall as the fourth power of the remaining radius. #medicine #input","source":"rcjson","authoring":["json"],"apis":["conditionals","drawPath","drawRect","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["input","medicine"],"addedAt":"2026-10-04T02:00:21+00:00","bytes":8084,"ops":263,"width":580,"height":500,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-07/med-dp-00004/doc.rc","json":"docs/vis-set-07/med-dp-00004/doc.json"}
{"id":"vis-set-07/med-dp-00005","title":"MED DP 00005","description":"Two epidemic curves on one clock, differing only in contact rate, against a fixed hospital capacity. #animated #medicine","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated","medicine"],"addedAt":"2026-10-04T02:00:21+00:00","bytes":3748,"ops":194,"width":580,"height":470,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-07/med-dp-00005/doc.rc","json":"docs/vis-set-07/med-dp-00005/doc.json"}
{"id":"vis-set-07/med-dp-00006","title":"MED DP 00006","description":"A healthy synapse and a degenerating one as particle systems, with only the receiving cell's response differing. #medicine #particles #animated","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["animated","medicine","particles"],"addedAt":"2026-10-04T02:00:21+00:00","bytes":2131,"ops":0,"width":560,"height":520,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-07/med-dp-00006/doc.rc","json":"docs/vis-set-07/med-dp-00006/doc.json"}
{"id":"vis-set-07/mth-alge-00007","title":"MTH ALGE 00007","description":"Particles settling into the minima of a quintic, with its roots marked separately on the axis. #maths #particles #animated","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["animated","maths","particles"],"addedAt":"2026-10-04T02:00:21+00:00","bytes":3124,"ops":0,"width":560,"height":460,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-07/mth-alge-00007/doc.rc","json":"docs/vis-set-07/mth-alge-00007/doc.json"}
{"id":"vis-set-07/phy-qm-00021","title":"PHY QM 00021","description":"Four standing-wave states of a particle in a box, each with its probability density beneath it. #physics","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["physics"],"addedAt":"2026-10-04T02:00:21+00:00","bytes":18097,"ops":799,"width":620,"height":460,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-07/phy-qm-00021/doc.rc","json":"docs/vis-set-07/phy-qm-00021/doc.json"}
{"id":"vis-set-07/phy-qm-00022","title":"PHY QM 00022","description":"Four probability distributions as cards, each with the kind of question it answers. #physics","source":"rcjson","authoring":["json"],"apis":["clip","drawRect","layout","paint","text"],"flags":[],"tags":["physics"],"addedAt":"2026-10-04T02:00:21+00:00","bytes":3922,"ops":332,"width":500,"height":640,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-07/phy-qm-00022/doc.rc","json":"docs/vis-set-07/phy-qm-00022/doc.json"}
{"id":"vis-set-07/phy-qm-00023","title":"PHY QM 00023","description":"Transmission probability against barrier width on a log axis, for an electron, a proton and an alpha particle. #physics","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["physics"],"addedAt":"2026-10-04T02:00:21+00:00","bytes":3266,"ops":159,"width":580,"height":470,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-07/phy-qm-00023/doc.rc","json":"docs/vis-set-07/phy-qm-00023/doc.json"}
{"id":"vis-set-07/phy-qm-00024","title":"PHY QM 00024","description":"Two slits and a screen in 3D, with the interference pattern drawn as a filled path beneath. #3d #particles #physics #input #animated","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","animated","input","particles","physics"],"addedAt":"2026-10-04T02:00:21+00:00","bytes":9157,"ops":0,"width":520,"height":620,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-07/phy-qm-00024/doc.rc","json":"docs/vis-set-07/phy-qm-00024/doc.json"}
{"id":"vis-set-07/soc-psyc-00006","title":"SOC PSYC 00006","description":"A forgetting curve against the same curve with one review on day seven, draggable through a month. #interactive #society #input","source":"rcjson","authoring":["json"],"apis":["conditionals","drawLine","drawRect","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["input","interactive","society"],"addedAt":"2026-10-04T02:00:21+00:00","bytes":4061,"ops":206,"width":580,"height":500,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-07/soc-psyc-00006/doc.rc","json":"docs/vis-set-07/soc-psyc-00006/doc.json"}
{"id":"vis-set-07/soc-psyc-00007","title":"SOC PSYC 00007","description":"Two cubes at different distances and sizes on a ground plane, with the depth cues that disambiguate them. #3d #society","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","society"],"addedAt":"2026-10-04T02:00:21+00:00","bytes":4729,"ops":0,"width":520,"height":600,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-07/soc-psyc-00007/doc.rc","json":"docs/vis-set-07/soc-psyc-00007/doc.json"}
{"id":"vis-set-08/bio-gene-00023","title":"BIO GENE 00023","description":"Allele frequency drifting in four populations of different size, with no selection acting. #biology","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["biology"],"addedAt":"2026-10-04T06:25:04+00:00","bytes":5432,"ops":287,"width":600,"height":470,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-08/bio-gene-00023/doc.rc","json":"docs/vis-set-08/bio-gene-00023/doc.json"}
{"id":"vis-set-08/cal-globe-00001","title":"CAL GLOBE 00001","description":"A graticule and six coastal landmarks drawn by latitude and longitude over the Blue Marble texture, to check that the two agree. #3d #input","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","input"],"addedAt":"2026-10-04T06:25:04+00:00","bytes":123841,"ops":0,"width":560,"height":720,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-08/cal-globe-00001/doc.rc","json":"docs/vis-set-08/cal-globe-00001/doc.json"}
{"id":"vis-set-08/chm-ms-00008","title":"CHM MS 00008","description":"Polar molecules aligning in a field beside non-polar ones that keep tumbling. #chemistry #particles #animated","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["animated","chemistry","particles"],"addedAt":"2026-10-04T06:25:04+00:00","bytes":2294,"ops":0,"width":560,"height":520,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-08/chm-ms-00008/doc.rc","json":"docs/vis-set-08/chm-ms-00008/doc.json"}
{"id":"vis-set-08/csc-ds-00008","title":"CSC DS 00008","description":"A search descending a binary tree one level at a time, halving what remains at each step. #animated #computing","source":"rcjson","authoring":["json"],"apis":["conditionals","drawCircle","drawLine","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated","computing"],"addedAt":"2026-10-04T06:25:04+00:00","bytes":5178,"ops":283,"width":600,"height":470,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-08/csc-ds-00008/doc.rc","json":"docs/vis-set-08/csc-ds-00008/doc.json"}
{"id":"vis-set-08/ear-geop-00008","title":"EAR GEOP 00008","description":"Drag to send P and S rays through a wireframe Earth, with the S rays dying at the liquid outer core. #3d #earth #interactive #input","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","earth","input","interactive"],"addedAt":"2026-10-04T06:25:04+00:00","bytes":141854,"ops":0,"width":520,"height":640,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-08/ear-geop-00008/doc.rc","json":"docs/vis-set-08/ear-geop-00008/doc.json"}
{"id":"vis-set-08/eco-ie-00012","title":"ECO IE 00012","description":"Four major trade corridors as arcs over a slowly turning globe. #3d #animated #economics","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","animated","economics"],"addedAt":"2026-10-04T06:25:04+00:00","bytes":50764,"ops":0,"width":540,"height":620,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-08/eco-ie-00012/doc.rc","json":"docs/vis-set-08/eco-ie-00012/doc.json"}
{"id":"vis-set-08/eco-ie-00013","title":"ECO IE 00013","description":"The four effects of a tariff as stacked bars on one scale, with the net result. #economics","source":"rcjson","authoring":["json"],"apis":["layout","text"],"flags":[],"tags":["economics"],"addedAt":"2026-10-04T06:25:04+00:00","bytes":3421,"ops":307,"width":500,"height":620,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-08/eco-ie-00013/doc.rc","json":"docs/vis-set-08/eco-ie-00013/doc.json"}
{"id":"vis-set-08/eco-ie-00014","title":"ECO IE 00014","description":"Trade and capital flows plotted above the exchange rate they produce, with the crossings marked. #economics","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["economics"],"addedAt":"2026-10-04T06:25:04+00:00","bytes":3100,"ops":157,"width":600,"height":470,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-08/eco-ie-00014/doc.rc","json":"docs/vis-set-08/eco-ie-00014/doc.json"}
{"id":"vis-set-08/eco-ie-00015","title":"ECO IE 00015","description":"The current and capital accounts as mirrored filled paths, showing they sum to zero by construction. #economics","source":"rcjson","authoring":["json"],"apis":["drawLine","drawPath","drawRect","layout","paint","text"],"flags":[],"tags":["economics"],"addedAt":"2026-10-04T06:25:04+00:00","bytes":3308,"ops":128,"width":600,"height":480,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-08/eco-ie-00015/doc.rc","json":"docs/vis-set-08/eco-ie-00015/doc.json"}
{"id":"vis-set-08/eng-ee-00008","title":"ENG EE 00008","description":"A transistor transfer curve with its cut-off, active and saturation regions marked. #engineering","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["engineering"],"addedAt":"2026-10-04T06:25:04+00:00","bytes":2698,"ops":132,"width":600,"height":460,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-08/eng-ee-00008/doc.rc","json":"docs/vis-set-08/eng-ee-00008/doc.json"}
{"id":"vis-set-08/his-ac-00002","title":"HIS AC 00002","description":"Four ancient civilisations as 3D columns whose heights are their spans, showing how much they overlap. #3d #animated #history #particles","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","animated","history","particles"],"addedAt":"2026-10-04T06:25:04+00:00","bytes":6388,"ops":0,"width":540,"height":620,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-08/his-ac-00002/doc.rc","json":"docs/vis-set-08/his-ac-00002/doc.json"}
{"id":"vis-set-08/his-emh-00004","title":"HIS EMH 00004","description":"The cost and time to produce one book across four stages from manuscript to the mature press. #history","source":"rcjson","authoring":["json"],"apis":["drawRect","layout","paint","text"],"flags":[],"tags":["history"],"addedAt":"2026-10-04T06:25:04+00:00","bytes":2763,"ops":118,"width":580,"height":520,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-08/his-emh-00004/doc.rc","json":"docs/vis-set-08/his-emh-00004/doc.json"}
{"id":"vis-set-08/his-mh-00003","title":"HIS MH 00003","description":"Labour obligations falling and real wages rising across the fourteenth century, draggable by year. #history #interactive #input","source":"rcjson","authoring":["json"],"apis":["conditionals","drawLine","drawRect","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["history","input","interactive"],"addedAt":"2026-10-04T06:25:04+00:00","bytes":4160,"ops":198,"width":600,"height":500,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-08/his-mh-00003/doc.rc","json":"docs/vis-set-08/his-mh-00003/doc.json"}
{"id":"vis-set-08/his-wh-00001","title":"HIS WH 00001","description":"World population from 4000 BCE to the present with historical eras marked, and a sweeping time marker. #animated #history","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated","history"],"addedAt":"2026-10-04T06:25:04+00:00","bytes":2593,"ops":109,"width":620,"height":460,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-08/his-wh-00001/doc.rc","json":"docs/vis-set-08/his-wh-00001/doc.json"}
{"id":"vis-set-08/mth-alge-00008","title":"MTH ALGE 00008","description":"One polygon under four linear transformations, each over a ghost of the original, with determinants. #geometry #maths","source":"rcjson","authoring":["json"],"apis":["drawLine","drawPath","drawRect","layout","paint","text"],"flags":[],"tags":["geometry","maths"],"addedAt":"2026-10-04T06:25:04+00:00","bytes":3651,"ops":161,"width":620,"height":470,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-08/mth-alge-00008/doc.rc","json":"docs/vis-set-08/mth-alge-00008/doc.json"}
{"id":"vis-set-08/phy-qm-00025","title":"PHY QM 00025","description":"A correlated pair and an entangled pair measured along three axes, showing where the two stop agreeing. #physics","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["physics"],"addedAt":"2026-10-04T06:25:04+00:00","bytes":3736,"ops":167,"width":620,"height":440,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-08/phy-qm-00025/doc.rc","json":"docs/vis-set-08/phy-qm-00025/doc.json"}
{"id":"vis-set-08/phy-qm-00026","title":"PHY QM 00026","description":"A precessing spin state on the Bloch sphere, with what the picture does and does not claim. #3d #animated #physics","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","animated","physics"],"addedAt":"2026-10-04T06:25:04+00:00","bytes":156541,"ops":0,"width":500,"height":640,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-08/phy-qm-00026/doc.rc","json":"docs/vis-set-08/phy-qm-00026/doc.json"}
{"id":"vis-set-09/bio-micr-00024","title":"BIO MICR 00024","description":"A coccus and a bacillus dividing in 3D on a shared clock, at true relative scale. #3d #animated #biology #cells","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","animated","biology","cells"],"addedAt":"2026-10-05T04:22:09+00:00","bytes":3882,"ops":0,"width":520,"height":620,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-09/bio-micr-00024/doc.rc","json":"docs/vis-set-09/bio-micr-00024/doc.json"}
{"id":"vis-set-09/bio-micr-00025","title":"BIO MICR 00025","description":"A single infected cell releasing a burst of virions as a particle system, with the numbers beside it. #biology #cells #particles #animated","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["animated","biology","cells","particles"],"addedAt":"2026-10-05T04:22:09+00:00","bytes":1643,"ops":0,"width":540,"height":560,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-09/bio-micr-00025/doc.rc","json":"docs/vis-set-09/bio-micr-00025/doc.json"}
{"id":"vis-set-09/bio-micr-00026","title":"BIO MICR 00026","description":"Drag to grow a branching fungal network from a single spore. #biology #cells #interactive #input","source":"rcjson","authoring":["json"],"apis":["conditionals","drawLine","drawRect","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["biology","cells","input","interactive"],"addedAt":"2026-10-05T04:22:09+00:00","bytes":9540,"ops":628,"width":560,"height":560,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-09/bio-micr-00026/doc.rc","json":"docs/vis-set-09/bio-micr-00026/doc.json"}
{"id":"vis-set-09/bio-micr-00027","title":"BIO MICR 00027","description":"Four protozoa drawn to a common scale against a human hair, grouped by how they move. #biology #cells","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawOval","drawRect","layout","paint","text"],"flags":[],"tags":["biology","cells"],"addedAt":"2026-10-05T04:22:09+00:00","bytes":2980,"ops":138,"width":600,"height":480,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-09/bio-micr-00027/doc.rc","json":"docs/vis-set-09/bio-micr-00027/doc.json"}
{"id":"vis-set-09/chm-cr-00009","title":"CHM CR 00009","description":"A two-step reaction energy profile with the rate-determining barrier marked. #chemistry #mechanism","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["chemistry","mechanism"],"addedAt":"2026-10-05T04:22:09+00:00","bytes":3378,"ops":167,"width":580,"height":480,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-09/chm-cr-00009/doc.rc","json":"docs/vis-set-09/chm-cr-00009/doc.json"}
{"id":"vis-set-09/csc-ds-00009","title":"CSC DS 00009","description":"One graph drawn four ways, showing that the layout carries meaning the graph does not. #computing #graphs","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["computing","graphs"],"addedAt":"2026-10-05T04:22:09+00:00","bytes":3371,"ops":0,"width":540,"height":502,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-09/csc-ds-00009/doc.rc","json":"docs/vis-set-09/csc-ds-00009/doc.json"}
{"id":"vis-set-09/ear-geop-00009","title":"EAR GEOP 00009","description":"Dipole field lines as ribbons around a tilted magnetic axis, with the Earth turning beneath. #3d #animated #earth","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","animated","earth"],"addedAt":"2026-10-05T04:22:09+00:00","bytes":88355,"ops":0,"width":520,"height":620,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-09/ear-geop-00009/doc.rc","json":"docs/vis-set-09/ear-geop-00009/doc.json"}
{"id":"vis-set-09/eng-ee-00009","title":"ENG EE 00009","description":"A four-bit ripple-carry adder drawn as bit cells that flash as each stage reads its inputs and writes its sum. #animated #engineering #signals","source":"rcjson","authoring":["json"],"apis":["conditionals","drawLine","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated","engineering","signals"],"addedAt":"2026-10-05T04:22:09+00:00","bytes":4624,"ops":228,"width":600,"height":450,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-09/eng-ee-00009/doc.rc","json":"docs/vis-set-09/eng-ee-00009/doc.json"}
{"id":"vis-set-09/fin-acco-00009","title":"FIN ACCO 00009","description":"An income statement as proportional bars, draggable line by line from revenue to net profit. #finance #interactive #input","source":"rcjson","authoring":["json"],"apis":["conditionals","drawRect","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["finance","input","interactive"],"addedAt":"2026-10-05T04:22:09+00:00","bytes":3820,"ops":186,"width":560,"height":580,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-09/fin-acco-00009/doc.rc","json":"docs/vis-set-09/fin-acco-00009/doc.json"}
{"id":"vis-set-09/fin-acco-00010","title":"FIN ACCO 00010","description":"A balance sheet as two stacked columns of equal height, assets against the claims on them. #accounting #finance","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["accounting","finance"],"addedAt":"2026-10-05T04:22:09+00:00","bytes":2829,"ops":118,"width":560,"height":540,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-09/fin-acco-00010/doc.rc","json":"docs/vis-set-09/fin-acco-00010/doc.json"}
{"id":"vis-set-09/fin-cf-00008","title":"FIN CF 00008","description":"Cash arriving as particles and being claimed by debt at a fixed level and equity with all the variation. #animated #finance #particles","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["animated","finance","particles"],"addedAt":"2026-10-05T04:22:09+00:00","bytes":1829,"ops":0,"width":540,"height":580,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-09/fin-cf-00008/doc.rc","json":"docs/vis-set-09/fin-cf-00008/doc.json"}
{"id":"vis-set-09/mth-geom-00009","title":"MTH GEOM 00009","description":"Euclid's five postulates drawn as diagrams, with the parallel postulate set apart. #geometry #maths","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["geometry","maths"],"addedAt":"2026-10-05T04:22:09+00:00","bytes":2760,"ops":113,"width":620,"height":474,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-09/mth-geom-00009/doc.rc","json":"docs/vis-set-09/mth-geom-00009/doc.json"}
{"id":"vis-set-09/phy-cm-00028","title":"PHY CM 00028","description":"Four free-body diagrams with their forces named and the net force stated for each. #forces #physics","source":"rcjson","authoring":["json"],"apis":["clip","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["forces","physics"],"addedAt":"2026-10-05T04:22:09+00:00","bytes":3744,"ops":312,"width":500,"height":640,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-09/phy-cm-00028/doc.rc","json":"docs/vis-set-09/phy-cm-00028/doc.json"}
{"id":"vis-set-09/phy-cm-00029","title":"PHY CM 00029","description":"Position, velocity and acceleration for one journey stacked on a shared time axis. #mechanics #physics","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["mechanics","physics"],"addedAt":"2026-10-05T04:22:09+00:00","bytes":5521,"ops":300,"width":580,"height":520,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-09/phy-cm-00029/doc.rc","json":"docs/vis-set-09/phy-cm-00029/doc.json"}
{"id":"vis-set-09/phy-cm-00030","title":"PHY CM 00030","description":"Two carts colliding, drawn as paths in position against time, with the momentum arithmetic beneath. #mechanics #physics","source":"rcjson","authoring":["json"],"apis":["drawLine","drawPath","drawRect","layout","paint","text"],"flags":[],"tags":["mechanics","physics"],"addedAt":"2026-10-05T04:22:09+00:00","bytes":5182,"ops":195,"width":580,"height":500,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-09/phy-cm-00030/doc.rc","json":"docs/vis-set-09/phy-cm-00030/doc.json"}
{"id":"vis-set-09/phy-qm-00027","title":"PHY QM 00027","description":"One quantum field drawn at four excitation levels, showing particles as lumps in the field. #physics #quantum","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["physics","quantum"],"addedAt":"2026-10-05T04:22:09+00:00","bytes":5326,"ops":274,"width":620,"height":420,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-09/phy-qm-00027/doc.rc","json":"docs/vis-set-09/phy-qm-00027/doc.json"}
{"id":"vis-set-10/bio-micr-00028","title":"BIO MICR 00028","description":"Microbial community composition at four body sites as stacked 3D columns. #3d #animated #biology #cells","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","animated","biology","cells"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":17516,"ops":0,"width":540,"height":620,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-10/bio-micr-00028/doc.rc","json":"docs/vis-set-10/bio-micr-00028/doc.json"}
{"id":"vis-set-10/chm-cr-00010","title":"CHM CR 00010","description":"Catalysed and uncatalysed routes drawn over the same energy landscape in 3D. #3d #animated #chemistry","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","animated","chemistry"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":132566,"ops":0,"width":540,"height":620,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-10/chm-cr-00010/doc.rc","json":"docs/vis-set-10/chm-cr-00010/doc.json"}
{"id":"vis-set-10/csc-ds-00010","title":"CSC DS 00010","description":"A hash table with chained collisions, showing the average and worst-case lookup together. #algorithms #computing","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["algorithms","computing"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":3501,"ops":159,"width":600,"height":460,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-10/csc-ds-00010/doc.rc","json":"docs/vis-set-10/csc-ds-00010/doc.json"}
{"id":"vis-set-10/ear-geop-00010","title":"EAR GEOP 00010","description":"Temperature against depth through the Earth, comparing the real gradient with pure conduction. #earth #geology","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["earth","geology"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":3557,"ops":168,"width":580,"height":540,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-10/ear-geop-00010/doc.rc","json":"docs/vis-set-10/ear-geop-00010/doc.json"}
{"id":"vis-set-10/eng-ee-00010","title":"ENG EE 00010","description":"A square wave approximated by 1, 2, 4 and 8 odd harmonics, with the Gibbs overshoot marked. #engineering #signals","source":"rcjson","authoring":["json"],"apis":["drawLine","drawOval","drawRect","layout","paint","text"],"flags":[],"tags":["engineering","signals"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":18004,"ops":1026,"width":600,"height":540,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-10/eng-ee-00010/doc.rc","json":"docs/vis-set-10/eng-ee-00010/doc.json"}
{"id":"vis-set-10/mth-geom-00010","title":"MTH GEOM 00010","description":"The vertex figure of each Platonic solid, gathering to a shared corner, with the leftover angle that lets it fold - and the hexagons that leave none. #animated #geometry #maths","source":"rcjson","authoring":["json"],"apis":["drawArc","drawLine","drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated","geometry","maths"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":13545,"ops":440,"width":680,"height":450,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-10/mth-geom-00010/doc.rc","json":"docs/vis-set-10/mth-geom-00010/doc.json"}
{"id":"vis-set-10/mth-geom-00011","title":"MTH GEOM 00011","description":"A cloud of particles under a repeated linear map, revealing the stretching and squashing eigendirections. #geometry #maths #particles #animated","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["animated","geometry","maths","particles"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":1914,"ops":0,"width":560,"height":560,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-10/mth-geom-00011/doc.rc","json":"docs/vis-set-10/mth-geom-00011/doc.json"}
{"id":"vis-set-10/mth-geom-00012","title":"MTH GEOM 00012","description":"Five regular polygons tested for whether they tile the plane, selected with buttons, the tiles pulling apart and closing again. #animated #geometry #interactive #maths #input","source":"rcjson","authoring":["json"],"apis":["conditionals","drawArc","drawLine","drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated","geometry","input","interactive","maths"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":110027,"ops":3071,"width":560,"height":560,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-10/mth-geom-00012/doc.rc","json":"docs/vis-set-10/mth-geom-00012/doc.json"}
{"id":"vis-set-10/phy-cm-00031","title":"PHY CM 00031","description":"A pendulum's potential and kinetic energy as stacked bars of constant total height through one swing. #mechanics #physics","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["mechanics","physics"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":2554,"ops":117,"width":620,"height":420,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-10/phy-cm-00031/doc.rc","json":"docs/vis-set-10/phy-cm-00031/doc.json"}
{"id":"vis-set-10/phy-cm-00032","title":"PHY CM 00032","description":"Elastic, inelastic and perfectly inelastic collisions as before-and-after cards. #mechanics #physics","source":"rcjson","authoring":["json"],"apis":["clip","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["mechanics","physics"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":3819,"ops":288,"width":500,"height":640,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-10/phy-cm-00032/doc.rc","json":"docs/vis-set-10/phy-cm-00032/doc.json"}
{"id":"vis-set-10/phy-cm-00033","title":"PHY CM 00033","description":"Pendulum period as a 3D surface over length and amplitude, nearly flat in amplitude until large swings. #3d #animated #mechanics #physics","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","animated","mechanics","physics"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":91549,"ops":0,"width":540,"height":620,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-10/phy-cm-00033/doc.rc","json":"docs/vis-set-10/phy-cm-00033/doc.json"}
{"id":"vis-set-10/phy-cm-00034","title":"PHY CM 00034","description":"Four rolling objects as distance-time paths, finishing in an order set only by how their mass is arranged. #mechanics #physics","source":"rcjson","authoring":["json"],"apis":["drawPath","drawRect","layout","paint","text"],"flags":[],"tags":["mechanics","physics"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":9256,"ops":338,"width":580,"height":520,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-10/phy-cm-00034/doc.rc","json":"docs/vis-set-10/phy-cm-00034/doc.json"}
{"id":"vis-set-10/soc-anth-00010","title":"SOC ANTH 00010","description":"Five human migration routes as ribbons on a draggable textured globe, with approximate dates. #3d #demography #interactive #society #input","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","demography","input","interactive","society"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":55136,"ops":0,"width":540,"height":620,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-10/soc-anth-00010/doc.rc","json":"docs/vis-set-10/soc-anth-00010/doc.json"}
{"id":"vis-set-10/soc-anth-00011","title":"SOC ANTH 00011","description":"Kinship terms for six relations across four languages, showing which distinctions each language keeps. #anthropology #society","source":"rcjson","authoring":["json"],"apis":["drawRect","layout","paint","text"],"flags":[],"tags":["anthropology","society"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":3981,"ops":182,"width":620,"height":480,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-10/soc-anth-00011/doc.rc","json":"docs/vis-set-10/soc-anth-00011/doc.json"}
{"id":"vis-set-10/soc-psyc-00008","title":"SOC PSYC 00008","description":"Cumulative response curves for four reinforcement schedules on a shared clock. #animated #society","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated","society"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":8652,"ops":467,"width":600,"height":520,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-10/soc-psyc-00008/doc.rc","json":"docs/vis-set-10/soc-psyc-00008/doc.json"}
{"id":"vis-set-10/soc-psyc-00009","title":"SOC PSYC 00009","description":"Synaptic density against age with pruning shown as particles leaving. #particles #society #animated","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["animated","particles","society"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":3072,"ops":0,"width":580,"height":540,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-10/soc-psyc-00009/doc.rc","json":"docs/vis-set-10/soc-psyc-00009/doc.json"}
{"id":"vis-set-11/bio-anat-00029","title":"BIO ANAT 00029","description":"Bone mineral density across a lifetime for both sexes with the clinical thresholds marked. #anatomy #biology","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["anatomy","biology"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":4986,"ops":257,"width":580,"height":540,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-11/bio-anat-00029/doc.rc","json":"docs/vis-set-11/bio-anat-00029/doc.json"}
{"id":"vis-set-11/chm-cr-00011","title":"CHM CR 00011","description":"Gas molecules above a catalytic surface with its adsorption sites drawn in 3D. #3d #animated #chemistry #mechanism #particles","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","animated","chemistry","mechanism","particles"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":25799,"ops":0,"width":540,"height":600,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-11/chm-cr-00011/doc.rc","json":"docs/vis-set-11/chm-cr-00011/doc.json"}
{"id":"vis-set-11/csc-ca-00011","title":"CSC CA 00011","description":"Six instructions advancing through a five-stage CPU pipeline, one stage per clock. #animated #computing","source":"rcjson","authoring":["json"],"apis":["conditionals","drawLine","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated","computing"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":4994,"ops":269,"width":620,"height":480,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-11/csc-ca-00011/doc.rc","json":"docs/vis-set-11/csc-ca-00011/doc.json"}
{"id":"vis-set-11/ear-mete-00011","title":"EAR METE 00011","description":"The three-cell atmospheric circulation by latitude, draggable, with the desert bands explained. #earth #interactive #input","source":"rcjson","authoring":["json"],"apis":["conditionals","drawLine","drawRect","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["earth","input","interactive"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":4429,"ops":211,"width":580,"height":580,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-11/ear-mete-00011/doc.rc","json":"docs/vis-set-11/ear-mete-00011/doc.json"}
{"id":"vis-set-11/eng-ee-00011","title":"ENG EE 00011","description":"The radio spectrum as a logarithmic bar with band allocations and what each is physically good for. #engineering #signals","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["engineering","signals"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":3378,"ops":142,"width":620,"height":460,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-11/eng-ee-00011/doc.rc","json":"docs/vis-set-11/eng-ee-00011/doc.json"}
{"id":"vis-set-11/geo-pg-00001","title":"GEO PG 00001","description":"A mountain range as a 3D surface rising and eroding on one clock. #3d #animated #geography #geology","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","animated","geography","geology"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":50784,"ops":0,"width":540,"height":600,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-11/geo-pg-00001/doc.rc","json":"docs/vis-set-11/geo-pg-00001/doc.json"}
{"id":"vis-set-11/geo-pg-00002","title":"GEO PG 00002","description":"Water as particles down a steep straight channel and a shallow meandering one. #geography #geology #particles #animated","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["animated","geography","geology","particles"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":3554,"ops":0,"width":580,"height":540,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-11/geo-pg-00002/doc.rc","json":"docs/vis-set-11/geo-pg-00002/doc.json"}
{"id":"vis-set-11/geo-pg-00003","title":"GEO PG 00003","description":"Rainfall across a continent with the four separate mechanisms that produce deserts marked. #climate #geography #interactive #input","source":"rcjson","authoring":["json"],"apis":["conditionals","drawLine","drawRect","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["climate","geography","input","interactive"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":4303,"ops":218,"width":580,"height":560,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-11/geo-pg-00003/doc.rc","json":"docs/vis-set-11/geo-pg-00003/doc.json"}
{"id":"vis-set-11/geo-pg-00004","title":"GEO PG 00004","description":"The Whittaker biome diagram, placing eight biomes by temperature and rainfall alone. #climate #geography","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["climate","geography"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":2921,"ops":125,"width":600,"height":520,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-11/geo-pg-00004/doc.rc","json":"docs/vis-set-11/geo-pg-00004/doc.json"}
{"id":"vis-set-11/med-mp-00009","title":"MED MP 00009","description":"Complication risk over 30 days for open against keyhole surgery, with the operative trade-offs tabulated. #medicine #surgery","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["medicine","surgery"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":4660,"ops":226,"width":580,"height":520,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-11/med-mp-00009/doc.rc","json":"docs/vis-set-11/med-mp-00009/doc.json"}
{"id":"vis-set-11/med-mp-00010","title":"MED MP 00010","description":"Four imaging modalities compared on soft-tissue detail, radiation dose and time. #imaging #medicine","source":"rcjson","authoring":["json"],"apis":["drawRect","layout","paint","text"],"flags":[],"tags":["imaging","medicine"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":2668,"ops":116,"width":600,"height":500,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-11/med-mp-00010/doc.rc","json":"docs/vis-set-11/med-mp-00010/doc.json"}
{"id":"vis-set-11/med-phar-00007","title":"MED PHAR 00007","description":"Agonist, partial agonist, antagonist and inverse agonist at the same receptor, with the resulting signal. #medicine #pharmacology","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["medicine","pharmacology"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":3036,"ops":131,"width":620,"height":440,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-11/med-phar-00007/doc.rc","json":"docs/vis-set-11/med-phar-00007/doc.json"}
{"id":"vis-set-11/med-phar-00008","title":"MED PHAR 00008","description":"Plasma concentration for one large dose against four small ones, against a therapeutic window. #medicine #pharmacology","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["medicine","pharmacology"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":6395,"ops":333,"width":580,"height":540,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-11/med-phar-00008/doc.rc","json":"docs/vis-set-11/med-phar-00008/doc.json"}
{"id":"vis-set-11/mth-trig-00013","title":"MTH TRIG 00013","description":"A rotating radius on the unit circle tied across to the sine curve it traces. #animated #maths","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated","maths"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":5224,"ops":192,"width":620,"height":440,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-11/mth-trig-00013/doc.rc","json":"docs/vis-set-11/mth-trig-00013/doc.json"}
{"id":"vis-set-11/phy-cm-00035","title":"PHY CM 00035","description":"A spinning gyroscope with the gravitational torque and the resulting precession drawn as perpendicular vectors. #3d #animated #physics","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","animated","physics"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":30284,"ops":0,"width":520,"height":620,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-11/phy-cm-00035/doc.rc","json":"docs/vis-set-11/phy-cm-00035/doc.json"}
{"id":"vis-set-11/phy-fm-00036","title":"PHY FM 00036","description":"Velocity profiles across a pipe at four Reynolds numbers, from parabolic to flat-cored. #fluids #physics","source":"rcjson","authoring":["json"],"apis":["clip","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["fluids","physics"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":5792,"ops":396,"width":520,"height":620,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-11/phy-fm-00036/doc.rc","json":"docs/vis-set-11/phy-fm-00036/doc.json"}
{"id":"vis-set-12/bio-anat-00030","title":"BIO ANAT 00030","description":"The muscle force-velocity curve including the eccentric branch above maximum force. #anatomy #biology","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["anatomy","biology"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":3636,"ops":176,"width":580,"height":520,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-12/bio-anat-00030/doc.rc","json":"docs/vis-set-12/bio-anat-00030/doc.json"}
{"id":"vis-set-12/bio-anat-00031","title":"BIO ANAT 00031","description":"A neuron in 3D with a branching dendritic tree and an action potential travelling down the axon. #3d #animated #biology","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","animated","biology"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":44013,"ops":0,"width":520,"height":620,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-12/bio-anat-00031/doc.rc","json":"docs/vis-set-12/bio-anat-00031/doc.json"}
{"id":"vis-set-12/bio-anat-00032","title":"BIO ANAT 00032","description":"Blood pressure through the circulation with the pulse running and the arteriolar drop marked. #animated #biology","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated","biology"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":3091,"ops":126,"width":600,"height":500,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-12/bio-anat-00032/doc.rc","json":"docs/vis-set-12/bio-anat-00032/doc.json"}
{"id":"vis-set-12/bio-anat-00033","title":"BIO ANAT 00033","description":"Oxygen and carbon dioxide crossing the alveolar membrane as particles, with the lung's dimensions. #biology #particles #animated","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["animated","biology","particles"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":2231,"ops":0,"width":560,"height":560,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-12/bio-anat-00033/doc.rc","json":"docs/vis-set-12/bio-anat-00033/doc.json"}
{"id":"vis-set-12/chm-cr-00012","title":"CHM CR 00012","description":"Forward and reverse reaction rates converging beside the concentrations they produce. #chemistry #mechanism","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["chemistry","mechanism"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":7366,"ops":397,"width":600,"height":480,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-12/chm-cr-00012/doc.rc","json":"docs/vis-set-12/chm-cr-00012/doc.json"}
{"id":"vis-set-12/csc-ca-00012","title":"CSC CA 00012","description":"CPU and GPU die area budgets drawn to the same scale, showing the different allocation. #computing","source":"rcjson","authoring":["json"],"apis":["drawRect","layout","paint","text"],"flags":[],"tags":["computing"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":2800,"ops":112,"width":600,"height":500,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-12/csc-ca-00012/doc.rc","json":"docs/vis-set-12/csc-ca-00012/doc.json"}
{"id":"vis-set-12/ear-mete-00012","title":"EAR METE 00012","description":"Six cloud types placed by altitude with what each one indicates about coming weather. #climate #earth","source":"rcjson","authoring":["json"],"apis":["drawLine","drawOval","drawRect","layout","paint","text"],"flags":[],"tags":["climate","earth"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":3762,"ops":163,"width":520,"height":640,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-12/ear-mete-00012/doc.rc","json":"docs/vis-set-12/ear-mete-00012/doc.json"}
{"id":"vis-set-12/eco-fe-00016","title":"ECO FE 00016","description":"A schematic market index on linear and logarithmic axes, showing how the axis choice hides or reveals crashes. #economics","source":"rcjson","authoring":["json"],"apis":["drawLine","drawPath","drawRect","layout","paint","text"],"flags":[],"tags":["economics"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":4805,"ops":177,"width":600,"height":540,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-12/eco-fe-00016/doc.rc","json":"docs/vis-set-12/eco-fe-00016/doc.json"}
{"id":"vis-set-12/eco-fe-00017","title":"ECO FE 00017","description":"Two portfolios with the same expected return and different volatility, on one clock. #animated #economics","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated","economics"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":4033,"ops":194,"width":580,"height":540,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-12/eco-fe-00017/doc.rc","json":"docs/vis-set-12/eco-fe-00017/doc.json"}
{"id":"vis-set-12/eco-fe-00018","title":"ECO FE 00018","description":"Random portfolios as particles in risk-return space with the efficient frontier as their upper edge. #economics #particles #animated","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["animated","economics","particles"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":3000,"ops":0,"width":580,"height":540,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-12/eco-fe-00018/doc.rc","json":"docs/vis-set-12/eco-fe-00018/doc.json"}
{"id":"vis-set-12/eco-fe-00019","title":"ECO FE 00019","description":"Present value of a twenty-year cash stream with a draggable discount rate. #economics #interactive #input","source":"rcjson","authoring":["json"],"apis":["conditionals","drawRect","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["economics","input","interactive"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":4385,"ops":181,"width":580,"height":560,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-12/eco-fe-00019/doc.rc","json":"docs/vis-set-12/eco-fe-00019/doc.json"}
{"id":"vis-set-12/eng-ce-00012","title":"ENG CE 00012","description":"Beam, arch and suspension bridges as 3D forms with the spans each structural type can reach. #3d #animated #engineering","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","animated","engineering"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":56730,"ops":0,"width":540,"height":620,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-12/eng-ce-00012/doc.rc","json":"docs/vis-set-12/eng-ce-00012/doc.json"}
{"id":"vis-set-12/fin-acco-00011","title":"FIN ACCO 00011","description":"A cash flow statement as a 3D bridge from opening to closing cash through three sections. #3d #animated #finance","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["3d","animated","finance"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":7048,"ops":0,"width":540,"height":620,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-12/fin-acco-00011/doc.rc","json":"docs/vis-set-12/fin-acco-00011/doc.json"}
{"id":"vis-set-12/mth-trig-00014","title":"MTH TRIG 00014","description":"Two sine waves and their sum, with the phase between them draggable from in-step to opposed. #interactive #maths #input","source":"rcjson","authoring":["json"],"apis":["conditionals","drawLine","drawRect","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["input","interactive","maths"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":29247,"ops":884,"width":580,"height":560,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-12/mth-trig-00014/doc.rc","json":"docs/vis-set-12/mth-trig-00014/doc.json"}
{"id":"vis-set-12/phy-fm-00037","title":"PHY FM 00037","description":"The turbulent energy cascade on log axes with the inertial range and its -5/3 slope marked. #fluids #physics","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["fluids","physics"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":3166,"ops":158,"width":600,"height":500,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-12/phy-fm-00037/doc.rc","json":"docs/vis-set-12/phy-fm-00037/doc.json"}
{"id":"vis-set-12/phy-fm-00038","title":"PHY FM 00038","description":"Four vortices from a bath drain to a hurricane with their sizes and lifetimes. #fluids #physics","source":"rcjson","authoring":["json"],"apis":["clip","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["fluids","physics"],"addedAt":"2026-10-05T04:22:28+00:00","bytes":8908,"ops":652,"width":520,"height":620,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-12/phy-fm-00038/doc.rc","json":"docs/vis-set-12/phy-fm-00038/doc.json"}
{"id":"vis-set-13/ast-aste-00004","title":"AST ASTE 00004","description":"The asteroid belt's population against distance with the Kirkwood gaps at resonances with Jupiter. ","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":[],"addedAt":"2026-10-07T20:22:24+00:00","bytes":7119,"ops":360,"width":660,"height":540,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-13/ast-aste-00004/doc.rc","json":"docs/vis-set-13/ast-aste-00004/doc.json"}
{"id":"vis-set-13/ast-moon-00003","title":"AST MOON 00003","description":"Jupiter and its four Galilean moons on their real relative periods, turnable by dragging. #3d #animated #interactive #input","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","interaction","layout","paint","text"],"flags":[],"tags":["3d","animated","input","interactive"],"addedAt":"2026-10-07T20:22:24+00:00","bytes":2205,"ops":92,"width":620,"height":600,"hasJson":true,"jsonReproduces":"differs","src":[],"rc":"docs/vis-set-13/ast-moon-00003/doc.rc","json":"docs/vis-set-13/ast-moon-00003/doc.json"}
{"id":"vis-set-13/ast-plan-00002","title":"AST PLAN 00002","description":"Gas molecules escaping a planet beside escape velocities for five bodies and what each can hold. #particles #animated","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["animated","particles"],"addedAt":"2026-10-07T20:22:24+00:00","bytes":3478,"ops":0,"width":640,"height":560,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-13/ast-plan-00002/doc.rc","json":"docs/vis-set-13/ast-plan-00002/doc.json"}
{"id":"vis-set-13/ast-ss-00001","title":"AST SS 00001","description":"Six planets orbiting the Sun on torus orbit rings at their true relative periods, radii compressed to fit. #3d #animated","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawRect","layout","paint","text"],"flags":[],"tags":["3d","animated"],"addedAt":"2026-10-07T20:22:24+00:00","bytes":2599,"ops":119,"width":640,"height":600,"hasJson":true,"jsonReproduces":"differs","src":[],"rc":"docs/vis-set-13/ast-ss-00001/doc.rc","json":"docs/vis-set-13/ast-ss-00001/doc.json"}
{"id":"vis-set-13/bio-anat-00034","title":"BIO ANAT 00034","description":"A travelling wave of contraction moving a bolus along the gut, with transit times for each section. #animated #biology","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated","biology"],"addedAt":"2026-10-07T20:22:24+00:00","bytes":3950,"ops":158,"width":620,"height":540,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-13/bio-anat-00034/doc.rc","json":"docs/vis-set-13/bio-anat-00034/doc.json"}
{"id":"vis-set-13/chm-cr-00013","title":"CHM CR 00013","description":"Colliding particles beside a first-order rate plot, showing that rate follows the number of encounters. #chemistry #particles #animated","source":"rcjson","authoring":["json"],"apis":[],"flags":[],"tags":["animated","chemistry","particles"],"addedAt":"2026-10-07T20:22:24+00:00","bytes":4149,"ops":0,"width":620,"height":560,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-13/chm-cr-00013/doc.rc","json":"docs/vis-set-13/chm-cr-00013/doc.json"}
{"id":"vis-set-13/csc-ca-00013","title":"CSC CA 00013","description":"Memory levels from registers to disk with latency on a logarithmic scale and a human-time column. #computing","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["computing"],"addedAt":"2026-10-07T20:22:24+00:00","bytes":3438,"ops":150,"width":620,"height":560,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-13/csc-ca-00013/doc.rc","json":"docs/vis-set-13/csc-ca-00013/doc.json"}
{"id":"vis-set-13/ear-mete-00013","title":"EAR METE 00013","description":"A thunderstorm cross-section with a draggable scrubber through cumulus, mature and dissipating stages. #earth #interactive #input","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","drawRoundRect","expressions","interaction","layout","paint","text"],"flags":["animated","expressions"],"tags":["earth","input","interactive"],"addedAt":"2026-10-07T20:22:24+00:00","bytes":2949,"ops":123,"width":640,"height":560,"hasJson":true,"jsonReproduces":"differs","src":[],"rc":"docs/vis-set-13/ear-mete-00013/doc.rc","json":"docs/vis-set-13/ear-mete-00013/doc.json"}
{"id":"vis-set-13/eng-ce-00013","title":"ENG CE 00013","description":"A tall building's gravity and wind load paths, with the overturning moment growing as the square of height. #engineering","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["engineering"],"addedAt":"2026-10-07T20:22:24+00:00","bytes":5394,"ops":249,"width":620,"height":580,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-13/eng-ce-00013/doc.rc","json":"docs/vis-set-13/eng-ce-00013/doc.json"}
{"id":"vis-set-13/his-mh-00005","title":"HIS MH 00005","description":"The four occupation zones of Germany with Berlin divided the same way deep inside the Soviet zone. #history","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["history"],"addedAt":"2026-10-07T20:22:24+00:00","bytes":2546,"ops":113,"width":620,"height":560,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-13/his-mh-00005/doc.rc","json":"docs/vis-set-13/his-mh-00005/doc.json"}
{"id":"vis-set-13/his-mh-00006","title":"HIS MH 00006","description":"The five Normandy landing beaches along eighty kilometres of coast with the strength landed and casualties at each. #history","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["history"],"addedAt":"2026-10-07T20:22:24+00:00","bytes":3594,"ops":161,"width":660,"height":520,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-13/his-mh-00006/doc.rc","json":"docs/vis-set-13/his-mh-00006/doc.json"}
{"id":"vis-set-13/his-mh-00007","title":"HIS MH 00007","description":"Napoleon's 1812 campaign as a band whose width is army strength, with retreat temperatures beneath. #history","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["history"],"addedAt":"2026-10-07T20:22:24+00:00","bytes":2587,"ops":112,"width":680,"height":520,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-13/his-mh-00007/doc.rc","json":"docs/vis-set-13/his-mh-00007/doc.json"}
{"id":"vis-set-13/his-mh-00008","title":"HIS MH 00008","description":"Four outlines of Poland's borders in 1772, 1815, 1919 and 1945 with the territory's centre travelling westward. #history","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawPath","drawRect","layout","paint","text"],"flags":[],"tags":["history"],"addedAt":"2026-10-07T20:22:24+00:00","bytes":2528,"ops":104,"width":640,"height":560,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-13/his-mh-00008/doc.rc","json":"docs/vis-set-13/his-mh-00008/doc.json"}
{"id":"vis-set-13/mth-trig-00015","title":"MTH TRIG 00015","description":"The Pythagorean identity as two stacked areas and the sine addition formula as a sum of two curves. #maths","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["maths"],"addedAt":"2026-10-07T20:22:24+00:00","bytes":20831,"ops":1197,"width":640,"height":540,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-13/mth-trig-00015/doc.rc","json":"docs/vis-set-13/mth-trig-00015/doc.json"}
{"id":"vis-set-13/phy-fm-00039","title":"PHY FM 00039","description":"Hydrostatic pressure shown as arrows that grow with depth and push equally on every surface. #physics","source":"rcjson","authoring":["json"],"apis":["drawLine","drawRect","layout","paint","text"],"flags":[],"tags":["physics"],"addedAt":"2026-10-07T20:22:24+00:00","bytes":3095,"ops":129,"width":600,"height":520,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-13/phy-fm-00039/doc.rc","json":"docs/vis-set-13/phy-fm-00039/doc.json"}
{"id":"vis-set-13/phy-fm-00040","title":"PHY FM 00040","description":"An aerofoil at ten degrees with tracer dots running the streamlines, faster where the flow crowds above the wing. #animated #physics","source":"rcjson","authoring":["json"],"apis":["drawCircle","drawLine","drawPath","drawRect","expressions","layout","paint","text"],"flags":["animated","expressions"],"tags":["animated","physics"],"addedAt":"2026-10-07T20:22:24+00:00","bytes":24974,"ops":1082,"width":640,"height":500,"hasJson":true,"jsonReproduces":"yes","src":[],"rc":"docs/vis-set-13/phy-fm-00040/doc.rc","json":"docs/vis-set-13/phy-fm-00040/doc.json"}
