@phun-ky/speccer 10.1.0 → 11.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.
- package/README.md +143 -41
- package/dist/speccer.css +325 -122
- package/dist/speccer.d.ts +67 -12
- package/dist/speccer.esm.js +2 -2
- package/dist/speccer.esm.js.map +1 -1
- package/dist/speccer.js +2 -2
- package/dist/speccer.js.map +1 -1
- package/dist/speccer.min.css +1 -1
- package/package.json +1 -1
package/dist/speccer.esm.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @phun-ky/speccer
|
|
3
3
|
* A script to annotate, show spacing specs and to display typography information in documentation/website on HTML elements
|
|
4
4
|
* @author Alexander Vassbotn Røyne-Helgesen <alexander@phun-ky.net>
|
|
5
|
-
* @version
|
|
5
|
+
* @version 11.1.0
|
|
6
6
|
* @license
|
|
7
7
|
* Copyright (c) 2018 Alexander Vassbotn Røyne-Helgesen
|
|
8
8
|
*
|
|
@@ -24,5 +24,5 @@
|
|
|
24
24
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
25
25
|
* SOFTWARE.
|
|
26
26
|
*/
|
|
27
|
-
var t,e,n,o,s,i,r;!function(t){t.Empty="",t.Left="left",t.Right="right",t.Bottom="bottom",t.Top="top"}(t||(t={})),function(t){t.Pin="pin",t.Parent="parent",t.Enclose="enclose",t.Subtle="subtle",t.Bracket="bracket",t.Left="left",t.Right="right",t.Bottom="bottom",t.Top="top",t.SVG="svg",t.Curly="curly"}(e||(e={})),function(t){t.Measure="measure",t.Width="width",t.Height="height",t.Left="left",t.Right="right",t.Bottom="bottom",t.Top="top"}(n||(n={})),function(t){t.Typography="typography",t.Syntax="syntax",t.Left="left",t.Right="right",t.Bottom="bottom",t.Top="top"}(o||(o={})),function(t){t.Spacing="spacing"}(s||(s={})),function(t){t.Mark="mark"}(i||(i={})),function(t){t.Grid="grid"}(r||(r={}));const a=t=>t.split(" "),c=t=>{if(null===t)return!1;return a(t).includes(e.Left)},l=t=>{if(null===t)return!1;return a(t).includes(e.Right)},p=t=>{if(null===t)return!1;return a(t).includes(e.Bottom)},d=t=>{if(null===t)return!1;return a(t).includes(e.Bracket)},h=t=>{if(null===t)return!1;return a(t).includes(e.Enclose)},u=t=>{if(null===t)return!1;return a(t).includes(e.Subtle)},f=t=>{if(null===t)return!1;return a(t).includes(e.Parent)},m=t=>{if(null===t)return!1;const n=a(t);return n.includes(e.Curly)&&n.includes(e.Bracket)},g=t=>"string"==typeof t,y=t=>!g(t),w=t=>"number"==typeof t,x=t=>!w(t),b=t=>void 0===t,$=(t,e,n="noop")=>{t&&(!e||e&&!e.length||e.trim().split(" ").filter((t=>t!==n)).filter((t=>""!==t)).forEach((e=>t.classList.add(e.trim()))))},E=(t,e)=>t?!e&&y(t)?Object.keys(t).filter((e=>t[e])).join(" ").trim():`${t.trim()} ${e?Object.keys(e).filter((t=>e[t])).join(" "):""}`.trim():"",k=t=>!t.checkVisibility({checkVisibilityCSS:!0}),A=()=>new Promise(requestAnimationFrame),S=async(t,e,n)=>{await A();return getComputedStyle(t)[e]===n},C=async(t,e,n)=>{if(!t.parentElement)return null;return await S(t.parentElement,e,n)?t.parentElement:await C(t.parentElement,e,n)},L=(t,e,n)=>t-e.width/2+n.width/2,v=(t,e,n)=>t-e.height/2+n.height/2,P=async t=>{await A();let e=t.getBoundingClientRect(),n=e.top+window.scrollY;const o=e.left+window.scrollX,s=await(async t=>await C(t,"position","sticky"))(t),i=await(async t=>await S(t,"position","sticky"))(t);if(i){const o=t.style.position;await A(),t.style.position="relative",await A(),e=t.getBoundingClientRect(),n=e.top,t.style.position=o}else if(s){const o=s.style.position;await A(),s.style.position="relative",await A(),e=t.getBoundingClientRect(),n=e.top,s.style.position=o}return{height:e.height,width:e.width,top:n,left:o}},B=async(t,e)=>{await A();const n=t.getBoundingClientRect(),o=await P(e),s=await(async(t,e)=>{await A();const n=t.getBoundingClientRect(),o=e.getBoundingClientRect(),s=o.top+window.scrollY,i=o.left+window.scrollX;return{height:o.height,width:o.width,top:v(s,n,o),left:L(i,n,o)}})(t,e),i=o.height,r=o.width,a=n.height,c=n.width;return{absolute:()=>({top:o.top,left:o.left,height:i,width:r}),toTop:({center:t=!1,sourceHeight:e=a,modifier:n=0}={})=>({top:o.top+e+n,left:t?s.left:o.left,height:i,width:r}),fromTop:({center:t=!1,sourceHeight:e=a,modifier:n=0}={})=>({top:o.top-e-n,left:t?s.left:o.left,height:i,width:r}),toBottom:({center:t=!1,sourceHeight:e=a,targetHeight:n=i,modifier:c=0}={})=>({top:o.top+n-(e+c),left:t?s.left:o.left,height:i,width:r}),fromBottom:({center:t=!1,targetHeight:e=i,modifier:n=0}={})=>({top:o.top+e+n,left:t?s.left:o.left,height:i,width:r}),toLeft:({center:t=!1,sourceWidth:e=c,modifier:n=0}={})=>({top:t?s.top:o.top,left:o.left+e+n,height:i,width:r}),fromLeft:({center:t=!1,sourceWidth:e=c,modifier:n=0}={})=>({top:t?s.top:o.top,left:o.left-e-n,height:i,width:r}),toRight:({center:t=!1,sourceWidth:e=c,targetWidth:n=r,modifier:a=0}={})=>({top:t?s.top:o.top,left:o.left+n-(e+a),height:i,width:r}),fromRight:({center:t=!1,targetWidth:e=r,modifier:n=0}={})=>({top:t?s.top:o.top,left:o.left+e+n,height:i,width:r})}},R=async(t,e)=>{var n;if(!(!t||!e||g(e)||w(e)||(n=e,"boolean"==typeof n)||Array.isArray(e)&&!e.length||!Object.keys(e).length&&e.constructor===Object))if(await A(),Array.isArray(e))for(const n of e)t.style[n.key]=n.value;else for(const n of Object.keys(e))t.style[n]=e[n]},T=async t=>(await A(),getComputedStyle(t,null)),H=(t="",e="",n="span")=>{const o=document.createElement(n);return o.setAttribute("title",`${t}px`),o.setAttribute("data-measure",`${parseInt(String(t),10)}px`),$(o,`ph-speccer speccer measure ${e}`),o},M=async t=>{if(!t)return;const e=t.getAttribute("data-speccer");if(null===(o=e)||!o.split(" ").includes(n.Measure))return;var o;if(k(t))return;await A();const s=t.getBoundingClientRect();if((t=>null!==t&&a(t).includes(n.Width))(e))if(p(e)){const n=H(s.width,e);document.body.appendChild(n);const o=await B(n,t),{left:i,top:r,width:a}=o.fromBottom({center:!1});await R(n,{left:`${i}px`,top:`${r}px`,width:`${a}px`})}else{const n=H(s.width,e);document.body.appendChild(n);const o=await B(n,t),{left:i,top:r,width:a}=o.fromTop({center:!1});await R(n,{left:`${i}px`,top:`${r}px`,width:`${a}px`})}else if((t=>null!==t&&a(t).includes(n.Height))(e))if(l(e)){const n=H(s.height,e);document.body.appendChild(n);const o=await B(n,t),{left:i,top:r,height:a}=o.fromRight({center:!1});await R(n,{left:`${i}px`,top:`${r}px`,height:`${a}px`})}else{const n=H(s.height,e);document.body.appendChild(n);const o=await B(n,t),{left:i,top:r,height:a}=o.fromLeft({center:!1});await R(n,{left:`${i}px`,top:`${r}px`,height:`${a}px`})}},I=(t="",e,n="",o="span")=>{const s=document.createElement(o),i=document.createTextNode(t),r={};null!==e&&""!==e&&(r[e]=!0),!f(e)||d(e)||m(e)||u(e)||(r.svg=!0),!d(e)&&!h(e)||d(e)&&m(e)?s.appendChild(i):(d(e)||h(e))&&s.setAttribute("data-pin-counter",t);const a=E("ph-speccer speccer pin",r);return $(s,a),s.setAttribute("id",n),s},N=()=>"_"+Math.random().toString(36).substring(2,11),q=t=>t.top,V=t=>t.left+t.width,z=t=>t.top+t.height,O=t=>t.left,G=t=>t.left+t.width/2,W=t=>t.top+t.height/2,j={center:t=>({x:G(t),y:W(t)}),top:t=>({x:G(t),y:q(t)}),right:t=>({x:V(t),y:W(t)}),bottom:t=>({x:G(t),y:z(t)}),left:t=>({x:O(t),y:W(t)}),"right-top":t=>({x:V(t),y:q(t)}),"right-bottom":t=>({x:V(t),y:z(t)}),"left-top":t=>({x:O(t),y:q(t)}),"left-bottom":t=>({x:O(t),y:z(t)}),"top-left":t=>({x:O(t),y:q(t)}),"top-right":t=>({x:V(t),y:q(t)}),"bottom-left":t=>({x:O(t),y:z(t)}),"bottom-right":t=>({x:V(t),y:z(t)}),"top-center":t=>({x:G(t),y:q(t)}),"right-center":t=>({x:V(t),y:W(t)}),"bottom-center":t=>({x:G(t),y:z(t)}),"left-center":t=>({x:O(t),y:W(t)})},D=async(t,e="center")=>{if(!e)throw Error("No position given");if(y(e))throw Error("The position given is not the required type: pos: "+typeof e);const n=["center","left","right","top","bottom","right-top","right-bottom","left-top","left-bottom","top-left","top-right","bottom-left","bottom-right","top-center","right-center","bottom-center","left-center"];if(!n.includes(e))throw Error(`The position given does not match allowed positions to use! Valid positions are: ${n.join(", ")}`);await A();const o=t.getBoundingClientRect();return j[e](o)};class F{#t;el;circle;radius;areas;constructor(t,e,n){this.#e(t,e,n)}#e(t,e,n){if(!t||!e||!n)throw new Error("Missing inputs el or radius or areas");if(!document.body.contains(t))throw new Error("el is not in the DOM");if(this.el=t,this.radius=e,this.areas=n,this.#t=document.getElementById("ph-speccer-svg"),!this.#t)throw new Error("Missing required SVG element to draw circles. Please see the documentation");const o=document.body,s=document.documentElement,i=Math.max(o.scrollHeight,o.offsetHeight,s.clientHeight,s.scrollHeight,s.offsetHeight);R(this.#t,{height:`${i}px`}),this.draw()}async draw(){const t=`ph_draw-circle-${N()}`;this.circle=document.createElementNS("http://www.w3.org/2000/svg","circle");const e=this.el.getAttribute("id")||N();if(this.el.setAttribute("id",e),this.circle.setAttribute("id",t),this.circle.setAttribute("data-el",e),this.circle.classList.add("ph-speccer"),this.circle.classList.add("speccer"),this.circle.classList.add("circle"),!this.#t)throw new Error("No parentNode found for circle");this.#t.appendChild(this.circle);let n="top";c(this.areas)&&(n="left"),l(this.areas)&&(n="right"),p(this.areas)&&(n="bottom");const{x:o,y:s}=await D(this.el,n);this.circle.setAttribute("r",this.radius+""),this.circle.setAttribute("cx",Math.round(o)+""),this.circle.setAttribute("cy",Math.round(s)+""),this.circle.setAttribute("fill","currentColor")}}window.DrawCircle=F;const _=async(t,e,n="center",o="center")=>{if(!t||!e)throw Error("No element given");const{x:s,y:i}=await D(t,n),{x:r,y:a}=await D(e,o);return{x1:s,y1:i,x2:r,y2:a}},X=(t,e)=>{const{x1:n,x2:o,y1:s,y2:i}=t,{direct:r=!1,firstSet:a=!1,direction:c}=e;let l={x:n+(o-n)/2,y:s},p={x:n+(o-n)/2,y:i};return r&&(a?"west"===c?(l={x:n-32,y:s-8},p={x:o+32,y:i}):"south"===c?(l={x:n-8,y:s+32},p={x:o,y:i-32}):"east"===c?(l={x:n+32,y:s-8},p={x:o-32,y:i}):(l={x:n-8,y:s-32},p={x:o,y:i+32}):"west"===c?(l={x:n-32,y:s+8},p={x:o+32,y:i}):"south"===c?(l={x:n+8,y:s+32},p={x:o,y:i-32}):"east"===c?(l={x:n+32,y:s+8},p={x:o-32,y:i}):(l={x:n+8,y:s-32},p={x:o,y:i+32})),{firstPoint:{x:n,y:s},firstControl:l,lastPoint:{x:o,y:i},lastControl:p}},Y=async(t,e,n)=>{const{pos1:o,pos2:s,firstSet:i=!1,direction:r}=n,{x1:a,y1:c,x2:l,y2:p}=await _(t,e,o,s);let d=0,h=0;"north"===r?h=8:"west"===r?d=8:"east"===r?d=-8:"south"===r&&(h=-8);const{firstPoint:u,firstControl:f,lastControl:m,lastPoint:g}=X({x1:a+0,x2:l+d,y1:c+0+document.documentElement.scrollTop,y2:p+h+document.documentElement.scrollTop},{direct:!0,firstSet:i,direction:r});return`M ${u.x} ${u.y}C ${f.x} ${f.y}, ${m.x} ${m.y}, ${g.x} ${g.y}`},K=async({start:t,stop:e,crude:n=!1})=>{const{x1:o,y1:s,x2:i,y2:r}=await _(t,e),a=((t,e,n,o,s=!0)=>{if(b(t)||b(e)||b(n)||b(o))throw new SyntaxError("Missing input for `angle`");if(x(t)||x(e)||x(n)||x(o))throw TypeError(`Parameters for \`angle\` do not have the required type. Requires number! Got: ${typeof t} ${typeof e} ${typeof n} ${typeof o}`);const i=o-e,r=n-t;let a=Math.atan2(i,r);return a*=180/Math.PI,s&&a<0&&(a+=360),a})(o,s,i,r);return n?(t=>{if(t>360)throw new RangeError("Parameter cannot exceed 360");if(t<0)throw new RangeError("Parameter cannot be lower than 0");return t>=45&&t<=135?"south":t>135&&t<=225?"west":t>225&&t<=315?"north":"east"})(a):(t=>{if(t>360)throw new RangeError("Parameter cannot exceed 360");if(t<0)throw new RangeError("Parameter cannot be lower than 0");return t>=0&&t<=22.5?"east":t>=22.5&&t<=67.5?"south-east":t>=67.5&&t<=112.5?"south":t>=112.5&&t<=157.5?"south-west":t>=157.5&&t<=202.5?"west":t>=202.5&&t<=247.5?"north-west":t>=247.5&&t<=292.5?"north":t>=292.5&&t<=337.5?"north-east":"east"})(a)};class U{#t;#n;startElement;stopElement;firstPathElement;secondPathElement;constructor(t,e){this.#e(t,e)}#e(t,e){if(!t||!e)throw new Error("Missing inputs startElement and stopElement");if(!document.body.contains(e))throw new Error("stopElement is not in the DOM");if(!document.body.contains(t))throw new Error("startElement is not in the DOM");if(this.startElement=t,this.stopElement=e,this.#t=document.getElementById("ph-speccer-svg"),this.#n=document.getElementById("ph-speccer-path"),!this.#n||!this.#t)throw new Error("Missing required SVG element to draw lines. Please see the documentation");const n=document.body,o=document.documentElement,s=Math.max(n.scrollHeight,n.offsetHeight,o.clientHeight,o.scrollHeight,o.offsetHeight);R(this.#t,{height:`${s}px`}),this.connect()}connect(){this.draw(this.#n)}#o(t){if(!t)throw new Error("No path given to #getPathElement!");const e=`ph_draw_path-path-${N()}`,n=t.cloneNode(!1),o=this.startElement.getAttribute("id")||N();return this.startElement.setAttribute("id",o),n.setAttribute("data-start-el",o),n.setAttribute("id",e),n.classList.remove("original"),n.classList.add("speccer"),n}async draw(t){if(!t)throw new Error("No path given to draw!");const e=this.#o(t),n=this.#o(t);if(!t.parentNode)throw new Error("No parentNode found for path");this.firstPathElement=t.parentNode.insertBefore(e,t.nextSibling),this.secondPathElement=t.parentNode.insertBefore(n,t.nextSibling);const o=await K({stop:this.stopElement,start:this.startElement,crude:!0}),{path1pos1:s,path1pos2:i,path2pos1:r,path2pos2:a}=(t=>{let e,n,o,s;switch(t){case"east":e="right-top",n="left-center",o="right-bottom",s="left-center";break;case"south":e="bottom-left",n="top-center",o="bottom-right",s="top-center";break;case"west":e="left-top",n="right-center",o="left-bottom",s="right-center";break;default:e="top-left",n="bottom-center",o="top-right",s="bottom-center"}return{path1pos1:e,path1pos2:n,path2pos1:o,path2pos2:s}})(o),c=await Y(this.startElement,this.stopElement,{pos1:s,pos2:i,firstSet:!0,direction:o}),l=await Y(this.startElement,this.stopElement,{pos1:r,pos2:a,direction:o});this.firstPathElement.setAttribute("data-direction",o),this.firstPathElement.setAttribute("data-pos1",s),this.firstPathElement.setAttribute("data-pos2",i),this.firstPathElement.setAttribute("d",c),this.secondPathElement.setAttribute("data-direction",o),this.secondPathElement.setAttribute("data-pos1",r),this.secondPathElement.setAttribute("data-pos2",a),this.secondPathElement.setAttribute("d",l)}}window.DrawSVGCurlyBracket=U;class Z{#t;#n;startElement;stopElement;line;constructor(t,e){this.#e(t,e)}#e(t,e){if(!t||!e)throw new Error("Missing inputs startElement and stopElement");if(!document.body.contains(e))throw new Error("stopElement is not in the DOM");if(!document.body.contains(t))throw new Error("startElement is not in the DOM");if(this.startElement=t,this.stopElement=e,this.#t=document.getElementById("ph-speccer-svg"),this.#n=document.getElementById("ph-speccer-path"),!this.#n||!this.#t)throw new Error("Missing required SVG element to draw lines. Please see the documentation");const n=document.body,o=document.documentElement,s=Math.max(n.scrollHeight,n.offsetHeight,o.clientHeight,o.scrollHeight,o.offsetHeight);R(this.#t,{height:`${s}px`}),this.connect()}connect(){this.draw(this.#n)}async draw(t){if(!t)throw new Error("No path given to draw!");const e=`ph_draw_path-path-${N()}`,n=t.cloneNode(!1),o=this.startElement.getAttribute("id")||N();if(this.startElement.setAttribute("id",o),n.setAttribute("id",e),n.setAttribute("data-start-el",o),n.classList.remove("original"),n.classList.add("speccer"),!t.parentNode)throw new Error("No parentNode found for path");this.line=t.parentNode.insertBefore(n,t.nextSibling);const s=await K({start:this.startElement,stop:this.stopElement,crude:!0}),{pos1:i,pos2:r}=(t=>{let e,n;switch(t){case"east":e="right",n="left";break;case"south":e="bottom",n="top";break;case"west":e="left",n="right";break;default:e="top",n="bottom"}return{pos1:e,pos2:n}})(s),a=await(async(t,e,n)=>{const{pos1:o,pos2:s}=n,{x1:i,y1:r,x2:a,y2:c}=await _(t,e,o,s),{firstPoint:l,firstControl:p,lastControl:d,lastPoint:h}=X({x1:i,x2:a,y1:r,y2:c},{direction:""});return`M ${l.x} ${l.y}C ${p.x} ${p.y}, ${d.x} ${d.y}, ${h.x} ${h.y}`})(this.startElement,this.stopElement,{pos1:i,pos2:r});this.line.setAttribute("data-direction",s),this.line.setAttribute("data-pos1",i),this.line.setAttribute("data-pos2",r),this.line.setAttribute("d",a)}}window.DrawSVGLine=Z;const J=[..."ABCDEFGHIJKLMNOPQRSTUVWXYZ"],Q="data-speccer",tt="spacing",et=t=>parseInt(t,10),nt=t=>t.includes("Top")?t.replace("Top"," top"):t.includes("Right")?t.replace("Right"," right"):t.includes("Bottom")?t.replace("Bottom"," bottom"):t.includes("Left")?t.replace("Left"," left"):"",ot=t=>et(getComputedStyle(t).getPropertyValue("--ph-speccer-pin-space"))||48,st=async(t,e,n,o,s)=>{await A();const{isCurly:i=!1}=s||{},r=ot(n),a=et(getComputedStyle(n).getPropertyValue("--ph-speccer-measure-size"))||8;const m=await B(n,e);if(h(t)){const{left:t,top:e,height:n,width:o}=m.absolute();return{left:`${t}px`,top:`${e}px`,height:`${n}px`,width:`${o}px`}}if(f(t)&&!d(t)&&!i&&!u(t)){if(l(t)){const{top:t}=m.fromRight({center:!0});await A();const{left:e,width:n}=o.getBoundingClientRect();return{left:`${e+n+r}px`,top:`${t}px`}}if(p(t)){const{left:t}=m.toBottom({center:!0});await A();const{top:e,height:n}=o.getBoundingClientRect();return{left:`${t}px`,top:`${e+n+r}px`}}if(c(t)){const{top:t}=m.fromLeft({center:!0});await A();const{left:e}=o.getBoundingClientRect();return{left:e-1.5*r+"px",top:`${t}px`}}const{left:e}=m.fromTop({center:!0});await A();const{top:n}=o.getBoundingClientRect();return{left:`${e}px`,top:n-1.5*r+"px"}}if(c(t)){if(d(t)&&!i){const{left:t,top:e,height:n}=m.fromLeft({sourceWidth:a});return{left:`${t}px`,top:`${e}px`,height:`${n}px`}}const{left:e,top:n}=m.fromLeft({center:!0,modifier:i?r/1.5:r});return{left:`${e}px`,top:`${n}px`}}if(l(t)){if(d(t)&&!i){const{left:t,top:e,height:n}=m.fromRight({center:!1});return{left:`${t}px`,top:`${e}px`,height:`${n}px`}}const{left:e,top:n}=m.fromRight({center:!0,modifier:i?r/1.5:r});return{left:`${e}px`,top:`${n}px`}}if(p(t)){if(d(t)&&!i){const{left:t,top:e,width:n}=m.fromBottom({center:!1});return{left:`${t}px`,top:`${e}px`,width:`${n}px`}}const{left:e,top:n}=m.fromBottom({center:!0,modifier:i?r/1.5:r});return{left:`${e}px`,top:`${n}px`}}if(d(t)&&!i){const{left:t,top:e,width:n}=m.fromTop({center:!1});return{left:`${t}px`,top:`${e}px`,width:`${n}px`}}const{left:g,top:y}=m.fromTop({center:!0,modifier:i?r/1.5:r});return{left:`${g}px`,top:`${y}px`}},it=async(t,n,o,s="")=>{if(!t)return;const i=t.getAttribute("data-speccer")||s;if(null===(r=i)||!r.split(" ").includes(e.Pin))return;var r;const c=`speccer-${l=i,l.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").trim().toLowerCase().replace(/[^a-z0-9 -]/g,"").replace(/\s+/g," ").replace(/(?:^\w|[A-Z]|\b\w)/g,((t,e)=>0===e?t.toLowerCase():t.toUpperCase())).replace(/\s+/g,"")}-${t.getAttribute("id")||N()}`;var l;const p=I(n,i,c);t.setAttribute("data-speccer-element-id",c),document.body.appendChild(p);const g=await st(i,t,p,o,{isCurly:m(i)});await R(p,g);const y=f(i)&&!h(i)&&!d(i)&&!u(i),w=y||(t=>null!==t&&a(t).includes(e.SVG))(i)&&!m(i);return w?(new Z(t,p),y&&new F(t,5,i)):m(i)&&new U(t,p),c};let rt=0;const at=async t=>{if(!t)return;const e=t.querySelectorAll('[data-speccer^="pin"]');e&&0!==e.length&&[...e].filter((async t=>!k(t))).forEach((async(e,n)=>{const o=(t=>{const e=window.SPECCER_LITERALS||J;let n=e[t];return 0===t&&(rt=0),n||(n=`${e[rt]}${e[rt].toLowerCase()}`,rt++),n})(n);await it(e,o,t)}))},ct=async(t,e,n,o)=>{await A();const s=o.getBoundingClientRect(),i=await P(o);"marginTop"===t&&R(n,{height:`${e}px`,width:s.width+"px",left:i.left+"px",top:i.top-e+"px"}),"marginRight"===t&&R(n,{height:s.height+"px",width:`${e}px`,left:i.left+parseInt(s.width+"",10)+"px",top:i.top+"px"}),"marginBottom"===t&&R(n,{height:`${e}px`,width:s.width+"px",left:i.left+"px",top:i.top+parseInt(s.height+"",10)+"px"}),"marginLeft"===t&&R(n,{height:s.height+"px",width:`${e}px`,left:i.left-e+"px",top:i.top+"px"}),"paddingTop"===t&&R(n,{height:`${e}px`,width:s.width+"px",left:i.left+"px",top:i.top+"px"}),"paddingBottom"===t&&R(n,{height:`${e}px`,width:s.width+"px",left:i.left+"px",top:i.top+(parseInt(s.height+"",10)-e)+"px"}),"paddingRight"===t&&R(n,{height:s.height+"px",width:`${e}px`,left:i.left+(parseInt(s.width+"",10)-e)+"px",top:i.top+"px"}),"paddingLeft"===t&&R(n,{height:s.height+"px",width:`${e}px`,left:i.left+"px",top:i.top+"px"})},lt=(t="",e="span")=>{const n=document.createElement(e),o=document.createTextNode(String(t));return n.appendChild(o),n.setAttribute("title",`${t}px`),$(n,"ph-speccer speccer spacing"),n},pt=async t=>{if(!t)return;const e=await T(t);if(k(t))return;const n=(t=>{const{marginTop:e,marginBottom:n,marginLeft:o,marginRight:s,paddingTop:i,paddingBottom:r,paddingLeft:a,paddingRight:c}=t;return{marginTop:e,marginBottom:n,marginLeft:o,marginRight:s,paddingTop:i,paddingBottom:r,paddingLeft:a,paddingRight:c}})(e),o=Object.keys(n).filter((t=>"0px"!==n[t]));if(o.length)for(const e of o){const o=et(n[e]),s=lt(o),i=nt(e);$(s,i),document.body.appendChild(s),t.classList.add("is-specced"),await ct(e,o,s,t)}},dt=t=>{const e=()=>((t,e,n=!1)=>{let o;return function(s,...i){const r=n&&!o;o&&clearTimeout(o),o=setTimeout((function(){o=null,n||t.apply(s,i)}),e),r&&t.apply(s,i)}})((()=>{t()}),300);window.removeEventListener("resize",e),window.addEventListener("resize",e)},ht=t=>{"loading"===document.readyState?document.addEventListener("DOMContentLoaded",(()=>{t()})):t()},ut=()=>{const t=new IntersectionObserver(((t,e)=>{for(const n of t)n.intersectionRatio>0&&(pt(n.target),e.unobserve(n.target))}));for(const e of document.querySelectorAll('[data-speccer^="spacing"],[data-speccer^="spacing"] *:not(td):not(tr):not(th):not(tfoot):not(thead):not(tbody)'))t.observe(e);const e=new IntersectionObserver(((t,e)=>{for(const n of t)n.intersectionRatio>0&&(M(n.target),e.unobserve(n.target))}));for(const t of document.querySelectorAll('[data-speccer^="measure"]'))e.observe(t);const n=new IntersectionObserver((async(t,e)=>{for(const n of t)n.intersectionRatio>0&&(await at(n.target),e.unobserve(n.target))}));for(const t of document.querySelectorAll('[data-speccer="pin-area"]'))n.observe(t)},ft=t=>{window.speccer=t},mt=t=>{const e=document.currentScript;if(e){const n=e.getAttribute("src");n?.includes("speccer.js")&&(e.hasAttribute("data-manual")?ft(t):e.hasAttribute("data-instant")?t():e.hasAttribute("data-dom")?ht(t):e.hasAttribute("data-lazy")?ut():ht(t),e.hasAttribute("data-manual")||e.hasAttribute("data-lazy")||dt(t))}},gt=["alt","altgraph","capslock","control","fn","fnlock","hyper","meta","numlock","os","scrolllock","shift","super","symbol","command","ctrl","altgr","symbollock"],yt=["escape","esc","enter","return","⏎","␛"],wt=async(t,e,n)=>{await A();const o=ot(n),s=await B(n,e);if("tabstops"===t){let{left:t,top:e}=s.fromTop();return t-=32,t<=0&&(t=32),e<=0&&(e=32),{left:`${t}px`,top:`${e}px`}}if("landmark"===t){let{left:t,top:e}=s.fromTop();return t-=16,e-=16,t<=0&&(t=32),e<=0&&(e=32),{left:`${t}px`,top:`${e}px`}}if("region"===t){const{left:t,top:e,height:n,width:o}=s.fromTop();return{height:`${n}px`,width:`${o}px`,left:`${t}px`,top:`${e}px`}}if("shortcut"===t){const{left:t,top:e}=s.fromBottom();return{left:`${t}px`,top:`${e}px`}}const{left:i,top:r}=s.fromTop({center:!0,modifier:o});return{left:i-32+"px",top:r-32+"px"}},xt=async(t,e,n)=>{if(!t||!t.checkVisibility())return;const o=((t="tabstops",e,n="span")=>{const o=document.createElement(n),s=E("ph-speccer speccer a11y",{tabstops:"tabstops"===t,landmark:"landmark"===t,region:"region"===t});if("landmark"===t&&e){const t=document.createTextNode(String(e));o.appendChild(t)}return $(o,s),o})(n,e);if("landmark"===n){o.setAttribute("data-speccer-nodename",t.nodeName);const e=t.role||`semantic role: ${t.nodeName.toLowerCase()}`,n=t.getAttribute("aria-label")||"unnamed";o.setAttribute("title",`${n}: ${e}`)}document.body.appendChild(o);const s=await wt(n,t,o);await R(o,s)},bt=async(t,e)=>{const n=e.split(/\s\+\s/).map((t=>t.trim())),o=document.createElement("div");o.classList.add("ph-speccer"),o.classList.add("speccer"),o.classList.add("a11y"),o.classList.add("shortcut-holder");for(const t of n){const e=document.createElement("kbd"),n=document.createTextNode(t);e.classList.add("ph-speccer"),e.classList.add("speccer"),e.classList.add("a11y"),e.classList.add("shortcut"),gt.includes(t.toLowerCase())&&e.classList.add("modifier"),yt.includes(t.toLowerCase())&&e.classList.add("physical"),e.appendChild(n),o.appendChild(e)}document.body.appendChild(o);const s=await wt("shortcut",t,o);await R(o,s)},$t=async(t,e,n)=>{await A();const{toggle:o}=n,{height:s,width:i}=t.getBoundingClientRect(),{top:r,left:a}=await P(t),{gridTemplateColumns:c,gridTemplateRows:l,padding:p}=e;if("columns"===o||"both"===o){const t=parseInt(e.columnGap),n=document.createElement("div");document.documentElement.style.setProperty("--ph-speccer-grid-gap-original",`${t}px`),document.documentElement.style.setProperty("--ph-speccer-grid-gap",`${t<24?24:t}px`),t<24&&n.classList.add("speccer-small-grid"),n.classList.add("ph-speccer"),n.classList.add("speccer"),n.classList.add("speccer-grid-container"),n.style.height=`${s+64}px`,n.style.width=`${i}px`,n.style.left=`${a}px`,n.style.top=r-32+"px",n.style.padding=p,n.style.gridTemplateColumns=c;const o=c.split(" ").length;for(let t=0;t<o;t++){const t=document.createElement("div");t.classList.add("ph-speccer"),t.classList.add("speccer"),t.classList.add("speccer-grid-item"),n.appendChild(t)}document.body.appendChild(n)}if("rows"===o||"both"===o){const t=parseInt(e.rowGap),n=document.createElement("div");document.documentElement.style.setProperty("--ph-speccer-grid-row-gap-original",`${t}px`),document.documentElement.style.setProperty("--ph-speccer-grid-row-gap",`${t<24?24:t}px`),t<24&&n.classList.add("speccer-small-grid"),n.classList.add("ph-speccer"),n.classList.add("speccer"),n.classList.add("speccer-grid-row-container"),n.style.width=`${i+64}px`,n.style.height=`${s}px`,n.style.top=`${r}px`,n.style.left=a-32+"px",n.style.padding=p,n.style.gridTemplateRows=l;const o=l.split(" ").length;for(let t=0;t<o;t++){const t=document.createElement("div");t.classList.add("ph-speccer"),t.classList.add("speccer"),t.classList.add("speccer-grid-row-item"),n.appendChild(t)}document.body.appendChild(n)}},Et=async t=>{if(!t)return;const e=t.getAttribute(Q),n=await T(t);if(!((t,e)=>null!==t&&t.split(" ").includes(r.Grid)&&("grid"===e.display||e.display.includes("grid")))(e,n))return;if(k(t))return;await A();const o={toggle:"both"};e?.includes("columns")&&(o.toggle="columns"),e?.includes("rows")&&(o.toggle="rows"),await $t(t,n,o)},kt=(t="span")=>{const e=document.createElement(t),n=E("ph-speccer speccer mark");return $(e,n),e},At=async t=>{if(!t)return;const e=t.getAttribute(Q);if(null===(n=e)||!n.split(" ").includes(i.Mark))return;var n;if(k(t))return;const o=kt();document.body.appendChild(o);const s=await B(o,t),{left:r,top:a,height:c,width:l}=s.absolute(),p={left:`${r}px`,top:`${a}px`,height:`${c}px`,width:`${l}px`};await R(o,p)},St=(t,e=3)=>parseFloat(String(t)).toFixed(e),Ct=(t,e)=>{const n=document.createElement("div"),o={};if(null!==e&&""!==e)for(const t of e.split(" "))o[t]=!0;const s=E("ph-speccer speccer typography",o);return n.innerHTML=t,$(n,s),n},Lt=async t=>{if(!t)return;const e=t.getAttribute("data-speccer");if(null===(n=e)||!n.split(" ").includes(o.Typography))return;var n;if(k(t))return;const s=(t=>!!t&&t.split(" ").includes(o.Syntax))(e);t.classList.add("is-specced");const i=await(async(t,e=!1)=>{const n=(t=>{const{lineHeight:e,letterSpacing:n,fontFamily:o,fontSize:s,fontStyle:i,fontVariationSettings:r,fontWeight:a}=t;return{lineHeight:e,letterSpacing:n,fontFamily:o,fontSize:s,fontStyle:i,fontVariationSettings:r,fontWeight:a}})(await T(t));if(e){const t=n.fontFamily.split(",").map((t=>t.includes("'")?`<span class="token string">${t}</span>`:t)).join('<span class="token punctuation">, </span>'),e=`<span class="token number">${parseInt(n.fontSize,10)}</span><span class="token unit">px</span> <span class="token operator">/</span> <span class="token number">${parseInt(n.fontSize,10)/16}</span><span class="token unit">rem</span>`,o=n.letterSpacing.includes("px")?`<span class="token number">${parseInt(n.letterSpacing,10)}</span><span class="token unit">px</span>`:n.letterSpacing,s="normal"!==n.lineHeight?`<span class="token number">${parseInt(n.lineHeight,10)}</span><span class="token unit">px</span> <span class="token operator">/</span> <span class="token number">${parseInt(n.lineHeight,10)/16}</span><span class="token unit">rem</span>`:"normal";return`\n<pre class="language-css" tabindex="-1"><code class="language-css"><span class="token selector"><span class="token class">.typography</span></span> <span class="token punctuation">{</span>\n <span class="token property">font-family</span><span class="token punctuation">:</span> ${t}<span class="token punctuation">;</span>\n <span class="token property">font-size</span><span class="token punctuation">:</span> ${e}<span class="token punctuation">;</span>\n <span class="token property">font-weight</span><span class="token punctuation">:</span> <span class="token number">${n.fontWeight}</span><span class="token punctuation">;</span>\n <span class="token property">font-variation-settings</span><span class="token punctuation">:</span> ${n.fontVariationSettings}<span class="token punctuation">;</span>\n <span class="token property">line-height</span><span class="token punctuation">:</span> ${s}<span class="token punctuation">;</span>\n <span class="token property">letter-spacing</span><span class="token punctuation">:</span> ${o}<span class="token punctuation">;</span>\n <span class="token property">font-style</span><span class="token punctuation">:</span> ${n.fontStyle}<span class="token punctuation">;</span>\n<span class="token punctuation">}</span></code></pre>`}return`\ntypography: {<ul class="speccer-styles"> <li><span class="property">font-family:</span> ${n.fontFamily};</li> <li><span class="property">font-size:</span> ${n.fontSize} / ${parseInt(n.fontSize,10)/16}rem;</li> <li><span class="property">font-weight:</span> ${n.fontWeight};</li> <li><span class="property">font-variation-settings:</span> ${n.fontVariationSettings};</li> <li><span class="property">line-height:</span> ${"normal"!==n.lineHeight?`${parseInt(n.lineHeight,10)}px / ${parseInt(n.lineHeight,10)/16}rem`:"normal"};</li> <li><span class="property">letter-spacing:</span> ${n.letterSpacing};</li> <li><span class="property">font-style:</span> ${n.fontStyle};</li></ul>}`})(t,s),r=Ct(i,e);document.body.appendChild(r);const a=await(async(t,e,n)=>{const s=e.getBoundingClientRect(),i=ot(n),r=n.getBoundingClientRect(),a=await P(e);if(t&&t.includes(o.Right))return{left:a.left+s.width+i+"px",top:St(v(a.top,r,s))+"px"};if(t&&t.includes(o.Top))return{left:St(L(a.left,r,s))+"px",top:a.top-r.height-i+"px"};if(t&&t.includes(o.Bottom))return{left:St(L(a.left,r,s))+"px",top:a.top+s.height+i+"px"};return{left:a.left-r.width-i+"px",top:St(v(a.top,r,s))+"px"}})(e,t,r);R(r,a)},vt={create:$t,element:Et},Pt={create:lt,element:pt},Bt={createPinElement:I,pinElement:it,pinElements:at},Rt={create:H,element:M},Tt={create:kt,element:At},Ht={create:Ct,element:Lt},Mt={dom:ht,lazy:ut,manual:ft,activate:mt},It=()=>{((t,e=document)=>{[].forEach.call(e.querySelectorAll(t),(function(t){t.remove()}))})(".ph-speccer.speccer");const t=document.querySelectorAll(`[${Q}^="${tt}"],[${Q}^="${tt}"] *:not(td):not(tr):not(th):not(tfoot):not(thead):not(tbody)`),e=document.querySelectorAll(`[${Q}^="measure"]`),n=document.querySelectorAll(`[${Q}^="typography"]`),o=document.querySelectorAll(`[${Q}="pin-area"]`),s=document.querySelectorAll(`[${Q}^="mark"]`),i=document.querySelectorAll(`[${Q}^="grid"]`);for(const t of s)At(t);for(const t of i)Et(t);for(const e of t)pt(e);for(const t of e)M(t);for(const t of n)Lt(t);for(const t of o)at(t);(()=>{const t=document.querySelectorAll('[data-speccer*="a11y tabstops"]'),e=document.querySelectorAll('[data-speccer*="a11y landmark"]'),n=document.querySelectorAll('[data-speccer*="a11y shortcut"]');if(n.length)for(const t of n){const e=t.getAttribute("data-speccer-a11y-shortcut");e&&""!==e&&!k(t)&&bt(t,e)}if(t.length)for(const e of t){const t=e.querySelectorAll("\n a[href], area[href], input:not([disabled]):not([tabindex='-1']),\n button:not([disabled]):not([tabindex='-1']),select:not([disabled]):not([tabindex='-1']),\n textarea:not([disabled]):not([tabindex='-1']),\n iframe, object, embed, *[tabindex]:not([tabindex='-1']), *[contenteditable=true]\n");for(const e of t)k(e)||xt(e,null,"tabstops")}if(e.length)for(const t of e){const e=t.querySelectorAll('\nheader, footer, section, main, nav, aside, [role="section"], [role="banner"],\n[role="complementary"], [role="contentinfo"], [role="form"], [role="main"],\n[role="navigation"], [role="region"], [role="search"]\n');for(const[t,n]of e.entries())k(n)||(xt(n,t+1,"landmark"),xt(n,null,"region"))}})()};mt(It);export{It as default,vt as grid,Tt as mark,Rt as measure,Mt as modes,Bt as pin,Pt as spacing,Ht as typography};
|
|
27
|
+
const t=[..."ABCDEFGHIJKLMNOPQRSTUVWXYZ"],e="data-speccer",n="spacing",o="measure",i="typography",s="mark",r="grid",a="pin-area";var c,l,p,d,h,u,f;!function(t){t.Empty="",t.Left="left",t.Right="right",t.Bottom="bottom",t.Top="top"}(c||(c={})),function(t){t.Pin="pin",t.Parent="parent",t.Text="text",t.Enclose="enclose",t.Subtle="subtle",t.Bracket="bracket",t.Left="left",t.Right="right",t.Bottom="bottom",t.Top="top",t.SVG="svg",t.Curly="curly"}(l||(l={})),function(t){t.Measure="measure",t.Slim="slim",t.Width="width",t.Height="height",t.Left="left",t.Right="right",t.Bottom="bottom",t.Top="top"}(p||(p={})),function(t){t.Typography="typography",t.Syntax="syntax",t.Left="left",t.Right="right",t.Bottom="bottom",t.Top="top"}(d||(d={})),function(t){t.Spacing="spacing"}(h||(h={})),function(t){t.Mark="mark"}(u||(u={})),function(t){t.Grid="grid"}(f||(f={}));const g=t=>t.split(" "),m=t=>{if(null===t)return!1;return g(t).includes(l.Bracket)},y=t=>{if(null===t)return!1;return g(t).includes(l.Enclose)},w=t=>{if(null===t)return!1;return g(t).includes(l.Subtle)},x=t=>{if(null===t)return!1;return g(t).includes(l.Parent)},b=t=>{if(null===t)return!1;return g(t).includes(l.Text)},$=t=>{if(null===t)return!1;return g(t).includes(p.Height)},E=t=>{if(null===t)return!1;return g(t).includes(p.Slim)},A=t=>{if(null===t)return!1;return g(t).includes(p.Width)},k=t=>{if(null===t)return!1;const e=g(t);return(x(t)&&!y(t)&&!m(t)||b(t)||e.includes(l.SVG))&&!C(t)},C=t=>{if(null===t)return!1;const e=g(t);return e.includes(l.Curly)&&e.includes(l.Bracket)},S=t=>!!t&&t.split(" ").includes(d.Syntax),L=(t,e)=>(t=>null!==t&&t.split(" ").includes(l.Pin))(t)?"pin":((t,e)=>null!==t&&t.split(" ").includes(f.Grid)&&("grid"===e.display||e.display.includes("grid")))(t,e)?"grid":(t=>null!==t&&t.split(" ").includes(u.Mark))(t)?"mark":(t=>null!==t&&t.split(" ").includes(p.Measure))(t)?"measure":(t=>null!==t&&t.split(" ").includes(h.Spacing))(t)?"spacing":(t=>null!==t&&t.split(" ").includes(d.Typography))(t)?"typography":"pin",v=t=>(t=>null!==t&&g(t).includes(l.Left))(t)?"left":(t=>null!==t&&g(t).includes(l.Right))(t)?"right":(t=>null!==t&&g(t).includes(l.Bottom))(t)?"bottom":"top",P=(t,e,n)=>{const o=L(t,e),i={slug:(s=t,s.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").trim().toLowerCase().replace(/[^a-z0-9 -]/g,"").replace(/\s+/g," ").replace(/(?:^\w|[A-Z]|\b\w)/g,((t,e)=>0===e?t.toLowerCase():t.toUpperCase())).replace(/\s+/g,"")),position:v(t),type:o};var s;if("pin"===o&&(i.pin={bracket:m(t),enclose:y(t),subtle:w(t),parent:x(t),text:b(t),useSVGLine:k(t),useCurlyBrackets:C(t)}),"measure"===o&&(i.measure={slim:E(t),height:$(t),width:A(t)}),"typography"===o&&(i.typography={useSyntaxHighlighting:S(t)}),"grid"===o){const e=(t=>t?.includes("columns")?"columns":t?.includes("rows")?"rows":"both")(t);i.grid={toggle:e,both:"both"===e,rows:"rows"===e,columns:"columns"===e}}if("spacing"===o){const e=(t=>t?.includes("margin")?"margin":t?.includes("padding")?"padding":"both")(t);i.spacing={both:"both"===e,margin:"margin"===e,padding:"padding"===e,bound:t.includes("bound")}}return{...i,...n}},B=()=>"_"+Math.random().toString(36).substring(2,11),R=t=>!t.checkVisibility({opacityProperty:!0,checkVisibilityCSS:!0}),T=()=>new Promise(requestAnimationFrame),H=async(t,e,n)=>{await T();return getComputedStyle(t)[e]===n},I=async(t,e,n)=>{if(!t.parentElement)return null;return await H(t.parentElement,e,n)?t.parentElement:await I(t.parentElement,e,n)},M=(t,e,n)=>t-e.width/2+n.width/2,N=(t,e,n)=>t-e.height/2+n.height/2,q=async t=>{await T();let e=t.getBoundingClientRect(),n=e.top+window.scrollY;const o=e.left+window.scrollX,i=await(async t=>await I(t,"position","sticky"))(t),s=await(async t=>await H(t,"position","sticky"))(t);if(s){const o=t.style.position;await T(),t.style.position="relative",await T(),e=t.getBoundingClientRect(),n=e.top,await T(),t.style.position=o}else if(i){const o=i.style.position;await T(),i.style.position="relative",await T(),e=t.getBoundingClientRect(),n=e.top,await T(),i.style.position=o}return{height:e.height,width:e.width,top:n,left:o}},O=async(t,e)=>{await T();const n=t.getBoundingClientRect(),o=await q(e),i=await(async(t,e)=>{await T();const n=t.getBoundingClientRect();await T();const o=e.getBoundingClientRect(),i=o.top+window.scrollY,s=o.left+window.scrollX;return{height:o.height,width:o.width,top:N(i,n,o),left:M(s,n,o)}})(t,e),s=o.height,r=o.width,a=n.height,c=n.width;return{absolute:()=>({top:o.top,left:o.left,height:s,width:r}),toTop:({center:t=!1,sourceHeight:e=a,modifier:n=0}={})=>({top:o.top+e+n,left:t?i.left:o.left,height:s,width:r}),fromTop:({center:t=!1,sourceHeight:e=a,modifier:n=0}={})=>({top:o.top-e-n,left:t?i.left:o.left,height:s,width:r}),toBottom:({center:t=!1,sourceHeight:e=a,targetHeight:n=s,modifier:c=0}={})=>({top:o.top+n-(e+c),left:t?i.left:o.left,height:s,width:r}),fromBottom:({center:t=!1,targetHeight:e=s,modifier:n=0}={})=>({top:o.top+e+n,left:t?i.left:o.left,height:s,width:r}),toLeft:({center:t=!1,sourceWidth:e=c,modifier:n=0}={})=>({top:t?i.top:o.top,left:o.left+e+n,height:s,width:r}),fromLeft:({center:t=!1,sourceWidth:e=c,modifier:n=0}={})=>({top:t?i.top:o.top,left:o.left-e-n,height:s,width:r}),toRight:({center:t=!1,sourceWidth:e=c,targetWidth:n=r,modifier:a=0}={})=>({top:t?i.top:o.top,left:o.left+n-(e+a),height:s,width:r}),fromRight:({center:t=!1,targetWidth:e=r,modifier:n=0}={})=>({top:t?i.top:o.top,left:o.left+e+n,height:s,width:r})}},V=t=>"string"==typeof t,z=t=>!V(t),G=t=>"number"==typeof t,j=t=>!G(t),W=t=>void 0===t,D=async(t,e)=>{var n;if(!(!t||!e||V(e)||G(e)||(n=e,"boolean"==typeof n)||Array.isArray(e)&&!e.length||!Object.keys(e).length&&e.constructor===Object))if(await T(),Array.isArray(e))for(const n of e)t.style[n.key]=n.value;else for(const n of Object.keys(e))t.style[n]=e[n]},F=async t=>(await T(),getComputedStyle(t,null)),_=async(t,e,n)=>{await T();const{grid:o}=n;if(!o)return;const{toggle:i}=o,{height:s,width:r}=t.getBoundingClientRect(),{top:a,left:c}=await q(t),{gridTemplateColumns:l,gridTemplateRows:p,padding:d}=e,h=`speccer-${n.slug}-${t.getAttribute("id")||B()}`;if(t.setAttribute("data-speccer-element-id",h),"columns"===i||"both"===i){const t=parseInt(e.columnGap),n=document.createElement("div");document.documentElement.style.setProperty("--ph-speccer-grid-gap-original",`${t}px`),document.documentElement.style.setProperty("--ph-speccer-grid-gap",`${t<24?24:t}px`),t<24&&n.classList.add("speccer-small-grid"),n.setAttribute("data-speccer-id",h),n.classList.add("ph-speccer"),n.classList.add("speccer"),n.classList.add("speccer-grid-container"),n.style.height=`${s+64}px`,n.style.width=`${r}px`,n.style.left=`${c}px`,n.style.top=a-32+"px",n.style.padding=d,n.style.gridTemplateColumns=l;const o=l.split(" ").length;for(let t=0;t<o;t++){const t=document.createElement("div");t.classList.add("ph-speccer"),t.classList.add("speccer"),t.classList.add("speccer-grid-item"),n.appendChild(t)}document.body.appendChild(n)}if("rows"===i||"both"===i){const t=parseInt(e.rowGap),n=document.createElement("div");document.documentElement.style.setProperty("--ph-speccer-grid-row-gap-original",`${t}px`),document.documentElement.style.setProperty("--ph-speccer-grid-row-gap",`${t<24?24:t}px`),t<24&&n.classList.add("speccer-small-grid"),n.setAttribute("data-speccer-id",h),n.classList.add("ph-speccer"),n.classList.add("speccer"),n.classList.add("speccer-grid-row-container"),n.style.width=`${r+64}px`,n.style.height=`${s}px`,n.style.top=`${a}px`,n.style.left=c-32+"px",n.style.padding=d,n.style.gridTemplateRows=p;const o=p.split(" ").length;for(let t=0;t<o;t++){const t=document.createElement("div");t.classList.add("ph-speccer"),t.classList.add("speccer"),t.classList.add("speccer-grid-row-item"),n.appendChild(t)}document.body.appendChild(n)}},X=async(t,n)=>{if(!t)return;if(R(t))return;const o=t.getAttribute(e)||"",i=await F(t),s=P(o,i,n);"grid"===s.type&&s.grid&&(await T(),await _(t,i,s))},Y=(t,e,n="noop")=>{t&&(!e||e&&!e.length||e.trim().split(" ").filter((t=>t!==n)).filter((t=>""!==t)).forEach((e=>t.classList.add(e.trim()))))},K=(t,e)=>t?!e&&z(t)?Object.keys(t).filter((e=>t[e])).join(" ").trim():`${t.trim()} ${e?Object.keys(e).filter((t=>e[t])).join(" "):""}`.trim():"",U=(t,e="span")=>{const n=document.createElement(e);n.setAttribute("id",t);const o=K("ph-speccer speccer mark");return Y(n,o),n},Z=async t=>{if(!t)return;if(R(t))return;const n=t.getAttribute(e)||"";await T();const o=P(n,getComputedStyle(t));if("mark"!==o.type)return;const i=`speccer-${o.slug}-${t.getAttribute("id")||B()}`;t.setAttribute("data-speccer-element-id",i);const s=U(i);document.body.appendChild(s);const r=await O(s,t),{left:a,top:c,height:l,width:p}=r.absolute(),d={left:`${a}px`,top:`${c}px`,height:`${l}px`,width:`${p}px`};await D(s,d)},J=(t="",e,n,o="span")=>{const i=document.createElement(o);i.setAttribute("title",`${t}px`),i.setAttribute("id",n),i.setAttribute("data-measure",`${parseInt(String(t),10)}px`);const{measure:s,position:r}=e,a=K("ph-speccer speccer measure",{height:s?.height||!1,width:s?.width||!1,slim:s?.slim||!1,[r]:!0});return Y(i,a),i},Q=async(t,e)=>{if(!t)return;if(R(t))return;const n=t.getAttribute("data-speccer")||"";await T();const o=P(n,getComputedStyle(t),e);if("measure"!==o.type||!o.measure)return;const{measure:i,position:s}=o;await T();const r=t.getBoundingClientRect(),a=i.slim?0:48,c=i.slim?0:96,l=`speccer-${o.slug}-${t.getAttribute("id")||B()}`;if(t.setAttribute("data-speccer-element-id",l),i.width)if(s===p.Bottom){const e=J(r.width,o,l);document.body.appendChild(e);const n=await O(e,t);if(i.slim){const{left:t,top:o,width:i}=n.fromBottom({center:!1});await D(e,{left:`${t}px`,top:`${o}px`,width:`${i}px`})}else{const{left:t,top:o,width:i,height:s}=n.absolute({center:!1});await D(e,{left:`${t}px`,top:`${o}px`,width:`${i}px`,height:`${s+a}px`})}}else{const e=J(r.width,o,l);document.body.appendChild(e);const n=await O(e,t);if(i.slim){const{left:t,top:o,width:i}=n.fromTop({center:!1});await D(e,{left:`${t}px`,top:`${o}px`,width:`${i}px`})}else{const{left:t,top:o,width:i,height:s}=n.absolute({center:!1});await D(e,{left:`${t}px`,top:o-a+"px",width:`${i}px`,height:`${s+a}px`})}}else if(i.height)if(s===p.Right){const e=J(r.height,o,l);document.body.appendChild(e);const n=await O(e,t);if(i.slim){const{left:t,top:o,height:i}=n.fromRight({center:!1});await D(e,{left:`${t}px`,top:`${o}px`,height:`${i}px`})}else{const{left:t,top:o,height:i,width:s}=n.absolute({center:!1});await D(e,{left:`${t}px`,top:`${o}px`,height:`${i}px`,width:`${s+c}px`})}}else{const e=J(r.height,o,l);document.body.appendChild(e);const n=await O(e,t);if(i.slim){const{left:t,top:o,height:i}=n.fromLeft({center:!1});await D(e,{left:`${t}px`,top:`${o}px`,height:`${i}px`})}else{const{left:t,top:o,height:i,width:s}=n.absolute({center:!1});await D(e,{left:t-c+"px",top:`${o}px`,height:`${i}px`,width:`${s+c}px`})}}},tt=(t="",e,n="",o="span")=>{const i=document.createElement(o),s={},{position:r,pin:a={}}=e,{useSVGLine:c,useCurlyBrackets:l,text:p,parent:d,bracket:h,enclose:u,subtle:f}=a;s.text=p,s.parent=d,s.bracket=h,s.enclose=u,s.subtle=f,s.svg=c,s.curly=l,s[r]=!0,!d||h||l||f||(s.svg=!0),!h&&!u||h&&l?i.innerHTML=t:(h||u)&&i.setAttribute("data-pin-counter",t);const g=K("ph-speccer speccer pin",s);return Y(i,g),i.setAttribute("id",n),i},et=t=>t.top,nt=t=>t.left+t.width,ot=t=>t.top+t.height,it=t=>t.left,st=t=>t.left+t.width/2,rt=t=>t.top+t.height/2,at={center:t=>({x:st(t),y:rt(t)}),top:t=>({x:st(t),y:et(t)}),right:t=>({x:nt(t),y:rt(t)}),bottom:t=>({x:st(t),y:ot(t)}),left:t=>({x:it(t),y:rt(t)}),"right-top":t=>({x:nt(t),y:et(t)}),"right-bottom":t=>({x:nt(t),y:ot(t)}),"left-top":t=>({x:it(t),y:et(t)}),"left-bottom":t=>({x:it(t),y:ot(t)}),"top-left":t=>({x:it(t),y:et(t)}),"top-right":t=>({x:nt(t),y:et(t)}),"bottom-left":t=>({x:it(t),y:ot(t)}),"bottom-right":t=>({x:nt(t),y:ot(t)}),"top-center":t=>({x:st(t),y:et(t)}),"right-center":t=>({x:nt(t),y:rt(t)}),"bottom-center":t=>({x:st(t),y:ot(t)}),"left-center":t=>({x:it(t),y:rt(t)})},ct=async(t,e="center")=>{if(!e)throw Error("No position given");if(z(e))throw Error("The position given is not the required type: pos: "+typeof e);const n=["center","left","right","top","bottom","right-top","right-bottom","left-top","left-bottom","top-left","top-right","bottom-left","bottom-right","top-center","right-center","bottom-center","left-center"];if(!n.includes(e))throw Error(`The position given does not match allowed positions to use! Valid positions are: ${n.join(", ")}`);await T();const o=t.getBoundingClientRect();return at[e](o)};class lt{#t;el;circle;radius;options;constructor(t,e,n){this.#e(t,e,n)}#e(t,e,n){if(!t||!e||!n)throw new Error("Missing inputs el or radius or options");if(!document.body.contains(t))throw new Error("el is not in the DOM");if(this.el=t,this.radius=e,this.options=n,this.#t=document.getElementById("ph-speccer-svg"),!this.#t)throw new Error("Missing required SVG element to draw circles. Please see the documentation");const o=document.body,i=document.documentElement,s=Math.max(o.scrollHeight,o.offsetHeight,i.clientHeight,i.scrollHeight,i.offsetHeight);D(this.#t,{height:`${s}px`}),this.draw()}async draw(){const t=`ph_draw-circle-${B()}`;this.circle=document.createElementNS("http://www.w3.org/2000/svg","circle");const e=this.el.getAttribute("id")||B();if(this.el.setAttribute("id",e),this.circle.setAttribute("id",t),this.circle.setAttribute("data-el",e),this.circle.classList.add("ph-speccer"),this.circle.classList.add("speccer"),this.circle.classList.add("circle"),!this.#t)throw new Error("No parentNode found for circle");this.#t.appendChild(this.circle);const{x:n,y:o}=await ct(this.el,this.options.position);this.circle.setAttribute("r",this.radius+""),this.circle.setAttribute("cx",Math.round(n)+""),this.circle.setAttribute("cy",Math.round(o+document.documentElement.scrollTop)+""),this.circle.setAttribute("fill","currentColor")}}window.DrawCircle=lt;const pt=async(t,e,n="center",o="center")=>{if(!t||!e)throw Error("No element given");const{x:i,y:s}=await ct(t,n),{x:r,y:a}=await ct(e,o);return{x1:i,y1:s,x2:r,y2:a}},dt=(t,e)=>{const{x1:n,x2:o,y1:i,y2:s}=t,{direct:r=!1,firstSet:a=!1,direction:c}=e,l={x:n,y:i},p={x:o,y:s};return r?a?"west"===c?{firstPoint:l,firstControl:{x:n-32,y:i-8},lastPoint:p,lastControl:{x:o+32,y:s}}:"south"===c?{firstPoint:l,firstControl:{x:n-8,y:i+32},lastPoint:p,lastControl:{x:o,y:s-32}}:"east"===c?{firstPoint:l,firstControl:{x:n+32,y:i-8},lastPoint:p,lastControl:{x:o-32,y:s}}:{firstPoint:l,firstControl:{x:n-8,y:i-32},lastPoint:p,lastControl:{x:o,y:s+32}}:"west"===c?{firstPoint:l,firstControl:{x:n-32,y:i+8},lastPoint:p,lastControl:{x:o+32,y:s}}:"south"===c?{firstPoint:l,firstControl:{x:n+8,y:i+32},lastPoint:p,lastControl:{x:o,y:s-32}}:"east"===c?{firstPoint:l,firstControl:{x:n+32,y:i+8},lastPoint:p,lastControl:{x:o-32,y:s}}:{firstPoint:l,firstControl:{x:n+8,y:i-32},lastPoint:p,lastControl:{x:o,y:s+32}}:{firstPoint:l,firstControl:{x:n+(o-n)/2,y:i},lastPoint:p,lastControl:{x:n+(o-n)/2,y:s}}},ht=async(t,e,n)=>{const{pos1:o,pos2:i,firstSet:s=!1,direction:r}=n,{x1:a,y1:c,x2:l,y2:p}=await pt(t,e,o,i);let d=0,h=0;"north"===r?h=8:"west"===r?d=8:"east"===r?d=-8:"south"===r&&(h=-8);const{firstPoint:u,firstControl:f,lastControl:g,lastPoint:m}=dt({x1:a+0,x2:l+d,y1:c+0+document.documentElement.scrollTop,y2:p+h+document.documentElement.scrollTop},{direct:!0,firstSet:s,direction:r});return`M ${u.x} ${u.y}C ${f.x} ${f.y}, ${g.x} ${g.y}, ${m.x} ${m.y}`},ut=async({start:t,stop:e,crude:n=!1})=>{const{x1:o,y1:i,x2:s,y2:r}=await pt(t,e),a=((t,e,n,o,i=!0)=>{if(W(t)||W(e)||W(n)||W(o))throw new SyntaxError("Missing input for `angle`");if(j(t)||j(e)||j(n)||j(o))throw TypeError(`Parameters for \`angle\` do not have the required type. Requires number! Got: ${typeof t} ${typeof e} ${typeof n} ${typeof o}`);const s=o-e,r=n-t;let a=Math.atan2(s,r);return a*=180/Math.PI,i&&a<0&&(a+=360),a})(o,i,s,r);return n?(t=>{if(t>360)throw new RangeError("Parameter cannot exceed 360");if(t<0)throw new RangeError("Parameter cannot be lower than 0");return t>=45&&t<=135?"south":t>135&&t<=225?"west":t>225&&t<=315?"north":"east"})(a):(t=>{if(t>360)throw new RangeError("Parameter cannot exceed 360");if(t<0)throw new RangeError("Parameter cannot be lower than 0");return t>=0&&t<=22.5?"east":t>=22.5&&t<=67.5?"south-east":t>=67.5&&t<=112.5?"south":t>=112.5&&t<=157.5?"south-west":t>=157.5&&t<=202.5?"west":t>=202.5&&t<=247.5?"north-west":t>=247.5&&t<=292.5?"north":t>=292.5&&t<=337.5?"north-east":"east"})(a)};class ft{#t;#n;startElement;stopElement;firstPathElement;secondPathElement;constructor(t,e){this.#e(t,e)}#e(t,e){if(!t||!e)throw new Error("Missing inputs startElement and stopElement");if(!document.body.contains(e))throw new Error("stopElement is not in the DOM");if(!document.body.contains(t))throw new Error("startElement is not in the DOM");if(this.startElement=t,this.stopElement=e,this.#t=document.getElementById("ph-speccer-svg"),this.#n=document.getElementById("ph-speccer-path"),!this.#n||!this.#t)throw new Error("Missing required SVG element to draw lines. Please see the documentation");const n=document.body,o=document.documentElement,i=Math.max(n.scrollHeight,n.offsetHeight,o.clientHeight,o.scrollHeight,o.offsetHeight);D(this.#t,{height:`${i}px`}),this.connect()}connect(){this.draw(this.#n)}#o(t){if(!t)throw new Error("No path given to #getPathElement!");const e=`ph_draw_path-path-${B()}`,n=t.cloneNode(!1),o=this.startElement.getAttribute("id")||B();return this.startElement.setAttribute("id",o),n.setAttribute("data-start-el",o),n.setAttribute("id",e),n.classList.remove("original"),n.classList.add("speccer"),n}async draw(t){if(!t)throw new Error("No path given to draw!");const e=this.#o(t),n=this.#o(t);if(!t.parentNode)throw new Error("No parentNode found for path");this.firstPathElement=t.parentNode.insertBefore(e,t.nextSibling),this.secondPathElement=t.parentNode.insertBefore(n,t.nextSibling);const o=await ut({stop:this.stopElement,start:this.startElement,crude:!0}),{path1pos1:i,path1pos2:s,path2pos1:r,path2pos2:a}=(t=>{let e,n,o,i;switch(t){case"east":e="right-top",n="left-center",o="right-bottom",i="left-center";break;case"south":e="bottom-left",n="top-center",o="bottom-right",i="top-center";break;case"west":e="left-top",n="right-center",o="left-bottom",i="right-center";break;default:e="top-left",n="bottom-center",o="top-right",i="bottom-center"}return{path1pos1:e,path1pos2:n,path2pos1:o,path2pos2:i}})(o),c=await ht(this.startElement,this.stopElement,{pos1:i,pos2:s,firstSet:!0,direction:o}),l=await ht(this.startElement,this.stopElement,{pos1:r,pos2:a,direction:o});this.firstPathElement.setAttribute("data-direction",o),this.firstPathElement.setAttribute("data-pos1",i),this.firstPathElement.setAttribute("data-pos2",s),this.firstPathElement.setAttribute("d",c),this.secondPathElement.setAttribute("data-direction",o),this.secondPathElement.setAttribute("data-pos1",r),this.secondPathElement.setAttribute("data-pos2",a),this.secondPathElement.setAttribute("d",l)}}window.DrawSVGCurlyBracket=ft;class gt{#t;#n;startElement;stopElement;options;line;constructor(t,e,n={}){this.#e(t,e,n)}#e(t,e,n={}){if(!t||!e)throw new Error("Missing inputs startElement and stopElement");if(!document.body.contains(e))throw new Error("stopElement is not in the DOM");if(!document.body.contains(t))throw new Error("startElement is not in the DOM");if(this.startElement=t,this.stopElement=e,this.options=n,this.#t=document.getElementById("ph-speccer-svg"),this.#n=document.getElementById("ph-speccer-path"),!this.#n||!this.#t)throw new Error("Missing required SVG element to draw lines. Please see the documentation");const o=document.body,i=document.documentElement,s=Math.max(o.scrollHeight,o.offsetHeight,i.clientHeight,i.scrollHeight,i.offsetHeight);D(this.#t,{height:`${s}px`}),this.connect()}connect(){this.draw(this.#n)}async draw(t){if(!t)throw new Error("No path given to draw!");const e=`ph_draw_path-path-${B()}`,n=t.cloneNode(!1),o=this.startElement.getAttribute("id")||B();this.startElement.setAttribute("id",o),n.setAttribute("id",e),n.setAttribute("data-start-el",o),n.classList.remove("original"),n.classList.add("speccer");const{pin:i}=this.options;if(i?.text&&n.classList.add("text"),!t.parentNode)throw new Error("No parentNode found for path");this.line=t.parentNode.insertBefore(n,t.nextSibling);const s=await ut({start:this.startElement,stop:this.stopElement,crude:!0}),{pos1:r,pos2:a}=(t=>{let e,n;switch(t){case"east":e="right",n="left";break;case"south":e="bottom",n="top";break;case"west":e="left",n="right";break;default:e="top",n="bottom"}return{pos1:e,pos2:n}})(s),c=await(async(t,e,n)=>{const{pos1:o,pos2:i}=n,{x1:s,y1:r,x2:a,y2:c}=await pt(t,e,o,i),{firstPoint:l,firstControl:p,lastControl:d,lastPoint:h}=dt({x1:s,x2:a,y1:r+document.documentElement.scrollTop,y2:c+document.documentElement.scrollTop},{direction:""});return`M ${l.x} ${l.y}C ${p.x} ${p.y}, ${d.x} ${d.y}, ${h.x} ${h.y}`})(this.startElement,this.stopElement,{pos1:r,pos2:a});this.line.setAttribute("data-direction",s),this.line.setAttribute("data-pos1",r),this.line.setAttribute("data-pos2",a),this.line.setAttribute("d",c)}}window.DrawSVGLine=gt;const mt=t=>parseInt(t,10),yt=t=>mt(getComputedStyle(t).getPropertyValue("--ph-speccer-pin-space"))||48,wt=async(t,e,n,o)=>{await T();const{pin:i={},position:s}=o,{useCurlyBrackets:r,subtle:a,bracket:c,text:p,parent:d,enclose:h}=i,u=yt(e),f=mt(getComputedStyle(e).getPropertyValue("--ph-speccer-measure-size"))||8;const g=await O(e,t);if(h){const{left:t,top:e,height:n,width:o}=g.absolute();return{left:`${t}px`,top:`${e}px`,height:`${n}px`,width:`${o}px`}}if((d||p)&&!c&&!r&&!a){if(s===l.Right){const{top:t}=g.fromRight({center:!0});await T();const{left:e,width:o}=n.getBoundingClientRect();return{left:`${e+o+u}px`,top:`${t}px`}}if(s===l.Bottom){const{left:t}=g.toBottom({center:!0});await T();const{top:e,height:o}=n.getBoundingClientRect();return{left:`${t}px`,top:`${e+o+u}px`}}if(s===l.Left){const{top:t}=g.fromLeft({center:!0});await T();const{left:e}=n.getBoundingClientRect();return{left:e-1.5*u-(p?170:0)+"px",top:`${t}px`}}const{left:t}=g.fromTop({center:!0});await T();const{top:e}=n.getBoundingClientRect();return{left:`${t}px`,top:e-1.5*u+"px"}}if(s===l.Left){if(c&&!r){const{left:t,top:e,height:n}=g.fromLeft({sourceWidth:f});return{left:`${t}px`,top:`${e}px`,height:`${n}px`}}const{left:t,top:e}=g.fromLeft({center:!0,modifier:r?u/1.5:u});return{left:`${t}px`,top:`${e}px`}}if(s===l.Right){if(c&&!r){const{left:t,top:e,height:n}=g.fromRight({center:!1});return{left:`${t}px`,top:`${e}px`,height:`${n}px`}}const{left:t,top:e}=g.fromRight({center:!0,modifier:r?u/1.5:u});return{left:`${t}px`,top:`${e}px`}}if(s===l.Bottom){if(c&&!r){const{left:t,top:e,width:n}=g.fromBottom({center:!1});return{left:`${t}px`,top:`${e}px`,width:`${n}px`}}const{left:t,top:e}=g.fromBottom({center:!0,modifier:r?u/1.5:u});return{left:`${t}px`,top:`${e}px`}}if(c&&!r){const{left:t,top:e,width:n}=g.fromTop({center:!1});return{left:`${t}px`,top:`${e}px`,width:`${n}px`}}const{left:m,top:y}=g.fromTop({center:!0,modifier:r?u/1.5:u});return{left:`${m}px`,top:`${y}px`}},xt=async(t,e,n,o)=>{if(!t)return;if("pin"!==o.type||!o.pin)return;const i=`speccer-${o.slug}-${t.getAttribute("id")||B()}`,s=tt(n,o,i);t.setAttribute("data-speccer-element-id",i),document.body.appendChild(s);const r=await wt(t,s,e,o);await D(s,r);const a=o.pin.text&&null!==t.getAttribute("data-speccer-title"),c=o.pin.parent&&!o.pin.enclose&&!o.pin.bracket&&!a;return o.pin.useSVGLine?(new gt(t,s,o),c&&new lt(t,5,o)):o.pin.useCurlyBrackets&&new ft(t,s),i};let bt=0;const $t=async(e,n)=>{if(!e)return;const o=e.querySelectorAll('[data-speccer^="pin"]');if(!o||0===o.length)return;const i=e.getAttribute("data-speccer-literals")||window.SPECCER_LITERALS||t;[...o].filter((async t=>!R(t))).forEach((async(t,o)=>{const s=((t,e)=>{let n=e[t];return 0===t&&(bt=0),n||(n=`${e[bt]}${e[bt].toLowerCase()}`,bt++),n})(o,i),r=t.getAttribute("data-speccer")||"";await T();const a=getComputedStyle(t),c=P(r,a,n),l=((t,e,n)=>{const{pin:o}=n;if(!o)return t;const{text:i}=o;if(!i||null===e.getAttribute("data-speccer-title"))return t;const s=e.getAttribute("data-speccer-title"),r=e.getAttribute("data-speccer-description"),a=0===e.nodeName.indexOf("H")?`<span class="ph-speccer heading">${e.nodeName}</span>`:"";return!r&&s?`${a}<span class="ph-speccer title">${s}</span>`:r&&s?`${a}<span class="ph-speccer title">${s}</span><span class="ph-speccer description">${r.replaceAll("\\n","<br/>")}</span>`:t})(s,t,c);await xt(t,e,l,c)}))},Et=(t="",e="span")=>{const n=document.createElement(e),o=document.createTextNode(`${t}px`);return n.appendChild(o),n.setAttribute("title",`${t}px`),Y(n,"ph-speccer speccer spacing"),n},At=async(t,e)=>{if(!t)return;if(R(t))return;const n=t.getAttribute("data-speccer")||"",o=await F(t),i=P(n,o,e);if("spacing"!==i.type||!i.spacing)return;const s=((t,e)=>{const{marginTop:n,marginBottom:o,marginLeft:i,marginRight:s,paddingTop:r,paddingBottom:a,paddingLeft:c,paddingRight:l}=t;return e?.spacing?.padding?{paddingTop:r,paddingBottom:a,paddingLeft:c,paddingRight:l}:e?.spacing?.margin?{marginTop:n,marginBottom:o,marginLeft:i,marginRight:s}:{marginTop:n,marginBottom:o,marginLeft:i,marginRight:s,paddingTop:r,paddingBottom:a,paddingLeft:c,paddingRight:l}})(o,i),r=Object.keys(s).filter((t=>"0px"!==s[t]));if(!r.length)return;t.classList.add("is-specced");const a=`speccer-spacing-${t.getAttribute("id")||B()}`;t.setAttribute("data-speccer-element-id",a),r.forEach((async e=>{const n=mt(s[e]),o=Et(n);o.setAttribute("data-speccer-id",a);const r=(t=>t.includes("Top")?t.replace("Top"," top"):t.includes("Right")?t.replace("Right"," right"):t.includes("Bottom")?t.replace("Bottom"," bottom"):t.includes("Left")?t.replace("Left"," left"):"")(e);Y(o,K(r,{bound:!!i?.spacing?.bound})),document.body.appendChild(o);const c=await(async(t,e,n,o)=>{await T();const i=n.getBoundingClientRect(),s=await q(n),r=o?.spacing?.bound?0:96,a=o?.spacing?.bound?0:48;return"marginTop"===t?{height:`${e}px`,width:i.width+r+"px",left:s.left-r+"px",top:s.top-e+"px"}:"marginRight"===t?{height:i.height+a+"px",width:`${e}px`,left:s.left+parseInt(i.width+"",10)+"px",top:s.top+"px"}:"marginBottom"===t?{height:`${e}px`,width:i.width+r+"px",left:s.left-r+"px",top:s.top+parseInt(i.height+"",10)+"px"}:"marginLeft"===t?{height:i.height+a+"px",width:`${e}px`,left:s.left-e+"px",top:s.top+"px"}:"paddingTop"===t?{height:`${e}px`,width:i.width+r+"px",left:s.left-r+"px",top:s.top+"px"}:"paddingBottom"===t?{height:`${e}px`,width:i.width+r+"px",left:s.left-r+"px",top:s.top+(parseInt(i.height+"",10)-e)+"px"}:"paddingRight"===t?{height:i.height+a+"px",width:`${e}px`,left:s.left+(parseInt(i.width+"",10)-e)+"px",top:s.top+"px"}:"paddingLeft"===t?{height:i.height+a+"px",width:`${e}px`,left:s.left+"px",top:s.top+"px"}:void 0})(e,n,t,i);await D(o,c)}))},kt=(t,e=3)=>parseFloat(String(t)).toFixed(e),Ct=(t,e,n)=>{const o=document.createElement("div"),{typography:i,position:s}=e,r=K("ph-speccer speccer typography",{syntax:i?.useSyntaxHighlighting||!1,[s]:!0});return o.setAttribute("id",n),o.innerHTML=t,Y(o,r),o},St=async(t,e)=>{if(!t)return;if(R(t))return;const n=t.getAttribute("data-speccer")||"";await T();const o=P(n,getComputedStyle(t),e);if("typography"!==o.type||!o.typography)return;t.classList.add("is-specced");const i=await(async(t,e=!1)=>{const n=(t=>{const{lineHeight:e,letterSpacing:n,fontFamily:o,fontSize:i,fontStyle:s,fontVariationSettings:r,fontWeight:a}=t;return{lineHeight:e,letterSpacing:n,fontFamily:o,fontSize:i,fontStyle:s,fontVariationSettings:r,fontWeight:a}})(await F(t));if(e){const t=n.fontFamily.split(",").map((t=>t.includes("'")?`<span class="token string">${t}</span>`:t)).join('<span class="token punctuation">, </span>'),e=`<span class="token number">${parseInt(n.fontSize,10)}</span><span class="token unit">px</span> <span class="token operator">/</span> <span class="token number">${parseInt(n.fontSize,10)/16}</span><span class="token unit">rem</span>`,o=n.letterSpacing.includes("px")?`<span class="token number">${parseInt(n.letterSpacing,10)}</span><span class="token unit">px</span>`:n.letterSpacing,i="normal"!==n.lineHeight?`<span class="token number">${parseInt(n.lineHeight,10)}</span><span class="token unit">px</span> <span class="token operator">/</span> <span class="token number">${parseInt(n.lineHeight,10)/16}</span><span class="token unit">rem</span>`:"normal";return`\n<pre class="language-css" tabindex="-1"><code class="language-css"><span class="token selector"><span class="token class">.typography</span></span> <span class="token punctuation">{</span>\n <span class="token property">font-family</span><span class="token punctuation">:</span> ${t}<span class="token punctuation">;</span>\n <span class="token property">font-size</span><span class="token punctuation">:</span> ${e}<span class="token punctuation">;</span>\n <span class="token property">font-weight</span><span class="token punctuation">:</span> <span class="token number">${n.fontWeight}</span><span class="token punctuation">;</span>\n <span class="token property">font-variation-settings</span><span class="token punctuation">:</span> ${n.fontVariationSettings}<span class="token punctuation">;</span>\n <span class="token property">line-height</span><span class="token punctuation">:</span> ${i}<span class="token punctuation">;</span>\n <span class="token property">letter-spacing</span><span class="token punctuation">:</span> ${o}<span class="token punctuation">;</span>\n <span class="token property">font-style</span><span class="token punctuation">:</span> ${n.fontStyle}<span class="token punctuation">;</span>\n<span class="token punctuation">}</span></code></pre>`}return`\ntypography: {<ul class="speccer-styles"> <li><span class="property">font-family:</span> ${n.fontFamily};</li> <li><span class="property">font-size:</span> ${n.fontSize} / ${parseInt(n.fontSize,10)/16}rem;</li> <li><span class="property">font-weight:</span> ${n.fontWeight};</li> <li><span class="property">font-variation-settings:</span> ${n.fontVariationSettings};</li> <li><span class="property">line-height:</span> ${"normal"!==n.lineHeight?`${parseInt(n.lineHeight,10)}px / ${parseInt(n.lineHeight,10)/16}rem`:"normal"};</li> <li><span class="property">letter-spacing:</span> ${n.letterSpacing};</li> <li><span class="property">font-style:</span> ${n.fontStyle};</li></ul>}`})(t,o.typography.useSyntaxHighlighting),s=`speccer-${o.slug}-${t.getAttribute("id")||B()}`;t.setAttribute("data-speccer-element-id",s);const r=Ct(i,o,s);document.body.appendChild(r);const a=await(async(t,e,n)=>{const o=e.getBoundingClientRect(),i=yt(n),s=n.getBoundingClientRect(),r=await q(e),{typography:a,position:c}=t;if(a&&c===d.Right)return{left:r.left+o.width+i+"px",top:kt(N(r.top,s,o))+"px"};if(a&&c===d.Top)return{left:kt(M(r.left,s,o))+"px",top:r.top-s.height-i+"px"};if(a&&c===d.Bottom)return{left:kt(M(r.left,s,o))+"px",top:r.top+o.height+i+"px"};return{left:r.left-s.width-i+"px",top:kt(N(r.top,s,o))+"px"}})(o,t,r);D(r,a)},Lt=t=>{const e=()=>((t,e,n=!1)=>{let o;return function(i,...s){const r=n&&!o;o&&clearTimeout(o),o=setTimeout((function(){o=null,n||t.apply(i,s)}),e),r&&t.apply(i,s)}})((()=>{t()}),300);window.removeEventListener("resize",e),window.addEventListener("resize",e)},vt=t=>{"loading"===document.readyState?document.addEventListener("DOMContentLoaded",(()=>{t()})):t()},Pt=()=>{const t=new IntersectionObserver(((t,e)=>{for(const n of t)n.intersectionRatio>0&&(At(n.target),e.unobserve(n.target))}));for(const o of document.querySelectorAll(`[${e}^="${n}"],[${e}^="${n}"] *:not(td):not(tr):not(th):not(tfoot):not(thead):not(tbody)`))t.observe(o);const c=new IntersectionObserver(((t,e)=>{for(const n of t)n.intersectionRatio>0&&(Q(n.target),e.unobserve(n.target))}));for(const t of document.querySelectorAll(`[${e}^="${o}"]`))c.observe(t);const l=new IntersectionObserver(((t,e)=>{for(const n of t)n.intersectionRatio>0&&(Z(n.target),e.unobserve(n.target))}));for(const t of document.querySelectorAll(`[${e}^="${s}"]`))l.observe(t);const p=new IntersectionObserver(((t,e)=>{for(const n of t)n.intersectionRatio>0&&(St(n.target),e.unobserve(n.target))}));for(const t of document.querySelectorAll(`[${e}^="${i}"]`))p.observe(t);const d=new IntersectionObserver(((t,e)=>{for(const n of t)n.intersectionRatio>0&&(X(n.target),e.unobserve(n.target))}));for(const t of document.querySelectorAll(`[${e}^="${r}"]`))d.observe(t);const h=new IntersectionObserver((async(t,e)=>{for(const n of t)n.intersectionRatio>0&&(await $t(n.target),e.unobserve(n.target))}));for(const t of document.querySelectorAll(`[${e}="${a}"]`))h.observe(t)},Bt=t=>{window.speccer=t},Rt=t=>{const e=document.currentScript;if(e){const n=e.getAttribute("src");n?.includes("speccer.js")&&(e.hasAttribute("data-manual")?Bt(t):e.hasAttribute("data-instant")?t():e.hasAttribute("data-dom")?vt(t):e.hasAttribute("data-lazy")?Pt():vt(t),e.hasAttribute("data-manual")||e.hasAttribute("data-lazy")||Lt(t))}},Tt=["alt","altgraph","capslock","control","fn","fnlock","hyper","meta","numlock","os","scrolllock","shift","super","symbol","command","ctrl","altgr","symbollock"],Ht=["escape","esc","enter","return","⏎","␛"],It=async(t,e,n)=>{await T();const o=yt(n),i=await O(n,e);if("tabstops"===t){let{left:t,top:e}=i.fromTop();return t-=32,e+=32,t<=0&&(t=32),e<=0&&(e=32),{left:`${t}px`,top:`${e}px`}}if("landmark"===t){let{left:t,top:e}=i.fromTop();return t-=16,e-=16,t<=0&&(t=32),e<=0&&(e=32),{left:`${t}px`,top:`${e}px`}}if("region"===t){const{left:t,top:e,height:n,width:o}=i.fromTop();return{height:`${n}px`,width:`${o}px`,left:`${t}px`,top:`${e}px`}}if("shortcut"===t){const{left:t,top:e}=i.fromBottom();return{left:`${t}px`,top:`${e}px`}}const{left:s,top:r}=i.fromTop({center:!0,modifier:o});return{left:s-32+"px",top:r-32+"px"}},Mt=async(t,e,n)=>{if(!t||!t.checkVisibility())return;const o=((t="tabstops",e,n="span")=>{const o=document.createElement(n),i=K("ph-speccer speccer a11y",{tabstops:"tabstops"===t,landmark:"landmark"===t,region:"region"===t});if("landmark"===t&&e){const t=document.createTextNode(String(e));o.appendChild(t)}return Y(o,i),o})(n,e);if("landmark"===n){o.setAttribute("data-speccer-nodename",t.nodeName);const e=t.role||`semantic role: ${t.nodeName.toLowerCase()}`,n=t.getAttribute("aria-label")||"unnamed";o.setAttribute("title",`${n}: ${e}`)}document.body.appendChild(o);const i=await It(n,t,o);await D(o,i)},Nt=async(t,e)=>{const n=e.split(/\s\+\s/).map((t=>t.trim())),o=document.createElement("div");o.classList.add("ph-speccer"),o.classList.add("speccer"),o.classList.add("a11y"),o.classList.add("shortcut-holder");for(const t of n){const e=document.createElement("kbd"),n=document.createTextNode(t);e.classList.add("ph-speccer"),e.classList.add("speccer"),e.classList.add("a11y"),e.classList.add("shortcut"),Tt.includes(t.toLowerCase())&&e.classList.add("modifier"),Ht.includes(t.toLowerCase())&&e.classList.add("physical"),e.appendChild(n),o.appendChild(e)}document.body.appendChild(o);const i=await It("shortcut",t,o);await D(o,i)},qt=t=>{const e=t.getAttribute("data-speccer-element-id");if(!e)return;const n=document.getElementById(e)||document.querySelectorAll(`[data-speccer-id="${e}"]`);if(n)if(Object.prototype.isPrototypeOf.call(NodeList.prototype,n))[...n].forEach((t=>{t.remove(),t.classList.remove("is-specced")}));else if(n.classList.contains("curly")||n.classList.contains("svg")){const e=t.getAttribute("id");document.querySelectorAll(`#ph-speccer-svg path[data-start-el="${e}"]`).forEach((t=>t.remove()))}},Ot={create:_,element:X},Vt={create:Et,element:At},zt={createPinElement:tt,pinElement:xt,pinElements:$t},Gt={create:J,element:Q},jt={create:U,element:Z},Wt={create:Ct,element:St},Dt={dom:vt,lazy:Pt,manual:Bt,activate:Rt},Ft=()=>{((t,e=document)=>{[].forEach.call(e.querySelectorAll(t),(function(t){t.remove()}))})(".ph-speccer.speccer");const t=document.querySelectorAll(`[${e}^="${n}"],[${e}^="${n}"] *:not(td):not(tr):not(th):not(tfoot):not(thead):not(tbody)`),c=document.querySelectorAll(`[${e}^="${o}"]`),l=document.querySelectorAll(`[${e}^="${i}"]`),p=document.querySelectorAll(`[${e}="${a}"]`),d=document.querySelectorAll(`[${e}^="${s}"]`),h=document.querySelectorAll(`[${e}^="${r}"]`);for(const t of d)Z(t);for(const t of h)X(t);for(const e of t)At(e);for(const t of c)Q(t);for(const t of l)St(t);for(const t of p)$t(t);(()=>{const t=document.querySelectorAll('[data-speccer*="a11y tabstops"]'),e=document.querySelectorAll('[data-speccer*="a11y landmark"]'),n=document.querySelectorAll('[data-speccer*="a11y shortcut"]');if(n.length)for(const t of n){const e=t.getAttribute("data-speccer-a11y-shortcut");e&&""!==e&&!R(t)&&Nt(t,e)}if(t.length)for(const e of t){const t=e.querySelectorAll("\n a[href], area[href], input:not([disabled]):not([tabindex='-1']),\n button:not([disabled]):not([tabindex='-1']),select:not([disabled]):not([tabindex='-1']),\n textarea:not([disabled]):not([tabindex='-1']),\n iframe, object, embed, *[tabindex]:not([tabindex='-1']), *[contenteditable=true]\n");for(const e of t)R(e)||Mt(e,null,"tabstops")}if(e.length)for(const t of e){const e=t.querySelectorAll('\nheader, footer, section, form, main, nav, aside, [role="section"], [role="banner"],\n[role="complementary"], [role="contentinfo"], [role="form"], [role="main"],\n[role="navigation"], [role="region"], [role="search"]\n');for(const[t,n]of e.entries())R(n)||(Mt(n,t+1,"landmark"),Mt(n,null,"region"))}})()};Rt(Ft);export{Ft as default,Ot as grid,jt as mark,Gt as measure,Dt as modes,zt as pin,qt as removeSpeccerElement,Vt as spacing,Wt as typography};
|
|
28
28
|
//# sourceMappingURL=speccer.esm.js.map
|