@phun-ky/speccer 6.0.4 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -98,6 +98,18 @@ In your component examples, use the following attribute:
98
98
 
99
99
  Where `height` and `width` comes with placement flags. Default for `height` is `left`, default for `width` is `top`.
100
100
 
101
+ #### Subtle
102
+
103
+ ![Image of subtle option for measure](./assets/subtle-measure.png)
104
+
105
+ You can also give a more subtle touch to the measure elements.
106
+
107
+ ```html
108
+ <div data-speccer-measure="height left subtle" class="..."></div>
109
+ ```
110
+
111
+ This will give a dashed border.
112
+
101
113
  ### Highlight the anatomy of an element
102
114
 
103
115
  ![Image of speccer](./assets/anatomy.png)
@@ -112,6 +124,20 @@ In your component examples, use the following attribute. Remember to use the `da
112
124
 
113
125
  This will place a pin to the outline of the element. Default is `top`.
114
126
 
127
+ #### Subtle
128
+
129
+ ![Image of subtle option for anatomy](./assets/subtle.png)
130
+
131
+ You can also give a more subtle touch to the anatomy elements.
132
+
133
+ ```html
134
+ <div data-anatomy-section>
135
+ <div data-anatomy="outline top subtle" class="..."></div>
136
+ </div>
137
+ ```
138
+
139
+ This will give a dashed border, and a more subtle pin style.
140
+
115
141
  ### Element typogpraphy
116
142
 
117
143
  ![Image of speccer](./assets/typography.png)
@@ -165,7 +191,7 @@ document.querySelectorAll('[data-anatomy-section]').forEach((el) => {
165
191
 
166
192
  ## Customization
167
193
 
168
- You can use the provided CSS variables to customize the look and feel, to a point.
194
+ You can use the provided CSS variables to customize the look and feel. If more control is needed, you can use CSS overrides :)
169
195
 
170
196
  ```css
171
197
  .ph.speccer {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phun-ky/speccer",
3
- "version": "6.0.4",
3
+ "version": "6.2.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": {
package/speccer.css CHANGED
@@ -55,7 +55,7 @@
55
55
  z-index: 100000;
56
56
  box-sizing: content-box;
57
57
  }
58
- .ph.speccer.dissection:after {
58
+ .ph.speccer.dissection::after {
59
59
  content: "";
60
60
  position: absolute;
61
61
  height: var(--ph-speccer-pin-space);
@@ -64,32 +64,32 @@
64
64
  background-color: var(--ph-speccer-pin-color);
65
65
  z-index: 99999;
66
66
  }
67
- .ph.speccer.dissection.outline:after,
68
- .ph.speccer.dissection.outline.top:after {
67
+ .ph.speccer.dissection.outline::after,
68
+ .ph.speccer.dissection.outline.top::after {
69
69
  height: var(--ph-speccer-pin-space);
70
70
  width: var(--ph-speccer-line-width);
71
71
  top: 100%;
72
72
  right: 50%;
73
73
  }
74
- .ph.speccer.dissection.outline.left:after {
74
+ .ph.speccer.dissection.outline.left::after {
75
75
  height: var(--ph-speccer-line-width);
76
76
  width: var(--ph-speccer-pin-space);
77
77
  top: 50%;
78
78
  left: 100%;
79
79
  }
80
- .ph.speccer.dissection.outline.right:after {
80
+ .ph.speccer.dissection.outline.right::after {
81
81
  height: var(--ph-speccer-line-width);
82
82
  width: var(--ph-speccer-pin-space);
83
83
  top: 50%;
84
84
  right: 100%;
85
85
  }
86
- .ph.speccer.dissection.outline.bottom:after {
86
+ .ph.speccer.dissection.outline.bottom::after {
87
87
  height: var(--ph-speccer-pin-space);
88
88
  width: var(--ph-speccer-line-width);
89
89
  top: calc(-100% - (var(--ph-speccer-pin-space) / 2));
90
90
  right: 50%;
91
91
  }
92
- .ph.speccer.dissection:after {
92
+ .ph.speccer.dissection::after {
93
93
  content: "";
94
94
  position: absolute;
95
95
  height: var(--ph-speccer-pin-space);
@@ -98,13 +98,13 @@
98
98
  background-color: var(--ph-speccer-pin-color);
99
99
  z-index: 99999;
100
100
  }
101
- .ph.speccer.dissection.outline.left:after {
101
+ .ph.speccer.dissection.outline.left::after {
102
102
  height: var(--ph-speccer-line-width);
103
103
  width: var(--ph-speccer-pin-space);
104
104
  top: 50%;
105
105
  left: 100%;
106
106
  }
107
- .ph.speccer.dissection.outline.right:after {
107
+ .ph.speccer.dissection.outline.right::after {
108
108
  height: var(--ph-speccer-line-width);
109
109
  width: var(--ph-speccer-pin-space);
110
110
  top: 50%;
@@ -116,35 +116,35 @@
116
116
  color: var(--ph-speccer-measure-color);
117
117
  border: var(--ph-speccer-line-width) solid var(--ph-speccer-pin-color);
118
118
  }
119
- .ph.speccer.dissection.outline.enclose.right:after {
119
+ .ph.speccer.dissection.outline.enclose.right::after {
120
120
  left: calc(100% + calc(var(--ph-speccer-pin-space) + var(--ph-speccer-line-width)));
121
121
  right: auto;
122
122
  }
123
- .ph.speccer.dissection.outline.enclose.right:before {
123
+ .ph.speccer.dissection.outline.enclose.right::before {
124
124
  left: 100%;
125
125
  right: auto;
126
126
  }
127
- .ph.speccer.dissection.outline.enclose.left:after {
127
+ .ph.speccer.dissection.outline.enclose.left::after {
128
128
  left: calc(var(--ph-speccer-line-width-negative) - var(--ph-speccer-pin-size) - var(--ph-speccer-pin-space));
129
129
  right: auto;
130
130
  }
131
- .ph.speccer.dissection.outline.enclose.left:before {
131
+ .ph.speccer.dissection.outline.enclose.left::before {
132
132
  right: 100%;
133
133
  left: auto;
134
134
  }
135
- .ph.speccer.dissection.outline.enclose.top:after {
135
+ .ph.speccer.dissection.outline.enclose.top::after {
136
136
  top: calc(var(--ph-speccer-line-width-negative) - var(--ph-speccer-pin-size) - var(--ph-speccer-pin-space));
137
137
  bottom: auto;
138
138
  }
139
- .ph.speccer.dissection.outline.enclose.top:before {
139
+ .ph.speccer.dissection.outline.enclose.top::before {
140
140
  bottom: 100%;
141
141
  top: auto;
142
142
  }
143
- .ph.speccer.dissection.outline.enclose.bottom:after {
143
+ .ph.speccer.dissection.outline.enclose.bottom::after {
144
144
  top: calc(100% + calc(var(--ph-speccer-pin-space) + var(--ph-speccer-line-width)));
145
145
  bottom: auto;
146
146
  }
147
- .ph.speccer.dissection.outline.enclose.bottom:before {
147
+ .ph.speccer.dissection.outline.enclose.bottom::before {
148
148
  top: 100%;
149
149
  bottom: auto;
150
150
  }
@@ -157,47 +157,47 @@
157
157
  .ph.speccer.dissection.outline.full.right {
158
158
  border-left: none;
159
159
  }
160
- .ph.speccer.dissection.outline.full.right:after {
160
+ .ph.speccer.dissection.outline.full.right::after {
161
161
  left: calc(8px + var(--ph-speccer-pin-space));
162
162
  }
163
- .ph.speccer.dissection.outline.full.right:before {
163
+ .ph.speccer.dissection.outline.full.right::before {
164
164
  left: 100%;
165
165
  }
166
166
  .ph.speccer.dissection.outline.full.left {
167
167
  border-right: none;
168
168
  }
169
- .ph.speccer.dissection.outline.full.left:after {
169
+ .ph.speccer.dissection.outline.full.left::after {
170
170
  left: calc(-8px - var(--ph-speccer-pin-space));
171
171
  }
172
- .ph.speccer.dissection.outline.full.left:before {
172
+ .ph.speccer.dissection.outline.full.left::before {
173
173
  right: 100%;
174
174
  }
175
175
  .ph.speccer.dissection.outline.full.top {
176
176
  border-bottom: none;
177
177
  }
178
- .ph.speccer.dissection.outline.full.top:after {
178
+ .ph.speccer.dissection.outline.full.top::after {
179
179
  top: calc(-8px - var(--ph-speccer-pin-space));
180
180
  }
181
- .ph.speccer.dissection.outline.full.top:before {
181
+ .ph.speccer.dissection.outline.full.top::before {
182
182
  bottom: 100%;
183
183
  }
184
184
  .ph.speccer.dissection.outline.full.bottom {
185
185
  border-top: none;
186
186
  }
187
- .ph.speccer.dissection.outline.full.bottom:after {
187
+ .ph.speccer.dissection.outline.full.bottom::after {
188
188
  top: calc(8px + var(--ph-speccer-pin-space));
189
189
  }
190
- .ph.speccer.dissection.outline.full.bottom:before {
190
+ .ph.speccer.dissection.outline.full.bottom::before {
191
191
  top: 100%;
192
192
  }
193
- .ph.speccer.dissection.outline.bottom:after {
193
+ .ph.speccer.dissection.outline.bottom::after {
194
194
  height: var(--ph-speccer-pin-space);
195
195
  width: var(--ph-speccer-line-width);
196
196
  top: calc(-100% - (var(--ph-speccer-pin-space) / 2));
197
197
  right: 50%;
198
198
  }
199
- .ph.speccer.dissection.outline.top:after,
200
- .ph.speccer.dissection.outline:after {
199
+ .ph.speccer.dissection.outline.top::after,
200
+ .ph.speccer.dissection.outline::after {
201
201
  height: var(--ph-speccer-pin-space);
202
202
  width: var(--ph-speccer-line-width);
203
203
  top: 100%;
@@ -214,10 +214,10 @@
214
214
  .ph.speccer.dissection.outline.full.bottom {
215
215
  height: 8px;
216
216
  }
217
- .ph.speccer.dissection.outline.full.right:after,
218
- .ph.speccer.dissection.outline.full.left:after,
219
- .ph.speccer.dissection.outline.full.top:after,
220
- .ph.speccer.dissection.outline.full.bottom:after {
217
+ .ph.speccer.dissection.outline.full.right::after,
218
+ .ph.speccer.dissection.outline.full.left::after,
219
+ .ph.speccer.dissection.outline.full.top::after,
220
+ .ph.speccer.dissection.outline.full.bottom::after {
221
221
  content: attr(data-dissection-counter);
222
222
  height: var(--ph-speccer-pin-size);
223
223
  width: var(--ph-speccer-pin-size);
@@ -232,35 +232,35 @@
232
232
  font-size: 16px;
233
233
  z-index: 100000;
234
234
  }
235
- .ph.speccer.dissection.outline.full.right:after,
236
- .ph.speccer.dissection.outline.full.left:after {
235
+ .ph.speccer.dissection.outline.full.right::after,
236
+ .ph.speccer.dissection.outline.full.left::after {
237
237
  top: 50%;
238
238
  transform: translateY(-50%);
239
239
  }
240
- .ph.speccer.dissection.outline.full.top:after,
241
- .ph.speccer.dissection.outline.full.bottom:after {
240
+ .ph.speccer.dissection.outline.full.top::after,
241
+ .ph.speccer.dissection.outline.full.bottom::after {
242
242
  left: 50%;
243
243
  transform: translateX(-50%);
244
244
  }
245
- .ph.speccer.dissection.outline.full.right:before,
246
- .ph.speccer.dissection.outline.full.left:before,
247
- .ph.speccer.dissection.outline.full.top:before,
248
- .ph.speccer.dissection.outline.full.bottom:before {
245
+ .ph.speccer.dissection.outline.full.right::before,
246
+ .ph.speccer.dissection.outline.full.left::before,
247
+ .ph.speccer.dissection.outline.full.top::before,
248
+ .ph.speccer.dissection.outline.full.bottom::before {
249
249
  content: "";
250
250
  position: absolute;
251
251
  background-color: var(--ph-speccer-pin-color);
252
252
  z-index: 100000;
253
253
  display: block;
254
254
  }
255
- .ph.speccer.dissection.outline.full.right:before,
256
- .ph.speccer.dissection.outline.full.left:before {
255
+ .ph.speccer.dissection.outline.full.right::before,
256
+ .ph.speccer.dissection.outline.full.left::before {
257
257
  top: 50%;
258
258
  transform: translateY(-50%);
259
259
  height: var(--ph-speccer-line-width);
260
260
  width: calc(var(--ph-speccer-pin-space) + var(--ph-speccer-line-width));
261
261
  }
262
- .ph.speccer.dissection.outline.full.top:before,
263
- .ph.speccer.dissection.outline.full.bottom:before {
262
+ .ph.speccer.dissection.outline.full.top::before,
263
+ .ph.speccer.dissection.outline.full.bottom::before {
264
264
  left: 50%;
265
265
  transform: translateX(-50%);
266
266
  width: var(--ph-speccer-line-width);
@@ -274,10 +274,10 @@
274
274
  .ph.speccer.dissection.outline.enclose.bottom {
275
275
  height: 8px;
276
276
  }
277
- .ph.speccer.dissection.outline.enclose.right:after,
278
- .ph.speccer.dissection.outline.enclose.left:after,
279
- .ph.speccer.dissection.outline.enclose.top:after,
280
- .ph.speccer.dissection.outline.enclose.bottom:after {
277
+ .ph.speccer.dissection.outline.enclose.right::after,
278
+ .ph.speccer.dissection.outline.enclose.left::after,
279
+ .ph.speccer.dissection.outline.enclose.top::after,
280
+ .ph.speccer.dissection.outline.enclose.bottom::after {
281
281
  content: attr(data-dissection-counter);
282
282
  height: var(--ph-speccer-pin-size);
283
283
  width: var(--ph-speccer-pin-size);
@@ -292,40 +292,116 @@
292
292
  font-size: 16px;
293
293
  z-index: 100000;
294
294
  }
295
- .ph.speccer.dissection.outline.enclose.right:after,
296
- .ph.speccer.dissection.outline.enclose.left:after {
295
+ .ph.speccer.dissection.outline.enclose.right::after,
296
+ .ph.speccer.dissection.outline.enclose.left::after {
297
297
  top: 50%;
298
298
  transform: translateY(-50%);
299
299
  }
300
- .ph.speccer.dissection.outline.enclose.top:after,
301
- .ph.speccer.dissection.outline.enclose.bottom:after {
300
+ .ph.speccer.dissection.outline.enclose.top::after,
301
+ .ph.speccer.dissection.outline.enclose.bottom::after {
302
302
  left: 50%;
303
303
  transform: translateX(-50%);
304
304
  }
305
- .ph.speccer.dissection.outline.enclose.right:before,
306
- .ph.speccer.dissection.outline.enclose.left:before,
307
- .ph.speccer.dissection.outline.enclose.top:before,
308
- .ph.speccer.dissection.outline.enclose.bottom:before {
305
+ .ph.speccer.dissection.outline.enclose.right::before,
306
+ .ph.speccer.dissection.outline.enclose.left::before,
307
+ .ph.speccer.dissection.outline.enclose.top::before,
308
+ .ph.speccer.dissection.outline.enclose.bottom::before {
309
309
  content: "";
310
310
  position: absolute;
311
311
  background-color: var(--ph-speccer-pin-color);
312
312
  z-index: 100000;
313
313
  display: block;
314
314
  }
315
- .ph.speccer.dissection.outline.enclose.right:before,
316
- .ph.speccer.dissection.outline.enclose.left:before {
315
+ .ph.speccer.dissection.outline.enclose.right::before,
316
+ .ph.speccer.dissection.outline.enclose.left::before {
317
317
  top: 50%;
318
318
  transform: translateY(-50%);
319
319
  height: var(--ph-speccer-line-width);
320
320
  width: calc(var(--ph-speccer-pin-space) + var(--ph-speccer-line-width));
321
321
  }
322
- .ph.speccer.dissection.outline.enclose.top:before,
323
- .ph.speccer.dissection.outline.enclose.bottom:before {
322
+ .ph.speccer.dissection.outline.enclose.top::before,
323
+ .ph.speccer.dissection.outline.enclose.bottom::before {
324
324
  left: 50%;
325
325
  transform: translateX(-50%);
326
326
  width: var(--ph-speccer-line-width);
327
327
  height: calc(var(--ph-speccer-pin-space) + var(--ph-speccer-line-width));
328
328
  }
329
+ .ph.speccer.dissection.outline.subtle {
330
+ border: var(--ph-speccer-line-width) solid var(--ph-speccer-pin-color);
331
+ background-color: var(--ph-speccer-color-text-light);
332
+ color: var(--ph-speccer-pin-color);
333
+ }
334
+ .ph.speccer.dissection.outline.subtle.top::after,
335
+ .ph.speccer.dissection.outline.subtle.bottom::after {
336
+ width: 0;
337
+ background-color: transparent;
338
+ border-right: var(--ph-speccer-line-width) dashed var(--ph-speccer-pin-color);
339
+ }
340
+ .ph.speccer.dissection.outline.subtle.right::after,
341
+ .ph.speccer.dissection.outline.subtle.left::after {
342
+ height: 0;
343
+ background-color: transparent;
344
+ border-top: var(--ph-speccer-line-width) dashed var(--ph-speccer-pin-color);
345
+ }
346
+ .ph.speccer.dissection.outline.full.subtle {
347
+ border-width: var(--ph-speccer-line-width);
348
+ border-style: dashed;
349
+ border-color: var(--ph-speccer-pin-color);
350
+ background-color: transparent;
351
+ }
352
+ .ph.speccer.dissection.outline.full.subtle.top {
353
+ border-bottom: none;
354
+ }
355
+ .ph.speccer.dissection.outline.full.subtle.bottom {
356
+ border-top: none;
357
+ }
358
+ .ph.speccer.dissection.outline.full.subtle.right {
359
+ border-left: none;
360
+ }
361
+ .ph.speccer.dissection.outline.full.subtle.left {
362
+ border-right: none;
363
+ }
364
+ .ph.speccer.dissection.outline.full.subtle::after {
365
+ height: var(--ph-speccer-pin-size);
366
+ width: var(--ph-speccer-pin-size);
367
+ border: var(--ph-speccer-line-width) solid var(--ph-speccer-pin-color);
368
+ background-color: var(--ph-speccer-color-text-light);
369
+ color: var(--ph-speccer-pin-color);
370
+ }
371
+ .ph.speccer.dissection.outline.full.subtle.top::before,
372
+ .ph.speccer.dissection.outline.full.subtle.bottom::before {
373
+ width: 0;
374
+ background-color: transparent;
375
+ border-right: var(--ph-speccer-line-width) dashed var(--ph-speccer-pin-color);
376
+ }
377
+ .ph.speccer.dissection.outline.full.subtle.right::before,
378
+ .ph.speccer.dissection.outline.full.subtle.left::before {
379
+ height: 0;
380
+ background-color: transparent;
381
+ border-top: var(--ph-speccer-line-width) dashed var(--ph-speccer-pin-color);
382
+ }
383
+ .ph.speccer.dissection.outline.enclose.subtle {
384
+ border-style: dashed;
385
+ }
386
+ .ph.speccer.dissection.outline.enclose.subtle::after {
387
+ height: var(--ph-speccer-pin-size);
388
+ width: var(--ph-speccer-pin-size);
389
+ border: var(--ph-speccer-line-width) solid var(--ph-speccer-pin-color);
390
+ background-color: var(--ph-speccer-color-text-light);
391
+ color: var(--ph-speccer-pin-color);
392
+ }
393
+ .ph.speccer.dissection.outline.enclose.subtle.top::before,
394
+ .ph.speccer.dissection.outline.enclose.subtle.bottom::before {
395
+ width: 0;
396
+ background-color: transparent;
397
+ border-right: var(--ph-speccer-line-width) dashed var(--ph-speccer-pin-color);
398
+ }
399
+ .ph.speccer.dissection.outline.enclose.subtle.right::before,
400
+ .ph.speccer.dissection.outline.enclose.subtle.left::before {
401
+ height: 0;
402
+ background-color: transparent;
403
+ border-top: var(--ph-speccer-line-width) dashed var(--ph-speccer-pin-color);
404
+ }
329
405
  .ph.speccer.spacing {
330
406
  pointer-events: auto;
331
407
  transition: none;
@@ -572,3 +648,21 @@
572
648
  left: calc(100% - var(--ph-speccer-measure-size));
573
649
  transform: translateY(-50%) rotate(90deg);
574
650
  }
651
+ .ph.speccer.measure.subtle.width.top,
652
+ .ph.speccer.measure.subtle.width.bottom,
653
+ .ph.speccer.measure.subtle.height.right,
654
+ .ph.speccer.measure.subtle.height.left {
655
+ border-style: dashed;
656
+ }
657
+ .ph.speccer.measure.subtle.width.top {
658
+ border-bottom: none;
659
+ }
660
+ .ph.speccer.measure.subtle.width.bottom {
661
+ border-top: none;
662
+ }
663
+ .ph.speccer.measure.subtle.height.right {
664
+ border-left: none;
665
+ }
666
+ .ph.speccer.measure.subtle.height.left {
667
+ border-right: none;
668
+ }
package/speccer.js CHANGED
@@ -1,2 +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,i="noop")=>{t&&(!e||e&&0===e.length||e.trim().split(" ").filter((t=>t!==i)).forEach((e=>t.classList.add(e))))},i=(t,e)=>`${t} ${Object.keys(e).filter((t=>e[t])).join(" ")}`.trim(),n=[..."ABCDEFGHIJKLMNOPQRSTUVWXYZ"],o=t=>parseInt(t,10),p=t=>o(getComputedStyle(t).getPropertyValue("--ph-speccer-pin-space"))||48,a=()=>new Promise(requestAnimationFrame),l=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 a(),Array.isArray(e)?e.forEach((e=>t.style[e.key]=e.value)):Object.keys(e).forEach((i=>t.style[i]=e[i])))},r=async t=>(await a(),getComputedStyle(t,null)),d=(t,e,i)=>t-e.width/2+i.width/2,s=(t,e,i)=>t-e.height/2+i.height/2,c=async t=>{await a();const e=t.getBoundingClientRect();return{top:e.top+window.pageYOffset,left:e.left+window.pageXOffset}},h=(t="",i="span")=>{const n=document.createElement(i),o=document.createTextNode(t+"");return n.appendChild(o),n.setAttribute("title",t+"px"),e(n,"ph speccer spacing"),n},f=async t=>{if(!t)return;const i=await r(t);if("none"===i.display||"0"===i.opacity||"hidden"===i.visibility)return;const n=(t=>{const{marginTop:e,marginBottom:i,marginLeft:n,marginRight:o,paddingTop:p,paddingBottom:a,paddingLeft:l,paddingRight:r}=t;return{marginTop:e,marginBottom:i,marginLeft:n,marginRight:o,paddingTop:p,paddingBottom:a,paddingLeft:l,paddingRight:r}})(i),p=Object.keys(n).filter((t=>"0px"!==n[t]));0!==p.length&&p.forEach((async i=>{const p=o(n[i]),r=h(p),d=(t=>-1!==t.indexOf("Top")?t.replace("Top"," top"):-1!==t.indexOf("Right")?t.replace("Right"," right"):-1!==t.indexOf("Bottom")?t.replace("Bottom"," bottom"):-1!==t.indexOf("Left")?t.replace("Left"," left"):"")(i);e(r,d),document.body.appendChild(r),t.classList.add("is-specced"),await(async(t,e,i,n)=>{await a();const o=n.getBoundingClientRect(),p=await c(n);"marginTop"===t&&l(i,{height:`${e}px`,width:o.width+"px",left:p.left+"px",top:p.top-e+"px"}),"marginRight"===t&&l(i,{height:o.height+"px",width:`${e}px`,left:p.left+parseInt(o.width+"",10)+"px",top:p.top+"px"}),"marginBottom"===t&&l(i,{height:`${e}px`,width:o.width+"px",left:p.left+"px",top:p.top+parseInt(o.height+"",10)+"px"}),"marginLeft"===t&&l(i,{height:o.height+"px",width:`${e}px`,left:p.left-e+"px",top:p.top+"px"}),"paddingTop"===t&&l(i,{height:`${e}px`,width:o.width+"px",left:p.left+"px",top:p.top+"px"}),"paddingBottom"===t&&l(i,{height:`${e}px`,width:o.width+"px",left:p.left+"px",top:p.top+(parseInt(o.height+"",10)-e)+"px"}),"paddingRight"===t&&l(i,{height:o.height+"px",width:`${e}px`,left:p.left+(parseInt(o.width+"",10)-e)+"px",top:p.top+"px"}),"paddingLeft"===t&&l(i,{height:o.height+"px",width:`${e}px`,left:p.left+"px",top:p.top+"px"})})(i,p,r,t)}))};var g,x,u=Object.freeze({__proto__:null,create:h,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"}(x||(x={}));const m=(t,e=3)=>parseFloat(t+"").toFixed(e),y=(t="",n,o="span")=>{const p=document.createElement(o),a=document.createTextNode(t),l={};null!==n&&""!==n&&(l[n]=!0),-1===n.indexOf(x.Full)&&-1===n.indexOf(x.Enclose)?p.appendChild(a):-1===n.indexOf(x.Full)&&-1===n.indexOf(x.Enclose)||p.setAttribute("data-dissection-counter",t);const r=i("ph speccer dissection",l);return e(p,r),p},w=async(t,e)=>{if(!t)return;const i=t.getAttribute("data-anatomy")||"";if(!i||""===i)return;const o=y(n[e],i);document.body.appendChild(o);const a=await(async(t,e,i)=>{const n=e.getBoundingClientRect(),o=i.getBoundingClientRect(),a=p(i),l=await c(e),r=l.left-o.width-a+"px",h=m(s(l.top,o,n))+"px",f=l.left+n.width+a+"px",g=m(s(l.top,o,n))+"px",u=m(d(l.left,o,n))+"px",y=l.top-o.height-a+"px",w=m(d(l.left,o,n))+"px",O=l.top+n.height+a+"px";let b={};return b=-1!==t.indexOf(x.Outline)?-1!==t.indexOf(x.Left)?-1!==t.indexOf(x.Full)?{left:l.left-8+"px",top:l.top+-1+"px",height:n.height+"px"}:-1!==t.indexOf(x.Enclose)?{left:l.left-1+"px",top:l.top+-1+"px",height:n.height+"px",width:n.width+"px"}:{left:r,top:h}:-1!==t.indexOf(x.Right)?-1!==t.indexOf(x.Full)?{left:l.left+n.width+"px",top:l.top+-1+"px",height:n.height+"px"}:-1!==t.indexOf(x.Enclose)?{left:l.left+-1+"px",top:l.top+-1+"px",height:n.height+"px",width:n.width+"px"}:{left:f,top:g}:-1!==t.indexOf(x.Top)?-1!==t.indexOf(x.Full)?{top:l.top+-8+"px",left:l.left+-1+"px",width:n.width+"px"}:-1!==t.indexOf(x.Enclose)?{top:l.top+-1+"px",left:l.left+-1+"px",height:n.height+"px",width:n.width+"px"}:{left:u,top:y}:-1!==t.indexOf(x.Bottom)?-1!==t.indexOf(x.Full)?{top:l.top+n.height+"px",left:l.left+-1+"px",width:n.width+"px"}:-1!==t.indexOf(x.Enclose)?{top:l.top+-1+"px",left:l.left+-1+"px",height:n.height+"px",width:n.width+"px"}:{left:w,top:O}:-1!==t.indexOf(x.Full)?{left:l.left+n.width+"px",top:l.top+"px",height:n.height+"px"}:-1!==t.indexOf(x.Enclose)?{left:l.left+n.width+"px",top:l.top+-1+"px",height:n.height+"px",width:n.width+"px"}:{left:r,top:h}:-1!==t.indexOf(x.Full)?{left:l.left-8+"px",top:l.top+-1+"px",height:n.height+"px"}:-1!==t.indexOf(x.Enclose)?{left:l.left-1+"px",top:l.top+-1+"px",height:n.height+"px",width:n.width+"px"}:{left:r,top:h},b})(i,t,o);l(o,a)};const O=(t="",i="",n="span")=>{const o=document.createElement(n);return o.setAttribute("title",t+"px"),o.setAttribute("data-measure",parseInt(t+"",10)+"px"),e(o,`ph speccer measure ${i}`),o},b=async t=>{if(!t)return;const e=t.getAttribute("data-speccer-measure");if(""===e||!e)return;const i=await r(t);if("none"===i.display||"0"===i.opacity||"hidden"===i.visibility)return;await a();const n=t.getBoundingClientRect(),o=n.top+window.pageYOffset,p=n.left+window.pageXOffset,d=-1!==(s=e).indexOf("width")?-1!==s.indexOf("top")?"width top":(s.indexOf("bottom"),"width bottom"):-1!==s.indexOf("height")?-1!==s.indexOf("right")?"height right":(s.indexOf("left"),"height left"):"";var s;if(-1!==e.indexOf("width"))if(-1!==e.indexOf("bottom")){const t=O(n.width,d);document.body.appendChild(t),l(t,{left:p+"px",top:o+n.height+1+"px",width:n.width+"px"})}else{const t=O(n.width,d);document.body.appendChild(t);const e=t.getBoundingClientRect();l(t,{left:p+"px",top:o-e.height+1+"px",width:n.width+"px"})}else if(-1!==e.indexOf("height"))if(-1!==e.indexOf("right")){const t=O(n.height,d);document.body.appendChild(t),l(t,{left:p+n.width+"px",top:o+"px",height:n.height+"px"})}else{const t=O(n.height,d);document.body.appendChild(t);const e=t.getBoundingClientRect();l(t,{left:p-e.width+"px",top:o+"px",height:n.height+"px"})}};const E=(t,n)=>{const o=document.createElement("div"),p={};null!==n&&""!==n&&(p[n]=!0);const a=i("ph speccer typography",p);return o.innerHTML=t,e(o,a),o};const A=t=>{const e=()=>function(t,e,i){let n;return function(){const o=this,p=arguments,a=function(){n=null,i||t.apply(o,p)},l=i&&!n;n&&clearTimeout(n),n=setTimeout(a,e),l&&t.apply(o,p)}}((()=>{t()}),300);window.removeEventListener("resize",e),window.addEventListener("resize",e)},S=t=>{"loading"===document.readyState?document.addEventListener("DOMContentLoaded",(()=>{t()})):t()},R=u,v=Object.freeze({__proto__:null,create:y,element:w}),B=Object.freeze({__proto__:null,element:b}),C=Object.freeze({__proto__:null,create:E,element:async t=>{if(!t)return;const e=t.getAttribute("data-speccer-typography"),i=await r(t);if("none"===i.display||"0"===i.opacity||"hidden"===i.visibility)return;t.classList.add("is-specced");const n=await(async t=>{const e=(t=>{const{lineHeight:e,letterSpacing:i,fontFamily:n,fontSize:o,fontStyle:p,fontVariationSettings:a,fontWeight:l}=t;return{lineHeight:e,letterSpacing:i,fontFamily:n,fontSize:o,fontStyle:p,fontVariationSettings:a,fontWeight:l}})(await r(t)),i="normal"!==e.lineHeight?parseInt(e.lineHeight,10)/16+"rem":"normal";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} / ${i};</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(n,e);document.body.appendChild(o);const a=await(async(t,e,i)=>{const n=e.getBoundingClientRect(),o=p(i),a=i.getBoundingClientRect(),l=await c(e),r=l.left-a.width-o+"px",h=m(s(l.top,a,n))+"px",f=l.left+n.width+o+"px",x=m(s(l.top,a,n))+"px",u=m(d(l.left,a,n))+"px",y=l.top-a.height-o+"px",w=m(d(l.left,a,n))+"px",O=l.top+n.height+o+"px";let b={left:r,top:h};return t&&-1!==t.indexOf(g.Right)?b={left:f,top:x}:t&&-1!==t.indexOf(g.Top)?b={left:u,top:y}:t&&-1!==t.indexOf(g.Bottom)&&(b={left:w,top:O}),b})(e,t,o);l(o,a)}}),L=()=>{((t,e=document)=>{[].forEach.call(e.querySelectorAll(t),(function(t){t.remove()}))})(".speccer");const t=document.querySelectorAll("[data-speccer],[data-speccer] *:not(td):not(tr):not(th):not(tfoot):not(thead):not(tbody)"),e=document.querySelectorAll("[data-speccer-measure]"),i=document.querySelectorAll("[data-speccer-typography]"),n=document.querySelectorAll("[data-anatomy-section] [data-anatomy]");t.forEach(R.element),e.forEach(B.element),i.forEach(C.element),n.forEach(v.element)};(t=>{const e=document.currentScript;if(e){const i=e.getAttribute("src");!i||-1===i.indexOf("speccer.js")&&-1===i.indexOf("JaXpOK.js")||(e.hasAttribute("data-manual")?(t=>{window.speccer=t})(t):e.hasAttribute("data-instant")?t():e.hasAttribute("data-dom")?S(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&&(b(t.target),e.unobserve(t.target))}))}));document.querySelectorAll("[data-speccer-measure]").forEach((t=>{e.observe(t)}));const i=new IntersectionObserver(((t,e)=>{t.forEach((t=>{const i=t.target.querySelectorAll("[data-anatomy]");t.intersectionRatio>0&&(i.forEach(w),e.unobserve(t.target))}))}));document.querySelectorAll("[data-anatomy-section]").forEach((t=>{i.observe(t)}))})():S(t),e.hasAttribute("data-manual")||e.hasAttribute("data-lazy")||A(t))}})(L),t.default=L,t.dissect=v,t.measure=B,t.spacing=R,t.typography=C,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,a=()=>new Promise(requestAnimationFrame),l=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 a(),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 a(),getComputedStyle(t,null)),d=(t,e,n)=>t-e.width/2+n.width/2,c=(t,e,n)=>t-e.height/2+n.height/2,s=async t=>{await a();const e=t.getBoundingClientRect();return{top:e.top+window.pageYOffset,left:e.left+window.pageXOffset}},h=(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=>{if(!t)return;const n=await r(t);if("none"===n.display||"0"===n.opacity||"hidden"===n.visibility)return;const i=(t=>{const{marginTop:e,marginBottom:n,marginLeft:i,marginRight:o,paddingTop:p,paddingBottom:a,paddingLeft:l,paddingRight:r}=t;return{marginTop:e,marginBottom:n,marginLeft:i,marginRight:o,paddingTop:p,paddingBottom:a,paddingLeft:l,paddingRight:r}})(n),p=Object.keys(i).filter((t=>"0px"!==i[t]));0!==p.length&&p.forEach((async n=>{const p=o(i[n]),r=h(p),d=(t=>-1!==t.indexOf("Top")?t.replace("Top"," top"):-1!==t.indexOf("Right")?t.replace("Right"," right"):-1!==t.indexOf("Bottom")?t.replace("Bottom"," bottom"):-1!==t.indexOf("Left")?t.replace("Left"," left"):"")(n);e(r,d),document.body.appendChild(r),t.classList.add("is-specced"),await(async(t,e,n,i)=>{await a();const o=i.getBoundingClientRect(),p=await s(i);"marginTop"===t&&l(n,{height:`${e}px`,width:o.width+"px",left:p.left+"px",top:p.top-e+"px"}),"marginRight"===t&&l(n,{height:o.height+"px",width:`${e}px`,left:p.left+parseInt(o.width+"",10)+"px",top:p.top+"px"}),"marginBottom"===t&&l(n,{height:`${e}px`,width:o.width+"px",left:p.left+"px",top:p.top+parseInt(o.height+"",10)+"px"}),"marginLeft"===t&&l(n,{height:o.height+"px",width:`${e}px`,left:p.left-e+"px",top:p.top+"px"}),"paddingTop"===t&&l(n,{height:`${e}px`,width:o.width+"px",left:p.left+"px",top:p.top+"px"}),"paddingBottom"===t&&l(n,{height:`${e}px`,width:o.width+"px",left:p.left+"px",top:p.top+(parseInt(o.height+"",10)-e)+"px"}),"paddingRight"===t&&l(n,{height:o.height+"px",width:`${e}px`,left:p.left+(parseInt(o.width+"",10)-e)+"px",top:p.top+"px"}),"paddingLeft"===t&&l(n,{height:o.height+"px",width:`${e}px`,left:p.left+"px",top:p.top+"px"})})(n,p,r,t)}))};var g,x,u=Object.freeze({__proto__:null,create:h,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"}(x||(x={}));const m=(t,e=3)=>parseFloat(t+"").toFixed(e),y=(t="",i,o="span")=>{const p=document.createElement(o),a=document.createTextNode(t),l={};null!==i&&""!==i&&(l[i]=!0),-1===i.indexOf(x.Full)&&-1===i.indexOf(x.Enclose)?p.appendChild(a):-1===i.indexOf(x.Full)&&-1===i.indexOf(x.Enclose)||p.setAttribute("data-dissection-counter",t);const r=n("ph speccer dissection",l);return e(p,r),p},w=t=>{if(!t)return;const e=t.querySelectorAll("[data-anatomy]");e&&e.forEach((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 a=await(async(t,e,n)=>{const i=e.getBoundingClientRect(),o=n.getBoundingClientRect(),a=p(n),l=await s(e),r=l.left-o.width-a+"px",h=m(c(l.top,o,i))+"px",f=l.left+i.width+a+"px",g=m(c(l.top,o,i))+"px",u=m(d(l.left,o,i))+"px",y=l.top-o.height-a+"px",w=m(d(l.left,o,i))+"px",O=l.top+i.height+a+"px";let b={};return b=-1!==t.indexOf(x.Outline)?-1!==t.indexOf(x.Left)?-1!==t.indexOf(x.Full)?{left:l.left-8+"px",top:l.top+-1+"px",height:i.height+"px"}:-1!==t.indexOf(x.Enclose)?{left:l.left-1+"px",top:l.top+-1+"px",height:i.height+"px",width:i.width+"px"}:{left:r,top:h}:-1!==t.indexOf(x.Right)?-1!==t.indexOf(x.Full)?{left:l.left+i.width+"px",top:l.top+-1+"px",height:i.height+"px"}:-1!==t.indexOf(x.Enclose)?{left:l.left+-1+"px",top:l.top+-1+"px",height:i.height+"px",width:i.width+"px"}:{left:f,top:g}:-1!==t.indexOf(x.Top)?-1!==t.indexOf(x.Full)?{top:l.top+-8+"px",left:l.left+-1+"px",width:i.width+"px"}:-1!==t.indexOf(x.Enclose)?{top:l.top+-1+"px",left:l.left+-1+"px",height:i.height+"px",width:i.width+"px"}:{left:u,top:y}:-1!==t.indexOf(x.Bottom)?-1!==t.indexOf(x.Full)?{top:l.top+i.height+"px",left:l.left+-1+"px",width:i.width+"px"}:-1!==t.indexOf(x.Enclose)?{top:l.top+-1+"px",left:l.left+-1+"px",height:i.height+"px",width:i.width+"px"}:{left:w,top:O}:-1!==t.indexOf(x.Full)?{left:l.left+i.width+"px",top:l.top+"px",height:i.height+"px"}:-1!==t.indexOf(x.Enclose)?{left:l.left+i.width+"px",top:l.top+-1+"px",height:i.height+"px",width:i.width+"px"}:{left:r,top:h}:-1!==t.indexOf(x.Full)?{left:l.left-8+"px",top:l.top+-1+"px",height:i.height+"px"}:-1!==t.indexOf(x.Enclose)?{left:l.left-1+"px",top:l.top+-1+"px",height:i.height+"px",width:i.width+"px"}:{left:r,top:h},b})(n,t,o);l(o,a)}))};const O=(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},b=async t=>{if(!t)return;const e=t.getAttribute("data-speccer-measure");if(""===e||!e)return;const n=await r(t);if("none"===n.display||"0"===n.opacity||"hidden"===n.visibility)return;await a();const i=t.getBoundingClientRect(),o=i.top+window.pageYOffset,p=i.left+window.pageXOffset;if(-1!==e.indexOf("width"))if(-1!==e.indexOf("bottom")){const t=O(i.width,e);document.body.appendChild(t),l(t,{left:p+"px",top:o+i.height+1+"px",width:i.width+"px"})}else{const t=O(i.width,e);document.body.appendChild(t);const n=t.getBoundingClientRect();l(t,{left:p+"px",top:o-n.height+1+"px",width:i.width+"px"})}else if(-1!==e.indexOf("height"))if(-1!==e.indexOf("right")){const t=O(i.height,e);document.body.appendChild(t),l(t,{left:p+i.width+"px",top:o+"px",height:i.height+"px"})}else{const t=O(i.height,e);document.body.appendChild(t);const n=t.getBoundingClientRect();l(t,{left:p-n.width+"px",top:o+"px",height:i.height+"px"})}};const E=(t,i)=>{const o=document.createElement("div"),p={};null!==i&&""!==i&&(p[i]=!0);const a=n("ph speccer typography",p);return o.innerHTML=t,e(o,a),o};const A=t=>{const e=()=>function(t,e,n){let i;return function(){const o=this,p=arguments,a=function(){i=null,n||t.apply(o,p)},l=n&&!i;i&&clearTimeout(i),i=setTimeout(a,e),l&&t.apply(o,p)}}((()=>{t()}),300);window.removeEventListener("resize",e),window.addEventListener("resize",e)},S=t=>{"loading"===document.readyState?document.addEventListener("DOMContentLoaded",(()=>{t()})):t()},R=()=>{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):not(tr):not(th):not(tfoot):not(thead):not(tbody)").forEach((e=>{t.observe(e)}));const e=new IntersectionObserver(((t,e)=>{t.forEach((t=>{t.intersectionRatio>0&&(b(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=>{t.intersectionRatio>0&&(w(t.target),e.unobserve(t.target))}))}));document.querySelectorAll("[data-anatomy-section]").forEach((t=>{n.observe(t)}))},v=t=>{window.speccer=t},B=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")?v(t):e.hasAttribute("data-instant")?t():e.hasAttribute("data-dom")?S(t):e.hasAttribute("data-lazy")?R():S(t),e.hasAttribute("data-manual")||e.hasAttribute("data-lazy")||A(t))}};const C=u,_=Object.freeze({__proto__:null,create:y,element:w}),L=Object.freeze({__proto__:null,element:b}),T=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||"0"===n.opacity||"hidden"===n.visibility)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:a,fontWeight:l}=t;return{lineHeight:e,letterSpacing:n,fontFamily:i,fontSize:o,fontStyle:p,fontVariationSettings:a,fontWeight:l}})(await r(t)),n="normal"!==e.lineHeight?parseInt(e.lineHeight,10)/16+"rem":"normal";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} / ${n};</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 a=await(async(t,e,n)=>{const i=e.getBoundingClientRect(),o=p(n),a=n.getBoundingClientRect(),l=await s(e),r=l.left-a.width-o+"px",h=m(c(l.top,a,i))+"px",f=l.left+i.width+o+"px",x=m(c(l.top,a,i))+"px",u=m(d(l.left,a,i))+"px",y=l.top-a.height-o+"px",w=m(d(l.left,a,i))+"px",O=l.top+i.height+o+"px";let b={left:r,top:h};return t&&-1!==t.indexOf(g.Right)?b={left:f,top:x}:t&&-1!==t.indexOf(g.Top)?b={left:u,top:y}:t&&-1!==t.indexOf(g.Bottom)&&(b={left:w,top:O}),b})(e,t,o);l(o,a)}}),$=Object.freeze({__proto__:null,dom:S,lazy:R,manual:v,activate:B}),F=()=>{((t,e=document)=>{[].forEach.call(e.querySelectorAll(t),(function(t){t.remove()}))})(".speccer");const t=document.querySelectorAll("[data-speccer],[data-speccer] *:not(td):not(tr):not(th):not(tfoot):not(thead):not(tbody)"),e=document.querySelectorAll("[data-speccer-measure]"),n=document.querySelectorAll("[data-speccer-typography]"),i=document.querySelectorAll("[data-anatomy-section]");t.forEach(C.element),e.forEach(L.element),n.forEach(T.element),i.forEach(_.element)};B(F),t.default=F,t.dissect=_,t.measure=L,t.modes=$,t.spacing=C,t.typography=T,Object.defineProperty(t,"__esModule",{value:!0})}));
2
2
  //# sourceMappingURL=speccer.js.map
package/speccer.js.map CHANGED
@@ -1 +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/helpers/spacing/position.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 getClassNameFromCSSProperty = (property: string) => {\n if (property.indexOf('Top') !== -1) {\n return property.replace('Top', ' top');\n } else if (property.indexOf('Right') !== -1) {\n return property.replace('Right', ' right');\n } else if (property.indexOf('Bottom') !== -1) {\n return property.replace('Bottom', ' bottom');\n } else if (property.indexOf('Left') !== -1) {\n return property.replace('Left', ' left');\n }\n\n return '';\n};\n\nexport const getClassNameFromMeasureArea = (area: string) => {\n if (area.indexOf('width') !== -1) {\n if (area.indexOf('top') !== -1) {\n return 'width top';\n } else if (area.indexOf('bottom') !== -1) {\n return 'width bottom';\n } else {\n return 'width bottom';\n }\n } else if (area.indexOf('height') !== -1) {\n if (area.indexOf('right') !== -1) {\n return 'height right';\n } else if (area.indexOf('left') !== -1) {\n return 'height left';\n } else {\n return 'height left';\n }\n }\n\n return '';\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","import { waitForFrame } from './debounce';\n\nexport 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 offset = async (targetEl: HTMLElement): Promise<{ left: number; top: number }> => {\n await waitForFrame();\n\n const _target_rect = targetEl.getBoundingClientRect();\n const _el_offset_top = _target_rect.top + window.pageYOffset;\n const _el_offset_left = _target_rect.left + window.pageXOffset;\n\n return {\n top: _el_offset_top,\n left: _el_offset_left\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 * as helpers from '../helpers/spacing';\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 (targetEl: HTMLElement) => {\n if (!targetEl) return;\n\n const _target_styles = await styles.get(targetEl);\n\n if (_target_styles.display === 'none' || _target_styles.opacity === '0' || _target_styles.visibility === 'hidden') {\n return;\n }\n\n const _target_spacing_styles = css.getSpacing(_target_styles);\n const _target_pruned_spacing_styles = Object.keys(_target_spacing_styles).filter((property) => {\n const _value = _target_spacing_styles[property];\n\n return _value !== '0px';\n });\n\n if (_target_pruned_spacing_styles.length === 0) return;\n\n _target_pruned_spacing_styles.forEach(async (property) => {\n const _value = css.getNumberValue(_target_spacing_styles[property]);\n const _speccer_el = create(_value);\n const _class_name = css.getClassNameFromCSSProperty(property);\n\n classnames.set(_speccer_el, _class_name);\n document.body.appendChild(_speccer_el);\n\n targetEl.classList.add('is-specced');\n await helpers.position(property, _value, _speccer_el, targetEl);\n });\n};\n","import * as styles from '../../lib/styles';\nimport { offset } from '../../lib/position';\nimport { waitForFrame } from '../../lib/debounce';\n\nexport const position = async (property: string, value: number, spacingEl: HTMLElement, targetEl: HTMLElement) => {\n await waitForFrame();\n\n const _target_rect = targetEl.getBoundingClientRect();\n const _target_offset = await offset(targetEl);\n\n if (property === 'marginTop') {\n styles.add(spacingEl, {\n height: `${value}px`,\n width: _target_rect.width + 'px',\n left: _target_offset.left + 'px',\n top: _target_offset.top - value + 'px'\n });\n }\n\n if (property === 'marginRight') {\n styles.add(spacingEl, {\n height: _target_rect.height + 'px',\n width: `${value}px`,\n left: _target_offset.left + parseInt(_target_rect.width + '', 10) + 'px',\n top: _target_offset.top + 'px'\n });\n }\n\n if (property === 'marginBottom') {\n styles.add(spacingEl, {\n height: `${value}px`,\n width: _target_rect.width + 'px',\n left: _target_offset.left + 'px',\n top: _target_offset.top + parseInt(_target_rect.height + '', 10) + 'px'\n });\n }\n\n if (property === 'marginLeft') {\n styles.add(spacingEl, {\n height: _target_rect.height + 'px',\n width: `${value}px`,\n left: _target_offset.left - value + 'px',\n top: _target_offset.top + 'px'\n });\n }\n\n if (property === 'paddingTop') {\n styles.add(spacingEl, {\n height: `${value}px`,\n width: _target_rect.width + 'px',\n left: _target_offset.left + 'px',\n top: _target_offset.top + 'px'\n });\n }\n\n if (property === 'paddingBottom') {\n styles.add(spacingEl, {\n height: `${value}px`,\n width: _target_rect.width + 'px',\n left: _target_offset.left + 'px',\n top: _target_offset.top + (parseInt(_target_rect.height + '', 10) - value) + 'px'\n });\n }\n\n if (property === 'paddingRight') {\n styles.add(spacingEl, {\n height: _target_rect.height + 'px',\n width: `${value}px`,\n left: _target_offset.left + (parseInt(_target_rect.width + '', 10) - value) + 'px',\n top: _target_offset.top + 'px'\n });\n }\n\n if (property === 'paddingLeft') {\n styles.add(spacingEl, {\n height: _target_rect.height + 'px',\n width: `${value}px`,\n left: _target_offset.left + 'px',\n top: _target_offset.top + 'px'\n });\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 = await 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_horizontal_center_of_els, get_vertical_center_of_els, offset } from '../../lib/position';\nimport { DissectAreaEnum } from '../../enums/area';\n\nexport const styles = async (area: string, targetEl: HTMLElement, dissectionEl: HTMLElement) => {\n const _target_rect = targetEl.getBoundingClientRect();\n const _dissection_el_rect = dissectionEl.getBoundingClientRect();\n const SPECCER_PIN_SPACE = css.pinSpace(dissectionEl);\n const _el_offset = await offset(targetEl);\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, _target_rect)) + 'px';\n const _right_layout_position_left = _el_offset.left + _target_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, _target_rect)) + 'px';\n const _top_layout_position_left =\n number.decimal(get_horizontal_center_of_els(_el_offset.left, _dissection_el_rect, _target_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, _target_rect)) + 'px';\n const _bottom_layout_position_top = _el_offset.top + _target_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: _target_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: _target_rect.height + 'px',\n width: _target_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 + _target_rect.width + 'px',\n top: _el_offset.top + -1 + 'px',\n height: _target_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: _target_rect.height + 'px',\n width: _target_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: _target_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: _target_rect.height + 'px',\n width: _target_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 + _target_rect.height + 'px',\n left: _el_offset.left + -1 + 'px',\n width: _target_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: _target_rect.height + 'px',\n width: _target_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 + _target_rect.width + 'px',\n top: _el_offset.top + 'px',\n height: _target_rect.height + 'px'\n };\n } else if (area.indexOf(DissectAreaEnum.Enclose) !== -1) {\n _dissection_styles = {\n left: _el_offset.left + _target_rect.width + 'px',\n top: _el_offset.top + -1 + 'px',\n height: _target_rect.height + 'px',\n width: _target_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: _target_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: _target_rect.height + 'px',\n width: _target_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 * as css from '../lib/css';\nimport { waitForFrame } from '../lib/debounce';\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 = async (targetEl: HTMLElement) => {\n if (!targetEl) return;\n\n const _area: string | null = targetEl.getAttribute('data-speccer-measure');\n\n if (_area === '' || !_area) {\n return;\n }\n\n const _target_styles = await styles.get(targetEl);\n\n if (_target_styles.display === 'none' || _target_styles.opacity === '0' || _target_styles.visibility === 'hidden') {\n return;\n }\n\n await waitForFrame();\n\n const _target_rect = targetEl.getBoundingClientRect();\n const _el_offset_top = _target_rect.top + window.pageYOffset;\n const _el_offset_left = _target_rect.left + window.pageXOffset;\n const _class_name = css.getClassNameFromMeasureArea(_area);\n\n if (_area.indexOf('width') !== -1) {\n if (_area.indexOf('bottom') !== -1) {\n const _measure_el = create(_target_rect.width, _class_name);\n\n document.body.appendChild(_measure_el);\n\n styles.add(_measure_el, {\n left: _el_offset_left + 'px',\n top: _el_offset_top + _target_rect.height + 1 + 'px',\n width: _target_rect.width + 'px'\n });\n } else {\n const _measure_el = create(_target_rect.width, _class_name);\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: _target_rect.width + 'px'\n });\n }\n } else if (_area.indexOf('height') !== -1) {\n if (_area.indexOf('right') !== -1) {\n const _measure_el = create(_target_rect.height, _class_name);\n\n document.body.appendChild(_measure_el);\n\n styles.add(_measure_el, {\n left: _el_offset_left + _target_rect.width + 'px',\n top: _el_offset_top + 'px',\n height: _target_rect.height + 'px'\n });\n } else {\n const _measure_el = create(_target_rect.height, _class_name);\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: _target_rect.height + 'px'\n });\n }\n }\n};\n","import * as css from '../../lib/css';\nimport * as number from '../../lib/number';\nimport { get_horizontal_center_of_els, get_vertical_center_of_els, offset } from '../../lib/position';\nimport { SpeccerAreaEnum } from '../../enums/area';\n\nexport const position = async (area: string | null, targetEl: HTMLElement, speccerEl: HTMLElement) => {\n const _target_rect = targetEl.getBoundingClientRect();\n const SPECCER_PIN_SPACE = css.pinSpace(speccerEl);\n const _speccer_el_rect = speccerEl.getBoundingClientRect();\n const _el_offset = await offset(targetEl);\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, _target_rect)) + 'px';\n const _right_layout_position_left = _el_offset.left + _target_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, _target_rect)) + 'px';\n const _top_layout_position_left =\n number.decimal(get_horizontal_center_of_els(_el_offset.left, _speccer_el_rect, _target_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, _target_rect)) + 'px';\n const _bottom_layout_position_top = _el_offset.top + _target_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 (targetEl: HTMLElement) => {\n if (!targetEl) return;\n\n const _area: string | null = targetEl.getAttribute('data-speccer-typography');\n const _target_styles = await styles.get(targetEl);\n\n if (_target_styles.display === 'none' || _target_styles.opacity === '0' || _target_styles.visibility === 'hidden') {\n return;\n }\n\n targetEl.classList.add('is-specced');\n\n const _html = await helpers.template(targetEl);\n const _speccer_el = create(_html, _area);\n\n document.body.appendChild(_speccer_el);\n\n const _position = await helpers.position(_area, targetEl, _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(\n '[data-speccer],[data-speccer] *:not(td):not(tr):not(th):not(tfoot):not(thead):not(tbody)'\n );\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\nbrowser.activate(speccer);\n","import * as css from '../../lib/css';\nimport * as styles from '../../lib/styles';\n\nexport const template = async (targetEl: HTMLElement): Promise<string> => {\n const _target_styles = await styles.get(targetEl);\n const _styles = css.getTypography(_target_styles);\n const _line_height = _styles['lineHeight'] !== 'normal' ? parseInt(_styles['lineHeight'], 10) / 16 + 'rem' : 'normal';\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']} / ${_line_height};</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","offset","targetEl","_target_rect","getBoundingClientRect","top","window","pageYOffset","left","pageXOffset","create","text","tag","_el","document","createElement","_text_content","createTextNode","appendChild","setAttribute","classnames.set","element","_target_styles","styles.get","display","opacity","visibility","_target_spacing_styles","marginTop","marginBottom","marginLeft","marginRight","paddingTop","paddingBottom","paddingLeft","paddingRight","css.getSpacing","_target_pruned_spacing_styles","property","_value","css.getNumberValue","_speccer_el","_class_name","indexOf","replace","css.getClassNameFromCSSProperty","body","spacingEl","_target_offset","styles.add","helpers.position","SpeccerAreaEnum","DissectAreaEnum","decimal","number","decimals","parseFloat","toFixed","textContent","area","n","_text_node","_extra_class_names","Full","Enclose","_class_names","classnames.cx","dissectIndex","_area","getAttribute","_dissection_el","_dissection_styles","dissectionEl","_dissection_el_rect","SPECCER_PIN_SPACE","css.pinSpace","_el_offset","_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","_el_offset_top","_el_offset_left","_measure_el","_measure_rect","html","innerHTML","activate","speccer","speccerEventFunc","func","wait","immediate","timeout","context","this","args","arguments","later","apply","callNow","clearTimeout","setTimeout","debounce","removeEventListener","addEventListener","dom","readyState","spacing","__spacing","dissect","measure","typography","_html","_styles","lineHeight","letterSpacing","fontFamily","fontSize","fontStyle","fontVariationSettings","fontWeight","css.getTypography","_line_height","helpers.template","_position","speccerEl","_speccer_el_rect","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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"}
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/helpers/spacing/position.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 getClassNameFromCSSProperty = (property: string) => {\n if (property.indexOf('Top') !== -1) {\n return property.replace('Top', ' top');\n } else if (property.indexOf('Right') !== -1) {\n return property.replace('Right', ' right');\n } else if (property.indexOf('Bottom') !== -1) {\n return property.replace('Bottom', ' bottom');\n } else if (property.indexOf('Left') !== -1) {\n return property.replace('Left', ' left');\n }\n\n return '';\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","import { waitForFrame } from './debounce';\n\nexport 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 offset = async (targetEl: HTMLElement): Promise<{ left: number; top: number }> => {\n await waitForFrame();\n\n const _target_rect = targetEl.getBoundingClientRect();\n const _el_offset_top = _target_rect.top + window.pageYOffset;\n const _el_offset_left = _target_rect.left + window.pageXOffset;\n\n return {\n top: _el_offset_top,\n left: _el_offset_left\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 * as helpers from '../helpers/spacing';\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 (targetEl: HTMLElement) => {\n if (!targetEl) return;\n\n const _target_styles = await styles.get(targetEl);\n\n if (_target_styles.display === 'none' || _target_styles.opacity === '0' || _target_styles.visibility === 'hidden') {\n return;\n }\n\n const _target_spacing_styles = css.getSpacing(_target_styles);\n const _target_pruned_spacing_styles = Object.keys(_target_spacing_styles).filter((property) => {\n const _value = _target_spacing_styles[property];\n\n return _value !== '0px';\n });\n\n if (_target_pruned_spacing_styles.length === 0) return;\n\n _target_pruned_spacing_styles.forEach(async (property) => {\n const _value = css.getNumberValue(_target_spacing_styles[property]);\n const _speccer_el = create(_value);\n const _class_name = css.getClassNameFromCSSProperty(property);\n\n classnames.set(_speccer_el, _class_name);\n document.body.appendChild(_speccer_el);\n\n targetEl.classList.add('is-specced');\n await helpers.position(property, _value, _speccer_el, targetEl);\n });\n};\n","import * as styles from '../../lib/styles';\nimport { offset } from '../../lib/position';\nimport { waitForFrame } from '../../lib/debounce';\n\nexport const position = async (property: string, value: number, spacingEl: HTMLElement, targetEl: HTMLElement) => {\n await waitForFrame();\n\n const _target_rect = targetEl.getBoundingClientRect();\n const _target_offset = await offset(targetEl);\n\n if (property === 'marginTop') {\n styles.add(spacingEl, {\n height: `${value}px`,\n width: _target_rect.width + 'px',\n left: _target_offset.left + 'px',\n top: _target_offset.top - value + 'px'\n });\n }\n\n if (property === 'marginRight') {\n styles.add(spacingEl, {\n height: _target_rect.height + 'px',\n width: `${value}px`,\n left: _target_offset.left + parseInt(_target_rect.width + '', 10) + 'px',\n top: _target_offset.top + 'px'\n });\n }\n\n if (property === 'marginBottom') {\n styles.add(spacingEl, {\n height: `${value}px`,\n width: _target_rect.width + 'px',\n left: _target_offset.left + 'px',\n top: _target_offset.top + parseInt(_target_rect.height + '', 10) + 'px'\n });\n }\n\n if (property === 'marginLeft') {\n styles.add(spacingEl, {\n height: _target_rect.height + 'px',\n width: `${value}px`,\n left: _target_offset.left - value + 'px',\n top: _target_offset.top + 'px'\n });\n }\n\n if (property === 'paddingTop') {\n styles.add(spacingEl, {\n height: `${value}px`,\n width: _target_rect.width + 'px',\n left: _target_offset.left + 'px',\n top: _target_offset.top + 'px'\n });\n }\n\n if (property === 'paddingBottom') {\n styles.add(spacingEl, {\n height: `${value}px`,\n width: _target_rect.width + 'px',\n left: _target_offset.left + 'px',\n top: _target_offset.top + (parseInt(_target_rect.height + '', 10) - value) + 'px'\n });\n }\n\n if (property === 'paddingRight') {\n styles.add(spacingEl, {\n height: _target_rect.height + 'px',\n width: `${value}px`,\n left: _target_offset.left + (parseInt(_target_rect.width + '', 10) - value) + 'px',\n top: _target_offset.top + 'px'\n });\n }\n\n if (property === 'paddingLeft') {\n styles.add(spacingEl, {\n height: _target_rect.height + 'px',\n width: `${value}px`,\n left: _target_offset.left + 'px',\n top: _target_offset.top + 'px'\n });\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 = (sectionEl: HTMLElement) => {\n if (!sectionEl) return;\n\n const _dissection_els = sectionEl.querySelectorAll('[data-anatomy]');\n\n if (_dissection_els) {\n _dissection_els.forEach(async (targetEl: HTMLElement, targetIndex) => {\n if (!targetEl) return;\n\n const _area: string | null = targetEl.getAttribute('data-anatomy') || '';\n\n if (!_area || _area === '') return;\n\n const _dissection_el = create(SPECCER_LITERALS[targetIndex], _area);\n\n document.body.appendChild(_dissection_el);\n\n const _dissection_styles = await helpers.styles(_area, targetEl, _dissection_el);\n\n styles.add(_dissection_el, _dissection_styles);\n });\n }\n};\n","import * as css from '../../lib/css';\nimport * as number from '../../lib/number';\nimport { get_horizontal_center_of_els, get_vertical_center_of_els, offset } from '../../lib/position';\nimport { DissectAreaEnum } from '../../enums/area';\n\nexport const styles = async (area: string, targetEl: HTMLElement, dissectionEl: HTMLElement) => {\n const _target_rect = targetEl.getBoundingClientRect();\n const _dissection_el_rect = dissectionEl.getBoundingClientRect();\n const SPECCER_PIN_SPACE = css.pinSpace(dissectionEl);\n const _el_offset = await offset(targetEl);\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, _target_rect)) + 'px';\n const _right_layout_position_left = _el_offset.left + _target_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, _target_rect)) + 'px';\n const _top_layout_position_left =\n number.decimal(get_horizontal_center_of_els(_el_offset.left, _dissection_el_rect, _target_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, _target_rect)) + 'px';\n const _bottom_layout_position_top = _el_offset.top + _target_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: _target_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: _target_rect.height + 'px',\n width: _target_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 + _target_rect.width + 'px',\n top: _el_offset.top + -1 + 'px',\n height: _target_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: _target_rect.height + 'px',\n width: _target_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: _target_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: _target_rect.height + 'px',\n width: _target_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 + _target_rect.height + 'px',\n left: _el_offset.left + -1 + 'px',\n width: _target_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: _target_rect.height + 'px',\n width: _target_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 + _target_rect.width + 'px',\n top: _el_offset.top + 'px',\n height: _target_rect.height + 'px'\n };\n } else if (area.indexOf(DissectAreaEnum.Enclose) !== -1) {\n _dissection_styles = {\n left: _el_offset.left + _target_rect.width + 'px',\n top: _el_offset.top + -1 + 'px',\n height: _target_rect.height + 'px',\n width: _target_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: _target_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: _target_rect.height + 'px',\n width: _target_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 { waitForFrame } from '../lib/debounce';\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 = async (targetEl: HTMLElement) => {\n if (!targetEl) return;\n\n const _area: string | null = targetEl.getAttribute('data-speccer-measure');\n\n if (_area === '' || !_area) {\n return;\n }\n\n const _target_styles = await styles.get(targetEl);\n\n if (_target_styles.display === 'none' || _target_styles.opacity === '0' || _target_styles.visibility === 'hidden') {\n return;\n }\n\n await waitForFrame();\n\n const _target_rect = targetEl.getBoundingClientRect();\n const _el_offset_top = _target_rect.top + window.pageYOffset;\n const _el_offset_left = _target_rect.left + window.pageXOffset;\n\n if (_area.indexOf('width') !== -1) {\n if (_area.indexOf('bottom') !== -1) {\n const _measure_el = create(_target_rect.width, _area);\n\n document.body.appendChild(_measure_el);\n\n styles.add(_measure_el, {\n left: _el_offset_left + 'px',\n top: _el_offset_top + _target_rect.height + 1 + 'px',\n width: _target_rect.width + 'px'\n });\n } else {\n const _measure_el = create(_target_rect.width, _area);\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: _target_rect.width + 'px'\n });\n }\n } else if (_area.indexOf('height') !== -1) {\n if (_area.indexOf('right') !== -1) {\n const _measure_el = create(_target_rect.height, _area);\n\n document.body.appendChild(_measure_el);\n\n styles.add(_measure_el, {\n left: _el_offset_left + _target_rect.width + 'px',\n top: _el_offset_top + 'px',\n height: _target_rect.height + 'px'\n });\n } else {\n const _measure_el = create(_target_rect.height, _area);\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: _target_rect.height + 'px'\n });\n }\n }\n};\n","import * as css from '../../lib/css';\nimport * as number from '../../lib/number';\nimport { get_horizontal_center_of_els, get_vertical_center_of_els, offset } from '../../lib/position';\nimport { SpeccerAreaEnum } from '../../enums/area';\n\nexport const position = async (area: string | null, targetEl: HTMLElement, speccerEl: HTMLElement) => {\n const _target_rect = targetEl.getBoundingClientRect();\n const SPECCER_PIN_SPACE = css.pinSpace(speccerEl);\n const _speccer_el_rect = speccerEl.getBoundingClientRect();\n const _el_offset = await offset(targetEl);\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, _target_rect)) + 'px';\n const _right_layout_position_left = _el_offset.left + _target_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, _target_rect)) + 'px';\n const _top_layout_position_left =\n number.decimal(get_horizontal_center_of_els(_el_offset.left, _speccer_el_rect, _target_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, _target_rect)) + 'px';\n const _bottom_layout_position_top = _el_offset.top + _target_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 (targetEl: HTMLElement) => {\n if (!targetEl) return;\n\n const _area: string | null = targetEl.getAttribute('data-speccer-typography');\n const _target_styles = await styles.get(targetEl);\n\n if (_target_styles.display === 'none' || _target_styles.opacity === '0' || _target_styles.visibility === 'hidden') {\n return;\n }\n\n targetEl.classList.add('is-specced');\n\n const _html = await helpers.template(targetEl);\n const _speccer_el = create(_html, _area);\n\n document.body.appendChild(_speccer_el);\n\n const _position = await helpers.position(_area, targetEl, _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\n .querySelectorAll('[data-speccer],[data-speccer] *:not(td):not(tr):not(th):not(tfoot):not(thead):not(tbody)')\n .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 if (el.intersectionRatio > 0) {\n dissect.element(el.target as HTMLElement);\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\nexport const modes = browser;\n\nconst speccer = () => {\n node.removeAll('.speccer');\n\n const _els_to_be_specced = document.querySelectorAll(\n '[data-speccer],[data-speccer] *:not(td):not(tr):not(th):not(tfoot):not(thead):not(tbody)'\n );\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]');\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\nbrowser.activate(speccer);\n","import * as css from '../../lib/css';\nimport * as styles from '../../lib/styles';\n\nexport const template = async (targetEl: HTMLElement): Promise<string> => {\n const _target_styles = await styles.get(targetEl);\n const _styles = css.getTypography(_target_styles);\n const _line_height = _styles['lineHeight'] !== 'normal' ? parseInt(_styles['lineHeight'], 10) / 16 + 'rem' : 'normal';\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']} / ${_line_height};</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","offset","targetEl","_target_rect","getBoundingClientRect","top","window","pageYOffset","left","pageXOffset","create","text","tag","_el","document","createElement","_text_content","createTextNode","appendChild","setAttribute","classnames.set","element","_target_styles","styles.get","display","opacity","visibility","_target_spacing_styles","marginTop","marginBottom","marginLeft","marginRight","paddingTop","paddingBottom","paddingLeft","paddingRight","css.getSpacing","_target_pruned_spacing_styles","property","_value","css.getNumberValue","_speccer_el","_class_name","indexOf","replace","css.getClassNameFromCSSProperty","body","spacingEl","_target_offset","styles.add","helpers.position","SpeccerAreaEnum","DissectAreaEnum","decimal","number","decimals","parseFloat","toFixed","textContent","area","n","_text_node","_extra_class_names","Full","Enclose","_class_names","classnames.cx","sectionEl","_dissection_els","querySelectorAll","targetIndex","_area","getAttribute","_dissection_el","_dissection_styles","dissectionEl","_dissection_el_rect","SPECCER_PIN_SPACE","css.pinSpace","_el_offset","_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","_el_offset_top","_el_offset_left","_measure_el","_measure_rect","html","innerHTML","activate","speccer","speccerEventFunc","func","wait","immediate","timeout","context","this","args","arguments","later","apply","callNow","clearTimeout","setTimeout","debounce","removeEventListener","addEventListener","dom","readyState","lazy","_spec_observer","IntersectionObserver","els","observer","intersectionRatio","spec.element","target","unobserve","observe","_measure_observer","measure.element","_dissect_observer","dissect.element","manual","_script","currentScript","_speccer_script_src","hasAttribute","resize.activate","spacing","__spacing","dissect","measure","typography","_html","_styles","lineHeight","letterSpacing","fontFamily","fontSize","fontStyle","fontVariationSettings","fontWeight","css.getTypography","_line_height","helpers.template","_position","speccerEl","_speccer_el_rect","modes","selector","call","e","remove","node.removeAll","_els_to_be_specced","_els_to_be_measured","_els_to_be_typography_specced","_els_to_be_dissected"],"mappings":"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"}
package/speccer.min.css CHANGED
@@ -1 +1 @@
1
- .ph.speccer{--ph-speccer-color-padding:#db6fff66;--ph-speccer-color-padding-hover:#db6fff;--ph-speccer-color-margin:#fff76f66;--ph-speccer-color-margin-hover:#fff76f;--ph-speccer-color-text-light:#fff;--ph-speccer-color-text-dark:#333;--ph-speccer-color-contrast:#ff3aa8;--ph-speccer-spacing-color:var(--ph-speccer-color-contrast);--ph-speccer-measure-color:red;--ph-speccer-pin-color:var(--ph-speccer-color-contrast);--ph-speccer-typography-background-color:#fff;--ph-speccer-typography-color-property:#3f85f2;--ph-speccer-typography-color-text:#57575b;--ph-speccer-typography-color-value:var(--ph-speccer-color-contrast);--ph-speccer-depth-opacity-400:0.4;--ph-speccer-font-family:"Menlo for Powerline","Menlo Regular for Powerline","DejaVu Sans Mono",Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;--ph-speccer-font-size:12px;--ph-speccer-line-height:12px;--ph-speccer-pin-size:24px;--ph-speccer-pin-space:48px;--ph-speccer-line-width:1px;--ph-speccer-line-width-negative:-1px;--ph-speccer-measure-size:8px}.ph.speccer,.ph.speccer:after,.ph.speccer:before{box-sizing:border-box;font-family:var(--ph-speccer-font-family)!important;font-size:12px;line-height:12px;pointer-events:none;user-select:none;z-index:99999}.ph.speccer,.ph.speccer.dissection,.ph.speccer:after,.ph.speccer:before{align-items:center;display:flex;justify-content:center;position:absolute}.ph.speccer.dissection{background-color:var(--ph-speccer-pin-color);border-radius:100%;box-sizing:initial;color:var(--ph-speccer-color-text-light);font-family:sans-serif;font-size:16px;font-weight:400;height:var(--ph-speccer-pin-size);line-height:150%;width:var(--ph-speccer-pin-size);z-index:100000}.ph.speccer.dissection:after{background-color:var(--ph-speccer-pin-color);content:"";height:var(--ph-speccer-pin-space);position:absolute;top:100%;width:var(--ph-speccer-line-width);z-index:99999}.ph.speccer.dissection.outline.left:after{height:var(--ph-speccer-line-width);left:100%;top:50%;width:var(--ph-speccer-pin-space)}.ph.speccer.dissection.outline.right:after{height:var(--ph-speccer-line-width);right:100%;top:50%;width:var(--ph-speccer-pin-space)}.ph.speccer.dissection.outline.enclose{background-color:initial;border:var(--ph-speccer-line-width) solid var(--ph-speccer-pin-color);border-radius:0;color:var(--ph-speccer-measure-color)}.ph.speccer.dissection.outline.enclose.right:after{left:calc(100% + var(--ph-speccer-pin-space) + var(--ph-speccer-line-width));right:auto}.ph.speccer.dissection.outline.enclose.right:before{left:100%;right:auto}.ph.speccer.dissection.outline.enclose.left:after{left:calc(var(--ph-speccer-line-width-negative) - var(--ph-speccer-pin-size) - var(--ph-speccer-pin-space));right:auto}.ph.speccer.dissection.outline.enclose.left:before{left:auto;right:100%}.ph.speccer.dissection.outline.enclose.top:after{bottom:auto;top:calc(var(--ph-speccer-line-width-negative) - var(--ph-speccer-pin-size) - var(--ph-speccer-pin-space))}.ph.speccer.dissection.outline.enclose.top:before{bottom:100%;top:auto}.ph.speccer.dissection.outline.enclose.bottom:after{bottom:auto;top:calc(100% + var(--ph-speccer-pin-space) + var(--ph-speccer-line-width))}.ph.speccer.dissection.outline.enclose.bottom:before{bottom:auto;top:100%}.ph.speccer.dissection.outline.full{background-color:initial;border:var(--ph-speccer-line-width) solid var(--ph-speccer-pin-color);border-radius:0;color:var(--ph-speccer-measure-color)}.ph.speccer.dissection.outline.full.right{border-left:none}.ph.speccer.dissection.outline.full.right:after{left:calc(8px + var(--ph-speccer-pin-space))}.ph.speccer.dissection.outline.full.right:before{left:100%}.ph.speccer.dissection.outline.full.left{border-right:none}.ph.speccer.dissection.outline.full.left:after{left:calc(-8px - var(--ph-speccer-pin-space))}.ph.speccer.dissection.outline.full.left:before{right:100%}.ph.speccer.dissection.outline.full.top{border-bottom:none}.ph.speccer.dissection.outline.full.top:after{top:calc(-8px - var(--ph-speccer-pin-space))}.ph.speccer.dissection.outline.full.top:before{bottom:100%}.ph.speccer.dissection.outline.full.bottom{border-top:none}.ph.speccer.dissection.outline.full.bottom:after{top:calc(8px + var(--ph-speccer-pin-space))}.ph.speccer.dissection.outline.full.bottom:before{top:100%}.ph.speccer.dissection.outline.bottom:after{height:var(--ph-speccer-pin-space);right:50%;top:calc(-100% - var(--ph-speccer-pin-space)/2);width:var(--ph-speccer-line-width)}.ph.speccer.dissection.outline.top:after,.ph.speccer.dissection.outline:after{height:var(--ph-speccer-pin-space);right:50%;top:100%;width:var(--ph-speccer-line-width)}[data-anatomy-section]{counter-reset:type}.ph.speccer.dissection.outline.full.left,.ph.speccer.dissection.outline.full.right{width:8px}.ph.speccer.dissection.outline.full.bottom,.ph.speccer.dissection.outline.full.top{height:8px}.ph.speccer.dissection.outline.full.bottom:after,.ph.speccer.dissection.outline.full.left:after,.ph.speccer.dissection.outline.full.right:after,.ph.speccer.dissection.outline.full.top:after{align-items:center;background-color:var(--ph-speccer-pin-color);border-radius:100%;color:var(--ph-speccer-color-text-light);content:attr(data-dissection-counter);display:flex;font-size:16px;height:var(--ph-speccer-pin-size);justify-content:center;line-height:150%;position:absolute;width:var(--ph-speccer-pin-size);z-index:100000}.ph.speccer.dissection.outline.full.left:after,.ph.speccer.dissection.outline.full.right:after{top:50%;transform:translateY(-50%)}.ph.speccer.dissection.outline.full.bottom:after,.ph.speccer.dissection.outline.full.top:after{left:50%;transform:translateX(-50%)}.ph.speccer.dissection.outline.full.bottom:before,.ph.speccer.dissection.outline.full.left:before,.ph.speccer.dissection.outline.full.right:before,.ph.speccer.dissection.outline.full.top:before{background-color:var(--ph-speccer-pin-color);content:"";display:block;position:absolute;z-index:100000}.ph.speccer.dissection.outline.full.left:before,.ph.speccer.dissection.outline.full.right:before{height:var(--ph-speccer-line-width);top:50%;transform:translateY(-50%);width:calc(var(--ph-speccer-pin-space) + var(--ph-speccer-line-width))}.ph.speccer.dissection.outline.full.bottom:before,.ph.speccer.dissection.outline.full.top:before{height:calc(var(--ph-speccer-pin-space) + var(--ph-speccer-line-width));left:50%;transform:translateX(-50%);width:var(--ph-speccer-line-width)}.ph.speccer.dissection.outline.enclose.left,.ph.speccer.dissection.outline.enclose.right{width:8px}.ph.speccer.dissection.outline.enclose.bottom,.ph.speccer.dissection.outline.enclose.top{height:8px}.ph.speccer.dissection.outline.enclose.bottom:after,.ph.speccer.dissection.outline.enclose.left:after,.ph.speccer.dissection.outline.enclose.right:after,.ph.speccer.dissection.outline.enclose.top:after{align-items:center;background-color:var(--ph-speccer-pin-color);border-radius:100%;color:var(--ph-speccer-color-text-light);content:attr(data-dissection-counter);display:flex;font-size:16px;height:var(--ph-speccer-pin-size);justify-content:center;line-height:150%;position:absolute;width:var(--ph-speccer-pin-size);z-index:100000}.ph.speccer.dissection.outline.enclose.left:after,.ph.speccer.dissection.outline.enclose.right:after{top:50%;transform:translateY(-50%)}.ph.speccer.dissection.outline.enclose.bottom:after,.ph.speccer.dissection.outline.enclose.top:after{left:50%;transform:translateX(-50%)}.ph.speccer.dissection.outline.enclose.bottom:before,.ph.speccer.dissection.outline.enclose.left:before,.ph.speccer.dissection.outline.enclose.right:before,.ph.speccer.dissection.outline.enclose.top:before{background-color:var(--ph-speccer-pin-color);content:"";display:block;position:absolute;z-index:100000}.ph.speccer.dissection.outline.enclose.left:before,.ph.speccer.dissection.outline.enclose.right:before{height:var(--ph-speccer-line-width);top:50%;transform:translateY(-50%);width:calc(var(--ph-speccer-pin-space) + var(--ph-speccer-line-width))}.ph.speccer.dissection.outline.enclose.bottom:before,.ph.speccer.dissection.outline.enclose.top:before{height:calc(var(--ph-speccer-pin-space) + var(--ph-speccer-line-width));left:50%;transform:translateX(-50%);width:var(--ph-speccer-line-width)}.ph.speccer.spacing{border:var(--ph-speccer-line-width) solid #0000;pointer-events:auto;transition:none}.ph.speccer.spacing:hover{border:var(--ph-speccer-line-width) solid var(--ph-speccer-color-text-dark)}.ph.speccer.spacing.margin{background-color:var(--ph-speccer-color-margin);color:var(--ph-speccer-color-text-dark)}.ph.speccer.spacing.padding{background-color:var(--ph-speccer-color-padding);color:var(--ph-speccer-spacing-color)}.ph.speccer.spacing.margin.bottom:after,.ph.speccer.spacing.margin.top:after{border-bottom:var(--ph-speccer-line-width) solid var(--ph-speccer-color-text-dark);border-top:var(--ph-speccer-line-width) solid var(--ph-speccer-color-text-dark);content:"";height:100%;left:40%;position:absolute;transition:none;width:9px}.ph.speccer.spacing.margin.bottom:before,.ph.speccer.spacing.margin.top:before{border-left:var(--ph-speccer-line-width) solid var(--ph-speccer-color-text-dark);content:"";height:100%;left:40%;margin-left:4px;position:absolute;transition:none;width:0}.ph.speccer.spacing.margin.left:after,.ph.speccer.spacing.margin.right:after{border-left:var(--ph-speccer-line-width) solid var(--ph-speccer-color-text-dark);border-right:var(--ph-speccer-line-width) solid var(--ph-speccer-color-text-dark);content:"";height:9px;position:absolute;top:10%;transition:none;width:100%}.ph.speccer.spacing.margin.left:before,.ph.speccer.spacing.margin.right:before{border-top:var(--ph-speccer-line-width) solid var(--ph-speccer-color-text-dark);content:"";height:0;margin-top:4px;position:absolute;top:10%;transition:none;width:100%}.ph.speccer.spacing.padding.bottom:after,.ph.speccer.spacing.padding.top:after{border-bottom:var(--ph-speccer-line-width) solid var(--ph-speccer-spacing-color);border-top:var(--ph-speccer-line-width) solid var(--ph-speccer-spacing-color);content:"";height:100%;left:40%;position:absolute;transition:none;width:9px}.ph.speccer.spacing.padding.bottom:before,.ph.speccer.spacing.padding.top:before{border-left:var(--ph-speccer-line-width) solid var(--ph-speccer-spacing-color);content:"";height:100%;left:40%;margin-left:4px;position:absolute;transition:none;width:0}.ph.speccer.spacing.padding.left:after,.ph.speccer.spacing.padding.right:after{border-left:var(--ph-speccer-line-width) solid var(--ph-speccer-spacing-color);border-right:var(--ph-speccer-line-width) solid var(--ph-speccer-spacing-color);content:"";height:9px;position:absolute;top:10%;transition:none;width:100%}.ph.speccer.spacing.padding.left:before,.ph.speccer.spacing.padding.right:before{border-top:var(--ph-speccer-line-width) solid var(--ph-speccer-spacing-color);content:"";height:0;margin-top:4px;position:absolute;top:10%;transition:none;width:100%}.ph.speccer.typography{background-color:var(--ph-speccer-typography-background-color);color:var(--ph-speccer-typography-color-text);display:block;font-size:10px;line-height:140%;max-width:none;padding:8px;text-align:left;width:auto}.ph.speccer.typography,.ph.speccer.typography:hover{border:var(--ph-speccer-line-width) solid var(--ph-speccer-pin-color)}.ph.speccer.typography:after{background-color:var(--ph-speccer-pin-color);content:"";display:block;position:absolute}.ph.speccer.typography.left:after,.ph.speccer.typography:after{left:100%}.ph.speccer.typography.left:after,.ph.speccer.typography.right:after,.ph.speccer.typography:after{height:var(--ph-speccer-line-width);top:50%;transform:translateY(-50%);width:var(--ph-speccer-pin-space)}.ph.speccer.typography.right:after{left:auto;right:100%}.ph.speccer.typography.top:after{top:100%}.ph.speccer.typography.bottom:after,.ph.speccer.typography.top:after{height:var(--ph-speccer-pin-space);left:50%;right:auto;transform:translateX(-50%);width:var(--ph-speccer-line-width)}.ph.speccer.typography.bottom:after{bottom:100%;top:auto}.ph.speccer.typography .speccer-styles{font-size:10px;line-height:140%;list-style:none;margin:0;padding:0 0 0 8px;width:100%}.ph.speccer.typography .speccer-styles .property{color:var(--ph-speccer-typography-color-property);font-size:10px;font-weight:400;margin:0;padding:0;text-align:left}.ph.speccer.typography .speccer-styles>li{border:none;color:var(--ph-speccer-typography-color-value);font-size:10px;font-weight:400;list-style:none;margin:0;padding:0;text-align:left}.ph.speccer.measure.width{border:var(--ph-speccer-line-width) solid var(--ph-speccer-measure-color);border-bottom:none;color:var(--ph-speccer-measure-color);height:var(--ph-speccer-measure-size)}.ph.speccer.measure.width:after{content:attr(data-measure);position:absolute;top:calc(-100% - 10px)}.ph.speccer.measure.width.bottom{border:var(--ph-speccer-line-width) solid var(--ph-speccer-measure-color);border-top:none;color:var(--ph-speccer-measure-color)}.ph.speccer.measure.width.bottom:after{content:attr(data-measure);position:absolute;top:calc(100% + 5px)}.ph.speccer.measure.width.top{border:var(--ph-speccer-line-width) solid var(--ph-speccer-measure-color);border-bottom:none;color:var(--ph-speccer-measure-color)}.ph.speccer.measure.width.top:after{bottom:calc(100% + 5px);content:attr(data-measure);position:absolute}.ph.speccer.measure.height.left{border:var(--ph-speccer-line-width) solid var(--ph-speccer-measure-color);border-right:none;color:var(--ph-speccer-measure-color);width:var(--ph-speccer-measure-size)}.ph.speccer.measure.height.left:after{content:attr(data-measure);left:calc(-100% - 20px - var(--ph-speccer-line-width));position:absolute;top:50%;transform:translateY(-50%) rotate(-90deg)}.ph.speccer.measure.height.right{border:var(--ph-speccer-line-width) solid var(--ph-speccer-measure-color);border-left:none;color:var(--ph-speccer-measure-color);width:var(--ph-speccer-measure-size)}.ph.speccer.measure.height.right:after{content:attr(data-measure);left:calc(100% - var(--ph-speccer-measure-size));position:absolute;top:50%;transform:translateY(-50%) rotate(90deg)}
1
+ .ph.speccer{--ph-speccer-color-padding:#db6fff66;--ph-speccer-color-padding-hover:#db6fff;--ph-speccer-color-margin:#fff76f66;--ph-speccer-color-margin-hover:#fff76f;--ph-speccer-color-text-light:#fff;--ph-speccer-color-text-dark:#333;--ph-speccer-color-contrast:#ff3aa8;--ph-speccer-spacing-color:var(--ph-speccer-color-contrast);--ph-speccer-measure-color:red;--ph-speccer-pin-color:var(--ph-speccer-color-contrast);--ph-speccer-typography-background-color:#fff;--ph-speccer-typography-color-property:#3f85f2;--ph-speccer-typography-color-text:#57575b;--ph-speccer-typography-color-value:var(--ph-speccer-color-contrast);--ph-speccer-depth-opacity-400:0.4;--ph-speccer-font-family:"Menlo for Powerline","Menlo Regular for Powerline","DejaVu Sans Mono",Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;--ph-speccer-font-size:12px;--ph-speccer-line-height:12px;--ph-speccer-pin-size:24px;--ph-speccer-pin-space:48px;--ph-speccer-line-width:1px;--ph-speccer-line-width-negative:-1px;--ph-speccer-measure-size:8px}.ph.speccer,.ph.speccer:after,.ph.speccer:before{box-sizing:border-box;font-family:var(--ph-speccer-font-family)!important;font-size:12px;line-height:12px;pointer-events:none;user-select:none;z-index:99999}.ph.speccer,.ph.speccer.dissection,.ph.speccer:after,.ph.speccer:before{align-items:center;display:flex;justify-content:center;position:absolute}.ph.speccer.dissection{background-color:var(--ph-speccer-pin-color);border-radius:100%;box-sizing:initial;color:var(--ph-speccer-color-text-light);font-family:sans-serif;font-size:16px;font-weight:400;height:var(--ph-speccer-pin-size);line-height:150%;width:var(--ph-speccer-pin-size);z-index:100000}.ph.speccer.dissection:after{background-color:var(--ph-speccer-pin-color);content:"";height:var(--ph-speccer-pin-space);position:absolute;top:100%;width:var(--ph-speccer-line-width);z-index:99999}.ph.speccer.dissection.outline.left:after{height:var(--ph-speccer-line-width);left:100%;top:50%;width:var(--ph-speccer-pin-space)}.ph.speccer.dissection.outline.right:after{height:var(--ph-speccer-line-width);right:100%;top:50%;width:var(--ph-speccer-pin-space)}.ph.speccer.dissection.outline.enclose{background-color:initial;border:var(--ph-speccer-line-width) solid var(--ph-speccer-pin-color);border-radius:0;color:var(--ph-speccer-measure-color)}.ph.speccer.dissection.outline.enclose.right:after{left:calc(100% + var(--ph-speccer-pin-space) + var(--ph-speccer-line-width));right:auto}.ph.speccer.dissection.outline.enclose.right:before{left:100%;right:auto}.ph.speccer.dissection.outline.enclose.left:after{left:calc(var(--ph-speccer-line-width-negative) - var(--ph-speccer-pin-size) - var(--ph-speccer-pin-space));right:auto}.ph.speccer.dissection.outline.enclose.left:before{left:auto;right:100%}.ph.speccer.dissection.outline.enclose.top:after{bottom:auto;top:calc(var(--ph-speccer-line-width-negative) - var(--ph-speccer-pin-size) - var(--ph-speccer-pin-space))}.ph.speccer.dissection.outline.enclose.top:before{bottom:100%;top:auto}.ph.speccer.dissection.outline.enclose.bottom:after{bottom:auto;top:calc(100% + var(--ph-speccer-pin-space) + var(--ph-speccer-line-width))}.ph.speccer.dissection.outline.enclose.bottom:before{bottom:auto;top:100%}.ph.speccer.dissection.outline.full{background-color:initial;border:var(--ph-speccer-line-width) solid var(--ph-speccer-pin-color);border-radius:0;color:var(--ph-speccer-measure-color)}.ph.speccer.dissection.outline.full.right{border-left:none}.ph.speccer.dissection.outline.full.right:after{left:calc(8px + var(--ph-speccer-pin-space))}.ph.speccer.dissection.outline.full.right:before{left:100%}.ph.speccer.dissection.outline.full.left{border-right:none}.ph.speccer.dissection.outline.full.left:after{left:calc(-8px - var(--ph-speccer-pin-space))}.ph.speccer.dissection.outline.full.left:before{right:100%}.ph.speccer.dissection.outline.full.top{border-bottom:none}.ph.speccer.dissection.outline.full.top:after{top:calc(-8px - var(--ph-speccer-pin-space))}.ph.speccer.dissection.outline.full.top:before{bottom:100%}.ph.speccer.dissection.outline.full.bottom{border-top:none}.ph.speccer.dissection.outline.full.bottom:after{top:calc(8px + var(--ph-speccer-pin-space))}.ph.speccer.dissection.outline.full.bottom:before{top:100%}.ph.speccer.dissection.outline.bottom:after{height:var(--ph-speccer-pin-space);right:50%;top:calc(-100% - var(--ph-speccer-pin-space)/2);width:var(--ph-speccer-line-width)}.ph.speccer.dissection.outline.top:after,.ph.speccer.dissection.outline:after{height:var(--ph-speccer-pin-space);right:50%;top:100%;width:var(--ph-speccer-line-width)}[data-anatomy-section]{counter-reset:type}.ph.speccer.dissection.outline.full.left,.ph.speccer.dissection.outline.full.right{width:8px}.ph.speccer.dissection.outline.full.bottom,.ph.speccer.dissection.outline.full.top{height:8px}.ph.speccer.dissection.outline.full.bottom:after,.ph.speccer.dissection.outline.full.left:after,.ph.speccer.dissection.outline.full.right:after,.ph.speccer.dissection.outline.full.top:after{align-items:center;background-color:var(--ph-speccer-pin-color);border-radius:100%;color:var(--ph-speccer-color-text-light);content:attr(data-dissection-counter);display:flex;font-size:16px;height:var(--ph-speccer-pin-size);justify-content:center;line-height:150%;position:absolute;width:var(--ph-speccer-pin-size);z-index:100000}.ph.speccer.dissection.outline.full.left:after,.ph.speccer.dissection.outline.full.right:after{top:50%;transform:translateY(-50%)}.ph.speccer.dissection.outline.full.bottom:after,.ph.speccer.dissection.outline.full.top:after{left:50%;transform:translateX(-50%)}.ph.speccer.dissection.outline.full.bottom:before,.ph.speccer.dissection.outline.full.left:before,.ph.speccer.dissection.outline.full.right:before,.ph.speccer.dissection.outline.full.top:before{background-color:var(--ph-speccer-pin-color);content:"";display:block;position:absolute;z-index:100000}.ph.speccer.dissection.outline.full.left:before,.ph.speccer.dissection.outline.full.right:before{height:var(--ph-speccer-line-width);top:50%;transform:translateY(-50%);width:calc(var(--ph-speccer-pin-space) + var(--ph-speccer-line-width))}.ph.speccer.dissection.outline.full.bottom:before,.ph.speccer.dissection.outline.full.top:before{height:calc(var(--ph-speccer-pin-space) + var(--ph-speccer-line-width));left:50%;transform:translateX(-50%);width:var(--ph-speccer-line-width)}.ph.speccer.dissection.outline.enclose.left,.ph.speccer.dissection.outline.enclose.right{width:8px}.ph.speccer.dissection.outline.enclose.bottom,.ph.speccer.dissection.outline.enclose.top{height:8px}.ph.speccer.dissection.outline.enclose.bottom:after,.ph.speccer.dissection.outline.enclose.left:after,.ph.speccer.dissection.outline.enclose.right:after,.ph.speccer.dissection.outline.enclose.top:after{align-items:center;background-color:var(--ph-speccer-pin-color);border-radius:100%;color:var(--ph-speccer-color-text-light);content:attr(data-dissection-counter);display:flex;font-size:16px;height:var(--ph-speccer-pin-size);justify-content:center;line-height:150%;position:absolute;width:var(--ph-speccer-pin-size);z-index:100000}.ph.speccer.dissection.outline.enclose.left:after,.ph.speccer.dissection.outline.enclose.right:after{top:50%;transform:translateY(-50%)}.ph.speccer.dissection.outline.enclose.bottom:after,.ph.speccer.dissection.outline.enclose.top:after{left:50%;transform:translateX(-50%)}.ph.speccer.dissection.outline.enclose.bottom:before,.ph.speccer.dissection.outline.enclose.left:before,.ph.speccer.dissection.outline.enclose.right:before,.ph.speccer.dissection.outline.enclose.top:before{background-color:var(--ph-speccer-pin-color);content:"";display:block;position:absolute;z-index:100000}.ph.speccer.dissection.outline.enclose.left:before,.ph.speccer.dissection.outline.enclose.right:before{height:var(--ph-speccer-line-width);top:50%;transform:translateY(-50%);width:calc(var(--ph-speccer-pin-space) + var(--ph-speccer-line-width))}.ph.speccer.dissection.outline.enclose.bottom:before,.ph.speccer.dissection.outline.enclose.top:before{height:calc(var(--ph-speccer-pin-space) + var(--ph-speccer-line-width));left:50%;transform:translateX(-50%);width:var(--ph-speccer-line-width)}.ph.speccer.dissection.outline.subtle{background-color:var(--ph-speccer-color-text-light);border:var(--ph-speccer-line-width) solid var(--ph-speccer-pin-color);color:var(--ph-speccer-pin-color)}.ph.speccer.dissection.outline.subtle.bottom:after,.ph.speccer.dissection.outline.subtle.top:after{background-color:initial;border-right:var(--ph-speccer-line-width) dashed var(--ph-speccer-pin-color);width:0}.ph.speccer.dissection.outline.subtle.left:after,.ph.speccer.dissection.outline.subtle.right:after{background-color:initial;border-top:var(--ph-speccer-line-width) dashed var(--ph-speccer-pin-color);height:0}.ph.speccer.dissection.outline.full.subtle{background-color:initial;border:var(--ph-speccer-line-width) dashed var(--ph-speccer-pin-color)}.ph.speccer.dissection.outline.full.subtle.top{border-bottom:none}.ph.speccer.dissection.outline.full.subtle.bottom{border-top:none}.ph.speccer.dissection.outline.full.subtle.right{border-left:none}.ph.speccer.dissection.outline.full.subtle.left{border-right:none}.ph.speccer.dissection.outline.full.subtle:after{background-color:var(--ph-speccer-color-text-light);border:var(--ph-speccer-line-width) solid var(--ph-speccer-pin-color);color:var(--ph-speccer-pin-color);height:var(--ph-speccer-pin-size);width:var(--ph-speccer-pin-size)}.ph.speccer.dissection.outline.full.subtle.bottom:before,.ph.speccer.dissection.outline.full.subtle.top:before{background-color:initial;border-right:var(--ph-speccer-line-width) dashed var(--ph-speccer-pin-color);width:0}.ph.speccer.dissection.outline.full.subtle.left:before,.ph.speccer.dissection.outline.full.subtle.right:before{background-color:initial;border-top:var(--ph-speccer-line-width) dashed var(--ph-speccer-pin-color);height:0}.ph.speccer.dissection.outline.enclose.subtle{border-style:dashed}.ph.speccer.dissection.outline.enclose.subtle:after{background-color:var(--ph-speccer-color-text-light);border:var(--ph-speccer-line-width) solid var(--ph-speccer-pin-color);color:var(--ph-speccer-pin-color);height:var(--ph-speccer-pin-size);width:var(--ph-speccer-pin-size)}.ph.speccer.dissection.outline.enclose.subtle.bottom:before,.ph.speccer.dissection.outline.enclose.subtle.top:before{background-color:initial;border-right:var(--ph-speccer-line-width) dashed var(--ph-speccer-pin-color);width:0}.ph.speccer.dissection.outline.enclose.subtle.left:before,.ph.speccer.dissection.outline.enclose.subtle.right:before{background-color:initial;border-top:var(--ph-speccer-line-width) dashed var(--ph-speccer-pin-color);height:0}.ph.speccer.spacing{border:var(--ph-speccer-line-width) solid #0000;pointer-events:auto;transition:none}.ph.speccer.spacing:hover{border:var(--ph-speccer-line-width) solid var(--ph-speccer-color-text-dark)}.ph.speccer.spacing.margin{background-color:var(--ph-speccer-color-margin);color:var(--ph-speccer-color-text-dark)}.ph.speccer.spacing.padding{background-color:var(--ph-speccer-color-padding);color:var(--ph-speccer-spacing-color)}.ph.speccer.spacing.margin.bottom:after,.ph.speccer.spacing.margin.top:after{border-bottom:var(--ph-speccer-line-width) solid var(--ph-speccer-color-text-dark);border-top:var(--ph-speccer-line-width) solid var(--ph-speccer-color-text-dark);content:"";height:100%;left:40%;position:absolute;transition:none;width:9px}.ph.speccer.spacing.margin.bottom:before,.ph.speccer.spacing.margin.top:before{border-left:var(--ph-speccer-line-width) solid var(--ph-speccer-color-text-dark);content:"";height:100%;left:40%;margin-left:4px;position:absolute;transition:none;width:0}.ph.speccer.spacing.margin.left:after,.ph.speccer.spacing.margin.right:after{border-left:var(--ph-speccer-line-width) solid var(--ph-speccer-color-text-dark);border-right:var(--ph-speccer-line-width) solid var(--ph-speccer-color-text-dark);content:"";height:9px;position:absolute;top:10%;transition:none;width:100%}.ph.speccer.spacing.margin.left:before,.ph.speccer.spacing.margin.right:before{border-top:var(--ph-speccer-line-width) solid var(--ph-speccer-color-text-dark);content:"";height:0;margin-top:4px;position:absolute;top:10%;transition:none;width:100%}.ph.speccer.spacing.padding.bottom:after,.ph.speccer.spacing.padding.top:after{border-bottom:var(--ph-speccer-line-width) solid var(--ph-speccer-spacing-color);border-top:var(--ph-speccer-line-width) solid var(--ph-speccer-spacing-color);content:"";height:100%;left:40%;position:absolute;transition:none;width:9px}.ph.speccer.spacing.padding.bottom:before,.ph.speccer.spacing.padding.top:before{border-left:var(--ph-speccer-line-width) solid var(--ph-speccer-spacing-color);content:"";height:100%;left:40%;margin-left:4px;position:absolute;transition:none;width:0}.ph.speccer.spacing.padding.left:after,.ph.speccer.spacing.padding.right:after{border-left:var(--ph-speccer-line-width) solid var(--ph-speccer-spacing-color);border-right:var(--ph-speccer-line-width) solid var(--ph-speccer-spacing-color);content:"";height:9px;position:absolute;top:10%;transition:none;width:100%}.ph.speccer.spacing.padding.left:before,.ph.speccer.spacing.padding.right:before{border-top:var(--ph-speccer-line-width) solid var(--ph-speccer-spacing-color);content:"";height:0;margin-top:4px;position:absolute;top:10%;transition:none;width:100%}.ph.speccer.typography{background-color:var(--ph-speccer-typography-background-color);color:var(--ph-speccer-typography-color-text);display:block;font-size:10px;line-height:140%;max-width:none;padding:8px;text-align:left;width:auto}.ph.speccer.typography,.ph.speccer.typography:hover{border:var(--ph-speccer-line-width) solid var(--ph-speccer-pin-color)}.ph.speccer.typography:after{background-color:var(--ph-speccer-pin-color);content:"";display:block;position:absolute}.ph.speccer.typography.left:after,.ph.speccer.typography:after{left:100%}.ph.speccer.typography.left:after,.ph.speccer.typography.right:after,.ph.speccer.typography:after{height:var(--ph-speccer-line-width);top:50%;transform:translateY(-50%);width:var(--ph-speccer-pin-space)}.ph.speccer.typography.right:after{left:auto;right:100%}.ph.speccer.typography.top:after{top:100%}.ph.speccer.typography.bottom:after,.ph.speccer.typography.top:after{height:var(--ph-speccer-pin-space);left:50%;right:auto;transform:translateX(-50%);width:var(--ph-speccer-line-width)}.ph.speccer.typography.bottom:after{bottom:100%;top:auto}.ph.speccer.typography .speccer-styles{font-size:10px;line-height:140%;list-style:none;margin:0;padding:0 0 0 8px;width:100%}.ph.speccer.typography .speccer-styles .property{color:var(--ph-speccer-typography-color-property);font-size:10px;font-weight:400;margin:0;padding:0;text-align:left}.ph.speccer.typography .speccer-styles>li{border:none;color:var(--ph-speccer-typography-color-value);font-size:10px;font-weight:400;list-style:none;margin:0;padding:0;text-align:left}.ph.speccer.measure.width{border:var(--ph-speccer-line-width) solid var(--ph-speccer-measure-color);border-bottom:none;color:var(--ph-speccer-measure-color);height:var(--ph-speccer-measure-size)}.ph.speccer.measure.width:after{content:attr(data-measure);position:absolute;top:calc(-100% - 10px)}.ph.speccer.measure.width.bottom{border:var(--ph-speccer-line-width) solid var(--ph-speccer-measure-color);border-top:none;color:var(--ph-speccer-measure-color)}.ph.speccer.measure.width.bottom:after{content:attr(data-measure);position:absolute;top:calc(100% + 5px)}.ph.speccer.measure.width.top{border:var(--ph-speccer-line-width) solid var(--ph-speccer-measure-color);border-bottom:none;color:var(--ph-speccer-measure-color)}.ph.speccer.measure.width.top:after{bottom:calc(100% + 5px);content:attr(data-measure);position:absolute}.ph.speccer.measure.height.left{border:var(--ph-speccer-line-width) solid var(--ph-speccer-measure-color);border-right:none;color:var(--ph-speccer-measure-color);width:var(--ph-speccer-measure-size)}.ph.speccer.measure.height.left:after{content:attr(data-measure);left:calc(-100% - 20px - var(--ph-speccer-line-width));position:absolute;top:50%;transform:translateY(-50%) rotate(-90deg)}.ph.speccer.measure.height.right{border:var(--ph-speccer-line-width) solid var(--ph-speccer-measure-color);border-left:none;color:var(--ph-speccer-measure-color);width:var(--ph-speccer-measure-size)}.ph.speccer.measure.height.right:after{content:attr(data-measure);left:calc(100% - var(--ph-speccer-measure-size));position:absolute;top:50%;transform:translateY(-50%) rotate(90deg)}.ph.speccer.measure.subtle.height.left,.ph.speccer.measure.subtle.height.right,.ph.speccer.measure.subtle.width.bottom,.ph.speccer.measure.subtle.width.top{border-style:dashed}.ph.speccer.measure.subtle.width.top{border-bottom:none}.ph.speccer.measure.subtle.width.bottom{border-top:none}.ph.speccer.measure.subtle.height.right{border-left:none}.ph.speccer.measure.subtle.height.left{border-right:none}