@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.
- package/CHANGELOG.md +19 -0
- package/dts/browser.d.ts +4 -0
- package/dts/enums/area.d.ts +16 -0
- package/dts/helpers/dissect/index.d.ts +1 -0
- package/dts/helpers/dissect/styles.d.ts +1 -0
- package/dts/helpers/typography/index.d.ts +2 -0
- package/dts/helpers/typography/position.d.ts +4 -0
- package/dts/helpers/typography/template.d.ts +1 -0
- package/dts/index.d.ts +53 -0
- package/dts/interfaces/global.d.ts +6 -0
- package/dts/lib/attributes.d.ts +2 -0
- package/dts/lib/classnames.d.ts +4 -0
- package/dts/lib/constants.d.ts +3 -0
- package/dts/lib/css.d.ts +6 -0
- package/dts/lib/debounce.d.ts +3 -0
- package/dts/lib/node.d.ts +2 -0
- package/dts/lib/number.d.ts +1 -0
- package/dts/lib/position.d.ts +6 -0
- package/dts/lib/resize.d.ts +1 -0
- package/dts/lib/styles.d.ts +2 -0
- package/dts/tasks/dissect.d.ts +2 -0
- package/dts/tasks/index.d.ts +4 -0
- package/dts/tasks/measure.d.ts +1 -0
- package/dts/tasks/spec.d.ts +2 -0
- package/dts/tasks/typography.d.ts +2 -0
- package/dts/types/css.d.ts +19 -0
- package/dts/types/speccer.d.ts +5 -0
- package/package.json +10 -3
- package/speccer.css +16 -19
- package/speccer.js +2 -1
- package/speccer.js.map +1 -0
- package/speccer.min.css +1 -1
- package/src/{browser.js → browser.ts} +16 -13
- package/src/enums/area.ts +17 -0
- package/src/helpers/dissect/index.ts +1 -0
- package/src/helpers/dissect/styles.ts +154 -0
- package/src/helpers/typography/index.ts +3 -0
- package/src/helpers/typography/position.ts +54 -0
- package/src/helpers/typography/template.ts +27 -0
- package/src/{index.js → index.ts} +17 -17
- package/src/interfaces/global.ts +7 -0
- package/src/lib/attributes.ts +18 -0
- package/src/lib/classnames.ts +43 -0
- package/src/lib/{constants.js → constants.ts} +3 -0
- package/src/lib/css.ts +45 -0
- package/src/lib/debounce.ts +29 -0
- package/src/lib/node.ts +8 -0
- package/src/lib/number.ts +4 -0
- package/src/lib/position.ts +16 -0
- package/src/lib/{resize.js → resize.ts} +5 -4
- package/src/lib/styles.ts +31 -0
- package/src/styles/index.styl +4 -0
- package/src/styles/spacing.styl +0 -10
- package/src/styles/typography.styl +11 -12
- package/src/tasks/dissect.ts +46 -0
- package/src/tasks/index.ts +7 -0
- package/src/tasks/measure.ts +82 -0
- package/src/tasks/spec.ts +170 -0
- package/src/tasks/typography.ts +45 -0
- package/src/types/css.ts +20 -0
- package/src/types/speccer.ts +6 -0
- package/tsconfig.json +21 -0
- package/tslint.json +23 -0
- package/src/dissect.js +0 -211
- package/src/lib/attributes.js +0 -13
- package/src/lib/classnames.js +0 -37
- package/src/lib/css.js +0 -37
- package/src/lib/debounce.js +0 -22
- package/src/lib/node.js +0 -7
- package/src/lib/number.js +0 -4
- package/src/lib/styles.js +0 -27
- package/src/measure.js +0 -99
- package/src/spec.js +0 -214
- 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
|
|
package/dts/browser.d.ts
ADDED
|
@@ -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 @@
|
|
|
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,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;
|
package/dts/lib/css.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
1
|
+
export declare const element: (el: HTMLElement) => 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
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@phun-ky/speccer",
|
|
3
|
-
"version": "
|
|
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
|
-
"
|
|
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:
|
|
444
|
-
padding: 8px
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
506
|
-
font-size:
|
|
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:
|
|
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:
|
|
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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"}
|