@phun-ky/speccer 5.0.0 → 6.0.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.
Files changed (74) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dts/browser.d.ts +4 -0
  3. package/dts/enums/area.d.ts +16 -0
  4. package/dts/helpers/dissect/index.d.ts +1 -0
  5. package/dts/helpers/dissect/styles.d.ts +1 -0
  6. package/dts/helpers/typography/index.d.ts +2 -0
  7. package/dts/helpers/typography/position.d.ts +4 -0
  8. package/dts/helpers/typography/template.d.ts +1 -0
  9. package/dts/index.d.ts +53 -0
  10. package/dts/interfaces/global.d.ts +6 -0
  11. package/dts/lib/attributes.d.ts +2 -0
  12. package/dts/lib/classnames.d.ts +4 -0
  13. package/dts/lib/constants.d.ts +3 -0
  14. package/dts/lib/css.d.ts +6 -0
  15. package/dts/lib/debounce.d.ts +3 -0
  16. package/dts/lib/node.d.ts +2 -0
  17. package/dts/lib/number.d.ts +1 -0
  18. package/dts/lib/position.d.ts +6 -0
  19. package/dts/lib/resize.d.ts +1 -0
  20. package/dts/lib/styles.d.ts +2 -0
  21. package/dts/tasks/dissect.d.ts +2 -0
  22. package/dts/tasks/index.d.ts +4 -0
  23. package/dts/tasks/measure.d.ts +1 -0
  24. package/dts/tasks/spec.d.ts +2 -0
  25. package/dts/tasks/typography.d.ts +2 -0
  26. package/dts/types/css.d.ts +19 -0
  27. package/dts/types/speccer.d.ts +5 -0
  28. package/package.json +10 -3
  29. package/speccer.css +16 -19
  30. package/speccer.js +2 -1
  31. package/speccer.js.map +1 -0
  32. package/speccer.min.css +1 -1
  33. package/src/{browser.js → browser.ts} +16 -13
  34. package/src/enums/area.ts +17 -0
  35. package/src/helpers/dissect/index.ts +1 -0
  36. package/src/helpers/dissect/styles.ts +154 -0
  37. package/src/helpers/typography/index.ts +3 -0
  38. package/src/helpers/typography/position.ts +54 -0
  39. package/src/helpers/typography/template.ts +27 -0
  40. package/src/{index.js → index.ts} +17 -17
  41. package/src/interfaces/global.ts +7 -0
  42. package/src/lib/attributes.ts +18 -0
  43. package/src/lib/classnames.ts +43 -0
  44. package/src/lib/{constants.js → constants.ts} +3 -0
  45. package/src/lib/css.ts +45 -0
  46. package/src/lib/debounce.ts +29 -0
  47. package/src/lib/node.ts +8 -0
  48. package/src/lib/number.ts +4 -0
  49. package/src/lib/position.ts +16 -0
  50. package/src/lib/{resize.js → resize.ts} +5 -4
  51. package/src/lib/styles.ts +31 -0
  52. package/src/styles/index.styl +4 -0
  53. package/src/styles/spacing.styl +0 -10
  54. package/src/styles/typography.styl +11 -12
  55. package/src/tasks/dissect.ts +46 -0
  56. package/src/tasks/index.ts +7 -0
  57. package/src/tasks/measure.ts +82 -0
  58. package/src/tasks/spec.ts +170 -0
  59. package/src/tasks/typography.ts +45 -0
  60. package/src/types/css.ts +20 -0
  61. package/src/types/speccer.ts +6 -0
  62. package/tsconfig.json +21 -0
  63. package/tslint.json +23 -0
  64. package/src/dissect.js +0 -211
  65. package/src/lib/attributes.js +0 -13
  66. package/src/lib/classnames.js +0 -37
  67. package/src/lib/css.js +0 -37
  68. package/src/lib/debounce.js +0 -22
  69. package/src/lib/node.js +0 -7
  70. package/src/lib/number.js +0 -4
  71. package/src/lib/styles.js +0 -27
  72. package/src/measure.js +0 -99
  73. package/src/spec.js +0 -214
  74. package/src/typography.js +0 -141
package/CHANGELOG.md CHANGED
@@ -2,6 +2,25 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ## [6.0.0](https://github.com/phun-ky/speccer/compare/v5.0.0...v6.0.0) (2022-02-23)
6
+
7
+
8
+ ### ⚠ BREAKING CHANGES
9
+
10
+ * 🧨 The script is now converted to TypeScript. The internal API has changed,
11
+ but now the usage. I've set this as a breaking change to reflect the
12
+ size of the change. There has also been some internal optimizations
13
+ regarding positioning of the speccer elements
14
+
15
+ ### Refactoring
16
+
17
+ * 💡 Converted to TypeScript ([ab90bae](https://github.com/phun-ky/speccer/commit/ab90bae5794235ffd13d250500caca98b0a818b5))
18
+
19
+
20
+ ### Feature
21
+
22
+ * 🎸 Add source map ([de3812d](https://github.com/phun-ky/speccer/commit/de3812dc4a28d274aabfb16cf088f78cf07b2b7e))
23
+
5
24
  ## [5.0.0](https://github.com/phun-ky/speccer/compare/v4.3.2...v5.0.0) (2022-02-22)
6
25
 
7
26
 
@@ -0,0 +1,4 @@
1
+ export declare const dom: (speccer: Function) => void;
2
+ export declare const lazy: () => void;
3
+ export declare const manual: (speccer: Function) => void;
4
+ export declare const activate: (speccer: Function) => void;
@@ -0,0 +1,16 @@
1
+ export declare enum SpeccerAreaEnum {
2
+ Empty = "",
3
+ Left = "left",
4
+ Right = "right",
5
+ Bottom = "bottom",
6
+ Top = "top"
7
+ }
8
+ export declare enum DissectAreaEnum {
9
+ Outline = "outline",
10
+ Enclose = "enclose",
11
+ Full = "full",
12
+ Left = "left",
13
+ Right = "right",
14
+ Bottom = "bottom",
15
+ Top = "top"
16
+ }
@@ -0,0 +1 @@
1
+ export { styles } from './styles';
@@ -0,0 +1 @@
1
+ export declare const styles: (area: string, el: HTMLElement, dissectionEl: HTMLElement) => {};
@@ -0,0 +1,2 @@
1
+ export { position } from './position';
2
+ export { template } from './template';
@@ -0,0 +1,4 @@
1
+ export declare const position: (area: string | null, el: HTMLElement, speccerEl: HTMLElement) => {
2
+ left: string;
3
+ top: string;
4
+ };
@@ -0,0 +1 @@
1
+ export declare const template: (el: HTMLElement) => Promise<string>;
package/dts/index.d.ts ADDED
@@ -0,0 +1,53 @@
1
+ declare global {
2
+ interface Window {
3
+ speccer: any;
4
+ }
5
+ }
6
+
7
+ declare const create$2: (text?: string | number, tag?: string) => HTMLElement;
8
+ declare const element$3: (el: HTMLElement) => Promise<void>;
9
+
10
+ declare namespace __spacing {
11
+ export {
12
+ create$2 as create,
13
+ element$3 as element,
14
+ };
15
+ }
16
+
17
+ declare const create$1: (textContent: string | undefined, area: string, n?: string) => HTMLElement;
18
+ declare const element$2: (el: HTMLElement, dissectIndex: number) => Promise<void>;
19
+
20
+ declare namespace __dissect {
21
+ export {
22
+ create$1 as create,
23
+ element$2 as element,
24
+ };
25
+ }
26
+
27
+ declare const element$1: (el: HTMLElement) => void;
28
+
29
+ declare namespace __measure {
30
+ export {
31
+ element$1 as element,
32
+ };
33
+ }
34
+
35
+ declare const create: (html: string, area: string | null) => HTMLDivElement;
36
+ declare const element: (el: HTMLElement) => Promise<void>;
37
+
38
+ declare const __typography_create: typeof create;
39
+ declare const __typography_element: typeof element;
40
+ declare namespace __typography {
41
+ export {
42
+ __typography_create as create,
43
+ __typography_element as element,
44
+ };
45
+ }
46
+
47
+ declare const spacing: typeof __spacing;
48
+ declare const dissect: typeof __dissect;
49
+ declare const measure: typeof __measure;
50
+ declare const typography: typeof __typography;
51
+ declare const speccer: () => void;
52
+
53
+ export { speccer as default, dissect, measure, spacing, typography };
@@ -0,0 +1,6 @@
1
+ export {};
2
+ declare global {
3
+ interface Window {
4
+ speccer: any;
5
+ }
6
+ }
@@ -0,0 +1,2 @@
1
+ export declare const set: (el: HTMLElement, attrs: {}) => void;
2
+ export declare const remove: (el: HTMLElement, attrs: {}) => void;
@@ -0,0 +1,4 @@
1
+ export declare const set: (el: HTMLElement, cls: string, avoid?: string) => void;
2
+ export declare const toggle: (el: HTMLElement, cls: string, avoid?: string) => void;
3
+ export declare const remove: (el: HTMLElement, cls: string, avoid?: string) => void;
4
+ export declare const cx: (cls: string, cls_obj: {}) => string;
@@ -0,0 +1,3 @@
1
+ export declare const SPECCER_LITERALS: string[];
2
+ export declare const SPECCER_TAGS_TO_AVOID: string[];
3
+ export declare const SPECCER_DEFAULT_PIN_SPACE = 48;
@@ -0,0 +1,6 @@
1
+ import { SpacingCSSPropertiesType, TypographyCSSPropertiesType } from '../types/css';
2
+ export declare const getNumberValue: (value: string) => number;
3
+ export declare const normalizeNumberValue: (value: string | number) => number;
4
+ export declare const getSpacing: (style: SpacingCSSPropertiesType) => SpacingCSSPropertiesType;
5
+ export declare const getTypography: (style: TypographyCSSPropertiesType) => TypographyCSSPropertiesType;
6
+ export declare const pinSpace: (el: HTMLElement) => number;
@@ -0,0 +1,3 @@
1
+ export declare const waitForFrame: () => Promise<number>;
2
+ declare const debounce: (func: Function, wait: number, immediate?: boolean | undefined) => Function;
3
+ export default debounce;
@@ -0,0 +1,2 @@
1
+ export declare const after: (el: HTMLElement | null, newSibling: HTMLElement) => Element | null;
2
+ export declare const removeAll: (selector: string, el?: Document) => void;
@@ -0,0 +1 @@
1
+ export declare const decimal: (number: string | number, decimals?: number) => string;
@@ -0,0 +1,6 @@
1
+ export declare const get_horizontal_center_of_els: (modifier: number, startRect: DOMRect, targetRect: DOMRect) => number;
2
+ export declare const get_vertical_center_of_els: (modifier: number, startRect: DOMRect, targetRect: DOMRect) => number;
3
+ export declare const get_body_correction: () => {
4
+ top: number;
5
+ left: number;
6
+ };
@@ -0,0 +1 @@
1
+ export declare const activate: (speccer: Function) => void;
@@ -0,0 +1,2 @@
1
+ export declare const add: (el: HTMLElement, styles: [] | object) => Promise<void>;
2
+ export declare const get: (el: HTMLElement) => Promise<CSSStyleDeclaration>;
@@ -0,0 +1,2 @@
1
+ export declare const create: (textContent: string | undefined, area: string, n?: string) => HTMLElement;
2
+ export declare const element: (el: HTMLElement, dissectIndex: number) => Promise<void>;
@@ -0,0 +1,4 @@
1
+ export * as typography from './typography';
2
+ export * as dissect from './dissect';
3
+ export * as measure from './measure';
4
+ export * as spec from './spec';
@@ -0,0 +1 @@
1
+ export declare const element: (el: HTMLElement) => void;
@@ -0,0 +1,2 @@
1
+ export declare const create: (text?: string | number, tag?: string) => HTMLElement;
2
+ export declare const element: (el: HTMLElement) => Promise<void>;
@@ -0,0 +1,2 @@
1
+ export declare const create: (html: string, area: string | null) => HTMLDivElement;
2
+ export declare const element: (el: HTMLElement) => Promise<void>;
@@ -0,0 +1,19 @@
1
+ export declare type SpacingCSSPropertiesType = {
2
+ marginTop: string;
3
+ marginBottom: string;
4
+ marginLeft: string;
5
+ marginRight: string;
6
+ paddingTop: string;
7
+ paddingBottom: string;
8
+ paddingLeft: string;
9
+ paddingRight: string;
10
+ };
11
+ export declare type TypographyCSSPropertiesType = {
12
+ lineHeight: string;
13
+ letterSpacing: string;
14
+ fontFamily: string;
15
+ fontSize: string;
16
+ fontStyle: string;
17
+ fontVariationSettings: string;
18
+ fontWeight: string;
19
+ };
@@ -0,0 +1,5 @@
1
+ import { SpacingCSSPropertiesType } from './css';
2
+ export declare type SpeccerElType = {
3
+ styles?: SpacingCSSPropertiesType;
4
+ rect?: DOMRectReadOnly;
5
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phun-ky/speccer",
3
- "version": "5.0.0",
3
+ "version": "6.0.0",
4
4
  "description": "A script to annotate, show spacing specs and to display typography information in documentation/website on HTML elements",
5
5
  "main": "speccer.js",
6
6
  "publishConfig": {
@@ -10,7 +10,7 @@
10
10
  "test": "echo \"Error: no test specified\" && exit 1",
11
11
  "rollup": "rollup -c",
12
12
  "rollup:dev": "npm run clean && rollup -c -w",
13
- "clean": "rm -rf ./speccer.css ./speccer.min.css ./speccer.js",
13
+ "clean": "rm -rf dist/ dts/ ./speccer.css ./speccer.min.css ./speccer.js",
14
14
  "build": "npm run clean && npm run rollup && npm run stylus && npm run postcss",
15
15
  "styles": "npm run stylus && npm run postcss",
16
16
  "stylus": "rm -rf ./speccer.css && stylus ./src/styles/index.styl -o ./speccer.css",
@@ -122,7 +122,14 @@
122
122
  "prettier": "^2.4.1",
123
123
  "prettier-eslint": "^13.0.0",
124
124
  "rollup": "^2.39.0",
125
+ "@typescript-eslint/eslint-plugin": "^5.7.0",
126
+ "@typescript-eslint/parser": "^5.7.0",
127
+ "stylus": "^0.56.0",
128
+ "rollup-plugin-dts": "^4.0.1",
125
129
  "rollup-plugin-terser": "^7.0.2",
126
- "stylus": "^0.56.0"
130
+ "rollup-plugin-typescript2": "^0.31.1",
131
+ "tslib": "^2.3.1",
132
+ "typescript": "^4.5.4",
133
+ "network-information-types": "^0.1.0"
127
134
  }
128
135
  }
package/speccer.css CHANGED
@@ -23,6 +23,11 @@
23
23
  --ph-speccer-line-width-negative: -1px;
24
24
  --ph-speccer-measure-size: 8px;
25
25
  }
26
+ body.ph {
27
+ margin: 12px;
28
+ padding: 12px;
29
+ box-sizing: border-box;
30
+ }
26
31
  .ph.speccer,
27
32
  .ph.speccer::after,
28
33
  .ph.speccer::before {
@@ -334,13 +339,6 @@
334
339
  .ph.speccer.spacing:hover {
335
340
  border: var(--ph-speccer-line-width) solid var(--ph-speccer-color-text-dark);
336
341
  }
337
- .is-specced:hover ~ .ph.speccer.spacing.margin {
338
- background-color: var(--ph-speccer-color-margin-hover);
339
- }
340
- .is-specced:hover ~ .ph.speccer.spacing.padding {
341
- background-color: var(--ph-speccer-color-padding-hover);
342
- color: var(--ph-speccer-color-text-light);
343
- }
344
342
  .ph.speccer.spacing.margin {
345
343
  background-color: var(--ph-speccer-color-margin);
346
344
  color: var(--ph-speccer-color-text-dark);
@@ -440,15 +438,14 @@
440
438
  .ph.speccer.typography {
441
439
  background-color: var(--ph-speccer-typography-background-color);
442
440
  color: var(--ph-speccer-typography-color-text);
443
- font-size: 12px;
444
- padding: 8px 24px;
441
+ font-size: 10px;
442
+ padding: 8px;
445
443
  max-width: none;
446
444
  width: auto;
447
445
  display: block;
448
446
  text-align: left;
449
447
  line-height: 140%;
450
448
  border: var(--ph-speccer-line-width) solid var(--ph-speccer-pin-color);
451
- min-width: 320px;
452
449
  }
453
450
  .ph.speccer.typography:hover {
454
451
  border: var(--ph-speccer-line-width) solid var(--ph-speccer-pin-color);
@@ -462,14 +459,14 @@
462
459
  top: 50%;
463
460
  transform: translateY(-50%);
464
461
  height: var(--ph-speccer-line-width);
465
- width: 48px;
462
+ width: var(--ph-speccer-pin-space);
466
463
  }
467
464
  .ph.speccer.typography.left:after {
468
465
  left: 100%;
469
466
  top: 50%;
470
467
  transform: translateY(-50%);
471
468
  height: var(--ph-speccer-line-width);
472
- width: 48px;
469
+ width: var(--ph-speccer-pin-space);
473
470
  }
474
471
  .ph.speccer.typography.right:after {
475
472
  left: auto;
@@ -477,14 +474,14 @@
477
474
  top: 50%;
478
475
  transform: translateY(-50%);
479
476
  height: var(--ph-speccer-line-width);
480
- width: 48px;
477
+ width: var(--ph-speccer-pin-space);
481
478
  }
482
479
  .ph.speccer.typography.top:after {
483
480
  left: 50%;
484
481
  right: auto;
485
482
  top: 100%;
486
483
  transform: translateX(-50%);
487
- height: 48px;
484
+ height: var(--ph-speccer-pin-space);
488
485
  width: var(--ph-speccer-line-width);
489
486
  }
490
487
  .ph.speccer.typography.bottom:after {
@@ -493,7 +490,7 @@
493
490
  top: auto;
494
491
  bottom: 100%;
495
492
  transform: translateX(-50%);
496
- height: 48px;
493
+ height: var(--ph-speccer-pin-space);
497
494
  width: var(--ph-speccer-line-width);
498
495
  }
499
496
  .ph.speccer.typography .speccer-styles {
@@ -502,15 +499,15 @@
502
499
  padding: 0;
503
500
  margin: 0;
504
501
  line-height: 140%;
505
- padding-left: 1rem;
506
- font-size: 12px;
502
+ padding-left: 8px;
503
+ font-size: 10px;
507
504
  }
508
505
  .ph.speccer.typography .speccer-styles .property {
509
506
  font-weight: normal;
510
507
  color: var(--ph-speccer-typography-color-property);
511
508
  text-align: left;
512
509
  padding: 0;
513
- font-size: 12px;
510
+ font-size: 10px;
514
511
  margin: 0;
515
512
  }
516
513
  .ph.speccer.typography .speccer-styles > li {
@@ -518,7 +515,7 @@
518
515
  color: var(--ph-speccer-typography-color-value);
519
516
  text-align: left;
520
517
  padding: 0;
521
- font-size: 12px;
518
+ font-size: 10px;
522
519
  margin: 0;
523
520
  list-style: none;
524
521
  border: none;
package/speccer.js CHANGED
@@ -1 +1,2 @@
1
- !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).speccer={})}(this,(function(t){"use strict";const e=(t,e)=>t.insertAdjacentElement("afterend",e),n=(t,e=document)=>{[].forEach.call(e.querySelectorAll(t),(function(t){t.remove()}))},i=(t,e,n="noop")=>{t&&(!e||e&&0===e.length||e.trim().split(" ").filter((t=>t!==n)).forEach((e=>t.classList.add(e))))},o=t=>parseInt(t,10),p=t=>{const e=parseFloat(t);return e>=0&&e<1||e<=0&&e>-1?0:e},s=()=>new Promise(requestAnimationFrame),a=async(t,e)=>{t&&(!e||e&&0===e.length&&e.constructor===String||e&&0===e.length&&e.constructor===Array||e&&0===Object.keys(e).length&&e.constructor===Object||(await s(),"string"==typeof e||Array.isArray(e)?e.forEach((e=>t.style[e.key]=e.value)):Object.keys(e).forEach((n=>t.style[n]=e[n]))))},l=async t=>(await s(),window.getComputedStyle?getComputedStyle(t,null):t.currentStyle),r=[..."ABCDEFGHIJKLMNOPQRSTUVWXYZ"],d=["TR","TH","TD","TBODY","THEAD","TFOOT"],c=(t="",e="span")=>{const n=document.createElement(e),o=document.createTextNode(t);return n.appendChild(o),n.setAttribute("title",t+"px"),i(n,"ph speccer spacing"),n},h=async t=>{const n={},s=await l(t);if("none"===s.display||"hidden"===s.visibility)return;t.classList.add("is-specced");if("static"===l(t.parentElement).position&&window.requestAnimationFrame((()=>{t.parentElement.style.position="relative"})),n.styles=(t=>{const{marginTop:e,marginBottom:n,marginLeft:i,marginRight:o,paddingTop:p,paddingBottom:s,paddingLeft:a,paddingRight:l}=t;return{marginTop:e,marginBottom:n,marginLeft:i,marginRight:o,paddingTop:p,paddingBottom:s,paddingLeft:a,paddingRight:l}})(s),n.rect=t.getBoundingClientRect(),"0px"!==n.styles.marginTop){const s=c(o(n.styles.marginTop));i(s,"margin top"),a(s,{height:n.styles.marginTop,width:n.rect.width+"px",left:p(n.rect.x-t.parentElement.getBoundingClientRect().x)+"px",top:p(n.rect.y-t.parentElement.getBoundingClientRect().y-parseInt(n.styles.marginTop,10))+"px"}),d.indexOf(t.nodeName)>=0?e(t.closest("table"),s):e(t,s)}if("0px"!==n.styles.marginRight){const s=c(o(n.styles.marginRight));i(s,"margin right"),a(s,{height:n.rect.height+"px",width:n.styles.marginRight,left:p(n.rect.x-t.parentElement.getBoundingClientRect().x+parseInt(n.rect.width,10))+"px",top:p(n.rect.y-t.parentElement.getBoundingClientRect().y)+"px"}),d.indexOf(t.nodeName)>=0?e(t.closest("table"),s):e(t,s)}if("0px"!==n.styles.marginBottom){const s=c(o(n.styles.marginBottom));i(s,"margin bottom"),a(s,{height:n.styles.marginBottom,width:n.rect.width+"px",left:p(n.rect.x-t.parentElement.getBoundingClientRect().x)+"px",top:p(n.rect.y-t.parentElement.getBoundingClientRect().y+parseInt(n.rect.height,10))+"px"}),d.indexOf(t.nodeName)>=0?e(t.closest("table"),s):e(t,s)}if("0px"!==n.styles.marginLeft){const s=c(o(n.styles.marginLeft));i(s,"margin left"),a(s,{height:n.rect.height+"px",width:n.styles.marginLeft,left:p(n.rect.x-t.parentElement.getBoundingClientRect().x-parseInt(n.styles.marginLeft,10))+"px",top:p(n.rect.y-t.parentElement.getBoundingClientRect().y)+"px"}),d.indexOf(t.nodeName)>=0?e(t.closest("table"),s):e(t,s)}if("0px"!==n.styles.paddingTop){const s=c(o(n.styles.paddingTop));i(s,"padding top"),a(s,{height:n.styles.paddingTop,width:n.rect.width+"px",left:p(n.rect.x-t.parentElement.getBoundingClientRect().x)+"px",top:p(n.rect.y-t.parentElement.getBoundingClientRect().y)+"px"}),d.indexOf(t.nodeName)>=0?e(t.closest("table"),s):e(t,s)}if("0px"!==n.styles.paddingBottom){const s=c(o(n.styles.paddingBottom));i(s,"padding bottom"),a(s,{height:n.styles.paddingBottom,width:n.rect.width+"px",left:p(n.rect.x-t.parentElement.getBoundingClientRect().x)+"px",top:p(n.rect.y-t.parentElement.getBoundingClientRect().y+(parseInt(n.rect.height,10)-parseInt(n.styles.paddingBottom,10)))+"px"}),d.indexOf(t.nodeName)>=0?e(t.closest("table"),s):e(t,s)}if("0px"!==n.styles.paddingRight){const s=c(o(n.styles.paddingRight));i(s,"padding right"),a(s,{height:n.rect.height+"px",width:n.styles.paddingRight,left:p(n.rect.x-t.parentElement.getBoundingClientRect().x+(parseInt(n.rect.width,10)-parseInt(n.styles.paddingRight,10)))+"px",top:p(n.rect.y-t.parentElement.getBoundingClientRect().y)+"px"}),d.indexOf(t.nodeName)>=0?e(t.closest("table"),s):e(t,s)}if("0px"!==n.styles.paddingLeft){const s=c(o(n.styles.paddingLeft));i(s,"padding left"),a(s,{height:n.rect.height+"px",width:n.styles.paddingLeft,left:p(n.rect.x-t.parentElement.getBoundingClientRect().x)+"px",top:p(n.rect.y-t.parentElement.getBoundingClientRect().y)+"px"}),d.indexOf(t.nodeName)>=0?e(t.closest("table"),s):e(t,s)}};const g=(t="",e,n="span")=>{const o=document.createElement(n),p=document.createTextNode(t);return-1===e.indexOf("full")&&-1===e.indexOf("enclose")?o.appendChild(p):-1===e.indexOf("full")&&-1===e.indexOf("enclose")||o.setAttribute("data-dissection-counter",t),i(o,`ph speccer dissection ${e}`),o},f=(t,n)=>{const i=t.getBoundingClientRect(),o=t.getAttribute("data-anatomy"),p=g(r[n],o),s=d.indexOf(t.nodeName)>=0;let c=0,h=0;if(s){const n=t.closest("table"),i=l(n.parentElement);e(n,p);const o=n.getBoundingClientRect();c=o.top-parseInt(i.getPropertyValue("padding-top"),10),h=o.left-parseInt(i.getPropertyValue("padding-left"),10)}else e(t,p);const f=t.offsetLeft,x=t.offsetTop,m=p.getBoundingClientRect(),u=(s?i.left-h:f)-m.width-48+"px",y=(s?i.top-c:x)+i.height/2-m.height/2+"px",w=(s?i.left-h:f)+i.width+48+"px",O=(s?i.top-c:x)+i.height/2-m.height/2+"px",b=(s?i.left-h:f)+i.width/2-m.width/2+"px",E=(s?i.top-c:x)-m.height-48+"px",R=(s?i.left-h:f)+i.width/2-m.width/2+"px",B=(s?i.top-c:x)+i.height+48+"px";let C={};C=-1!==o.indexOf("outline")?-1!==o.indexOf("left")?-1!==o.indexOf("full")?{left:f-8+"px",top:x+-1+"px",height:i.height+"px"}:-1!==o.indexOf("enclose")?{left:f-1+"px",top:x+-1+"px",height:i.height+"px",width:i.width+"px"}:{left:u,top:y}:-1!==o.indexOf("right")?-1!==o.indexOf("full")?{left:f+i.width+"px",top:x+-1+"px",height:i.height+"px"}:-1!==o.indexOf("enclose")?{left:f+-1+"px",top:x+-1+"px",height:i.height+"px",width:i.width+"px"}:{left:w,top:O}:-1!==o.indexOf("top")?-1!==o.indexOf("full")?{top:x+-8+"px",left:f+-1+"px",width:i.width+"px"}:-1!==o.indexOf("enclose")?{top:x+-1+"px",left:f+-1+"px",height:i.height+"px",width:i.width+"px"}:{left:b,top:E}:-1!==o.indexOf("bottom")?-1!==o.indexOf("full")?{top:x+i.height+"px",left:f+-1+"px",width:i.width+"px"}:-1!==o.indexOf("enclose")?{top:x+-1+"px",left:f+-1+"px",height:i.height+"px",width:i.width+"px"}:{left:R,top:B}:-1!==o.indexOf("full")?{left:f+i.width+"px",top:x+"px",height:i.height+"px"}:-1!==o.indexOf("enclose")?{left:f+i.width+"px",top:x+-1+"px",height:i.height+"px",width:i.width+"px"}:{left:u,top:y}:-1!==o.indexOf("full")?{left:f-8+"px",top:x+-1+"px",height:i.height+"px"}:-1!==o.indexOf("enclose")?{left:f-1+"px",top:x+-1+"px",height:i.height+"px",width:i.width+"px"}:{left:u,top:y},a(p,C)};const x=(t="",e="",n="span")=>{const o=document.createElement(n);return o.setAttribute("title",t+"px"),o.setAttribute("data-measure",parseInt(t,10)+"px"),i(o,`ph speccer measure ${e}`),o},m=t=>{if(!t)return;const n=t.getBoundingClientRect(),i=t.getAttribute("data-speccer-measure");if(""===i)return;const o=t.offsetTop,p=t.offsetLeft;if(-1!==i.indexOf("width"))if(-1!==i.indexOf("bottom")){const i=x(n.width,"width bottom");d.indexOf(t.nodeName)>=0?e(t.closest("table"),i):e(t,i),a(i,{left:p+"px",top:o+n.height+1+"px",width:n.width+"px"})}else{const i=x(n.width,"width top");d.indexOf(t.nodeName)>=0?e(t.closest("table"),i):e(t,i);const s=i.getBoundingClientRect();a(i,{left:p+"px",top:o-s.height+1+"px",width:n.width+"px"})}else if(-1!==i.indexOf("height"))if(-1!==i.indexOf("right")){const i=x(n.height,"height right");d.indexOf(t.nodeName)>=0?e(t.closest("table"),i):e(t,i),a(i,{left:p+n.width+"px",top:o+"px",height:n.height+"px"})}else{const i=x(n.height,"height left");d.indexOf(t.nodeName)>=0?e(t.closest("table"),i):e(t,i);const s=i.getBoundingClientRect();a(i,{left:p-s.width+"px",top:o+"px",height:n.height+"px"})}};const u=t=>parseFloat(t).toFixed(3),y=(t,e)=>{const n=document.createElement("div");return n.innerHTML=t,i(n,`ph speccer typography ${e}`),n},w=async t=>{const n=t.getAttribute("data-speccer-typography"),i=await l(t);if("none"===i.display||"hidden"===i.visibility)return;t.classList.add("is-specced");"static"===l(t.parentElement).position&&window.requestAnimationFrame((()=>{t.parentElement.style.position="relative"}));const o=(t=>{const{lineHeight:e,letterSpacing:n,fontFamily:i,fontSize:o,fontStyle:p,fontVariationSettings:s,fontWeight:a}=t;return{lineHeight:e,letterSpacing:n,fontFamily:i,fontSize:o,fontStyle:p,fontVariationSettings:s,fontWeight:a}})(i),p=t.getBoundingClientRect(),s=`\n font-styles: {<ul class="speccer-styles"> <li><span class="property">font-family:</span> ${o.fontFamily};</li> <li><span class="property">font-size:</span> ${o.fontSize} / ${parseInt(o.fontSize,10)/16}rem;</li> <li><span class="property">font-weight:</span> ${o.fontWeight};</li> <li><span class="property">font-variation-settings:</span> ${o.fontVariationSettings};</li> <li><span class="property">line-height:</span> ${o.lineHeight} / ${parseInt(o.lineHeight,10)/16}rem;</li> <li><span class="property">letter-spacing:</span> ${o.letterSpacing};</li> <li><span class="property">font-style:</span> ${o.fontStyle};</li></ul>}`,r=y(s,n);let c=0,h=0;const g=d.indexOf(t.nodeName)>=0;if(g){const n=t.parentElement,i=window.getComputedStyle(n.parentElement);e(n,r),c=n.getBoundingClientRect().top-parseInt(i.getPropertyValue("padding-top"),10),h=n.getBoundingClientRect().left-parseInt(i.getPropertyValue("padding-left"),10)}else e(t,r);const f=r.getBoundingClientRect(),x=(g?f.left-h:t.offsetLeft)-f.width-48+"px",m=u((g?f.top-c:t.offsetTop)-f.height/2+p.height/2)+"px",w=(g?f.left-h:t.offsetLeft)+p.width+48+"px",O=u((g?f.top-c:t.offsetTop)-f.height/2+p.height/2)+"px",b=u((g?f.left-h:t.offsetLeft)-f.width/2+p.width/2)+"px",E=(g?f.top-c:t.offsetTop)-f.height-48+"px",R=u((g?f.left-h:t.offsetLeft)-f.width/2+p.width/2)+"px",B=(g?f.top-c:t.offsetTop)+p.height+48+"px";let C={left:x,top:m};-1!==n.indexOf("right")?C={left:w,top:O}:-1!==n.indexOf("top")?C={left:b,top:E}:-1!==n.indexOf("bottom")&&(C={left:R,top:B}),a(r,C)};const O=t=>{const e=(n=()=>{t()},i=300,function(){var t=this,e=arguments,s=function(){p=null,o||n.apply(t,e)},a=o&&!p;clearTimeout(p),p=setTimeout(s,i),a&&n.apply(t,e)});var n,i,o,p;window.removeEventListener("resize",e),window.addEventListener("resize",e)},b=t=>{"loading"===document.readyState?document.addEventListener("DOMContentLoaded",t):t()},E=()=>{n(".speccer"),n(".dissection");const t=document.querySelectorAll("[data-speccer],[data-speccer] *:not(td)"),e=document.querySelectorAll("[data-speccer-measure]"),i=document.querySelectorAll("[data-speccer-typography]"),o=document.querySelectorAll("[data-anatomy-section] [data-anatomy]");t.forEach(h),e.forEach(m),i.forEach(w),o.forEach(f)},R=Object.freeze({__proto__:null,create:c,element:h}),B=Object.freeze({__proto__:null,create:g,element:f}),C=Object.freeze({__proto__:null,element:m}),A=Object.freeze({__proto__:null,create:y,element:w});(t=>{const e=document.currentScript;if(e){const n=e.getAttribute("src");-1===n.indexOf("speccer.js")&&-1===n.indexOf("JaXpOK.js")||(e.hasAttribute("data-manual")?(t=>{window.speccer=t})(t):e.hasAttribute("data-instant")?t():e.hasAttribute("data-dom")?b(t):e.hasAttribute("data-lazy")?(()=>{const t=new IntersectionObserver(((t,e)=>{t.forEach((t=>{t.intersectionRatio>0&&(h(t.target),e.unobserve(t.target))}))}));document.querySelectorAll("[data-speccer],[data-speccer] *:not(td)").forEach((e=>{t.observe(e)}));const e=new IntersectionObserver(((t,e)=>{t.forEach((t=>{t.intersectionRatio>0&&(m(t.target),e.unobserve(t.target))}))}));document.querySelectorAll("[data-speccer-measure]").forEach((t=>{e.observe(t)}));const n=new IntersectionObserver(((t,e)=>{t.forEach((t=>{const n=t.target.querySelectorAll("[data-anatomy]");t.intersectionRatio>0&&(n.forEach(f),e.unobserve(t.target))}))}));document.querySelectorAll("[data-anatomy-section]").forEach((t=>{n.observe(t)}))})():b(t),e.hasAttribute("data-manual")||e.hasAttribute("data-lazy")||O(t))}})(E),t.default=E,t.dissect=B,t.measure=C,t.spacing=R,t.typography=A,Object.defineProperty(t,"__esModule",{value:!0})}));
1
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).speccer={})}(this,(function(t){"use strict";const e=(t,e,n="noop")=>{t&&(!e||e&&0===e.length||e.trim().split(" ").filter((t=>t!==n)).forEach((e=>t.classList.add(e))))},n=(t,e)=>`${t} ${Object.keys(e).filter((t=>e[t])).join(" ")}`.trim(),i=[..."ABCDEFGHIJKLMNOPQRSTUVWXYZ"],o=t=>parseInt(t,10),p=t=>o(getComputedStyle(t).getPropertyValue("--ph-speccer-pin-space"))||48,s=()=>new Promise(requestAnimationFrame),a=async(t,e)=>{!t||!e||"string"==typeof e||"number"==typeof e||"boolean"==typeof e||Array.isArray(e)&&0===e.length||0===Object.keys(e).length&&e.constructor===Object||(await s(),Array.isArray(e)?e.forEach((e=>t.style[e.key]=e.value)):Object.keys(e).forEach((n=>t.style[n]=e[n])))},r=async t=>(await s(),getComputedStyle(t,null)),d=(t,e,n)=>t-e.width/2+n.width/2,l=(t,e,n)=>t-e.height/2+n.height/2,h=()=>{const t=getComputedStyle(document.body),e=parseInt(t.paddingLeft)+parseInt(t.marginLeft);return{top:parseInt(t.paddingTop)+parseInt(t.marginTop),left:e}},c=(t="",n="span")=>{const i=document.createElement(n),o=document.createTextNode(t+"");return i.appendChild(o),i.setAttribute("title",t+"px"),e(i,"ph speccer spacing"),i},f=async t=>{const n={},i=await r(t);if("none"===i.display||"hidden"===i.visibility||!t.parentElement)return;t.classList.add("is-specced"),n.styles=(t=>{const{marginTop:e,marginBottom:n,marginLeft:i,marginRight:o,paddingTop:p,paddingBottom:s,paddingLeft:a,paddingRight:r}=t;return{marginTop:e,marginBottom:n,marginLeft:i,marginRight:o,paddingTop:p,paddingBottom:s,paddingLeft:a,paddingRight:r}})(i);const p=t.getBoundingClientRect(),s=h(),d=t.offsetTop+s.top,l=t.offsetLeft+s.left;if("0px"!==n.styles.marginTop){const i=c(o(n.styles.marginTop));document.body.appendChild(i),e(i,"margin top"),a(i,{height:n.styles.marginTop,width:p.width+"px",transform:t.style.transform,left:l+"px",top:d-parseInt(n.styles.marginTop,10)+"px"})}if("0px"!==n.styles.marginRight){const i=c(o(n.styles.marginRight));e(i,"margin right"),a(i,{height:p.height+"px",width:n.styles.marginRight,transform:t.style.transform,left:l+parseInt(p.width+"",10)+"px",top:d+"px"}),document.body.appendChild(i)}if("0px"!==n.styles.marginBottom){const i=c(o(n.styles.marginBottom));e(i,"margin bottom"),a(i,{height:n.styles.marginBottom,width:p.width+"px",transform:t.style.transform,left:l+"px",top:d+parseInt(p.height+"",10)+"px"}),document.body.appendChild(i)}if("0px"!==n.styles.marginLeft){const i=c(o(n.styles.marginLeft));e(i,"margin left"),a(i,{height:p.height+"px",width:n.styles.marginLeft,transform:t.style.transform,left:l-parseInt(n.styles.marginLeft,10)+"px",top:d+"px"}),document.body.appendChild(i)}if("0px"!==n.styles.paddingTop){const i=c(o(n.styles.paddingTop));e(i,"padding top"),a(i,{height:n.styles.paddingTop,width:p.width+"px",transform:t.style.transform,left:l+"px",top:d+"px"}),document.body.appendChild(i)}if("0px"!==n.styles.paddingBottom){const i=c(o(n.styles.paddingBottom));e(i,"padding bottom"),a(i,{height:n.styles.paddingBottom,width:p.width+"px",transform:t.style.transform,left:l+"px",top:d+(parseInt(p.height+"",10)-parseInt(n.styles.paddingBottom,10))+"px"}),document.body.appendChild(i)}if("0px"!==n.styles.paddingRight){const i=c(o(n.styles.paddingRight));e(i,"padding right"),a(i,{height:p.height+"px",width:n.styles.paddingRight,transform:t.style.transform,left:l+(parseInt(p.width+"",10)-parseInt(n.styles.paddingRight,10))+"px",top:d+"px"}),document.body.appendChild(i)}if("0px"!==n.styles.paddingLeft){const i=c(o(n.styles.paddingLeft));e(i,"padding left"),a(i,{height:p.height+"px",width:n.styles.paddingLeft,transform:t.style.transform,left:l+"px",top:d+"px"}),document.body.appendChild(i)}};var g,m,u=Object.freeze({__proto__:null,create:c,element:f});!function(t){t.Empty="",t.Left="left",t.Right="right",t.Bottom="bottom",t.Top="top"}(g||(g={})),function(t){t.Outline="outline",t.Enclose="enclose",t.Full="full",t.Left="left",t.Right="right",t.Bottom="bottom",t.Top="top"}(m||(m={}));const x=(t,e=3)=>parseFloat(t+"").toFixed(e),y=(t="",i,o="span")=>{const p=document.createElement(o),s=document.createTextNode(t),a={};null!==i&&""!==i&&(a[i]=!0),-1===i.indexOf(m.Full)&&-1===i.indexOf(m.Enclose)?p.appendChild(s):-1===i.indexOf(m.Full)&&-1===i.indexOf(m.Enclose)||p.setAttribute("data-dissection-counter",t);const r=n("ph speccer dissection",a);return e(p,r),p},w=async(t,e)=>{if(!t)return;const n=t.getAttribute("data-anatomy")||"";if(!n||""===n)return;const o=y(i[e],n);document.body.appendChild(o);const s=((t,e,n)=>{const i=e.getBoundingClientRect(),o=p(n),s=n.getBoundingClientRect(),a=h(),r=e.offsetTop+a.top,c=e.offsetLeft+a.left,f=c-s.width-o+"px",g=x(l(r,s,i))+"px",u=c+i.width+o+"px",y=x(l(r,s,i))+"px",w=x(d(c,s,i))+"px",b=r-s.height-o+"px",O=x(d(c,s,i))+"px",E=r+i.height+o+"px";let A={};return A=-1!==t.indexOf(m.Outline)?-1!==t.indexOf(m.Left)?-1!==t.indexOf(m.Full)?{left:c-8+"px",top:r+-1+"px",height:i.height+"px"}:-1!==t.indexOf(m.Enclose)?{left:c-1+"px",top:r+-1+"px",height:i.height+"px",width:i.width+"px"}:{left:f,top:g}:-1!==t.indexOf(m.Right)?-1!==t.indexOf(m.Full)?{left:c+i.width+"px",top:r+-1+"px",height:i.height+"px"}:-1!==t.indexOf(m.Enclose)?{left:c+-1+"px",top:r+-1+"px",height:i.height+"px",width:i.width+"px"}:{left:u,top:y}:-1!==t.indexOf(m.Top)?-1!==t.indexOf(m.Full)?{top:r+-8+"px",left:c+-1+"px",width:i.width+"px"}:-1!==t.indexOf(m.Enclose)?{top:r+-1+"px",left:c+-1+"px",height:i.height+"px",width:i.width+"px"}:{left:w,top:b}:-1!==t.indexOf(m.Bottom)?-1!==t.indexOf(m.Full)?{top:r+i.height+"px",left:c+-1+"px",width:i.width+"px"}:-1!==t.indexOf(m.Enclose)?{top:r+-1+"px",left:c+-1+"px",height:i.height+"px",width:i.width+"px"}:{left:O,top:E}:-1!==t.indexOf(m.Full)?{left:c+i.width+"px",top:r+"px",height:i.height+"px"}:-1!==t.indexOf(m.Enclose)?{left:c+i.width+"px",top:r+-1+"px",height:i.height+"px",width:i.width+"px"}:{left:f,top:g}:-1!==t.indexOf(m.Full)?{left:c-8+"px",top:r+-1+"px",height:i.height+"px"}:-1!==t.indexOf(m.Enclose)?{left:c-1+"px",top:r+-1+"px",height:i.height+"px",width:i.width+"px"}:{left:f,top:g},A})(n,t,o);a(o,s)};const b=(t="",n="",i="span")=>{const o=document.createElement(i);return o.setAttribute("title",t+"px"),o.setAttribute("data-measure",parseInt(t+"",10)+"px"),e(o,`ph speccer measure ${n}`),o},O=t=>{if(!t)return;const e=t.getBoundingClientRect(),n=t.getAttribute("data-speccer-measure");if(""===n||!n)return;const i=h(),o=t.offsetTop+i.top,p=t.offsetLeft+i.left;if(-1!==n.indexOf("width"))if(-1!==n.indexOf("bottom")){const t=b(e.width,"width bottom");document.body.appendChild(t),a(t,{left:p+"px",top:o+e.height+1+"px",width:e.width+"px"})}else{const t=b(e.width,"width top");document.body.appendChild(t);const n=t.getBoundingClientRect();a(t,{left:p+"px",top:o-n.height+1+"px",width:e.width+"px"})}else if(-1!==n.indexOf("height"))if(-1!==n.indexOf("right")){const t=b(e.height,"height right");document.body.appendChild(t),a(t,{left:p+e.width+"px",top:o+"px",height:e.height+"px"})}else{const t=b(e.height,"height left");document.body.appendChild(t);const n=t.getBoundingClientRect();a(t,{left:p-n.width+"px",top:o+"px",height:e.height+"px"})}};const E=(t,i)=>{const o=document.createElement("div"),p={};null!==i&&""!==i&&(p[i]=!0);const s=n("ph speccer typography",p);return o.innerHTML=t,e(o,s),o};const A=t=>{const e=()=>function(t,e,n){let i;return function(){const o=this,p=arguments,s=function(){i=null,n||t.apply(o,p)},a=n&&!i;i&&clearTimeout(i),i=setTimeout(s,e),a&&t.apply(o,p)}}((()=>{t()}),300);window.removeEventListener("resize",e),window.addEventListener("resize",e)},C=t=>{"loading"===document.readyState?document.addEventListener("DOMContentLoaded",(()=>{t()})):t()},L=u,T=Object.freeze({__proto__:null,create:y,element:w}),S=Object.freeze({__proto__:null,element:O}),R=Object.freeze({__proto__:null,create:E,element:async t=>{if(!t)return;const e=t.getAttribute("data-speccer-typography"),n=await r(t);if("none"===n.display||"hidden"===n.visibility||!t.parentElement)return;t.classList.add("is-specced");const i=await(async t=>{const e=(t=>{const{lineHeight:e,letterSpacing:n,fontFamily:i,fontSize:o,fontStyle:p,fontVariationSettings:s,fontWeight:a}=t;return{lineHeight:e,letterSpacing:n,fontFamily:i,fontSize:o,fontStyle:p,fontVariationSettings:s,fontWeight:a}})(await r(t));return`\nfont-styles: {<ul class="speccer-styles"> <li><span class="property">font-family:</span> ${e.fontFamily};</li> <li><span class="property">font-size:</span> ${e.fontSize} / ${parseInt(e.fontSize,10)/16}rem;</li> <li><span class="property">font-weight:</span> ${e.fontWeight};</li> <li><span class="property">font-variation-settings:</span> ${e.fontVariationSettings};</li> <li><span class="property">line-height:</span> ${e.lineHeight} / ${parseInt(e.lineHeight,10)/16}rem;</li> <li><span class="property">letter-spacing:</span> ${e.letterSpacing};</li> <li><span class="property">font-style:</span> ${e.fontStyle};</li></ul>}`})(t),o=E(i,e);document.body.appendChild(o);const s=((t,e,n)=>{const i=e.getBoundingClientRect(),o=p(n),s=n.getBoundingClientRect(),a=h(),r=e.offsetTop+a.top,c=e.offsetLeft+a.left,f=c-s.width-o+"px",m=x(l(r,s,i))+"px",u=c+i.width+o+"px",y=x(l(r,s,i))+"px",w=x(d(c,s,i))+"px",b=r-s.height-o+"px",O=x(d(c,s,i))+"px",E=r+i.height+o+"px";let A={left:f,top:m};return t&&-1!==t.indexOf(g.Right)?A={left:u,top:y}:t&&-1!==t.indexOf(g.Top)?A={left:w,top:b}:t&&-1!==t.indexOf(g.Bottom)&&(A={left:O,top:E}),A})(e,t,o);a(o,s)}}),B=()=>{((t,e=document)=>{[].forEach.call(e.querySelectorAll(t),(function(t){t.remove()}))})(".speccer");const t=document.querySelectorAll("[data-speccer],[data-speccer] *:not(td)"),e=document.querySelectorAll("[data-speccer-measure]"),n=document.querySelectorAll("[data-speccer-typography]"),i=document.querySelectorAll("[data-anatomy-section] [data-anatomy]");t.forEach(L.element),e.forEach(S.element),n.forEach(R.element),i.forEach(T.element)};(t=>{const e=document.currentScript;if(e){const n=e.getAttribute("src");!n||-1===n.indexOf("speccer.js")&&-1===n.indexOf("JaXpOK.js")||(e.hasAttribute("data-manual")?(t=>{window.speccer=t})(t):e.hasAttribute("data-instant")?t():e.hasAttribute("data-dom")?C(t):e.hasAttribute("data-lazy")?(()=>{const t=new IntersectionObserver(((t,e)=>{t.forEach((t=>{t.intersectionRatio>0&&(f(t.target),e.unobserve(t.target))}))}));document.querySelectorAll("[data-speccer],[data-speccer] *:not(td)").forEach((e=>{t.observe(e)}));const e=new IntersectionObserver(((t,e)=>{t.forEach((t=>{t.intersectionRatio>0&&(O(t.target),e.unobserve(t.target))}))}));document.querySelectorAll("[data-speccer-measure]").forEach((t=>{e.observe(t)}));const n=new IntersectionObserver(((t,e)=>{t.forEach((t=>{const n=t.target.querySelectorAll("[data-anatomy]");t.intersectionRatio>0&&(n.forEach(w),e.unobserve(t.target))}))}));document.querySelectorAll("[data-anatomy-section]").forEach((t=>{n.observe(t)}))})():C(t),e.hasAttribute("data-manual")||e.hasAttribute("data-lazy")||A(t))}})(B),t.default=B,t.dissect=T,t.measure=S,t.spacing=L,t.typography=R,Object.defineProperty(t,"__esModule",{value:!0})}));
2
+ //# sourceMappingURL=speccer.js.map
package/speccer.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"speccer.js","sources":["src/lib/node.ts","src/lib/classnames.ts","src/lib/constants.ts","src/lib/css.ts","src/lib/debounce.ts","src/lib/styles.ts","src/lib/position.ts","src/tasks/spec.ts","src/enums/area.ts","src/lib/number.ts","src/tasks/dissect.ts","src/helpers/dissect/styles.ts","src/tasks/measure.ts","src/helpers/typography/position.ts","src/tasks/typography.ts","src/lib/resize.ts","src/browser.ts","src/index.ts","src/helpers/typography/template.ts"],"sourcesContent":["export const after = (el: HTMLElement | null, newSibling: HTMLElement) =>\n el && el.insertAdjacentElement('afterend', newSibling);\n\nexport const removeAll = (selector: string, el: Document = document) => {\n [].forEach.call(el.querySelectorAll(selector), function (e: HTMLElement) {\n e.remove();\n });\n};\n","/* eslint no-console:0 */\n'use strict';\n\nexport const set = (el: HTMLElement, cls: string, avoid = 'noop') => {\n if (!el) return;\n\n if (!cls || (cls && cls.length === 0)) return;\n\n cls\n .trim()\n .split(' ')\n .filter((cl) => cl !== avoid)\n .forEach((cl) => el.classList.add(cl));\n};\n\nexport const toggle = (el: HTMLElement, cls: string, avoid = 'noop') => {\n if (!el) return;\n\n if (!cls || (cls && cls.length === 0)) return;\n\n cls\n .trim()\n .split(' ')\n .filter((cl) => cl !== avoid)\n .forEach((cl) => el.classList.toggle(cl));\n};\n\nexport const remove = (el: HTMLElement, cls: string, avoid = 'noop') => {\n if (!el) return;\n\n if (!cls || (cls && cls.length === 0)) return;\n\n cls\n .trim()\n .split(' ')\n .filter((cl) => cl !== avoid)\n .forEach((cl) => el.classList.remove(cl));\n};\n\nexport const cx = (cls: string, cls_obj: {}): string =>\n `${cls} ${Object.keys(cls_obj)\n .filter((classname) => cls_obj[classname])\n .join(' ')}`.trim();\n","/* eslint no-console:0 */\n'use strict';\n\nexport const SPECCER_LITERALS = [...'ABCDEFGHIJKLMNOPQRSTUVWXYZ'];\n\nexport const SPECCER_TAGS_TO_AVOID = ['TR', 'TH', 'TD', 'TBODY', 'THEAD', 'TFOOT'];\n\nexport const SPECCER_DEFAULT_PIN_SPACE = 48;\n","/* eslint no-console:0 */\n'use strict';\nimport { SPECCER_DEFAULT_PIN_SPACE } from './constants';\nimport { SpacingCSSPropertiesType, TypographyCSSPropertiesType } from '../types/css';\n\nexport const getNumberValue = (value: string): number => parseInt(value, 10);\n\nexport const normalizeNumberValue = (value: string | number): number => {\n const _value = parseFloat(value + '');\n\n return (_value >= 0 && _value < 1) || (_value <= 0 && _value > -1) ? 0 : _value;\n};\n\nexport const getSpacing = (style: SpacingCSSPropertiesType): SpacingCSSPropertiesType => {\n const { marginTop, marginBottom, marginLeft, marginRight, paddingTop, paddingBottom, paddingLeft, paddingRight } =\n style;\n\n return {\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n paddingTop,\n paddingBottom,\n paddingLeft,\n paddingRight\n };\n};\n\nexport const getTypography = (style: TypographyCSSPropertiesType): TypographyCSSPropertiesType => {\n const { lineHeight, letterSpacing, fontFamily, fontSize, fontStyle, fontVariationSettings, fontWeight } = style;\n\n return {\n lineHeight,\n letterSpacing,\n fontFamily,\n fontSize,\n fontStyle,\n fontVariationSettings,\n fontWeight\n };\n};\n\nexport const pinSpace = (el: HTMLElement): number =>\n getNumberValue(getComputedStyle(el).getPropertyValue('--ph-speccer-pin-space')) || SPECCER_DEFAULT_PIN_SPACE;\n","/* eslint no-console:0 */\n'use strict';\n\nexport const waitForFrame = () => new Promise(requestAnimationFrame);\n\nconst debounce = function (func: Function, wait: number, immediate?: boolean): Function {\n let timeout: null | ReturnType<typeof setTimeout>;\n\n return function (this: any) {\n const context = this;\n const args = arguments;\n const later = function () {\n timeout = null;\n\n if (!immediate) func.apply(context, args);\n };\n const callNow = immediate && !timeout;\n\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(later, wait);\n\n if (callNow) func.apply(context, args);\n };\n};\n\nexport default debounce;\n","/* eslint no-console:0 */\n'use strict';\nimport { waitForFrame } from './debounce';\n\nexport const add = async (el: HTMLElement, styles: [] | object) => {\n if (\n !el ||\n !styles ||\n typeof styles === 'string' ||\n typeof styles === 'number' ||\n typeof styles === 'boolean' ||\n (Array.isArray(styles) && styles.length === 0) ||\n (Object.keys(styles).length === 0 && styles.constructor === Object)\n ) {\n return;\n }\n\n await waitForFrame();\n\n if (Array.isArray(styles)) {\n styles.forEach((style: { key: string; value: string }) => (el.style[style.key] = style.value));\n } else {\n Object.keys(styles).forEach((key) => (el.style[key] = styles[key]));\n }\n};\n\nexport const get = async (el: HTMLElement): Promise<CSSStyleDeclaration> => {\n await waitForFrame();\n\n return getComputedStyle(el, null);\n};\n","export const get_horizontal_center_of_els = (modifier: number, startRect: DOMRect, targetRect: DOMRect): number =>\n modifier - startRect.width / 2 + targetRect.width / 2;\n\nexport const get_vertical_center_of_els = (modifier: number, startRect: DOMRect, targetRect: DOMRect): number =>\n modifier - startRect.height / 2 + targetRect.height / 2;\n\nexport const get_body_correction = () => {\n const _body_style = getComputedStyle(document.body);\n const _body_left_correction = parseInt(_body_style.paddingLeft) + parseInt(_body_style.marginLeft);\n const _body_top_correction = parseInt(_body_style.paddingTop) + parseInt(_body_style.marginTop);\n\n return {\n top: _body_top_correction,\n left: _body_left_correction\n };\n};\n","/* eslint no-console:0 */\n'use strict';\n\nimport * as classnames from '../lib/classnames';\nimport * as css from '../lib/css';\nimport * as styles from '../lib/styles';\nimport { get_body_correction } from '../lib/position';\nimport { SpeccerElType } from '../types/speccer';\n\nexport const create = (text: string | number = '', tag = 'span') => {\n const _el = document.createElement(tag);\n const _text_content = document.createTextNode(text + '');\n\n _el.appendChild(_text_content);\n _el.setAttribute('title', text + 'px');\n classnames.set(_el, 'ph speccer spacing');\n\n return _el;\n};\n\nexport const element = async (el: HTMLElement) => {\n const _speccer_el: SpeccerElType = {};\n const _el_style = await styles.get(el);\n\n if (_el_style.display === 'none' || _el_style.visibility === 'hidden' || !el.parentElement) {\n return;\n }\n\n el.classList.add('is-specced');\n\n _speccer_el.styles = css.getSpacing(_el_style);\n\n const _target_rect = el.getBoundingClientRect();\n const _body_correction = get_body_correction();\n const _el_offset_top = el.offsetTop + _body_correction.top;\n const _el_offset_left = el.offsetLeft + _body_correction.left;\n\n if (_speccer_el.styles['marginTop'] !== '0px') {\n const _speccer_margin_top_el = create(css.getNumberValue(_speccer_el.styles.marginTop));\n\n document.body.appendChild(_speccer_margin_top_el);\n\n classnames.set(_speccer_margin_top_el, 'margin top');\n styles.add(_speccer_margin_top_el, {\n height: _speccer_el.styles.marginTop,\n width: _target_rect.width + 'px',\n transform: el.style.transform,\n left: _el_offset_left + 'px',\n top: _el_offset_top - parseInt(_speccer_el.styles.marginTop, 10) + 'px'\n });\n }\n\n if (_speccer_el.styles['marginRight'] !== '0px') {\n const _speccer_margin_right_el = create(css.getNumberValue(_speccer_el.styles.marginRight));\n\n classnames.set(_speccer_margin_right_el, 'margin right');\n\n styles.add(_speccer_margin_right_el, {\n height: _target_rect.height + 'px',\n width: _speccer_el.styles.marginRight,\n transform: el.style.transform,\n left: _el_offset_left + parseInt(_target_rect.width + '', 10) + 'px',\n top: _el_offset_top + 'px'\n });\n\n document.body.appendChild(_speccer_margin_right_el);\n }\n\n if (_speccer_el.styles['marginBottom'] !== '0px') {\n const _speccer_margin_bottom_el = create(css.getNumberValue(_speccer_el.styles.marginBottom));\n\n classnames.set(_speccer_margin_bottom_el, 'margin bottom');\n\n styles.add(_speccer_margin_bottom_el, {\n height: _speccer_el.styles.marginBottom,\n width: _target_rect.width + 'px',\n transform: el.style.transform,\n left: _el_offset_left + 'px',\n top: _el_offset_top + parseInt(_target_rect.height + '', 10) + 'px'\n });\n\n document.body.appendChild(_speccer_margin_bottom_el);\n }\n\n if (_speccer_el.styles['marginLeft'] !== '0px') {\n const _speccer_margin_left_el = create(css.getNumberValue(_speccer_el.styles.marginLeft));\n\n classnames.set(_speccer_margin_left_el, 'margin left');\n\n styles.add(_speccer_margin_left_el, {\n height: _target_rect.height + 'px',\n width: _speccer_el.styles.marginLeft,\n transform: el.style.transform,\n left: _el_offset_left - parseInt(_speccer_el.styles.marginLeft, 10) + 'px',\n top: _el_offset_top + 'px'\n });\n\n document.body.appendChild(_speccer_margin_left_el);\n }\n\n if (_speccer_el.styles['paddingTop'] !== '0px') {\n const _speccer_padding_top_el = create(css.getNumberValue(_speccer_el.styles.paddingTop));\n\n classnames.set(_speccer_padding_top_el, 'padding top');\n\n styles.add(_speccer_padding_top_el, {\n height: _speccer_el.styles.paddingTop,\n width: _target_rect.width + 'px',\n transform: el.style.transform,\n left: _el_offset_left + 'px',\n top: _el_offset_top + 'px'\n });\n\n document.body.appendChild(_speccer_padding_top_el);\n }\n\n if (_speccer_el.styles['paddingBottom'] !== '0px') {\n const _speccer_padding_bottom_el = create(css.getNumberValue(_speccer_el.styles.paddingBottom));\n\n classnames.set(_speccer_padding_bottom_el, 'padding bottom');\n\n styles.add(_speccer_padding_bottom_el, {\n height: _speccer_el.styles.paddingBottom,\n width: _target_rect.width + 'px',\n transform: el.style.transform,\n left: _el_offset_left + 'px',\n top:\n _el_offset_top +\n (parseInt(_target_rect.height + '', 10) - parseInt(_speccer_el.styles.paddingBottom, 10)) +\n 'px'\n });\n\n document.body.appendChild(_speccer_padding_bottom_el);\n }\n\n if (_speccer_el.styles['paddingRight'] !== '0px') {\n const _speccer_padding_right_el = create(css.getNumberValue(_speccer_el.styles.paddingRight));\n\n classnames.set(_speccer_padding_right_el, 'padding right');\n\n styles.add(_speccer_padding_right_el, {\n height: _target_rect.height + 'px',\n width: _speccer_el.styles.paddingRight,\n transform: el.style.transform,\n left:\n _el_offset_left +\n (parseInt(_target_rect.width + '', 10) - parseInt(_speccer_el.styles.paddingRight, 10)) +\n 'px',\n top: _el_offset_top + 'px'\n });\n\n document.body.appendChild(_speccer_padding_right_el);\n }\n\n if (_speccer_el.styles['paddingLeft'] !== '0px') {\n const _speccer_padding_left_el = create(css.getNumberValue(_speccer_el.styles.paddingLeft));\n\n classnames.set(_speccer_padding_left_el, 'padding left');\n\n styles.add(_speccer_padding_left_el, {\n height: _target_rect.height + 'px',\n width: _speccer_el.styles.paddingLeft,\n transform: el.style.transform,\n left: _el_offset_left + 'px',\n top: _el_offset_top + 'px'\n });\n\n document.body.appendChild(_speccer_padding_left_el);\n }\n};\n","export enum SpeccerAreaEnum {\n Empty = '',\n Left = 'left',\n Right = 'right',\n Bottom = 'bottom',\n Top = 'top',\n}\n\nexport enum DissectAreaEnum {\n Outline = 'outline',\n Enclose = 'enclose',\n Full = 'full',\n Left = 'left',\n Right = 'right',\n Bottom = 'bottom',\n Top = 'top',\n}\n","/* eslint no-console:0 */\n'use strict';\n\nexport const decimal = (number: string | number, decimals = 3): string => parseFloat(number + '').toFixed(decimals);\n","/* eslint no-console:0 */\n'use strict';\n\nimport * as styles from '../lib/styles';\nimport * as classnames from '../lib/classnames';\nimport { DissectAreaEnum } from '../enums/area';\nimport * as helpers from '../helpers/dissect';\nimport { SPECCER_LITERALS } from '../lib/constants';\n\nexport const create = (textContent = '', area: string, n = 'span') => {\n const _el = document.createElement(n);\n const _text_node = document.createTextNode(textContent);\n const _extra_class_names = {};\n\n if (area !== null && area !== '') {\n _extra_class_names[area] = true;\n }\n\n if (area.indexOf(DissectAreaEnum.Full) === -1 && area.indexOf(DissectAreaEnum.Enclose) === -1) {\n _el.appendChild(_text_node);\n } else if (area.indexOf(DissectAreaEnum.Full) !== -1 || area.indexOf(DissectAreaEnum.Enclose) !== -1) {\n _el.setAttribute('data-dissection-counter', textContent);\n }\n\n const _class_names = classnames.cx('ph speccer dissection', _extra_class_names);\n\n classnames.set(_el, _class_names);\n\n return _el;\n};\n\nexport const element = async (el: HTMLElement, dissectIndex: number) => {\n if (!el) return;\n\n const _area: string | null = el.getAttribute('data-anatomy') || '';\n\n if (!_area || _area === '') return;\n\n const _dissection_el = create(SPECCER_LITERALS[dissectIndex], _area);\n\n document.body.appendChild(_dissection_el);\n\n const _dissection_styles = helpers.styles(_area, el, _dissection_el);\n\n styles.add(_dissection_el, _dissection_styles);\n};\n","import * as css from '../../lib/css';\nimport * as number from '../../lib/number';\nimport { get_body_correction } from '../../lib/position';\nimport { get_horizontal_center_of_els, get_vertical_center_of_els } from '../../lib/position';\nimport { DissectAreaEnum } from '../../enums/area';\n\nexport const styles = (area: string, el: HTMLElement, dissectionEl: HTMLElement) => {\n const _el_rect = el.getBoundingClientRect();\n const SPECCER_PIN_SPACE = css.pinSpace(dissectionEl);\n const _dissection_el_rect = dissectionEl.getBoundingClientRect();\n const _body_correction = get_body_correction();\n const _el_offset_top = el.offsetTop + _body_correction.top;\n const _el_offset_left = el.offsetLeft + _body_correction.left;\n const _left_layout_position_left = _el_offset_left - _dissection_el_rect.width - SPECCER_PIN_SPACE + 'px';\n const _left_layout_position_top =\n number.decimal(get_vertical_center_of_els(_el_offset_top, _dissection_el_rect, _el_rect)) + 'px';\n const _right_layout_position_left = _el_offset_left + _el_rect.width + SPECCER_PIN_SPACE + 'px';\n const _right_layout_position_top =\n number.decimal(get_vertical_center_of_els(_el_offset_top, _dissection_el_rect, _el_rect)) + 'px';\n const _top_layout_position_left =\n number.decimal(get_horizontal_center_of_els(_el_offset_left, _dissection_el_rect, _el_rect)) + 'px';\n const _top_layout_position_top = _el_offset_top - _dissection_el_rect.height - SPECCER_PIN_SPACE + 'px';\n const _bottom_layout_position_left =\n number.decimal(get_horizontal_center_of_els(_el_offset_left, _dissection_el_rect, _el_rect)) + 'px';\n const _bottom_layout_position_top = _el_offset_top + _el_rect.height + SPECCER_PIN_SPACE + 'px';\n\n let _dissection_styles = {};\n\n if (area.indexOf(DissectAreaEnum.Outline) !== -1) {\n if (area.indexOf(DissectAreaEnum.Left) !== -1) {\n if (area.indexOf(DissectAreaEnum.Full) !== -1) {\n _dissection_styles = {\n left: _el_offset_left - 8 + 'px',\n top: _el_offset_top + -1 + 'px',\n height: _el_rect.height + 'px'\n };\n } else if (area.indexOf(DissectAreaEnum.Enclose) !== -1) {\n _dissection_styles = {\n left: _el_offset_left - 1 + 'px',\n top: _el_offset_top + -1 + 'px',\n height: _el_rect.height + 'px',\n width: _el_rect.width + 'px'\n };\n } else {\n _dissection_styles = {\n left: _left_layout_position_left,\n top: _left_layout_position_top\n };\n }\n } else if (area.indexOf(DissectAreaEnum.Right) !== -1) {\n if (area.indexOf(DissectAreaEnum.Full) !== -1) {\n _dissection_styles = {\n left: _el_offset_left + _el_rect.width + 'px',\n top: _el_offset_top + -1 + 'px',\n height: _el_rect.height + 'px'\n };\n } else if (area.indexOf(DissectAreaEnum.Enclose) !== -1) {\n _dissection_styles = {\n left: _el_offset_left + -1 + 'px',\n top: _el_offset_top + -1 + 'px',\n height: _el_rect.height + 'px',\n width: _el_rect.width + 'px'\n };\n } else {\n _dissection_styles = {\n left: _right_layout_position_left,\n top: _right_layout_position_top\n };\n }\n } else if (area.indexOf(DissectAreaEnum.Top) !== -1) {\n if (area.indexOf(DissectAreaEnum.Full) !== -1) {\n _dissection_styles = {\n top: _el_offset_top + -8 + 'px',\n left: _el_offset_left + -1 + 'px',\n width: _el_rect.width + 'px'\n };\n } else if (area.indexOf(DissectAreaEnum.Enclose) !== -1) {\n _dissection_styles = {\n top: _el_offset_top + -1 + 'px',\n left: _el_offset_left + -1 + 'px',\n height: _el_rect.height + 'px',\n width: _el_rect.width + 'px'\n };\n } else {\n _dissection_styles = {\n left: _top_layout_position_left,\n top: _top_layout_position_top\n };\n }\n } else if (area.indexOf(DissectAreaEnum.Bottom) !== -1) {\n if (area.indexOf(DissectAreaEnum.Full) !== -1) {\n _dissection_styles = {\n top: _el_offset_top + _el_rect.height + 'px',\n left: _el_offset_left + -1 + 'px',\n width: _el_rect.width + 'px'\n };\n } else if (area.indexOf(DissectAreaEnum.Enclose) !== -1) {\n _dissection_styles = {\n top: _el_offset_top + -1 + 'px',\n left: _el_offset_left + -1 + 'px',\n height: _el_rect.height + 'px',\n width: _el_rect.width + 'px'\n };\n } else {\n _dissection_styles = {\n left: _bottom_layout_position_left,\n top: _bottom_layout_position_top\n };\n }\n } else {\n if (area.indexOf(DissectAreaEnum.Full) !== -1) {\n _dissection_styles = {\n left: _el_offset_left + _el_rect.width + 'px',\n top: _el_offset_top + 'px',\n height: _el_rect.height + 'px'\n };\n } else if (area.indexOf(DissectAreaEnum.Enclose) !== -1) {\n _dissection_styles = {\n left: _el_offset_left + _el_rect.width + 'px',\n top: _el_offset_top + -1 + 'px',\n height: _el_rect.height + 'px',\n width: _el_rect.width + 'px'\n };\n } else {\n _dissection_styles = {\n left: _left_layout_position_left,\n top: _left_layout_position_top\n };\n }\n }\n } else {\n if (area.indexOf(DissectAreaEnum.Full) !== -1) {\n _dissection_styles = {\n left: _el_offset_left - 8 + 'px',\n top: _el_offset_top + -1 + 'px',\n height: _el_rect.height + 'px'\n };\n } else if (area.indexOf(DissectAreaEnum.Enclose) !== -1) {\n _dissection_styles = {\n left: _el_offset_left - 1 + 'px',\n top: _el_offset_top + -1 + 'px',\n height: _el_rect.height + 'px',\n width: _el_rect.width + 'px'\n };\n } else {\n _dissection_styles = {\n left: _left_layout_position_left,\n top: _left_layout_position_top\n };\n }\n }\n\n return _dissection_styles;\n};\n","/* eslint no-console:0 */\n'use strict';\n\nimport * as classnames from '../lib/classnames';\nimport * as styles from '../lib/styles';\nimport { get_body_correction } from '../lib/position';\n\nconst create = (text: string | number = '', area: string | null = '', tag = 'span') => {\n const _el = document.createElement(tag);\n\n _el.setAttribute('title', text + 'px');\n _el.setAttribute('data-measure', parseInt(text + '', 10) + 'px');\n\n classnames.set(_el, `ph speccer measure ${area}`);\n\n return _el;\n};\n\nexport const element = (el: HTMLElement) => {\n if (!el) return;\n\n const _el_rect = el.getBoundingClientRect();\n const _area: string | null = el.getAttribute('data-speccer-measure');\n\n if (_area === '' || !_area) {\n return;\n }\n\n const _body_correction = get_body_correction();\n const _el_offset_top = el.offsetTop + _body_correction.top;\n const _el_offset_left = el.offsetLeft + _body_correction.left;\n\n if (_area.indexOf('width') !== -1) {\n if (_area.indexOf('bottom') !== -1) {\n const _measure_el = create(_el_rect.width, 'width bottom');\n\n document.body.appendChild(_measure_el);\n\n styles.add(_measure_el, {\n left: _el_offset_left + 'px',\n top: _el_offset_top + _el_rect.height + 1 + 'px',\n width: _el_rect.width + 'px'\n });\n } else {\n const _measure_el = create(_el_rect.width, 'width top');\n\n document.body.appendChild(_measure_el);\n\n const _measure_rect = _measure_el.getBoundingClientRect();\n\n styles.add(_measure_el, {\n left: _el_offset_left + 'px',\n top: _el_offset_top - _measure_rect.height + 1 + 'px',\n width: _el_rect.width + 'px'\n });\n }\n } else if (_area.indexOf('height') !== -1) {\n if (_area.indexOf('right') !== -1) {\n const _measure_el = create(_el_rect.height, 'height right');\n\n document.body.appendChild(_measure_el);\n\n styles.add(_measure_el, {\n left: _el_offset_left + _el_rect.width + 'px',\n top: _el_offset_top + 'px',\n height: _el_rect.height + 'px'\n });\n } else {\n const _measure_el = create(_el_rect.height, 'height left');\n\n document.body.appendChild(_measure_el);\n\n const _measure_rect = _measure_el.getBoundingClientRect();\n\n styles.add(_measure_el, {\n left: _el_offset_left - _measure_rect.width + 'px',\n top: _el_offset_top + 'px',\n height: _el_rect.height + 'px'\n });\n }\n }\n};\n","import * as css from '../../lib/css';\nimport * as number from '../../lib/number';\nimport { get_body_correction } from '../../lib/position';\nimport { get_horizontal_center_of_els, get_vertical_center_of_els } from '../../lib/position';\nimport { SpeccerAreaEnum } from '../../enums/area';\n\nexport const position = (\n area: string | null,\n el: HTMLElement,\n speccerEl: HTMLElement\n): { left: string; top: string } => {\n const _el_rect = el.getBoundingClientRect();\n const SPECCER_PIN_SPACE = css.pinSpace(speccerEl);\n const _speccer_el_rect = speccerEl.getBoundingClientRect();\n const _body_correction = get_body_correction();\n const _el_offset_top = el.offsetTop + _body_correction.top;\n const _el_offset_left = el.offsetLeft + _body_correction.left;\n const _left_layout_position_left = _el_offset_left - _speccer_el_rect.width - SPECCER_PIN_SPACE + 'px';\n const _left_layout_position_top =\n number.decimal(get_vertical_center_of_els(_el_offset_top, _speccer_el_rect, _el_rect)) + 'px';\n const _right_layout_position_left = _el_offset_left + _el_rect.width + SPECCER_PIN_SPACE + 'px';\n const _right_layout_position_top =\n number.decimal(get_vertical_center_of_els(_el_offset_top, _speccer_el_rect, _el_rect)) + 'px';\n const _top_layout_position_left =\n number.decimal(get_horizontal_center_of_els(_el_offset_left, _speccer_el_rect, _el_rect)) + 'px';\n const _top_layout_position_top = _el_offset_top - _speccer_el_rect.height - SPECCER_PIN_SPACE + 'px';\n const _bottom_layout_position_left =\n number.decimal(get_horizontal_center_of_els(_el_offset_left, _speccer_el_rect, _el_rect)) + 'px';\n const _bottom_layout_position_top = _el_offset_top + _el_rect.height + SPECCER_PIN_SPACE + 'px';\n\n let _position = {\n left: _left_layout_position_left,\n top: _left_layout_position_top\n };\n\n if (area && area.indexOf(SpeccerAreaEnum.Right) !== -1) {\n _position = {\n left: _right_layout_position_left,\n top: _right_layout_position_top\n };\n } else if (area && area.indexOf(SpeccerAreaEnum.Top) !== -1) {\n _position = {\n left: _top_layout_position_left,\n top: _top_layout_position_top\n };\n } else if (area && area.indexOf(SpeccerAreaEnum.Bottom) !== -1) {\n _position = {\n left: _bottom_layout_position_left,\n top: _bottom_layout_position_top\n };\n }\n\n return _position;\n};\n","/* eslint no-console:0 */\n'use strict';\n\nimport * as classnames from '../lib/classnames';\nimport * as styles from '../lib/styles';\nimport * as helpers from '../helpers/typography';\n\nexport const create = (html: string, area: string | null) => {\n const _el = document.createElement('div');\n const _extra_class_names = {};\n\n if (area !== null && area !== '') {\n _extra_class_names[area] = true;\n }\n\n const _class_names = classnames.cx('ph speccer typography', _extra_class_names);\n\n _el.innerHTML = html;\n\n classnames.set(_el, _class_names);\n\n return _el;\n};\n\nexport const element = async (el: HTMLElement) => {\n if (!el) return;\n\n const _area: string | null = el.getAttribute('data-speccer-typography');\n const _el_style = await styles.get(el);\n\n if (_el_style.display === 'none' || _el_style.visibility === 'hidden' || !el.parentElement) {\n return;\n }\n\n el.classList.add('is-specced');\n\n const _html = await helpers.template(el);\n const _speccer_el = create(_html, _area);\n\n document.body.appendChild(_speccer_el);\n\n const _position = helpers.position(_area, el, _speccer_el);\n\n styles.add(_speccer_el, _position);\n};\n","/* eslint no-console:0 */\n'use strict';\n\nimport debounce from './debounce';\n\nexport const activate = (speccer: Function) => {\n const speccerEventFunc = () =>\n debounce(() => {\n speccer();\n }, 300);\n\n window.removeEventListener('resize', speccerEventFunc);\n window.addEventListener('resize', speccerEventFunc);\n};\n","/* eslint no-console:0 */\n'use strict';\n\nimport * as resize from './lib/resize';\nimport * as spec from './tasks/spec';\nimport * as measure from './tasks/measure';\nimport * as dissect from './tasks/dissect';\n\nexport const dom = (speccer: Function) => {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n speccer();\n });\n } else {\n // `DOMContentLoaded` already fired\n speccer();\n }\n};\n\nexport const lazy = () => {\n const _spec_observer = new IntersectionObserver((els, observer) => {\n els.forEach((el: IntersectionObserverEntry) => {\n if (el.intersectionRatio > 0) {\n spec.element(el.target as HTMLElement);\n observer.unobserve(el.target);\n }\n });\n });\n\n document.querySelectorAll('[data-speccer],[data-speccer] *:not(td)').forEach((el) => {\n _spec_observer.observe(el);\n });\n\n const _measure_observer = new IntersectionObserver((els, observer) => {\n els.forEach((el) => {\n if (el.intersectionRatio > 0) {\n measure.element(el.target as HTMLElement);\n observer.unobserve(el.target);\n }\n });\n });\n\n document.querySelectorAll('[data-speccer-measure]').forEach((el) => {\n _measure_observer.observe(el);\n });\n\n const _dissect_observer = new IntersectionObserver((els, observer) => {\n els.forEach((el) => {\n const targets = el.target.querySelectorAll('[data-anatomy]');\n\n if (el.intersectionRatio > 0) {\n targets.forEach(dissect.element);\n observer.unobserve(el.target);\n }\n });\n });\n\n document.querySelectorAll('[data-anatomy-section]').forEach((el) => {\n _dissect_observer.observe(el);\n });\n};\n\nexport const manual = (speccer: Function) => {\n window.speccer = speccer;\n};\n\nexport const activate = (speccer: Function) => {\n const _script = document.currentScript;\n\n if (_script) {\n const _speccer_script_src = _script.getAttribute('src');\n\n if (\n _speccer_script_src &&\n (_speccer_script_src.indexOf('speccer.js') !== -1 ||\n // for codepen\n _speccer_script_src.indexOf('JaXpOK.js') !== -1)\n ) {\n if (_script.hasAttribute('data-manual')) {\n manual(speccer);\n } else if (_script.hasAttribute('data-instant')) {\n speccer();\n } else if (_script.hasAttribute('data-dom')) {\n dom(speccer);\n } else if (_script.hasAttribute('data-lazy')) {\n lazy();\n } else {\n dom(speccer);\n }\n\n if (!_script.hasAttribute('data-manual') && !_script.hasAttribute('data-lazy')) {\n resize.activate(speccer);\n }\n }\n }\n};\n","/* eslint no-console:0 */\n'use strict';\n\nimport './interfaces/global';\nimport * as __node from './lib/node';\nimport * as __spacing from './tasks/spec';\nimport * as __dissect from './tasks/dissect';\nimport * as __measure from './tasks/measure';\nimport * as __typography from './tasks/typography';\nimport * as __browser from './browser';\n\nexport const spacing = __spacing;\n\nexport const dissect = __dissect;\n\nexport const measure = __measure;\n\nexport const typography = __typography;\n\nconst speccer = () => {\n __node.removeAll('.speccer');\n\n const _els_to_be_specced = document.querySelectorAll('[data-speccer],[data-speccer] *:not(td)');\n const _els_to_be_measured = document.querySelectorAll('[data-speccer-measure]');\n const _els_to_be_typography_specced = document.querySelectorAll('[data-speccer-typography]');\n const _els_to_be_dissected = document.querySelectorAll('[data-anatomy-section] [data-anatomy]');\n\n _els_to_be_specced.forEach(spacing.element);\n _els_to_be_measured.forEach(measure.element);\n _els_to_be_typography_specced.forEach(typography.element);\n _els_to_be_dissected.forEach(dissect.element);\n};\n\nexport default speccer;\n\n__browser.activate(speccer);\n","import * as css from '../../lib/css';\nimport * as styles from '../../lib/styles';\n\nexport const template = async (el: HTMLElement): Promise<string> => {\n const _el_styles = await styles.get(el);\n const _styles = css.getTypography(_el_styles);\n\n return (\n `\n` +\n 'font-styles: {' +\n '<ul class=\"speccer-styles\">' +\n ` <li><span class=\"property\">font-family:</span> ${_styles['fontFamily']};</li>` +\n ` <li><span class=\"property\">font-size:</span> ${_styles['fontSize']} / ${\n parseInt(_styles['fontSize'], 10) / 16\n }rem;</li>` +\n ` <li><span class=\"property\">font-weight:</span> ${_styles['fontWeight']};</li>` +\n ` <li><span class=\"property\">font-variation-settings:</span> ${_styles['fontVariationSettings']};</li>` +\n ` <li><span class=\"property\">line-height:</span> ${_styles['lineHeight']} / ${\n parseInt(_styles['lineHeight'], 10) / 16\n }rem;</li>` +\n ` <li><span class=\"property\">letter-spacing:</span> ${_styles['letterSpacing']};</li>` +\n ` <li><span class=\"property\">font-style:</span> ${_styles['fontStyle']};</li>` +\n '</ul>' +\n '}'\n );\n};\n"],"names":["set","el","cls","avoid","length","trim","split","filter","cl","forEach","classList","add","cx","cls_obj","Object","keys","classname","join","SPECCER_LITERALS","getNumberValue","value","parseInt","pinSpace","getComputedStyle","getPropertyValue","waitForFrame","Promise","requestAnimationFrame","async","styles","Array","isArray","constructor","style","key","get","get_horizontal_center_of_els","modifier","startRect","targetRect","width","get_vertical_center_of_els","height","get_body_correction","_body_style","document","body","_body_left_correction","paddingLeft","marginLeft","top","paddingTop","marginTop","left","create","text","tag","_el","createElement","_text_content","createTextNode","appendChild","setAttribute","classnames.set","element","_speccer_el","_el_style","styles.get","display","visibility","parentElement","marginBottom","marginRight","paddingBottom","paddingRight","css.getSpacing","_target_rect","getBoundingClientRect","_body_correction","_el_offset_top","offsetTop","_el_offset_left","offsetLeft","_speccer_margin_top_el","css.getNumberValue","styles.add","transform","_speccer_margin_right_el","_speccer_margin_bottom_el","_speccer_margin_left_el","_speccer_padding_top_el","_speccer_padding_bottom_el","_speccer_padding_right_el","_speccer_padding_left_el","SpeccerAreaEnum","DissectAreaEnum","decimal","number","decimals","parseFloat","toFixed","textContent","area","n","_text_node","_extra_class_names","indexOf","Full","Enclose","_class_names","classnames.cx","dissectIndex","_area","getAttribute","_dissection_el","_dissection_styles","dissectionEl","_el_rect","SPECCER_PIN_SPACE","css.pinSpace","_dissection_el_rect","_left_layout_position_left","_left_layout_position_top","number.decimal","_right_layout_position_left","_right_layout_position_top","_top_layout_position_left","_top_layout_position_top","_bottom_layout_position_left","_bottom_layout_position_top","Outline","Left","Right","Top","Bottom","helpers.styles","_measure_el","_measure_rect","html","innerHTML","activate","speccer","speccerEventFunc","func","wait","immediate","timeout","context","this","args","arguments","later","apply","callNow","clearTimeout","setTimeout","debounce","window","removeEventListener","addEventListener","dom","readyState","spacing","__spacing","dissect","measure","typography","_html","_styles","lineHeight","letterSpacing","fontFamily","fontSize","fontStyle","fontVariationSettings","fontWeight","css.getTypography","helpers.template","_position","speccerEl","_speccer_el_rect","helpers.position","selector","call","querySelectorAll","e","remove","__node.removeAll","_els_to_be_specced","_els_to_be_measured","_els_to_be_typography_specced","_els_to_be_dissected","_script","currentScript","_speccer_script_src","hasAttribute","manual","_spec_observer","IntersectionObserver","els","observer","intersectionRatio","spec.element","target","unobserve","observe","_measure_observer","measure.element","_dissect_observer","targets","dissect.element","lazy","resize.activate"],"mappings":"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"}