@d3plus/dom 3.0.15 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"d3plus-dom.js","sources":["../src/isObject.js","../src/assign.js","../src/attrize.js","../src/date.js","../src/elem.js","../src/textWidth.js","../src/fontExists.js","../src/getSize.js","../src/inViewport.js","../src/parseSides.js","../src/prefix.js","../src/rtl.js","../src/stylize.js"],"sourcesContent":["/**\n @function isObject\n @desc Detects if a variable is a javascript Object.\n @param {*} item\n*/\nexport default function(item) {\n return item &&\n typeof item === \"object\" &&\n (typeof window === \"undefined\" || item !== window && item !== window.document && !(item instanceof Element)) &&\n !Array.isArray(item)\n ? true : false;\n}\n","import isObject from \"./isObject.js\";\n\n/**\n @function validObject\n @desc Determines if the object passed is the document or window.\n @param {Object} obj\n @private\n*/\nfunction validObject(obj) {\n if (typeof window === \"undefined\") return true;\n else return obj !== window && obj !== document;\n}\n\n/**\n @function assign\n @desc A deeply recursive version of `Object.assign`.\n @param {...Object} objects\n @example <caption>this</caption>\nassign({id: \"foo\", deep: {group: \"A\"}}, {id: \"bar\", deep: {value: 20}}));\n @example <caption>returns this</caption>\n{id: \"bar\", deep: {group: \"A\", value: 20}}\n*/\nfunction assign(...objects) {\n\n const target = objects[0];\n for (let i = 1; i < objects.length; i++) {\n\n const source = objects[i];\n if (!isObject(source)) continue;\n\n Object.keys(source).forEach(prop => {\n\n const value = source[prop];\n\n if (isObject(value) && validObject(value)) {\n if (Object.prototype.hasOwnProperty.call(target, prop) && isObject(target[prop])) target[prop] = assign({}, target[prop], value);\n else target[prop] = assign({}, value);\n }\n else if (Array.isArray(value)) target[prop] = value.slice();\n else target[prop] = value;\n\n });\n }\n\n return target;\n\n}\n\nexport default assign;\n","/**\n @function attrize\n @desc Applies each key/value in an object as an attr.\n @param {D3selection} elem The D3 element to apply the styles to.\n @param {Object} attrs An object of key/value attr pairs.\n*/\nexport default function(e, a = {}) {\n for (const k in a) if ({}.hasOwnProperty.call(a, k)) e.attr(k, a[k]);\n}\n","/**\n @function date\n @summary Parses numbers and strings to valid Javascript Date objects.\n @description Returns a javascript Date object for a given a Number (representing either a 4-digit year or milliseconds since epoch), a String representing a Quarter (ie. \"Q2 1987\", mapping to the last day in that quarter), or a String that is in [valid dateString format](http://dygraphs.com/date-formats.html). Besides the 4-digit year parsing, this function is useful when needing to parse negative (BC) years, which the vanilla Date object cannot parse.\n @param {Number|String} *date*\n*/\nexport default function (d) {\n // returns if falsey or already Date object\n if ([false, undefined, NaN].includes(d) || d.constructor === Date) return d;\n // detects if milliseconds\n else if (d.constructor === Number && `${d}`.length > 5 && d % 1 === 0)\n return new Date(d);\n\n let s = `${d}`;\n\n // tests for MM/DD/YYYY and MM-DD-YYYY format\n const dayFormat = new RegExp(/^\\d{1,2}[./-]\\d{1,2}[./-](-*\\d{1,4})$/g).exec(\n s\n );\n if (dayFormat) {\n const year = dayFormat[1];\n if (year.indexOf(\"-\") === 0) s = s.replace(year, year.substring(1));\n const date = new Date(s);\n date.setFullYear(year);\n return date;\n }\n\n // tests for full Date object string format\n const strFormat = new RegExp(\n /^[A-z]{1,3} [A-z]{1,3} \\d{1,2} (-*\\d{1,4}) \\d{1,2}:\\d{1,2}:\\d{1,2} [A-z]{1,3}-*\\d{1,4} \\([A-z]{1,3}\\)/g\n ).exec(s);\n if (strFormat) {\n const year = strFormat[1];\n if (year.indexOf(\"-\") === 0) s = s.replace(year, year.substring(1));\n const date = new Date(s);\n date.setFullYear(year);\n return date;\n }\n\n // tests for quarterly formats (ie. \"QX YYYY\" and \"YYYY QX\")\n const quarterPrefix = new RegExp(\n /^([qQ]{1}[1-4]{1}|[1-4]{1}[qQ]{1})[\\s|-]{0,1}(-*\\d{1,4})$/g\n ).exec(s);\n const quarterSuffix = new RegExp(\n /^(-*\\d{1,4})[\\s|-]{0,1}([qQ]{1}[1-4]{1}|[1-4]{1}[qQ]{1})$/g\n ).exec(s);\n if (quarterPrefix || quarterSuffix) {\n const quarter = +(quarterPrefix ? quarterPrefix[1] : quarterSuffix[2])\n .toLowerCase()\n .replace(\"q\", \"\");\n const year = +(quarterPrefix ? quarterPrefix[2] : quarterSuffix[1]);\n const date = new Date(year, quarter * 3 - 3, 1);\n date.setFullYear(year);\n return date;\n }\n\n // tests for monthly formats (ie. \"MM-YYYY\" and \"YYYY-MM\")\n const monthPrefix = new RegExp(/^([-*\\d]{1,2})\\-(-*\\d{1,4})$/g).exec(s);\n const monthSuffix = new RegExp(/^(-*\\d{1,4})\\-([-*\\d]{1,2})$/g).exec(s);\n if (monthPrefix || monthSuffix) {\n const month = +(monthPrefix ? monthPrefix[1] : monthSuffix[2]);\n const year = +(monthPrefix ? monthPrefix[2] : monthSuffix[1]);\n const date = new Date(year, month - 1, 1);\n date.setFullYear(year);\n return date;\n }\n\n // detects if only passing a year value\n if (\n !s.includes(\"/\") &&\n !s.includes(\" \") &&\n (!s.includes(\"-\") || !s.indexOf(\"-\"))\n ) {\n const date = new Date(+s, 0, 1);\n date.setFullYear(d);\n return date;\n }\n\n const iso8601 = new RegExp(\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})?$/g\n ).exec(s);\n if (iso8601) return new Date(s);\n\n // falls back to Date object, replacing hyphens with slashes\n return new Date(s.replace(/-/g, \"/\"));\n}\n","import {select} from \"d3-selection\";\nimport {transition} from \"d3-transition\";\n\nimport {default as attrize} from \"./attrize.js\";\n\n/**\n @function elem\n @desc Manages the enter/update/exit pattern for a single DOM element.\n @param {String} selector A D3 selector, which must include the tagname and a class and/or ID.\n @param {Object} params Additional parameters.\n @param {Boolean} [params.condition = true] Whether or not the element should be rendered (or removed).\n @param {Object} [params.enter = {}] A collection of key/value pairs that map to attributes to be given on enter.\n @param {Object} [params.exit = {}] A collection of key/value pairs that map to attributes to be given on exit.\n @param {D3Selection} [params.parent = d3.select(\"body\")] The parent element for this new element to be appended to.\n @param {Number} [params.duration = 0] The duration for the d3 transition.\n @param {Object} [params.update = {}] A collection of key/value pairs that map to attributes to be given on update.\n*/\nexport default function(selector, p) {\n\n // overrides default params\n p = Object.assign({}, {\n condition: true,\n enter: {},\n exit: {},\n duration: 0,\n parent: select(\"body\"),\n update: {}\n }, p);\n\n const className = (/\\.([^#]+)/g).exec(selector),\n id = (/#([^.]+)/g).exec(selector),\n t = transition().duration(p.duration),\n tag = (/^([^.^#]+)/g).exec(selector)[1];\n\n const elem = p.parent.selectAll(selector.includes(\":\") ? selector.split(\":\")[1] : selector)\n .data(p.condition ? [null] : []);\n\n const enter = elem.enter().append(tag).call(attrize, p.enter);\n\n if (id) enter.attr(\"id\", id[1]);\n if (className) enter.attr(\"class\", className[1]);\n\n if (p.duration) elem.exit().transition(t).call(attrize, p.exit).remove();\n else elem.exit().call(attrize, p.exit).remove();\n\n const update = enter.merge(elem);\n if (p.duration) update.transition(t).call(attrize, p.update);\n else update.call(attrize, p.update);\n\n return update;\n\n}\n","/**\n * Strips HTML and \"un-escapes\" escape characters.\n * @param {String} input\n */\nfunction htmlDecode(input) {\n if (input.replace(/\\s+/g, \"\") === \"\") return input;\n const doc = new DOMParser().parseFromString(input.replace(/<[^>]+>/g, \"\"), \"text/html\");\n return doc.documentElement ? doc.documentElement.textContent : input;\n}\n\n\n/**\n @function textWidth\n @desc Given a text string, returns the predicted pixel width of the string when placed into DOM.\n @param {String|Array} text Can be either a single string or an array of strings to analyze.\n @param {Object} [style] An object of CSS font styles to apply. Accepts any of the valid [CSS font property](http://www.w3schools.com/cssref/pr_font_font.asp) values.\n*/\nexport default function(text, style) {\n\n style = Object.assign({\n \"font-size\": 10,\n \"font-family\": \"sans-serif\",\n \"font-style\": \"normal\",\n \"font-weight\": 400,\n \"font-variant\": \"normal\"\n }, style);\n\n const context = document.createElement(\"canvas\").getContext(\"2d\");\n\n const font = [];\n font.push(style[\"font-style\"]);\n font.push(style[\"font-variant\"]);\n font.push(style[\"font-weight\"]);\n font.push(typeof style[\"font-size\"] === \"string\" ? style[\"font-size\"] : `${style[\"font-size\"]}px`);\n font.push(style[\"font-family\"]);\n\n context.font = font.join(\" \");\n\n if (text instanceof Array) return text.map(t => context.measureText(htmlDecode(t)).width);\n return context.measureText(htmlDecode(text)).width;\n\n}\n","import {default as textWidth} from \"./textWidth.js\";\nimport {trim} from \"@d3plus/text\";\n\nconst alpha = \"abcdefghiABCDEFGHI_!@#$%^&*()_+1234567890\",\n checked = {},\n height = 32;\n\nlet dejavu, macos, monospace, proportional;\n\n/**\n @function fontExists\n @desc Given either a single font-family or a list of fonts, returns the name of the first font that can be rendered, or `false` if none are installed on the user's machine.\n @param {String|Array} font Can be either a valid CSS font-family string (single or comma-separated names) or an Array of string names.\n*/\nconst fontExists = font => {\n\n if (!dejavu) {\n dejavu = textWidth(alpha, {\"font-family\": \"DejaVuSans\", \"font-size\": height});\n macos = textWidth(alpha, {\"font-family\": \"-apple-system\", \"font-size\": height});\n monospace = textWidth(alpha, {\"font-family\": \"monospace\", \"font-size\": height});\n proportional = textWidth(alpha, {\"font-family\": \"sans-serif\", \"font-size\": height});\n }\n\n if (!(font instanceof Array)) font = font.split(\",\");\n font = font.map(f => trim(f));\n\n for (let i = 0; i < font.length; i++) {\n const fam = font[i];\n if (checked[fam] || [\"-apple-system\", \"monospace\", \"sans-serif\", \"DejaVuSans\"].includes(fam)) return fam;\n else if (checked[fam] === false) continue;\n const width = textWidth(alpha, {\"font-family\": fam, \"font-size\": height});\n checked[fam] = width !== monospace;\n if (checked[fam]) checked[fam] = width !== proportional;\n if (macos && checked[fam]) checked[fam] = width !== macos;\n if (dejavu && checked[fam]) checked[fam] = width !== dejavu;\n if (checked[fam]) return fam;\n }\n\n return false;\n\n};\n\n\nexport default fontExists;\n","import {select} from \"d3-selection\";\n\n/**\n @desc Given an HTMLElement and a \"width\" or \"height\" string, this function returns the current calculated size for the DOM element.\n @private\n*/\nfunction _elementSize(element, s) {\n\n if (!element) return undefined;\n\n if (element.tagName === undefined || [\"BODY\", \"HTML\"].indexOf(element.tagName) >= 0) {\n\n let val = window[`inner${s.charAt(0).toUpperCase() + s.slice(1)}`];\n const elem = select(element);\n \n if (s === \"width\") {\n val -= parseFloat(elem.style(\"margin-left\"), 10);\n val -= parseFloat(elem.style(\"margin-right\"), 10);\n val -= parseFloat(elem.style(\"padding-left\"), 10);\n val -= parseFloat(elem.style(\"padding-right\"), 10);\n }\n else {\n val -= parseFloat(elem.style(\"margin-top\"), 10);\n val -= parseFloat(elem.style(\"margin-bottom\"), 10);\n val -= parseFloat(elem.style(\"padding-top\"), 10);\n val -= parseFloat(elem.style(\"padding-bottom\"), 10);\n }\n\n return val;\n\n }\n else {\n let val = parseFloat(select(element).style(s), 10);\n if (typeof val === \"number\" && val > 0) {\n if (s === \"height\") {\n val -= parseFloat(select(element).style(\"padding-top\"), 10);\n val -= parseFloat(select(element).style(\"padding-bottom\"), 10);\n }\n return val;\n }\n else return _elementSize(element.parentNode, s);\n\n }\n}\n\n/**\n @function getSize\n @desc Finds the available width and height for a specified HTMLElement, traversing it's parents until it finds something with constrained dimensions. Falls back to the inner dimensions of the browser window if none is found.\n @param {HTMLElement} elem The HTMLElement to find dimensions for.\n @private\n*/\nexport default function(elem) {\n return [_elementSize(elem, \"width\"), _elementSize(elem, \"height\")];\n}\n","/**\n @module inViewport\n @desc Returns a *Boolean* denoting whether or not a given DOM element is visible in the current window.\n @param {DOMElement} elem The DOM element to analyze.\n @param {Number} [buffer = 0] A pixel offset from the edge of the top and bottom of the screen. If a positive value, the element will be deemed visible when it is that many pixels away from entering the viewport. If negative, the element will have to enter the viewport by that many pixels before being deemed visible.\n @private\n*/\nexport default function(elem, buffer = 0) {\n\n const pageX = window.pageXOffset !== undefined ? window.pageXOffset\n : (document.documentElement || document.body.parentNode || document.body).scrollLeft;\n\n const pageY = window.pageYOffset !== undefined ? window.pageYOffset\n : (document.documentElement || document.body.parentNode || document.body).scrollTop;\n\n const bounds = elem.getBoundingClientRect();\n const height = bounds.height,\n left = bounds.left + pageX,\n top = bounds.top + pageY,\n width = bounds.width;\n\n return pageY + window.innerHeight > top + buffer && pageY + buffer < top + height &&\n pageX + window.innerWidth > left + buffer && pageX + buffer < left + width;\n\n}\n","/**\n @function parseSides\n @desc Converts a string of directional CSS shorthand values into an object with the values expanded.\n @param {String|Number} sides The CSS shorthand string to expand.\n */\nexport default function(sides) {\n let values;\n if (typeof sides === \"number\") values = [sides];\n else values = sides.split(/\\s+/);\n\n if (values.length === 1) values = [values[0], values[0], values[0], values[0]];\n else if (values.length === 2) values = values.concat(values);\n else if (values.length === 3) values.push(values[1]);\n\n return [\n \"top\",\n \"right\",\n \"bottom\",\n \"left\"\n ].reduce((acc, direction, i) => {\n const value = parseFloat(values[i]);\n acc[direction] = value || 0;\n return acc;\n }, {});\n}\n","/**\n @function prefix\n @desc Returns the appropriate CSS vendor prefix, given the current browser.\n*/\nexport default function() {\n if (\"-webkit-transform\" in document.body.style) return \"-webkit-\";\n else if (\"-moz-transform\" in document.body.style) return \"-moz-\";\n else if (\"-ms-transform\" in document.body.style) return \"-ms-\";\n else if (\"-o-transform\" in document.body.style) return \"-o-\";\n else return \"\";\n}\n","import {select} from \"d3-selection\";\n\n/**\n @function rtl\n @desc Returns `true` if the HTML or body element has either the \"dir\" HTML attribute or the \"direction\" CSS property set to \"rtl\".\n*/\nexport default () =>\n select(\"html\").attr(\"dir\") === \"rtl\" ||\n select(\"body\").attr(\"dir\") === \"rtl\" ||\n select(\"html\").style(\"direction\") === \"rtl\" ||\n select(\"body\").style(\"direction\") === \"rtl\";\n","/**\n @function stylize\n @desc Applies each key/value in an object as a style.\n @param {D3selection} elem The D3 element to apply the styles to.\n @param {Object} styles An object of key/value style pairs.\n*/\nexport default function(e, s = {}) {\n for (const k in s) if ({}.hasOwnProperty.call(s, k)) e.style(k, s[k]);\n}\n"],"names":["item","window","document","Element","Array","isArray","validObject","obj","assign","objects","target","i","length","source","isObject","Object","keys","forEach","prop","value","prototype","hasOwnProperty","call","slice","e","a","k","attr","d","undefined","NaN","includes","constructor","Date","Number","s","dayFormat","RegExp","exec","year","indexOf","replace","substring","date","setFullYear","strFormat","quarterPrefix","quarterSuffix","quarter","toLowerCase","monthPrefix","monthSuffix","month","iso8601","selector","p","condition","enter","exit","duration","parent","select","update","className","id","t","transition","tag","elem","selectAll","split","data","append","attrize","remove","merge","htmlDecode","input","doc","DOMParser","parseFromString","documentElement","textContent","text","style","context","createElement","getContext","font","push","join","map","measureText","width","alpha","checked","height","dejavu","macos","monospace","proportional","fontExists","textWidth","f","trim","fam","_elementSize","element","tagName","val","charAt","toUpperCase","parseFloat","parentNode","buffer","pageX","pageXOffset","body","scrollLeft","pageY","pageYOffset","scrollTop","bounds","getBoundingClientRect","left","top","innerHeight","innerWidth","sides","values","concat","reduce","acc","direction"],"mappings":"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"}
1
+ {"version":3,"file":"d3plus-dom.js","sources":["../src/isObject.ts","../src/assign.ts","../src/backgroundColor.ts","../src/attrize.ts","../src/date.ts","../src/elem.ts","../src/textWidth.ts","../src/fontExists.ts","../src/getSize.ts","../src/inViewport.ts","../src/parseSides.ts","../src/rtl.ts","../src/stylize.ts"],"sourcesContent":["/**\n Detects if a variable is a javascript Object.\n @param item The value to test.\n*/\nexport default function (item: unknown): boolean {\n return item &&\n typeof item === \"object\" &&\n (typeof window === \"undefined\" ||\n (item !== window &&\n item !== window.document &&\n !(item instanceof Element))) &&\n !Array.isArray(item)\n ? true\n : false;\n}\n","import isObject from \"./isObject.js\";\n\n/**\n Determines if the object passed is the document or window.\n @param obj @private\n*/\nfunction validObject(obj: Record<string, unknown>): boolean {\n if (typeof window === \"undefined\") return true;\n else return (obj as unknown) !== window && (obj as unknown) !== document;\n}\n\n/**\n A deeply recursive version of `Object.assign`.\n\n@example <caption>this</caption>\nassign({id: \"foo\", deep: {group: \"A\"}}, {id: \"bar\", deep: {value: 20}}));\n @example <caption>returns this</caption>\n{id: \"bar\", deep: {group: \"A\", value: 20}}\n @param objects The source objects to merge into the target.\n*/\nfunction assign(...objects: Record<string, unknown>[]): Record<string, unknown> {\n const target = objects[0];\n for (let i = 1; i < objects.length; i++) {\n const source = objects[i];\n if (!isObject(source)) continue;\n\n Object.keys(source).forEach(prop => {\n const value = source[prop];\n\n if (isObject(value) && validObject(value as Record<string, unknown>)) {\n if (\n Object.prototype.hasOwnProperty.call(target, prop) &&\n isObject(target[prop])\n )\n target[prop] = assign({}, target[prop] as Record<string, unknown>, value as Record<string, unknown>);\n else target[prop] = assign({}, value as Record<string, unknown>);\n } else if (Array.isArray(value)) target[prop] = value.slice();\n else target[prop] = value;\n });\n }\n\n return target;\n}\n\nexport default assign;\n","/**\n Given a DOM element, returns its background color by walking up the\n ancestor chain until a non-transparent background is found. Falls back\n to \"rgb(255, 255, 255)\" (white) if every ancestor is transparent.\n @param elem The DOM element to check.\n*/\nexport default function (elem: Element): string {\n let node: Element | null = elem;\n while (node) {\n const bg = getComputedStyle(node).backgroundColor;\n if (bg && bg !== \"transparent\" && bg !== \"rgba(0, 0, 0, 0)\") return bg;\n node = node.parentElement;\n }\n return \"rgb(255, 255, 255)\";\n}\n","import type {Attrable} from \"./D3Selection.js\";\n\n/**\n Applies each key/value in an object as an attr.\n @param e The d3 selection to apply attributes to.\n @param a An object of key/value attr pairs.\n*/\nexport default function (\n e: Attrable,\n a: Record<string, string | number | boolean | null> = {},\n): void {\n for (const k in a) if ({}.hasOwnProperty.call(a, k)) e.attr(k, a[k]);\n}\n","/**\n Parses numbers and strings into valid JavaScript Date objects, supporting years, quarters, months, and ISO 8601 formats.\n @param d The date value to parse (number, string, or Date).\n*/\nexport default function (\n d: number | string | false | undefined,\n): Date | false | undefined {\n // returns if falsey or already Date object\n if (\n [false, undefined, NaN].includes(d as never) ||\n (d as unknown as {constructor: unknown}).constructor === Date\n )\n return d as Date | false | undefined;\n // detects if milliseconds\n else if (\n (d as unknown as {constructor: unknown}).constructor === Number &&\n `${d}`.length > 5 &&\n (d as number) % 1 === 0\n )\n return new Date(d as number);\n\n let s = `${d}`;\n\n // tests for MM/DD/YYYY and MM-DD-YYYY format\n const dayFormat = new RegExp(/^\\d{1,2}[./-]\\d{1,2}[./-](-*\\d{1,4})$/g).exec(\n s,\n );\n if (dayFormat) {\n const year = dayFormat[1];\n if (year.indexOf(\"-\") === 0) s = s.replace(year, year.substring(1));\n const date = new Date(s);\n date.setFullYear(year as unknown as number);\n return date;\n }\n\n // tests for full Date object string format\n const strFormat = new RegExp(\n /^[A-z]{1,3} [A-z]{1,3} \\d{1,2} (-*\\d{1,4}) \\d{1,2}:\\d{1,2}:\\d{1,2} [A-z]{1,3}-*\\d{1,4} \\([A-z]{1,3}\\)/g,\n ).exec(s);\n if (strFormat) {\n const year = strFormat[1];\n if (year.indexOf(\"-\") === 0) s = s.replace(year, year.substring(1));\n const date = new Date(s);\n date.setFullYear(year as unknown as number);\n return date;\n }\n\n // tests for quarterly formats (ie. \"QX YYYY\" and \"YYYY QX\")\n const quarterPrefix = new RegExp(\n /^([qQ]{1}[1-4]{1}|[1-4]{1}[qQ]{1})[\\s|-]{0,1}(-*\\d{1,4})$/g,\n ).exec(s);\n const quarterSuffix = new RegExp(\n /^(-*\\d{1,4})[\\s|-]{0,1}([qQ]{1}[1-4]{1}|[1-4]{1}[qQ]{1})$/g,\n ).exec(s);\n if (quarterPrefix || quarterSuffix) {\n const quarter = +(quarterPrefix ? quarterPrefix[1] : quarterSuffix![2])\n .toLowerCase()\n .replace(\"q\", \"\");\n const year = +(quarterPrefix ? quarterPrefix[2] : quarterSuffix![1]);\n const date = new Date(year, quarter * 3 - 3, 1);\n date.setFullYear(year);\n return date;\n }\n\n // tests for monthly formats (ie. \"MM-YYYY\" and \"YYYY-MM\")\n const monthPrefix = new RegExp(/^([-*\\d]{1,2})-(-*\\d{1,4})$/g).exec(s);\n const monthSuffix = new RegExp(/^(-*\\d{1,4})-([-*\\d]{1,2})$/g).exec(s);\n if (monthPrefix || monthSuffix) {\n const month = +(monthPrefix ? monthPrefix[1] : monthSuffix![2]);\n const year = +(monthPrefix ? monthPrefix[2] : monthSuffix![1]);\n const date = new Date(year, month - 1, 1);\n date.setFullYear(year);\n return date;\n }\n\n // detects if only passing a year value\n if (\n !s.includes(\"/\") &&\n !s.includes(\" \") &&\n (!s.includes(\"-\") || !s.indexOf(\"-\"))\n ) {\n const date = new Date(+s, 0, 1);\n date.setFullYear(d as number);\n return date;\n }\n\n const iso8601 = new RegExp(\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})?$/g,\n ).exec(s);\n if (iso8601) return new Date(s);\n\n // falls back to Date object, replacing hyphens with slashes\n return new Date(s.replace(/-/g, \"/\"));\n}\n","import {select} from \"d3-selection\";\nimport {transition} from \"d3-transition\";\n\nimport {default as attrize} from \"./attrize.js\";\nimport type {D3Selection} from \"./D3Selection.js\";\n\n \n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnySelection = ReturnType<typeof select<any, any>>;\n\ntype AttrMap = Record<string, string | number | boolean | null>;\n\nexport interface ElemParams {\n condition?: boolean;\n enter?: AttrMap;\n exit?: AttrMap;\n duration?: number;\n parent?: D3Selection;\n transition?: D3Selection;\n update?: AttrMap;\n}\n\n/**\n Manages the enter/update/exit pattern for a single DOM element, applying enter, update, and exit attributes with optional transitions.\n @param selector A CSS selector string for the element tag and classes.\n @param p Configuration object with enter, exit, update, and parent options.\n*/\nexport default function (selector: string, p?: ElemParams): D3Selection {\n // overrides default params\n const params = Object.assign(\n {},\n {\n condition: true,\n enter: {},\n exit: {},\n duration: 0,\n parent: select(\"body\") as unknown as D3Selection,\n update: {},\n },\n p,\n );\n\n const className = /\\.([^#]+)/g.exec(selector),\n id = /#([^.]+)/g.exec(selector),\n t = transition().duration(params.duration),\n tag = /^([^.^#]+)/g.exec(selector)![1];\n\n const elem = (params.parent as AnySelection)\n .selectAll(selector.includes(\":\") ? selector.split(\":\")[1] : selector)\n .data(params.condition ? [null] : []);\n\n const enter = elem.enter().append(tag).call(attrize, params.enter);\n\n if (id) enter.attr(\"id\", id[1]);\n if (className) enter.attr(\"class\", className[1]);\n\n if (params.duration)\n elem\n .exit()\n .transition(t)\n .call(attrize as never, params.exit)\n .remove();\n else elem.exit().call(attrize, params.exit).remove();\n\n const update = enter.merge(elem);\n if (params.duration)\n update.transition(t).call(attrize as never, params.update);\n else update.call(attrize, params.update);\n\n return update as unknown as D3Selection;\n}\n","import {prepareWithSegments, layoutWithLines} from \"@chenglou/pretext\";\n\n/**\n * Strips HTML and \"un-escapes\" escape characters.\n * @param {String} input\n */\nfunction htmlDecode(input: string): string {\n if (input.replace(/\\s+/g, \"\") === \"\") return input;\n const doc = new DOMParser().parseFromString(\n input.replace(/<[^>]+>/g, \"\"),\n \"text/html\",\n );\n return doc.documentElement ? doc.documentElement.textContent! : input;\n}\n\n/**\n * Builds a CSS font shorthand string from a style object.\n * @param {Object} styleObj\n */\nfunction buildFont(styleObj: Record<string, string | number>): string {\n const style = styleObj[\"font-style\"] || \"normal\";\n const variant = styleObj[\"font-variant\"] || \"normal\";\n const weight = styleObj[\"font-weight\"] || 400;\n const size =\n typeof styleObj[\"font-size\"] === \"string\"\n ? styleObj[\"font-size\"]\n : `${styleObj[\"font-size\"] || 10}px`;\n const family = styleObj[\"font-family\"] || \"sans-serif\";\n return `${style} ${variant} ${weight} ${size} ${family}`;\n}\n\n/**\n * Measures the width of a single text string using pretext.\n * @param {String} text\n * @param {String} font CSS font shorthand\n */\nfunction measureWidth(text: string, font: string): number {\n if (!text) return 0;\n const prepared = prepareWithSegments(text, font);\n const result = layoutWithLines(prepared, Infinity, 20);\n return result.lines.length ? result.lines[0].width : 0;\n}\n\n/**\n Given a text string, returns the predicted pixel width of the string when placed into DOM.\n @param text The text string to measure.\n @param style CSS style properties to apply when measuring.\n*/\nexport default function (\n text: string,\n style?: Record<string, string | number>,\n): number;\nexport default function (\n text: string[],\n style?: Record<string, string | number>,\n): number[];\nexport default function (\n text: string | string[],\n style: Record<string, string | number> = {},\n): number | number[] {\n const font = buildFont(style);\n\n if (text instanceof Array)\n return text.map(t => measureWidth(htmlDecode(t), font));\n return measureWidth(htmlDecode(text), font);\n}\n","import {default as textWidth} from \"./textWidth.js\";\n\nconst alpha: string = \"abcdefghiABCDEFGHI_!@#$%^&*()_+1234567890\",\n checked: Record<string, boolean> = {},\n height: number = 32;\n\nlet dejavu: number, macos: number, monospace: number, proportional: number;\n\n/**\n Given either a single font-family or a list of fonts, returns the name of the first font that can be rendered, or `false` if none are installed on the user's machine.\n @param font Can be either a valid CSS font-family string (single or comma-separated names) or an Array of string names.\n*/\nconst fontExists = (font: string | string[]): string | false => {\n if (!dejavu) {\n dejavu = textWidth(alpha, {\n \"font-family\": \"DejaVuSans\",\n \"font-size\": height,\n }) as number;\n macos = textWidth(alpha, {\n \"font-family\": \"-apple-system\",\n \"font-size\": height,\n }) as number;\n monospace = textWidth(alpha, {\n \"font-family\": \"monospace\",\n \"font-size\": height,\n }) as number;\n proportional = textWidth(alpha, {\n \"font-family\": \"sans-serif\",\n \"font-size\": height,\n }) as number;\n }\n\n if (!(font instanceof Array)) font = font.split(\",\");\n font = font.map(f => f.trim());\n\n for (let i = 0; i < font.length; i++) {\n const fam = font[i];\n if (\n checked[fam] ||\n [\"-apple-system\", \"monospace\", \"sans-serif\", \"DejaVuSans\"].includes(fam)\n )\n return fam;\n else if (checked[fam] === false) continue;\n const width = textWidth(alpha, {\n \"font-family\": fam,\n \"font-size\": height,\n }) as number;\n checked[fam] = width !== monospace;\n if (checked[fam]) checked[fam] = width !== proportional;\n if (macos && checked[fam]) checked[fam] = width !== macos;\n if (dejavu && checked[fam]) checked[fam] = width !== dejavu;\n if (checked[fam]) return fam;\n }\n\n return false;\n};\n\nexport default fontExists;\n","import {select} from \"d3-selection\";\n\n/**\n Given an HTMLElement and a \"width\" or \"height\" string, this function returns the current calculated size for the DOM element.\n @private\n*/\nfunction _elementSize(\n element: HTMLElement | null,\n s: \"width\" | \"height\",\n): number | undefined {\n if (!element) return undefined;\n\n if (\n (element as HTMLElement).tagName === undefined ||\n [\"BODY\", \"HTML\"].indexOf((element as HTMLElement).tagName) >= 0\n ) {\n let val = (window as any)[\n `inner${s.charAt(0).toUpperCase() + s.slice(1)}`\n ] as number;\n const elem = select(element);\n\n if (s === \"width\") {\n val -= parseFloat(elem.style(\"margin-left\"));\n val -= parseFloat(elem.style(\"margin-right\"));\n val -= parseFloat(elem.style(\"padding-left\"));\n val -= parseFloat(elem.style(\"padding-right\"));\n } else {\n val -= parseFloat(elem.style(\"margin-top\"));\n val -= parseFloat(elem.style(\"margin-bottom\"));\n val -= parseFloat(elem.style(\"padding-top\"));\n val -= parseFloat(elem.style(\"padding-bottom\"));\n }\n\n return val;\n } else {\n let val: number = element.getBoundingClientRect()[s];\n if (typeof val === \"number\" && val > 0) {\n if (s === \"height\") {\n val -= parseFloat(select(element).style(\"padding-top\"));\n val -= parseFloat(select(element).style(\"padding-bottom\"));\n val -= parseFloat(select(element).style(\"border-top\"));\n val -= parseFloat(select(element).style(\"border-bottom\"));\n } else {\n val -= parseFloat(select(element).style(\"padding-left\"));\n val -= parseFloat(select(element).style(\"padding-right\"));\n val -= parseFloat(select(element).style(\"border-left\"));\n val -= parseFloat(select(element).style(\"border-right\"));\n }\n return val;\n } else return _elementSize(element.parentNode as HTMLElement | null, s);\n }\n}\n\n/**\n Finds the available width and height for a specified HTMLElement, traversing it's parents until it finds something with constrained dimensions. Falls back to the inner dimensions of the browser window if none is found.\n @private\n*/\nexport default function (\n elem: HTMLElement,\n): [number | undefined, number | undefined] {\n return [_elementSize(elem, \"width\"), _elementSize(elem, \"height\")];\n}\n","/**\n Determines whether a given DOM element is visible within the current viewport, with an optional pixel buffer.\n @param elem The DOM element to check.\n @param buffer Extra pixel margin around the viewport boundary.\n*/\nexport default function (elem: Element, buffer: number = 0): boolean {\n const pageX = window.scrollX;\n const pageY = window.scrollY;\n\n const bounds = elem.getBoundingClientRect();\n const height = bounds.height,\n left = bounds.left + pageX,\n top = bounds.top + pageY,\n width = bounds.width;\n\n return (\n pageY + window.innerHeight > top + buffer &&\n pageY + buffer < top + height &&\n pageX + window.innerWidth > left + buffer &&\n pageX + buffer < left + width\n );\n}\n","export interface ParsedSides {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\n/**\n Converts a string of directional CSS shorthand values into an object with the values expanded.\n @param sides The CSS shorthand string to expand.\n */\nexport default function (sides: string | number): ParsedSides {\n let values: string[];\n if (typeof sides === \"number\") values = [`${sides}`];\n else values = sides.split(/\\s+/);\n\n if (values.length === 1)\n values = [values[0], values[0], values[0], values[0]];\n else if (values.length === 2) values = values.concat(values);\n else if (values.length === 3) values.push(values[1]);\n\n return [\"top\", \"right\", \"bottom\", \"left\"].reduce((acc, direction, i) => {\n const value = parseFloat(values[i]);\n acc[direction as keyof ParsedSides] = value || 0;\n return acc;\n }, {} as ParsedSides);\n}\n","/**\n Returns `true` if the HTML or body element has either the \"dir\" HTML attribute or the \"direction\" CSS property set to \"rtl\".\n*/\nexport default function (): boolean {\n return (\n document.documentElement.dir === \"rtl\" ||\n document.body.dir === \"rtl\" ||\n getComputedStyle(document.documentElement).direction === \"rtl\" ||\n getComputedStyle(document.body).direction === \"rtl\"\n );\n}\n","import type {Stylable} from \"./D3Selection.js\";\n\n/**\n Applies each key/value in an object as a style.\n @param e The d3 selection to apply styles to.\n @param s An object of key/value style pairs.\n*/\nexport default function (\n e: Stylable,\n s: Record<string, string | number | boolean | null> = {},\n): void {\n for (const k in s) if ({}.hasOwnProperty.call(s, k)) e.style(k, s[k]);\n}\n"],"names":["item","window","document","Element","Array","isArray","validObject","obj","assign","objects","target","i","length","source","isObject","Object","keys","forEach","prop","value","prototype","hasOwnProperty","call","slice","elem","node","bg","getComputedStyle","backgroundColor","parentElement","e","a","k","attr","d","undefined","NaN","includes","Date","Number","s","dayFormat","RegExp","exec","year","indexOf","replace","substring","date","setFullYear","strFormat","quarterPrefix","quarterSuffix","quarter","toLowerCase","monthPrefix","monthSuffix","month","iso8601","selector","p","params","condition","enter","exit","duration","parent","select","update","className","id","t","transition","tag","selectAll","split","data","append","attrize","remove","merge","htmlDecode","input","doc","DOMParser","parseFromString","documentElement","textContent","buildFont","styleObj","style","variant","weight","size","family","measureWidth","text","font","prepared","prepareWithSegments","result","layoutWithLines","Infinity","lines","width","map","alpha","checked","height","dejavu","macos","monospace","proportional","fontExists","textWidth","f","trim","fam","_elementSize","element","tagName","val","charAt","toUpperCase","parseFloat","getBoundingClientRect","parentNode","buffer","pageX","scrollX","pageY","scrollY","bounds","left","top","innerHeight","innerWidth","sides","values","concat","push","reduce","acc","direction","dir","body"],"mappings":"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"}
@@ -1,108 +1,108 @@
1
1
  /*
2
- @d3plus/dom v3.0.15
2
+ @d3plus/dom v3.0.16
3
3
  JavaScript functions for manipulating and analyzing DOM elements.
4
4
  Copyright (c) 2026 D3plus - https://d3plus.org
5
5
  @license MIT
6
6
  */
7
- (e=>{"function"==typeof define&&define.amd?define(e):e()})(function(){if("undefined"!=typeof window){try{if("undefined"==typeof SVGElement||Boolean(SVGElement.prototype.innerHTML))return}catch(e){return}function r(e){switch(e.nodeType){case 1:var t=e,n="";return n+="<"+t.tagName,t.hasAttributes()&&[].forEach.call(t.attributes,function(e){n+=" "+e.name+'="'+e.value+'"'}),n+=">",t.hasChildNodes()&&[].forEach.call(t.childNodes,function(e){n+=r(e)}),n+="</"+t.tagName+">";case 3:return e.textContent.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");case 8:return"\x3c!--"+e.nodeValue+"--\x3e"}}Object.defineProperty(SVGElement.prototype,"innerHTML",{get:function(){var t="";return[].forEach.call(this.childNodes,function(e){t+=r(e)}),t},set:function(e){for(;this.firstChild;)this.removeChild(this.firstChild);try{var t=new DOMParser,n=(t.async=!1,"<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'>"+e+"</svg>"),r=t.parseFromString(n,"text/xml").documentElement;[].forEach.call(r.childNodes,function(e){this.appendChild(this.ownerDocument.importNode(e,!0))}.bind(this))}catch(e){throw new Error("Error parsing markup string")}}}),Object.defineProperty(SVGElement.prototype,"innerSVG",{get:function(){return this.innerHTML},set:function(e){this.innerHTML=e}})}}),((e,t)=>{"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("d3-selection"),require("d3-transition"),require("@d3plus/text")):"function"==typeof define&&define.amd?define("@d3plus/dom",["exports","d3-selection","d3-transition","@d3plus/text"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).d3plus={},e.d3Selection,e.d3Transition,e.text)})(this,function(e,a,s,o){
7
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("d3-selection"),require("d3-transition"),require("@chenglou/pretext")):"function"==typeof define&&define.amd?define("@d3plus/dom",["exports","d3-selection","d3-transition","@chenglou/pretext"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).d3plus={},e.d3Selection,e.d3Transition,e.pretext)}(this,function(e,t,n,r){"use strict";
8
8
  /**
9
- @function isObject
10
- @desc Detects if a variable is a javascript Object.
11
- @param {*} item
12
- */function l(e){return!(!e||"object"!=typeof e||"undefined"!=typeof window&&(e===window||e===window.document||e instanceof Element)||Array.isArray(e))}
9
+ Detects if a variable is a javascript Object.
10
+ @param item The value to test.
11
+ */function o(e){return!(!e||"object"!=typeof e||"undefined"!=typeof window&&(e===window||e===window.document||e instanceof Element)||Array.isArray(e))}
13
12
  /**
14
- @function validObject
15
- @desc Determines if the object passed is the document or window.
16
- @param {Object} obj
17
- @private
13
+ Determines if the object passed is the document or window.
14
+ @param obj @private
18
15
  */
19
16
  /**
20
- @function attrize
21
- @desc Applies each key/value in an object as an attr.
22
- @param {D3selection} elem The D3 element to apply the styles to.
23
- @param {Object} attrs An object of key/value attr pairs.
24
- */function d(e,t={}){for(var n in t)!{}.hasOwnProperty.call(t,n)||e.attr(n,t[n])}
17
+ Applies each key/value in an object as an attr.
18
+ @param e The d3 selection to apply attributes to.
19
+ @param a An object of key/value attr pairs.
20
+ */
21
+ function i(e,t={}){for(const n in t)({}).hasOwnProperty.call(t,n)&&e.attr(n,t[n])}
25
22
  /**
26
- @function date
27
- @summary Parses numbers and strings to valid Javascript Date objects.
28
- @description Returns a javascript Date object for a given a Number (representing either a 4-digit year or milliseconds since epoch), a String representing a Quarter (ie. "Q2 1987", mapping to the last day in that quarter), or a String that is in [valid dateString format](http://dygraphs.com/date-formats.html). Besides the 4-digit year parsing, this function is useful when needing to parse negative (BC) years, which the vanilla Date object cannot parse.
29
- @param {Number|String} *date*
23
+ Parses numbers and strings into valid JavaScript Date objects, supporting years, quarters, months, and ISO 8601 formats.
24
+ @param d The date value to parse (number, string, or Date).
30
25
  */
31
26
  /**
32
27
  * Strips HTML and "un-escapes" escape characters.
33
28
  * @param {String} input
34
- */function i(e){var t;return""!==e.replace(/\s+/g,"")&&(t=(new DOMParser).parseFromString(e.replace(/<[^>]+>/g,""),"text/html")).documentElement?t.documentElement.textContent:e}
29
+ */
30
+ function s(e){if(""===e.replace(/\s+/g,""))return e;const t=(new DOMParser).parseFromString(e.replace(/<[^>]+>/g,""),"text/html");return t.documentElement?t.documentElement.textContent:e}
35
31
  /**
36
- @function textWidth
37
- @desc Given a text string, returns the predicted pixel width of the string when placed into DOM.
38
- @param {String|Array} text Can be either a single string or an array of strings to analyze.
39
- @param {Object} [style] An object of CSS font styles to apply. Accepts any of the valid [CSS font property](http://www.w3schools.com/cssref/pr_font_font.asp) values.
40
- */function c(e,t){t=Object.assign({"font-size":10,"font-family":"sans-serif","font-style":"normal","font-weight":400,"font-variant":"normal"},t);let n=document.createElement("canvas").getContext("2d");var r=[];return r.push(t["font-style"]),r.push(t["font-variant"]),r.push(t["font-weight"]),r.push("string"==typeof t["font-size"]?t["font-size"]:t["font-size"]+"px"),r.push(t["font-family"]),n.font=r.join(" "),e instanceof Array?e.map(e=>n.measureText(i(e)).width):n.measureText(i(e)).width}let f="abcdefghiABCDEFGHI_!@#$%^&*()_+1234567890",u={},p,m,g,y;
32
+ * Builds a CSS font shorthand string from a style object.
33
+ * @param {Object} styleObj
34
+ */
41
35
  /**
42
- @desc Given an HTMLElement and a "width" or "height" string, this function returns the current calculated size for the DOM element.
36
+ * Measures the width of a single text string using pretext.
37
+ * @param {String} text
38
+ * @param {String} font CSS font shorthand
39
+ */
40
+ function l(e,t){if(!e)return 0;const n=r.prepareWithSegments(e,t),o=r.layoutWithLines(n,1/0,20);return o.lines.length?o.lines[0].width:0}function a(e,t={}){const n=`${(r=t)["font-style"]||"normal"} ${r["font-variant"]||"normal"} ${r["font-weight"]||400} ${"string"==typeof r["font-size"]?r["font-size"]:`${r["font-size"]||10}px`} ${r["font-family"]||"sans-serif"}`;var r;return e instanceof Array?e.map(e=>l(s(e),n)):l(s(e),n)}const c="abcdefghiABCDEFGHI_!@#$%^&*()_+1234567890",d={};let u,p,f,g;
41
+ /**
42
+ Given either a single font-family or a list of fonts, returns the name of the first font that can be rendered, or `false` if none are installed on the user's machine.
43
+ @param font Can be either a valid CSS font-family string (single or comma-separated names) or an Array of string names.
44
+ */
45
+ /**
46
+ Given an HTMLElement and a "width" or "height" string, this function returns the current calculated size for the DOM element.
43
47
  @private
44
- */function h(t,n){if(t){if(void 0===t.tagName||0<=["BODY","HTML"].indexOf(t.tagName)){let e=window["inner"+(n.charAt(0).toUpperCase()+n.slice(1))];var r=a.select(t);return e="width"===n?(e=(e=(e-=parseFloat(r.style("margin-left"),10))-parseFloat(r.style("margin-right"),10))-parseFloat(r.style("padding-left"),10))-parseFloat(r.style("padding-right"),10):(e=(e=(e-=parseFloat(r.style("margin-top"),10))-parseFloat(r.style("margin-bottom"),10))-parseFloat(r.style("padding-top"),10))-parseFloat(r.style("padding-bottom"),10)}{let e=parseFloat(a.select(t).style(n),10);return"number"==typeof e&&0<e?e="height"===n?(e-=parseFloat(a.select(t).style("padding-top"),10))-parseFloat(a.select(t).style("padding-bottom"),10):e:h(t.parentNode,n)}}}
48
+ */
49
+ function m(e,n){if(e){if(void 0===e.tagName||["BODY","HTML"].indexOf(e.tagName)>=0){let r=window[`inner${n.charAt(0).toUpperCase()+n.slice(1)}`];const o=t.select(e);return"width"===n?(r-=parseFloat(o.style("margin-left")),r-=parseFloat(o.style("margin-right")),r-=parseFloat(o.style("padding-left")),r-=parseFloat(o.style("padding-right"))):(r-=parseFloat(o.style("margin-top")),r-=parseFloat(o.style("margin-bottom")),r-=parseFloat(o.style("padding-top")),r-=parseFloat(o.style("padding-bottom"))),r}{let r=e.getBoundingClientRect()[n];return"number"==typeof r&&r>0?("height"===n?(r-=parseFloat(t.select(e).style("padding-top")),r-=parseFloat(t.select(e).style("padding-bottom")),r-=parseFloat(t.select(e).style("border-top")),r-=parseFloat(t.select(e).style("border-bottom"))):(r-=parseFloat(t.select(e).style("padding-left")),r-=parseFloat(t.select(e).style("padding-right")),r-=parseFloat(t.select(e).style("border-left")),r-=parseFloat(t.select(e).style("border-right"))),r):m(e.parentNode,n)}}}
45
50
  /**
46
- @function getSize
47
- @desc Finds the available width and height for a specified HTMLElement, traversing it's parents until it finds something with constrained dimensions. Falls back to the inner dimensions of the browser window if none is found.
48
- @param {HTMLElement} elem The HTMLElement to find dimensions for.
51
+ Finds the available width and height for a specified HTMLElement, traversing it's parents until it finds something with constrained dimensions. Falls back to the inner dimensions of the browser window if none is found.
49
52
  @private
50
53
  */e.assign=
51
54
  /**
52
- @function assign
53
- @desc A deeply recursive version of `Object.assign`.
54
- @param {...Object} objects
55
- @example <caption>this</caption>
55
+ A deeply recursive version of `Object.assign`.
56
+
57
+ @example <caption>this</caption>
56
58
  assign({id: "foo", deep: {group: "A"}}, {id: "bar", deep: {value: 20}}));
57
59
  @example <caption>returns this</caption>
58
60
  {id: "bar", deep: {group: "A", value: 20}}
59
- */function o(...t){let i=t[0];for(let e=1;e<t.length;e++){let r=t[e];l(r)&&Object.keys(r).forEach(e=>{var t,n=r[e];l(n)&&(t=n,"undefined"==typeof window||t!==window&&t!==document)?Object.prototype.hasOwnProperty.call(i,e)&&l(i[e])?i[e]=o({},i[e],n):i[e]=o({},n):Array.isArray(n)?i[e]=n.slice():i[e]=n})}return i},e.attrize=d,e.date=function(e){
61
+ @param objects The source objects to merge into the target.
62
+ */
63
+ function e(...t){const n=t[0];for(let r=1;r<t.length;r++){const i=t[r];o(i)&&Object.keys(i).forEach(t=>{const r=i[t];var s;o(r)&&(s=r,"undefined"==typeof window||s!==window&&s!==document)?Object.prototype.hasOwnProperty.call(n,t)&&o(n[t])?n[t]=e({},n[t],r):n[t]=e({},r):Array.isArray(r)?n[t]=r.slice():n[t]=r})}return n}
64
+ /**
65
+ Given a DOM element, returns its background color by walking up the
66
+ ancestor chain until a non-transparent background is found. Falls back
67
+ to "rgb(255, 255, 255)" (white) if every ancestor is transparent.
68
+ @param elem The DOM element to check.
69
+ */,e.attrize=i,e.backgroundColor=function(e){let t=e;for(;t;){const e=getComputedStyle(t).backgroundColor;if(e&&"transparent"!==e&&"rgba(0, 0, 0, 0)"!==e)return e;t=t.parentElement}return"rgb(255, 255, 255)"},e.date=function(e){
60
70
  // returns if falsey or already Date object
61
- if([!1,void 0,NaN].includes(e)||e.constructor===Date)return e;if(e.constructor===Number&&5<(""+e).length&&e%1==0)return new Date(e);let t=""+e;
71
+ if([!1,void 0,NaN].includes(e)||e.constructor===Date)return e;if(e.constructor===Number&&`${e}`.length>5&&e%1==0)return new Date(e);let t=`${e}`;
62
72
  // tests for MM/DD/YYYY and MM-DD-YYYY format
63
- var n,r,o=new RegExp(/^\d{1,2}[./-]\d{1,2}[./-](-*\d{1,4})$/g).exec(t);return o?(0===(o=o[1]).indexOf("-")&&(t=t.replace(o,o.substring(1))),(r=new Date(t)).setFullYear(o),r):(o=new RegExp(/^[A-z]{1,3} [A-z]{1,3} \d{1,2} (-*\d{1,4}) \d{1,2}:\d{1,2}:\d{1,2} [A-z]{1,3}-*\d{1,4} \([A-z]{1,3}\)/g).exec(t))?(0===(r=o[1]).indexOf("-")&&(t=t.replace(r,r.substring(1))),(o=new Date(t)).setFullYear(r),o):(r=new RegExp(/^([qQ]{1}[1-4]{1}|[1-4]{1}[qQ]{1})[\s|-]{0,1}(-*\d{1,4})$/g).exec(t),o=new RegExp(/^(-*\d{1,4})[\s|-]{0,1}([qQ]{1}[1-4]{1}|[1-4]{1}[qQ]{1})$/g).exec(t),r||o?(n=+(r?r[1]:o[2]).toLowerCase().replace("q",""),r=+(r?r[2]:o[1]),(o=new Date(r,3*n-3,1)).setFullYear(r),o):(n=new RegExp(/^([-*\d]{1,2})\-(-*\d{1,4})$/g).exec(t),r=new RegExp(/^(-*\d{1,4})\-([-*\d]{1,2})$/g).exec(t),n||r?(o=+(n?n[1]:r[2]),n=+(n?n[2]:r[1]),(r=new Date(n,o-1,1)).setFullYear(n),r):
64
- // detects if only passing a year value
65
- t.includes("/")||t.includes(" ")||t.includes("-")&&t.indexOf("-")?new RegExp(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?$/g).exec(t)?new Date(t):new Date(t.replace(/-/g,"/")):((o=new Date(+t,0,1)).setFullYear(e),o)));
73
+ const n=new RegExp(/^\d{1,2}[./-]\d{1,2}[./-](-*\d{1,4})$/g).exec(t);if(n){const e=n[1];0===e.indexOf("-")&&(t=t.replace(e,e.substring(1)));const r=new Date(t);return r.setFullYear(e),r}
66
74
  // tests for full Date object string format
75
+ const r=new RegExp(/^[A-z]{1,3} [A-z]{1,3} \d{1,2} (-*\d{1,4}) \d{1,2}:\d{1,2}:\d{1,2} [A-z]{1,3}-*\d{1,4} \([A-z]{1,3}\)/g).exec(t);if(r){const e=r[1];0===e.indexOf("-")&&(t=t.replace(e,e.substring(1)));const n=new Date(t);return n.setFullYear(e),n}
76
+ // tests for quarterly formats (ie. "QX YYYY" and "YYYY QX")
77
+ const o=new RegExp(/^([qQ]{1}[1-4]{1}|[1-4]{1}[qQ]{1})[\s|-]{0,1}(-*\d{1,4})$/g).exec(t),i=new RegExp(/^(-*\d{1,4})[\s|-]{0,1}([qQ]{1}[1-4]{1}|[1-4]{1}[qQ]{1})$/g).exec(t);if(o||i){const e=+(o?o[1]:i[2]).toLowerCase().replace("q",""),t=+(o?o[2]:i[1]),n=new Date(t,3*e-3,1);return n.setFullYear(t),n}
78
+ // tests for monthly formats (ie. "MM-YYYY" and "YYYY-MM")
79
+ const s=new RegExp(/^([-*\d]{1,2})-(-*\d{1,4})$/g).exec(t),l=new RegExp(/^(-*\d{1,4})-([-*\d]{1,2})$/g).exec(t);if(s||l){const e=+(s?s[1]:l[2]),t=+(s?s[2]:l[1]),n=new Date(t,e-1,1);return n.setFullYear(t),n}
80
+ // detects if only passing a year value
81
+ if(!(t.includes("/")||t.includes(" ")||t.includes("-")&&t.indexOf("-"))){const n=new Date(+t,0,1);return n.setFullYear(e),n}return new RegExp(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?$/g).exec(t)?new Date(t):new Date(t.replace(/-/g,"/"));
82
+ // falls back to Date object, replacing hyphens with slashes
67
83
  }
68
84
  /**
69
- @function elem
70
- @desc Manages the enter/update/exit pattern for a single DOM element.
71
- @param {String} selector A D3 selector, which must include the tagname and a class and/or ID.
72
- @param {Object} params Additional parameters.
73
- @param {Boolean} [params.condition = true] Whether or not the element should be rendered (or removed).
74
- @param {Object} [params.enter = {}] A collection of key/value pairs that map to attributes to be given on enter.
75
- @param {Object} [params.exit = {}] A collection of key/value pairs that map to attributes to be given on exit.
76
- @param {D3Selection} [params.parent = d3.select("body")] The parent element for this new element to be appended to.
77
- @param {Number} [params.duration = 0] The duration for the d3 transition.
78
- @param {Object} [params.update = {}] A collection of key/value pairs that map to attributes to be given on update.
79
- */,e.elem=function(e,t){
85
+ Manages the enter/update/exit pattern for a single DOM element, applying enter, update, and exit attributes with optional transitions.
86
+ @param selector A CSS selector string for the element tag and classes.
87
+ @param p Configuration object with enter, exit, update, and parent options.
88
+ */,e.elem=function(e,r){
80
89
  // overrides default params
81
- t=Object.assign({},{condition:!0,enter:{},exit:{},duration:0,parent:a.select("body"),update:{}},t);var n=/\.([^#]+)/g.exec(e),r=/#([^.]+)/g.exec(e),o=s.transition().duration(t.duration),i=/^([^.^#]+)/g.exec(e)[1],i=(e=t.parent.selectAll(e.includes(":")?e.split(":")[1]:e).data(t.condition?[null]:[])).enter().append(i).call(d,t.enter),r=(r&&i.attr("id",r[1]),n&&i.attr("class",n[1]),(t.duration?e.exit().transition(o):e.exit()).call(d,t.exit).remove(),i.merge(e));return(t.duration?r.transition(o):r).call(d,t.update),r},e.fontExists=t=>{p||(p=c(f,{"font-family":"DejaVuSans","font-size":32}),m=c(f,{"font-family":"-apple-system","font-size":32}),g=c(f,{"font-family":"monospace","font-size":32}),y=c(f,{"font-family":"sans-serif","font-size":32})),t=(t=t instanceof Array?t:t.split(",")).map(e=>o.trim(e));for(let e=0;e<t.length;e++){var n=t[e];if(u[n]||["-apple-system","monospace","sans-serif","DejaVuSans"].includes(n))return n;if(!1!==u[n]){var r=c(f,{"font-family":n,"font-size":32});if(u[n]=r!==g,u[n]&&(u[n]=r!==y),m&&u[n]&&(u[n]=r!==m),p&&u[n]&&(u[n]=r!==p),u[n])return n}}return!1},e.getSize=function(e){return[h(e,"width"),h(e,"height")]}
90
+ const o=Object.assign({},{condition:!0,enter:{},exit:{},duration:0,parent:t.select("body"),update:{}},r),s=/\.([^#]+)/g.exec(e),l=/#([^.]+)/g.exec(e),a=n.transition().duration(o.duration),c=/^([^.^#]+)/g.exec(e)[1],d=o.parent.selectAll(e.includes(":")?e.split(":")[1]:e).data(o.condition?[null]:[]),u=d.enter().append(c).call(i,o.enter);l&&u.attr("id",l[1]),s&&u.attr("class",s[1]),o.duration?d.exit().transition(a).call(i,o.exit).remove():d.exit().call(i,o.exit).remove();const p=u.merge(d);return o.duration?p.transition(a).call(i,o.update):p.call(i,o.update),p},e.fontExists=e=>{u||(u=a(c,{"font-family":"DejaVuSans","font-size":32}),p=a(c,{"font-family":"-apple-system","font-size":32}),f=a(c,{"font-family":"monospace","font-size":32}),g=a(c,{"font-family":"sans-serif","font-size":32})),e instanceof Array||(e=e.split(",")),e=e.map(e=>e.trim());for(let t=0;t<e.length;t++){const n=e[t];if(d[n]||["-apple-system","monospace","sans-serif","DejaVuSans"].includes(n))return n;if(!1===d[n])continue;const r=a(c,{"font-family":n,"font-size":32});if(d[n]=r!==f,d[n]&&(d[n]=r!==g),p&&d[n]&&(d[n]=r!==p),u&&d[n]&&(d[n]=r!==u),d[n])return n}return!1},e.getSize=function(e){return[m(e,"width"),m(e,"height")]}
82
91
  /**
83
- @module inViewport
84
- @desc Returns a *Boolean* denoting whether or not a given DOM element is visible in the current window.
85
- @param {DOMElement} elem The DOM element to analyze.
86
- @param {Number} [buffer = 0] A pixel offset from the edge of the top and bottom of the screen. If a positive value, the element will be deemed visible when it is that many pixels away from entering the viewport. If negative, the element will have to enter the viewport by that many pixels before being deemed visible.
87
- @private
88
- */,e.inViewport=function(e,t=0){var n=void 0!==window.pageXOffset?window.pageXOffset:(document.documentElement||document.body.parentNode||document.body).scrollLeft,r=void 0!==window.pageYOffset?window.pageYOffset:(document.documentElement||document.body.parentNode||document.body).scrollTop,o=(e=e.getBoundingClientRect()).height,i=e.left+n,a=e.top+r;return r+window.innerHeight>a+t&&r+t<a+o&&n+window.innerWidth>i+t&&n+t<i+e.width}
89
- /**
90
- @function parseSides
91
- @desc Converts a string of directional CSS shorthand values into an object with the values expanded.
92
- @param {String|Number} sides The CSS shorthand string to expand.
93
- */,e.isObject=l,e.parseSides=function(e){let r;return 1===(r="number"==typeof e?[e]:e.split(/\s+/)).length?r=[r[0],r[0],r[0],r[0]]:2===r.length?r=r.concat(r):3===r.length&&r.push(r[1]),["top","right","bottom","left"].reduce((e,t,n)=>{n=parseFloat(r[n]);return e[t]=n||0,e},{})}
94
- /**
95
- @function prefix
96
- @desc Returns the appropriate CSS vendor prefix, given the current browser.
97
- */,e.prefix=function(){return"-webkit-transform"in document.body.style?"-webkit-":"-moz-transform"in document.body.style?"-moz-":"-ms-transform"in document.body.style?"-ms-":"-o-transform"in document.body.style?"-o-":""}
98
- /**
99
- @function rtl
100
- @desc Returns `true` if the HTML or body element has either the "dir" HTML attribute or the "direction" CSS property set to "rtl".
101
- */,e.rtl=()=>"rtl"===a.select("html").attr("dir")||"rtl"===a.select("body").attr("dir")||"rtl"===a.select("html").style("direction")||"rtl"===a.select("body").style("direction"),e.stylize=
102
- /**
103
- @function stylize
104
- @desc Applies each key/value in an object as a style.
105
- @param {D3selection} elem The D3 element to apply the styles to.
106
- @param {Object} styles An object of key/value style pairs.
107
- */function(e,t={}){for(var n in t)!{}.hasOwnProperty.call(t,n)||e.style(n,t[n])},e.textWidth=c});
92
+ Determines whether a given DOM element is visible within the current viewport, with an optional pixel buffer.
93
+ @param elem The DOM element to check.
94
+ @param buffer Extra pixel margin around the viewport boundary.
95
+ */,e.inViewport=function(e,t=0){const n=window.scrollX,r=window.scrollY,o=e.getBoundingClientRect(),i=o.height,s=o.left+n,l=o.top+r,a=o.width;return r+window.innerHeight>l+t&&r+t<l+i&&n+window.innerWidth>s+t&&n+t<s+a}
96
+ /**
97
+ Converts a string of directional CSS shorthand values into an object with the values expanded.
98
+ @param sides The CSS shorthand string to expand.
99
+ */,e.isObject=o,e.parseSides=function(e){let t;return t="number"==typeof e?[`${e}`]:e.split(/\s+/),1===t.length?t=[t[0],t[0],t[0],t[0]]:2===t.length?t=t.concat(t):3===t.length&&t.push(t[1]),["top","right","bottom","left"].reduce((e,n,r)=>{const o=parseFloat(t[r]);return e[n]=o||0,e},{})}
100
+ /**
101
+ Returns `true` if the HTML or body element has either the "dir" HTML attribute or the "direction" CSS property set to "rtl".
102
+ */,e.rtl=function(){return"rtl"===document.documentElement.dir||"rtl"===document.body.dir||"rtl"===getComputedStyle(document.documentElement).direction||"rtl"===getComputedStyle(document.body).direction}
103
+ /**
104
+ Applies each key/value in an object as a style.
105
+ @param e The d3 selection to apply styles to.
106
+ @param s An object of key/value style pairs.
107
+ */,e.stylize=function(e,t={}){for(const n in t)({}).hasOwnProperty.call(t,n)&&e.style(n,t[n])},e.textWidth=a});
108
108
  //# sourceMappingURL=d3plus-dom.js.map
package/es/src/prefix.js DELETED
@@ -1,10 +0,0 @@
1
- /**
2
- @function prefix
3
- @desc Returns the appropriate CSS vendor prefix, given the current browser.
4
- */ export default function() {
5
- if ("-webkit-transform" in document.body.style) return "-webkit-";
6
- else if ("-moz-transform" in document.body.style) return "-moz-";
7
- else if ("-ms-transform" in document.body.style) return "-ms-";
8
- else if ("-o-transform" in document.body.style) return "-o-";
9
- else return "";
10
- }