.turtle-graphics {
	box-shadow: 0 2px 10px 2px rgba(0, 0, 0, .1);
	position: relative;
	overflow: hidden;
	/* background: var(--app-background); */
}
.turtle-graphics > canvas {
	width: 100%;
	height: 100%;
	position: absolute;
	image-rendering: pixelated;
}
.turtle-graphics__sprite-matrix,
.turtle-graphics__sprite-shadow,
.turtle-graphics__sprite,
.turtle-graphics__sprite::before,
.turtle-graphics__sprite svg {
	position: absolute;
	pointer-events: none;
}
.turtle-graphics__sprite-matrix {
	display: var(--turtle-display);
	width: 100%;
	height: 100%;
	left: 50%;
	top: 50%;
	translate: var(--x) calc(-1 * var(--y));
	/*
	Manually negate y instead of scaling,
	because the scale gets applied to the shadow inconsistently across browsers.
	*/
}
.turtle-graphics__sprite-shadow {
	filter: drop-shadow(0 3px 2px rgba(0, 0, 0, .3));
	scale: var(--turtle-scale);
}
.turtle-graphics__sprite {
	rotate: calc(-1 * var(--angle));
	/*
	Manually negate y instead of scaling,
	because the scale gets applied to the shadow inconsistently across browsers.
	*/
}
.turtle-graphics__sprite::before {
	content: '';
	box-sizing: border-box;
	display: var(--pen-display);
	--penborder: 1px;
	--size: calc( var(--penwidth) + 2 * var(--penborder) + 0.5px);
	--translate: calc(var(--size) / -2);
	width: var(--size);
	height: var(--size);
	outline: var(--penborder) solid black;
	border: var(--penborder) solid white;
	border-radius: var(--size);
	transform: translate(var(--translate), var(--translate));
	background-color: var(--pencolor);
}
.turtle-graphics__sprite svg {
	width: var(--width);
	height: var(--height);
	transform: translate(var(--left), var(--bottom));
}
.turtle-graphics__sprite-shadow:nth-child(1) {
	top: 0;
	left: 0;
}
.turtle-graphics__sprite-shadow:nth-child(2) {
	top: 0;
	right: 0;
}
.turtle-graphics__sprite-shadow:nth-child(3) {
	bottom: 0;
	left: 0;
}
.turtle-graphics__sprite-shadow:nth-child(4) {
	bottom: 0;
	right: 0;
}

.console {
	width: 100%;
	font-family: var(--app-font-code);
}
.console pre {
	white-space: pre-wrap;
	tab-size: 2;
	margin: 0;
	padding: 0;

	width: 100%;
	margin-bottom: .15em;
	padding-bottom: .15em;
	border-bottom: 1px solid var(--theme-selection-background);
}

.app-command {
	width: 100%;
	max-width: 60ch;
	justify-self: center;
}
.app-command input {
	font-family: var(--app-font-code);
	padding: 0 0.5rem;
	border: 0;
	width: 100%;
	height: 100%;
	outline-offset: calc(0px - var(--app-focus-width));
	border-top-left-radius: 0;
	border-bottom-left-radius: 0;
}

.codearea,
.codearea * {
	box-sizing: border-box;
}

.codearea {
	/* safe to override */
	--codearea-padding: 1em;
	--codearea-padding-top: 1em;
	--codearea-padding-bottom: 1em;
	--codearea-linenumbers-color: gray;
	--codearea-linenumbers-background: #eee;
	--codearea-linenumbers-border: 1px solid gray;
	--codearea-zebra-even: lightgray;
	--codearea-zebra-odd: white;
	--codearea-lineheight: 1.5em;
	--codearea-scrollbar-space: 25px; /* make some space for windows' chunky scrollbars */
	font-size: inherit;
	font-family: monospace;
	width: 100%;
	height: 100%;
	
	/* not safe to override */
	line-height: var(--codearea-lineheight);
	overflow: scroll;
/* 	isolation: isolate; */
	position: relative;
	z-index: 2;

}

.codearea textarea:focus {
	outline: 0;
}
.codearea:focus-within {
	outline: 2px solid green;
	outline-offset: -1px;
}

.codearea__linenumbers-sticky {
	width: 100%;
	height: 0;
	position: sticky;
	left: 0;
	z-index: 1;
	background: inherit;
}
.codearea__linenumbers {
	position: absolute;
	top: 0;
	left: 0;
	height: 0; /* to be continually updated by js */
	border-right: var(--codearea-linenumbers-border);
	padding: var(--codearea-padding);
	padding-top: var(--codearea-padding-top) !important;
	padding-bottom: var(--codearea-padding-bottom) !important;
	background: var(--codearea-linenumbers-background);
	opacity: 0.9;
	z-index: 1;
}
.codearea__linenumbers > div {
	text-align: right;
}
.codearea__linenumbers > div:first-child::before {
	content: '  '; /* no expansion between lines 9 and 10 */
}

.codearea__content {
	position: relative;
	display: grid;
	min-width: 100%;
	min-height: 100%;
}

.codearea__content::after,
.codearea__content > textarea {
  grid-area: 1 / 1 / 2 / 2;
	padding: var(--codearea-padding);
	padding-top: var(--codearea-padding-top) !important;
	padding-right: calc(var(--codearea-scrollbar-space) + var(--codearea-padding)) !important;
	padding-bottom: calc(var(--codearea-scrollbar-space) + var(--codearea-padding-bottom)) !important;
	margin: 0;
	border: 0;
}

.codearea__linenumbers > div,
.codearea__content::after,
.codearea__content > textarea {
	white-space: pre;
	tab-size: 2;
}


.codearea__content::after {
  content: attr(data-replicated-value) ' ';
  visibility: hidden;
	display: block;
}

.codearea__content > textarea {
	resize: none;
	--_h: var(--codearea-lineheight);
	--_t1: calc(0.5 * var(--_h));
	--_t2: calc(1.5 * var(--_h));
	--_t3: calc(2.5 * var(--_h));
	--_o: var(--codearea-zebra-odd);
	--_e: var(--codearea-zebra-even);
  background: repeating-linear-gradient(180deg,
  	var(--_o) var(--_t1),
  	var(--_o) var(--_t2), var(--_e) var(--_t2),
  	var(--_e) var(--_t3), var(--_o) var(--_t3)
  );
  background-position: 0 calc(var(--codearea-padding-top) - var(--_t1));
}


.codearea__linenumbers,
.codearea__content,
.codearea__content::after,
.codearea__content > textarea {
	color: inherit;
	font-size: inherit;
	font-family: inherit;
	line-height: inherit;
}

.file {
	width: 100%;
	height: 100%;	
	position: relative;
	isolation: isolate;
}

.file > .codearea {
	--codearea-padding: .75em;
	--codearea-padding-top: .5em;
	--codearea-padding-bottom: .5em;
	--codearea-linenumbers-color: var(--theme-color);
	--codearea-linenumbers-background: var(--theme-background);
	--codearea-linenumbers-border: 1px solid var(--theme-border);
	--codearea-zebra-even: rgba(0, 0, 0, 0.04);
	--codearea-zebra-odd: rgba(255, 255, 255, 0.04);
	font-family: var(--app-font-code);
}
.file > .codearea:focus-within {
	outline: 0;
	position: relative;
}
.file:focus-within::after {
	content: '';
	position: absolute;
	inset: 0;
	border: .25em solid var(--theme-focus);
	z-index: 3;
	pointer-events: none;
}

[data-panel-name="settings"] fieldset {
	width: 100%;
	display: block;
}
[data-panel-name="settings"] fieldset + fieldset {
	margin-top: 1em;
}
[data-panel-name="settings"] section {
	display: grid;
	gap: .3em;
	grid-template-columns: 1fr 1fr;
	align-items: center;
}
[data-panel-name="settings"] section + section {
	margin-top: 1em;
}
[data-panel-name="settings"] section > :nth-child(1) {
	font-weight: bold;
	text-align: right;
	grid-column: 1 / 2;
}
[data-panel-name="settings"] section > :nth-child(2) {
	grid-column: 2/3;
}
[data-panel-name="settings"] section > :nth-child(3) {
	grid-column: 1 / 3;
	font-size: smaller;
}

.settings-range {
	display: grid;
	grid-template-columns: 1fr auto auto;
	align-items: center;
}
.settings-range > input {
	width: 100%;
}
.settings-range > input + input {
	width: auto;
	margin-left: 0.5em;
}

[data-panel-name="settings"] section.settings-layout {
	opacity: calc(0.5 + var(--app-viewport-wide) * 0.5);
}

* {
	box-sizing: border-box;
}

button,
input,
select,
textarea {
	font-size: inherit;
	color: inherit;
	line-height: inherit;
	background: inherit;
}

/* Define dark and light versions of each color-related custom property. */
:root {
  --theme-background-light: #ffffff;
  --theme-background-dark: #171717;
  
  --theme-border-light: #888888;
  --theme-border-dark: #666666;

  --theme-color-light: #5c5c5c;
  --theme-color-dark: #aaaaaa;

  --theme-disabled-light: #cccccc;
  --theme-disabled-dark: #555555;

  --theme-background-hover-light: #ffffff;
  --theme-background-hover-dark: #222222;

  --theme-focus-light: deepskyblue;
  --theme-focus-dark: deepskyblue;
  
  --theme-selection-foreground-light: #000000;
  --theme-selection-foreground-dark: #ffffff;

  --theme-selection-background-light: #cccccc;
  --theme-selection-background-dark: #666666;
  
  --theme-sidebar-background-light: #cccccc;
  --theme-sidebar-background-dark: #333333;
}

/* Decide which one to use in which situation... */

/* Light by default */
:root {
	--theme-background: var(--theme-background-light);
	--theme-border: var(--theme-border-light);
	--theme-color: var(--theme-color-light);
	--theme-disabled: var(--theme-disabled-light);
	--theme-background-hover: var(--theme-background-hover-light);
	--theme-focus: var(--theme-focus-light);
	--theme-selection-foreground: var(--theme-selection-foreground-light);
	--theme-selection-background: var(--theme-selection-background-light);
	--theme-sidebar-background: var(--theme-sidebar-background-light);
}
/* Override with dark if the user specified dark in the app. */
:root[data-theme="dark"] {
	--theme-background: var(--theme-background-dark);
	--theme-border: var(--theme-border-dark);
	--theme-disabled: var(--theme-disabled-dark);
	--theme-color: var(--theme-color-dark);
	--theme-background-hover: var(--theme-background-hover-dark);
	--theme-focus: var(--theme-focus-dark);
	--theme-selection-foreground: var(--theme-selection-foreground-dark);
	--theme-selection-background: var(--theme-selection-background-dark);
	--theme-sidebar-background: var(--theme-sidebar-background-dark);
}
@media (prefers-color-scheme: dark) {
	/* Dark if user set their system preference to dark. */
	:root {
	  --theme-background: var(--theme-background-dark);
		--theme-border: var(--theme-border-dark);
		--theme-disabled: var(--theme-disabled-dark);
		--theme-color: var(--theme-color-dark);
		--theme-background-hover: var(--theme-background-hover-dark);
		--theme-focus: var(--theme-focus-dark);
		--theme-selection-foreground: var(--theme-selection-foreground-dark);
		--theme-selection-background: var(--theme-selection-background-dark);
		--theme-sidebar-background: var(--theme-sidebar-background-dark);
	}
	/* Override with light if the user specified light in the app. */
	:root[data-theme="light"] {
		--theme-background: var(--theme-background-light);
		--theme-border: var(--theme-border-light);
		--theme-disabled: var(--theme-disabled-light);
		--theme-color: var(--theme-color-light);
		--theme-background-hover: var(--theme-background-hover-light);
		--theme-focus: var(--theme-focus-light);
		--theme-selection-foreground: var(--theme-selection-foreground-light);
		--theme-selection-background: var(--theme-selection-background-light);
		--theme-sidebar-background: var(--theme-sidebar-background-light);
	}
}

.widget-root {
	--widget-border-radius: 7px;
	--widget-border-width: 1px;
	--widget-offset-max: 2px;
	--widget-offset-unit: calc(var(--widget-offset-max) / 2);
	--widget-size-unit: 50px;
	--widget-background: white;
	--widget-border-color: darkgray;
	--widget-offset: 0;
	--widget-pad-start: 0;
	--widget-pad-end: 0;
	--widget-transition: .1s;
}

.widget-unit,
.widget-block-row,
.widget-block-col,
.widget-item,
.widget-content {
	padding: 0;
	border-radius: 0;
	box-sizing: border-box;
}

.widget-pill {
	--widget-border-radius: 999vh;
}

.widget-grow {
	flex-grow: 1;
}
.widget-block-row.widget-unit {
	height: var(--widget-size-unit);
}
.widget-block-col.widget-unit {
	width: var(--widget-size-unit);
}
.widget-item.widget-unit {
	width: var(--widget-size-unit);
	height: var(--widget-size-unit);
}
.widget-unit-height {
	min-height: var(--widget-size-unit);
}
.widget-unit-width {
	min-width: var(--widget-size-unit);
}

.widget-block-row,
.widget-block-col {
	display: flex;
	align-items: stretch;
}
.widget-block-row {
	flex-direction: row;
}
.widget-block-col {
	flex-direction: column;
}

.widget-item {
	z-index: 1;
	position: relative;
}
.widget-content {
	width: 100%;
	height: 100%;
	display: grid;
	grid-template-rows: 100%;
	grid-template-columns: 100%;
	justify-items: center;
	align-items: center;
	border: var(--widget-border-width) solid var(--widget-border-color);
	background: var(--widget-background);
	translate: 0 calc(var(--widget-offset-unit) * var(--widget-offset));
	padding-left: calc(var(--widget-pad-start) * (var(--widget-size-unit) - var(--widget-border-width)));
	padding-right: calc(var(--widget-pad-end) * (var(--widget-size-unit) - var(--widget-border-width)));
	transition:
		translate var(--widget-transition),
		box-shadow var(--widget-transition);
}
.widget-content > * {
	grid-column: 1 / 2;
	grid-row: 1 / 2;
}
.widget-content > * + * {
	display: none;
}

.widget-block-row:first-child > .widget-item:first-child,
.widget-block-row:first-child > .widget-item:first-child > .widget-content,
.widget-block-col:first-child > .widget-item:first-child,
.widget-block-col:first-child > .widget-item:first-child > .widget-content {
	border-top-left-radius: var(--widget-border-radius);
}
.widget-block-col:first-child > .widget-item:last-child,
.widget-block-col:first-child > .widget-item:last-child > .widget-content,
.widget-block-row:last-child > .widget-item:first-child,
.widget-block-row:last-child > .widget-item:first-child > .widget-content {
	border-bottom-left-radius: var(--widget-border-radius);
}
.widget-block-col:last-child > .widget-item:first-child,
.widget-block-col:last-child > .widget-item:first-child > .widget-content,
.widget-block-row:first-child > .widget-item:last-child,
.widget-block-row:first-child > .widget-item:last-child > .widget-content {
	border-top-right-radius: var(--widget-border-radius);
}
.widget-block-col:last-child > .widget-item:last-child,
.widget-block-col:last-child > .widget-item:last-child > .widget-content,
.widget-block-row:last-child > .widget-item:last-child,
.widget-block-row:last-child > .widget-item:last-child > .widget-content {
	border-bottom-right-radius: var(--widget-border-radius);
}

.widget-block-row + .widget-block-row > .widget-item,
.widget-block-col > .widget-item + .widget-item {
	background-color: var(--widget-border-color);
}

.widget-block-col + .widget-block-col > .widget-item,
.widget-block-row > .widget-item + .widget-item {
	margin-left: calc(-1 * var(--widget-border-width));
}
.widget-block-row + .widget-block-row > .widget-item,
.widget-block-col > .widget-item + .widget-item {
	margin-top: calc(-1 * var(--widget-border-width));
}

/* to-do: other cases */
.widget-block-row:last-child > .widget-item > .widget-content,
.widget-block-col > .widget-item:last-child > .widget-content {
	box-shadow:
		0
		calc((2 - var(--widget-offset)) * var(--widget-offset-unit))
		0
		0
		var(--widget-border-color);
}

/* usage */

.widget-item.foo {
	cursor: pointer;
}
.widget-item.foo:hover {
	--widget-offset: 1;
}
.widget-item.foo:active {
	--widget-offset: 2;
}

.styled-checkbox {
	background: transparent;
	border: 0;
}
.styled-checkbox > [type="checkbox"] {
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
	margin: 0;
	opacity: 0;
	z-index: 1;
}
.styled-checkbox > [type="checkbox"] + span {
	display: grid;
	justify-content: center;
	align-items: center;
	position: absolute;
	inset: 0;
	pointer-events: none;
}

:root {
	--app-gap: .75rem;
	--app-font: system-ui;
	--app-font-code: 'Spline Sans Mono', monospace;
	--app-unit-size: 2rem;
	--app-ui-width: 450px;

	font-family: var(--app-font);
	font-size: 16px;
	line-height: 1.5em;
	cursor: default;

	--app-border-width: 1px;
	--app-focus-width: .2rem;
	
	--app-focus-box-shadow: inset 0 0 0 var(--app-focus-width) var(--theme-focus);
	--app-focus-box-shadow-outside: 0 0 0 var(--app-focus-width) var(--theme-focus);
	
	--app-transition-big: .2s;
}
@media (min-width: 1024px) {
	:root {
		font-size: 20px;
	}
}

[data-panel-name="help"] code,
[data-panel-name="help"] pre {
	font-family: var(--app-font-code);
	font-style: normal;

	padding: 0 0.5em;
	border-radius: .75em;
	border: var(--app-border-width) dashed var(--theme-border);
}

dd {
	margin-left: 1em;
	margin-bottom: 1em;
}
dd p {
	margin-top: .5em;
	margin-bottom: .5em;
}

fieldset,
button,
input,
select,
textarea {
	border: var(--widget-border-width) solid var(--widget-border-color);
	border-radius: var(--widget-border-radius);
	padding: calc(var(--app-gap) / 4);
}
fieldset {
	padding: var(--app-gap);
}

.widget-root {
	--widget-border-width: var(--app-border-width);
	--widget-border-color: var(--theme-border);
	--widget-background: var(--theme-background);
	--widget-size-unit: var(--app-unit-size);
	--widget-offset-max: 4px;
}

.styled-checkbox > [type="checkbox"]:checked:not(:disabled) + span {
	--widget-offset: 1;
}
button:active:not(:disabled),
.styled-checkbox > [type="checkbox"]:active:not(:disabled) + span {
	--widget-offset: 2;
}
.widget-item svg {
	width: 65%;
	height: 65%;
}
svg .svg-fill {
	fill: var(--theme-color) !important;
}
:disabled svg .svg-fill,
:disabled + * svg .svg-fill {
	fill: var(--theme-disabled) !important;
}
/* 
.widget-item button {
	padding: 0;
	border-radius: 0;
}
 */


*:focus {
	outline: 0;
}
*:focus-visible,
.styled-checkbox > [type="checkbox"]:focus-visible + span {
	outline: var(--app-focus-width) solid var(--theme-focus);
	outline-offset: calc(0px - var(--app-focus-width) - var(--app-border-width));
}



.app input::placeholder,
.app textarea::placeholder {
	opacity: 0.5;
}
.app *::selection {
	color: var(--theme-selection-foreground);
	background: var(--theme-selection-background);
	outline: 1px solid red;
}


body {
	margin: 0;
	padding: 0;
	width: 100vw;
	height: 100vh;
	background: var(--theme-background);
}

.app {
	position: absolute;
	width: 100vw;
	height: 100vh;
	overflow: hidden;
	display: grid;
	grid-template-columns: 1fr;
	grid-template-rows: 1fr;
	
	color: var(--theme-color);
}
.app > * {
	pointer-events: none;
}
.app > * > * {
	pointer-events: auto;
}

.app-shadowed {
	box-shadow: 0 .1rem 1rem 0 rgba(0, 0, 0, .15);
}

.app-graphics,
.app-ui,
.app-panels {
	position: relative;
	grid-column: 1 / 2;
	grid-row: 1 / 2;
}
.app-ui {
	padding: /* account for phones with a "notch" */
		calc(var(--app-gap) + env(safe-area-inset-top))
		calc(var(--app-gap) + env(safe-area-inset-right))
		calc(var(--app-gap) + env(safe-area-inset-bottom))
		calc(var(--app-gap) + env(safe-area-inset-left));
	display: grid;
	gap: var(--app-gap);
	grid-template-columns: 1fr;
	grid-template-rows:
		repeat(2, var(--widget-size-unit)) calc(100vh - 2 * var(--widget-size-unit) - 4 * var(--app-gap));
	opacity: 1;
	transition:
		opacity var(--app-transition-big),
		translate var(--app-transition-big);
/* 	overflow: hidden; */
}
/* 
[data-app-panel-open="yes"] .app-ui {
	translate: 0 calc(-1 * (var(--app-unit-size) + var(--app-gap)));
}
 */
[data-app-ui-hidden="yes"],
[data-app-ui-hidden="yes"] * {
	cursor: none;
}
[data-app-ui-hidden="yes"] .app-ui > * {
	opacity: 0;
	transition:
		opacity var(--app-transition-big);
}
[data-app-ui-hidden="yes"] * {
	pointer-events: none;
}
 
.app-ui > * {
	grid-column: 1 / 2;
}

.app-command {
	grid-row: 1 / 2;
	opacity: 1;
	visibility: visible;
	transition: opacity var(--app-transition-big);
}
/* 
[data-app-panel-open="yes"] .app-command {
	opacity: 0;
	visibility: hidden;
	transition:
		visibility var(--app-transition-big),
		opacity var(--app-transition-big);
}
 */

.app-buttons {
	grid-row: 2 / 3;
	justify-self: center;
	display: flex;
	gap: var(--app-gap);
/* 	font-family: var(--app-font-code); */
	font-weight: bold;
	font-size: 1.25em;
}

.app-panels {
	grid-row: 3 / 4;
/* 	translate: 0 calc(var(--app-unit-size) + var(--app-gap)); */
	position: relative;
	pointer-events: none;
	
	max-width: 60ch;
	justify-self: center;
	width: 100%;
}

.app-panels > * {
	position: absolute;
	inset: 0;

	pointer-events: auto;
	opacity: 0;
	visibility: hidden;
	transition:
		visibility var(--app-transition-big),
		opacity var(--app-transition-big);
}
.app-panels > *[data-panel-shown="yes"] {
	opacity: 1;
	visibility: visible;
	transition:
		opacity var(--app-transition-big);
}

.app-panel-body {
	--_height-pct: 100%;
	height: calc(var(--_height-pct) - var(--widget-size-unit));
	transition:
		height var(--app-transition-big);
}
[data-panel-reduced="yes"] .app-panel-body {
	--_height-pct: 50%;
}
.app-panel-body .widget-item {
	width: 100%;
}
.app-panel-body .widget-content {
	align-items: start;
	justify-items: start;
	overflow: scroll;
}
.app-panel-body .widget-content.widget-content-noscroll {
	overflow: hidden;
}

.app-panel-padded {
	padding: var(--app-gap);
}



.app {
	--app-viewport-wide: 0;
}
@media (min-width: 900px) {
	.app {
		--app-viewport-wide: 1;
	}
	
	.app[data-layout="right"] {
		grid-template-columns: auto var(--app-ui-width);
	}
	.app[data-layout="right"] .app-ui {
		grid-column: 2 / 3;
	}

	.app[data-layout="left"] {
		grid-template-columns: var(--app-ui-width) auto;
	}
	.app[data-layout="left"] .app-graphics {
		grid-column: 2 / 3;
	}

	/* colors */

	.app[data-layout="left"] .app-ui,
	.app[data-layout="right"] .app-ui {
		background: var(--theme-sidebar-background);	
	}
	.app[data-layout="left"] .app-ui {
		border-right: 2px solid var(--theme-border);
	}
	.app[data-layout="right"] .app-ui {
		border-left: 2px solid var(--theme-border);
	}
}


.app-graphics {
	position: relative;
	inset: 0;
	z-index: 0;
	display: grid;
	justify-items: center;
	align-items: center;
	z-index: 0;
	
	--_d: rgba(0, 0, 0, 0.1);
	--_l: rgba(255, 255, 255, 0.04);
	--_s: 20px;
	background: conic-gradient(
		var(--_d) 90deg,
		var(--_l) 90deg 180deg,
		var(--_d) 180deg 270deg,
		var(--_l) 270deg
	);
	background-repeat: repeat;
	background-size: var(--_s) var(--_s);
	background-position: center;

	overflow: scroll;
  -ms-overflow-style: none;
  scrollbar-width: none;
}
.app-graphics::-webkit-scrollbar {
  display: none;
}

/* Hide scrollbar for IE, Edge and Firefox */
.example {
}


.app-graphics > .turtle-graphics {
	background: var(--theme-background);
	/* z-index: 1; */
}
[data-graphics-overflow]::before,
[data-graphics-overflow]::after {
	--_thickness: calc(var(--app-gap) / 2);
	content: '';
	pointer-events: none;
	position: fixed;
	top: 0;
	bottom: 0;
	left: 0;
	right: 0;
	z-index: 2;
	border: 0 dashed cyan;
	transition: border-width 150ms;
}
[data-graphics-overflow]::before {
	border-style: solid;
	border-color: red;
}

[data-graphics-overflow*="top"]::before,
[data-graphics-overflow*="top"]::after {
	border-top-width: var(--_thickness);
}
[data-graphics-overflow*="left"]::before,
[data-graphics-overflow*="left"]::after {
	border-left-width: var(--_thickness);
}
[data-graphics-overflow*="bottom"]::before,
[data-graphics-overflow*="bottom"]::after {
	border-bottom-width: var(--_thickness);
}
[data-graphics-overflow*="right"]::before,
[data-graphics-overflow*="right"]::after {
	border-right-width: var(--_thickness);
}

.app[data-layout="left"] [data-graphics-overflow]::before, 
.app[data-layout="left"] [data-graphics-overflow]::after {
	left: calc(var(--app-viewport-wide) * var(--app-ui-width));
}
.app[data-layout="right"] [data-graphics-overflow]::before, 
.app[data-layout="right"] [data-graphics-overflow]::after {
	right: calc(var(--app-viewport-wide) * var(--app-ui-width));
}

