for extra-complex tables
+ * -> use for paragraph-length cell content
+ * -> use when manual line breaks/indentation would help readability
+ * - dl.switch for switch statements
+ * - ol.algorithm for algorithms (helps to visualize nesting)
+ * - .figure and .caption (HTML4) and figure and figcaption (HTML5)
+ * -> .sidefigure for right-floated figures
+ * - ins/del
+ *
+ * Code
+ * - pre and code
+ *
+ * Special Sections
+ * - .note for informative notes (div, p, span, aside, details)
+ * - .example for informative examples (div, p, pre, span)
+ * - .issue for issues (div, p, span)
+ * - .advisement for loud normative statements (div, p, strong)
+ * - .annoying-warning for spec obsoletion notices (div, aside, details)
+ *
+ * Definition Boxes
+ * - pre.def for WebIDL definitions
+ * - table.def for tables that define other entities (e.g. CSS properties)
+ * - dl.def for definition lists that define other entitles (e.g. HTML elements)
+ *
+ * Numbering
+ * - .secno for section numbers in .toc and headings (3.2 )
+ * - .marker for source-inserted example/figure/issue numbers (Issue 4 )
+ * - ::before styled for CSS-generated issue/example/figure numbers:
+ * -> Documents wishing to use this only need to add
+ * figcaption::before,
+ * .caption::before { content: "Figure " counter(figure); }
+ * .example::before { content: "Example " counter(example); }
+ * .issue::before { content: "Issue " counter(issue); }
+ *
+ * Header Stuff (ignore, just don't conflict with these classes)
+ * - .head for the header
+ * - .copyright for the copyright
+ *
+ * Miscellaneous
+ * - .overlarge for things that should be as wide as possible, even if
+ * that overflows the body text area. This can be used on an item or
+ * on its container, depending on the effect desired.
+ * Note that this styling basically doesn't help at all when printing,
+ * since A4 paper isn't much wider than the max-width here.
+ * It's better to design things to fit into a narrower measure if possible.
+ * - js-added ToC jump links (see fixup.js)
+ *
+ ******************************************************************************/
+
+/******************************************************************************/
+/* Body */
+/******************************************************************************/
+
+ body {
+ counter-reset: example figure issue;
+
+ /* Layout */
+ max-width: 50em; /* limit line length to 50em for readability */
+ margin: 0 auto; /* center text within page */
+ padding: 1.6em 1.5em 2em 50px; /* assume 16px font size for downlevel clients */
+ padding: 1.6em 1.5em 2em calc(26px + 1.5em); /* leave space for status flag */
+
+ /* Typography */
+ line-height: 1.5;
+ font-family: sans-serif;
+ widows: 2;
+ orphans: 2;
+ word-wrap: break-word;
+ overflow-wrap: break-word;
+ hyphens: auto;
+
+ /* Colors */
+ color: black;
+ background: white top left fixed no-repeat;
+ background-size: 25px auto;
+ }
+
+
+/******************************************************************************/
+/* Front Matter & Navigation */
+/******************************************************************************/
+
+/** Header ********************************************************************/
+
+ div.head { margin-bottom: 1em }
+ div.head hr { border-style: solid; }
+
+ div.head h1 {
+ font-weight: bold;
+ margin: 0 0 .1em;
+ font-size: 220%;
+ }
+
+ div.head h2 { margin-bottom: 1.5em;}
+
+/** W3C Logo ******************************************************************/
+
+ .head p:not(.copyright):first-child {
+ margin: 0;
+ }
+
+ .head p:not(.copyright):first-child > a,
+ .head > a:first-child {
+ float: right;
+ margin: 0.4rem 0 0.2rem .4rem;
+ }
+
+ .head img[src*="logos/W3C"] {
+ display: block;
+ border: solid #1a5e9a;
+ border-width: .65rem .7rem .6rem;
+ border-radius: .4rem;
+ background: #1a5e9a;
+ color: white;
+ font-weight: bold;
+ }
+
+ .head a:hover > img[src*="logos/W3C"],
+ .head a:focus > img[src*="logos/W3C"] {
+ opacity: .8;
+ }
+
+ .head a:active > img[src*="logos/W3C"] {
+ background: #c00;
+ border-color: #c00;
+ }
+
+ /* see also additional rules in Link Styling section */
+
+/** Copyright *****************************************************************/
+
+ p.copyright,
+ p.copyright small { font-size: small }
+
+/** Back to Top / ToC Toggle **************************************************/
+
+ @media print {
+ #toc-nav {
+ display: none;
+ }
+ }
+ @media not print {
+ #toc-nav {
+ position: fixed;
+ z-index: 2;
+ bottom: 0; left: 0;
+ margin: 0;
+ min-width: 1.33em;
+ border-top-right-radius: 2rem;
+ box-shadow: 0 0 2px;
+ font-size: 1.5em;
+ color: black;
+ }
+ #toc-nav > a {
+ display: block;
+ white-space: nowrap;
+
+ height: 1.33em;
+ padding: .1em 0.3em;
+ margin: 0;
+
+ background: white;
+ box-shadow: 0 0 2px;
+ border: none;
+ border-top-right-radius: 1.33em;
+ background: white;
+ }
+ #toc-nav > #toc-jump {
+ padding-bottom: 2em;
+ margin-bottom: -1.9em;
+ }
+
+ #toc-nav > a:hover,
+ #toc-nav > a:focus {
+ background: #f8f8f8;
+ }
+ #toc-nav > a:not(:hover):not(:focus) {
+ color: #707070;
+ }
+
+ /* statusbar gets in the way on keyboard focus; remove once browsers fix */
+ #toc-nav > a[href="#toc"]:not(:hover):focus:last-child {
+ padding-bottom: 1.5rem;
+ }
+
+ #toc-nav:not(:hover) > a:not(:focus) > span + span {
+ /* Ideally this uses :focus-within on #toc-nav */
+ display: none;
+ }
+ #toc-nav > a > span + span {
+ padding-right: 0.2em;
+ }
+
+ #toc-toggle-inline {
+ vertical-align: 0.05em;
+ font-size: 80%;
+ color: gray;
+ color: hsla(203,20%,40%,.7);
+ border-style: none;
+ background: transparent;
+ position: relative;
+ }
+ #toc-toggle-inline:hover:not(:active),
+ #toc-toggle-inline:focus:not(:active) {
+ text-shadow: 1px 1px silver;
+ top: -1px;
+ left: -1px;
+ }
+
+ #toc-nav :active {
+ color: #C00;
+ }
+ }
+
+/** ToC Sidebar ***************************************************************/
+
+ /* Floating sidebar */
+ @media screen {
+ body.toc-sidebar #toc {
+ position: fixed;
+ top: 0; bottom: 0;
+ left: 0;
+ width: 23.5em;
+ max-width: 80%;
+ max-width: calc(100% - 2em - 26px);
+ overflow: auto;
+ padding: 0 1em;
+ padding-left: 42px;
+ padding-left: calc(1em + 26px);
+ background: inherit;
+ background-color: #f7f8f9;
+ z-index: 1;
+ box-shadow: -.1em 0 .25em rgba(0,0,0,.1) inset;
+ }
+ body.toc-sidebar #toc h2 {
+ margin-top: .8rem;
+ font-variant: small-caps;
+ font-variant: all-small-caps;
+ text-transform: lowercase;
+ font-weight: bold;
+ color: gray;
+ color: hsla(203,20%,40%,.7);
+ }
+ body.toc-sidebar #toc-jump:not(:focus) {
+ width: 0;
+ height: 0;
+ padding: 0;
+ position: absolute;
+ overflow: hidden;
+ }
+ }
+ /* Hide main scroller when only the ToC is visible anyway */
+ @media screen and (max-width: 28em) {
+ body.toc-sidebar {
+ overflow: hidden;
+ }
+ }
+
+ /* Sidebar with its own space */
+ @media screen and (min-width: 78em) {
+ body:not(.toc-inline) #toc {
+ position: fixed;
+ top: 0; bottom: 0;
+ left: 0;
+ width: 23.5em;
+ overflow: auto;
+ padding: 0 1em;
+ padding-left: 42px;
+ padding-left: calc(1em + 26px);
+ background: inherit;
+ background-color: #f7f8f9;
+ z-index: 1;
+ box-shadow: -.1em 0 .25em rgba(0,0,0,.1) inset;
+ }
+ body:not(.toc-inline) #toc h2 {
+ margin-top: .8rem;
+ font-variant: small-caps;
+ font-variant: all-small-caps;
+ text-transform: lowercase;
+ font-weight: bold;
+ color: gray;
+ color: hsla(203,20%,40%,.7);
+ }
+
+ body:not(.toc-inline) {
+ padding-left: 29em;
+ }
+ /* See also Overflow section at the bottom */
+
+ body:not(.toc-inline) #toc-jump:not(:focus) {
+ width: 0;
+ height: 0;
+ padding: 0;
+ position: absolute;
+ overflow: hidden;
+ }
+ }
+ @media screen and (min-width: 90em) {
+ body:not(.toc-inline) {
+ margin: 0 4em;
+ }
+ }
+
+/******************************************************************************/
+/* Sectioning */
+/******************************************************************************/
+
+/** Headings ******************************************************************/
+
+ h1, h2, h3, h4, h5, h6, dt {
+ page-break-after: avoid;
+ page-break-inside: avoid;
+ font: 100% sans-serif; /* Reset all font styling to clear out UA styles */
+ font-family: inherit; /* Inherit the font family. */
+ line-height: 1.2; /* Keep wrapped headings compact */
+ hyphens: manual; /* Hyphenated headings look weird */
+ }
+
+ h2, h3, h4, h5, h6 {
+ margin-top: 3rem;
+ }
+
+ h1, h2, h3 {
+ color: #005A9C;
+ background: transparent;
+ }
+
+ h1 { font-size: 170%; }
+ h2 { font-size: 140%; }
+ h3 { font-size: 120%; }
+ h4 { font-weight: bold; }
+ h5 { font-style: italic; }
+ h6 { font-variant: small-caps; }
+ dt { font-weight: bold; }
+
+/** Subheadings ***************************************************************/
+
+ h1 + h2,
+ #subtitle {
+ /* #subtitle is a subtitle in an H2 under the H1 */
+ margin-top: 0;
+ }
+ h2 + h3,
+ h3 + h4,
+ h4 + h5,
+ h5 + h6 {
+ margin-top: 1.2em; /* = 1 x line-height */
+ }
+
+/** Section divider ***********************************************************/
+
+ :not(.head) > hr {
+ font-size: 1.5em;
+ text-align: center;
+ margin: 1em auto;
+ height: auto;
+ border: transparent solid 0;
+ background: transparent;
+ }
+ :not(.head) > hr::before {
+ content: "\2727\2003\2003\2727\2003\2003\2727";
+ }
+
+/******************************************************************************/
+/* Paragraphs and Lists */
+/******************************************************************************/
+
+ p {
+ margin: 1em 0;
+ }
+
+ dd > p:first-child,
+ li > p:first-child {
+ margin-top: 0;
+ }
+
+ ul, ol {
+ margin-left: 0;
+ padding-left: 2em;
+ }
+
+ li {
+ margin: 0.25em 0 0.5em;
+ padding: 0;
+ }
+
+ dl dd {
+ margin: 0 0 .5em 2em;
+ }
+
+ .head dd + dd { /* compact for header */
+ margin-top: -.5em;
+ }
+
+ /* Style for algorithms */
+ ol.algorithm ol:not(.algorithm) {
+ border-left: 0.5em solid #DEF;
+ }
+
+ /* Style for switch/case s */
+ dl.switch > dd > ol.only {
+ margin-left: 0;
+ }
+ dl.switch > dd > ol.algorithm {
+ margin-left: -2em;
+ }
+ dl.switch {
+ padding-left: 2em;
+ }
+ dl.switch > dt {
+ text-indent: -1.5em;
+ margin-top: 1em;
+ }
+ dl.switch > dt + dt {
+ margin-top: 0;
+ }
+ dl.switch > dt::before {
+ content: '\21AA';
+ padding: 0 0.5em 0 0;
+ display: inline-block;
+ width: 1em;
+ text-align: right;
+ line-height: 0.5em;
+ }
+
+/** Terminology Markup ********************************************************/
+
+
+/******************************************************************************/
+/* Inline Markup */
+/******************************************************************************/
+
+/** Terminology Markup ********************************************************/
+ dfn { /* Defining instance */
+ font-weight: bolder;
+ }
+ a > i { /* Instance of term */
+ font-style: normal;
+ }
+ dt dfn code, code.idl {
+ font-size: inherit;
+ }
+ dfn var {
+ font-style: normal;
+ }
+
+/** Change Marking ************************************************************/
+
+ del { color: red; text-decoration: line-through; }
+ ins { color: #080; text-decoration: underline; }
+
+/** Miscellaneous improvements to inline formatting ***************************/
+
+ sup {
+ vertical-align: super;
+ font-size: 80%
+ }
+
+/******************************************************************************/
+/* Code */
+/******************************************************************************/
+
+/** General monospace/pre rules ***********************************************/
+
+ pre, code, samp {
+ font-family: Menlo, Consolas, "DejaVu Sans Mono", Monaco, monospace;
+ font-size: .9em;
+ page-break-inside: avoid;
+ hyphens: none;
+ text-transform: none;
+ }
+ pre code,
+ code code {
+ font-size: 100%;
+ }
+
+ pre {
+ margin-top: 1em;
+ margin-bottom: 1em;
+ overflow: auto;
+ }
+
+/** Inline Code fragments *****************************************************/
+
+ /* Do something nice. */
+
+/******************************************************************************/
+/* Links */
+/******************************************************************************/
+
+/** General Hyperlinks ********************************************************/
+
+ /* We hyperlink a lot, so make it less intrusive */
+ a[href] {
+ color: #034575;
+ text-decoration: none;
+ border-bottom: 1px solid #707070;
+ /* Need a bit of extending for it to look okay */
+ padding: 0 1px 0;
+ margin: 0 -1px 0;
+ }
+ a:visited {
+ border-bottom-color: #BBB;
+ }
+
+ /* Use distinguishing colors when user is interacting with the link */
+ a[href]:focus,
+ a[href]:hover {
+ background: #f8f8f8;
+ background: rgba(75%, 75%, 75%, .25);
+ border-bottom-width: 3px;
+ margin-bottom: -2px;
+ }
+ a[href]:active {
+ color: #C00;
+ border-color: #C00;
+ }
+
+ /* Backout above styling for W3C logo */
+ .head p:not(.copyright) > a,
+ .head > a:first-child {
+ border: none;
+ text-decoration: none;
+ background: transparent;
+ }
+
+/******************************************************************************/
+/* Images */
+/******************************************************************************/
+
+ img {
+ border-style: none;
+ }
+
+ /* For autogen numbers, add
+ .caption::before, figcaption::before { content: "Figure " counter(figure) ". "; }
+ */
+
+ figure, .figure, .sidefigure {
+ page-break-inside: avoid;
+ text-align: center;
+ margin: 2.5em 0;
+ }
+ .figure img, .sidefigure img, figure img,
+ .figure object, .sidefigure object, figure object {
+ max-width: 100%;
+ margin: auto;
+ }
+ .figure pre, .sidefigure pre, figure pre {
+ text-align: left;
+ display: table;
+ margin: 1em auto;
+ }
+ .figure table, figure table {
+ margin: auto;
+ }
+ @media screen and (min-width: 20em) {
+ .sidefigure {
+ float: right;
+ width: 50%;
+ margin: 0 0 0.5em 0.5em
+ }
+ }
+ .caption, figcaption, caption {
+ font-style: italic;
+ font-size: 90%;
+ }
+ .caption::before, figcaption::before, figcaption > .marker {
+ font-weight: bold;
+ }
+ .caption, figcaption {
+ counter-increment: figure;
+ }
+
+ /* DL list is indented 2em, but figure inside it is not */
+ dd > .figure, dd > figure { margin-left: -2em }
+
+/******************************************************************************/
+/* Colored Boxes */
+/******************************************************************************/
+
+ .issue, .note, .example, .advisement, blockquote {
+ padding: .5em;
+ border: .5em;
+ border-left-style: solid;
+ page-break-inside: avoid;
+ }
+ span.issue, span.note {
+ padding: .1em .5em .15em;
+ border-right-style: solid;
+ }
+
+ .issue,
+ .note,
+ .example,
+ .advisement,
+ blockquote {
+ margin: 1em auto;
+ }
+ .note > p:first-child,
+ .issue > p:first-child,
+ blockquote > :first-child {
+ margin-top: 0;
+ }
+ blockquote > :last-child {
+ margin-bottom: 0;
+ }
+
+/** Blockquotes ***************************************************************/
+
+ blockquote {
+ border-color: silver;
+ }
+
+/** Open issue ****************************************************************/
+
+ .issue {
+ border-color: #E05252;
+ background: #FBE9E9;
+ counter-increment: issue;
+ overflow: auto;
+ }
+ .issue::before, .issue > .marker {
+ text-transform: uppercase;
+ color: #AE1E1E;
+ padding-right: 1em;
+ text-transform: uppercase;
+ }
+ /* Add .issue::before { content: "Issue " counter(issue); } for autogen numbers,
+ or use class="marker" to mark up the issue number in source. */
+
+/** Example *******************************************************************/
+
+ .example {
+ border-color: #E0CB52;
+ background: #FCFAEE;
+ counter-increment: example;
+ overflow: auto;
+ clear: both;
+ }
+ .example::before, .example > .marker {
+ text-transform: uppercase;
+ color: #827017;
+ min-width: 7.5em;
+ display: block;
+ }
+ /* Add .example::before { content: "Example " counter(example); } for autogen numbers,
+ or use class="marker" to mark up the example number in source. */
+
+/** Non-normative Note ********************************************************/
+
+ .note {
+ border-color: #52E052;
+ background: #E9FBE9;
+ overflow: auto;
+ }
+
+ .note::before, .note > .marker,
+ details.note > summary::before,
+ details.note > summary > .marker {
+ text-transform: uppercase;
+ display: block;
+ color: hsl(120, 70%, 30%);
+ }
+ /* Add .note::before { content: "Note"; } for autogen label,
+ or use class="marker" to mark up the label in source. */
+
+ details.note > summary {
+ display: block;
+ color: hsl(120, 70%, 30%);
+ }
+ details.note[open] > summary {
+ border-bottom: 1px silver solid;
+ }
+
+/** Advisement Box ************************************************************/
+ /* for attention-grabbing normative statements */
+
+ .advisement {
+ border-color: orange;
+ border-style: none solid;
+ background: #FFEECC;
+ }
+ strong.advisement {
+ display: block;
+ text-align: center;
+ }
+ .advisement > .marker {
+ color: #B35F00;
+ }
+
+/** Spec Obsoletion Notice ****************************************************/
+ /* obnoxious obsoletion notice for older/abandoned specs. */
+
+ details {
+ display: block;
+ }
+ summary {
+ font-weight: bolder;
+ }
+
+ .annoying-warning:not(details),
+ details.annoying-warning:not([open]) > summary,
+ details.annoying-warning[open] {
+ background: #fdd;
+ color: red;
+ font-weight: bold;
+ padding: .75em 1em;
+ border: thick red;
+ border-style: solid;
+ border-radius: 1em;
+ }
+ .annoying-warning :last-child {
+ margin-bottom: 0;
+ }
+
+@media not print {
+ details.annoying-warning[open] {
+ position: fixed;
+ left: 1em;
+ right: 1em;
+ bottom: 1em;
+ z-index: 1000;
+ }
+}
+
+ details.annoying-warning:not([open]) > summary {
+ text-align: center;
+ }
+
+/** Entity Definition Boxes ***************************************************/
+
+ .def {
+ padding: .5em 1em;
+ background: #DEF;
+ margin: 1.2em 0;
+ border-left: 0.5em solid #8CCBF2;
+ }
+
+/******************************************************************************/
+/* Tables */
+/******************************************************************************/
+
+ th, td {
+ text-align: left;
+ text-align: start;
+ }
+
+/** Property/Descriptor Definition Tables *************************************/
+
+ table.def {
+ /* inherits .def box styling, see above */
+ width: 100%;
+ border-spacing: 0;
+ }
+
+ table.def td,
+ table.def th {
+ padding: 0.5em;
+ vertical-align: baseline;
+ border-bottom: 1px solid #bbd7e9;
+ }
+
+ table.def > tbody > tr:last-child th,
+ table.def > tbody > tr:last-child td {
+ border-bottom: 0;
+ }
+
+ table.def th {
+ font-style: italic;
+ font-weight: normal;
+ padding-left: 1em;
+ width: 3em;
+ }
+
+ /* For when values are extra-complex and need formatting for readability */
+ table td.pre {
+ white-space: pre-wrap;
+ }
+
+ /* A footnote at the bottom of a def table */
+ table.def td.footnote {
+ padding-top: 0.6em;
+ }
+ table.def td.footnote::before {
+ content: " ";
+ display: block;
+ height: 0.6em;
+ width: 4em;
+ border-top: thin solid;
+ }
+
+/** Data tables (and properly marked-up index tables) *************************/
+ /*
+ highlights structural relationships in a table
+ when correct markup is used (e.g. thead/tbody, th vs. td, scope attribute)
+
+ Use class="complex data" for particularly complicated tables --
+ (This will draw more lines: busier, but clearer.)
+
+ Use class="long" on table cells with paragraph-like contents
+ (This will adjust text alignment accordingly.)
+ Alternately use class="longlastcol" on tables, to have the last column assume "long".
+ */
+
+ table {
+ word-wrap: normal;
+ overflow-wrap: normal;
+ hyphens: manual;
+ }
+
+ table.data,
+ table.index {
+ margin: 1em auto;
+ border-collapse: collapse;
+ border: hidden;
+ width: 100%;
+ table-layout: fixed;
+ }
+ table.data caption,
+ table.index caption {
+ max-width: 50em;
+ margin: 0 auto 1em;
+ }
+
+ table.data td, table.data th,
+ table.index td, table.index th {
+ padding: 0.5em 1em;
+ border-width: 1px;
+ border-color: silver;
+ border-top-style: solid;
+ }
+
+ table.data thead td:empty {
+ padding: 0;
+ border: 0;
+ }
+
+ table.data thead,
+ table.index thead,
+ table.data tbody,
+ table.index tbody {
+ border-bottom: 2px solid;
+ }
+
+ table.data colgroup,
+ table.index colgroup {
+ border-left: 2px solid;
+ }
+
+ table.data tbody th:first-child,
+ table.index tbody th:first-child {
+ border-right: 2px solid;
+ border-top: 1px solid silver;
+ padding-right: 1em;
+ }
+
+ table.data th[colspan],
+ table.data td[colspan] {
+ text-align: center;
+ }
+
+ table.complex.data th,
+ table.complex.data td {
+ border: 1px solid silver;
+ text-align: center;
+ }
+
+ table.data.longlastcol td:last-child,
+ table.data td.long {
+ vertical-align: baseline;
+ text-align: left;
+ }
+
+ table.data img {
+ vertical-align: middle;
+ }
+
+
+/*
+Alternate table alignment rules
+
+ table.data,
+ table.index {
+ text-align: center;
+ }
+
+ table.data thead th[scope="row"],
+ table.index thead th[scope="row"] {
+ text-align: right;
+ }
+
+ table.data tbody th:first-child,
+ table.index tbody th:first-child {
+ text-align: right;
+ }
+
+Possible extra rowspan handling
+
+ table.data tbody th[rowspan]:not([rowspan='1']),
+ table.index tbody th[rowspan]:not([rowspan='1']),
+ table.data tbody td[rowspan]:not([rowspan='1']),
+ table.index tbody td[rowspan]:not([rowspan='1']) {
+ border-left: 1px solid silver;
+ }
+
+ table.data tbody th[rowspan]:first-child,
+ table.index tbody th[rowspan]:first-child,
+ table.data tbody td[rowspan]:first-child,
+ table.index tbody td[rowspan]:first-child{
+ border-left: 0;
+ border-right: 1px solid silver;
+ }
+*/
+
+/******************************************************************************/
+/* Indices */
+/******************************************************************************/
+
+
+/** Table of Contents *********************************************************/
+
+ .toc a {
+ /* More spacing; use padding to make it part of the click target. */
+ padding-top: 0.1rem;
+ /* Larger, more consistently-sized click target */
+ display: block;
+ /* Reverse color scheme */
+ color: black;
+ border-color: #3980B5;
+ }
+ .toc a:visited {
+ border-color: #054572;
+ }
+ .toc a:not(:focus):not(:hover) {
+ /* Allow colors to cascade through from link styling */
+ border-bottom-color: transparent;
+ }
+
+ .toc, .toc ol, .toc ul, .toc li {
+ list-style: none; /* Numbers must be inlined into source */
+ /* because generated content isn't search/selectable and markers can't do multilevel yet */
+ margin: 0;
+ padding: 0;
+ line-height: 1.1rem; /* consistent spacing */
+ }
+
+ /* ToC not indented until third level, but font style & margins show hierarchy */
+ .toc > li { font-weight: bold; }
+ .toc > li li { font-weight: normal; }
+ .toc > li li li { font-size: 95%; }
+ .toc > li li li li { font-size: 90%; }
+ .toc > li li li li li { font-size: 85%; }
+
+ .toc > li { margin: 1.5rem 0; }
+ .toc > li li { margin: 0.3rem 0; }
+ .toc > li li li { margin-left: 2rem; }
+
+ /* Section numbers in a column of their own */
+ .toc .secno {
+ float: left;
+ width: 4rem;
+ white-space: nowrap;
+ }
+ .toc > li li li li .secno {
+ font-size: 85%;
+ }
+ .toc > li li li li li .secno {
+ font-size: 100%;
+ }
+
+ :not(li) > .toc { margin-left: 5rem; }
+ .toc .secno { margin-left: -5rem; }
+ .toc > li li li .secno { margin-left: -7rem; }
+ .toc > li li li li .secno { margin-left: -9rem; }
+ .toc > li li li li li .secno { margin-left: -11rem; }
+ .toc > li li li li li .secno { margin-left: -13rem; }
+
+ /* Tighten up indentation in narrow ToCs */
+ @media (max-width: 30em) {
+ :not(li) > .toc { margin-left: 4rem; }
+ .toc .secno { margin-left: -4rem; }
+ .toc > li li li { margin-left: 1rem; }
+ .toc > li li li .secno { margin-left: -5rem; }
+ .toc > li li li li .secno { margin-left: -6rem; }
+ .toc > li li li li li .secno { margin-left: -7rem; }
+ .toc > li li li li li li .secno { margin-left: -8rem; }
+ }
+ @media screen and (min-width: 78em) {
+ body:not(.toc-inline) :not(li) > .toc { margin-left: 4rem; }
+ body:not(.toc-inline) .toc .secno { margin-left: -4rem; }
+ body:not(.toc-inline) .toc > li li li { margin-left: 1rem; }
+ body:not(.toc-inline) .toc > li li li .secno { margin-left: -5rem; }
+ body:not(.toc-inline) .toc > li li li li .secno { margin-left: -6rem; }
+ body:not(.toc-inline) .toc > li li li li li .secno { margin-left: -7rem; }
+ body:not(.toc-inline) .toc > li li li li li li .secno { margin-left: -8rem; }
+ }
+ body.toc-sidebar #toc :not(li) > .toc { margin-left: 4rem; }
+ body.toc-sidebar #toc .toc .secno { margin-left: -4rem; }
+ body.toc-sidebar #toc .toc > li li li { margin-left: 1rem; }
+ body.toc-sidebar #toc .toc > li li li .secno { margin-left: -5rem; }
+ body.toc-sidebar #toc .toc > li li li li .secno { margin-left: -6rem; }
+ body.toc-sidebar #toc .toc > li li li li li .secno { margin-left: -7rem; }
+ body.toc-sidebar #toc .toc > li li li li li li .secno { margin-left: -8rem; }
+ .toc li {
+ clear: both;
+ }
+
+
+/** Index *********************************************************************/
+
+ /* Index Lists: Layout */
+ ul.index { margin-left: 0; columns: 15em; text-indent: 1em hanging; }
+ ul.index li { margin-left: 0; list-style: none; break-inside: avoid; }
+ ul.index li li { margin-left: 1em }
+ ul.index dl { margin-top: 0; }
+ ul.index dt { margin: .2em 0 .2em 20px;}
+ ul.index dd { margin: .2em 0 .2em 40px;}
+ /* Index Lists: Typography */
+ ul.index ul,
+ ul.index dl { font-size: smaller; }
+ @media not print {
+ ul.index li span {
+ white-space: nowrap;
+ color: transparent; }
+ ul.index li a:hover + span,
+ ul.index li a:focus + span {
+ color: #707070;
+ }
+ }
+
+/** Index Tables *****************************************************/
+ /* See also the data table styling section, which this effectively subclasses */
+
+ table.index {
+ font-size: small;
+ border-collapse: collapse;
+ border-spacing: 0;
+ text-align: left;
+ margin: 1em 0;
+ }
+
+ table.index td,
+ table.index th {
+ padding: 0.4em;
+ }
+
+ table.index tr:hover td:not([rowspan]),
+ table.index tr:hover th:not([rowspan]) {
+ background: #f7f8f9;
+ }
+
+ /* The link in the first column in the property table (formerly a TD) */
+ table.index th:first-child a {
+ font-weight: bold;
+ }
+
+/******************************************************************************/
+/* Print */
+/******************************************************************************/
+
+ @media print {
+ /* Pages have their own margins. */
+ html {
+ margin: 0;
+ }
+ /* Serif for print. */
+ body {
+ font-family: serif;
+ }
+ }
+ @page {
+ margin: 1.5cm 1.1cm;
+ }
+
+/******************************************************************************/
+/* Legacy */
+/******************************************************************************/
+
+ /* This rule is inherited from past style sheets. No idea what it's for. */
+ .hide { display: none }
+
+
+
+/******************************************************************************/
+/* Overflow Control */
+/******************************************************************************/
+
+ .figure .caption, .sidefigure .caption, figcaption {
+ /* in case figure is overlarge, limit caption to 50em */
+ max-width: 50rem;
+ margin-left: auto;
+ margin-right: auto;
+ }
+ .overlarge > table {
+ /* limit preferred width of table */
+ max-width: 50em;
+ margin-left: auto;
+ margin-right: auto;
+ }
+
+ @media (min-width: 55em) {
+ .overlarge {
+ margin-left: calc(13px + 26.5rem - 50vw);
+ margin-right: calc(13px + 26.5rem - 50vw);
+ max-width: none;
+ }
+ }
+ @media screen and (min-width: 78em) {
+ body:not(.toc-inline) .overlarge {
+ /* 30.5em body padding 50em content area */
+ margin-left: calc(40em - 50vw) !important;
+ margin-right: calc(40em - 50vw) !important;
+ }
+ }
+ @media screen and (min-width: 90em) {
+ body:not(.toc-inline) .overlarge {
+ /* 4em html margin 30.5em body padding 50em content area */
+ margin-left: 0 !important;
+ margin-right: calc(84.5em - 100vw) !important;
+ }
+ }
+
+ @media not print {
+ .overlarge {
+ overflow-x: auto;
+ /* See Lea Verou's explanation background-attachment:
+ * http://lea.verou.me/2012/04/background-attachment-local/
+ *
+ background: top left / 4em 100% linear-gradient(to right, #ffffff, rgba(255, 255, 255, 0)) local,
+ top right / 4em 100% linear-gradient(to left, #ffffff, rgba(255, 255, 255, 0)) local,
+ top left / 1em 100% linear-gradient(to right, #c3c3c5, rgba(195, 195, 197, 0)) scroll,
+ top right / 1em 100% linear-gradient(to left, #c3c3c5, rgba(195, 195, 197, 0)) scroll,
+ white;
+ background-repeat: no-repeat;
+ */
+ }
+ }
diff --git a/docs/xqdoc/resources/page.css b/docs/xqdoc/resources/page.css
new file mode 100644
index 0000000..7693ed5
--- /dev/null
+++ b/docs/xqdoc/resources/page.css
@@ -0,0 +1,295 @@
+body {
+ font-family: Helvetica;
+ padding: 0.5em 1em;
+}
+
+
+
+pre {
+ font-family: Inconsolata, Consolas, monospace;
+}
+
+ol.results {
+ padding-left: 0;
+}
+
+.footer {
+ text-align: right;
+ border-top: solid 4px;
+ padding: 0.25em 0.5em;
+ font-size: 85%;
+ color: #999;
+}
+
+li.result {
+ list-style-position: inside;
+ list-style: none;
+ height: 140px;
+}
+
+h2 {
+ display: inline-block;
+ margin: 0;
+}
+
+h2 a, .result h3 a {
+ text-decoration: inherit;
+ color: inherit;
+}
+
+h3 {
+ font-size: 140%;
+ background-color: #aaa;
+ border-bottom: 1px solid #000;
+ width: 100%;
+}
+
+h4 {
+ font-size: 100%;
+ background-color: #ddd;
+ width: 90%;
+}
+
+
+
+td {
+ vertical-align: text-top;
+}
+/* from bootstrap 4.3.1 */
+.badge {
+ display: inline-block;
+ padding: 0.25em 0.4em;
+ font-size: 75%;
+ font-weight: 700;
+ line-height: 1;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: 0.25rem;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+
+
+a.badge:hover, a.badge:focus {
+ text-decoration: none;
+}
+
+.badge:empty {
+ display: none;
+}
+
+.btn .badge {
+ position: relative;
+ top: -1px;
+}
+
+.badge-pill {
+ padding-right: 0.6em;
+ padding-left: 0.6em;
+ border-radius: 10rem;
+}
+
+.badge-primary {
+ color: #fff;
+ background-color: #007bff;
+}
+
+a.badge-primary:hover, a.badge-primary:focus {
+ color: #fff;
+ background-color: #0062cc;
+}
+
+a.badge-primary:focus, a.badge-primary.focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);
+}
+
+.badge-secondary {
+ color: #fff;
+ background-color: #6c757d;
+}
+
+a.badge-secondary:hover, a.badge-secondary:focus {
+ color: #fff;
+ background-color: #545b62;
+}
+
+a.badge-secondary:focus, a.badge-secondary.focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
+}
+
+.badge-success {
+ color: #fff;
+ background-color: #28a745;
+}
+
+a.badge-success:hover, a.badge-success:focus {
+ color: #fff;
+ background-color: #1e7e34;
+}
+
+a.badge-success:focus, a.badge-success.focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);
+}
+
+.badge-info {
+ color: #fff;
+ background-color: #17a2b8;
+}
+
+a.badge-info:hover, a.badge-info:focus {
+ color: #fff;
+ background-color: #117a8b;
+}
+
+a.badge-info:focus, a.badge-info.focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);
+}
+
+.badge-warning {
+ color: #212529;
+ background-color: #ffc107;
+}
+
+a.badge-warning:hover, a.badge-warning:focus {
+ color: #212529;
+ background-color: #d39e00;
+}
+
+a.badge-warning:focus, a.badge-warning.focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
+}
+
+.badge-danger {
+ color: #fff;
+ background-color: #dc3545;
+}
+
+a.badge-danger:hover, a.badge-danger:focus {
+ color: #fff;
+ background-color: #bd2130;
+}
+
+a.badge-danger:focus, a.badge-danger.focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);
+}
+
+.badge-light {
+ color: #212529;
+ background-color: #f8f9fa;
+}
+
+a.badge-light:hover, a.badge-light:focus {
+ color: #212529;
+ background-color: #dae0e5;
+}
+
+a.badge-light:focus, a.badge-light.focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);
+}
+
+.badge-dark {
+ color: #fff;
+ background-color: #343a40;
+}
+
+a.badge-dark:hover, a.badge-dark:focus {
+ color: #fff;
+ background-color: #1d2124;
+}
+
+a.badge-dark:focus, a.badge-dark.focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
+}
+.op-get {
+ color: #fff;
+ background-color: #61affe;
+}
+
+.op-post {
+ color: #fff;
+ background-color: #49cc90;
+}
+
+.op-put{
+ color: #fff;
+ background-color: #fca130;
+}
+
+.op-delete {
+ color: #fff;
+ background-color: #f93e3e;
+}
+.op-patch{
+ color: #fff;
+ background-color: #17a2b8;
+}
+.op-all{
+ color: #fff;
+ background-color: #17a2b8;
+}
+
+
+/* https://www.w3schools.com/howto/howto_js_treeview.asp */
+ /* Remove default bullets */
+ul.tree,
+ul.nested
+{
+ list-style-type: none;
+}
+
+
+
+/* Style the caret/arrow */
+.caret {
+ cursor: pointer;
+ user-select: none; /* Prevent text selection */
+}
+
+/* Create the caret/arrow with a unicode, and style it */
+.caret::before {
+ content: "\25B6";
+ color: black;
+ display: inline-block;
+ margin-right: 6px;
+}
+
+/* Rotate the caret/arrow icon when clicked on (using JavaScript) */
+.caret-down::before {
+ transform: rotate(90deg);
+}
+
+/* Hide the nested list */
+.nested {
+ display: none;
+}
+
+/* Show the nested list when the user clicks on the caret/arrow (with JavaScript) */
+.active {
+ display: block;
+}
+
+/* https://css-tricks.com/on-target/ */
+:target {
+ animation: highlight 1s ease;
+ transform: translateX(20px);
+}
+@keyframes highlight {
+ 0% { border-left-color: red; }
+ 100% { border-left-color: white; }
+}
+section > div {
+ border-left: 40px solid white;
+ padding: 10px;
+ transition: all 0.5s ease;
+ padding-right: 50px;
+ margin-left: -20px;
+}
\ No newline at end of file
diff --git a/docs/xqdoc/resources/prism/1.29.0/prism.css b/docs/xqdoc/resources/prism/1.29.0/prism.css
new file mode 100644
index 0000000..ba69077
--- /dev/null
+++ b/docs/xqdoc/resources/prism/1.29.0/prism.css
@@ -0,0 +1,5 @@
+/* PrismJS 1.29.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+xquery&plugins=line-numbers+toolbar+copy-to-clipboard */
+code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}
+pre[class*=language-].line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right}
+div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;z-index:10;top:.3em;right:.2em;transition:opacity .3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,.2);box-shadow:0 2px 0 0 rgba(0,0,0,.2);border-radius:.5em}div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover{color:inherit;text-decoration:none}
diff --git a/docs/xqdoc/resources/prism/1.29.0/prism.js b/docs/xqdoc/resources/prism/1.29.0/prism.js
new file mode 100644
index 0000000..b4132b3
--- /dev/null
+++ b/docs/xqdoc/resources/prism/1.29.0/prism.js
@@ -0,0 +1,11 @@
+/* PrismJS 1.29.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+xquery&plugins=line-numbers+toolbar+copy-to-clipboard */
+var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=g.reach);A+=w.value.length,w=w.next){var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){var P,L=1;if(y){if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(jg.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){var I={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a"+i.content+""+i.tag+">"},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
+Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,(function(){return a})),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml;
+!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:[^;{\\s\"']|\\s+(?!\\s)|"+e.source+")*?(?:;|(?=\\s*\\{))"),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism);
+Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};
+Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript;
+!function(e){e.languages.xquery=e.languages.extend("markup",{"xquery-comment":{pattern:/\(:[\s\S]*?:\)/,greedy:!0,alias:"comment"},string:{pattern:/(["'])(?:\1\1|(?!\1)[\s\S])*\1/,greedy:!0},extension:{pattern:/\(#.+?#\)/,alias:"symbol"},variable:/\$[-\w:]+/,axis:{pattern:/(^|[^-])(?:ancestor(?:-or-self)?|attribute|child|descendant(?:-or-self)?|following(?:-sibling)?|parent|preceding(?:-sibling)?|self)(?=::)/,lookbehind:!0,alias:"operator"},"keyword-operator":{pattern:/(^|[^:-])\b(?:and|castable as|div|eq|except|ge|gt|idiv|instance of|intersect|is|le|lt|mod|ne|or|union)\b(?=$|[^:-])/,lookbehind:!0,alias:"operator"},keyword:{pattern:/(^|[^:-])\b(?:as|ascending|at|base-uri|boundary-space|case|cast as|collation|construction|copy-namespaces|declare|default|descending|else|empty (?:greatest|least)|encoding|every|external|for|function|if|import|in|inherit|lax|let|map|module|namespace|no-inherit|no-preserve|option|order(?: by|ed|ing)?|preserve|return|satisfies|schema|some|stable|strict|strip|then|to|treat as|typeswitch|unordered|validate|variable|version|where|xquery)\b(?=$|[^:-])/,lookbehind:!0},function:/[\w-]+(?::[\w-]+)*(?=\s*\()/,"xquery-element":{pattern:/(element\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"tag"},"xquery-attribute":{pattern:/(attribute\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"attr-name"},builtin:{pattern:/(^|[^:-])\b(?:attribute|comment|document|element|processing-instruction|text|xs:(?:ENTITIES|ENTITY|ID|IDREFS?|NCName|NMTOKENS?|NOTATION|Name|QName|anyAtomicType|anyType|anyURI|base64Binary|boolean|byte|date|dateTime|dayTimeDuration|decimal|double|duration|float|gDay|gMonth|gMonthDay|gYear|gYearMonth|hexBinary|int|integer|language|long|negativeInteger|nonNegativeInteger|nonPositiveInteger|normalizedString|positiveInteger|short|string|time|token|unsigned(?:Byte|Int|Long|Short)|untyped(?:Atomic)?|yearMonthDuration))\b(?=$|[^:-])/,lookbehind:!0},number:/\b\d+(?:\.\d+)?(?:E[+-]?\d+)?/,operator:[/[+*=?|@]|\.\.?|:=|!=|<[=<]?|>[=>]?/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}],punctuation:/[[\](){},;:/]/}),e.languages.xquery.tag.pattern=/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/,e.languages.xquery.tag.inside["attr-value"].pattern=/=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+)/,e.languages.xquery.tag.inside["attr-value"].inside.punctuation=/^="|"$/,e.languages.xquery.tag.inside["attr-value"].inside.expression={pattern:/\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}/,inside:e.languages.xquery,alias:"language-xquery"};var t=function(e){return"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(t).join("")},n=function(a){for(var o=[],i=0;i0&&o[o.length-1].tagName===t(r.content[0].content[1])&&o.pop():"/>"===r.content[r.content.length-1].content||o.push({tagName:t(r.content[0].content[1]),openedBraces:0}):!(o.length>0&&"punctuation"===r.type&&"{"===r.content)||a[i+1]&&"punctuation"===a[i+1].type&&"{"===a[i+1].content||a[i-1]&&"plain-text"===a[i-1].type&&"{"===a[i-1].content?o.length>0&&o[o.length-1].openedBraces>0&&"punctuation"===r.type&&"}"===r.content?o[o.length-1].openedBraces--:"comment"!==r.type&&(s=!0):o[o.length-1].openedBraces++),(s||"string"==typeof r)&&o.length>0&&0===o[o.length-1].openedBraces){var l=t(r);i0&&("string"==typeof a[i-1]||"plain-text"===a[i-1].type)&&(l=t(a[i-1])+l,a.splice(i-1,1),i--),/^\s+$/.test(l)?a[i]=l:a[i]=new e.Token("plain-text",l,null,l)}r.content&&"string"!=typeof r.content&&n(r.content)}};e.hooks.add("after-tokenize",(function(e){"xquery"===e.language&&n(e.tokens)}))}(Prism);
+!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var e="line-numbers",n=/\n(?!$)/g,t=Prism.plugins.lineNumbers={getLine:function(n,t){if("PRE"===n.tagName&&n.classList.contains(e)){var i=n.querySelector(".line-numbers-rows");if(i){var r=parseInt(n.getAttribute("data-start"),10)||1,s=r+(i.children.length-1);ts&&(t=s);var l=t-r;return i.children[l]}}},resize:function(e){r([e])},assumeViewportIndependence:!0},i=void 0;window.addEventListener("resize",(function(){t.assumeViewportIndependence&&i===window.innerWidth||(i=window.innerWidth,r(Array.prototype.slice.call(document.querySelectorAll("pre.line-numbers"))))})),Prism.hooks.add("complete",(function(t){if(t.code){var i=t.element,s=i.parentNode;if(s&&/pre/i.test(s.nodeName)&&!i.querySelector(".line-numbers-rows")&&Prism.util.isActive(i,e)){i.classList.remove(e),s.classList.add(e);var l,o=t.code.match(n),a=o?o.length+1:1,u=new Array(a+1).join(" ");(l=document.createElement("span")).setAttribute("aria-hidden","true"),l.className="line-numbers-rows",l.innerHTML=u,s.hasAttribute("data-start")&&(s.style.counterReset="linenumber "+(parseInt(s.getAttribute("data-start"),10)-1)),t.element.appendChild(l),r([s]),Prism.hooks.run("line-numbers",t)}}})),Prism.hooks.add("line-numbers",(function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0}))}function r(e){if(0!=(e=e.filter((function(e){var n,t=(n=e,n?window.getComputedStyle?getComputedStyle(n):n.currentStyle||null:null)["white-space"];return"pre-wrap"===t||"pre-line"===t}))).length){var t=e.map((function(e){var t=e.querySelector("code"),i=e.querySelector(".line-numbers-rows");if(t&&i){var r=e.querySelector(".line-numbers-sizer"),s=t.textContent.split(n);r||((r=document.createElement("span")).className="line-numbers-sizer",t.appendChild(r)),r.innerHTML="0",r.style.display="block";var l=r.getBoundingClientRect().height;return r.innerHTML="",{element:e,lines:s,lineHeights:[],oneLinerHeight:l,sizer:r}}})).filter(Boolean);t.forEach((function(e){var n=e.sizer,t=e.lines,i=e.lineHeights,r=e.oneLinerHeight;i[t.length-1]=void 0,t.forEach((function(e,t){if(e&&e.length>1){var s=n.appendChild(document.createElement("span"));s.style.display="block",s.textContent=e}else i[t]=r}))})),t.forEach((function(e){for(var n=e.sizer,t=e.lineHeights,i=0,r=0;r A plugin for [svg.js](https://github.com/svgdotjs/svg.js) that enables panzoom for svg elements
+
+## Getting started
+
+```
+npm install @svgdotjs/svg.js @svgdotjs/svg.panzoom.js
+```
+
+Include this plugin after including the svg.js library in your html document.
+
+```
+
+
+```
+
+Or for esm just import it:
+
+```
+import { SVG } from '@svgdotjs/svg.js'
+import '@svgdotjs/svg.panzoom.js'
+```
+
+To enable pan/zoom on an svg:
+
+```js
+// enables panZoom
+var canvas = SVG()
+ .addTo('#id')
+ .size(1000, 1000)
+ .panZoom()
+
+// zoom programatically
+canvas.zoom(lvl, point)
+```
+
+You can configure `panZoom` by passing options to it.
+
+- zoomMin: Minimal zoom level
+- zoomMax: Maximal zoom level
+- zoomFactor: How much is zoomed by one mouse wheel step
+
+This could look like this:
+
+```js
+var canvas = SVG()
+ .addTo('#id')
+ .size(1000, 1000)
+ .panZoom({ zoomMin: 0.5, zoomMax: 20 })
+```
+
+Setting the min and max value will automatically restrict the zoom to the provided level.
+However you are still able to change the zoom out of that bonds by calling `zoom(lvl)` programatically.
+
+On touchable devices a pinchZoom gesture is supported. Min and max values also apply here.
+
+Zooming is animatable, too:
+
+```js
+canvas
+ .zoom(1) // uses center of viewport by default
+ .animate()
+ .zoom(2, { x: 100, y: 100 }) // zoom into specified point
+```
+
+To disable `panZoom` or change its options just call it again with `false` or the new options.
+
+## Options
+
+You can override the default options by passing an object in to the `.panZoom({options})` call.
+
+| Option | Default | Description |
+| ------------ | ---------------- | -------------------------------------------------------------------------------------------------------------- |
+| panning | true | Enable panning |
+| pinchZoom | true | Enable pinch to zoom |
+| wheelZoom | true | Enable mouse wheel zoom |
+| panButton | 0 | Which mouse button to use for pan ([info](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button)) |
+| oneFingerPan | false | Enables the ability to pan with only one finger instead of two for touchdevices |
+| margins | false | An object {top, left, right, bottom} to restrict the pan area towards this side so that at least x user units of the opposite side are still visible |
+| zoomFactor | 2 | How quickly to zoom when using `wheelZoom` |
+| zoomMin | Number.MIN_VALUE | The minimum zoom level |
+| zoomMax | Number.MAX_VALUE | The maximum zoom level |
+| wheelZoomDeltaModeLinePixels | 17 | The multiplier to convert wheel zoom deltaY values from deltaMode=1 (lines) to deltaMode=0 (pixels) |
+| wheelZoomDeltaModeScreenPixels | 53 | The multiplier to convert wheel zoom deltaY values from deltaMode=2 (screen) to deltaMode=0 (pixels) |
+
+### Example:
+
+```js
+draw.panZoom({
+ wheelZoom: false,
+ zoomMin: 0.5,
+ zoomMax: 2
+})
+```
+
+This will disable wheel zooming and set the maximum zoom to 2 or 200% and the minimum zoom to 0.5 or 50%.
+
+## Events
+
+Multiple events are fired doing different actions. This allow you to respond
+to actions and in some cases stop an action via `preventDefault()`.
+
+`zoom` is fired when a mouse wheel event or programmable `zoom()` triggers
+a zoom. This usually doesn't happen on mobile devices, in which case
+`pinchZoomStart` is fired when a zoom happens.
+
+Events fired from SVG.js are [`CustomEvent`s](http://devdocs.io/dom/customevent),
+so the arguments passed from svg.panzoom.js are in in the `.detail` property.
+
+| Event Name | Argument Value | preventDefault support |
+| -------------- | ---------------- | ---------------------- |
+| zoom | `{ lvl, focus }` | YES |
+| panStart | `{ event }` | NO |
+| panEnd | `{ event }` | NO |
+| panning | `{ box }` | YES |
+| pinchZoomStart | `{ event }` | YES |
+| pinchZoomEnd | `{ event }` | NO |
+
+Where `lvl` is the new zoom level,
+[`focus`](https://svgjs.com/docs/3.0/classes/#svg-point) is th point of zoom, [`box`](https://svgjs.com/docs/3.0/classes/#svg-box) is the new calculated viewbox
+and event is the event that triggered the action.
+
+An example of stopping a pinch-zoom action:
+
+```js
+var canvas = SVG()
+ .addTo('#id')
+ .size(1000, 1000)
+ .panZoom()
+
+canvas.on('pinchZoomStart', function (ev) {
+ ev.preventDefault()
+ // ...
+})
+```
diff --git a/docs/xqdoc/resources/svgdotjs/svg.panzoom.js b/docs/xqdoc/resources/svgdotjs/svg.panzoom.js
new file mode 100644
index 0000000..fb4d286
--- /dev/null
+++ b/docs/xqdoc/resources/svgdotjs/svg.panzoom.js
@@ -0,0 +1,372 @@
+/*!
+* @svgdotjs/svg.panzoom.js - A plugin for svg.js that enables panzoom for viewport elements
+* @version 2.1.2
+* https://github.com/svgdotjs/svg.panzoom.js#readme
+*
+* @copyright undefined
+* @license MIT
+*
+* BUILT: Thu Jul 22 2021 14:51:35 GMT+0200 (Mitteleuropäische Sommerzeit)
+*/;
+(function (svg_js) {
+ 'use strict';
+
+ var normalizeEvent = function normalizeEvent(ev) {
+ return ev.touches || [{
+ clientX: ev.clientX,
+ clientY: ev.clientY
+ }];
+ };
+
+ svg_js.extend(svg_js.Svg, {
+ panZoom: function panZoom(options) {
+ var _options,
+ _options$zoomFactor,
+ _options$zoomMin,
+ _options$zoomMax,
+ _options$wheelZoom,
+ _options$pinchZoom,
+ _options$panning,
+ _options$panButton,
+ _options$oneFingerPan,
+ _options$margins,
+ _options$wheelZoomDel,
+ _options$wheelZoomDel2,
+ _this = this;
+
+ this.off('.panZoom'); // when called with false, disable panZoom
+
+ if (options === false) return this;
+ options = (_options = options) != null ? _options : {};
+ var zoomFactor = (_options$zoomFactor = options.zoomFactor) != null ? _options$zoomFactor : 2;
+ var zoomMin = (_options$zoomMin = options.zoomMin) != null ? _options$zoomMin : Number.MIN_VALUE;
+ var zoomMax = (_options$zoomMax = options.zoomMax) != null ? _options$zoomMax : Number.MAX_VALUE;
+ var doWheelZoom = (_options$wheelZoom = options.wheelZoom) != null ? _options$wheelZoom : true;
+ var doPinchZoom = (_options$pinchZoom = options.pinchZoom) != null ? _options$pinchZoom : true;
+ var doPanning = (_options$panning = options.panning) != null ? _options$panning : true;
+ var panButton = (_options$panButton = options.panButton) != null ? _options$panButton : 0;
+ var oneFingerPan = (_options$oneFingerPan = options.oneFingerPan) != null ? _options$oneFingerPan : false;
+ var margins = (_options$margins = options.margins) != null ? _options$margins : false;
+ var wheelZoomDeltaModeLinePixels = (_options$wheelZoomDel = options.wheelZoomDeltaModeLinePixels) != null ? _options$wheelZoomDel : 17;
+ var wheelZoomDeltaModeScreenPixels = (_options$wheelZoomDel2 = options.wheelZoomDeltaModeScreenPixels) != null ? _options$wheelZoomDel2 : 53;
+ var lastP;
+ var lastTouches;
+ var zoomInProgress = false;
+ var viewbox = this.viewbox();
+
+ var restrictToMargins = function restrictToMargins(box) {
+ if (!margins) return box;
+ var top = margins.top,
+ left = margins.left,
+ bottom = margins.bottom,
+ right = margins.right;
+
+ var _this$attr = _this.attr(['width', 'height']),
+ width = _this$attr.width,
+ height = _this$attr.height;
+
+ var preserveAspectRatio = _this.node.preserveAspectRatio.baseVal; // The current viewport (exactly what is shown on the screen, what we ultimately want to restrict)
+ // is not always exactly the same as current viewbox. They are different when the viewbox aspectRatio and the svg aspectRatio
+ // are different and preserveAspectRatio is not "none". These offsets represent the difference in user coordinates
+ // between the side of the viewbox and the side of the viewport.
+
+ var viewportLeftOffset = 0;
+ var viewportRightOffset = 0;
+ var viewportTopOffset = 0;
+ var viewportBottomOffset = 0; // preserveAspectRatio none has no offsets
+
+ if (preserveAspectRatio.align !== preserveAspectRatio.SVG_PRESERVEASPECTRATIO_NONE) {
+ var svgAspectRatio = width / height;
+ var viewboxAspectRatio = viewbox.width / viewbox.height; // when aspectRatios are the same, there are no offsets
+
+ if (viewboxAspectRatio !== svgAspectRatio) {
+ // aspectRatio unknown is like meet because that's the default
+ var isMeet = preserveAspectRatio.meetOrSlice !== preserveAspectRatio.SVG_MEETORSLICE_SLICE;
+ var changedAxis = svgAspectRatio > viewboxAspectRatio ? 'width' : 'height';
+ var isWidth = changedAxis === 'width';
+ var changeHorizontal = isMeet && isWidth || !isMeet && !isWidth;
+ var ratio = changeHorizontal ? svgAspectRatio / viewboxAspectRatio : viewboxAspectRatio / svgAspectRatio;
+ var offset = box[changedAxis] - box[changedAxis] * ratio;
+
+ if (changeHorizontal) {
+ if (preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMIN || preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMID || preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMAX) {
+ viewportLeftOffset = offset / 2;
+ viewportRightOffset = -offset / 2;
+ } else if (preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMIN || preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMID || preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMAX) {
+ viewportRightOffset = -offset;
+ } else if (preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMIN || preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMID || preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMAX) {
+ viewportLeftOffset = offset;
+ }
+ } else {
+ if (preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMID || preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMID || preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMID) {
+ viewportTopOffset = offset / 2;
+ viewportBottomOffset = -offset / 2;
+ } else if (preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMIN || preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMIN || preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMIN) {
+ viewportBottomOffset = -offset;
+ } else if (preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMAX || preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMAX || preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMAX) {
+ viewportTopOffset = offset;
+ }
+ }
+ }
+ } // when box.x == leftLimit, the image is panned to the left,
+ // i.e the current box is to the right of the initial viewbox,
+ // and only the right part of the initial image is visible, i.e.
+ // the right side of the initial viewbox minus left margin (viewbox.x+viewbox.width-left)
+ // is aligned with the left side of the viewport (box.x + viewportLeftOffset):
+ // viewbox.width + viewbox.x - left = box.x + viewportLeftOffset
+ // viewbox.width + viewbox.x - left - viewportLeftOffset = box.x (= leftLimit)
+
+
+ var leftLimit = viewbox.width + viewbox.x - left - viewportLeftOffset; // when box.x == rightLimit, the image is panned to the right,
+ // i.e the current box is to the left of the initial viewbox
+ // and only the left part of the initial image is visible, i.e
+ // the left side of the initial viewbox plus right margin (viewbox.x + right)
+ // is aligned with the right side of the viewport (box.x + box.width + viewportRightOffset)
+ // viewbox.x + right = box.x + box.width + viewportRightOffset
+ // viewbox.x + right - box.width - viewportRightOffset = box.x (= rightLimit)
+
+ var rightLimit = viewbox.x + right - box.width - viewportRightOffset; // same with top and bottom
+
+ var topLimit = viewbox.height + viewbox.y - top - viewportTopOffset;
+ var bottomLimit = viewbox.y + bottom - box.height - viewportBottomOffset;
+ box.x = Math.min(leftLimit, Math.max(rightLimit, box.x)); // enforce rightLimit <= box.x <= leftLimit
+
+ box.y = Math.min(topLimit, Math.max(bottomLimit, box.y)); // enforce bottomLimit <= box.y <= topLimit
+
+ return box;
+ };
+
+ var wheelZoom = function wheelZoom(ev) {
+ ev.preventDefault(); // When wheeling on a mouse,
+ // - chrome by default uses deltaY = 53, deltaMode = 0 (pixel)
+ // - firefox by default uses deltaY = 3, deltaMode = 1 (line)
+ // - chrome and firefox on windows after configuring "One screen at a time"
+ // use deltaY = 1, deltaMode = 2 (screen)
+ //
+ // Note that when when wheeling on a touchpad, deltaY depends on how fast
+ // you swipe, but the deltaMode is still different between the browsers.
+ //
+ // Normalize everything so that zooming speed is approximately the same in all cases
+
+ var normalizedPixelDeltaY;
+
+ switch (ev.deltaMode) {
+ case 1:
+ normalizedPixelDeltaY = ev.deltaY * wheelZoomDeltaModeLinePixels;
+ break;
+
+ case 2:
+ normalizedPixelDeltaY = ev.deltaY * wheelZoomDeltaModeScreenPixels;
+ break;
+
+ default:
+ // 0 (already pixels) or new mode (avoid crashing)
+ normalizedPixelDeltaY = ev.deltaY;
+ break;
+ }
+
+ var lvl = Math.pow(1 + zoomFactor, -1 * normalizedPixelDeltaY / 100) * this.zoom();
+ var p = this.point(ev.clientX, ev.clientY);
+
+ if (lvl > zoomMax) {
+ lvl = zoomMax;
+ }
+
+ if (lvl < zoomMin) {
+ lvl = zoomMin;
+ }
+
+ if (this.dispatch('zoom', {
+ level: lvl,
+ focus: p
+ }).defaultPrevented) {
+ return this;
+ }
+
+ this.zoom(lvl, p);
+
+ if (margins) {
+ var box = restrictToMargins(this.viewbox());
+ this.viewbox(box);
+ }
+ };
+
+ var pinchZoomStart = function pinchZoomStart(ev) {
+ lastTouches = normalizeEvent(ev); // Start panning in case only one touch is found
+
+ if (lastTouches.length < 2) {
+ if (doPanning && oneFingerPan) {
+ panStart.call(this, ev);
+ }
+
+ return;
+ } // Stop panning for more than one touch
+
+
+ if (doPanning && oneFingerPan) {
+ panStop.call(this, ev);
+ } // We call it so late, so the user is still able to scroll / reload the page via gesture
+ // In case oneFingerPan is not active
+
+
+ ev.preventDefault();
+
+ if (this.dispatch('pinchZoomStart', {
+ event: ev
+ }).defaultPrevented) {
+ return;
+ }
+
+ this.off('touchstart.panZoom', pinchZoomStart);
+ zoomInProgress = true;
+ svg_js.on(document, 'touchmove.panZoom', pinchZoom, this, {
+ passive: false
+ });
+ svg_js.on(document, 'touchend.panZoom', pinchZoomStop, this, {
+ passive: false
+ });
+ };
+
+ var pinchZoomStop = function pinchZoomStop(ev) {
+ ev.preventDefault();
+ var currentTouches = normalizeEvent(ev);
+
+ if (currentTouches.length > 1) {
+ return;
+ }
+
+ zoomInProgress = false;
+ this.dispatch('pinchZoomEnd', {
+ event: ev
+ });
+ svg_js.off(document, 'touchmove.panZoom', pinchZoom);
+ svg_js.off(document, 'touchend.panZoom', pinchZoomStop);
+ this.on('touchstart.panZoom', pinchZoomStart);
+
+ if (currentTouches.length && doPanning && oneFingerPan) {
+ panStart.call(this, ev);
+ }
+ };
+
+ var pinchZoom = function pinchZoom(ev) {
+ ev.preventDefault();
+ var currentTouches = normalizeEvent(ev);
+ var zoom = this.zoom(); // Distance Formula
+
+ var lastDelta = Math.sqrt(Math.pow(lastTouches[0].clientX - lastTouches[1].clientX, 2) + Math.pow(lastTouches[0].clientY - lastTouches[1].clientY, 2));
+ var currentDelta = Math.sqrt(Math.pow(currentTouches[0].clientX - currentTouches[1].clientX, 2) + Math.pow(currentTouches[0].clientY - currentTouches[1].clientY, 2));
+ var zoomAmount = lastDelta / currentDelta;
+
+ if (zoom < zoomMin && zoomAmount > 1 || zoom > zoomMax && zoomAmount < 1) {
+ zoomAmount = 1;
+ }
+
+ var currentFocus = {
+ x: currentTouches[0].clientX + 0.5 * (currentTouches[1].clientX - currentTouches[0].clientX),
+ y: currentTouches[0].clientY + 0.5 * (currentTouches[1].clientY - currentTouches[0].clientY)
+ };
+ var lastFocus = {
+ x: lastTouches[0].clientX + 0.5 * (lastTouches[1].clientX - lastTouches[0].clientX),
+ y: lastTouches[0].clientY + 0.5 * (lastTouches[1].clientY - lastTouches[0].clientY)
+ };
+ var p = this.point(currentFocus.x, currentFocus.y);
+ var focusP = this.point(2 * currentFocus.x - lastFocus.x, 2 * currentFocus.y - lastFocus.y);
+ var box = new svg_js.Box(this.viewbox()).transform(new svg_js.Matrix().translate(-focusP.x, -focusP.y).scale(zoomAmount, 0, 0).translate(p.x, p.y));
+ restrictToMargins(box);
+ this.viewbox(box);
+ lastTouches = currentTouches;
+ this.dispatch('zoom', {
+ box: box,
+ focus: focusP
+ });
+ };
+
+ var panStart = function panStart(ev) {
+ var isMouse = ev.type.indexOf('mouse') > -1; // In case panStart is called with touch, ev.button is undefined
+
+ if (isMouse && ev.button !== panButton && ev.which !== panButton + 1) {
+ return;
+ }
+
+ ev.preventDefault();
+ this.off('mousedown.panZoom', panStart);
+ lastTouches = normalizeEvent(ev);
+ if (zoomInProgress) return;
+ this.dispatch('panStart', {
+ event: ev
+ });
+ lastP = {
+ x: lastTouches[0].clientX,
+ y: lastTouches[0].clientY
+ };
+ svg_js.on(document, 'touchmove.panZoom mousemove.panZoom', panning, this, {
+ passive: false
+ });
+ svg_js.on(document, 'touchend.panZoom mouseup.panZoom', panStop, this, {
+ passive: false
+ });
+ };
+
+ var panStop = function panStop(ev) {
+ ev.preventDefault();
+ svg_js.off(document, 'touchmove.panZoom mousemove.panZoom', panning);
+ svg_js.off(document, 'touchend.panZoom mouseup.panZoom', panStop);
+ this.on('mousedown.panZoom', panStart);
+ this.dispatch('panEnd', {
+ event: ev
+ });
+ };
+
+ var panning = function panning(ev) {
+ ev.preventDefault();
+ var currentTouches = normalizeEvent(ev);
+ var currentP = {
+ x: currentTouches[0].clientX,
+ y: currentTouches[0].clientY
+ };
+ var p1 = this.point(currentP.x, currentP.y);
+ var p2 = this.point(lastP.x, lastP.y);
+ var deltaP = [p2.x - p1.x, p2.y - p1.y];
+
+ if (!deltaP[0] && !deltaP[1]) {
+ return;
+ }
+
+ var box = new svg_js.Box(this.viewbox()).transform(new svg_js.Matrix().translate(deltaP[0], deltaP[1]));
+ lastP = currentP;
+ restrictToMargins(box);
+
+ if (this.dispatch('panning', {
+ box: box,
+ event: ev
+ }).defaultPrevented) {
+ return;
+ }
+
+ this.viewbox(box);
+ };
+
+ if (doWheelZoom) {
+ this.on('wheel.panZoom', wheelZoom, this, {
+ passive: false
+ });
+ }
+
+ if (doPinchZoom) {
+ this.on('touchstart.panZoom', pinchZoomStart, this, {
+ passive: false
+ });
+ }
+
+ if (doPanning) {
+ this.on('mousedown.panZoom', panStart, this, {
+ passive: false
+ });
+ }
+
+ return this;
+ }
+ });
+
+}(SVG));
+//# sourceMappingURL=svg.panzoom.js.map
diff --git a/docs/xqdoc/resources/svgdotjs/svg.panzoom.js.map b/docs/xqdoc/resources/svgdotjs/svg.panzoom.js.map
new file mode 100644
index 0000000..5cb9367
--- /dev/null
+++ b/docs/xqdoc/resources/svgdotjs/svg.panzoom.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"svg.panzoom.js","sources":["../src/svg.panzoom.js"],"sourcesContent":["import { Svg, on, off, extend, Matrix, Box } from '@svgdotjs/svg.js'\n\nconst normalizeEvent = ev =>\n ev.touches || [{ clientX: ev.clientX, clientY: ev.clientY }]\n\nextend(Svg, {\n panZoom (options) {\n this.off('.panZoom')\n\n // when called with false, disable panZoom\n if (options === false) return this\n\n options = options ?? {}\n const zoomFactor = options.zoomFactor ?? 2\n const zoomMin = options.zoomMin ?? Number.MIN_VALUE\n const zoomMax = options.zoomMax ?? Number.MAX_VALUE\n const doWheelZoom = options.wheelZoom ?? true\n const doPinchZoom = options.pinchZoom ?? true\n const doPanning = options.panning ?? true\n const panButton = options.panButton ?? 0\n const oneFingerPan = options.oneFingerPan ?? false\n const margins = options.margins ?? false\n const wheelZoomDeltaModeLinePixels = options.wheelZoomDeltaModeLinePixels ?? 17\n const wheelZoomDeltaModeScreenPixels = options.wheelZoomDeltaModeScreenPixels ?? 53\n\n let lastP\n let lastTouches\n let zoomInProgress = false\n\n const viewbox = this.viewbox()\n\n const restrictToMargins = box => {\n if (!margins) return box\n const { top, left, bottom, right } = margins\n\n const { width, height } = this.attr(['width', 'height'])\n const preserveAspectRatio = this.node.preserveAspectRatio.baseVal\n\n // The current viewport (exactly what is shown on the screen, what we ultimately want to restrict)\n // is not always exactly the same as current viewbox. They are different when the viewbox aspectRatio and the svg aspectRatio\n // are different and preserveAspectRatio is not \"none\". These offsets represent the difference in user coordinates\n // between the side of the viewbox and the side of the viewport.\n let viewportLeftOffset = 0\n let viewportRightOffset = 0\n let viewportTopOffset = 0\n let viewportBottomOffset = 0\n\n // preserveAspectRatio none has no offsets\n if (preserveAspectRatio.align !== preserveAspectRatio.SVG_PRESERVEASPECTRATIO_NONE) {\n const svgAspectRatio = width / height\n const viewboxAspectRatio = viewbox.width / viewbox.height\n // when aspectRatios are the same, there are no offsets\n if (viewboxAspectRatio !== svgAspectRatio) {\n // aspectRatio unknown is like meet because that's the default\n const isMeet = preserveAspectRatio.meetOrSlice !== preserveAspectRatio.SVG_MEETORSLICE_SLICE\n const changedAxis = svgAspectRatio > viewboxAspectRatio ? 'width' : 'height'\n const isWidth = changedAxis === 'width'\n const changeHorizontal = (isMeet && isWidth) || (!isMeet && !isWidth)\n const ratio = changeHorizontal\n ? svgAspectRatio / viewboxAspectRatio\n : viewboxAspectRatio / svgAspectRatio\n\n const offset = box[changedAxis] - box[changedAxis] * ratio\n if (changeHorizontal) {\n if (\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMIN ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMID ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMAX) {\n viewportLeftOffset = offset / 2\n viewportRightOffset = -offset / 2\n } else if (\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMIN ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMID ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMAX) {\n viewportRightOffset = -offset\n } else if (\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMIN ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMID ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMAX) {\n viewportLeftOffset = offset\n }\n } else {\n if (\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMID ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMID ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMID) {\n viewportTopOffset = offset / 2\n viewportBottomOffset = -offset / 2\n } else if (\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMIN ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMIN ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMIN) {\n viewportBottomOffset = -offset\n } else if (\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMAX ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMAX ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMAX) {\n viewportTopOffset = offset\n }\n }\n\n }\n }\n\n // when box.x == leftLimit, the image is panned to the left,\n // i.e the current box is to the right of the initial viewbox,\n // and only the right part of the initial image is visible, i.e.\n // the right side of the initial viewbox minus left margin (viewbox.x+viewbox.width-left)\n // is aligned with the left side of the viewport (box.x + viewportLeftOffset):\n // viewbox.width + viewbox.x - left = box.x + viewportLeftOffset\n // viewbox.width + viewbox.x - left - viewportLeftOffset = box.x (= leftLimit)\n const leftLimit = viewbox.width + viewbox.x - left - viewportLeftOffset\n // when box.x == rightLimit, the image is panned to the right,\n // i.e the current box is to the left of the initial viewbox\n // and only the left part of the initial image is visible, i.e\n // the left side of the initial viewbox plus right margin (viewbox.x + right)\n // is aligned with the right side of the viewport (box.x + box.width + viewportRightOffset)\n // viewbox.x + right = box.x + box.width + viewportRightOffset\n // viewbox.x + right - box.width - viewportRightOffset = box.x (= rightLimit)\n const rightLimit = viewbox.x + right - box.width - viewportRightOffset\n // same with top and bottom\n const topLimit = viewbox.height + viewbox.y - top - viewportTopOffset\n const bottomLimit = viewbox.y + bottom - box.height - viewportBottomOffset\n\n box.x = Math.min(leftLimit, Math.max(rightLimit, box.x)) // enforce rightLimit <= box.x <= leftLimit\n box.y = Math.min(topLimit, Math.max(bottomLimit, box.y)) // enforce bottomLimit <= box.y <= topLimit\n return box\n }\n\n const wheelZoom = function (ev) {\n ev.preventDefault()\n\n // When wheeling on a mouse,\n // - chrome by default uses deltaY = 53, deltaMode = 0 (pixel)\n // - firefox by default uses deltaY = 3, deltaMode = 1 (line)\n // - chrome and firefox on windows after configuring \"One screen at a time\"\n // use deltaY = 1, deltaMode = 2 (screen)\n //\n // Note that when when wheeling on a touchpad, deltaY depends on how fast\n // you swipe, but the deltaMode is still different between the browsers.\n //\n // Normalize everything so that zooming speed is approximately the same in all cases\n let normalizedPixelDeltaY\n switch (ev.deltaMode) {\n case 1:\n normalizedPixelDeltaY = ev.deltaY * wheelZoomDeltaModeLinePixels\n break\n case 2:\n normalizedPixelDeltaY = ev.deltaY * wheelZoomDeltaModeScreenPixels\n break\n default:\n // 0 (already pixels) or new mode (avoid crashing)\n normalizedPixelDeltaY = ev.deltaY\n break\n }\n\n let lvl = Math.pow(1 + zoomFactor, (-1 * normalizedPixelDeltaY) / 100) * this.zoom()\n const p = this.point(ev.clientX, ev.clientY)\n\n if (lvl > zoomMax) {\n lvl = zoomMax\n }\n\n if (lvl < zoomMin) {\n lvl = zoomMin\n }\n\n if (this.dispatch('zoom', { level: lvl, focus: p }).defaultPrevented) {\n return this\n }\n\n this.zoom(lvl, p)\n\n if (margins) {\n const box = restrictToMargins(this.viewbox())\n this.viewbox(box)\n }\n }\n\n const pinchZoomStart = function (ev) {\n lastTouches = normalizeEvent(ev)\n\n // Start panning in case only one touch is found\n if (lastTouches.length < 2) {\n if (doPanning && oneFingerPan) {\n panStart.call(this, ev)\n }\n return\n }\n\n // Stop panning for more than one touch\n if (doPanning && oneFingerPan) {\n panStop.call(this, ev)\n }\n\n // We call it so late, so the user is still able to scroll / reload the page via gesture\n // In case oneFingerPan is not active\n ev.preventDefault()\n\n if (this.dispatch('pinchZoomStart', { event: ev }).defaultPrevented) {\n return\n }\n\n this.off('touchstart.panZoom', pinchZoomStart)\n\n zoomInProgress = true\n on(document, 'touchmove.panZoom', pinchZoom, this, { passive: false })\n on(document, 'touchend.panZoom', pinchZoomStop, this, { passive: false })\n }\n\n const pinchZoomStop = function (ev) {\n ev.preventDefault()\n\n const currentTouches = normalizeEvent(ev)\n if (currentTouches.length > 1) {\n return\n }\n\n zoomInProgress = false\n\n this.dispatch('pinchZoomEnd', { event: ev })\n\n off(document, 'touchmove.panZoom', pinchZoom)\n off(document, 'touchend.panZoom', pinchZoomStop)\n this.on('touchstart.panZoom', pinchZoomStart)\n\n if (currentTouches.length && doPanning && oneFingerPan) {\n panStart.call(this, ev)\n }\n }\n\n const pinchZoom = function (ev) {\n ev.preventDefault()\n\n const currentTouches = normalizeEvent(ev)\n const zoom = this.zoom()\n\n // Distance Formula\n const lastDelta = Math.sqrt(\n Math.pow(lastTouches[0].clientX - lastTouches[1].clientX, 2) +\n Math.pow(lastTouches[0].clientY - lastTouches[1].clientY, 2)\n )\n\n const currentDelta = Math.sqrt(\n Math.pow(currentTouches[0].clientX - currentTouches[1].clientX, 2) +\n Math.pow(currentTouches[0].clientY - currentTouches[1].clientY, 2)\n )\n\n let zoomAmount = lastDelta / currentDelta\n\n if (\n (zoom < zoomMin && zoomAmount > 1) ||\n (zoom > zoomMax && zoomAmount < 1)\n ) {\n zoomAmount = 1\n }\n\n const currentFocus = {\n x:\n currentTouches[0].clientX +\n 0.5 * (currentTouches[1].clientX - currentTouches[0].clientX),\n y:\n currentTouches[0].clientY +\n 0.5 * (currentTouches[1].clientY - currentTouches[0].clientY)\n }\n\n const lastFocus = {\n x:\n lastTouches[0].clientX +\n 0.5 * (lastTouches[1].clientX - lastTouches[0].clientX),\n y:\n lastTouches[0].clientY +\n 0.5 * (lastTouches[1].clientY - lastTouches[0].clientY)\n }\n\n const p = this.point(currentFocus.x, currentFocus.y)\n const focusP = this.point(\n 2 * currentFocus.x - lastFocus.x,\n 2 * currentFocus.y - lastFocus.y\n )\n const box = new Box(this.viewbox()).transform(\n new Matrix()\n .translate(-focusP.x, -focusP.y)\n .scale(zoomAmount, 0, 0)\n .translate(p.x, p.y)\n )\n\n restrictToMargins(box)\n this.viewbox(box)\n\n lastTouches = currentTouches\n\n this.dispatch('zoom', { box: box, focus: focusP })\n }\n\n const panStart = function (ev) {\n const isMouse = ev.type.indexOf('mouse') > -1\n\n // In case panStart is called with touch, ev.button is undefined\n if (isMouse && ev.button !== panButton && ev.which !== panButton + 1) {\n return\n }\n\n ev.preventDefault()\n\n this.off('mousedown.panZoom', panStart)\n\n lastTouches = normalizeEvent(ev)\n\n if (zoomInProgress) return\n\n this.dispatch('panStart', { event: ev })\n\n lastP = { x: lastTouches[0].clientX, y: lastTouches[0].clientY }\n\n on(document, 'touchmove.panZoom mousemove.panZoom', panning, this, {\n passive: false\n })\n\n on(document, 'touchend.panZoom mouseup.panZoom', panStop, this, {\n passive: false\n })\n }\n\n const panStop = function (ev) {\n ev.preventDefault()\n\n off(document, 'touchmove.panZoom mousemove.panZoom', panning)\n off(document, 'touchend.panZoom mouseup.panZoom', panStop)\n this.on('mousedown.panZoom', panStart)\n\n this.dispatch('panEnd', { event: ev })\n }\n\n const panning = function (ev) {\n ev.preventDefault()\n\n const currentTouches = normalizeEvent(ev)\n\n const currentP = {\n x: currentTouches[0].clientX,\n y: currentTouches[0].clientY\n }\n\n const p1 = this.point(currentP.x, currentP.y)\n\n const p2 = this.point(lastP.x, lastP.y)\n\n const deltaP = [p2.x - p1.x, p2.y - p1.y]\n\n if (!deltaP[0] && !deltaP[1]) {\n return\n }\n\n const box = new Box(this.viewbox()).transform(\n new Matrix().translate(deltaP[0], deltaP[1])\n )\n\n lastP = currentP\n\n restrictToMargins(box)\n\n if (this.dispatch('panning', { box, event: ev }).defaultPrevented) {\n return\n }\n\n this.viewbox(box)\n }\n\n if (doWheelZoom) {\n this.on('wheel.panZoom', wheelZoom, this, { passive: false })\n }\n\n if (doPinchZoom) {\n this.on('touchstart.panZoom', pinchZoomStart, this, { passive: false })\n }\n\n if (doPanning) {\n this.on('mousedown.panZoom', panStart, this, { passive: false })\n }\n\n return this\n }\n})\n"],"names":["normalizeEvent","ev","touches","clientX","clientY","extend","Svg","panZoom","options","off","zoomFactor","zoomMin","Number","MIN_VALUE","zoomMax","MAX_VALUE","doWheelZoom","wheelZoom","doPinchZoom","pinchZoom","doPanning","panning","panButton","oneFingerPan","margins","wheelZoomDeltaModeLinePixels","wheelZoomDeltaModeScreenPixels","lastP","lastTouches","zoomInProgress","viewbox","restrictToMargins","box","top","left","bottom","right","attr","width","height","preserveAspectRatio","node","baseVal","viewportLeftOffset","viewportRightOffset","viewportTopOffset","viewportBottomOffset","align","SVG_PRESERVEASPECTRATIO_NONE","svgAspectRatio","viewboxAspectRatio","isMeet","meetOrSlice","SVG_MEETORSLICE_SLICE","changedAxis","isWidth","changeHorizontal","ratio","offset","SVG_PRESERVEASPECTRATIO_XMIDYMIN","SVG_PRESERVEASPECTRATIO_XMIDYMID","SVG_PRESERVEASPECTRATIO_XMIDYMAX","SVG_PRESERVEASPECTRATIO_XMINYMIN","SVG_PRESERVEASPECTRATIO_XMINYMID","SVG_PRESERVEASPECTRATIO_XMINYMAX","SVG_PRESERVEASPECTRATIO_XMAXYMIN","SVG_PRESERVEASPECTRATIO_XMAXYMID","SVG_PRESERVEASPECTRATIO_XMAXYMAX","leftLimit","x","rightLimit","topLimit","y","bottomLimit","Math","min","max","preventDefault","normalizedPixelDeltaY","deltaMode","deltaY","lvl","pow","zoom","p","point","dispatch","level","focus","defaultPrevented","pinchZoomStart","length","panStart","call","panStop","event","on","document","passive","pinchZoomStop","currentTouches","lastDelta","sqrt","currentDelta","zoomAmount","currentFocus","lastFocus","focusP","Box","transform","Matrix","translate","scale","isMouse","type","indexOf","button","which","currentP","p1","p2","deltaP"],"mappings":"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"}
\ No newline at end of file
diff --git a/docs/xqdoc/resources/svgdotjs/svg.panzoom.min.js b/docs/xqdoc/resources/svgdotjs/svg.panzoom.min.js
new file mode 100644
index 0000000..758bed0
--- /dev/null
+++ b/docs/xqdoc/resources/svgdotjs/svg.panzoom.min.js
@@ -0,0 +1,3 @@
+/*! @svgdotjs/svg.panzoom.js v2.1.2 MIT*/;
+!function(D){"use strict";function G(t){return t.touches||[{clientX:t.clientX,clientY:t.clientY}]}D.extend(D.Svg,{panZoom:function(t){var n,e,i,o,a,l,h,s,c,E,u,V=this;if(this.off(".panZoom"),!1===t)return this;function m(t){if(!_)return t;var n=_.top,e=_.left,i=_.bottom,o=_.right,a=V.attr(["width","height"]),l=a.width,h=a.height,s=V.node.preserveAspectRatio.baseVal,c=0,E=0,u=0,m=0;if(s.align!==s.SVG_PRESERVEASPECTRATIO_NONE){var p=l/h,r=x.width/x.height;if(r!=p){var S=s.meetOrSlice!==s.SVG_MEETORSLICE_SLICE,R=r\n ev.touches || [{ clientX: ev.clientX, clientY: ev.clientY }]\n\nextend(Svg, {\n panZoom (options) {\n this.off('.panZoom')\n\n // when called with false, disable panZoom\n if (options === false) return this\n\n options = options ?? {}\n const zoomFactor = options.zoomFactor ?? 2\n const zoomMin = options.zoomMin ?? Number.MIN_VALUE\n const zoomMax = options.zoomMax ?? Number.MAX_VALUE\n const doWheelZoom = options.wheelZoom ?? true\n const doPinchZoom = options.pinchZoom ?? true\n const doPanning = options.panning ?? true\n const panButton = options.panButton ?? 0\n const oneFingerPan = options.oneFingerPan ?? false\n const margins = options.margins ?? false\n const wheelZoomDeltaModeLinePixels = options.wheelZoomDeltaModeLinePixels ?? 17\n const wheelZoomDeltaModeScreenPixels = options.wheelZoomDeltaModeScreenPixels ?? 53\n\n let lastP\n let lastTouches\n let zoomInProgress = false\n\n const viewbox = this.viewbox()\n\n const restrictToMargins = box => {\n if (!margins) return box\n const { top, left, bottom, right } = margins\n\n const { width, height } = this.attr(['width', 'height'])\n const preserveAspectRatio = this.node.preserveAspectRatio.baseVal\n\n // The current viewport (exactly what is shown on the screen, what we ultimately want to restrict)\n // is not always exactly the same as current viewbox. They are different when the viewbox aspectRatio and the svg aspectRatio\n // are different and preserveAspectRatio is not \"none\". These offsets represent the difference in user coordinates\n // between the side of the viewbox and the side of the viewport.\n let viewportLeftOffset = 0\n let viewportRightOffset = 0\n let viewportTopOffset = 0\n let viewportBottomOffset = 0\n\n // preserveAspectRatio none has no offsets\n if (preserveAspectRatio.align !== preserveAspectRatio.SVG_PRESERVEASPECTRATIO_NONE) {\n const svgAspectRatio = width / height\n const viewboxAspectRatio = viewbox.width / viewbox.height\n // when aspectRatios are the same, there are no offsets\n if (viewboxAspectRatio !== svgAspectRatio) {\n // aspectRatio unknown is like meet because that's the default\n const isMeet = preserveAspectRatio.meetOrSlice !== preserveAspectRatio.SVG_MEETORSLICE_SLICE\n const changedAxis = svgAspectRatio > viewboxAspectRatio ? 'width' : 'height'\n const isWidth = changedAxis === 'width'\n const changeHorizontal = (isMeet && isWidth) || (!isMeet && !isWidth)\n const ratio = changeHorizontal\n ? svgAspectRatio / viewboxAspectRatio\n : viewboxAspectRatio / svgAspectRatio\n\n const offset = box[changedAxis] - box[changedAxis] * ratio\n if (changeHorizontal) {\n if (\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMIN ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMID ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMAX) {\n viewportLeftOffset = offset / 2\n viewportRightOffset = -offset / 2\n } else if (\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMIN ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMID ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMAX) {\n viewportRightOffset = -offset\n } else if (\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMIN ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMID ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMAX) {\n viewportLeftOffset = offset\n }\n } else {\n if (\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMID ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMID ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMID) {\n viewportTopOffset = offset / 2\n viewportBottomOffset = -offset / 2\n } else if (\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMIN ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMIN ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMIN) {\n viewportBottomOffset = -offset\n } else if (\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMAX ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMAX ||\n preserveAspectRatio.align === preserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMAX) {\n viewportTopOffset = offset\n }\n }\n\n }\n }\n\n // when box.x == leftLimit, the image is panned to the left,\n // i.e the current box is to the right of the initial viewbox,\n // and only the right part of the initial image is visible, i.e.\n // the right side of the initial viewbox minus left margin (viewbox.x+viewbox.width-left)\n // is aligned with the left side of the viewport (box.x + viewportLeftOffset):\n // viewbox.width + viewbox.x - left = box.x + viewportLeftOffset\n // viewbox.width + viewbox.x - left - viewportLeftOffset = box.x (= leftLimit)\n const leftLimit = viewbox.width + viewbox.x - left - viewportLeftOffset\n // when box.x == rightLimit, the image is panned to the right,\n // i.e the current box is to the left of the initial viewbox\n // and only the left part of the initial image is visible, i.e\n // the left side of the initial viewbox plus right margin (viewbox.x + right)\n // is aligned with the right side of the viewport (box.x + box.width + viewportRightOffset)\n // viewbox.x + right = box.x + box.width + viewportRightOffset\n // viewbox.x + right - box.width - viewportRightOffset = box.x (= rightLimit)\n const rightLimit = viewbox.x + right - box.width - viewportRightOffset\n // same with top and bottom\n const topLimit = viewbox.height + viewbox.y - top - viewportTopOffset\n const bottomLimit = viewbox.y + bottom - box.height - viewportBottomOffset\n\n box.x = Math.min(leftLimit, Math.max(rightLimit, box.x)) // enforce rightLimit <= box.x <= leftLimit\n box.y = Math.min(topLimit, Math.max(bottomLimit, box.y)) // enforce bottomLimit <= box.y <= topLimit\n return box\n }\n\n const wheelZoom = function (ev) {\n ev.preventDefault()\n\n // When wheeling on a mouse,\n // - chrome by default uses deltaY = 53, deltaMode = 0 (pixel)\n // - firefox by default uses deltaY = 3, deltaMode = 1 (line)\n // - chrome and firefox on windows after configuring \"One screen at a time\"\n // use deltaY = 1, deltaMode = 2 (screen)\n //\n // Note that when when wheeling on a touchpad, deltaY depends on how fast\n // you swipe, but the deltaMode is still different between the browsers.\n //\n // Normalize everything so that zooming speed is approximately the same in all cases\n let normalizedPixelDeltaY\n switch (ev.deltaMode) {\n case 1:\n normalizedPixelDeltaY = ev.deltaY * wheelZoomDeltaModeLinePixels\n break\n case 2:\n normalizedPixelDeltaY = ev.deltaY * wheelZoomDeltaModeScreenPixels\n break\n default:\n // 0 (already pixels) or new mode (avoid crashing)\n normalizedPixelDeltaY = ev.deltaY\n break\n }\n\n let lvl = Math.pow(1 + zoomFactor, (-1 * normalizedPixelDeltaY) / 100) * this.zoom()\n const p = this.point(ev.clientX, ev.clientY)\n\n if (lvl > zoomMax) {\n lvl = zoomMax\n }\n\n if (lvl < zoomMin) {\n lvl = zoomMin\n }\n\n if (this.dispatch('zoom', { level: lvl, focus: p }).defaultPrevented) {\n return this\n }\n\n this.zoom(lvl, p)\n\n if (margins) {\n const box = restrictToMargins(this.viewbox())\n this.viewbox(box)\n }\n }\n\n const pinchZoomStart = function (ev) {\n lastTouches = normalizeEvent(ev)\n\n // Start panning in case only one touch is found\n if (lastTouches.length < 2) {\n if (doPanning && oneFingerPan) {\n panStart.call(this, ev)\n }\n return\n }\n\n // Stop panning for more than one touch\n if (doPanning && oneFingerPan) {\n panStop.call(this, ev)\n }\n\n // We call it so late, so the user is still able to scroll / reload the page via gesture\n // In case oneFingerPan is not active\n ev.preventDefault()\n\n if (this.dispatch('pinchZoomStart', { event: ev }).defaultPrevented) {\n return\n }\n\n this.off('touchstart.panZoom', pinchZoomStart)\n\n zoomInProgress = true\n on(document, 'touchmove.panZoom', pinchZoom, this, { passive: false })\n on(document, 'touchend.panZoom', pinchZoomStop, this, { passive: false })\n }\n\n const pinchZoomStop = function (ev) {\n ev.preventDefault()\n\n const currentTouches = normalizeEvent(ev)\n if (currentTouches.length > 1) {\n return\n }\n\n zoomInProgress = false\n\n this.dispatch('pinchZoomEnd', { event: ev })\n\n off(document, 'touchmove.panZoom', pinchZoom)\n off(document, 'touchend.panZoom', pinchZoomStop)\n this.on('touchstart.panZoom', pinchZoomStart)\n\n if (currentTouches.length && doPanning && oneFingerPan) {\n panStart.call(this, ev)\n }\n }\n\n const pinchZoom = function (ev) {\n ev.preventDefault()\n\n const currentTouches = normalizeEvent(ev)\n const zoom = this.zoom()\n\n // Distance Formula\n const lastDelta = Math.sqrt(\n Math.pow(lastTouches[0].clientX - lastTouches[1].clientX, 2) +\n Math.pow(lastTouches[0].clientY - lastTouches[1].clientY, 2)\n )\n\n const currentDelta = Math.sqrt(\n Math.pow(currentTouches[0].clientX - currentTouches[1].clientX, 2) +\n Math.pow(currentTouches[0].clientY - currentTouches[1].clientY, 2)\n )\n\n let zoomAmount = lastDelta / currentDelta\n\n if (\n (zoom < zoomMin && zoomAmount > 1) ||\n (zoom > zoomMax && zoomAmount < 1)\n ) {\n zoomAmount = 1\n }\n\n const currentFocus = {\n x:\n currentTouches[0].clientX +\n 0.5 * (currentTouches[1].clientX - currentTouches[0].clientX),\n y:\n currentTouches[0].clientY +\n 0.5 * (currentTouches[1].clientY - currentTouches[0].clientY)\n }\n\n const lastFocus = {\n x:\n lastTouches[0].clientX +\n 0.5 * (lastTouches[1].clientX - lastTouches[0].clientX),\n y:\n lastTouches[0].clientY +\n 0.5 * (lastTouches[1].clientY - lastTouches[0].clientY)\n }\n\n const p = this.point(currentFocus.x, currentFocus.y)\n const focusP = this.point(\n 2 * currentFocus.x - lastFocus.x,\n 2 * currentFocus.y - lastFocus.y\n )\n const box = new Box(this.viewbox()).transform(\n new Matrix()\n .translate(-focusP.x, -focusP.y)\n .scale(zoomAmount, 0, 0)\n .translate(p.x, p.y)\n )\n\n restrictToMargins(box)\n this.viewbox(box)\n\n lastTouches = currentTouches\n\n this.dispatch('zoom', { box: box, focus: focusP })\n }\n\n const panStart = function (ev) {\n const isMouse = ev.type.indexOf('mouse') > -1\n\n // In case panStart is called with touch, ev.button is undefined\n if (isMouse && ev.button !== panButton && ev.which !== panButton + 1) {\n return\n }\n\n ev.preventDefault()\n\n this.off('mousedown.panZoom', panStart)\n\n lastTouches = normalizeEvent(ev)\n\n if (zoomInProgress) return\n\n this.dispatch('panStart', { event: ev })\n\n lastP = { x: lastTouches[0].clientX, y: lastTouches[0].clientY }\n\n on(document, 'touchmove.panZoom mousemove.panZoom', panning, this, {\n passive: false\n })\n\n on(document, 'touchend.panZoom mouseup.panZoom', panStop, this, {\n passive: false\n })\n }\n\n const panStop = function (ev) {\n ev.preventDefault()\n\n off(document, 'touchmove.panZoom mousemove.panZoom', panning)\n off(document, 'touchend.panZoom mouseup.panZoom', panStop)\n this.on('mousedown.panZoom', panStart)\n\n this.dispatch('panEnd', { event: ev })\n }\n\n const panning = function (ev) {\n ev.preventDefault()\n\n const currentTouches = normalizeEvent(ev)\n\n const currentP = {\n x: currentTouches[0].clientX,\n y: currentTouches[0].clientY\n }\n\n const p1 = this.point(currentP.x, currentP.y)\n\n const p2 = this.point(lastP.x, lastP.y)\n\n const deltaP = [p2.x - p1.x, p2.y - p1.y]\n\n if (!deltaP[0] && !deltaP[1]) {\n return\n }\n\n const box = new Box(this.viewbox()).transform(\n new Matrix().translate(deltaP[0], deltaP[1])\n )\n\n lastP = currentP\n\n restrictToMargins(box)\n\n if (this.dispatch('panning', { box, event: ev }).defaultPrevented) {\n return\n }\n\n this.viewbox(box)\n }\n\n if (doWheelZoom) {\n this.on('wheel.panZoom', wheelZoom, this, { passive: false })\n }\n\n if (doPinchZoom) {\n this.on('touchstart.panZoom', pinchZoomStart, this, { passive: false })\n }\n\n if (doPanning) {\n this.on('mousedown.panZoom', panStart, this, { passive: false })\n }\n\n return this\n }\n})\n"],"names":["normalizeEvent","ev","touches","clientX","clientY","Svg","panZoom","options","off","this","restrictToMargins","box","margins","top","left","bottom","right","_this","attr","width","height","preserveAspectRatio","node","baseVal","viewportLeftOffset","viewportRightOffset","viewportTopOffset","viewportBottomOffset","align","SVG_PRESERVEASPECTRATIO_NONE","svgAspectRatio","viewboxAspectRatio","viewbox","isMeet","meetOrSlice","SVG_MEETORSLICE_SLICE","changedAxis","isWidth","changeHorizontal","ratio","offset","SVG_PRESERVEASPECTRATIO_XMIDYMIN","SVG_PRESERVEASPECTRATIO_XMIDYMID","SVG_PRESERVEASPECTRATIO_XMIDYMAX","SVG_PRESERVEASPECTRATIO_XMINYMIN","SVG_PRESERVEASPECTRATIO_XMINYMID","SVG_PRESERVEASPECTRATIO_XMINYMAX","SVG_PRESERVEASPECTRATIO_XMAXYMIN","SVG_PRESERVEASPECTRATIO_XMAXYMID","SVG_PRESERVEASPECTRATIO_XMAXYMAX","leftLimit","x","rightLimit","topLimit","y","bottomLimit","Math","min","max","pinchZoomStart","lastTouches","length","doPanning","oneFingerPan","panStart","call","panStop","preventDefault","dispatch","event","defaultPrevented","zoomInProgress","on","document","pinchZoom","passive","pinchZoomStop","lastP","zoomFactor","zoomMin","Number","MIN_VALUE","zoomMax","MAX_VALUE","doWheelZoom","wheelZoom","doPinchZoom","panning","panButton","wheelZoomDeltaModeLinePixels","wheelZoomDeltaModeScreenPixels","currentTouches","zoom","zoomAmount","sqrt","pow","currentFocus","lastFocus","p","point","focusP","Box","transform","Matrix","translate","scale","focus","type","indexOf","button","which","currentP","p1","p2","deltaP","normalizedPixelDeltaY","deltaMode","deltaY","lvl","level"],"mappings":"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"}
\ No newline at end of file
diff --git a/docs/xqdoc/resources/xqdoc.png b/docs/xqdoc/resources/xqdoc.png
new file mode 100644
index 0000000..5b76960
Binary files /dev/null and b/docs/xqdoc/resources/xqdoc.png differ
diff --git a/docs/xqdoc/resources/xqdoca.js b/docs/xqdoc/resources/xqdoca.js
new file mode 100644
index 0000000..36d44c1
--- /dev/null
+++ b/docs/xqdoc/resources/xqdoca.js
@@ -0,0 +1,12 @@
+// simple javascript support
+
+//https://www.w3schools.com/howto/howto_js_treeview.asp
+var toggler = document.getElementsByClassName("caret");
+var i;
+
+for (i = 0; i < toggler.length; i++) {
+ toggler[i].addEventListener("click", function() {
+ this.parentElement.querySelector(".nested").classList.toggle("active");
+ this.classList.toggle("caret-down");
+ });
+}
\ No newline at end of file
diff --git a/docs/xqdoc/restxq.html b/docs/xqdoc/restxq.html
new file mode 100644
index 0000000..2747644
--- /dev/null
+++ b/docs/xqdoc/restxq.html
@@ -0,0 +1,10 @@
+
jars - xqDocA - xqDocA
\ No newline at end of file
diff --git a/docs/xqdoc/validation-report.xml b/docs/xqdoc/validation-report.xml
new file mode 100644
index 0000000..13b1954
--- /dev/null
+++ b/docs/xqdoc/validation-report.xml
@@ -0,0 +1 @@
+invalid cvc-complex-type.2.1: Element 'xqdoc:namespace' must have no character or element information item [children], because the type's content type is empty. cvc-complex-type.2.1: Element 'xqdoc:namespace' must have no character or element information item [children], because the type's content type is empty. cvc-complex-type.2.1: Element 'xqdoc:namespace' must have no character or element information item [children], because the type's content type is empty. cvc-complex-type.2.1: Element 'xqdoc:namespace' must have no character or element information item [children], because the type's content type is empty. cvc-complex-type.2.1: Element 'xqdoc:namespace' must have no character or element information item [children], because the type's content type is empty.
\ No newline at end of file
diff --git a/docs/xqdoc/xqdoca.xml b/docs/xqdoc/xqdoca.xml
new file mode 100644
index 0000000..2cb8fe6
--- /dev/null
+++ b/docs/xqdoc/xqdoca.xml
@@ -0,0 +1,13 @@
+0.9.0 docs/xqdoc/
+ report
+ restxq
+ imports
+ imports-diag imports-diag.mmd
+ annotations
+ xqdoca.xml
+ xqdoc-validate
+
+ module
+ xqdoc
+ xqparse
+ basex *.xqm,*.xq,*.xquery jars jars/ true true 1.1 true
\ No newline at end of file
diff --git a/jars/commons-logging-1.3.1.jar b/jars/commons-logging-1.3.1.jar
deleted file mode 100644
index 0d508f6..0000000
Binary files a/jars/commons-logging-1.3.1.jar and /dev/null differ
diff --git a/jars/commons-logging-1.3.4.jar b/jars/commons-logging-1.3.4.jar
new file mode 100644
index 0000000..b6339bb
Binary files /dev/null and b/jars/commons-logging-1.3.4.jar differ
diff --git a/jars/fontbox-3.0.3.jar b/jars/fontbox-3.0.4.jar
similarity index 95%
rename from jars/fontbox-3.0.3.jar
rename to jars/fontbox-3.0.4.jar
index 0d67170..d814425 100644
Binary files a/jars/fontbox-3.0.3.jar and b/jars/fontbox-3.0.4.jar differ
diff --git a/jars/pdfbox-3.0.3.jar b/jars/pdfbox-3.0.4.jar
similarity index 78%
rename from jars/pdfbox-3.0.3.jar
rename to jars/pdfbox-3.0.4.jar
index 3baf7cf..bf0a91e 100644
Binary files a/jars/pdfbox-3.0.3.jar and b/jars/pdfbox-3.0.4.jar differ
diff --git a/jars/pdfbox-io-3.0.3.jar b/jars/pdfbox-io-3.0.4.jar
similarity index 93%
rename from jars/pdfbox-io-3.0.3.jar
rename to jars/pdfbox-io-3.0.4.jar
index e4814e4..83a1093 100644
Binary files a/jars/pdfbox-io-3.0.3.jar and b/jars/pdfbox-io-3.0.4.jar differ
diff --git a/lib/pdfbox-3.0.3.fat.jar b/lib/pdfbox-3.0.4.fat.jar
similarity index 83%
rename from lib/pdfbox-3.0.3.fat.jar
rename to lib/pdfbox-3.0.4.fat.jar
index f2504ef..3bd6cfc 100644
Binary files a/lib/pdfbox-3.0.3.fat.jar and b/lib/pdfbox-3.0.4.fat.jar differ
diff --git a/scripts/make-fat-jar.xq b/scripts/make-fat-jar.xq
index 2cfb6c5..18b217e 100644
--- a/scripts/make-fat-jar.xq
+++ b/scripts/make-fat-jar.xq
@@ -5,19 +5,20 @@ import module namespace build = 'urn:quodatum:build1' at 'build.xqm';
Main-Class: org.basex.modules.Hello
:)
let $config :=map {
- "manifest-jar" : "pdfbox-3.0.3.jar",
+ "base": file:resolve-path("../",static-base-uri()),
+ "manifest-jar" : "pdfbox-3.0.4.jar",
"input-dir" : "C:\Users\mrwhe\git\expkg-zone58\pdfbox\jars\",
- "output" : "../lib/pdfbox-3.0.3.fat.jar",
+ "output" : "../lib/pdfbox-3.0.4.fat.jar",
"main-class": "org.expkg_zone58.Pdfbox3"
}
-
-let $fat-jar := build:fatjar-from-folder($config?input-dir,$config?manifest-jar)
+let $jar-path:=file:resolve-path("jars/",$config?base=>trace("base "))=>trace("jar: ")
+let $fat-jar := build:fatjar-from-folder($jar-path,$config?manifest-jar)
let $fat-jar:=build:update-manifest($fat-jar, $config?main-class)
let $name:=replace($config?main-class,"\.","/") || ".xqm"
-let $content:=file:read-binary($config?input-dir || "Pdfbox3.xqm")
+let $content:=file:read-binary($jar-path || "Pdfbox3.xqm")
let $fat-jar:=archive:update($fat-jar, $name,$content)
-let $output-file := file:resolve-path($config?output, $config?input-dir)
+let $output-file := file:resolve-path($config?output, $fat-jar)
return (file:write-binary($output-file, $fat-jar),
trace($output-file,"fat jar: "))
\ No newline at end of file
diff --git a/src/lib/.xqdoca b/src/lib/.xqdoca
deleted file mode 100644
index 5016091..0000000
--- a/src/lib/.xqdoca
+++ /dev/null
@@ -1 +0,0 @@
-. xqdoca/
\ No newline at end of file
diff --git a/src/lib/pdfbox3.xqm b/src/lib/pdfbox3.xqm
deleted file mode 100644
index e90e4e2..0000000
--- a/src/lib/pdfbox3.xqm
+++ /dev/null
@@ -1,272 +0,0 @@
-xquery version '3.1';
-(:~
-pdfbox 3.0 https://pdfbox.apache.org/ BaseX 10.7+ interface library,
-requires pdfbox jar on classpath
-3.02+ required tested with pdfbox-app-3.0.2.jar
-@see download https://pdfbox.apache.org/download.cgi
-@javadoc https://javadoc.io/static/org.apache.pdfbox/pdfbox/3.0.2/
-
-:)
-module namespace pdfbox="urn:expkg-zone58:pdfbox3";
-
-declare namespace Loader ="java:org.apache.pdfbox.Loader";
-declare namespace PDFTextStripper = "java:org.apache.pdfbox.text.PDFTextStripper";
-
-(:~
-@see https://javadoc.io/static/org.apache.pdfbox/pdfbox/3.0.0/org/apache/pdfbox/pdmodel/PDDocument.html
-:)
-declare namespace PDDocument ="java:org.apache.pdfbox.pdmodel.PDDocument";
-
-declare namespace PDDocumentCatalog ="java:org.apache.pdfbox.pdmodel.PDDocumentCatalog";
-declare namespace PDPageLabels ="java:org.apache.pdfbox.pdmodel.common.PDPageLabels";
-
-(:~
-@see https://javadoc.io/static/org.apache.pdfbox/pdfbox/3.0.0/org/apache/pdfbox/multipdf/PageExtractor.html
-:)
-declare namespace PageExtractor ="java:org.apache.pdfbox.multipdf.PageExtractor";
-
-(:~
- @see https://javadoc.io/static/org.apache.pdfbox/pdfbox/3.0.0/org/apache/pdfbox/pdmodel/PDPageTree.html
-:)
-declare namespace PDPageTree ="java:org.apache.pdfbox.pdmodel.PDPageTree";
-
-(:~
-@see https://javadoc.io/static/org.apache.pdfbox/pdfbox/3.0.2/org/apache/pdfbox/pdmodel/interactive/documentnavigation/outline/PDDocumentOutline.html
-:)
-declare namespace PDDocumentOutline ="java:org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDDocumentOutline";
-
-declare namespace PDDocumentInformation ="java:org.apache.pdfbox.pdmodel.PDDocumentInformation";
-(:~
-@see https://javadoc.io/static/org.apache.pdfbox/pdfbox/3.0.0/org/apache/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineItem.html
-:)
-declare namespace PDOutlineItem="java:org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem";
-declare namespace PDFRenderer="java:org.apache.pdfbox.rendering.PDFRenderer";
-declare namespace RandomAccessReadBufferedFile = "java:org.apache.pdfbox.io.RandomAccessReadBufferedFile";
-declare namespace File ="java:java.io.File";
-
-(:~ version of pdfbox:)
-declare function pdfbox:version()
-as xs:string{
- Q{java:org.apache.pdfbox.util.Version}getVersion()
-};
-
-(:~ open pdf, returns handle :)
-declare function pdfbox:open($pdfpath as xs:string)
-as item(){
- Loader:loadPDF( RandomAccessReadBufferedFile:new($pdfpath))
-};
-
-(:~ the PDF specification version this document conforms to.:)
-declare function pdfbox:pdfVersion($doc as item())
-as xs:float{
- PDDocument:getVersion($doc)
-};
-
-(:~ save pdf $doc to $savepath , returns $savepath :)
-declare function pdfbox:save($doc as item(),$savepath as xs:string)
-as xs:string{
- PDDocument:save($doc,File:new($savepath)),$savepath
-};
-
-declare function pdfbox:close($doc as item())
-as empty-sequence(){
- (# db:wrapjava void #) {
- PDDocument:close($doc)
- }
-};
-
-declare function pdfbox:page-count($doc as item())
-as xs:integer{
- PDDocument:getNumberOfPages($doc)
-};
-
-(:~ map with document metadata :)
-declare function pdfbox:information($doc as item())
-as map(*){
- let $info:=PDDocument:getDocumentInformation($doc)
- return map{
- "title": PDDocumentInformation:getTitle($info),
- "creator": PDDocumentInformation:getCreator($info),
- "producer": PDDocumentInformation:getProducer($info),
- "subject": PDDocumentInformation:getSubject($info),
- "keywords": PDDocumentInformation:getKeywords($info),
- "creationdate": pdfbox:gregToISO(PDDocumentInformation:getCreationDate($info)),
- "author": PDDocumentInformation:getAuthor($info)
- }
-};
-
- (:~ convert date :)
-declare
-function pdfbox:gregToISO($item as item())
-as xs:string{
- Q{java:java.util.GregorianCalendar}toZonedDateTime($item)=>string()
-};
-
-(:~ outline for $doc as map()* :)
-declare function pdfbox:outline($doc as item())
-as map(*)*{
- (# db:wrapjava some #) {
- let $outline:=
- PDDocument:getDocumentCatalog($doc)
- =>PDDocumentCatalog:getDocumentOutline()
-
- return if(exists($outline))
- then pdfbox:outline($doc,PDOutlineItem:getFirstChild($outline))
- }
-};
-
-(:~ return bookmark info for children of $outlineItem as seq of maps :)
-declare function pdfbox:outline($doc as item(),$outlineItem as item()?)
-
-as map(*)*{
- let $find as map(*):=pdfbox:_outline($doc ,$outlineItem)
- return map:get($find,"list")
-};
-
-(: BaseX bug 10.7? error if inlined in outline :)
-declare function pdfbox:_outline($doc as item(),$outlineItem as item()?)
-as map(*){
- hof:until(
- function($output) { empty($output?this) },
- function($input ) {
- let $bk:= pdfbox:bookmark($input?this,$doc)
- let $bk:= if($bk?hasChildren)
- then let $kids:=pdfbox:outline($doc,PDOutlineItem:getFirstChild($input?this))
- return map:merge(($bk,map:entry("children",$kids)))
- else $bk
- return map{
- "list": ($input?list, $bk),
- "this": PDOutlineItem:getNextSibling($input?this)}
- },
- map{"list":(),"this":$outlineItem}
- )
-};
-(:~ outline as xml :)
-declare function pdfbox:outline-xml($outline as map(*)*)
-as element(outline){
- element outline {
- $outline!pdfbox:bookmark-xml(.)
- }
-};
-
-declare function pdfbox:bookmark-xml($outline as map(*)*)
-as element(bookmark)*
-{
- $outline!
-
- {?children!pdfbox:bookmark-xml(.)}
-
-};
-
-(: return bookmark info for children of $outlineItem :)
-declare function pdfbox:bookmark($bookmark as item(),$doc as item())
-as map(*)
-{
- map{
- "index": PDOutlineItem:findDestinationPage($bookmark,$doc)=>pdfbox:pageIndex($doc),
- "title": (# db:checkstrings #) {PDOutlineItem:getTitle($bookmark)}=>translate("�",""),
- "hasChildren": PDOutlineItem:hasChildren($bookmark)
- }
-};
-
-declare function pdfbox:outx($page ,$document)
-{
- let $currentPage := PDOutlineItem:findDestinationPage($page,$document)
- let $pageNumber := pdfbox:pageIndex($currentPage,$document)
- return $pageNumber
-};
-
-(:~ pageIndex of $page in $document :)
-declare function pdfbox:pageIndex(
- $page as item()? (: as java:org.apache.pdfbox.pdmodel.PDPage :),
- $document)
-as item()?
-{
- if(exists($page))
- then PDDocument:getDocumentCatalog($document)
- =>PDDocumentCatalog:getPages()
- =>PDPageTree:indexOf($page)
-};
-
-
-
-(:~ save new PDF doc from 1 based page range
-@return save path :)
-declare function pdfbox:extract($doc as item(),
- $start as xs:integer,$end as xs:integer,$target as xs:string)
-as xs:string
-{
- let $a:=PageExtractor:new($doc, $start, $end) =>PageExtractor:extract()
- return (pdfbox:save($a,$target),pdfbox:close($a))
-};
-
-
-(:~ pageLabel info
-@see https://www.w3.org/TR/WCAG20-TECHS/PDF17.html#PDF17-examples
-@see https://codereview.stackexchange.com/questions/286078/java-code-showing-page-labels-from-pdf-files
-:)
-declare function pdfbox:getPageLabels($doc as item())
-as item()
-{
- PDDocument:getDocumentCatalog($doc)
- =>PDDocumentCatalog:getPageLabels()
-};
-
-(:~ pageLabel for every page:)
-declare function pdfbox:pageLabels($doc as item())
-as xs:string*
-{
- PDDocument:getDocumentCatalog($doc)
- =>PDDocumentCatalog:getPageLabels()
- =>PDPageLabels:getLabelsByPageIndices()
-};
-
-(:~ return text on $pageNo :)
-declare function pdfbox:getText($doc as item(), $pageNo as xs:integer)
-as xs:string{
- let $tStripper := (# db:wrapjava instance #) {
- PDFTextStripper:new()
- => PDFTextStripper:setStartPage($pageNo)
- => PDFTextStripper:setEndPage($pageNo)
- }
- return (# db:checkstrings #) {PDFTextStripper:getText($tStripper,$doc)}
-};
-
-(:~ summary info as map for $pdfpath :)
-declare function pdfbox:report($pdfpath as xs:string)
-as map(*){
- let $doc:=pdfbox:open($pdfpath)
- return (map{
- "file": $pdfpath,
- "pages": pdfbox:page-count($doc),
- "outline": pdfbox:outline($doc)=>count()
- },pdfbox:information($doc)
-)=>map:merge()
-};
-
-(:~ java:bufferedImage for $pageNo using $scale times dpi= 72
-@param $pageNo (ZERO based)
-@param $scale 1=72 dpi
-@return Java java.awt.image.BufferedImage object
-:)
-declare function pdfbox:pageBufferedImage($doc as item(), $pageNo as xs:integer,$scale as xs:float)
-as item(){
- PDFRenderer:new($doc)=>PDFRenderer:renderImage($pageNo,$scale)
-};
-
-(:~ save bufferedimage to $dest
-@param $type = "gif","png" etc:)
-declare function pdfbox:imageSave($bufferedImage as item(),$dest as xs:string,$type as xs:string)
-as xs:boolean{
- Q{java:javax.imageio.ImageIO}write($bufferedImage , $type, File:new($dest))
-};
-
-(:~ return image
-@param $type = "gif","png" etc:)
-declare function pdfbox:imageBinary($bufferedImage as item(),$type as xs:string)
-as xs:base64Binary{
- let $bytes:=Q{java:java.io.ByteArrayOutputStream}new()
- let $_:=Q{java:javax.imageio.ImageIO}write($bufferedImage , $type, $bytes)
- return Q{java:java.io.ByteArrayOutputStream}toByteArray($bytes)
- =>convert:integers-to-base64()
-};
\ No newline at end of file