@phin-tech/dottie 0.6.0 → 0.6.2
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/PARITY.md +2 -1
- package/README.md +8 -2
- package/dist/compile.js +56 -4
- package/dist/dottie-compile.mjs +68 -6
- package/dist/dottie-loader.js +2 -1
- package/dist/dottie-player.js +247 -149
- package/dist/dottie-player.min.js +51 -49
- package/dist/dottie.js +240 -149
- package/dist/fonts/OFL-architects-daughter.txt +93 -0
- package/dist/fonts/OFL-caveat.txt +93 -0
- package/dist/fonts/OFL-patrick-hand.txt +93 -0
- package/dist/fonts/architects-daughter-regular.woff2 +0 -0
- package/dist/fonts/caveat-bold.woff2 +0 -0
- package/dist/fonts/caveat-regular.woff2 +0 -0
- package/dist/fonts/patrick-hand-regular.woff2 +0 -0
- package/dist/types/clicks.d.ts +1 -1
- package/dist/types/compile.d.ts +5 -1
- package/dist/types/fonts.d.ts +13 -0
- package/dist/types/index.d.ts +3 -1
- package/dist/types/metrics.d.ts +16 -9
- package/dist/types/model.d.ts +7 -0
- package/dist/types/svg.d.ts +4 -2
- package/dist/types/text.d.ts +20 -6
- package/package.json +1 -1
package/dist/dottie.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! dottie.js 0.6.
|
|
1
|
+
/*! dottie.js 0.6.2 | Apache-2.0 | https://github.com/phin-tech/dottie */
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
3
|
var __defNormalProp = (obj, key, value2) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value: value2 }) : obj[key] = value2;
|
|
4
4
|
var __publicField = (obj, key, value2) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value2);
|
|
@@ -13,7 +13,7 @@ var KNOWN_FIELDS = {
|
|
|
13
13
|
symbol: ["id", "name", "width", "height", "layers", "elements", "timeline", "button", "params"],
|
|
14
14
|
layer: ["id", "name", "visible", "locked"],
|
|
15
15
|
rgba: ["r", "g", "b", "a"],
|
|
16
|
-
style: ["stroke", "fill", "fillStyle", "strokeWidth", "dash", "roughness", "bowing", "fontSize", "gridSize", "opacity", "dashOffset"],
|
|
16
|
+
style: ["stroke", "fill", "fillStyle", "strokeWidth", "dash", "roughness", "bowing", "fontSize", "font", "gridSize", "opacity", "dashOffset"],
|
|
17
17
|
element: [
|
|
18
18
|
"id",
|
|
19
19
|
"kind",
|
|
@@ -33,6 +33,7 @@ var KNOWN_FIELDS = {
|
|
|
33
33
|
"evenOdd",
|
|
34
34
|
"rotation",
|
|
35
35
|
"link",
|
|
36
|
+
"url",
|
|
36
37
|
"anchor",
|
|
37
38
|
"click",
|
|
38
39
|
"hover",
|
|
@@ -91,6 +92,9 @@ function allowedURL(url) {
|
|
|
91
92
|
if (!/^(https?:\/\/|mailto:)/i.test(u) || [...u].length <= 7 || /[\u0000-\u001f\u007f-\u009f]/.test(u)) return null;
|
|
92
93
|
return u;
|
|
93
94
|
}
|
|
95
|
+
function webLink(url) {
|
|
96
|
+
return url ? allowedURL(url) : null;
|
|
97
|
+
}
|
|
94
98
|
function rgba(v) {
|
|
95
99
|
if (!isObj(v)) return void 0;
|
|
96
100
|
const r = num(v.r), g = num(v.g), b = num(v.b);
|
|
@@ -129,6 +133,7 @@ var Reader = class {
|
|
|
129
133
|
roughness: num(s.roughness) ?? 1,
|
|
130
134
|
bowing: num(s.bowing) ?? 1,
|
|
131
135
|
fontSize: num(s.fontSize) ?? 18,
|
|
136
|
+
font: str(s.font) || null,
|
|
132
137
|
gridSize: num(s.gridSize) ?? null,
|
|
133
138
|
opacity: num(s.opacity) ?? null,
|
|
134
139
|
dashOffset: num(s.dashOffset) ?? null
|
|
@@ -206,6 +211,7 @@ var Reader = class {
|
|
|
206
211
|
evenOdd: bool(v.evenOdd) ?? null,
|
|
207
212
|
rotation: num(v.rotation) ?? null,
|
|
208
213
|
link: uuid(v.link) ?? null,
|
|
214
|
+
url: str(v.url) ?? null,
|
|
209
215
|
anchor: str(v.anchor) ?? null,
|
|
210
216
|
click: this.click(v.click),
|
|
211
217
|
hover: this.hover(v.hover),
|
|
@@ -455,6 +461,159 @@ function elementIndex(page) {
|
|
|
455
461
|
return m;
|
|
456
462
|
}
|
|
457
463
|
|
|
464
|
+
// src/metrics.ts
|
|
465
|
+
var monoAdvance = 0.60205078125;
|
|
466
|
+
var monoAscent = 0.92822265625;
|
|
467
|
+
var monoDescent = 0.23583984375;
|
|
468
|
+
var families = { "Architects Daughter": { "faces": { "regular": { "ascent": 0.986328125, "descent": 0.4033203125, "k": {}, "leading": 0, "w": { " ": 400.39, "_": 686.52, "-": 310.55, "\u2013": 310.55, "\u2014": 411.13, ",": 177.73, ";": 124.02, ":": 166.99, "!": 134.77, "?": 505.86, ".": 140.63, "\u2026": 422.85, "\xB7": 140.63, "'": 162.11, "\u2018": 162.11, "\u2019": 162.11, '"': 236.33, "\u201C": 236.33, "\u201D": 236.33, "(": 297.85, ")": 351.56, "[": 424.8, "]": 541.02, "{": 352.54, "}": 478.52, "@": 1042.97, "*": 507.81, "/": 455.08, "\\": 501.95, "&": 669.92, "#": 637.7, "%": 518.55, "\u2022": 192.38, "`": 171.88, "^": 306.64, "\u2190": 1e3, "\u2192": 1e3, "\u2191": 645.02, "\u2193": 645.02, "+": 524.41, "\xD7": 470.7, "<": 475.59, "=": 492.19, ">": 471.68, "|": 145.51, "~": 444.34, "\u25E6": 578.13, "\u2610": 830.08, "\u2611": 830.08, "\u2713": 764.16, "$": 556.64, "0": 630.86, "1": 127.93, "2": 572.27, "3": 508.79, "4": 680.66, "5": 708.01, "6": 626.95, "7": 615.23, "8": 648.44, "9": 569.34, "a": 508.79, "A": 640.63, "b": 561.52, "B": 710.94, "c": 632.81, "C": 708.01, "d": 512.7, "D": 648.44, "e": 541.02, "E": 591.8, "\xE9": 541.02, "f": 593.75, "F": 692.38, "g": 515.63, "G": 692.38, "h": 495.12, "H": 605.47, "i": 151.37, "I": 151.37, "j": 177.73, "J": 529.3, "k": 614.26, "K": 605.47, "l": 157.23, "L": 692.38, "m": 778.32, "M": 827.15, "n": 500, "N": 626.95, "o": 562.5, "O": 669.92, "p": 556.64, "P": 637.7, "q": 513.67, "Q": 712.89, "r": 551.76, "R": 712.89, "s": 501.95, "S": 642.58, "t": 404.3, "T": 623.05, "u": 507.81, "U": 561.52, "v": 518.55, "V": 626.95, "w": 808.59, "W": 940.43, "x": 470.7, "X": 599.61, "y": 548.83, "Y": 534.18, "z": 495.12, "Z": 784.18 } } }, "fallback": { "\u2190": [0.966796875, 0.2109375, 0], "\u2192": [0.966796875, 0.2109375, 0], "\u2191": [0.966796875, 0.2109375, 0], "\u2193": [0.966796875, 0.2109375, 0], "\u25E6": [0.966796875, 0.2109375, 0], "\u2610": [0.66650390625, 0.25, 0.08349609375], "\u2611": [0.66650390625, 0.25, 0.08349609375], "\u2713": [0.966796875, 0.2109375, 0] } }, "Caveat": { "faces": { "bold": { "ascent": 0.9600067138671875, "descent": 0.3000030517578125, "k": { "AC": -20, "AE": -10, "AG": -10, "AH": -10, "AI": 10, "Aj": 10, "AJ": 10, "AL": -10, "AM": 10, "An": -10, "AO": -20, "AP": -10, "Aq": -10, "AQ": -20, "Ar": -10, "As": -10, "AS": -35, "AT": -50, "Au": -10, "AU": -20, "av": -20, "Av": -5, "AV": -40, "aw": -10, "AW": -20, "Ax": 10, "AX": -10, "ay": -20, "Ay": -10, "AY": -65, "Az": 20, "AZ": -10, "ba": -10, "bc": -10, "BC": -20, "bd": -10, "Bf": 10, "BF": -20, "Bg": 10, "bh": -5, "Bi": 10, "BI": -10, "bj": -5, "Bj": 10, "BJ": -10, "Bk": 10, "Bl": 10, "Bm": 10, "BP": -10, "BR": -10, "BS": -20, "BT": -40, "bu": -10, "BU": -20, "BV": -50, "BW": -50, "bx": -10, "Bx": 10, "BX": -40, "by": -10, "BY": -65, "Bz": 40, "BZ": -30, "CA": -20, "Cc": -5, "CC": -10, "Cd": -10, "CE": -10, "CG": -10, "Cj": 10, "CJ": -10, "CK": -10, "cl": 10, "Cl": 5, "Cn": -5, "CO": -10, "CP": -10, "CQ": -20, "Cs": -10, "CS": -10, "Ct": 10, "CT": -20, "Cu": -10, "CU": -10, "Cv": -20, "CV": -20, "cw": -10, "Cw": -10, "CW": -20, "Cx": 20, "CX": -30, "cy": -5, "CY": -35, "Cz": 20, "CZ": -40, "DA": -10, "Db": 10, "Dc": 10, "De": 10, "Df": 20, "DF": -10, "Dg": 10, "Dh": 10, "Di": 15, "DI": -10, "Dj": 5, "DJ": -10, "Dk": 10, "Dl": 10, "Dm": 20, "DM": -5, "dn": -10, "Do": 10, "Dp": 10, "Dq": 10, "Dr": 10, "Ds": 10, "dt": 10, "Dt": 20, "DT": -40, "du": -10, "Dv": 30, "DV": -30, "Dw": 20, "DW": -10, "Dx": 20, "DX": -50, "Dy": 10, "DY": -50, "Dz": 30, "DZ": -30, "EC": -10, "ED": -10, "EG": -10, "EJ": -10, "el": 10, "EO": -10, "EQ": -20, "ES": -40, "ET": -10, "EU": -20, "Ev": -10, "EV": -25, "Ew": -10, "EW": -30, "Ex": 10, "EX": -40, "Ey": -10, "EY": -50, "Ez": 20, "EZ": -20, "fa": -10, "Fa": -30, "FA": -40, "Fc": -20, "FC": -10, "Fd": -20, "FD": 20, "Fe": -15, "ff": 10, "Ff": 10, "FF": 20, "Fg": -10, "fh": 10, "Fh": 20, "fi": 10, "Fi": 10, "FI": 10, "fj": 10, "Fj": 10, "FJ": 20, "Fk": 10, "fl": 20, "Fl": 20, "FL": 10, "fm": 10, "FM": -10, "Fn": -20, "FN": 10, "Fo": -20, "FO": 10, "Fp": -10, "FP": -10, "Fq": -10, "FQ": 10, "Fr": -10, "FS": 10, "ft": 40, "Ft": 10, "FT": -30, "Fu": -10, "fv": 10, "Fv": 10, "FV": 10, "FW": 10, "fy": 10, "FY": 10, "Fz": 10, "FZ": -10, "GA": -10, "Gf": 10, "Gh": 10, "gi": 10, "Gi": 10, "GI": -10, "Gj": 10, "GJ": -10, "Gk": 10, "Gl": 10, "Gm": 10, "GM": -10, "GN": 10, "GP": -20, "GS": -10, "Gt": 10, "GU": -10, "Gv": 10, "GV": -10, "GW": -20, "Gx": 10, "GX": -40, "gy": 10, "GY": -40, "Gz": 10, "GZ": -20, "Hb": 10, "hf": -10, "Hf": 10, "hg": -20, "Hh": 10, "Hi": 10, "Hj": 20, "Hk": 10, "Hl": 10, "Hm": 10, "hq": -10, "hs": -10, "Ht": 20, "hv": -30, "Hv": 10, "hw": -15, "Hx": 20, "hy": -30, "Hy": 10, "Hz": 20, "Ia": -10, "IA": 10, "Ib": 10, "Ic": -10, "Id": -10, "ID": 30, "Ie": -10, "if": 10, "If": 20, "IF": 40, "Ig": -10, "Ih": 30, "Ii": 20, "II": 30, "Ij": 30, "IJ": 40, "Ik": 20, "IK": 10, "Il": 20, "IL": 10, "IM": 30, "In": -10, "IN": 20, "Io": -10, "Ip": 10, "Iq": -20, "Ir": -10, "IR": 10, "Is": -10, "It": 10, "Iu": -10, "IU": 10, "iv": 10, "Iv": -20, "IV": 30, "Iw": -25, "IW": 20, "Ix": 10, "IX": 10, "Iy": -10, "IY": 30, "Iz": 20, "IZ": 20, "Ja": -10, "Jb": 10, "Jc": -10, "Jd": -10, "Je": -10, "Jf": 10, "Jh": 10, "Ji": 10, "JI": -10, "Jj": 20, "JJ": 10, "Jk": 10, "Jl": 20, "Jn": -10, "Jo": -10, "JO": -10, "Jp": 10, "JP": -10, "Jq": -10, "JQ": -10, "JR": -10, "jt": 10, "Jt": 20, "JT": 10, "ju": -10, "Ju": -20, "JU": -10, "jx": 10, "JX": -25, "jy": 10, "JY": -20, "jz": 10, "Jz": 10, "JZ": -20, "Ka": -40, "kc": 20, "Kc": -40, "KC": -10, "Kd": -40, "KD": 10, "ke": 10, "Ke": -40, "kf": 20, "Kf": 10, "KF": 20, "Kg": -40, "KG": -10, "kh": 10, "Kh": 10, "ki": 10, "Ki": 10, "Kj": 40, "KJ": 20, "kk": 20, "Kk": 10, "kl": 20, "Kl": 10, "km": 10, "KM": 20, "Kn": -40, "ko": 10, "Ko": -50, "KO": -10, "Kp": 10, "Kq": -50, "kr": 10, "Ks": -40, "kt": 10, "Kt": 10, "KT": -10, "ku": 10, "Ku": -60, "kv": 10, "Kv": -30, "Kw": -40, "Kx": -10, "KX": -10, "ky": -10, "Ky": -30, "kz": 10, "Lb": -10, "LC": -20, "LE": -20, "Lf": 10, "Lg": -10, "LG": -20, "Lh": -10, "Li": 10, "LI": -40, "Lj": 20, "Lk": 10, "ll": 10, "Ll": 10, "LL": -20, "Ln": -20, "LO": -25, "Lp": 10, "Lq": -40, "LQ": -30, "Ls": -10, "LS": -65, "lt": 10, "Lt": -10, "LT": -70, "Lu": -40, "LU": -45, "Lv": -60, "LV": -70, "Lw": -40, "LW": -40, "Lx": 10, "Ly": -20, "LY": -90, "lz": 20, "Lz": 30, "LZ": -10, "Mb": 10, "md": 10, "Mf": 10, "Mh": 10, "Mi": 10, "MJ": 10, "Mk": 10, "Ml": 10, "mo": 20, "Mp": 10, "MP": -10, "Mq": -10, "MQ": -10, "MS": -20, "Mt": 20, "MT": -30, "Mu": -10, "MU": -20, "mv": -15, "Mv": 10, "MV": -20, "mw": -10, "MW": -30, "Mx": 10, "MX": -10, "my": -10, "My": -10, "MY": -50, "Mz": 10, "MZ": -10, "nb": -15, "Nb": 10, "Ne": 10, "Nf": 10, "Ng": 10, "Nh": 10, "Ni": 20, "Nj": 20, "Nk": 20, "Nl": 20, "Nm": 10, "Nq": 10, "ns": -5, "nt": -10, "Nt": 20, "nu": -10, "nv": -20, "Nv": 30, "nw": -20, "NW": -10, "Nx": 30, "NX": -20, "ny": -20, "Ny": 10, "NY": -20, "Nz": 40, "NZ": -10, "OA": -10, "OD": -10, "Of": 20, "Og": 20, "Oh": 10, "Oi": 20, "OI": -10, "oj": -5, "Oj": 20, "Ok": 10, "Ol": 20, "OL": 10, "Om": 20, "Oo": 10, "Op": 10, "Oq": 10, "OQ": 10, "Os": 10, "Ot": 20, "OT": -10, "ou": -10, "ov": 5, "Ov": 30, "OV": -10, "ow": -10, "Ow": 10, "OW": -10, "Ox": 30, "OX": -40, "oy": -10, "Oy": 20, "OY": -40, "Oz": 30, "OZ": -20, "Pa": -40, "PA": -40, "Pc": -30, "Pd": -40, "PD": -10, "Pe": -20, "Pf": 10, "Pg": -10, "Ph": 10, "Pi": 10, "PI": -10, "Pj": 20, "PJ": -10, "Pk": 10, "Pl": 10, "Pm": 10, "PM": -30, "pn": -10, "Pn": -10, "PN": -10, "Po": -30, "Pq": -30, "Ps": -20, "PS": 10, "Pt": 20, "pu": -10, "Pu": -30, "Pv": 10, "Px": 10, "PX": -35, "py": -10, "PY": -20, "Pz": 10, "PZ": -50, "Qb": 10, "Qf": 20, "Qg": 20, "qh": -10, "Qh": 10, "Qi": 20, "qj": 10, "Qj": 90, "QJ": 80, "Qk": 10, "Ql": 20, "Qm": 20, "qn": -10, "qo": -10, "Qp": 20, "Qt": 30, "QT": -10, "qu": -10, "Qv": 20, "QV": -10, "QW": -10, "Qx": 20, "QX": -20, "Qy": 50, "QY": -30, "Qz": 40, "QZ": -10, "ra": -5, "Ra": -10, "RA": -25, "RB": -10, "Rc": -10, "RC": -20, "Rd": -10, "RD": 10, "Re": -10, "RE": -20, "Rf": 20, "RF": 10, "Rg": -10, "RG": -10, "ri": 5, "RI": -10, "Rj": 30, "RJ": 30, "RL": -10, "RM": -20, "Rn": -10, "RN": 10, "Ro": -10, "RO": -10, "Rp": 20, "Rq": -30, "RQ": -10, "Rr": -10, "Rs": -10, "Rt": 10, "RT": -10, "Ru": -30, "RU": -20, "rv": 20, "RV": -10, "Rw": -10, "RW": -10, "Rx": 10, "RX": -20, "Ry": 10, "RY": -30, "Rz": 20, "RZ": -45, "Sa": -10, "Sb": 10, "Sc": -20, "Sd": -25, "SD": 20, "Se": -20, "SE": -10, "sf": 10, "Sf": 20, "SF": 30, "Sg": -20, "Sh": 20, "Si": 20, "SI": 10, "Sj": 30, "SJ": 30, "Sk": 10, "Sl": 20, "SL": 20, "Sn": -20, "SN": 10, "So": -10, "SO": 10, "Sq": -20, "Sr": -10, "Ss": -10, "st": 10, "St": 20, "Su": -20, "sv": 20, "Sv": -50, "SV": 20, "Sw": -30, "SW": 10, "sx": 15, "Sx": 10, "Sy": -15, "SY": 10, "sz": 20, "Sz": 20, "SZ": -10, "Ta": -90, "TA": -50, "Tc": -80, "TC": -10, "Td": -110, "TD": 10, "Te": -90, "TE": -10, "Tf": 20, "TF": 30, "Tg": -80, "TG": -10, "Th": 20, "ti": 5, "TI": 10, "Tj": 20, "Tk": 10, "Tl": 20, "Tm": -50, "TM": -30, "Tn": -90, "To": -90, "Tp": -80, "Tq": -120, "Tr": -80, "Ts": -80, "Tt": 10, "TT": -30, "Tu": -90, "tv": 10, "Tv": -70, "TV": 10, "Tw": -100, "tx": 20, "Tx": -60, "TX": -10, "Ty": -50, "tz": 30, "Tz": -40, "TZ": -10, "ub": -10, "Ub": 20, "UE": 10, "uf": 10, "Uf": 30, "UF": 10, "Ug": 10, "Uh": 30, "ui": 10, "Ui": 30, "Uj": 40, "uk": 10, "Uk": 20, "ul": 10, "Ul": 30, "Um": 30, "Up": 10, "UQ": 30, "Ur": 10, "UR": 10, "Us": 10, "Ut": 50, "UT": 20, "Uu": 10, "UU": 10, "Uv": 50, "UV": 10, "Uw": 10, "ux": 10, "Ux": 30, "UX": -10, "Uy": 10, "UY": -10, "uz": 30, "Uz": 30, "UZ": -10, "va": -10, "Va": -50, "VA": -55, "Vc": -30, "VC": -20, "Vd": -30, "Ve": -30, "VE": -20, "vf": 10, "VF": 10, "Vg": -30, "VG": -10, "vi": 10, "Vm": -10, "VM": -30, "Vn": -30, "VN": -10, "Vo": -30, "VO": -10, "Vp": -20, "VP": -20, "Vq": -30, "VQ": -10, "Vr": -20, "Vs": -30, "vt": 10, "VT": 20, "Vu": -30, "VU": -10, "vv": 20, "Vw": -30, "vx": 20, "VX": -20, "vy": 10, "VY": -10, "vz": 10, "VZ": -20, "WA": -20, "Wb": 20, "Wd": -10, "WD": 20, "We": 10, "Wf": 30, "WF": 20, "Wh": 30, "wi": 10, "Wi": 30, "WI": 10, "Wj": 40, "WJ": 20, "Wk": 20, "Wl": 40, "WL": 10, "Wm": 10, "WM": -10, "WS": 10, "Wt": 40, "WT": 30, "Wv": 30, "WV": 10, "wx": 10, "Wx": 20, "WX": -10, "Wy": 20, "WY": 10, "Wz": 30, "WZ": -10, "XA": -25, "XC": -20, "Xe": -10, "XE": -10, "xf": 10, "Xf": 10, "Xg": -10, "XG": -20, "xi": 10, "Xi": 10, "XI": -10, "Xj": 30, "xk": 10, "Xk": 10, "xl": 10, "Xl": 20, "Xm": 10, "XM": -25, "xn": -10, "XN": -10, "Xo": -10, "XO": -20, "xp": 10, "Xp": 10, "XP": -10, "xq": -10, "Xq": -40, "XQ": -25, "XS": -20, "xu": -5, "Xu": -30, "XU": -20, "xv": 10, "Xv": -20, "Xw": -30, "xx": 15, "Xx": 10, "XX": -30, "xy": -10, "Xy": -20, "XY": -20, "xz": 10, "Xz": 30, "ya": -10, "Ya": -70, "YA": -55, "Yc": -60, "YC": -30, "yd": -10, "Yd": -60, "YD": 10, "ye": 10, "Ye": -60, "YE": -30, "YF": 20, "Yg": -60, "YG": -30, "YH": -10, "YI": 10, "YJ": 10, "Ym": -30, "YM": -35, "yn": -10, "Yn": -60, "Yo": -60, "YO": -20, "Yp": -50, "YP": -10, "Yq": -60, "YQ": -10, "Yr": -60, "YR": -10, "Ys": -60, "YS": -10, "yt": 10, "YT": -15, "yu": -10, "Yu": -60, "yv": 10, "Yv": -20, "Yw": -50, "yx": 10, "Yx": -50, "YX": -30, "Yy": -40, "YY": -10, "Yz": -30, "YZ": -40, "Za": -20, "ZA": -20, "Zb": -10, "ZB": -10, "Zc": -10, "ZC": -20, "Zd": -30, "ZD": -10, "Ze": -40, "ZE": -20, "zf": 10, "Zg": -40, "ZG": -20, "zi": 10, "Zj": 10, "Zk": 10, "ZL": -10, "Zm": -10, "Zn": -50, "Zo": -30, "ZO": -30, "Zp": -10, "ZP": -10, "Zq": -50, "ZQ": -10, "Zr": -40, "ZR": -10, "Zs": -30, "ZS": -20, "zt": 10, "Zt": -10, "Zu": -30, "ZU": -10, "zv": 10, "Zv": -20, "Zw": -40, "ZW": -10, "zx": 10, "Zx": -10, "ZX": -10, "Zy": -30, "ZY": -20, "zz": 20, "Zz": 10, "ZZ": -10 }, "leading": 0, "w": { " ": 242, "_": 446, "-": 326, "\u2013": 446, "\u2014": 566, ",": 198, ";": 198, ":": 198, "!": 210, "?": 374, ".": 198, "\u2026": 594, "\xB7": 187, "'": 117, "\u2018": 117, "\u2019": 117, '"': 237, "\u201C": 267, "\u201D": 267, "(": 330, ")": 330, "[": 330, "]": 330, "{": 330, "}": 330, "@": 643, "*": 363, "/": 330, "\\": 330, "&": 564, "#": 559, "%": 600, "\u2022": 187, "`": 353, "^": 446, "\u2190": 1e3, "\u2192": 1e3, "\u2191": 722.66, "\u2193": 722.66, "+": 446, "\xD7": 446, "<": 446, "=": 446, ">": 446, "|": 330, "~": 446, "\u25E6": 608.4, "\u2610": 830.08, "\u2611": 830.08, "\u2713": 764.16, "$": 450, "0": 450, "1": 450, "2": 450, "3": 450, "4": 450, "5": 434, "6": 471, "7": 446, "8": 450, "9": 438, "a": 446, "A": 511, "b": 444, "B": 523, "c": 364, "C": 477, "d": 402, "D": 587, "e": 334, "E": 534, "\xE9": 325, "f": 300, "F": 466, "g": 364, "G": 494, "h": 473, "H": 574, "i": 196, "I": 409, "j": 213, "J": 315, "k": 374, "K": 508, "l": 178, "L": 426, "m": 569, "M": 729, "n": 459, "N": 619, "o": 362, "O": 505, "p": 378, "P": 468, "q": 377, "Q": 492, "r": 360, "R": 544, "s": 350, "S": 495, "t": 331, "T": 458, "u": 370, "U": 482, "v": 331, "V": 490, "w": 517, "W": 720, "x": 343, "X": 524, "y": 341, "Y": 504, "z": 315, "Z": 522 } }, "regular": { "ascent": 0.9600067138671875, "descent": 0.3000030517578125, "k": { "AC": -20, "AE": -10, "AG": -10, "AH": -10, "AI": 10, "Aj": 10, "AJ": 10, "AL": -10, "AM": 10, "An": -10, "AO": -20, "AP": -10, "Aq": -10, "AQ": -20, "Ar": -10, "As": -10, "AS": -35, "AT": -50, "Au": -10, "AU": -20, "av": -20, "Av": -5, "AV": -40, "aw": -10, "AW": -20, "Ax": 10, "AX": -10, "ay": -20, "Ay": -10, "AY": -65, "Az": 20, "AZ": -10, "ba": -10, "bc": -10, "BC": -20, "bd": -10, "Bf": 10, "BF": -20, "Bg": 10, "bh": -5, "Bi": 10, "BI": -10, "bj": -5, "Bj": 10, "BJ": -10, "Bk": 10, "Bl": 10, "Bm": 10, "BP": -10, "BR": -10, "BS": -20, "BT": -40, "bu": -10, "BU": -20, "BV": -50, "BW": -50, "bx": -10, "Bx": 10, "BX": -40, "by": -10, "BY": -65, "Bz": 40, "BZ": -30, "CA": -20, "Cc": -5, "CC": -10, "Cd": -10, "CE": -10, "CG": -10, "Cj": 10, "CJ": -10, "CK": -10, "cl": 10, "Cl": 5, "Cn": -5, "CO": -10, "CP": -10, "CQ": -20, "Cs": -10, "CS": -10, "Ct": 10, "CT": -20, "Cu": -10, "CU": -10, "Cv": -20, "CV": -20, "cw": -10, "Cw": -10, "CW": -20, "Cx": 20, "CX": -30, "cy": -5, "CY": -35, "Cz": 20, "CZ": -40, "DA": -10, "Db": 10, "Dc": 10, "De": 10, "Df": 20, "DF": -10, "Dg": 10, "Dh": 10, "Di": 15, "DI": -10, "Dj": 5, "DJ": -10, "Dk": 10, "Dl": 10, "Dm": 20, "DM": -5, "dn": -10, "Do": 10, "Dp": 10, "Dq": 10, "Dr": 10, "Ds": 10, "dt": 10, "Dt": 20, "DT": -40, "du": -10, "Dv": 30, "DV": -30, "Dw": 20, "DW": -10, "Dx": 20, "DX": -50, "Dy": 10, "DY": -50, "Dz": 30, "DZ": -30, "EC": -10, "ED": -10, "EG": -10, "EJ": -10, "el": 10, "EO": -10, "EQ": -20, "ES": -40, "ET": -10, "EU": -20, "Ev": -10, "EV": -25, "Ew": -10, "EW": -30, "Ex": 10, "EX": -40, "Ey": -10, "EY": -50, "Ez": 20, "EZ": -20, "fa": -10, "Fa": -30, "FA": -40, "Fc": -20, "FC": -10, "Fd": -20, "FD": 20, "Fe": -15, "ff": 10, "Ff": 10, "FF": 20, "Fg": -10, "fh": 10, "Fh": 20, "fi": 10, "Fi": 10, "FI": 10, "fj": 10, "Fj": 10, "FJ": 20, "Fk": 10, "fl": 20, "Fl": 20, "FL": 10, "fm": 10, "FM": -10, "Fn": -20, "FN": 10, "Fo": -20, "FO": 10, "Fp": -10, "FP": -10, "Fq": -10, "FQ": 10, "Fr": -10, "FS": 10, "ft": 40, "Ft": 10, "FT": -30, "Fu": -10, "fv": 10, "Fv": 10, "FV": 10, "FW": 10, "fy": 10, "FY": 10, "Fz": 10, "FZ": -10, "GA": -10, "Gf": 10, "Gh": 10, "gi": 10, "Gi": 10, "GI": -10, "Gj": 10, "GJ": -10, "Gk": 10, "Gl": 10, "Gm": 10, "GM": -10, "GN": 10, "GP": -20, "GS": -10, "Gt": 10, "GU": -10, "Gv": 10, "GV": -10, "GW": -20, "Gx": 10, "GX": -40, "gy": 10, "GY": -40, "Gz": 10, "GZ": -20, "Hb": 10, "hf": -10, "Hf": 10, "hg": -20, "Hh": 10, "Hi": 10, "Hj": 20, "Hk": 10, "Hl": 10, "Hm": 10, "hq": -10, "hs": -10, "Ht": 20, "hv": -30, "Hv": 10, "hw": -15, "Hx": 20, "hy": -30, "Hy": 10, "Hz": 20, "Ia": -10, "IA": 10, "Ib": 10, "Ic": -10, "Id": -10, "ID": 30, "Ie": -10, "if": 10, "If": 20, "IF": 40, "Ig": -10, "Ih": 30, "Ii": 20, "II": 30, "Ij": 30, "IJ": 40, "Ik": 20, "IK": 10, "Il": 20, "IL": 10, "IM": 30, "In": -10, "IN": 20, "Io": -10, "Ip": 10, "Iq": -20, "Ir": -10, "IR": 10, "Is": -10, "It": 10, "Iu": -10, "IU": 10, "iv": 10, "Iv": -20, "IV": 30, "Iw": -25, "IW": 20, "Ix": 10, "IX": 10, "Iy": -10, "IY": 30, "Iz": 20, "IZ": 20, "Ja": -10, "Jb": 10, "Jc": -10, "Jd": -10, "Je": -10, "Jf": 10, "Jh": 10, "Ji": 10, "JI": -10, "Jj": 20, "JJ": 10, "Jk": 10, "Jl": 20, "Jn": -10, "Jo": -10, "JO": -10, "Jp": 10, "JP": -10, "Jq": -10, "JQ": -10, "JR": -10, "jt": 10, "Jt": 20, "JT": 10, "ju": -10, "Ju": -20, "JU": -10, "jx": 10, "JX": -25, "jy": 10, "JY": -20, "jz": 10, "Jz": 10, "JZ": -20, "Ka": -40, "kc": 20, "Kc": -40, "KC": -10, "Kd": -40, "KD": 10, "ke": 10, "Ke": -40, "kf": 20, "Kf": 10, "KF": 20, "Kg": -40, "KG": -10, "kh": 10, "Kh": 10, "ki": 10, "Ki": 10, "Kj": 40, "KJ": 20, "kk": 20, "Kk": 10, "kl": 20, "Kl": 10, "km": 10, "KM": 20, "Kn": -40, "ko": 10, "Ko": -50, "KO": -10, "Kp": 10, "Kq": -50, "kr": 10, "Ks": -40, "kt": 10, "Kt": 10, "KT": -10, "ku": 10, "Ku": -60, "kv": 10, "Kv": -30, "Kw": -40, "Kx": -10, "KX": -10, "ky": -10, "Ky": -30, "kz": 10, "Lb": -10, "LC": -20, "LE": -20, "Lf": 10, "Lg": -10, "LG": -20, "Lh": -10, "Li": 10, "LI": -40, "Lj": 20, "Lk": 10, "ll": 10, "Ll": 10, "LL": -20, "Ln": -20, "LO": -25, "Lp": 10, "Lq": -40, "LQ": -30, "Ls": -10, "LS": -65, "lt": 10, "Lt": -10, "LT": -70, "Lu": -40, "LU": -45, "Lv": -60, "LV": -70, "Lw": -40, "LW": -40, "Lx": 10, "Ly": -20, "LY": -90, "lz": 20, "Lz": 30, "LZ": -10, "Mb": 10, "md": 10, "Mf": 10, "Mh": 10, "Mi": 10, "MJ": 10, "Mk": 10, "Ml": 10, "mo": 20, "Mp": 10, "MP": -10, "Mq": -10, "MQ": -10, "MS": -20, "Mt": 20, "MT": -30, "Mu": -10, "MU": -20, "mv": -15, "Mv": 10, "MV": -20, "mw": -10, "MW": -30, "Mx": 10, "MX": -10, "my": -10, "My": -10, "MY": -50, "Mz": 10, "MZ": -10, "nb": -15, "Nb": 10, "Ne": 10, "Nf": 10, "Ng": 10, "Nh": 10, "Ni": 20, "Nj": 20, "Nk": 20, "Nl": 20, "Nm": 10, "Nq": 10, "ns": -5, "nt": -10, "Nt": 20, "nu": -10, "nv": -20, "Nv": 30, "nw": -20, "NW": -10, "Nx": 30, "NX": -20, "ny": -20, "Ny": 10, "NY": -20, "Nz": 40, "NZ": -10, "OA": -10, "OD": -10, "Of": 20, "Og": 20, "Oh": 10, "Oi": 20, "OI": -10, "oj": -5, "Oj": 20, "Ok": 10, "Ol": 20, "OL": 10, "Om": 20, "Oo": 10, "Op": 10, "Oq": 10, "OQ": 10, "Os": 10, "Ot": 20, "OT": -10, "ou": -10, "ov": 5, "Ov": 30, "OV": -10, "ow": -10, "Ow": 10, "OW": -10, "Ox": 30, "OX": -40, "oy": -10, "Oy": 20, "OY": -40, "Oz": 30, "OZ": -20, "Pa": -40, "PA": -40, "Pc": -30, "Pd": -40, "PD": -10, "Pe": -20, "Pf": 10, "Pg": -10, "Ph": 10, "Pi": 10, "PI": -10, "Pj": 20, "PJ": -10, "Pk": 10, "Pl": 10, "Pm": 10, "PM": -30, "pn": -10, "Pn": -10, "PN": -10, "Po": -30, "Pq": -30, "Ps": -20, "PS": 10, "Pt": 20, "pu": -10, "Pu": -30, "Pv": 10, "Px": 10, "PX": -35, "py": -10, "PY": -20, "Pz": 10, "PZ": -50, "Qb": 10, "Qf": 20, "Qg": 20, "qh": -10, "Qh": 10, "Qi": 20, "qj": 10, "Qj": 90, "QJ": 80, "Qk": 10, "Ql": 20, "Qm": 20, "qn": -10, "qo": -10, "Qp": 20, "Qt": 30, "QT": -10, "qu": -10, "Qv": 20, "QV": -10, "QW": -10, "Qx": 20, "QX": -20, "Qy": 50, "QY": -30, "Qz": 40, "QZ": -10, "ra": -5, "Ra": -10, "RA": -25, "RB": -10, "Rc": -10, "RC": -20, "Rd": -10, "RD": 10, "Re": -10, "RE": -20, "Rf": 20, "RF": 10, "Rg": -10, "RG": -10, "ri": 5, "RI": -10, "Rj": 30, "RJ": 30, "RL": -10, "RM": -20, "Rn": -10, "RN": 10, "Ro": -10, "RO": -10, "Rp": 20, "Rq": -30, "RQ": -10, "Rr": -10, "Rs": -10, "Rt": 10, "RT": -10, "Ru": -30, "RU": -20, "rv": 20, "RV": -10, "Rw": -10, "RW": -10, "Rx": 10, "RX": -20, "Ry": 10, "RY": -30, "Rz": 20, "RZ": -45, "Sa": -10, "Sb": 10, "Sc": -20, "Sd": -25, "SD": 20, "Se": -20, "SE": -10, "sf": 10, "Sf": 20, "SF": 30, "Sg": -20, "Sh": 20, "Si": 20, "SI": 10, "Sj": 30, "SJ": 30, "Sk": 10, "Sl": 20, "SL": 20, "Sn": -20, "SN": 10, "So": -10, "SO": 10, "Sq": -20, "Sr": -10, "Ss": -10, "st": 10, "St": 20, "Su": -20, "sv": 20, "Sv": -50, "SV": 20, "Sw": -30, "SW": 10, "sx": 15, "Sx": 10, "Sy": -15, "SY": 10, "sz": 20, "Sz": 20, "SZ": -10, "Ta": -90, "TA": -50, "Tc": -80, "TC": -10, "Td": -110, "TD": 10, "Te": -90, "TE": -10, "Tf": 20, "TF": 30, "Tg": -80, "TG": -10, "Th": 20, "ti": 5, "TI": 10, "Tj": 20, "Tk": 10, "Tl": 20, "Tm": -50, "TM": -30, "Tn": -90, "To": -90, "Tp": -80, "Tq": -120, "Tr": -80, "Ts": -80, "Tt": 10, "TT": -30, "Tu": -90, "tv": 10, "Tv": -70, "TV": 10, "Tw": -100, "tx": 20, "Tx": -60, "TX": -10, "Ty": -50, "tz": 30, "Tz": -40, "TZ": -10, "ub": -10, "Ub": 20, "UE": 10, "uf": 10, "Uf": 30, "UF": 10, "Ug": 10, "Uh": 30, "ui": 10, "Ui": 30, "Uj": 40, "uk": 10, "Uk": 20, "ul": 10, "Ul": 30, "Um": 30, "Up": 10, "UQ": 30, "Ur": 10, "UR": 10, "Us": 10, "Ut": 50, "UT": 20, "Uu": 10, "UU": 10, "Uv": 50, "UV": 10, "Uw": 10, "ux": 10, "Ux": 30, "UX": -10, "Uy": 10, "UY": -10, "uz": 30, "Uz": 30, "UZ": -10, "va": -10, "Va": -50, "VA": -55, "Vc": -30, "VC": -20, "Vd": -30, "Ve": -30, "VE": -20, "vf": 10, "VF": 10, "Vg": -30, "VG": -10, "vi": 10, "Vm": -10, "VM": -30, "Vn": -30, "VN": -10, "Vo": -30, "VO": -10, "Vp": -20, "VP": -20, "Vq": -30, "VQ": -10, "Vr": -20, "Vs": -30, "vt": 10, "VT": 20, "Vu": -30, "VU": -10, "vv": 20, "Vw": -30, "vx": 20, "VX": -20, "vy": 10, "VY": -10, "vz": 10, "VZ": -20, "WA": -20, "Wb": 20, "Wd": -10, "WD": 20, "We": 10, "Wf": 30, "WF": 20, "Wh": 30, "wi": 10, "Wi": 30, "WI": 10, "Wj": 40, "WJ": 20, "Wk": 20, "Wl": 40, "WL": 10, "Wm": 10, "WM": -10, "WS": 10, "Wt": 40, "WT": 30, "Wv": 30, "WV": 10, "wx": 10, "Wx": 20, "WX": -10, "Wy": 20, "WY": 10, "Wz": 30, "WZ": -10, "XA": -25, "XC": -20, "Xe": -10, "XE": -10, "xf": 10, "Xf": 10, "Xg": -10, "XG": -20, "xi": 10, "Xi": 10, "XI": -10, "Xj": 30, "xk": 10, "Xk": 10, "xl": 10, "Xl": 20, "Xm": 10, "XM": -25, "xn": -10, "XN": -10, "Xo": -10, "XO": -20, "xp": 10, "Xp": 10, "XP": -10, "xq": -10, "Xq": -40, "XQ": -25, "XS": -20, "xu": -5, "Xu": -30, "XU": -20, "xv": 10, "Xv": -20, "Xw": -30, "xx": 15, "Xx": 10, "XX": -30, "xy": -10, "Xy": -20, "XY": -20, "xz": 10, "Xz": 30, "ya": -10, "Ya": -70, "YA": -55, "Yc": -60, "YC": -30, "yd": -10, "Yd": -60, "YD": 10, "ye": 10, "Ye": -60, "YE": -30, "YF": 20, "Yg": -60, "YG": -30, "YH": -10, "YI": 10, "YJ": 10, "Ym": -30, "YM": -35, "yn": -10, "Yn": -60, "Yo": -60, "YO": -20, "Yp": -50, "YP": -10, "Yq": -60, "YQ": -10, "Yr": -60, "YR": -10, "Ys": -60, "YS": -10, "yt": 10, "YT": -15, "yu": -10, "Yu": -60, "yv": 10, "Yv": -20, "Yw": -50, "yx": 10, "Yx": -50, "YX": -30, "Yy": -40, "YY": -10, "Yz": -30, "YZ": -40, "Za": -20, "ZA": -20, "Zb": -10, "ZB": -10, "Zc": -10, "ZC": -20, "Zd": -30, "ZD": -10, "Ze": -40, "ZE": -20, "zf": 10, "Zg": -40, "ZG": -20, "zi": 10, "Zj": 10, "Zk": 10, "ZL": -10, "Zm": -10, "Zn": -50, "Zo": -30, "ZO": -30, "Zp": -10, "ZP": -10, "Zq": -50, "ZQ": -10, "Zr": -40, "ZR": -10, "Zs": -30, "ZS": -20, "zt": 10, "Zt": -10, "Zu": -30, "ZU": -10, "zv": 10, "Zv": -20, "Zw": -40, "ZW": -10, "zx": 10, "Zx": -10, "ZX": -10, "Zy": -30, "ZY": -20, "zz": 20, "Zz": 10, "ZZ": -10 }, "leading": 0, "w": { " ": 242, "_": 446, "-": 326, "\u2013": 446, "\u2014": 566, ",": 198, ";": 198, ":": 198, "!": 210, "?": 374, ".": 198, "\u2026": 594, "\xB7": 187, "'": 117, "\u2018": 117, "\u2019": 117, '"': 237, "\u201C": 267, "\u201D": 267, "(": 330, ")": 330, "[": 330, "]": 330, "{": 330, "}": 330, "@": 643, "*": 363, "/": 330, "\\": 330, "&": 564, "#": 559, "%": 600, "\u2022": 187, "`": 353, "^": 446, "\u2190": 1e3, "\u2192": 1e3, "\u2191": 645.02, "\u2193": 645.02, "+": 446, "\xD7": 446, "<": 446, "=": 446, ">": 446, "|": 330, "~": 446, "\u25E6": 578.13, "\u2610": 830.08, "\u2611": 830.08, "\u2713": 764.16, "$": 450, "0": 450, "1": 450, "2": 450, "3": 450, "4": 450, "5": 450, "6": 450, "7": 450, "8": 450, "9": 450, "a": 437, "A": 502, "b": 435, "B": 520, "c": 355, "C": 472, "d": 393, "D": 578, "e": 325, "E": 529, "\xE9": 325, "f": 291, "F": 454, "g": 355, "G": 487, "h": 464, "H": 563, "i": 187, "I": 400, "j": 204, "J": 306, "k": 365, "K": 498, "l": 169, "L": 426, "m": 560, "M": 720, "n": 450, "N": 599, "o": 353, "O": 496, "p": 378, "P": 464, "q": 377, "Q": 502, "r": 360, "R": 537, "s": 341, "S": 486, "t": 331, "T": 458, "u": 370, "U": 482, "v": 331, "V": 490, "w": 517, "W": 720, "x": 343, "X": 524, "y": 341, "Y": 504, "z": 315, "Z": 522 } } }, "fallback": { "\u2190": [0.966796875, 0.2109375, 0], "\u2192": [0.966796875, 0.2109375, 0], "\u2191": [0.966796875, 0.2109375, 0], "\u2193": [0.966796875, 0.2109375, 0], "\u25E6": [0.966796875, 0.2109375, 0], "\u2610": [0.66650390625, 0.25, 0.08349609375], "\u2611": [0.66650390625, 0.25, 0.08349609375], "\u2713": [0.966796875, 0.2109375, 0] } }, "Helvetica Neue": { "faces": { "bold": { "ascent": 0.975006103515625, "descent": 0.2169952392578125, "k": { "\u2018\u2018": -95, "\u2019\u2019": -95, "\u2019s": -74, "\u2019t": -18, "A\u2019": -74, "AT": -92, "Av": -18, "AV": -46, "Aw": -18, "AW": -24, "Ay": -18, "AY": -74, "F,": -157, "F.": -157, "f\u2019": 18, "FA": -55, "ff": -30, "fi": 20, "fl": 20, "L\u2019": -74, "LT": -92, "LV": -92, "LW": -55, "Ly": -37, "LY": -111, "P,": -179, "P.": -179, "PA": -74, "r-": -55, "r,": -92, "r.": -92, "rc": -18, "rd": -18, "re": -18, "rg": -28, "rn": 18, "ro": -18, "rq": -18, "RT": -18, "RV": -18, "RW": -18, "RY": -37, "T-": -129, "T,": -111, "T;": -111, "T:": -111, "T.": -111, "Ta": -111, "TA": -92, "Tc": -111, "Te": -111, "To": -111, "Tr": -92, "Ts": -111, "Tu": -92, "Tw": -111, "Ty": -111, "V-": -55, "v,": -74, "V,": -129, "V;": -46, "V:": -46, "v.": -74, "V.": -129, "Va": -55, "VA": -46, "Ve": -55, "Vi": -18, "Vo": -55, "Vr": -37, "Vu": -37, "Vy": -18, "w,": -55, "W,": -74, "W;": -18, "W:": -18, "w.": -55, "W.": -74, "Wa": -37, "WA": -24, "We": -57, "Wo": -57, "Wr": -18, "Wu": -18, "Y-": -111, "y,": -74, "Y,": -139, "Y;": -92, "Y:": -92, "y.": -74, "Y.": -139, "Ya": -92, "YA": -74, "Ye": -111, "Yi": -37, "Yo": -111, "Yp": -74, "Yq": -92, "Yu": -74, "Yv": -55 }, "leading": 0.0290069580078125, "w": { " ": 278, "_": 500, "-": 407, "\u2013": 500, "\u2014": 1e3, ",": 278, ";": 278, ":": 278, "!": 278, "?": 556, ".": 278, "\u2026": 1e3, "\xB7": 278, "'": 278, "\u2018": 278, "\u2019": 278, '"': 463, "\u201C": 463, "\u201D": 463, "(": 296, ")": 296, "[": 333, "]": 333, "{": 333, "}": 333, "@": 800, "*": 407, "/": 371, "\\": 371, "&": 685, "#": 556, "%": 1e3, "\u2022": 350, "`": 259, "^": 600, "\u2190": 1e3, "\u2192": 1e3, "\u2191": 722.66, "\u2193": 722.66, "+": 600, "\xD7": 600, "<": 600, "=": 600, ">": 600, "|": 223, "~": 600, "\u25E6": 608.4, "\u2610": 830.08, "\u2611": 830.08, "\u2713": 764.16, "$": 556, "0": 556, "1": 556, "2": 556, "3": 556, "4": 556, "5": 556, "6": 556, "7": 556, "8": 556, "9": 556, "a": 574, "A": 685, "b": 611, "B": 704, "c": 574, "C": 741, "d": 611, "D": 741, "e": 574, "E": 648, "\xE9": 574, "f": 333, "F": 593, "g": 611, "G": 759, "h": 593, "H": 741, "i": 258, "I": 295, "j": 278, "J": 556, "k": 574, "K": 722, "l": 258, "L": 593, "m": 906, "M": 907, "n": 593, "N": 741, "o": 611, "O": 778, "p": 611, "P": 667, "q": 611, "Q": 778, "r": 389, "R": 722, "s": 537, "S": 649, "t": 352, "T": 611, "u": 593, "U": 741, "v": 520, "V": 630, "w": 814, "W": 944, "x": 537, "X": 667, "y": 519, "Y": 667, "z": 519, "Z": 648 } }, "boldItalic": { "ascent": 0.975006103515625, "descent": 0.2169952392578125, "k": { "\u2018\u2018": -95, "\u2019\u2019": -95, "\u2019s": -74, "\u2019t": -18, "A\u2019": -74, "AT": -92, "Av": -18, "AV": -46, "Aw": -18, "AW": -24, "Ay": -18, "AY": -74, "F,": -157, "F.": -157, "f\u2019": 18, "FA": -55, "ff": -68, "L\u2019": -74, "LT": -92, "LV": -92, "LW": -55, "Ly": -37, "LY": -111, "P,": -179, "P.": -179, "PA": -74, "r-": -55, "r,": -92, "r.": -92, "rc": -18, "rd": -18, "re": -18, "rg": -28, "rn": 18, "ro": -18, "rq": -18, "RT": -18, "RV": -18, "RW": -18, "RY": -37, "T-": -129, "T,": -111, "T;": -111, "T:": -111, "T.": -111, "Ta": -111, "TA": -92, "Tc": -111, "Te": -111, "To": -111, "Tr": -92, "Ts": -111, "Tu": -92, "Tw": -111, "Ty": -111, "V-": -55, "v,": -74, "V,": -129, "V;": -46, "V:": -46, "v.": -74, "V.": -129, "Va": -55, "VA": -46, "Ve": -55, "Vi": -18, "Vo": -55, "Vr": -37, "Vu": -37, "Vy": -18, "w,": -55, "W,": -74, "W;": -18, "W:": -18, "w.": -55, "W.": -74, "Wa": -37, "WA": -24, "We": -57, "Wo": -57, "Wr": -18, "Wu": -18, "Y-": -111, "y,": -74, "Y,": -139, "Y;": -92, "Y:": -92, "y.": -74, "Y.": -139, "Ya": -92, "YA": -74, "Ye": -111, "Yi": -37, "Yo": -111, "Yp": -74, "Yq": -92, "Yu": -74, "Yv": -55 }, "leading": 0.0290069580078125, "w": { " ": 278, "_": 500, "-": 407, "\u2013": 500, "\u2014": 1e3, ",": 278, ";": 278, ":": 278, "!": 296, "?": 574, ".": 278, "\u2026": 1e3, "\xB7": 278, "'": 278, "\u2018": 278, "\u2019": 278, '"': 481, "\u201C": 481, "\u201D": 481, "(": 296, ")": 296, "[": 333, "]": 333, "{": 333, "}": 333, "@": 800, "*": 407, "/": 389, "\\": 389, "&": 685, "#": 556, "%": 963, "\u2022": 350, "`": 259, "^": 600, "\u2190": 1e3, "\u2192": 1e3, "\u2191": 722.66, "\u2193": 722.66, "+": 600, "\xD7": 600, "<": 600, "=": 600, ">": 600, "|": 222, "~": 600, "\u25E6": 608.4, "\u2610": 830.08, "\u2611": 830.08, "\u2713": 764.16, "$": 556, "0": 556, "1": 556, "2": 556, "3": 556, "4": 556, "5": 556, "6": 556, "7": 556, "8": 556, "9": 556, "a": 574, "A": 685, "b": 611, "B": 722, "c": 556, "C": 741, "d": 611, "D": 741, "e": 574, "E": 667, "\xE9": 574, "f": 352, "F": 593, "g": 611, "G": 759, "h": 611, "H": 741, "i": 259, "I": 296, "j": 259, "J": 556, "k": 556, "K": 722, "l": 259, "L": 574, "m": 907, "M": 907, "n": 611, "N": 741, "o": 593, "O": 778, "p": 611, "P": 667, "q": 611, "Q": 778, "r": 389, "R": 722, "s": 519, "S": 648, "t": 370, "T": 611, "u": 611, "U": 741, "v": 519, "V": 630, "w": 815, "W": 944, "x": 519, "X": 667, "y": 519, "Y": 648, "z": 500, "Z": 648 } }, "italic": { "ascent": 0.957000732421875, "descent": 0.2129974365234375, "k": { "\u2018\u2018": -95, "\u2019\u2019": -95, "\u2019s": -74, "\u2019t": -18, "A\u2019": -74, "AT": -92, "Av": -18, "AV": -46, "Aw": -18, "AW": -24, "Ay": -18, "AY": -74, "F,": -157, "F.": -157, "f\u2019": 18, "FA": -55, "ff": -15, "fi": 1, "fl": 1, "L\u2019": -74, "LT": -92, "LV": -92, "LW": -55, "Ly": -37, "LY": -111, "P,": -179, "P.": -179, "PA": -74, "r-": -55, "r,": -92, "r.": -92, "rc": -18, "rd": -18, "re": -18, "rg": -28, "rn": 18, "ro": -18, "rq": -18, "RT": -18, "RV": -18, "RW": -18, "RY": -37, "T-": -129, "T,": -111, "T;": -111, "T:": -111, "T.": -111, "Ta": -111, "TA": -92, "Tc": -111, "Te": -111, "To": -111, "Tr": -92, "Ts": -111, "Tu": -92, "Tw": -111, "Ty": -111, "V-": -55, "v,": -74, "V,": -129, "V;": -46, "V:": -46, "v.": -74, "V.": -129, "Va": -55, "VA": -46, "Ve": -55, "Vi": -18, "Vo": -55, "Vr": -37, "Vu": -37, "Vy": -18, "w,": -55, "W,": -74, "W;": -18, "W:": -18, "w.": -55, "W.": -74, "Wa": -37, "WA": -24, "We": -57, "Wo": -57, "Wr": -18, "Wu": -18, "Y-": -111, "y,": -74, "Y,": -139, "Y;": -92, "Y:": -92, "y.": -74, "Y.": -139, "Ya": -92, "YA": -74, "Ye": -111, "Yi": -37, "Yo": -111, "Yp": -74, "Yq": -92, "Yu": -74, "Yv": -55 }, "leading": 0.0279998779296875, "w": { " ": 278, "_": 500, "-": 389, "\u2013": 500, "\u2014": 1e3, ",": 278, ";": 278, ":": 278, "!": 259, "?": 556, ".": 278, "\u2026": 1e3, "\xB7": 278, "'": 278, "\u2018": 278, "\u2019": 278, '"': 426, "\u201C": 426, "\u201D": 426, "(": 259, ")": 259, "[": 259, "]": 259, "{": 333, "}": 333, "@": 800, "*": 352, "/": 333, "\\": 333, "&": 630, "#": 556, "%": 926, "\u2022": 500, "`": 222, "^": 600, "\u2190": 1e3, "\u2192": 1e3, "\u2191": 645.02, "\u2193": 645.02, "+": 600, "\xD7": 600, "<": 600, "=": 600, ">": 600, "|": 222, "~": 600, "\u25E6": 578.13, "\u2610": 830.08, "\u2611": 830.08, "\u2713": 764.16, "$": 556, "0": 556, "1": 556, "2": 556, "3": 556, "4": 556, "5": 556, "6": 556, "7": 556, "8": 556, "9": 556, "a": 519, "A": 667, "b": 593, "B": 685, "c": 537, "C": 722, "d": 593, "D": 704, "e": 537, "E": 611, "\xE9": 537, "f": 296, "F": 574, "g": 574, "G": 759, "h": 556, "H": 722, "i": 222, "I": 259, "j": 222, "J": 519, "k": 481, "K": 667, "l": 222, "L": 556, "m": 852, "M": 870, "n": 556, "N": 722, "o": 574, "O": 759, "p": 593, "P": 648, "q": 593, "Q": 759, "r": 333, "R": 685, "s": 481, "S": 648, "t": 315, "T": 574, "u": 556, "U": 722, "v": 481, "V": 611, "w": 759, "W": 926, "x": 481, "X": 611, "y": 481, "Y": 611, "z": 444, "Z": 611 } }, "regular": { "ascent": 0.951995849609375, "descent": 0.2129974365234375, "k": { "\u2018\u2018": -95, "\u2019\u2019": -95, "\u2019s": -74, "\u2019t": -18, "A\u2019": -74, "AT": -92, "Av": -18, "AV": -46, "Aw": -18, "AW": -24, "Ay": -18, "AY": -74, "F,": -157, "F.": -157, "f\u2019": 18, "FA": -55, "ff": -15, "L\u2019": -74, "LT": -92, "LV": -92, "LW": -55, "Ly": -37, "LY": -111, "P,": -179, "P.": -179, "PA": -74, "r-": -55, "r,": -92, "r.": -92, "rc": -18, "rd": -18, "re": -18, "rg": -28, "rn": 18, "ro": -18, "rq": -18, "RT": -18, "RV": -18, "RW": -18, "RY": -37, "T-": -129, "T,": -111, "T;": -111, "T:": -111, "T.": -111, "Ta": -111, "TA": -92, "Tc": -111, "Te": -111, "To": -111, "Tr": -92, "Ts": -111, "Tu": -92, "Tw": -111, "Ty": -111, "V-": -55, "v,": -74, "V,": -129, "V;": -46, "V:": -46, "v.": -74, "V.": -129, "Va": -55, "VA": -46, "Ve": -55, "Vi": -18, "Vo": -55, "Vr": -37, "Vu": -37, "Vy": -18, "w,": -55, "W,": -74, "W;": -18, "W:": -18, "w.": -55, "W.": -74, "Wa": -37, "WA": -24, "We": -57, "Wo": -57, "Wr": -18, "Wu": -18, "Y-": -111, "y,": -74, "Y,": -139, "Y;": -92, "Y:": -92, "y.": -74, "Y.": -139, "Ya": -92, "YA": -74, "Ye": -111, "Yi": -37, "Yo": -111, "Yp": -74, "Yq": -92, "Yu": -74, "Yv": -55 }, "leading": 0.0279998779296875, "w": { " ": 278, "_": 500, "-": 389, "\u2013": 500, "\u2014": 1e3, ",": 278, ";": 278, ":": 278, "!": 259, "?": 556, ".": 278, "\u2026": 1e3, "\xB7": 278, "'": 278, "\u2018": 278, "\u2019": 278, '"': 426, "\u201C": 426, "\u201D": 426, "(": 259, ")": 259, "[": 259, "]": 259, "{": 333, "}": 333, "@": 800, "*": 352, "/": 333, "\\": 333, "&": 630, "#": 556, "%": 1e3, "\u2022": 350, "`": 222, "^": 600, "\u2190": 1e3, "\u2192": 1e3, "\u2191": 645.02, "\u2193": 645.02, "+": 600, "\xD7": 600, "<": 600, "=": 600, ">": 600, "|": 222, "~": 600, "\u25E6": 578.13, "\u2610": 830.08, "\u2611": 830.08, "\u2713": 764.16, "$": 556, "0": 556, "1": 556, "2": 556, "3": 556, "4": 556, "5": 556, "6": 556, "7": 556, "8": 556, "9": 556, "a": 537, "A": 648, "b": 593, "B": 685, "c": 537, "C": 722, "d": 593, "D": 704, "e": 537, "E": 611, "\xE9": 537, "f": 296, "F": 574, "g": 574, "G": 759, "h": 556, "H": 722, "i": 222, "I": 259, "j": 222, "J": 519, "k": 519, "K": 667, "l": 222, "L": 556, "m": 853, "M": 871, "n": 556, "N": 722, "o": 574, "O": 760, "p": 593, "P": 648, "q": 593, "Q": 760, "r": 333, "R": 685, "s": 500, "S": 648, "t": 315, "T": 574, "u": 556, "U": 722, "v": 500, "V": 611, "w": 758, "W": 926, "x": 518, "X": 611, "y": 500, "Y": 648, "z": 480, "Z": 611 } } }, "fallback": { "\u2190": [0.966796875, 0.2109375, 0], "\u2192": [0.966796875, 0.2109375, 0], "\u2191": [0.966796875, 0.2109375, 0], "\u2193": [0.966796875, 0.2109375, 0], "\u25E6": [0.966796875, 0.2109375, 0], "\u2610": [0.66650390625, 0.25, 0.08349609375], "\u2611": [0.66650390625, 0.25, 0.08349609375], "\u2713": [0.966796875, 0.2109375, 0] } }, "Patrick Hand": { "faces": { "regular": { "ascent": 1.0420074462890625, "descent": 0.3119964599609375, "k": {}, "leading": 0, "w": { " ": 230, "_": 571, "-": 404, "\u2013": 420, "\u2014": 648, ",": 202, ";": 232, ":": 232, "!": 247, "?": 368, ".": 214, "\u2026": 571, "\xB7": 200, "'": 164, "\u2018": 190, "\u2019": 220, '"': 303, "\u201C": 315, "\u201D": 303, "(": 334, ")": 364, "[": 303, "]": 296, "{": 339, "}": 328, "@": 550, "*": 404, "/": 423, "\\": 420, "&": 530, "#": 457, "%": 643, "\u2022": 352, "`": 220, "^": 370, "\u2190": 1e3, "\u2192": 1e3, "\u2191": 645.02, "\u2193": 645.02, "+": 480, "\xD7": 490, "<": 396, "=": 572, ">": 400, "|": 176, "~": 529, "\u25E6": 578.13, "\u2610": 830.08, "\u2611": 830.08, "\u2713": 764.16, "$": 507, "0": 448, "1": 363, "2": 468, "3": 448, "4": 375, "5": 423, "6": 399, "7": 495, "8": 433, "9": 367, "a": 392, "A": 488, "b": 412, "B": 507, "c": 388, "C": 548, "d": 390, "D": 475, "e": 398, "E": 442, "\xE9": 398, "f": 359, "F": 375, "g": 445, "G": 480, "h": 420, "H": 468, "i": 224, "I": 235, "j": 235, "J": 370, "k": 415, "K": 523, "l": 266, "L": 372, "m": 680, "M": 595, "n": 452, "N": 532, "o": 403, "O": 556, "p": 428, "P": 481, "q": 463, "Q": 655, "r": 385, "R": 454, "s": 385, "S": 459, "t": 344, "T": 468, "u": 400, "U": 550, "v": 400, "V": 562, "w": 463, "W": 616, "x": 448, "X": 601, "y": 423, "Y": 442, "z": 428, "Z": 507 } } }, "fallback": { "\u2190": [0.966796875, 0.2109375, 0], "\u2192": [0.966796875, 0.2109375, 0], "\u2191": [0.966796875, 0.2109375, 0], "\u2193": [0.966796875, 0.2109375, 0], "\u25E6": [0.966796875, 0.2109375, 0], "\u2610": [0.66650390625, 0.25, 0.08349609375], "\u2611": [0.66650390625, 0.25, 0.08349609375], "\u2713": [0.966796875, 0.2109375, 0] } } };
|
|
469
|
+
|
|
470
|
+
// src/text.ts
|
|
471
|
+
var DEFAULT_FAMILY = "Helvetica Neue";
|
|
472
|
+
var CSS_FALLBACK = "Helvetica Neue, Helvetica, Arial, sans-serif";
|
|
473
|
+
var BUNDLED_FONTS = Object.keys(families).filter((f) => f !== DEFAULT_FAMILY).sort();
|
|
474
|
+
function bundledFamily(font) {
|
|
475
|
+
if (!font) return null;
|
|
476
|
+
const lower = font.toLowerCase();
|
|
477
|
+
return BUNDLED_FONTS.find((f) => f.toLowerCase() === lower) ?? null;
|
|
478
|
+
}
|
|
479
|
+
function familyMetrics(font) {
|
|
480
|
+
return families[bundledFamily(font) ?? DEFAULT_FAMILY];
|
|
481
|
+
}
|
|
482
|
+
function faceOf(fam, bold, italic) {
|
|
483
|
+
const want = bold ? italic ? "boldItalic" : "bold" : italic ? "italic" : "regular";
|
|
484
|
+
return fam.faces[want] ? want : "regular";
|
|
485
|
+
}
|
|
486
|
+
function cssFamily(font) {
|
|
487
|
+
if (!font) return CSS_FALLBACK;
|
|
488
|
+
const name = [...bundledFamily(font) ?? font].filter((c) => !`"'<>&;{}\\`.includes(c)).join("");
|
|
489
|
+
if (name === "") return CSS_FALLBACK;
|
|
490
|
+
return `${/^[\p{L}\p{N} -]+$/u.test(name) ? name : `'${name}'`}, ${CSS_FALLBACK}`;
|
|
491
|
+
}
|
|
492
|
+
function measure(s, fontSize, face = "regular", font) {
|
|
493
|
+
const fam = familyMetrics(font);
|
|
494
|
+
const f = fam.faces[face] ?? fam.faces.regular;
|
|
495
|
+
const fallback = f.w["n"];
|
|
496
|
+
let w = 0;
|
|
497
|
+
let prev = "";
|
|
498
|
+
for (const ch of s) {
|
|
499
|
+
w += f.w[ch] ?? fallback;
|
|
500
|
+
if (prev) w += f.k[prev + ch] ?? 0;
|
|
501
|
+
prev = ch;
|
|
502
|
+
}
|
|
503
|
+
return w * fontSize / 1e3;
|
|
504
|
+
}
|
|
505
|
+
function lineHeights(fontSize, font) {
|
|
506
|
+
const m = familyMetrics(font).faces.regular;
|
|
507
|
+
const a = Math.round(m.ascent * fontSize), d = Math.round(m.descent * fontSize), l = Math.round(m.leading * fontSize);
|
|
508
|
+
return [a + Math.ceil(m.descent * fontSize - 1e-9), a + d + l];
|
|
509
|
+
}
|
|
510
|
+
function breaksAfter(ch, next) {
|
|
511
|
+
if (ch === " ") return true;
|
|
512
|
+
return (ch === "/" || ch === "-") && next !== "" && !/[\d\s/-]/.test(next);
|
|
513
|
+
}
|
|
514
|
+
function pieces(para) {
|
|
515
|
+
const chars = [...para];
|
|
516
|
+
const out = [];
|
|
517
|
+
let cur = "";
|
|
518
|
+
chars.forEach((ch, i) => {
|
|
519
|
+
cur += ch;
|
|
520
|
+
const next = chars[i + 1] ?? "";
|
|
521
|
+
if (breaksAfter(ch, next) && next !== " ") {
|
|
522
|
+
out.push(cur);
|
|
523
|
+
cur = "";
|
|
524
|
+
}
|
|
525
|
+
});
|
|
526
|
+
if (cur || out.length === 0) out.push(cur);
|
|
527
|
+
return out;
|
|
528
|
+
}
|
|
529
|
+
function wrap(s, fontSize, maxWidth, face = "regular", font) {
|
|
530
|
+
const width = (t) => measure(t, fontSize, face, font);
|
|
531
|
+
const out = [];
|
|
532
|
+
for (const para of s.split(/\r\n|\n|\r|\u2028|\u2029/)) {
|
|
533
|
+
let line2 = "";
|
|
534
|
+
for (const piece of pieces(para)) {
|
|
535
|
+
const candidate = line2 + piece;
|
|
536
|
+
if (line2 === "" || width(candidate.trimEnd()) <= maxWidth) {
|
|
537
|
+
line2 = candidate;
|
|
538
|
+
} else {
|
|
539
|
+
out.push(line2);
|
|
540
|
+
line2 = piece;
|
|
541
|
+
}
|
|
542
|
+
while (width(line2.trimEnd()) > maxWidth && [...line2.trimEnd()].length > 1) {
|
|
543
|
+
const chars = [...line2];
|
|
544
|
+
let n = chars.length - 1;
|
|
545
|
+
while (n > 1 && width(chars.slice(0, n).join("")) > maxWidth) n--;
|
|
546
|
+
out.push(chars.slice(0, n).join(""));
|
|
547
|
+
line2 = chars.slice(n).join("");
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
out.push(line2);
|
|
551
|
+
}
|
|
552
|
+
return out;
|
|
553
|
+
}
|
|
554
|
+
function textSize(s, fontSize, maxWidth, font) {
|
|
555
|
+
if (s === "") return { width: 0, height: 0 };
|
|
556
|
+
const lines = wrap(s, fontSize, maxWidth, "regular", font);
|
|
557
|
+
const width = Math.max(...lines.map((l) => measure(l.trimEnd(), fontSize, "regular", font)));
|
|
558
|
+
const [first, next] = lineHeights(fontSize, font);
|
|
559
|
+
return { width: Math.ceil(width - 1e-9), height: Math.ceil(first + next * (lines.length - 1) - 1e-9) };
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
// src/fonts.ts
|
|
563
|
+
var FACES = ["bold", "boldItalic", "italic", "regular"];
|
|
564
|
+
function fontFile(family, face) {
|
|
565
|
+
return `${family.toLowerCase().replaceAll(" ", "-")}-${face}.woff2`;
|
|
566
|
+
}
|
|
567
|
+
function fontFaces(family) {
|
|
568
|
+
return FACES.filter((f) => families[family]?.faces[f] !== void 0);
|
|
569
|
+
}
|
|
570
|
+
function usedFonts(page) {
|
|
571
|
+
const used = /* @__PURE__ */ new Set();
|
|
572
|
+
const add2 = (es) => {
|
|
573
|
+
for (const e of es) {
|
|
574
|
+
const b = bundledFamily(e.style.font);
|
|
575
|
+
if (b) used.add(b);
|
|
576
|
+
}
|
|
577
|
+
};
|
|
578
|
+
add2(page.elements);
|
|
579
|
+
for (const s of page.symbols ?? []) add2(s.elements);
|
|
580
|
+
return BUNDLED_FONTS.filter((f) => used.has(f));
|
|
581
|
+
}
|
|
582
|
+
function defaultBase() {
|
|
583
|
+
try {
|
|
584
|
+
const script = typeof document === "undefined" ? null : document.currentScript;
|
|
585
|
+
if (script?.src) return new URL("fonts/", script.src).href;
|
|
586
|
+
const here = import.meta.url;
|
|
587
|
+
return here ? new URL("fonts/", here).href : null;
|
|
588
|
+
} catch {
|
|
589
|
+
return null;
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
var base = defaultBase();
|
|
593
|
+
var added = /* @__PURE__ */ new Set();
|
|
594
|
+
function setFontBase(url) {
|
|
595
|
+
base = url.endsWith("/") ? url : `${url}/`;
|
|
596
|
+
}
|
|
597
|
+
function addFonts(fonts, data = {}) {
|
|
598
|
+
if (typeof document === "undefined" || typeof FontFace === "undefined" || !document.fonts) return;
|
|
599
|
+
for (const name of fonts) {
|
|
600
|
+
const family = bundledFamily(name);
|
|
601
|
+
if (!family || added.has(family)) continue;
|
|
602
|
+
const own = data[family];
|
|
603
|
+
if (!own && !base) continue;
|
|
604
|
+
added.add(family);
|
|
605
|
+
for (const face of fontFaces(family)) {
|
|
606
|
+
const encoded = own?.[face];
|
|
607
|
+
let source;
|
|
608
|
+
if (encoded) source = Uint8Array.from(atob(encoded), (c) => c.charCodeAt(0));
|
|
609
|
+
else if (!own) source = `url(${JSON.stringify(base + fontFile(family, face))}) format("woff2")`;
|
|
610
|
+
else continue;
|
|
611
|
+
const descriptors = { weight: face.startsWith("bold") ? "bold" : "normal", style: face === "italic" || face === "boldItalic" ? "italic" : "normal" };
|
|
612
|
+
document.fonts.add(new FontFace(family, source, descriptors));
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
|
|
458
617
|
// src/path.ts
|
|
459
618
|
var KAPPA = 0.5522847498307936;
|
|
460
619
|
var Path = class _Path {
|
|
@@ -759,7 +918,7 @@ function flattenContour(cp) {
|
|
|
759
918
|
return out;
|
|
760
919
|
}
|
|
761
920
|
function outlineCrossing(shape, c, d) {
|
|
762
|
-
let
|
|
921
|
+
let nearest2 = null, farthest = null;
|
|
763
922
|
for (const contour of shapeContours(shape)) {
|
|
764
923
|
const pts = flattenContour(contour.points);
|
|
765
924
|
const n = pts.length;
|
|
@@ -770,9 +929,12 @@ function outlineCrossing(shape, c, d) {
|
|
|
770
929
|
const det = e.x * d.y - d.x * e.y;
|
|
771
930
|
if (det === 0) continue;
|
|
772
931
|
const t = (e.x * w.y - e.y * w.x) / det, s = (d.x * w.y - d.y * w.x) / det;
|
|
773
|
-
if (t > 0 && s >= 0 && s <= 1
|
|
932
|
+
if (!(t > 0 && s >= 0 && s <= 1)) continue;
|
|
933
|
+
if (nearest2 === null || t < nearest2) nearest2 = t;
|
|
934
|
+
if (t <= 1 && (farthest === null || t > farthest)) farthest = t;
|
|
774
935
|
}
|
|
775
936
|
}
|
|
937
|
+
const best = farthest ?? nearest2;
|
|
776
938
|
return best === null ? null : { x: c.x + d.x * best, y: c.y + d.y * best };
|
|
777
939
|
}
|
|
778
940
|
function edgePoint(shape, toward) {
|
|
@@ -1560,7 +1722,7 @@ function localTime(track, t) {
|
|
|
1560
1722
|
}
|
|
1561
1723
|
return t;
|
|
1562
1724
|
}
|
|
1563
|
-
function value(track, t, get,
|
|
1725
|
+
function value(track, t, get, base2, lerp) {
|
|
1564
1726
|
t = localTime(track, t);
|
|
1565
1727
|
let before, after;
|
|
1566
1728
|
for (const k of track.keys) {
|
|
@@ -1571,7 +1733,7 @@ function value(track, t, get, base, lerp) {
|
|
|
1571
1733
|
break;
|
|
1572
1734
|
}
|
|
1573
1735
|
}
|
|
1574
|
-
if (!before && !after) return
|
|
1736
|
+
if (!before && !after) return base2;
|
|
1575
1737
|
if (before && !after) return get(before);
|
|
1576
1738
|
if (!before && after) return get(after);
|
|
1577
1739
|
const b = before, a = after;
|
|
@@ -1586,8 +1748,8 @@ var lerpColor = (a, b, u) => ({
|
|
|
1586
1748
|
b: mix01(a.b, b.b, u),
|
|
1587
1749
|
a: mix01(a.a, b.a, u)
|
|
1588
1750
|
});
|
|
1589
|
-
function num2(track, t, p,
|
|
1590
|
-
return value(track, t, (k) => k[p],
|
|
1751
|
+
function num2(track, t, p, base2) {
|
|
1752
|
+
return value(track, t, (k) => k[p], base2, lerpNum);
|
|
1591
1753
|
}
|
|
1592
1754
|
function isChanging(track, t) {
|
|
1593
1755
|
t = localTime(track, t);
|
|
@@ -1988,7 +2150,7 @@ function clickTargets(page, file) {
|
|
|
1988
2150
|
continue;
|
|
1989
2151
|
}
|
|
1990
2152
|
}
|
|
1991
|
-
const url = c?.url ? allowedURL(c.url) : null;
|
|
2153
|
+
const url = (c?.url ? allowedURL(c.url) : null) ?? webLink(e.url);
|
|
1992
2154
|
if (url) {
|
|
1993
2155
|
out.set(e.id, { url });
|
|
1994
2156
|
continue;
|
|
@@ -2052,25 +2214,6 @@ var CLICK_STYLE = `
|
|
|
2052
2214
|
.dottie-b:active .dottie-d, .dottie-b.dottie-press .dottie-d { display: inline; }
|
|
2053
2215
|
`;
|
|
2054
2216
|
|
|
2055
|
-
// src/metrics.ts
|
|
2056
|
-
var ascent = 0.951995849609375;
|
|
2057
|
-
var descent = 0.2129974365234375;
|
|
2058
|
-
var leading = 0.0279998779296875;
|
|
2059
|
-
var boldAscent = 0.975006103515625;
|
|
2060
|
-
var boldDescent = 0.2169952392578125;
|
|
2061
|
-
var boldLeading = 0.0290069580078125;
|
|
2062
|
-
var italicAscent = 0.957000732421875;
|
|
2063
|
-
var italicDescent = 0.2129974365234375;
|
|
2064
|
-
var italicLeading = 0.0279998779296875;
|
|
2065
|
-
var boldItalicAscent = 0.975006103515625;
|
|
2066
|
-
var boldItalicDescent = 0.2169952392578125;
|
|
2067
|
-
var boldItalicLeading = 0.0290069580078125;
|
|
2068
|
-
var monoAdvance = 0.60205078125;
|
|
2069
|
-
var monoAscent = 0.92822265625;
|
|
2070
|
-
var monoDescent = 0.23583984375;
|
|
2071
|
-
var fonts = { "bold": { "k": { "\u2018\u2018": -95, "\u2019\u2019": -95, "\u2019s": -74, "\u2019t": -18, "A\u2019": -74, "AT": -92, "Av": -18, "AV": -46, "Aw": -18, "AW": -24, "Ay": -18, "AY": -74, "F,": -157, "F.": -157, "f\u2019": 18, "FA": -55, "ff": -30, "fi": 20, "fl": 20, "L\u2019": -74, "LT": -92, "LV": -92, "LW": -55, "Ly": -37, "LY": -111, "P,": -179, "P.": -179, "PA": -74, "r-": -55, "r,": -92, "r.": -92, "rc": -18, "rd": -18, "re": -18, "rg": -28, "rn": 18, "ro": -18, "rq": -18, "RT": -18, "RV": -18, "RW": -18, "RY": -37, "T-": -129, "T,": -111, "T;": -111, "T:": -111, "T.": -111, "Ta": -111, "TA": -92, "Tc": -111, "Te": -111, "To": -111, "Tr": -92, "Ts": -111, "Tu": -92, "Tw": -111, "Ty": -111, "V-": -55, "v,": -74, "V,": -129, "V;": -46, "V:": -46, "v.": -74, "V.": -129, "Va": -55, "VA": -46, "Ve": -55, "Vi": -18, "Vo": -55, "Vr": -37, "Vu": -37, "Vy": -18, "w,": -55, "W,": -74, "W;": -18, "W:": -18, "w.": -55, "W.": -74, "Wa": -37, "WA": -24, "We": -57, "Wo": -57, "Wr": -18, "Wu": -18, "Y-": -111, "y,": -74, "Y,": -139, "Y;": -92, "Y:": -92, "y.": -74, "Y.": -139, "Ya": -92, "YA": -74, "Ye": -111, "Yi": -37, "Yo": -111, "Yp": -74, "Yq": -92, "Yu": -74, "Yv": -55 }, "w": { " ": 278, "_": 500, "-": 407, "\u2013": 500, "\u2014": 1e3, ",": 278, ";": 278, ":": 278, "!": 278, "?": 556, ".": 278, "\u2026": 1e3, "\xB7": 278, "'": 278, "\u2018": 278, "\u2019": 278, '"': 463, "\u201C": 463, "\u201D": 463, "(": 296, ")": 296, "[": 333, "]": 333, "{": 333, "}": 333, "@": 800, "*": 407, "/": 371, "\\": 371, "&": 685, "#": 556, "%": 1e3, "\u2022": 350, "`": 259, "^": 600, "\u2190": 1e3, "\u2192": 1e3, "\u2191": 722.66, "\u2193": 722.66, "+": 600, "\xD7": 600, "<": 600, "=": 600, ">": 600, "|": 223, "~": 600, "\u25E6": 608.4, "\u2610": 830.08, "\u2611": 830.08, "\u2713": 764.16, "$": 556, "0": 556, "1": 556, "2": 556, "3": 556, "4": 556, "5": 556, "6": 556, "7": 556, "8": 556, "9": 556, "a": 574, "A": 685, "b": 611, "B": 704, "c": 574, "C": 741, "d": 611, "D": 741, "e": 574, "E": 648, "\xE9": 574, "f": 333, "F": 593, "g": 611, "G": 759, "h": 593, "H": 741, "i": 258, "I": 295, "j": 278, "J": 556, "k": 574, "K": 722, "l": 258, "L": 593, "m": 906, "M": 907, "n": 593, "N": 741, "o": 611, "O": 778, "p": 611, "P": 667, "q": 611, "Q": 778, "r": 389, "R": 722, "s": 537, "S": 649, "t": 352, "T": 611, "u": 593, "U": 741, "v": 520, "V": 630, "w": 814, "W": 944, "x": 537, "X": 667, "y": 519, "Y": 667, "z": 519, "Z": 648 } }, "boldItalic": { "k": { "\u2018\u2018": -95, "\u2019\u2019": -95, "\u2019s": -74, "\u2019t": -18, "A\u2019": -74, "AT": -92, "Av": -18, "AV": -46, "Aw": -18, "AW": -24, "Ay": -18, "AY": -74, "F,": -157, "F.": -157, "f\u2019": 18, "FA": -55, "ff": -68, "L\u2019": -74, "LT": -92, "LV": -92, "LW": -55, "Ly": -37, "LY": -111, "P,": -179, "P.": -179, "PA": -74, "r-": -55, "r,": -92, "r.": -92, "rc": -18, "rd": -18, "re": -18, "rg": -28, "rn": 18, "ro": -18, "rq": -18, "RT": -18, "RV": -18, "RW": -18, "RY": -37, "T-": -129, "T,": -111, "T;": -111, "T:": -111, "T.": -111, "Ta": -111, "TA": -92, "Tc": -111, "Te": -111, "To": -111, "Tr": -92, "Ts": -111, "Tu": -92, "Tw": -111, "Ty": -111, "V-": -55, "v,": -74, "V,": -129, "V;": -46, "V:": -46, "v.": -74, "V.": -129, "Va": -55, "VA": -46, "Ve": -55, "Vi": -18, "Vo": -55, "Vr": -37, "Vu": -37, "Vy": -18, "w,": -55, "W,": -74, "W;": -18, "W:": -18, "w.": -55, "W.": -74, "Wa": -37, "WA": -24, "We": -57, "Wo": -57, "Wr": -18, "Wu": -18, "Y-": -111, "y,": -74, "Y,": -139, "Y;": -92, "Y:": -92, "y.": -74, "Y.": -139, "Ya": -92, "YA": -74, "Ye": -111, "Yi": -37, "Yo": -111, "Yp": -74, "Yq": -92, "Yu": -74, "Yv": -55 }, "w": { " ": 278, "_": 500, "-": 407, "\u2013": 500, "\u2014": 1e3, ",": 278, ";": 278, ":": 278, "!": 296, "?": 574, ".": 278, "\u2026": 1e3, "\xB7": 278, "'": 278, "\u2018": 278, "\u2019": 278, '"': 481, "\u201C": 481, "\u201D": 481, "(": 296, ")": 296, "[": 333, "]": 333, "{": 333, "}": 333, "@": 800, "*": 407, "/": 389, "\\": 389, "&": 685, "#": 556, "%": 963, "\u2022": 350, "`": 259, "^": 600, "\u2190": 1e3, "\u2192": 1e3, "\u2191": 722.66, "\u2193": 722.66, "+": 600, "\xD7": 600, "<": 600, "=": 600, ">": 600, "|": 222, "~": 600, "\u25E6": 608.4, "\u2610": 830.08, "\u2611": 830.08, "\u2713": 764.16, "$": 556, "0": 556, "1": 556, "2": 556, "3": 556, "4": 556, "5": 556, "6": 556, "7": 556, "8": 556, "9": 556, "a": 574, "A": 685, "b": 611, "B": 722, "c": 556, "C": 741, "d": 611, "D": 741, "e": 574, "E": 667, "\xE9": 574, "f": 352, "F": 593, "g": 611, "G": 759, "h": 611, "H": 741, "i": 259, "I": 296, "j": 259, "J": 556, "k": 556, "K": 722, "l": 259, "L": 574, "m": 907, "M": 907, "n": 611, "N": 741, "o": 593, "O": 778, "p": 611, "P": 667, "q": 611, "Q": 778, "r": 389, "R": 722, "s": 519, "S": 648, "t": 370, "T": 611, "u": 611, "U": 741, "v": 519, "V": 630, "w": 815, "W": 944, "x": 519, "X": 667, "y": 519, "Y": 648, "z": 500, "Z": 648 } }, "italic": { "k": { "\u2018\u2018": -95, "\u2019\u2019": -95, "\u2019s": -74, "\u2019t": -18, "A\u2019": -74, "AT": -92, "Av": -18, "AV": -46, "Aw": -18, "AW": -24, "Ay": -18, "AY": -74, "F,": -157, "F.": -157, "f\u2019": 18, "FA": -55, "ff": -15, "fi": 1, "fl": 1, "L\u2019": -74, "LT": -92, "LV": -92, "LW": -55, "Ly": -37, "LY": -111, "P,": -179, "P.": -179, "PA": -74, "r-": -55, "r,": -92, "r.": -92, "rc": -18, "rd": -18, "re": -18, "rg": -28, "rn": 18, "ro": -18, "rq": -18, "RT": -18, "RV": -18, "RW": -18, "RY": -37, "T-": -129, "T,": -111, "T;": -111, "T:": -111, "T.": -111, "Ta": -111, "TA": -92, "Tc": -111, "Te": -111, "To": -111, "Tr": -92, "Ts": -111, "Tu": -92, "Tw": -111, "Ty": -111, "V-": -55, "v,": -74, "V,": -129, "V;": -46, "V:": -46, "v.": -74, "V.": -129, "Va": -55, "VA": -46, "Ve": -55, "Vi": -18, "Vo": -55, "Vr": -37, "Vu": -37, "Vy": -18, "w,": -55, "W,": -74, "W;": -18, "W:": -18, "w.": -55, "W.": -74, "Wa": -37, "WA": -24, "We": -57, "Wo": -57, "Wr": -18, "Wu": -18, "Y-": -111, "y,": -74, "Y,": -139, "Y;": -92, "Y:": -92, "y.": -74, "Y.": -139, "Ya": -92, "YA": -74, "Ye": -111, "Yi": -37, "Yo": -111, "Yp": -74, "Yq": -92, "Yu": -74, "Yv": -55 }, "w": { " ": 278, "_": 500, "-": 389, "\u2013": 500, "\u2014": 1e3, ",": 278, ";": 278, ":": 278, "!": 259, "?": 556, ".": 278, "\u2026": 1e3, "\xB7": 278, "'": 278, "\u2018": 278, "\u2019": 278, '"': 426, "\u201C": 426, "\u201D": 426, "(": 259, ")": 259, "[": 259, "]": 259, "{": 333, "}": 333, "@": 800, "*": 352, "/": 333, "\\": 333, "&": 630, "#": 556, "%": 926, "\u2022": 500, "`": 222, "^": 600, "\u2190": 1e3, "\u2192": 1e3, "\u2191": 645.02, "\u2193": 645.02, "+": 600, "\xD7": 600, "<": 600, "=": 600, ">": 600, "|": 222, "~": 600, "\u25E6": 578.13, "\u2610": 830.08, "\u2611": 830.08, "\u2713": 764.16, "$": 556, "0": 556, "1": 556, "2": 556, "3": 556, "4": 556, "5": 556, "6": 556, "7": 556, "8": 556, "9": 556, "a": 519, "A": 667, "b": 593, "B": 685, "c": 537, "C": 722, "d": 593, "D": 704, "e": 537, "E": 611, "\xE9": 537, "f": 296, "F": 574, "g": 574, "G": 759, "h": 556, "H": 722, "i": 222, "I": 259, "j": 222, "J": 519, "k": 481, "K": 667, "l": 222, "L": 556, "m": 852, "M": 870, "n": 556, "N": 722, "o": 574, "O": 759, "p": 593, "P": 648, "q": 593, "Q": 759, "r": 333, "R": 685, "s": 481, "S": 648, "t": 315, "T": 574, "u": 556, "U": 722, "v": 481, "V": 611, "w": 759, "W": 926, "x": 481, "X": 611, "y": 481, "Y": 611, "z": 444, "Z": 611 } }, "regular": { "k": { "\u2018\u2018": -95, "\u2019\u2019": -95, "\u2019s": -74, "\u2019t": -18, "A\u2019": -74, "AT": -92, "Av": -18, "AV": -46, "Aw": -18, "AW": -24, "Ay": -18, "AY": -74, "F,": -157, "F.": -157, "f\u2019": 18, "FA": -55, "ff": -15, "L\u2019": -74, "LT": -92, "LV": -92, "LW": -55, "Ly": -37, "LY": -111, "P,": -179, "P.": -179, "PA": -74, "r-": -55, "r,": -92, "r.": -92, "rc": -18, "rd": -18, "re": -18, "rg": -28, "rn": 18, "ro": -18, "rq": -18, "RT": -18, "RV": -18, "RW": -18, "RY": -37, "T-": -129, "T,": -111, "T;": -111, "T:": -111, "T.": -111, "Ta": -111, "TA": -92, "Tc": -111, "Te": -111, "To": -111, "Tr": -92, "Ts": -111, "Tu": -92, "Tw": -111, "Ty": -111, "V-": -55, "v,": -74, "V,": -129, "V;": -46, "V:": -46, "v.": -74, "V.": -129, "Va": -55, "VA": -46, "Ve": -55, "Vi": -18, "Vo": -55, "Vr": -37, "Vu": -37, "Vy": -18, "w,": -55, "W,": -74, "W;": -18, "W:": -18, "w.": -55, "W.": -74, "Wa": -37, "WA": -24, "We": -57, "Wo": -57, "Wr": -18, "Wu": -18, "Y-": -111, "y,": -74, "Y,": -139, "Y;": -92, "Y:": -92, "y.": -74, "Y.": -139, "Ya": -92, "YA": -74, "Ye": -111, "Yi": -37, "Yo": -111, "Yp": -74, "Yq": -92, "Yu": -74, "Yv": -55 }, "w": { " ": 278, "_": 500, "-": 389, "\u2013": 500, "\u2014": 1e3, ",": 278, ";": 278, ":": 278, "!": 259, "?": 556, ".": 278, "\u2026": 1e3, "\xB7": 278, "'": 278, "\u2018": 278, "\u2019": 278, '"': 426, "\u201C": 426, "\u201D": 426, "(": 259, ")": 259, "[": 259, "]": 259, "{": 333, "}": 333, "@": 800, "*": 352, "/": 333, "\\": 333, "&": 630, "#": 556, "%": 1e3, "\u2022": 350, "`": 222, "^": 600, "\u2190": 1e3, "\u2192": 1e3, "\u2191": 645.02, "\u2193": 645.02, "+": 600, "\xD7": 600, "<": 600, "=": 600, ">": 600, "|": 222, "~": 600, "\u25E6": 578.13, "\u2610": 830.08, "\u2611": 830.08, "\u2713": 764.16, "$": 556, "0": 556, "1": 556, "2": 556, "3": 556, "4": 556, "5": 556, "6": 556, "7": 556, "8": 556, "9": 556, "a": 537, "A": 648, "b": 593, "B": 685, "c": 537, "C": 722, "d": 593, "D": 704, "e": 537, "E": 611, "\xE9": 537, "f": 296, "F": 574, "g": 574, "G": 759, "h": 556, "H": 722, "i": 222, "I": 259, "j": 222, "J": 519, "k": 519, "K": 667, "l": 222, "L": 556, "m": 853, "M": 871, "n": 556, "N": 722, "o": 574, "O": 760, "p": 593, "P": 648, "q": 593, "Q": 760, "r": 333, "R": 685, "s": 500, "S": 648, "t": 315, "T": 574, "u": 556, "U": 722, "v": 500, "V": 611, "w": 758, "W": 926, "x": 518, "X": 611, "y": 500, "Y": 648, "z": 480, "Z": 611 } } };
|
|
2072
|
-
var fallbackMetrics = { "\u2190": [0.966796875, 0.2109375, 0], "\u2192": [0.966796875, 0.2109375, 0], "\u2191": [0.966796875, 0.2109375, 0], "\u2193": [0.966796875, 0.2109375, 0], "\u25E6": [0.966796875, 0.2109375, 0], "\u2610": [0.66650390625, 0.25, 0.08349609375], "\u2611": [0.66650390625, 0.25, 0.08349609375], "\u2713": [0.966796875, 0.2109375, 0] };
|
|
2073
|
-
|
|
2074
2217
|
// src/svg-util.ts
|
|
2075
2218
|
function color(c) {
|
|
2076
2219
|
const h = (v) => Math.round(Math.min(Math.max(v, 0), 1) * 255).toString(16).padStart(2, "0");
|
|
@@ -2080,74 +2223,6 @@ function escapeXML(s) {
|
|
|
2080
2223
|
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
2081
2224
|
}
|
|
2082
2225
|
|
|
2083
|
-
// src/text.ts
|
|
2084
|
-
function measure(s, fontSize, face2 = "regular") {
|
|
2085
|
-
const f = fonts[face2];
|
|
2086
|
-
const fallback = f.w["n"];
|
|
2087
|
-
let w = 0;
|
|
2088
|
-
let prev = "";
|
|
2089
|
-
for (const ch of s) {
|
|
2090
|
-
w += f.w[ch] ?? fallback;
|
|
2091
|
-
if (prev) w += f.k[prev + ch] ?? 0;
|
|
2092
|
-
prev = ch;
|
|
2093
|
-
}
|
|
2094
|
-
return w * fontSize / 1e3;
|
|
2095
|
-
}
|
|
2096
|
-
function lineHeights(fontSize) {
|
|
2097
|
-
const a = Math.round(ascent * fontSize), d = Math.round(descent * fontSize), l = Math.round(leading * fontSize);
|
|
2098
|
-
return [a + d, a + d + l];
|
|
2099
|
-
}
|
|
2100
|
-
function breaksAfter(ch, next) {
|
|
2101
|
-
if (ch === " ") return true;
|
|
2102
|
-
return (ch === "/" || ch === "-") && next !== "" && !/[\d\s/-]/.test(next);
|
|
2103
|
-
}
|
|
2104
|
-
function pieces(para) {
|
|
2105
|
-
const chars = [...para];
|
|
2106
|
-
const out = [];
|
|
2107
|
-
let cur = "";
|
|
2108
|
-
chars.forEach((ch, i) => {
|
|
2109
|
-
cur += ch;
|
|
2110
|
-
const next = chars[i + 1] ?? "";
|
|
2111
|
-
if (breaksAfter(ch, next) && next !== " ") {
|
|
2112
|
-
out.push(cur);
|
|
2113
|
-
cur = "";
|
|
2114
|
-
}
|
|
2115
|
-
});
|
|
2116
|
-
if (cur || out.length === 0) out.push(cur);
|
|
2117
|
-
return out;
|
|
2118
|
-
}
|
|
2119
|
-
function wrap(s, fontSize, maxWidth, face2 = "regular") {
|
|
2120
|
-
const out = [];
|
|
2121
|
-
for (const para of s.split(/\r\n|\n|\r|\u2028|\u2029/)) {
|
|
2122
|
-
let line2 = "";
|
|
2123
|
-
for (const piece of pieces(para)) {
|
|
2124
|
-
const candidate = line2 + piece;
|
|
2125
|
-
if (line2 === "" || measure(candidate.trimEnd(), fontSize, face2) <= maxWidth) {
|
|
2126
|
-
line2 = candidate;
|
|
2127
|
-
} else {
|
|
2128
|
-
out.push(line2);
|
|
2129
|
-
line2 = piece;
|
|
2130
|
-
}
|
|
2131
|
-
while (measure(line2.trimEnd(), fontSize, face2) > maxWidth && [...line2.trimEnd()].length > 1) {
|
|
2132
|
-
const chars = [...line2];
|
|
2133
|
-
let n = chars.length - 1;
|
|
2134
|
-
while (n > 1 && measure(chars.slice(0, n).join(""), fontSize, face2) > maxWidth) n--;
|
|
2135
|
-
out.push(chars.slice(0, n).join(""));
|
|
2136
|
-
line2 = chars.slice(n).join("");
|
|
2137
|
-
}
|
|
2138
|
-
}
|
|
2139
|
-
out.push(line2);
|
|
2140
|
-
}
|
|
2141
|
-
return out;
|
|
2142
|
-
}
|
|
2143
|
-
function textSize(s, fontSize, maxWidth) {
|
|
2144
|
-
if (s === "") return { width: 0, height: 0 };
|
|
2145
|
-
const lines = wrap(s, fontSize, maxWidth);
|
|
2146
|
-
const width = Math.max(...lines.map((l) => measure(l.trimEnd(), fontSize)));
|
|
2147
|
-
const [first, next] = lineHeights(fontSize);
|
|
2148
|
-
return { width: Math.ceil(width - 1e-9), height: Math.ceil(first + next * (lines.length - 1) - 1e-9) };
|
|
2149
|
-
}
|
|
2150
|
-
|
|
2151
2226
|
// src/note.ts
|
|
2152
2227
|
var PADDING = 12;
|
|
2153
2228
|
var SEP = "\u2028";
|
|
@@ -2403,35 +2478,36 @@ function underlineBareURLs(runs) {
|
|
|
2403
2478
|
return out;
|
|
2404
2479
|
});
|
|
2405
2480
|
}
|
|
2406
|
-
function
|
|
2407
|
-
return r.
|
|
2481
|
+
function famOf(r, fam) {
|
|
2482
|
+
return r.mono ? families[DEFAULT_FAMILY] : fam;
|
|
2408
2483
|
}
|
|
2409
|
-
function charWidth(ch, r) {
|
|
2410
|
-
|
|
2411
|
-
|
|
2412
|
-
|
|
2484
|
+
function charWidth(ch, r, fam) {
|
|
2485
|
+
const f = famOf(r, fam);
|
|
2486
|
+
if (r.mono && f.fallback[ch] === void 0) return monoAdvance * r.size;
|
|
2487
|
+
const face = f.faces[faceOf(f, r.bold, r.italic)];
|
|
2488
|
+
return (face.w[ch] ?? f.faces.regular.w[ch] ?? face.w["n"]) * r.size / 1e3;
|
|
2413
2489
|
}
|
|
2414
|
-
function kern(a, b, r) {
|
|
2490
|
+
function kern(a, b, r, fam) {
|
|
2415
2491
|
if (r.mono) return 0;
|
|
2416
|
-
return (
|
|
2492
|
+
return (fam.faces[faceOf(fam, r.bold, r.italic)].k[a + b] ?? 0) * r.size / 1e3;
|
|
2417
2493
|
}
|
|
2418
|
-
function metrics(ch, r) {
|
|
2419
|
-
const fb =
|
|
2494
|
+
function metrics(ch, r, fam) {
|
|
2495
|
+
const fb = famOf(r, fam).fallback[ch];
|
|
2420
2496
|
if (fb) return [fb[0] * r.size, fb[1] * r.size, fb[2] * r.size];
|
|
2421
2497
|
if (r.mono) return [monoAscent * r.size, monoDescent * r.size, 0];
|
|
2422
|
-
|
|
2423
|
-
|
|
2424
|
-
if (r.italic) return [italicAscent * r.size, italicDescent * r.size, italicLeading * r.size];
|
|
2425
|
-
return [ascent * r.size, descent * r.size, leading * r.size];
|
|
2498
|
+
const m = fam.faces[faceOf(fam, r.bold, r.italic)];
|
|
2499
|
+
return [m.ascent * r.size, m.descent * r.size, m.leading * r.size];
|
|
2426
2500
|
}
|
|
2427
2501
|
var Builder = class {
|
|
2428
|
-
constructor(fontSize, width) {
|
|
2502
|
+
constructor(fontSize, width, fam) {
|
|
2429
2503
|
__publicField(this, "paras", []);
|
|
2430
2504
|
__publicField(this, "nextSpacing", null);
|
|
2431
2505
|
__publicField(this, "fontSize");
|
|
2432
2506
|
__publicField(this, "width");
|
|
2507
|
+
__publicField(this, "fam");
|
|
2433
2508
|
this.fontSize = fontSize;
|
|
2434
2509
|
this.width = width;
|
|
2510
|
+
this.fam = fam;
|
|
2435
2511
|
}
|
|
2436
2512
|
get gap() {
|
|
2437
2513
|
return this.fontSize * 0.5;
|
|
@@ -2439,13 +2515,13 @@ var Builder = class {
|
|
|
2439
2515
|
spacing(normal) {
|
|
2440
2516
|
return this.paras.length === 0 ? 0 : this.nextSpacing ?? normal;
|
|
2441
2517
|
}
|
|
2442
|
-
run(i, size, alpha,
|
|
2518
|
+
run(i, size, alpha, base2 = {}) {
|
|
2443
2519
|
const mono = !!i.mono;
|
|
2444
2520
|
return {
|
|
2445
2521
|
text: i.text,
|
|
2446
2522
|
size: mono ? size * 0.9 : size,
|
|
2447
|
-
bold: !!(i.bold ||
|
|
2448
|
-
italic: !!(i.italic ||
|
|
2523
|
+
bold: !!(i.bold || base2.bold),
|
|
2524
|
+
italic: !!(i.italic || base2.italic),
|
|
2449
2525
|
mono,
|
|
2450
2526
|
strike: !!i.strike,
|
|
2451
2527
|
underline: !!i.link,
|
|
@@ -2478,7 +2554,7 @@ var Builder = class {
|
|
|
2478
2554
|
break;
|
|
2479
2555
|
case "list": {
|
|
2480
2556
|
const markers = b.items.map((it, i) => it.checkbox === true ? "\u2611" : it.checkbox === false ? "\u2610" : b.ordered !== null ? `${b.ordered + i}.` : ctx.listDepth % 2 === 0 ? "\u2022" : "\u25E6");
|
|
2481
|
-
const plain = (s) => measureRun({ text: s, size: this.fontSize, bold: false, italic: false, mono: false, strike: false, underline: false, alpha: 1 });
|
|
2557
|
+
const plain = (s) => measureRun({ text: s, size: this.fontSize, bold: false, italic: false, mono: false, strike: false, underline: false, alpha: 1 }, this.fam);
|
|
2482
2558
|
const widest = Math.max(0, ...markers.map(plain));
|
|
2483
2559
|
const hang = ctx.indent + Math.max(widest + this.fontSize * 0.45, this.fontSize * 1.2);
|
|
2484
2560
|
b.items.forEach((item, i) => {
|
|
@@ -2523,7 +2599,7 @@ var Builder = class {
|
|
|
2523
2599
|
const widths = (size2) => {
|
|
2524
2600
|
const w2 = new Array(columns).fill(0);
|
|
2525
2601
|
for (const row of rows) row.cells.forEach((c, i) => {
|
|
2526
|
-
if (i < columns) w2[i] = Math.max(w2[i], cell(c, row.header, size2).reduce((s, r) => s + measureRun(r), 0));
|
|
2602
|
+
if (i < columns) w2[i] = Math.max(w2[i], cell(c, row.header, size2).reduce((s, r) => s + measureRun(r, this.fam), 0));
|
|
2527
2603
|
});
|
|
2528
2604
|
return w2;
|
|
2529
2605
|
};
|
|
@@ -2567,17 +2643,17 @@ var Builder = class {
|
|
|
2567
2643
|
});
|
|
2568
2644
|
}
|
|
2569
2645
|
};
|
|
2570
|
-
function measureRun(r) {
|
|
2646
|
+
function measureRun(r, fam) {
|
|
2571
2647
|
let w = 0, prev = "";
|
|
2572
2648
|
for (const ch of r.text) {
|
|
2573
|
-
w += charWidth(ch, r);
|
|
2574
|
-
if (prev) w += kern(prev, ch, r);
|
|
2649
|
+
w += charWidth(ch, r, fam);
|
|
2650
|
+
if (prev) w += kern(prev, ch, r, fam);
|
|
2575
2651
|
prev = ch;
|
|
2576
2652
|
}
|
|
2577
2653
|
return w;
|
|
2578
2654
|
}
|
|
2579
2655
|
var TAB_INTERVAL = 28;
|
|
2580
|
-
function layoutLines(paras, width, height, fontSize) {
|
|
2656
|
+
function layoutLines(paras, width, height, fontSize, fam) {
|
|
2581
2657
|
const lines = [];
|
|
2582
2658
|
let baseline = 0;
|
|
2583
2659
|
let prev = null;
|
|
@@ -2611,7 +2687,7 @@ function layoutLines(paras, width, height, fontSize) {
|
|
|
2611
2687
|
let seg = 0, prevCh = "";
|
|
2612
2688
|
for (let q = end + 1; q < chars.length && chars[q].ch !== " " && chars[q].ch !== "\n" && chars[q].ch !== SEP; q++) {
|
|
2613
2689
|
const rr = runs[chars[q].run];
|
|
2614
|
-
seg += charWidth(chars[q].ch, rr) + (prevCh ? kern(prevCh, chars[q].ch, rr) : 0);
|
|
2690
|
+
seg += charWidth(chars[q].ch, rr, fam) + (prevCh ? kern(prevCh, chars[q].ch, rr, fam) : 0);
|
|
2615
2691
|
prevCh = chars[q].ch;
|
|
2616
2692
|
}
|
|
2617
2693
|
tx = Math.max(x, stop.align === "right" ? stop.x - seg : stop.x - seg / 2);
|
|
@@ -2622,12 +2698,12 @@ function layoutLines(paras, width, height, fontSize) {
|
|
|
2622
2698
|
continue;
|
|
2623
2699
|
}
|
|
2624
2700
|
const prevGlyph = glyphs[glyphs.length - 1];
|
|
2625
|
-
const kx = prevGlyph && prevGlyph.run === run && prevGlyph.ch !== " " ? kern(prevGlyph.ch, ch, r) : 0;
|
|
2701
|
+
const kx = prevGlyph && prevGlyph.run === run && prevGlyph.ch !== " " ? kern(prevGlyph.ch, ch, r, fam) : 0;
|
|
2626
2702
|
if (prevGlyph) {
|
|
2627
2703
|
prevGlyph.w += kx;
|
|
2628
2704
|
x += kx;
|
|
2629
2705
|
}
|
|
2630
|
-
const w = charWidth(ch, r);
|
|
2706
|
+
const w = charWidth(ch, r, fam);
|
|
2631
2707
|
if (ch !== " " && x + w > maxX2 + 0.01 && glyphs.some((g) => g.ch !== " ")) {
|
|
2632
2708
|
if (lastSpace >= 0) {
|
|
2633
2709
|
glyphs.length = lastSpace + 1;
|
|
@@ -2642,17 +2718,17 @@ function layoutLines(paras, width, height, fontSize) {
|
|
|
2642
2718
|
}
|
|
2643
2719
|
if (glyphs.length === 0 && end === k && k < chars.length) {
|
|
2644
2720
|
const { ch, run } = chars[k];
|
|
2645
|
-
glyphs.push({ ch, run, x: start, w: charWidth(ch, runs[run]) });
|
|
2721
|
+
glyphs.push({ ch, run, x: start, w: charWidth(ch, runs[run], fam) });
|
|
2646
2722
|
end = k + 1;
|
|
2647
2723
|
}
|
|
2648
2724
|
let asc = 0, desc = 0, lead = 0;
|
|
2649
2725
|
for (const g of glyphs) {
|
|
2650
|
-
const [a, d, l] = metrics(g.ch, runs[g.run]);
|
|
2726
|
+
const [a, d, l] = metrics(g.ch, runs[g.run], fam);
|
|
2651
2727
|
asc = Math.max(asc, a);
|
|
2652
2728
|
desc = Math.max(desc, d);
|
|
2653
2729
|
lead = Math.max(lead, l);
|
|
2654
2730
|
}
|
|
2655
|
-
if (glyphs.length === 0) [asc, desc, lead] = metrics(" ", runs[0] ?? { text: " ", size: fontSize, bold: false, italic: false, mono: false, strike: false, underline: false, alpha: 1 });
|
|
2731
|
+
if (glyphs.length === 0) [asc, desc, lead] = metrics(" ", runs[0] ?? { text: " ", size: fontSize, bold: false, italic: false, mono: false, strike: false, underline: false, alpha: 1 }, fam);
|
|
2656
2732
|
baseline = prev ? baseline + Math.round(prev.desc) + Math.round(prev.lead) + (firstLine ? p.spacing : 0) + Math.round(asc) : Math.round(asc);
|
|
2657
2733
|
if (baseline + desc > height + 0.5) return;
|
|
2658
2734
|
const line2 = { glyphs, asc, desc, lead, baseline, para: p, first: firstLine };
|
|
@@ -2671,9 +2747,10 @@ function layoutLines(paras, width, height, fontSize) {
|
|
|
2671
2747
|
function noteMarkup(source, e) {
|
|
2672
2748
|
const rect2 = textRect({ x: e.x, y: e.y, width: e.width, height: e.height });
|
|
2673
2749
|
if (!(rect2.width > 1 && rect2.height > 1)) return "";
|
|
2674
|
-
const
|
|
2750
|
+
const fam = familyMetrics(e.style.font);
|
|
2751
|
+
const b = new Builder(e.style.fontSize, rect2.width, fam);
|
|
2675
2752
|
for (const block of parseBlocks(source)) b.block(block, { indent: 0, marker: null, quote: null, listDepth: 0 });
|
|
2676
|
-
const lines = layoutLines(b.paras, rect2.width, rect2.height, e.style.fontSize);
|
|
2753
|
+
const lines = layoutLines(b.paras, rect2.width, rect2.height, e.style.fontSize, fam);
|
|
2677
2754
|
const ink = color(e.style.stroke);
|
|
2678
2755
|
let s = "";
|
|
2679
2756
|
const marks = [];
|
|
@@ -2692,8 +2769,8 @@ function noteMarkup(source, e) {
|
|
|
2692
2769
|
const r = gs[i].r;
|
|
2693
2770
|
let j = i;
|
|
2694
2771
|
let text = "";
|
|
2695
|
-
const font = fontOf(gs[i].ch);
|
|
2696
|
-
while (j < gs.length && sameStyle(gs[j].r, r) && gs[j].ch !== " " && fontOf(gs[j].ch) === font) {
|
|
2772
|
+
const font = fontOf(gs[i].ch, famOf(r, fam));
|
|
2773
|
+
while (j < gs.length && sameStyle(gs[j].r, r) && gs[j].ch !== " " && fontOf(gs[j].ch, famOf(r, fam)) === font) {
|
|
2697
2774
|
text += gs[j].ch;
|
|
2698
2775
|
j++;
|
|
2699
2776
|
}
|
|
@@ -2701,20 +2778,21 @@ function noteMarkup(source, e) {
|
|
|
2701
2778
|
if (shown.trim() !== "") {
|
|
2702
2779
|
let a = `font-size="${fmt(r.size)}"`;
|
|
2703
2780
|
if (r.mono) a += ` font-family="Menlo, Consolas, monospace"`;
|
|
2704
|
-
|
|
2705
|
-
if (r.
|
|
2781
|
+
const face = r.mono ? "regular" : faceOf(fam, r.bold, r.italic);
|
|
2782
|
+
if (r.mono ? r.bold : face === "bold" || face === "boldItalic") a += ` font-weight="bold"`;
|
|
2783
|
+
if (r.mono ? r.italic : face === "italic" || face === "boldItalic") a += ` font-style="italic"`;
|
|
2706
2784
|
if (r.underline) a += ` text-decoration="underline"`;
|
|
2707
2785
|
if (r.alpha < 1) a += ` fill-opacity="${fmt(r.alpha * e.style.stroke.a)}"`;
|
|
2708
2786
|
spans += `<tspan x="${fmt(rect2.x + gs[i].x)}" ${a}>${escapeXML(shown)}</tspan>`;
|
|
2709
2787
|
}
|
|
2710
2788
|
if (r.strike && j > i) {
|
|
2711
|
-
const y = l.baseline - metrics(gs[i].ch, r)[0] * 0.32;
|
|
2789
|
+
const y = l.baseline - metrics(gs[i].ch, r, fam)[0] * 0.32;
|
|
2712
2790
|
marks.push([rect2.x + gs[i].x, rect2.y + y, rect2.x + gs[j - 1].x + gs[j - 1].w, rect2.y + y]);
|
|
2713
2791
|
}
|
|
2714
2792
|
if (j === i) j++;
|
|
2715
2793
|
i = j;
|
|
2716
2794
|
}
|
|
2717
|
-
if (spans) s += `<text y="${fmt(rect2.y + l.baseline)}" font-family="
|
|
2795
|
+
if (spans) s += `<text y="${fmt(rect2.y + l.baseline)}" font-family="${cssFamily(e.style.font)}" fill="${ink}" xml:space="preserve">${spans}</text>
|
|
2718
2796
|
`;
|
|
2719
2797
|
}
|
|
2720
2798
|
const width = fmt(Math.max(1, e.style.fontSize / 14));
|
|
@@ -2724,8 +2802,8 @@ function noteMarkup(source, e) {
|
|
|
2724
2802
|
}
|
|
2725
2803
|
return s;
|
|
2726
2804
|
}
|
|
2727
|
-
function fontOf(ch) {
|
|
2728
|
-
return
|
|
2805
|
+
function fontOf(ch, fam) {
|
|
2806
|
+
return fam.fallback[ch] ? `fb:${ch}` : "";
|
|
2729
2807
|
}
|
|
2730
2808
|
function sameStyle(a, b) {
|
|
2731
2809
|
return a === b || a.size === b.size && a.bold === b.bold && a.italic === b.italic && a.mono === b.mono && a.strike === b.strike && a.underline === b.underline && a.alpha === b.alpha;
|
|
@@ -2788,8 +2866,8 @@ function svgOpen(b, background, paint) {
|
|
|
2788
2866
|
}
|
|
2789
2867
|
return out;
|
|
2790
2868
|
}
|
|
2791
|
-
function svgParts(page, background, fixed) {
|
|
2792
|
-
if (hasInstances(page)) return svgParts(expandingSymbols(page, 0), background, fixed);
|
|
2869
|
+
function svgParts(page, background, fixed, links = false) {
|
|
2870
|
+
if (hasInstances(page)) return svgParts(expandingSymbols(page, 0), background, fixed, links);
|
|
2793
2871
|
const theme = themeNamed(page.theme);
|
|
2794
2872
|
const bg = background ? theme?.background ?? background : null;
|
|
2795
2873
|
const ink = theme?.ink ?? black;
|
|
@@ -2813,20 +2891,25 @@ function svgParts(page, background, fixed) {
|
|
|
2813
2891
|
${body}</g>
|
|
2814
2892
|
`;
|
|
2815
2893
|
}
|
|
2816
|
-
|
|
2894
|
+
if (alpha < 1) body = `<g opacity="${fmt(alpha)}">
|
|
2817
2895
|
${body}</g>
|
|
2818
|
-
|
|
2896
|
+
`;
|
|
2897
|
+
const href = links ? (e.click?.url ? allowedURL(e.click.url) : null) ?? webLink(e.url) : null;
|
|
2898
|
+
if (href) body = `<a href="${escapeXML(href).replace(/"/g, """)}" target="_blank">
|
|
2899
|
+
${body}</a>
|
|
2900
|
+
`;
|
|
2901
|
+
parts.push({ key: e.id, markup: body });
|
|
2819
2902
|
}
|
|
2820
2903
|
return { bounds: b, parts };
|
|
2821
2904
|
}
|
|
2822
2905
|
function svg(page, background = { r: 1, g: 1, b: 1, a: 1 }, fixed) {
|
|
2823
|
-
const { bounds: b, parts } = svgParts(page, background, fixed);
|
|
2906
|
+
const { bounds: b, parts } = svgParts(page, background, fixed, true);
|
|
2824
2907
|
return svgOpen(b, themeNamed(page.theme)?.background ?? background, background !== null) + parts.map((p) => p.markup).join("") + "</svg>\n";
|
|
2825
2908
|
}
|
|
2826
2909
|
function labelRect(e, index) {
|
|
2827
2910
|
const m = midpoint(e, index);
|
|
2828
2911
|
const text = e.text ?? "";
|
|
2829
|
-
const size = textSize(text === "" ? "Label" : text, e.style.fontSize, 200);
|
|
2912
|
+
const size = textSize(text === "" ? "Label" : text, e.style.fontSize, 200, e.style.font);
|
|
2830
2913
|
const w = Math.max(size.width + 12, 44), h = size.height + 6;
|
|
2831
2914
|
return { x: m.x - w / 2, y: m.y - h / 2, width: w, height: h };
|
|
2832
2915
|
}
|
|
@@ -2940,7 +3023,7 @@ function textElement(text, f, e, centered) {
|
|
|
2940
3023
|
const total = lineHeight * lines.length;
|
|
2941
3024
|
const x = centered ? midX(f) : f.x;
|
|
2942
3025
|
const top = centered ? midY(f) - total / 2 : f.y;
|
|
2943
|
-
let s = `<text x="${fmt(x)}" font-family="
|
|
3026
|
+
let s = `<text x="${fmt(x)}" font-family="${cssFamily(e.style.font)}" font-size="${fmt(size)}" fill="${color(e.style.stroke)}"${centered ? ` text-anchor="middle"` : ""}>`;
|
|
2944
3027
|
lines.forEach((line2, i) => {
|
|
2945
3028
|
s += `<tspan x="${fmt(x)}" y="${fmt(top + lineHeight * (i + 0.8))}">${escapeXML(line2)}</tspan>`;
|
|
2946
3029
|
});
|
|
@@ -3007,6 +3090,7 @@ var Playback = class {
|
|
|
3007
3090
|
__publicField(this, "frame", -1);
|
|
3008
3091
|
__publicField(this, "onFrame", null);
|
|
3009
3092
|
this.page = options.clean ? withRoughness(page, 0) : page;
|
|
3093
|
+
addFonts(usedFonts(this.page));
|
|
3010
3094
|
this.plan = plan(this.page);
|
|
3011
3095
|
this.clicks = clickTargets(page, options.file);
|
|
3012
3096
|
const table = symbolTable(this.page);
|
|
@@ -3168,16 +3252,16 @@ var Playback = class {
|
|
|
3168
3252
|
const s = keys.map((k) => m2.get(k) ?? "").join("");
|
|
3169
3253
|
return s === "" ? null : s;
|
|
3170
3254
|
};
|
|
3171
|
-
const
|
|
3255
|
+
const base2 = join(normal) ?? "";
|
|
3172
3256
|
const instance = pose.elements.find((e) => e.id === o && e.kind === "symbol");
|
|
3173
3257
|
const overLook = instance ? join(over) : join(hover);
|
|
3174
3258
|
const downLook = instance ? join(down) : null;
|
|
3175
|
-
const shownOver = overLook !== null && overLook !==
|
|
3176
|
-
const shownDown = downLook !== null && downLook !== (overLook ??
|
|
3177
|
-
if (!instance && shownOver === null) return { key: o, markup:
|
|
3259
|
+
const shownOver = overLook !== null && overLook !== base2 ? overLook : null;
|
|
3260
|
+
const shownDown = downLook !== null && downLook !== (overLook ?? base2) ? downLook : null;
|
|
3261
|
+
if (!instance && shownOver === null) return { key: o, markup: base2, button: false };
|
|
3178
3262
|
const still2 = instance ? ` pointer-events="none"` : "";
|
|
3179
3263
|
let m = `<g class="dottie-n"${still2}>
|
|
3180
|
-
${
|
|
3264
|
+
${base2}</g>
|
|
3181
3265
|
`;
|
|
3182
3266
|
if (shownOver !== null) m += `<g class="dottie-h"${still2}>
|
|
3183
3267
|
${shownOver}</g>
|
|
@@ -3631,9 +3715,10 @@ function render(source, options = {}) {
|
|
|
3631
3715
|
function isFile(v) {
|
|
3632
3716
|
return typeof v === "object" && v !== null && Array.isArray(v.pages) && Array.isArray(v.warnings);
|
|
3633
3717
|
}
|
|
3634
|
-
var VERSION = "0.6.
|
|
3718
|
+
var VERSION = "0.6.2";
|
|
3635
3719
|
export {
|
|
3636
3720
|
BOIL_DRAWINGS,
|
|
3721
|
+
BUNDLED_FONTS,
|
|
3637
3722
|
DottieFormatError,
|
|
3638
3723
|
DottiePlayer,
|
|
3639
3724
|
KINDS,
|
|
@@ -3643,6 +3728,7 @@ export {
|
|
|
3643
3728
|
Playback,
|
|
3644
3729
|
SUPPORTED_VERSION,
|
|
3645
3730
|
VERSION,
|
|
3731
|
+
addFonts,
|
|
3646
3732
|
allowedURL,
|
|
3647
3733
|
black,
|
|
3648
3734
|
bounds,
|
|
@@ -3654,6 +3740,8 @@ export {
|
|
|
3654
3740
|
cloneElement,
|
|
3655
3741
|
definePlayer,
|
|
3656
3742
|
elementIndex,
|
|
3743
|
+
fontFaces,
|
|
3744
|
+
fontFile,
|
|
3657
3745
|
frameTimes,
|
|
3658
3746
|
inkOnDark,
|
|
3659
3747
|
inspect,
|
|
@@ -3672,6 +3760,7 @@ export {
|
|
|
3672
3760
|
sameColor,
|
|
3673
3761
|
sampleTimes,
|
|
3674
3762
|
sceneAt,
|
|
3763
|
+
setFontBase,
|
|
3675
3764
|
stableSortBy,
|
|
3676
3765
|
still,
|
|
3677
3766
|
svg,
|
|
@@ -3679,5 +3768,7 @@ export {
|
|
|
3679
3768
|
themeNamed,
|
|
3680
3769
|
themes,
|
|
3681
3770
|
transientElements,
|
|
3771
|
+
usedFonts,
|
|
3772
|
+
webLink,
|
|
3682
3773
|
withRoughness
|
|
3683
3774
|
};
|