@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.
@@ -1,4 +1,4 @@
1
- /*! dottie.js 0.6.0 | Apache-2.0 | https://github.com/phin-tech/dottie */
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 __export = (target, all) => {
@@ -11,6 +11,7 @@ var __publicField = (obj, key, value2) => __defNormalProp(obj, typeof key !== "s
11
11
  var index_exports = {};
12
12
  __export(index_exports, {
13
13
  BOIL_DRAWINGS: () => BOIL_DRAWINGS,
14
+ BUNDLED_FONTS: () => BUNDLED_FONTS,
14
15
  DottieFormatError: () => DottieFormatError,
15
16
  DottiePlayer: () => DottiePlayer,
16
17
  KINDS: () => KINDS,
@@ -20,6 +21,7 @@ __export(index_exports, {
20
21
  Playback: () => Playback,
21
22
  SUPPORTED_VERSION: () => SUPPORTED_VERSION,
22
23
  VERSION: () => VERSION,
24
+ addFonts: () => addFonts,
23
25
  allowedURL: () => allowedURL,
24
26
  black: () => black,
25
27
  bounds: () => bounds,
@@ -31,6 +33,8 @@ __export(index_exports, {
31
33
  cloneElement: () => cloneElement,
32
34
  definePlayer: () => definePlayer,
33
35
  elementIndex: () => elementIndex,
36
+ fontFaces: () => fontFaces,
37
+ fontFile: () => fontFile,
34
38
  frameTimes: () => frameTimes,
35
39
  inkOnDark: () => inkOnDark,
36
40
  inspect: () => inspect,
@@ -49,6 +53,7 @@ __export(index_exports, {
49
53
  sameColor: () => sameColor,
50
54
  sampleTimes: () => sampleTimes,
51
55
  sceneAt: () => sceneAt,
56
+ setFontBase: () => setFontBase,
52
57
  stableSortBy: () => stableSortBy,
53
58
  still: () => still,
54
59
  svg: () => svg,
@@ -56,6 +61,8 @@ __export(index_exports, {
56
61
  themeNamed: () => themeNamed,
57
62
  themes: () => themes,
58
63
  transientElements: () => transientElements,
64
+ usedFonts: () => usedFonts,
65
+ webLink: () => webLink,
59
66
  withRoughness: () => withRoughness
60
67
  });
61
68
 
@@ -69,7 +76,7 @@ var KNOWN_FIELDS = {
69
76
  symbol: ["id", "name", "width", "height", "layers", "elements", "timeline", "button", "params"],
70
77
  layer: ["id", "name", "visible", "locked"],
71
78
  rgba: ["r", "g", "b", "a"],
72
- style: ["stroke", "fill", "fillStyle", "strokeWidth", "dash", "roughness", "bowing", "fontSize", "gridSize", "opacity", "dashOffset"],
79
+ style: ["stroke", "fill", "fillStyle", "strokeWidth", "dash", "roughness", "bowing", "fontSize", "font", "gridSize", "opacity", "dashOffset"],
73
80
  element: [
74
81
  "id",
75
82
  "kind",
@@ -89,6 +96,7 @@ var KNOWN_FIELDS = {
89
96
  "evenOdd",
90
97
  "rotation",
91
98
  "link",
99
+ "url",
92
100
  "anchor",
93
101
  "click",
94
102
  "hover",
@@ -147,6 +155,9 @@ function allowedURL(url) {
147
155
  if (!/^(https?:\/\/|mailto:)/i.test(u) || [...u].length <= 7 || /[\u0000-\u001f\u007f-\u009f]/.test(u)) return null;
148
156
  return u;
149
157
  }
158
+ function webLink(url) {
159
+ return url ? allowedURL(url) : null;
160
+ }
150
161
  function rgba(v) {
151
162
  if (!isObj(v)) return void 0;
152
163
  const r = num(v.r), g = num(v.g), b = num(v.b);
@@ -185,6 +196,7 @@ var Reader = class {
185
196
  roughness: num(s.roughness) ?? 1,
186
197
  bowing: num(s.bowing) ?? 1,
187
198
  fontSize: num(s.fontSize) ?? 18,
199
+ font: str(s.font) || null,
188
200
  gridSize: num(s.gridSize) ?? null,
189
201
  opacity: num(s.opacity) ?? null,
190
202
  dashOffset: num(s.dashOffset) ?? null
@@ -262,6 +274,7 @@ var Reader = class {
262
274
  evenOdd: bool(v.evenOdd) ?? null,
263
275
  rotation: num(v.rotation) ?? null,
264
276
  link: uuid(v.link) ?? null,
277
+ url: str(v.url) ?? null,
265
278
  anchor: str(v.anchor) ?? null,
266
279
  click: this.click(v.click),
267
280
  hover: this.hover(v.hover),
@@ -511,6 +524,159 @@ function elementIndex(page) {
511
524
  return m;
512
525
  }
513
526
 
527
+ // src/metrics.ts
528
+ var monoAdvance = 0.60205078125;
529
+ var monoAscent = 0.92822265625;
530
+ var monoDescent = 0.23583984375;
531
+ 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] } } };
532
+
533
+ // src/text.ts
534
+ var DEFAULT_FAMILY = "Helvetica Neue";
535
+ var CSS_FALLBACK = "Helvetica Neue, Helvetica, Arial, sans-serif";
536
+ var BUNDLED_FONTS = Object.keys(families).filter((f) => f !== DEFAULT_FAMILY).sort();
537
+ function bundledFamily(font) {
538
+ if (!font) return null;
539
+ const lower = font.toLowerCase();
540
+ return BUNDLED_FONTS.find((f) => f.toLowerCase() === lower) ?? null;
541
+ }
542
+ function familyMetrics(font) {
543
+ return families[bundledFamily(font) ?? DEFAULT_FAMILY];
544
+ }
545
+ function faceOf(fam, bold, italic) {
546
+ const want = bold ? italic ? "boldItalic" : "bold" : italic ? "italic" : "regular";
547
+ return fam.faces[want] ? want : "regular";
548
+ }
549
+ function cssFamily(font) {
550
+ if (!font) return CSS_FALLBACK;
551
+ const name = [...bundledFamily(font) ?? font].filter((c) => !`"'<>&;{}\\`.includes(c)).join("");
552
+ if (name === "") return CSS_FALLBACK;
553
+ return `${/^[\p{L}\p{N} -]+$/u.test(name) ? name : `'${name}'`}, ${CSS_FALLBACK}`;
554
+ }
555
+ function measure(s, fontSize, face = "regular", font) {
556
+ const fam = familyMetrics(font);
557
+ const f = fam.faces[face] ?? fam.faces.regular;
558
+ const fallback = f.w["n"];
559
+ let w = 0;
560
+ let prev = "";
561
+ for (const ch of s) {
562
+ w += f.w[ch] ?? fallback;
563
+ if (prev) w += f.k[prev + ch] ?? 0;
564
+ prev = ch;
565
+ }
566
+ return w * fontSize / 1e3;
567
+ }
568
+ function lineHeights(fontSize, font) {
569
+ const m = familyMetrics(font).faces.regular;
570
+ const a = Math.round(m.ascent * fontSize), d = Math.round(m.descent * fontSize), l = Math.round(m.leading * fontSize);
571
+ return [a + Math.ceil(m.descent * fontSize - 1e-9), a + d + l];
572
+ }
573
+ function breaksAfter(ch, next) {
574
+ if (ch === " ") return true;
575
+ return (ch === "/" || ch === "-") && next !== "" && !/[\d\s/-]/.test(next);
576
+ }
577
+ function pieces(para) {
578
+ const chars = [...para];
579
+ const out = [];
580
+ let cur = "";
581
+ chars.forEach((ch, i) => {
582
+ cur += ch;
583
+ const next = chars[i + 1] ?? "";
584
+ if (breaksAfter(ch, next) && next !== " ") {
585
+ out.push(cur);
586
+ cur = "";
587
+ }
588
+ });
589
+ if (cur || out.length === 0) out.push(cur);
590
+ return out;
591
+ }
592
+ function wrap(s, fontSize, maxWidth, face = "regular", font) {
593
+ const width = (t) => measure(t, fontSize, face, font);
594
+ const out = [];
595
+ for (const para of s.split(/\r\n|\n|\r|\u2028|\u2029/)) {
596
+ let line2 = "";
597
+ for (const piece of pieces(para)) {
598
+ const candidate = line2 + piece;
599
+ if (line2 === "" || width(candidate.trimEnd()) <= maxWidth) {
600
+ line2 = candidate;
601
+ } else {
602
+ out.push(line2);
603
+ line2 = piece;
604
+ }
605
+ while (width(line2.trimEnd()) > maxWidth && [...line2.trimEnd()].length > 1) {
606
+ const chars = [...line2];
607
+ let n = chars.length - 1;
608
+ while (n > 1 && width(chars.slice(0, n).join("")) > maxWidth) n--;
609
+ out.push(chars.slice(0, n).join(""));
610
+ line2 = chars.slice(n).join("");
611
+ }
612
+ }
613
+ out.push(line2);
614
+ }
615
+ return out;
616
+ }
617
+ function textSize(s, fontSize, maxWidth, font) {
618
+ if (s === "") return { width: 0, height: 0 };
619
+ const lines = wrap(s, fontSize, maxWidth, "regular", font);
620
+ const width = Math.max(...lines.map((l) => measure(l.trimEnd(), fontSize, "regular", font)));
621
+ const [first, next] = lineHeights(fontSize, font);
622
+ return { width: Math.ceil(width - 1e-9), height: Math.ceil(first + next * (lines.length - 1) - 1e-9) };
623
+ }
624
+
625
+ // src/fonts.ts
626
+ var FACES = ["bold", "boldItalic", "italic", "regular"];
627
+ function fontFile(family, face) {
628
+ return `${family.toLowerCase().replaceAll(" ", "-")}-${face}.woff2`;
629
+ }
630
+ function fontFaces(family) {
631
+ return FACES.filter((f) => families[family]?.faces[f] !== void 0);
632
+ }
633
+ function usedFonts(page) {
634
+ const used = /* @__PURE__ */ new Set();
635
+ const add2 = (es) => {
636
+ for (const e of es) {
637
+ const b = bundledFamily(e.style.font);
638
+ if (b) used.add(b);
639
+ }
640
+ };
641
+ add2(page.elements);
642
+ for (const s of page.symbols ?? []) add2(s.elements);
643
+ return BUNDLED_FONTS.filter((f) => used.has(f));
644
+ }
645
+ function defaultBase() {
646
+ try {
647
+ const script = typeof document === "undefined" ? null : document.currentScript;
648
+ if (script?.src) return new URL("fonts/", script.src).href;
649
+ const here = import.meta.url;
650
+ return here ? new URL("fonts/", here).href : null;
651
+ } catch {
652
+ return null;
653
+ }
654
+ }
655
+ var base = defaultBase();
656
+ var added = /* @__PURE__ */ new Set();
657
+ function setFontBase(url) {
658
+ base = url.endsWith("/") ? url : `${url}/`;
659
+ }
660
+ function addFonts(fonts, data = {}) {
661
+ if (typeof document === "undefined" || typeof FontFace === "undefined" || !document.fonts) return;
662
+ for (const name of fonts) {
663
+ const family = bundledFamily(name);
664
+ if (!family || added.has(family)) continue;
665
+ const own = data[family];
666
+ if (!own && !base) continue;
667
+ added.add(family);
668
+ for (const face of fontFaces(family)) {
669
+ const encoded = own?.[face];
670
+ let source;
671
+ if (encoded) source = Uint8Array.from(atob(encoded), (c) => c.charCodeAt(0));
672
+ else if (!own) source = `url(${JSON.stringify(base + fontFile(family, face))}) format("woff2")`;
673
+ else continue;
674
+ const descriptors = { weight: face.startsWith("bold") ? "bold" : "normal", style: face === "italic" || face === "boldItalic" ? "italic" : "normal" };
675
+ document.fonts.add(new FontFace(family, source, descriptors));
676
+ }
677
+ }
678
+ }
679
+
514
680
  // src/path.ts
515
681
  var KAPPA = 0.5522847498307936;
516
682
  var Path = class _Path {
@@ -815,7 +981,7 @@ function flattenContour(cp) {
815
981
  return out;
816
982
  }
817
983
  function outlineCrossing(shape, c, d) {
818
- let best = null;
984
+ let nearest2 = null, farthest = null;
819
985
  for (const contour of shapeContours(shape)) {
820
986
  const pts = flattenContour(contour.points);
821
987
  const n = pts.length;
@@ -826,9 +992,12 @@ function outlineCrossing(shape, c, d) {
826
992
  const det = e.x * d.y - d.x * e.y;
827
993
  if (det === 0) continue;
828
994
  const t = (e.x * w.y - e.y * w.x) / det, s = (d.x * w.y - d.y * w.x) / det;
829
- if (t > 0 && s >= 0 && s <= 1 && (best === null || t < best)) best = t;
995
+ if (!(t > 0 && s >= 0 && s <= 1)) continue;
996
+ if (nearest2 === null || t < nearest2) nearest2 = t;
997
+ if (t <= 1 && (farthest === null || t > farthest)) farthest = t;
830
998
  }
831
999
  }
1000
+ const best = farthest ?? nearest2;
832
1001
  return best === null ? null : { x: c.x + d.x * best, y: c.y + d.y * best };
833
1002
  }
834
1003
  function edgePoint(shape, toward) {
@@ -1616,7 +1785,7 @@ function localTime(track, t) {
1616
1785
  }
1617
1786
  return t;
1618
1787
  }
1619
- function value(track, t, get, base, lerp) {
1788
+ function value(track, t, get, base2, lerp) {
1620
1789
  t = localTime(track, t);
1621
1790
  let before, after;
1622
1791
  for (const k of track.keys) {
@@ -1627,7 +1796,7 @@ function value(track, t, get, base, lerp) {
1627
1796
  break;
1628
1797
  }
1629
1798
  }
1630
- if (!before && !after) return base;
1799
+ if (!before && !after) return base2;
1631
1800
  if (before && !after) return get(before);
1632
1801
  if (!before && after) return get(after);
1633
1802
  const b = before, a = after;
@@ -1642,8 +1811,8 @@ var lerpColor = (a, b, u) => ({
1642
1811
  b: mix01(a.b, b.b, u),
1643
1812
  a: mix01(a.a, b.a, u)
1644
1813
  });
1645
- function num2(track, t, p, base) {
1646
- return value(track, t, (k) => k[p], base, lerpNum);
1814
+ function num2(track, t, p, base2) {
1815
+ return value(track, t, (k) => k[p], base2, lerpNum);
1647
1816
  }
1648
1817
  function isChanging(track, t) {
1649
1818
  t = localTime(track, t);
@@ -2044,7 +2213,7 @@ function clickTargets(page, file) {
2044
2213
  continue;
2045
2214
  }
2046
2215
  }
2047
- const url = c?.url ? allowedURL(c.url) : null;
2216
+ const url = (c?.url ? allowedURL(c.url) : null) ?? webLink(e.url);
2048
2217
  if (url) {
2049
2218
  out.set(e.id, { url });
2050
2219
  continue;
@@ -2108,25 +2277,6 @@ var CLICK_STYLE = `
2108
2277
  .dottie-b:active .dottie-d, .dottie-b.dottie-press .dottie-d { display: inline; }
2109
2278
  `;
2110
2279
 
2111
- // src/metrics.ts
2112
- var ascent = 0.951995849609375;
2113
- var descent = 0.2129974365234375;
2114
- var leading = 0.0279998779296875;
2115
- var boldAscent = 0.975006103515625;
2116
- var boldDescent = 0.2169952392578125;
2117
- var boldLeading = 0.0290069580078125;
2118
- var italicAscent = 0.957000732421875;
2119
- var italicDescent = 0.2129974365234375;
2120
- var italicLeading = 0.0279998779296875;
2121
- var boldItalicAscent = 0.975006103515625;
2122
- var boldItalicDescent = 0.2169952392578125;
2123
- var boldItalicLeading = 0.0290069580078125;
2124
- var monoAdvance = 0.60205078125;
2125
- var monoAscent = 0.92822265625;
2126
- var monoDescent = 0.23583984375;
2127
- 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 } } };
2128
- 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] };
2129
-
2130
2280
  // src/svg-util.ts
2131
2281
  function color(c) {
2132
2282
  const h = (v) => Math.round(Math.min(Math.max(v, 0), 1) * 255).toString(16).padStart(2, "0");
@@ -2136,74 +2286,6 @@ function escapeXML(s) {
2136
2286
  return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
2137
2287
  }
2138
2288
 
2139
- // src/text.ts
2140
- function measure(s, fontSize, face2 = "regular") {
2141
- const f = fonts[face2];
2142
- const fallback = f.w["n"];
2143
- let w = 0;
2144
- let prev = "";
2145
- for (const ch of s) {
2146
- w += f.w[ch] ?? fallback;
2147
- if (prev) w += f.k[prev + ch] ?? 0;
2148
- prev = ch;
2149
- }
2150
- return w * fontSize / 1e3;
2151
- }
2152
- function lineHeights(fontSize) {
2153
- const a = Math.round(ascent * fontSize), d = Math.round(descent * fontSize), l = Math.round(leading * fontSize);
2154
- return [a + d, a + d + l];
2155
- }
2156
- function breaksAfter(ch, next) {
2157
- if (ch === " ") return true;
2158
- return (ch === "/" || ch === "-") && next !== "" && !/[\d\s/-]/.test(next);
2159
- }
2160
- function pieces(para) {
2161
- const chars = [...para];
2162
- const out = [];
2163
- let cur = "";
2164
- chars.forEach((ch, i) => {
2165
- cur += ch;
2166
- const next = chars[i + 1] ?? "";
2167
- if (breaksAfter(ch, next) && next !== " ") {
2168
- out.push(cur);
2169
- cur = "";
2170
- }
2171
- });
2172
- if (cur || out.length === 0) out.push(cur);
2173
- return out;
2174
- }
2175
- function wrap(s, fontSize, maxWidth, face2 = "regular") {
2176
- const out = [];
2177
- for (const para of s.split(/\r\n|\n|\r|\u2028|\u2029/)) {
2178
- let line2 = "";
2179
- for (const piece of pieces(para)) {
2180
- const candidate = line2 + piece;
2181
- if (line2 === "" || measure(candidate.trimEnd(), fontSize, face2) <= maxWidth) {
2182
- line2 = candidate;
2183
- } else {
2184
- out.push(line2);
2185
- line2 = piece;
2186
- }
2187
- while (measure(line2.trimEnd(), fontSize, face2) > maxWidth && [...line2.trimEnd()].length > 1) {
2188
- const chars = [...line2];
2189
- let n = chars.length - 1;
2190
- while (n > 1 && measure(chars.slice(0, n).join(""), fontSize, face2) > maxWidth) n--;
2191
- out.push(chars.slice(0, n).join(""));
2192
- line2 = chars.slice(n).join("");
2193
- }
2194
- }
2195
- out.push(line2);
2196
- }
2197
- return out;
2198
- }
2199
- function textSize(s, fontSize, maxWidth) {
2200
- if (s === "") return { width: 0, height: 0 };
2201
- const lines = wrap(s, fontSize, maxWidth);
2202
- const width = Math.max(...lines.map((l) => measure(l.trimEnd(), fontSize)));
2203
- const [first, next] = lineHeights(fontSize);
2204
- return { width: Math.ceil(width - 1e-9), height: Math.ceil(first + next * (lines.length - 1) - 1e-9) };
2205
- }
2206
-
2207
2289
  // src/note.ts
2208
2290
  var PADDING = 12;
2209
2291
  var SEP = "\u2028";
@@ -2459,35 +2541,36 @@ function underlineBareURLs(runs) {
2459
2541
  return out;
2460
2542
  });
2461
2543
  }
2462
- function face(r) {
2463
- return r.bold ? r.italic ? "boldItalic" : "bold" : r.italic ? "italic" : "regular";
2544
+ function famOf(r, fam) {
2545
+ return r.mono ? families[DEFAULT_FAMILY] : fam;
2464
2546
  }
2465
- function charWidth(ch, r) {
2466
- if (r.mono && fallbackMetrics[ch] === void 0) return monoAdvance * r.size;
2467
- const f = fonts[face(r)];
2468
- return (f.w[ch] ?? fonts.regular.w[ch] ?? f.w["n"]) * r.size / 1e3;
2547
+ function charWidth(ch, r, fam) {
2548
+ const f = famOf(r, fam);
2549
+ if (r.mono && f.fallback[ch] === void 0) return monoAdvance * r.size;
2550
+ const face = f.faces[faceOf(f, r.bold, r.italic)];
2551
+ return (face.w[ch] ?? f.faces.regular.w[ch] ?? face.w["n"]) * r.size / 1e3;
2469
2552
  }
2470
- function kern(a, b, r) {
2553
+ function kern(a, b, r, fam) {
2471
2554
  if (r.mono) return 0;
2472
- return (fonts[face(r)].k[a + b] ?? 0) * r.size / 1e3;
2555
+ return (fam.faces[faceOf(fam, r.bold, r.italic)].k[a + b] ?? 0) * r.size / 1e3;
2473
2556
  }
2474
- function metrics(ch, r) {
2475
- const fb = fallbackMetrics[ch];
2557
+ function metrics(ch, r, fam) {
2558
+ const fb = famOf(r, fam).fallback[ch];
2476
2559
  if (fb) return [fb[0] * r.size, fb[1] * r.size, fb[2] * r.size];
2477
2560
  if (r.mono) return [monoAscent * r.size, monoDescent * r.size, 0];
2478
- if (r.bold && r.italic) return [boldItalicAscent * r.size, boldItalicDescent * r.size, boldItalicLeading * r.size];
2479
- if (r.bold) return [boldAscent * r.size, boldDescent * r.size, boldLeading * r.size];
2480
- if (r.italic) return [italicAscent * r.size, italicDescent * r.size, italicLeading * r.size];
2481
- return [ascent * r.size, descent * r.size, leading * r.size];
2561
+ const m = fam.faces[faceOf(fam, r.bold, r.italic)];
2562
+ return [m.ascent * r.size, m.descent * r.size, m.leading * r.size];
2482
2563
  }
2483
2564
  var Builder = class {
2484
- constructor(fontSize, width) {
2565
+ constructor(fontSize, width, fam) {
2485
2566
  __publicField(this, "paras", []);
2486
2567
  __publicField(this, "nextSpacing", null);
2487
2568
  __publicField(this, "fontSize");
2488
2569
  __publicField(this, "width");
2570
+ __publicField(this, "fam");
2489
2571
  this.fontSize = fontSize;
2490
2572
  this.width = width;
2573
+ this.fam = fam;
2491
2574
  }
2492
2575
  get gap() {
2493
2576
  return this.fontSize * 0.5;
@@ -2495,13 +2578,13 @@ var Builder = class {
2495
2578
  spacing(normal) {
2496
2579
  return this.paras.length === 0 ? 0 : this.nextSpacing ?? normal;
2497
2580
  }
2498
- run(i, size, alpha, base = {}) {
2581
+ run(i, size, alpha, base2 = {}) {
2499
2582
  const mono = !!i.mono;
2500
2583
  return {
2501
2584
  text: i.text,
2502
2585
  size: mono ? size * 0.9 : size,
2503
- bold: !!(i.bold || base.bold),
2504
- italic: !!(i.italic || base.italic),
2586
+ bold: !!(i.bold || base2.bold),
2587
+ italic: !!(i.italic || base2.italic),
2505
2588
  mono,
2506
2589
  strike: !!i.strike,
2507
2590
  underline: !!i.link,
@@ -2534,7 +2617,7 @@ var Builder = class {
2534
2617
  break;
2535
2618
  case "list": {
2536
2619
  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");
2537
- const plain = (s) => measureRun({ text: s, size: this.fontSize, bold: false, italic: false, mono: false, strike: false, underline: false, alpha: 1 });
2620
+ const plain = (s) => measureRun({ text: s, size: this.fontSize, bold: false, italic: false, mono: false, strike: false, underline: false, alpha: 1 }, this.fam);
2538
2621
  const widest = Math.max(0, ...markers.map(plain));
2539
2622
  const hang = ctx.indent + Math.max(widest + this.fontSize * 0.45, this.fontSize * 1.2);
2540
2623
  b.items.forEach((item, i) => {
@@ -2579,7 +2662,7 @@ var Builder = class {
2579
2662
  const widths = (size2) => {
2580
2663
  const w2 = new Array(columns).fill(0);
2581
2664
  for (const row of rows) row.cells.forEach((c, i) => {
2582
- if (i < columns) w2[i] = Math.max(w2[i], cell(c, row.header, size2).reduce((s, r) => s + measureRun(r), 0));
2665
+ if (i < columns) w2[i] = Math.max(w2[i], cell(c, row.header, size2).reduce((s, r) => s + measureRun(r, this.fam), 0));
2583
2666
  });
2584
2667
  return w2;
2585
2668
  };
@@ -2623,17 +2706,17 @@ var Builder = class {
2623
2706
  });
2624
2707
  }
2625
2708
  };
2626
- function measureRun(r) {
2709
+ function measureRun(r, fam) {
2627
2710
  let w = 0, prev = "";
2628
2711
  for (const ch of r.text) {
2629
- w += charWidth(ch, r);
2630
- if (prev) w += kern(prev, ch, r);
2712
+ w += charWidth(ch, r, fam);
2713
+ if (prev) w += kern(prev, ch, r, fam);
2631
2714
  prev = ch;
2632
2715
  }
2633
2716
  return w;
2634
2717
  }
2635
2718
  var TAB_INTERVAL = 28;
2636
- function layoutLines(paras, width, height, fontSize) {
2719
+ function layoutLines(paras, width, height, fontSize, fam) {
2637
2720
  const lines = [];
2638
2721
  let baseline = 0;
2639
2722
  let prev = null;
@@ -2667,7 +2750,7 @@ function layoutLines(paras, width, height, fontSize) {
2667
2750
  let seg = 0, prevCh = "";
2668
2751
  for (let q = end + 1; q < chars.length && chars[q].ch !== " " && chars[q].ch !== "\n" && chars[q].ch !== SEP; q++) {
2669
2752
  const rr = runs[chars[q].run];
2670
- seg += charWidth(chars[q].ch, rr) + (prevCh ? kern(prevCh, chars[q].ch, rr) : 0);
2753
+ seg += charWidth(chars[q].ch, rr, fam) + (prevCh ? kern(prevCh, chars[q].ch, rr, fam) : 0);
2671
2754
  prevCh = chars[q].ch;
2672
2755
  }
2673
2756
  tx = Math.max(x, stop.align === "right" ? stop.x - seg : stop.x - seg / 2);
@@ -2678,12 +2761,12 @@ function layoutLines(paras, width, height, fontSize) {
2678
2761
  continue;
2679
2762
  }
2680
2763
  const prevGlyph = glyphs[glyphs.length - 1];
2681
- const kx = prevGlyph && prevGlyph.run === run && prevGlyph.ch !== " " ? kern(prevGlyph.ch, ch, r) : 0;
2764
+ const kx = prevGlyph && prevGlyph.run === run && prevGlyph.ch !== " " ? kern(prevGlyph.ch, ch, r, fam) : 0;
2682
2765
  if (prevGlyph) {
2683
2766
  prevGlyph.w += kx;
2684
2767
  x += kx;
2685
2768
  }
2686
- const w = charWidth(ch, r);
2769
+ const w = charWidth(ch, r, fam);
2687
2770
  if (ch !== " " && x + w > maxX2 + 0.01 && glyphs.some((g) => g.ch !== " ")) {
2688
2771
  if (lastSpace >= 0) {
2689
2772
  glyphs.length = lastSpace + 1;
@@ -2698,17 +2781,17 @@ function layoutLines(paras, width, height, fontSize) {
2698
2781
  }
2699
2782
  if (glyphs.length === 0 && end === k && k < chars.length) {
2700
2783
  const { ch, run } = chars[k];
2701
- glyphs.push({ ch, run, x: start, w: charWidth(ch, runs[run]) });
2784
+ glyphs.push({ ch, run, x: start, w: charWidth(ch, runs[run], fam) });
2702
2785
  end = k + 1;
2703
2786
  }
2704
2787
  let asc = 0, desc = 0, lead = 0;
2705
2788
  for (const g of glyphs) {
2706
- const [a, d, l] = metrics(g.ch, runs[g.run]);
2789
+ const [a, d, l] = metrics(g.ch, runs[g.run], fam);
2707
2790
  asc = Math.max(asc, a);
2708
2791
  desc = Math.max(desc, d);
2709
2792
  lead = Math.max(lead, l);
2710
2793
  }
2711
- 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 });
2794
+ 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);
2712
2795
  baseline = prev ? baseline + Math.round(prev.desc) + Math.round(prev.lead) + (firstLine ? p.spacing : 0) + Math.round(asc) : Math.round(asc);
2713
2796
  if (baseline + desc > height + 0.5) return;
2714
2797
  const line2 = { glyphs, asc, desc, lead, baseline, para: p, first: firstLine };
@@ -2727,9 +2810,10 @@ function layoutLines(paras, width, height, fontSize) {
2727
2810
  function noteMarkup(source, e) {
2728
2811
  const rect2 = textRect({ x: e.x, y: e.y, width: e.width, height: e.height });
2729
2812
  if (!(rect2.width > 1 && rect2.height > 1)) return "";
2730
- const b = new Builder(e.style.fontSize, rect2.width);
2813
+ const fam = familyMetrics(e.style.font);
2814
+ const b = new Builder(e.style.fontSize, rect2.width, fam);
2731
2815
  for (const block of parseBlocks(source)) b.block(block, { indent: 0, marker: null, quote: null, listDepth: 0 });
2732
- const lines = layoutLines(b.paras, rect2.width, rect2.height, e.style.fontSize);
2816
+ const lines = layoutLines(b.paras, rect2.width, rect2.height, e.style.fontSize, fam);
2733
2817
  const ink = color(e.style.stroke);
2734
2818
  let s = "";
2735
2819
  const marks = [];
@@ -2748,8 +2832,8 @@ function noteMarkup(source, e) {
2748
2832
  const r = gs[i].r;
2749
2833
  let j = i;
2750
2834
  let text = "";
2751
- const font = fontOf(gs[i].ch);
2752
- while (j < gs.length && sameStyle(gs[j].r, r) && gs[j].ch !== " " && fontOf(gs[j].ch) === font) {
2835
+ const font = fontOf(gs[i].ch, famOf(r, fam));
2836
+ while (j < gs.length && sameStyle(gs[j].r, r) && gs[j].ch !== " " && fontOf(gs[j].ch, famOf(r, fam)) === font) {
2753
2837
  text += gs[j].ch;
2754
2838
  j++;
2755
2839
  }
@@ -2757,20 +2841,21 @@ function noteMarkup(source, e) {
2757
2841
  if (shown.trim() !== "") {
2758
2842
  let a = `font-size="${fmt(r.size)}"`;
2759
2843
  if (r.mono) a += ` font-family="Menlo, Consolas, monospace"`;
2760
- if (r.bold) a += ` font-weight="bold"`;
2761
- if (r.italic) a += ` font-style="italic"`;
2844
+ const face = r.mono ? "regular" : faceOf(fam, r.bold, r.italic);
2845
+ if (r.mono ? r.bold : face === "bold" || face === "boldItalic") a += ` font-weight="bold"`;
2846
+ if (r.mono ? r.italic : face === "italic" || face === "boldItalic") a += ` font-style="italic"`;
2762
2847
  if (r.underline) a += ` text-decoration="underline"`;
2763
2848
  if (r.alpha < 1) a += ` fill-opacity="${fmt(r.alpha * e.style.stroke.a)}"`;
2764
2849
  spans += `<tspan x="${fmt(rect2.x + gs[i].x)}" ${a}>${escapeXML(shown)}</tspan>`;
2765
2850
  }
2766
2851
  if (r.strike && j > i) {
2767
- const y = l.baseline - metrics(gs[i].ch, r)[0] * 0.32;
2852
+ const y = l.baseline - metrics(gs[i].ch, r, fam)[0] * 0.32;
2768
2853
  marks.push([rect2.x + gs[i].x, rect2.y + y, rect2.x + gs[j - 1].x + gs[j - 1].w, rect2.y + y]);
2769
2854
  }
2770
2855
  if (j === i) j++;
2771
2856
  i = j;
2772
2857
  }
2773
- if (spans) s += `<text y="${fmt(rect2.y + l.baseline)}" font-family="Helvetica Neue, Helvetica, Arial, sans-serif" fill="${ink}" xml:space="preserve">${spans}</text>
2858
+ if (spans) s += `<text y="${fmt(rect2.y + l.baseline)}" font-family="${cssFamily(e.style.font)}" fill="${ink}" xml:space="preserve">${spans}</text>
2774
2859
  `;
2775
2860
  }
2776
2861
  const width = fmt(Math.max(1, e.style.fontSize / 14));
@@ -2780,8 +2865,8 @@ function noteMarkup(source, e) {
2780
2865
  }
2781
2866
  return s;
2782
2867
  }
2783
- function fontOf(ch) {
2784
- return fallbackMetrics[ch] ? `fb:${ch}` : "";
2868
+ function fontOf(ch, fam) {
2869
+ return fam.fallback[ch] ? `fb:${ch}` : "";
2785
2870
  }
2786
2871
  function sameStyle(a, b) {
2787
2872
  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;
@@ -2844,8 +2929,8 @@ function svgOpen(b, background, paint) {
2844
2929
  }
2845
2930
  return out;
2846
2931
  }
2847
- function svgParts(page, background, fixed) {
2848
- if (hasInstances(page)) return svgParts(expandingSymbols(page, 0), background, fixed);
2932
+ function svgParts(page, background, fixed, links = false) {
2933
+ if (hasInstances(page)) return svgParts(expandingSymbols(page, 0), background, fixed, links);
2849
2934
  const theme = themeNamed(page.theme);
2850
2935
  const bg = background ? theme?.background ?? background : null;
2851
2936
  const ink = theme?.ink ?? black;
@@ -2869,20 +2954,25 @@ function svgParts(page, background, fixed) {
2869
2954
  ${body}</g>
2870
2955
  `;
2871
2956
  }
2872
- parts.push({ key: e.id, markup: alpha < 1 ? `<g opacity="${fmt(alpha)}">
2957
+ if (alpha < 1) body = `<g opacity="${fmt(alpha)}">
2873
2958
  ${body}</g>
2874
- ` : body });
2959
+ `;
2960
+ const href = links ? (e.click?.url ? allowedURL(e.click.url) : null) ?? webLink(e.url) : null;
2961
+ if (href) body = `<a href="${escapeXML(href).replace(/"/g, "&quot;")}" target="_blank">
2962
+ ${body}</a>
2963
+ `;
2964
+ parts.push({ key: e.id, markup: body });
2875
2965
  }
2876
2966
  return { bounds: b, parts };
2877
2967
  }
2878
2968
  function svg(page, background = { r: 1, g: 1, b: 1, a: 1 }, fixed) {
2879
- const { bounds: b, parts } = svgParts(page, background, fixed);
2969
+ const { bounds: b, parts } = svgParts(page, background, fixed, true);
2880
2970
  return svgOpen(b, themeNamed(page.theme)?.background ?? background, background !== null) + parts.map((p) => p.markup).join("") + "</svg>\n";
2881
2971
  }
2882
2972
  function labelRect(e, index) {
2883
2973
  const m = midpoint(e, index);
2884
2974
  const text = e.text ?? "";
2885
- const size = textSize(text === "" ? "Label" : text, e.style.fontSize, 200);
2975
+ const size = textSize(text === "" ? "Label" : text, e.style.fontSize, 200, e.style.font);
2886
2976
  const w = Math.max(size.width + 12, 44), h = size.height + 6;
2887
2977
  return { x: m.x - w / 2, y: m.y - h / 2, width: w, height: h };
2888
2978
  }
@@ -2996,7 +3086,7 @@ function textElement(text, f, e, centered) {
2996
3086
  const total = lineHeight * lines.length;
2997
3087
  const x = centered ? midX(f) : f.x;
2998
3088
  const top = centered ? midY(f) - total / 2 : f.y;
2999
- let s = `<text x="${fmt(x)}" font-family="Helvetica Neue, Helvetica, Arial, sans-serif" font-size="${fmt(size)}" fill="${color(e.style.stroke)}"${centered ? ` text-anchor="middle"` : ""}>`;
3089
+ 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"` : ""}>`;
3000
3090
  lines.forEach((line2, i) => {
3001
3091
  s += `<tspan x="${fmt(x)}" y="${fmt(top + lineHeight * (i + 0.8))}">${escapeXML(line2)}</tspan>`;
3002
3092
  });
@@ -3063,6 +3153,7 @@ var Playback = class {
3063
3153
  __publicField(this, "frame", -1);
3064
3154
  __publicField(this, "onFrame", null);
3065
3155
  this.page = options.clean ? withRoughness(page, 0) : page;
3156
+ addFonts(usedFonts(this.page));
3066
3157
  this.plan = plan(this.page);
3067
3158
  this.clicks = clickTargets(page, options.file);
3068
3159
  const table = symbolTable(this.page);
@@ -3224,16 +3315,16 @@ var Playback = class {
3224
3315
  const s = keys.map((k) => m2.get(k) ?? "").join("");
3225
3316
  return s === "" ? null : s;
3226
3317
  };
3227
- const base = join(normal) ?? "";
3318
+ const base2 = join(normal) ?? "";
3228
3319
  const instance = pose.elements.find((e) => e.id === o && e.kind === "symbol");
3229
3320
  const overLook = instance ? join(over) : join(hover);
3230
3321
  const downLook = instance ? join(down) : null;
3231
- const shownOver = overLook !== null && overLook !== base ? overLook : null;
3232
- const shownDown = downLook !== null && downLook !== (overLook ?? base) ? downLook : null;
3233
- if (!instance && shownOver === null) return { key: o, markup: base, button: false };
3322
+ const shownOver = overLook !== null && overLook !== base2 ? overLook : null;
3323
+ const shownDown = downLook !== null && downLook !== (overLook ?? base2) ? downLook : null;
3324
+ if (!instance && shownOver === null) return { key: o, markup: base2, button: false };
3234
3325
  const still2 = instance ? ` pointer-events="none"` : "";
3235
3326
  let m = `<g class="dottie-n"${still2}>
3236
- ${base}</g>
3327
+ ${base2}</g>
3237
3328
  `;
3238
3329
  if (shownOver !== null) m += `<g class="dottie-h"${still2}>
3239
3330
  ${shownOver}</g>
@@ -3687,13 +3778,14 @@ function render(source, options = {}) {
3687
3778
  function isFile(v) {
3688
3779
  return typeof v === "object" && v !== null && Array.isArray(v.pages) && Array.isArray(v.warnings);
3689
3780
  }
3690
- var VERSION = "0.6.0";
3781
+ var VERSION = "0.6.2";
3691
3782
 
3692
3783
  // src/player-entry.ts
3693
3784
  definePlayer();
3694
3785
  globalThis.Dottie ?? (globalThis.Dottie = index_exports);
3695
3786
  export {
3696
3787
  BOIL_DRAWINGS,
3788
+ BUNDLED_FONTS,
3697
3789
  DottieFormatError,
3698
3790
  DottiePlayer,
3699
3791
  KINDS,
@@ -3703,6 +3795,7 @@ export {
3703
3795
  Playback,
3704
3796
  SUPPORTED_VERSION,
3705
3797
  VERSION,
3798
+ addFonts,
3706
3799
  allowedURL,
3707
3800
  black,
3708
3801
  bounds,
@@ -3714,6 +3807,8 @@ export {
3714
3807
  cloneElement,
3715
3808
  definePlayer,
3716
3809
  elementIndex,
3810
+ fontFaces,
3811
+ fontFile,
3717
3812
  frameTimes,
3718
3813
  inkOnDark,
3719
3814
  inspect,
@@ -3732,6 +3827,7 @@ export {
3732
3827
  sameColor,
3733
3828
  sampleTimes,
3734
3829
  sceneAt,
3830
+ setFontBase,
3735
3831
  stableSortBy,
3736
3832
  still,
3737
3833
  svg,
@@ -3739,5 +3835,7 @@ export {
3739
3835
  themeNamed,
3740
3836
  themes,
3741
3837
  transientElements,
3838
+ usedFonts,
3839
+ webLink,
3742
3840
  withRoughness
3743
3841
  };