/* figures: pointer (features/json_pointer.md, json_patch.md, merge_patch.md; widgets in js/fig-pointer.js) */ /* value types: the colours of the code highlighting (brand.css), so a string looks the same everywhere */ .nj-pointer-walk, .nj-pointer-fl, .nj-patch { --nj-pointer-s: var(--nj-hl-string); --nj-pointer-n: var(--nj-hl-number); --nj-pointer-b: var(--nj-hl-function); --nj-pointer-line: color-mix(in srgb, var(--md-default-fg-color) 28%, var(--md-default-bg-color)); --nj-pointer-ok: #23793a; --nj-pointer-ok-soft: #e6f4ea; } [data-md-color-scheme="slate"] :is(.nj-pointer-walk, .nj-pointer-fl, .nj-patch) { --nj-pointer-ok: #7ed491; --nj-pointer-ok-soft: #14301d; } /* ---------- pointer walker ---------- */ .md-typeset .nj-pointer-walk { display: grid; grid-template-columns: minmax(0, 1fr); gap: 1rem 1.6rem; margin: 1.5rem 0; padding: 1rem 1.1rem; border: 1px solid var(--md-default-fg-color--lightest); border-radius: 6px; font-size: .75rem; } @media screen and (min-width: 45em) { .md-typeset .nj-pointer-walk--js { grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr); } .md-typeset .nj-pointer-walk--js .nj-pointer-panel { order: 2; } } .md-typeset .nj-pointer-static { margin: 0; color: var(--md-default-fg-color--light); } .md-typeset .nj-pointer-walk code { font-size: .95em; } /* tree: elbow lines drawn by each item (::before up to its row, ::after down to the next sibling) */ .md-typeset .nj-pointer-walk ul.nj-pointer-tree, .md-typeset .nj-pointer-walk .nj-pointer-tree ul { margin: 0; padding: 0; list-style: none; } .md-typeset .nj-pointer-walk .nj-pointer-tree ul { padding-left: 1.5rem; } .md-typeset .nj-pointer-walk .nj-pointer-tree li { position: relative; margin: 0; padding: 0; list-style: none; --nj-pointer-mid: .95rem; } .md-typeset .nj-pointer-walk .nj-pointer-tree li::before, .md-typeset .nj-pointer-walk .nj-pointer-tree li::after { content: none; } .md-typeset .nj-pointer-walk .nj-pointer-tree ul > li::before { content: ""; position: absolute; top: 0; left: -1rem; width: .8rem; height: var(--nj-pointer-mid); border: 0 solid var(--nj-pointer-line); border-width: 0 0 2px 2px; border-bottom-left-radius: 4px; background: none; } .md-typeset .nj-pointer-walk .nj-pointer-tree ul > li:not(:last-child)::after { content: ""; position: absolute; top: 0; bottom: 0; left: -1rem; border-left: 2px solid var(--nj-pointer-line); } .md-typeset .nj-pointer-walk .nj-pointer-tree ul > li.is-on::before { z-index: 1; border-color: var(--md-typeset-a-color); } .md-typeset .nj-pointer-walk .nj-pointer-tree ul > li.is-pass::after { z-index: 1; border-left-color: var(--md-typeset-a-color); } .md-typeset .nj-pointer-walk .nj-pointer-n { display: inline-block; margin: .15rem 0; padding: .2rem .5rem; border: 1px solid transparent; border-radius: 6px; background: none; color: var(--md-default-fg-color); font: inherit; font-family: var(--md-code-font-family), monospace; font-size: .95em; line-height: 1.5; text-align: left; } .md-typeset .nj-pointer-walk button.nj-pointer-n { cursor: pointer; } .md-typeset .nj-pointer-walk button.nj-pointer-n:hover { border-color: var(--md-default-fg-color--lightest); } .md-typeset .nj-pointer-walk :is(button):focus-visible { outline: 2px solid var(--md-typeset-a-color); outline-offset: 2px; } .nj-pointer-k { color: var(--nj-hl-key); } .nj-pointer-t { color: var(--md-default-fg-color--light); font-family: var(--md-text-font-family), sans-serif; font-size: .88em; font-style: italic; } .nj-pointer-v--s { color: var(--nj-pointer-s); } .nj-pointer-v--n { color: var(--nj-pointer-n); } .nj-pointer-v--b { color: var(--nj-pointer-b); } .md-typeset .nj-pointer-walk li.is-on > .nj-pointer-n { border-color: color-mix(in srgb, var(--md-typeset-a-color) 45%, transparent); } .md-typeset .nj-pointer-walk li.is-target > .nj-pointer-n { border-color: var(--md-typeset-a-color); background-color: var(--nj-blue-soft); box-shadow: 0 0 0 1px var(--md-typeset-a-color); } /* the value a container pointer identifies includes its subtree */ .md-typeset .nj-pointer-walk li.is-target li > .nj-pointer-n { background-color: var(--nj-blue-soft); } .md-typeset .nj-pointer-walk li.is-miss > .nj-pointer-n { border-color: var(--nj-red); border-style: dashed; } /* panel: pointer bar, result, example pointers */ .nj-pointer-lbl { margin: 0 0 .35rem; color: var(--md-default-fg-color--light); font-size: .62rem; font-weight: 600; letter-spacing: .04em; text-transform: uppercase; } .nj-pointer-lbl span { font-weight: 500; letter-spacing: 0; text-transform: none; } .nj-pointer-bar { display: flex; flex-wrap: wrap; margin-bottom: .6rem; } .md-typeset .nj-pointer-seg { margin: 0 -1px 0 0; padding: .3rem .55rem; border: 1px solid var(--md-typeset-a-color); background-color: var(--md-default-bg-color); color: var(--md-typeset-a-color); cursor: pointer; font: inherit; } .md-typeset .nj-pointer-seg:first-child { border-radius: 6px 0 0 6px; } .md-typeset .nj-pointer-seg:last-child { border-radius: 0 6px 6px 0; } .md-typeset .nj-pointer-seg:only-child { border-radius: 6px; } .md-typeset .nj-pointer-seg code { color: inherit; font-size: 1em; } .md-typeset .nj-pointer-seg--root code { color: var(--md-default-fg-color--light); } .md-typeset .nj-pointer-seg.is-after { border-color: var(--md-default-fg-color--lighter); color: var(--md-default-fg-color--light); border-style: dashed; } .md-typeset .nj-pointer-seg[aria-pressed="true"] { position: relative; background-color: var(--md-typeset-a-color); color: var(--md-default-bg-color); } .md-typeset .nj-pointer-seg--root[aria-pressed="true"] code { color: inherit; } .nj-pointer-out { min-height: 3.2em; margin-bottom: .9rem; padding: .5rem .7rem; border-left: 3px solid var(--md-typeset-a-color); border-radius: 0 6px 6px 0; background-color: var(--md-code-bg-color); line-height: 1.6; overflow-wrap: anywhere; } .md-typeset .nj-pointer-out .nj-pointer-val { color: var(--md-typeset-a-color); font-weight: 600; } .nj-pointer-out .nj-pointer-note { color: var(--md-default-fg-color--light); } .nj-pointer-out .nj-pointer-err { color: var(--nj-red); font-weight: 600; } .nj-pointer-presets { display: flex; flex-wrap: wrap; gap: .35rem; } .md-typeset .nj-pointer-chip { padding: .2rem .5rem; border: 1px solid var(--md-default-fg-color--lightest); border-radius: 6px; background-color: var(--md-default-bg-color); color: var(--md-default-fg-color); cursor: pointer; font: inherit; } .md-typeset .nj-pointer-chip:hover { border-color: var(--md-typeset-a-color); } .md-typeset .nj-pointer-chip[aria-pressed="true"] { border-color: var(--md-typeset-a-color); background-color: var(--nj-blue-soft); color: var(--md-typeset-a-color); } .md-typeset .nj-pointer-chip code { color: inherit; font-size: 1em; } @media (pointer: coarse), screen and (max-width: 44.984375em) { .md-typeset :is(.nj-pointer-seg, .nj-pointer-chip, .nj-patch-btn) { min-height: 44px; min-width: 44px; } .md-typeset .nj-pointer-walk button.nj-pointer-n { min-height: 40px; } } /* ---------- flatten / unflatten figure (scripts/figures/json_pointer_flatten.py) ---------- */ .md-typeset svg.nj-pointer-fl { min-width: 28rem; max-width: 44rem; } .nj-pointer-fl .nj-pointer-fl-edge { fill: none; stroke: var(--fg-line); stroke-width: 1.5; } .nj-pointer-fl .nj-pointer-fl-link { fill: none; stroke-width: 1.5; stroke-opacity: .75; } .nj-pointer-fl .nj-pointer-fl-link.nj-pointer-fl--s, .nj-pointer-fl .nj-pointer-fl-dot.nj-pointer-fl--s { stroke: var(--nj-pointer-s); } .nj-pointer-fl .nj-pointer-fl-link.nj-pointer-fl--n, .nj-pointer-fl .nj-pointer-fl-dot.nj-pointer-fl--n { stroke: var(--nj-pointer-n); } .nj-pointer-fl .nj-pointer-fl-link.nj-pointer-fl--b, .nj-pointer-fl .nj-pointer-fl-dot.nj-pointer-fl--b { stroke: var(--nj-pointer-b); } .nj-pointer-fl .nj-pointer-fl-dot { fill: var(--md-default-bg-color); stroke-width: 2; } .nj-pointer-fl tspan.nj-pointer-fl--s { fill: var(--nj-pointer-s); } .nj-pointer-fl tspan.nj-pointer-fl--n { fill: var(--nj-pointer-n); } .nj-pointer-fl tspan.nj-pointer-fl--b { fill: var(--nj-pointer-b); } .nj-pointer-fl .nj-pointer-fl-k, .nj-pointer-fl .nj-pointer-fl-inner, .nj-pointer-fl .nj-pointer-fl-key { fill: var(--nj-hl-key); } .nj-pointer-fl .nj-pointer-fl-op { fill: var(--md-typeset-a-color); font-family: var(--md-code-font-family), monospace; font-size: 15px; font-weight: 600; text-anchor: middle; } /* ---------- JSON Patch stepper ---------- */ .md-typeset .nj-patch--js .md-typeset__scrollwrap, .md-typeset .nj-patch--js > .md-typeset__table, .md-typeset .nj-patch--js > table { display: none; } .md-typeset .nj-patch-stage { margin: 1.5rem 0; padding: 1rem 1.1rem; border: 1px solid var(--md-default-fg-color--lightest); border-radius: 6px; font-size: .75rem; } .nj-patch-cols { display: grid; grid-template-columns: minmax(0, 1fr); gap: 1rem 1.4rem; } @media screen and (min-width: 50em) { .nj-patch-cols { grid-template-columns: minmax(0, .8fr) minmax(0, 1.2fr); } } .nj-patch-h { margin: 0 0 .35rem; color: var(--md-default-fg-color--light); font-size: .62rem; font-weight: 600; letter-spacing: .04em; text-transform: uppercase; } .nj-patch-doc { --nj-patch-lh: 1.9rem; --nj-patch-pad: .5rem; position: relative; padding: var(--nj-patch-pad) .6rem var(--nj-patch-pad) 2rem; border: 1px solid var(--md-default-fg-color--lightest); border-radius: 6px; background-color: var(--md-code-bg-color); font-family: var(--md-code-font-family), monospace; font-size: .95em; } .nj-patch-line { display: flex; flex-wrap: wrap; align-items: center; gap: 0 .6rem; min-height: var(--nj-patch-lh); margin: 0 -.3rem; padding: 0 .3rem; border-radius: 4px; white-space: pre; } .nj-patch-code { white-space: pre; } .nj-patch-k { color: var(--nj-hl-key); } .nj-patch-s { color: var(--nj-pointer-s); } .nj-patch-note { padding: 0 .4rem; border-radius: 4px; font-family: var(--md-text-font-family), sans-serif; font-size: .82em; font-weight: 600; white-space: nowrap; } .nj-patch-line--add { background-color: var(--nj-pointer-ok-soft); box-shadow: inset 3px 0 0 var(--nj-pointer-ok); } .nj-patch-line--add .nj-patch-note { color: var(--nj-pointer-ok); } .nj-patch-line--del { background-color: var(--nj-red-soft); box-shadow: inset 3px 0 0 var(--nj-red); } .nj-patch-line--del .nj-patch-code { text-decoration: line-through; text-decoration-color: var(--nj-red); text-decoration-thickness: 2px; opacity: .75; } .nj-patch-line--del .nj-patch-note { color: var(--nj-red); } .nj-patch-line--mod .nj-patch-note { color: var(--nj-pointer-ok); } .nj-patch-line--test { background-color: var(--nj-blue-soft); box-shadow: inset 3px 0 0 var(--md-typeset-a-color); } .nj-patch-line--test .nj-patch-note { color: var(--md-typeset-a-color); } .nj-patch-ins { padding: .05rem .15rem; border-radius: 3px; background-color: var(--nj-pointer-ok-soft); box-shadow: 0 0 0 1.5px var(--nj-pointer-ok); } .nj-patch-src { padding: .05rem .15rem; border-radius: 3px; box-shadow: 0 0 0 1.5px var(--md-typeset-a-color); } /* move/copy connector in the left gutter: a bracket from the source line to the target line */ .nj-patch-arc { position: absolute; left: .55rem; width: .8rem; border: 2px solid var(--md-typeset-a-color); border-right: 0; border-radius: 6px 0 0 6px; } .nj-patch-arc::after { content: ""; position: absolute; right: -2px; border: 5px solid transparent; border-left: 7px solid var(--md-typeset-a-color); } .nj-patch-arc--down::after { bottom: -6px; } .nj-patch-arc--up::after { top: -6px; } .md-typeset .nj-patch-ops { margin: 0; padding: 0; list-style: none; counter-reset: nj-patch; } .md-typeset .nj-patch-ops > li { position: relative; margin: 0 0 .3rem; padding: .35rem .5rem .35rem 2rem; border: 1px solid transparent; border-radius: 6px; counter-increment: nj-patch; line-height: 1.5; } .md-typeset .nj-patch-ops > li::before { content: counter(nj-patch); position: absolute; top: .35rem; left: .6rem; color: var(--md-default-fg-color--lighter); font-weight: 600; font-variant-numeric: tabular-nums; } .md-typeset .nj-patch-ops code { font-size: .9em; overflow-wrap: anywhere; } .md-typeset .nj-patch-ops > li.is-done { opacity: .6; } .md-typeset .nj-patch-ops > li.is-cur { border-color: var(--md-typeset-a-color); background-color: var(--nj-blue-soft); } .md-typeset .nj-patch-ops > li.is-cur::before { color: var(--md-typeset-a-color); } .nj-patch-op { color: var(--nj-hl-keyword); font-weight: 600; } .nj-patch-path { color: var(--nj-pointer-s); } .md-typeset .nj-patch-ops > li.is-cur .nj-patch-path { padding: 0 .15rem; border-radius: 3px; background-color: var(--md-typeset-a-color); color: var(--md-default-bg-color); } .nj-patch-ctrl { display: flex; flex-wrap: wrap; align-items: center; gap: .4rem; margin-top: .9rem; } .md-typeset .nj-patch-btn { padding: .3rem .9rem; border: 1px solid var(--md-default-fg-color--lighter); border-radius: 6px; background-color: var(--md-default-bg-color); color: var(--md-default-fg-color); cursor: pointer; font: inherit; font-weight: 600; } .md-typeset .nj-patch-btn--primary { border-color: var(--md-typeset-a-color); background-color: var(--md-typeset-a-color); color: var(--md-default-bg-color); } .md-typeset .nj-patch-btn:disabled { opacity: .45; cursor: default; } .md-typeset .nj-patch-btn:focus-visible { outline: 2px solid var(--md-typeset-a-color); outline-offset: 2px; } .nj-patch-count { margin-left: auto; color: var(--md-default-fg-color--light); font-variant-numeric: tabular-nums; } .md-typeset .nj-patch-status { min-height: 3.2em; margin: .6rem 0 0; color: var(--md-default-fg-color--light); } @media (prefers-reduced-motion: no-preference) { .nj-patch-doc--anim :is(.nj-patch-line--add, .nj-patch-line--del, .nj-patch-line--test, .nj-patch-ins, .nj-patch-arc) { animation: nj-patch-in 450ms ease-out; } } @keyframes nj-patch-in { from { opacity: 0; transform: translateX(-.4rem); } to { opacity: 1; transform: none; } } /* ---------- merge patch table ---------- */ .nj-pointer-mpt { --nj-pointer-mp-set: var(--nj-hl-keyword); --nj-pointer-mp-add: #23793a; --nj-pointer-mp-del: var(--nj-red); --nj-pointer-mp-rec: var(--nj-hl-function); --nj-pointer-mp-arr: var(--nj-hl-number); --nj-pointer-mp-keep: var(--md-default-fg-color--light); } [data-md-color-scheme="slate"] .nj-pointer-mpt { --nj-pointer-mp-add: #7ed491; } .md-typeset .nj-pointer-mpt td { vertical-align: top; } .md-typeset .nj-pointer-mpt td:first-child { white-space: nowrap; } .nj-pointer-mp { display: inline-block; padding: .05rem .5rem; border: 1px solid currentColor; border-radius: 999px; background-color: color-mix(in srgb, currentColor 10%, var(--md-default-bg-color)); font-size: .92em; font-weight: 600; line-height: 1.5; white-space: nowrap; } .nj-pointer-mp--set { color: var(--nj-pointer-mp-set); } .nj-pointer-mp--add { color: var(--nj-pointer-mp-add); } .nj-pointer-mp--del { color: var(--nj-pointer-mp-del); } .nj-pointer-mp--rec { color: var(--nj-pointer-mp-rec); } .nj-pointer-mp--arr { color: var(--nj-pointer-mp-arr); } .nj-pointer-mp--keep { color: var(--nj-pointer-mp-keep); } .nj-pointer-mp-none { color: var(--md-default-fg-color--light); font-style: italic; } .md-typeset .nj-pointer-mpt table:not([class]) td code { white-space: normal; } .md-typeset .nj-pointer-mpt table:not([class]) td:nth-child(-n+2) code { white-space: nowrap; } /* the result cell takes a tint of the rule's colour */ .md-typeset .nj-pointer-mpt tr:has(.nj-pointer-mp--set) td:last-child { background-color: color-mix(in srgb, var(--nj-pointer-mp-set) 8%, transparent); } .md-typeset .nj-pointer-mpt tr:has(.nj-pointer-mp--add) td:last-child { background-color: color-mix(in srgb, var(--nj-pointer-mp-add) 8%, transparent); } .md-typeset .nj-pointer-mpt tr:has(.nj-pointer-mp--del) td:last-child { background-color: color-mix(in srgb, var(--nj-pointer-mp-del) 8%, transparent); } .md-typeset .nj-pointer-mpt tr:has(.nj-pointer-mp--rec) td:last-child { background-color: color-mix(in srgb, var(--nj-pointer-mp-rec) 8%, transparent); } .md-typeset .nj-pointer-mpt tr:has(.nj-pointer-mp--arr) td:last-child { background-color: color-mix(in srgb, var(--nj-pointer-mp-arr) 8%, transparent); }