@weft-js/text 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/LICENSE +38 -0
  2. package/README.md +103 -2
  3. package/dist/LICENSE +38 -0
  4. package/dist/LICENSE-pretext +229 -0
  5. package/dist/blink/chunk-2UTDV3NY.js +1 -0
  6. package/dist/blink/chunk-AVLP4LK4.js +1 -0
  7. package/dist/blink/chunk-LBFXENHK.js +1 -0
  8. package/dist/blink/chunk-LCLBVK2G.js +1 -0
  9. package/dist/blink/chunk-M5EVTPT6.js +1 -0
  10. package/dist/blink/engine.js +1 -0
  11. package/dist/blink/exact-SQQRYG6J.js +1 -0
  12. package/dist/blink/meta.json +1 -0
  13. package/dist/blink/pack-complex-TZ3EEWXH.js +1 -0
  14. package/dist/blink/pack-families-E2YTVA25.js +0 -0
  15. package/dist/blink/pack-rare-3377IVPF.js +0 -0
  16. package/dist/blink/pack-scripts-6AZOGP44.js +1 -0
  17. package/dist/blink/pack-spacing-ZXHYQEXD.js +1 -0
  18. package/dist/gecko/chunk-SWBCNRDA.js +1 -0
  19. package/dist/gecko/chunk-VN7PBWFN.js +1 -0
  20. package/dist/gecko/chunk-XRF67SWC.js +1 -0
  21. package/dist/gecko/engine.js +1 -0
  22. package/dist/gecko/meta.json +1 -0
  23. package/dist/gecko/pack-complex-ZRH5NAPR.js +1 -0
  24. package/dist/gecko/pack-families-34KO3CLI.js +0 -0
  25. package/dist/gecko/pack-rare-FDYU357Z.js +0 -0
  26. package/dist/gecko/pack-scripts-JJOHXLOT.js +1 -0
  27. package/dist/gecko/pack-spacing-CAG6CLVB.js +1 -0
  28. package/dist/index.js +1 -0
  29. package/dist/webkit/chunk-A4DB6TWP.js +1 -0
  30. package/dist/webkit/chunk-B3WIVP7S.js +1 -0
  31. package/dist/webkit/chunk-FEELTLSH.js +1 -0
  32. package/dist/webkit/chunk-JQWGQSV3.js +1 -0
  33. package/dist/webkit/chunk-M5EVTPT6.js +1 -0
  34. package/dist/webkit/chunk-SCKMN2PN.js +1 -0
  35. package/dist/webkit/engine.js +1 -0
  36. package/dist/webkit/exact-NKXB5V2W.js +1 -0
  37. package/dist/webkit/meta.json +1 -0
  38. package/dist/webkit/pack-complex-ZCMCV5WM.js +1 -0
  39. package/dist/webkit/pack-families-KIE64YFZ.js +1 -0
  40. package/dist/webkit/pack-rare-SSJ2B7KP.js +0 -0
  41. package/dist/webkit/pack-scripts-WIXSLWBC.js +1 -0
  42. package/dist/webkit/pack-spacing-UGCQZTVO.js +1 -0
  43. package/package.json +51 -4
  44. package/plugin/build.mjs +225 -0
  45. package/plugin/index.d.ts +40 -0
  46. package/plugin/index.mjs +79 -0
  47. package/plugin/measure.mjs +20 -0
  48. package/vendor/pretext/LICENSE +229 -0
@@ -0,0 +1 @@
1
+ {"inputs":{"src/alphabet.json":{"bytes":237,"imports":[]},"src/alphabet.ts":{"bytes":1771,"imports":[{"path":"src/alphabet.json","kind":"import-statement","original":"./alphabet.json"}],"format":"esm"},"gen/webkit/packs.ts":{"bytes":366,"imports":[{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"gen/webkit/generated/engine-break-data.ts":{"bytes":10399,"imports":[],"format":"esm"},"gen/webkit/line-breaks.ts":{"bytes":38236,"imports":[{"path":"gen/webkit/packs.ts","kind":"import-statement","original":"./packs.js"},{"path":"gen/webkit/generated/engine-break-data.ts","kind":"import-statement","original":"./generated/engine-break-data.js"}],"format":"esm"},"src/lite.ts":{"bytes":13717,"imports":[{"path":"gen/webkit/line-breaks.ts","kind":"import-statement","original":"@engine/line-breaks.js"},{"path":"gen/webkit/packs.ts","kind":"import-statement","original":"@engine/packs.js"}],"format":"esm"},"gen/webkit/graphemes.ts":{"bytes":4921,"imports":[{"path":"gen/webkit/line-breaks.ts","kind":"import-statement","original":"./line-breaks.js"}],"format":"esm"},"gen/webkit/gecko-line-breaks.ts":{"bytes":33967,"imports":[{"path":"gen/webkit/generated/engine-break-data.ts","kind":"import-statement","original":"./generated/engine-break-data.js"},{"path":"gen/webkit/graphemes.ts","kind":"import-statement","original":"./graphemes.js"},{"path":"gen/webkit/line-breaks.ts","kind":"import-statement","original":"./line-breaks.js"}],"format":"esm"},"gen/webkit/analysis.ts":{"bytes":37076,"imports":[{"path":"gen/webkit/packs.ts","kind":"import-statement","original":"./packs.js"},{"path":"gen/webkit/gecko-line-breaks.ts","kind":"import-statement","original":"./gecko-line-breaks.js"},{"path":"gen/webkit/graphemes.ts","kind":"import-statement","original":"./graphemes.js"},{"path":"gen/webkit/line-breaks.ts","kind":"import-statement","original":"./line-breaks.js"}],"format":"esm"},"gen/webkit/measurement.ts":{"bytes":84167,"imports":[{"path":"gen/webkit/packs.ts","kind":"import-statement","original":"./packs.js"},{"path":"gen/webkit/graphemes.ts","kind":"import-statement","original":"./graphemes.js"},{"path":"gen/webkit/line-breaks.ts","kind":"import-statement","original":"./line-breaks.js"},{"path":"./generated/webkit-generic-families.js","kind":"import-statement","external":true}],"format":"esm"},"gen/webkit/han-kerning.ts":{"bytes":13356,"imports":[{"path":"gen/webkit/analysis.ts","kind":"import-statement","original":"./analysis.js"},{"path":"gen/webkit/line-breaks.ts","kind":"import-statement","original":"./line-breaks.js"},{"path":"gen/webkit/measurement.ts","kind":"import-statement","original":"./measurement.js"}],"format":"esm"},"gen/webkit/prepare.ts":{"bytes":40798,"imports":[{"path":"gen/webkit/packs.ts","kind":"import-statement","original":"./packs.js"},{"path":"gen/webkit/han-kerning.ts","kind":"import-statement","original":"./han-kerning.js"},{"path":"gen/webkit/graphemes.ts","kind":"import-statement","original":"./graphemes.js"},{"path":"gen/webkit/generated/engine-break-data.ts","kind":"import-statement","original":"./generated/engine-break-data.js"},{"path":"gen/webkit/line-breaks.ts","kind":"import-statement","original":"./line-breaks.js"},{"path":"gen/webkit/analysis.ts","kind":"import-statement","original":"./analysis.js"},{"path":"gen/webkit/measurement.ts","kind":"import-statement","original":"./measurement.js"}],"format":"esm"},"gen/webkit/line-break.ts":{"bytes":25561,"imports":[{"path":"gen/webkit/packs.ts","kind":"import-statement","original":"./packs.js"},{"path":"gen/webkit/analysis.ts","kind":"import-statement","original":"./analysis.js"},{"path":"./measurement.js","kind":"import-statement","external":true}],"format":"esm"},"gen/webkit/line-text.ts":{"bytes":3753,"imports":[{"path":"gen/webkit/graphemes.ts","kind":"import-statement","original":"./graphemes.js"},{"path":"gen/webkit/analysis.ts","kind":"import-statement","original":"./analysis.js"},{"path":"gen/webkit/line-break.ts","kind":"import-statement","original":"./line-break.js"},{"path":"./measurement.js","kind":"import-statement","external":true}],"format":"esm"},"gen/webkit/layout.ts":{"bytes":14402,"imports":[{"path":"gen/webkit/line-breaks.ts","kind":"import-statement","original":"./line-breaks.js"},{"path":"gen/webkit/analysis.ts","kind":"import-statement","original":"./analysis.js"},{"path":"gen/webkit/measurement.ts","kind":"import-statement","original":"./measurement.js"},{"path":"gen/webkit/prepare.ts","kind":"import-statement","original":"./prepare.js"},{"path":"gen/webkit/line-break.ts","kind":"import-statement","original":"./line-break.js"},{"path":"gen/webkit/line-text.ts","kind":"import-statement","original":"./line-text.js"}],"format":"esm"},"gen/webkit/line-break.complex.ts":{"bytes":36572,"imports":[{"path":"gen/webkit/analysis.ts","kind":"import-statement","original":"./analysis.js"},{"path":"gen/webkit/measurement.ts","kind":"import-statement","original":"./measurement.js"},{"path":"gen/webkit/line-break.ts","kind":"import-statement","original":"./line-break.js"}],"format":"esm"},"gen/webkit/pack-complex.ts":{"bytes":160,"imports":[{"path":"gen/webkit/packs.ts","kind":"import-statement","original":"./packs.js"},{"path":"gen/webkit/line-break.complex.ts","kind":"import-statement","original":"./line-break.complex.js"}],"format":"esm"},"gen/webkit/line-breaks.scripts.ts":{"bytes":2555,"imports":[{"path":"./generated/engine-break-data.js","kind":"import-statement","external":true},{"path":"gen/webkit/line-breaks.ts","kind":"import-statement","original":"./line-breaks.js"}],"format":"esm"},"gen/webkit/measurement.scripts.ts":{"bytes":6021,"imports":[{"path":"./graphemes.js","kind":"import-statement","external":true},{"path":"./line-breaks.js","kind":"import-statement","external":true},{"path":"./generated/webkit-generic-families.js","kind":"import-statement","external":true},{"path":"gen/webkit/measurement.ts","kind":"import-statement","original":"./measurement.js"}],"format":"esm"},"gen/webkit/prepare.scripts.ts":{"bytes":4284,"imports":[{"path":"./han-kerning.js","kind":"import-statement","external":true},{"path":"./graphemes.js","kind":"import-statement","external":true},{"path":"./generated/engine-break-data.js","kind":"import-statement","external":true},{"path":"./line-breaks.js","kind":"import-statement","external":true},{"path":"gen/webkit/analysis.ts","kind":"import-statement","original":"./analysis.js"},{"path":"gen/webkit/measurement.ts","kind":"import-statement","original":"./measurement.js"},{"path":"./prepare.js","kind":"import-statement","external":true}],"format":"esm"},"gen/webkit/generated/engine-break-data.full.ts":{"bytes":23705,"imports":[],"format":"esm"},"gen/webkit/pack-scripts.ts":{"bytes":782,"imports":[{"path":"gen/webkit/packs.ts","kind":"import-statement","original":"./packs.js"},{"path":"gen/webkit/line-breaks.scripts.ts","kind":"import-statement","original":"./line-breaks.scripts.js"},{"path":"gen/webkit/measurement.scripts.ts","kind":"import-statement","original":"./measurement.scripts.js"},{"path":"gen/webkit/prepare.scripts.ts","kind":"import-statement","original":"./prepare.scripts.js"},{"path":"gen/webkit/generated/engine-break-data.full.ts","kind":"import-statement","original":"./generated/engine-break-data.full.js"},{"path":"gen/webkit/generated/engine-break-data.ts","kind":"import-statement","original":"./generated/engine-break-data.js"},{"path":"gen/webkit/line-breaks.ts","kind":"import-statement","original":"./line-breaks.js"},{"path":"gen/webkit/graphemes.ts","kind":"import-statement","original":"./graphemes.js"},{"path":"gen/webkit/prepare.ts","kind":"import-statement","original":"./prepare.js"},{"path":"gen/webkit/gecko-line-breaks.ts","kind":"import-statement","original":"./gecko-line-breaks.js"}],"format":"esm"},"gen/webkit/line-break.spacing.ts":{"bytes":2650,"imports":[{"path":"gen/webkit/analysis.ts","kind":"import-statement","original":"./analysis.js"},{"path":"./measurement.js","kind":"import-statement","external":true},{"path":"gen/webkit/line-break.ts","kind":"import-statement","original":"./line-break.js"}],"format":"esm"},"gen/webkit/measurement.spacing.ts":{"bytes":3311,"imports":[{"path":"gen/webkit/graphemes.ts","kind":"import-statement","original":"./graphemes.js"},{"path":"./line-breaks.js","kind":"import-statement","external":true},{"path":"./generated/webkit-generic-families.js","kind":"import-statement","external":true},{"path":"gen/webkit/measurement.ts","kind":"import-statement","original":"./measurement.js"}],"format":"esm"},"gen/webkit/prepare.spacing.ts":{"bytes":2757,"imports":[{"path":"./han-kerning.js","kind":"import-statement","external":true},{"path":"gen/webkit/graphemes.ts","kind":"import-statement","original":"./graphemes.js"},{"path":"./generated/engine-break-data.js","kind":"import-statement","external":true},{"path":"./line-breaks.js","kind":"import-statement","external":true},{"path":"./analysis.js","kind":"import-statement","external":true},{"path":"./measurement.js","kind":"import-statement","external":true},{"path":"gen/webkit/prepare.ts","kind":"import-statement","original":"./prepare.js"}],"format":"esm"},"gen/webkit/pack-spacing.ts":{"bytes":258,"imports":[{"path":"gen/webkit/packs.ts","kind":"import-statement","original":"./packs.js"},{"path":"gen/webkit/line-break.spacing.ts","kind":"import-statement","original":"./line-break.spacing.js"},{"path":"gen/webkit/measurement.spacing.ts","kind":"import-statement","original":"./measurement.spacing.js"},{"path":"gen/webkit/prepare.spacing.ts","kind":"import-statement","original":"./prepare.spacing.js"}],"format":"esm"},"gen/webkit/generated/webkit-generic-families.ts":{"bytes":5190,"imports":[],"format":"esm"},"gen/webkit/measurement.families.ts":{"bytes":3615,"imports":[{"path":"./graphemes.js","kind":"import-statement","external":true},{"path":"./line-breaks.js","kind":"import-statement","external":true},{"path":"gen/webkit/generated/webkit-generic-families.ts","kind":"import-statement","original":"./generated/webkit-generic-families.js"},{"path":"./measurement.js","kind":"import-statement","external":true}],"format":"esm"},"gen/webkit/pack-families.ts":{"bytes":163,"imports":[{"path":"gen/webkit/packs.ts","kind":"import-statement","original":"./packs.js"},{"path":"gen/webkit/measurement.families.ts","kind":"import-statement","original":"./measurement.families.js"}],"format":"esm"},"gen/webkit/pack-rare.ts":{"bytes":57,"imports":[],"format":"esm"},"src/exact.ts":{"bytes":5060,"imports":[{"path":"gen/webkit/layout.ts","kind":"import-statement","original":"@engine/layout.js"},{"path":"gen/webkit/packs.ts","kind":"import-statement","original":"@engine/packs.js"},{"path":"src/alphabet.ts","kind":"import-statement","original":"./alphabet.js"},{"path":"gen/webkit/pack-complex.ts","kind":"dynamic-import","original":"@engine/pack-complex.js"},{"path":"gen/webkit/pack-scripts.ts","kind":"dynamic-import","original":"@engine/pack-scripts.js"},{"path":"gen/webkit/pack-spacing.ts","kind":"dynamic-import","original":"@engine/pack-spacing.js"},{"path":"gen/webkit/pack-families.ts","kind":"dynamic-import","original":"@engine/pack-families.js"},{"path":"gen/webkit/pack-rare.ts","kind":"dynamic-import","original":"@engine/pack-rare.js"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/engine.ts":{"bytes":5213,"imports":[{"path":"src/alphabet.ts","kind":"import-statement","original":"./alphabet.js"},{"path":"src/lite.ts","kind":"import-statement","original":"./lite.js"},{"path":"src/exact.ts","kind":"dynamic-import","original":"./exact.js"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"}},"outputs":{"dist/webkit/engine.js":{"imports":[{"path":"dist/webkit/chunk-M5EVTPT6.js","kind":"import-statement"},{"path":"dist/webkit/chunk-JQWGQSV3.js","kind":"import-statement"},{"path":"dist/webkit/chunk-FEELTLSH.js","kind":"import-statement"},{"path":"dist/webkit/exact-NKXB5V2W.js","kind":"dynamic-import"}],"exports":["engine"],"entryPoint":"src/engine.ts","inputs":{"src/lite.ts":{"bytesInOutput":3083},"src/engine.ts":{"bytesInOutput":2164}},"bytes":5396},"dist/webkit/pack-complex-ZCMCV5WM.js":{"imports":[{"path":"dist/webkit/chunk-SCKMN2PN.js","kind":"import-statement"},{"path":"dist/webkit/chunk-A4DB6TWP.js","kind":"import-statement"},{"path":"dist/webkit/chunk-JQWGQSV3.js","kind":"import-statement"},{"path":"dist/webkit/chunk-FEELTLSH.js","kind":"import-statement"}],"exports":[],"entryPoint":"gen/webkit/pack-complex.ts","inputs":{"gen/webkit/line-break.complex.ts":{"bytesInOutput":4992},"gen/webkit/pack-complex.ts":{"bytesInOutput":21}},"bytes":5320},"dist/webkit/pack-scripts-WIXSLWBC.js":{"imports":[{"path":"dist/webkit/chunk-B3WIVP7S.js","kind":"import-statement"},{"path":"dist/webkit/chunk-A4DB6TWP.js","kind":"import-statement"},{"path":"dist/webkit/chunk-JQWGQSV3.js","kind":"import-statement"},{"path":"dist/webkit/chunk-FEELTLSH.js","kind":"import-statement"}],"exports":[],"entryPoint":"gen/webkit/pack-scripts.ts","inputs":{"gen/webkit/line-breaks.scripts.ts":{"bytesInOutput":381},"gen/webkit/measurement.scripts.ts":{"bytesInOutput":1942},"gen/webkit/prepare.scripts.ts":{"bytesInOutput":818},"gen/webkit/generated/engine-break-data.full.ts":{"bytesInOutput":23193},"gen/webkit/pack-scripts.ts":{"bytesInOutput":44}},"bytes":26658},"dist/webkit/pack-spacing-UGCQZTVO.js":{"imports":[{"path":"dist/webkit/chunk-SCKMN2PN.js","kind":"import-statement"},{"path":"dist/webkit/chunk-B3WIVP7S.js","kind":"import-statement"},{"path":"dist/webkit/chunk-A4DB6TWP.js","kind":"import-statement"},{"path":"dist/webkit/chunk-JQWGQSV3.js","kind":"import-statement"},{"path":"dist/webkit/chunk-FEELTLSH.js","kind":"import-statement"}],"exports":[],"entryPoint":"gen/webkit/pack-spacing.ts","inputs":{"gen/webkit/line-break.spacing.ts":{"bytesInOutput":400},"gen/webkit/measurement.spacing.ts":{"bytesInOutput":558},"gen/webkit/prepare.spacing.ts":{"bytesInOutput":249},"gen/webkit/pack-spacing.ts":{"bytesInOutput":23}},"bytes":1524},"dist/webkit/pack-families-KIE64YFZ.js":{"imports":[{"path":"dist/webkit/chunk-FEELTLSH.js","kind":"import-statement"}],"exports":[],"entryPoint":"gen/webkit/pack-families.ts","inputs":{"gen/webkit/measurement.families.ts":{"bytesInOutput":913},"gen/webkit/generated/webkit-generic-families.ts":{"bytesInOutput":3389},"gen/webkit/pack-families.ts":{"bytesInOutput":19}},"bytes":4369},"dist/webkit/pack-rare-SSJ2B7KP.js":{"imports":[],"exports":[],"entryPoint":"gen/webkit/pack-rare.ts","inputs":{"gen/webkit/pack-rare.ts":{"bytesInOutput":0}},"bytes":0},"dist/webkit/exact-NKXB5V2W.js":{"imports":[{"path":"dist/webkit/chunk-M5EVTPT6.js","kind":"import-statement"},{"path":"dist/webkit/chunk-SCKMN2PN.js","kind":"import-statement"},{"path":"dist/webkit/chunk-B3WIVP7S.js","kind":"import-statement"},{"path":"dist/webkit/chunk-A4DB6TWP.js","kind":"import-statement"},{"path":"dist/webkit/chunk-JQWGQSV3.js","kind":"import-statement"},{"path":"dist/webkit/chunk-FEELTLSH.js","kind":"import-statement"},{"path":"dist/webkit/pack-complex-ZCMCV5WM.js","kind":"dynamic-import"},{"path":"dist/webkit/pack-scripts-WIXSLWBC.js","kind":"dynamic-import"},{"path":"dist/webkit/pack-spacing-UGCQZTVO.js","kind":"dynamic-import"},{"path":"dist/webkit/pack-families-KIE64YFZ.js","kind":"dynamic-import"},{"path":"dist/webkit/pack-rare-SSJ2B7KP.js","kind":"dynamic-import"}],"exports":["exact"],"entryPoint":"src/exact.ts","inputs":{"gen/webkit/line-text.ts":{"bytesInOutput":663},"gen/webkit/layout.ts":{"bytesInOutput":893},"src/exact.ts":{"bytesInOutput":1987}},"bytes":3911},"dist/webkit/chunk-M5EVTPT6.js":{"imports":[],"exports":["a"],"inputs":{"src/alphabet.json":{"bytesInOutput":243},"src/alphabet.ts":{"bytesInOutput":447}},"bytes":706},"dist/webkit/chunk-SCKMN2PN.js":{"imports":[{"path":"dist/webkit/chunk-A4DB6TWP.js","kind":"import-statement"},{"path":"dist/webkit/chunk-FEELTLSH.js","kind":"import-statement"}],"exports":["a","b","c","d","e","f","g","h","i","j"],"inputs":{"gen/webkit/line-break.ts":{"bytesInOutput":3489}},"bytes":3711},"dist/webkit/chunk-B3WIVP7S.js":{"imports":[{"path":"dist/webkit/chunk-A4DB6TWP.js","kind":"import-statement"},{"path":"dist/webkit/chunk-JQWGQSV3.js","kind":"import-statement"},{"path":"dist/webkit/chunk-FEELTLSH.js","kind":"import-statement"}],"exports":["a","b","c","d","e","f"],"inputs":{"gen/webkit/prepare.ts":{"bytesInOutput":5485}},"bytes":5921},"dist/webkit/chunk-A4DB6TWP.js":{"imports":[{"path":"dist/webkit/chunk-JQWGQSV3.js","kind":"import-statement"},{"path":"dist/webkit/chunk-FEELTLSH.js","kind":"import-statement"}],"exports":["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"],"inputs":{"gen/webkit/graphemes.ts":{"bytesInOutput":890},"gen/webkit/gecko-line-breaks.ts":{"bytesInOutput":1003},"gen/webkit/analysis.ts":{"bytesInOutput":3980},"gen/webkit/measurement.ts":{"bytesInOutput":7765}},"bytes":14221},"dist/webkit/chunk-JQWGQSV3.js":{"imports":[{"path":"dist/webkit/chunk-FEELTLSH.js","kind":"import-statement"}],"exports":["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x"],"inputs":{"gen/webkit/generated/engine-break-data.ts":{"bytesInOutput":8513},"gen/webkit/line-breaks.ts":{"bytesInOutput":7980}},"bytes":16741},"dist/webkit/chunk-FEELTLSH.js":{"imports":[],"exports":["a","b","c","d","e"],"inputs":{"gen/webkit/packs.ts":{"bytesInOutput":162}},"bytes":432}}}
@@ -0,0 +1 @@
1
+ import{a as e,b as l,d as n,e as t,f as i,h as a}from"./chunk-SCKMN2PN.js";import{M as r,d as s,e as u,f as o,g as f,h as d,i as m,j as h,k as c,l as p,m as b,n as g,o as x,p as k,q as v}from"./chunk-A4DB6TWP.js";import"./chunk-JQWGQSV3.js";import{a as y,c as M}from"./chunk-FEELTLSH.js";var E={};function j(e,l,n,t){let i=n+1;for(;i<l&&1<<(e[i]&g)&t;)i++;return i===l||(e[i]&g)!==m}function I(e,l,n,t,i,a){let{discretionaryHyphenContexts:r,segmentFlags:s}=e,u=n-1;if(u<l||(s[u]&g)!==f||t<=i)return!1;let o=t-i,d=0,m=a?u:u-1;if(null!==r)for(let e=l;e<=m;e++)d+=r[e];return d<o}function S(y,M,E,S,L,H=!1){let{widths:W,segmentFlags:A,breakableFitAdvances:C,discretionaryHyphenWidth:F,letterSpacing:T,lineStartExtras:O,lineEndTrims:w,overflowLineEndTrims:P,tabStopAdvance:N,minimumTabAdvance:Q}=y,R=W.length,q=y.items,B=void 0===q?null:q.hyphenWidths,D=void 0===q?null:q.hyphenRooms,G=void 0===q?null:q.itemEndHalts,J=void 0===q?null:q.insideExtras,K=void 0===q?null:q.fillExtras,U=void 0===q?null:q.openingEdges,V=void 0===q?null:q.emptyObjectSpaces,z=void 0===q?null:q.emptyObjectReturns,X=(r(),1<<d|1<<m),Y=void 0!==q&&!1,Z=!1,$=Math.max(0,E),_=$+.015625,ee=null!==y.discretionaryHyphenContexts,le=ee&&!0,ne=null;for(;;){let r=M.segmentIndex,E=M.graphemeIndex,te=0,ie=!1,ae=r,re=E,se=-1,ue=0,oe=-1,fe=0,de=-1,me=0,he=!1,ce=0,pe=0,be=!0,ge=!1,xe=-1,ke=0,ve=0,ye=!1,Me=null;if((A[r]&g)===p)M.segmentIndex=r+1,M.graphemeIndex=0,Me=null===O?0:O[r];else{e:{let i;for(let a=r;;a++){if(a>=R){i=R;break}let M,I=0,S=A[a],L=S&g;if(L===p){i=a+1;break}let H=0!==(S&x),ne=!!(1<<L&e),Me=a===r?E:0,Ee=0===T||!ie||be||ge?0:T,je=0;0!==T&&(H||L===c||L===m||L===b||null!==U&&0!==U[a])&&(je=Ee,ge=!H),L!==o&&L!==h&&(be=!1);let Ie=L!==m?W[a]:void 0===q?n(te+je,N,Q,Z):t(y,q,a,ie?te+je:null===O?0:O[a],Z),Se=je+Ie,Le=null===w?0:w[a];if(L===f&&0===Me){if(ie){let e=F,l=!0;void 0!==q&&(ee&&a>r&&(A[a-1]&g)===b&&(oe=a,fe=te),Y&&de===a&&(de=a+1,me=Math.max(me,Math.min(te,$))),null!==B&&(e=B[a]),l=a+1===R||(A[a+1]&g)!==b||null!==U&&0!==U[a+1]),ae=a+1,re=0,a+1<R&&(A[a+1]&g)!==p&&(se=a+1,ue=te+e,ee&&((l?ue:te)<=_||le&&oe<0)&&(oe=se,fe=ue))}continue}let He=0;if(0===T||H||ne||L===c){if(ne?L===m:0!==Ie||L===c){let e=Ie+(H?T:0);0!==e&&(He=je+e)}}else He=Ee+Ie;let We=!!(1<<L&X);if(Y&&L===o&&de===a&&(We=!0),We&&(de!==a&&(me=te-pe+je,he=!1,void 0!==q&&a>r&&(A[a-1]&g)===b&&(he=j(A,R,a,X),he||(se=a,ue=te-pe)),ce=0),de=a+1,null!==U&&(me+=U[a],ce+=U[a])),ie){let e=We?me-ce:te+He,n=e-Le>_;if(void 0!==q){let l=!1;if(null!==V&&L===b&&0===Ie&&e>_){let e=de===a?me:te,n=V[a];l=e<=_||!(n>=0&&e-n>_||1===z[a])}n=(n||He<0&&te-pe>_)&&!(We&&he)&&!l,Y&&!n&&de===a&&L===b&&0===Ie&&(de=a+1,me=Math.max(me,Math.min(te+Se,$)))}if(!n){0!==(S&v)&&!ne&&se!==a&&(se=a,ue=te),ee&&!ne&&0===(S&k)&&a>r&&!l(A[a-1]&g)&&(oe=a,fe=te),ae=a+1,re=0,null!==G&&e>_&&0!==G[a]?(te+=Se-Le,pe=0):(te+=Se,0!==He&&!We&&(pe=e>_&&L!==b?Le:0)),ne&&(a+1===R||0===(A[a+1]&k))&&(se=a+1,ue=We?me:L===m?te:te-Se-pe),ee&&ne&&ue+(null===D||se<0?0:D[se])<=_&&(oe=se,fe=ue);continue}{let l=te-pe;if(ne&&(We||L!==m)&&(l<=_||se<0&&(L===u||L===o)||L===o&&(A[a-1]&g)===b)){ve=We?me:l,te+=Se,xe=a+1,ke=0;break e}if(L===m&&!We&&se<0){xe=a,ke=0,ve=de===a&&a>r?me:l;break e}let n=0!==(S&k);if(L===b&&n&&de===a&&me-ce+Ie-Le<=_){de=a+1,me+=Ie,ce+=Ie,te+=Se,ae=a+1,re=0;continue}if(n&&se>=0&&(ae=se,re=0),!n||se>=0){ye=!0;break e}if(null!==P&&e-P[a]<=_){te+=Se,ae=a+1,re=0,pe=P[a],null!==G&&0!==G[a]&&(te-=pe,pe=0);continue}if(L===b&&a+1<R&&(A[a+1]&g)===p){let e=A[a-1],l=e&g,n=l===d?C[a-1]:null;if(null!==n){let e=n.length,l=n[0],t=te<=_?1:l>0?Math.min(e,Math.ceil((te-_)/l)):e;if(a-1>(null!==U&&0!==U[r]?r+1:r)||e-t>E){xe=a-1,ke=e-t,ve=me;break e}}let t=l===s||l===c?C[a-1]:null,i=0!==(e&x)?T:0;if(null!==t&&(a-1>r||t.length-1>E)){xe=a-1,ke=t.length-1,ve=te-t[ke]-i;break e}if(null===t&&(l===s||l===c)&&a-1>r){xe=a-1,ke=0,ve=te-W[a-1]-i;break e}if(null!==n||l!==d&&l!==m){te+=Se,ae=a+1,re=0,pe=0;continue}}if(null===C[a]){ye=!0;break e}M=0,I=je}}else if(Me>0)M=Me;else{let e=null===O?0:O[a],l=null!==P&&He+e-P[a]<=_?P[a]:Le;if(!(He+e-l>_&&null!==C[a])||We){ie=!0,ae=a+1,re=0,te=Ie+e,We&&(me+=e),pe=He+e>_&&L!==b?l:0,null!==G&&0!==pe&&0!==G[a]&&(te-=pe,pe=0),ne&&(a+1===R||0===(A[a+1]&k))&&(se=a+1,ue=We?me:L===m?te:te-Se),ee&&ne&&ue+(null===D||se<0?0:D[se])<=_&&(oe=se,fe=ue);continue}M=0}let Ae=C[a],Ce=Ae.length;for(let e=M;e<Ce;e++){let l=Ae[e];if(ie){let n=te+(l+(e>M?T:I));if(n+T>_)break e;te=n,ae=a,re=e+1}else{ie=!0,ae=a,re=e+1;let n=y.breakableLineStartExtras?.[a]??null;te=null===n?l:l+n[e],(e>0?null!==J:null!==K)&&(te+=e>0?J[a]:K[a])}}ie&&ae===a&&re===Ce&&(ae=a+1,re=0)}xe=i,ke=0,se===i&&0===re?(ve=ue,ye=!0):ve=te-pe}if(ie){ye&&oe>=0&&se===ae&&0===re&&I(y,r,ae,ue,_,!1)?(xe=oe,ke=0,ve=fe):xe<0&&(xe=ae,ke=re,ve=se===ae&&0===re?ue:void 0!==q&&de===ae&&0===re?me:te-pe),M.segmentIndex=xe,M.graphemeIndex=ke;let e=0===ke&&de>=0&&(xe===de||xe===de+1)&&(de===R||(A[de]&g)===p),l=(e?te-pe:ve)+i(y,U,X,r,E,xe,ke);Me=e?Math.max(me,Math.min(l,$)):l}}if(null===Me||(ne=Me,null!==L&&(L.lineCount++,Me>L.maxLineWidth&&(L.maxLineWidth=Me)),S?.(Me,r,E,M.segmentIndex,M.graphemeIndex),H||!a(y,M)))break}return ne}y(E,{returnsFromUnfitHyphen(){return I},staysAfterObject(){return j},walkPreparedComplexLines(){return S}}),Object.assign(M,E);
@@ -0,0 +1 @@
1
+ import{a,c as n}from"./chunk-FEELTLSH.js";var r={};a(r,{familyProbeText(){return h},getWebKitGenericFamilies(){return l},hasFamily(){return s}});var e=" aa ab ady af ak am ar as ast av ay az ba be bg bi bn bo bs ca ce ceb ch chk cs cy da de dv dz ee efi el en es et eu fa fi fil fj fo fr fur fy ga gaa gd gil gl gn gsw gu ha haw he hi hil ho hr ht hu hy id ig ii ilo inh is it iu ja jv ka kaj kam kbd kha kk kl km kn ko kok kos kpe krc ks ku kum ky la lah lb lez ln lo lt lv mai mdf mg mh mi mk ml mn mr ms mt my myv na nb ne niu nl nn nr nso ny oc om or os pa pag pap pau pl pon ps pt qu rm rn ro ru rw sa sah sat sd se sg si sid sk sl sm so sq sr ss st su sv sw ta te tet tg th ti tig tk tkl tl tn to tpi tr trv ts tt tvl tw ty tyv udm ug uk und ur uz ve vi wal war wo xh yap yo za zh zh-hk zh-tw zu ",i=" arab armn bali batk beng blis bopo brah brai bugi buhd cans cham cher cirt copt cprt cyrl cyrs deva dsrt egyd egyh egyp ethi geok geor glag goth grek gujr guru hang hani hano hans hant hebr hira hmng hrkt hung inds ital java jpan kali kana khar khmr knda kore laoo latf latg latn lepc limb lina linb mand maya mero mlym mong mymr nkoo ogam orkh orya osma perm phag phnx plrd qaai roro runr sara shaw sinh sylo syrc syre syrj syrn tagb tale talu taml telu teng tfng tglg thaa thai tibt ugar vaii visp xpeo xsux yiii zxxx ",o=["","Zapfino","Menlo","Kefa III","Geeza Pro","Snell Roundhand","Kohinoor Bangla","Kokonor|Kailasa","Kailasa","Galvji","Noto Sans Tagalog","Kohinoor Gujarati","Lucida Grande|Arial Hebrew","Apple Chancery|Arial Hebrew","Courier New","ITF Devanagari|Kohinoor Devanagari","Kohinoor Devanagari","Noto Sans Armenian","Euphemia UCAS","Hiragino Mincho ProN","Hiragino Sans","Helvetica","Khmer MN|Khmer Sangam MN","Khmer Sangam MN","Kannada MN|Noto Sans Kannada","Noto Sans Kannada","AppleMyungjo|Apple SD Gothic Neo","Apple SD Gothic Neo","Noto Nastaliq Urdu","Lao MN|Lao Sangam MN","Lao Sangam MN","Malayalam MN|Malayalam Sangam MN","Malayalam Sangam MN","Noto Serif Myanmar|Noto Sans Myanmar","Noto Sans Myanmar","Oriya MN|Noto Sans Oriya","Noto Sans Oriya","Mukta Mahee","Sinhala MN|Sinhala Sangam MN","Sinhala Sangam MN","Tamil Sangam MN","Kohinoor Telugu","Thonburi","Songti TC|PingFang HK","PingFang HK","Songti SC|PingFang SC","PingFang SC","Songti TC|PingFang TC","PingFang TC","Songti TC|PingFang MO","PingFang MO"],t={"":[0,0,0,1,2],am:[3,3,3,3,2],ar:[4,4,4,4,2],bg:[0,0,5,5,2],bn:[6,6,6,6,2],bo:[7,8,7,7,2],chr:[9,9,9,9,2],ckb:[4,4,4,4,2],fa:[4,4,4,4,2],fil:[10,10,10,10,2],gu:[11,11,11,11,2],he:[0,12,13,0,14],hi:[15,16,16,16,2],hy:[17,17,17,17,2],iu:[18,18,18,18,2],ja:[19,20,19,19,2],ka:[21,0,21,21,2],km:[22,23,22,22,2],kn:[24,25,24,24,2],ko:[26,27,26,26,2],ks:[28,28,28,28,2],lo:[29,30,29,29,2],lrc:[4,4,4,4,2],ml:[31,32,31,31,2],my:[33,34,33,33,2],mzn:[4,4,4,4,2],or:[35,36,35,35,2],pa:[37,37,37,37,2],ps:[4,4,4,4,2],ro:[0,0,5,5,2],ru:[0,0,5,5,2],sd:[4,4,4,4,2],si:[38,39,38,38,2],sr:[0,0,5,5,2],ta:[40,40,40,40,2],te:[41,41,41,41,2],th:[42,42,42,42,2],tr:[0,0,5,5,2],ug:[4,4,4,4,2],uk:[0,0,5,5,2],ur:[28,28,28,28,2],yi:[0,12,13,0,14],yue:[43,44,43,43,2],zh:[45,46,45,45,2],"kk-arab":[4,4,4,4,2],"ks-arab":[4,4,4,4,2],"ks-deva":[0,0,0,1,2],"ms-arab":[4,4,4,4,2],"pa-arab":[4,4,4,4,2],"sd-deva":[0,0,0,1,2],"ur-arab":[4,4,4,4,2],"uz-arab":[4,4,4,4,2],"yue-hans":[45,46,45,45,2],"zh-hant":[47,48,47,47,2],"zh-hk":[43,44,43,43,2],"zh-mo":[49,50,49,49,2],"zh-tw":[47,48,47,47,2],"pa-aran-pk":[28,28,28,28,2],"yue-hant-mo":[49,50,49,49,2],"zh-hant-hk":[43,44,43,43,2],"zh-hant-mo":[49,50,49,49,2]};function l(a,n){let r=a.toLowerCase().replaceAll("_","-"),l=null;for(let a=r;null===l;)if(e.includes(` ${a} `))l="zh"===a;else{let n=a.lastIndexOf("-");if(n<0||a.endsWith("-zyyy"))return null;i.includes(` ${a.slice(n+1)} `)&&(l=a.endsWith("-hani")),a=a.slice(0,n)}l&&(r="zh-hans");let h=t[r];for(;void 0===h;)r=r.slice(0,Math.max(0,r.lastIndexOf("-"))),h=t[r];let g=[];for(let a=0;a<h.length;a++){let r=h.indexOf(h[a]);if(r<a){g.push(g[r]);continue}let e=o[h[a]],i=e.indexOf("|"),t=i<0?e:s(n,e.slice(0,i))?e.slice(0,i):e.slice(i+1);g.push(""===t?"":`"${t}"`)}return g}var h="Hamburg 한中 नम សួ ನಮ ສະ നമ မင ନମ ආය བཀ";function s(a,n){for(let r of["monospace","serif"]){a.font=`16px ${r}`;let e=a.measureText(h).width;if(a.font=`16px "${n}", ${r}`,a.measureText(h).width!==e)return!0}return!1}Object.assign(n,r);
File without changes
@@ -0,0 +1 @@
1
+ import{f as A}from"./chunk-B3WIVP7S.js";import{B as Q,E as B,H as C,K as E,T as g,b as R,c as w,d as I,e as P,l as q,n as O,p as H,v as d,w as G}from"./chunk-A4DB6TWP.js";import{b as s,r as D,v as t,x as a}from"./chunk-JQWGQSV3.js";import{a as e,c}from"./chunk-FEELTLSH.js";var M={};function n(A,Q,B,C,E){let g=-1;for(let R=B;R<=C;){let B=!1,w=1;if(R<C){let C=Q.charCodeAt(R);55296==(64512&C)&&R+1<Q.length&&56320==(64512&Q.charCodeAt(R+1))&&(C=(C-55296<<10)+Q.charCodeAt(R+1)-56320+65536,w=2),B=t(A,C)}if(B)g<0&&(g=R);else if(g>=0){if(R-g>1)for(let A of D().segment(Q.slice(g,R)))A.index>0&&(E[g+A.index]=1);g=-1}R+=w}}e(M,{markDictionaryWords(){return n}});var r={};e(r,{KANA_COUNT(){return o},KANA_PROBE(){return F},getFontKanaKerning(){return l},getKanaKerning(){return L},getWholeRunContext(){return h},measureKanaKerning(){return k},sameInk(){return Y}});var o=191,F="プダグタノムブイメえずぺ";function h(A){let Q=A.state;return null===Q.wholeRunContext&&(Q.wholeRunContext=g(Q.language),Q.wholeRunContext.textRendering="optimizeLegibility"),Q.wholeRunFont!==A.kanaFont&&(Q.wholeRunContext.font=Q.wholeRunFont=A.kanaFont),Q.wholeRunContext}function Y(A,Q){let B=A.width/4194304;return Math.abs(A.width-Q.width)<=B&&Math.abs(A.actualBoundingBoxLeft-Q.actualBoundingBoxLeft)<=B&&Math.abs(A.actualBoundingBoxRight-Q.actualBoundingBoxRight)<=B}function l(A){if(void 0===A.kanaKerning){A.kanaKerning=null;let Q=A.canvasFont,B=d.exec(Q),C=null===B?0:B.index+B[0].length,E=null===B?null:Q.slice(C).match(G),g=null===E?1:E.length,R=null;for(let B=0;B<g;B++){let g=0===B?Q:Q.slice(0,C)+E.slice(B).join(",");A.kanaFont=g;let w=h(A),I=w.measureText(F).width;w.fontKerning="none";let P=w.measureText(F);if(w.fontKerning="auto",null===R)R=P;else if(!Y(R,P))break;if(I!==P.width){if(B>0){let B="";for(let A=12353;A<=12438;A++)B+=String.fromCharCode(A,12290);let C=w.measureText(B).width;A.kanaFont=Q;let E=h(A),R=E.measureText(B).width;E.fontKerning="none";let I=E.measureText(B).width;if(E.fontKerning="auto",R===I||Math.abs(C-R)>R/4194304)break;A.kanaFont=g}A.kanaKerning=new Float64Array(o*o).fill(NaN);break}}null===A.kanaKerning&&(A.kanaFont=Q)}return A.kanaKerning}function L(A,Q,B,E,g){let R=A.charCodeAt(B);if(R<12353||R>12543)return 0;let w=A.charCodeAt(B-1);if(w<12353||w>12543)return 0;if(B>Q){if(!C(R))return 0;let E=B-1,g=w;for(;g>=12353&&g<=12543&&!C(g);){if(E===Q)return 0;g=A.charCodeAt(--E)}if(g>=11904&&!C(g))return 0}let I=(w-12353)*o+R-12353,P=g[I];return Number.isNaN(P)?g[I]=k(A.slice(B-1,B+1),E):P}function k(A,Q){let C=h(Q).measureText(A).width,E=C-B(A[0],Q).width-B(A[1],Q).width;return Math.abs(E)<=C/4194304?0:E}var i={};function U(A,B,C,g,R,w,P,q){let{normalized:H,starts:d,flags:G}=g;for(let g=R;g<w;g++){if((G[g]&O)!==I)continue;let s=d[g],D=g+1<G.length?d[g+1]:H.length,t=C+g-R;for(let C=g>R?s:s+1;C<D;C++){let I=E(H,s,C,P,q);0!==I&&(C>s?B[t]=B[t]+I:I>0?B[t-1]=B[t-1]+I:(B[t]=B[t]+I,A??(A=Q(w-R)),A[g-R]=A[g-R]-I))}}return A}function u(A,C,E,g,R,w,d){let{normalized:G,starts:s,flags:D}=C;for(let C=w;C<d;C++){let t=C+1<D.length?s[C+1]:G.length;if((D[C]&O)!==I||12288!==G.charCodeAt(t-1))continue;if(C+1<d){let A=D[C+1]&O;if(A!==q&&A!==P&&(A!==I||0!==(D[C+1]&H)))continue}let a=t-1;for(;a>s[C]&&12288===G.charCodeAt(a-1);)a--;let e=G.slice(a,t),c=C>0&&a===s[C]&&173===G.charCodeAt(a-1),M=B(e,E).width+e.length*g-(c?R:0);M<=0||(A??(A=Q(d-w)),A[C-w]=A[C-w]+M)}return A}e(i,{addIdeographicSpaceHangs(){return u},addKanaKerning(){return U}});var K={};e(K,{appleQuoteRemaps(){return z},blinkLinePairsPacked(){return f},classMaps(){return p},classRemapsPacked(){return J},classRunsVarints(){return m},geckoLineBreakStatesPacked(){return V},geckoLineEotProperty(){return j},geckoLineLastCodepointProperty(){return X},geckoLinePropertyCount(){return N},jointClassCount(){return x},ruleTables(){return S},scriptClassFacts(){return b},webkitLinePairsPacked(){return T}});var p={"apple/line_normal":[0,183],"apple/line":[1,183],"apple/line_cj":[2,183],"apple/char":[3,149],"chromium/script":[4,80]},x=181,m="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ARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQsdFlIDHTBT80AdD5ABAZEBAR0VkAEEHQCQAQArEpEBAoQBAIIBAIYBAJIBAIYBAJEBAIIBAJMBAIkBAIQBAIIBFYYBKB3/A4IBBhEVHQAuACwJLgAdDC4AHQQuAB0ALgAdAS4AHQEuAB0JLu0DMQCUAQCVAY8BMR8dCzEAMgIxDyEClgEBlwEBmAEAmQEAlgEAmgEFHQAkACEAJAAhACQAIQEkACEAJAAhACQAIQAkAJsBACgEhQEAmQEAlgEAmQEAlgEAmQEAlgEAmQEAlgEAmQEAlgEAmQEAlgEAmQEAlgEAmQEAlgEBggEAmQEAlgEGhQEAlgEAhQEAlgEAHQGXAQGYAQCFAQB0AHUAdAB1AHQAdQeFAQAdAIUBAHIAnAEAhQEDHQQxAB2GATEBHQBvAB0AmAEBhQEAcgCcAQGFAQB0AHUBhQEAlgEAhQEAlgEKhQEBlwEChQEAmAEAhQEZnQEAdACFAQCeAQKFARmdAQB0AIUBAJ4BAIUBAHQAdQCEAQCHAQCIAQCEAQCGAQCCAQmMASyCAQGfAR6CAQIdBYIBAR0FggEBHQWCAQEdAoIBAh0AnAEAcgKFAQFyAB0GewAdCHECAACgAQAIgQIdAkE8HU4m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dgEICXYSCDexARmyAQCCAQFzDLEBCYUBAHMThQEAcwGFAQhzAIUBA7EBCIUBBrEBAXMNsQEFhQGZAbEBIHMAdwF5CHcIcwB3RXMAdwZzAHwNcwF5AXcAeQJ3AQgBdxRzAXYEcwB2BHMCfAFzAHwBcwB8AXoBdwRzC3cQcwF5AHcAcwB3AHkAdwJzBLMBPnMAdwBzAHcBfAFzCnwUcxJ8AnMAfANzAnwAcwJ8BnMAfABzAHwNcwB2AHMAdgBzAHYEcwB8A3MAdgBzAXZJcwB3AHkAcwZ2D3MNdgxzC3YKCAAXAHcDcwB5F3MGeQF3AXkAdwF6A3cAfAt5AHcBeQN3AXkAegN5AXwMeQBzAHcBeQB3B3kBdwh5AHcEeQJ3C3kCdwcIAncBeQB3AHkAdwN5AHcFeQB3AnkAdwUIAHdJcwJ8AnMEfCUIAgcCbAMIInMAfA9zAnwIcwB8BHMEeQB3AHwCdwJzAXkDcwKxAQNzBXcCeQB3AHkBcwKxAQB3AXkAdwhzArEBcwgCeQMIBHlUCAR5BbEBC3MDsQEAcw6xAQsIA7QBNwgHtAEJCAW0AScIB7QBHQgBtAELCAO0AQEIDbQBCAgmtAELCAB8AXMAfAdzB3wFcwB8CHMJfABzAHkCfAZzAHkvcwB8PHMBfABzAXwAcwB8EHMCfABzDHwhc1cIB7EBDXkBsQEMcwKxAQpzArEBNHMCfABzALEBAHMDsQEPcwGxAQtzA7EBAHMIfAaxAZIBCAAdWwgJEAAIBB39B7EBAR39/wOCAQEd/f8DggGBgCgdAHEAAB1xX68Bf3HvASGPHHH/3wsd",J="iQe1AQMEBQYHCAkKCwwNDg8QERITCw8EFBUOCxYXCxgLCwMDAwMDAxUVCwsDEBkMAwkaExMLDRAQAwkDCQsDEwsMAwsDBBMNFws/QD8VDhQEP0BAQBscHR4EBBcVHx8gISIjAwMXJAMlGSYWGCcVHh4UBCgLCykqKywtIi4iLy0wCRQUGQQqMSwqMissKyoDKgQzNAMtMTUUDiwyNis1FTcqLDI4JzkgFRMhOQ4UFQ4UCzoDAzs8PT6IAbUBATKLAbUBAg4USbUBBQMEAwUGDQEBBwITAQgDAT8GBggGBgYIBgYJCQYGBgYIBgMGBggGCQYKCwwGBgYGCQYICgYGBgoLBgoMDQ4PBgYGBgMGCwwGBggICgYDEBEGVA4DAwMGBwYGBwcGBgcGBwNmAAZzAxITEAaMAQADcxQGCAgJCwkGBgMDAw4ICAgHFAgHAAYBEQECAAAAAAMEAAQAAAAAAAUABO0FEAsKDg8PBwcHBwcHEAAQEBECAwQSEBAQAhUAAhsCExQFDgIQEQQbFxUADgALCwAAAAAAAwAAAg4AAAcAABYCBHYIFxgDDwcABwADPQEDAmUNEREAAAAAAA8AAwQHAAhjCAcHAA4HAAAH",b=[1055,5151,25631,8,42015,12,10,1,479,351,287,31,415,159,4,2,2064,16,543,4097,24577,63,5121,-7137,58399],S={"apple/line_normal":[65,63,11,365,null,"AQA+BgIAAwAEAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVAAgAFgAXABgAGQAaAAcAGwAHABsAHAAHAB0AHgAfAAcAIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAqACoALQAuAC8AMAAxADIAIgAzAAkAAgABGgABEzQECAAAADUAAwEAAAAAAAEAAAAAAAAAAAACAAMAAAADAAAAAgAAAAMAAAABAAAAAAAAARIGNgcAAAAAAAAABAABAAI3AQAKOAMAAwAAAAgAAgADAAAAADYAAAIAAQECAAEBCAQAAA8AAQcEAAQABQAGAAcFDQA5ARABEgM6Cx0DIAMkCSoABAUGOxETDzwUMAU7AAcIAAEFPQ00BD4BNwADCz0aPQAHBAY/FDcMQBo/AAITBkEIAAAAAEIHCAAABwAAAAAAAQABQwAAAgABQgsAAAAAAAIAA0EACQoGRAgAAAAAQgk3DEUDAAFCCwAIRAAEBAZGBEccRhpGAAIGBkgESQUAFkoFABRIAAMFBksKABZMBQAUSwABBQZNEQAPThQABU0ACQQGTxYXClAaTwAPCQZRC1IAUwFUAVUDNwxWBlcTUQALBAZYBEkcWRpYAAsFBloNWwdcC1oaWgAMBQZdBF4NXw5dGl0ADQUGYBIIDmESAAdgAAcEBmIPABFjGmIAFQYGZA1lBjcAZgtnGmQAEQwBAgRoCQsIaQFqAhgAGQhrDSsALAItCGgAEgcGbAkLDhkAGgdtES0IbAABBAZuGAAIbxpuABQIBnAbcQByAHEBBwFzCHERcAAVBQZ0CQsXdREtCHQAHDwAAQADBHYAdgN3AHYAdgB2AHYAdgB2AHYAdgB2AHYAdgB2AHYAdgB2AHYAdgB2AHYAdgB2AHYAdgB2AHYAdgB2AXYAdgB2AHYAdgB2AHYAdgB2AHYAdgB2AHYAdgB2AHYAdgB2AHYAdgB2AHYAdgB2AHYAdgB2AHYAHQUAARM0BAgBNQADABgFBngEeRx6AB8ZeAAYBAZ7EggOexp7ABcGAQIEfBJpAWoMfRp8AAYGAQIEfhJpAWoMfxp+ABsFBoABBEcPagyAARqAAQAdBwECBIEBBEkNaQFqDIIBGoEBACMGAQIEgwESaQFqDIQBGoMBACQIBoUBFDcGcQByAHEBBwGGARqFAQALBAaHASGIARciAocBAAYEBokBIYoBFyICiQEAJgYBAgSLARJpAWoMjAEaiwEABgQGjQEEBhyOARqNAQAJBQaPARgZABoHkAEajwEACgQGkQEZGgeSARqRAQAiBgECBJMBEmkBagyUARqTAQAoCQaVAQYIBQ4EEwAIATcMlgEUMAWVAQAoBgaXARsbARsDmAEIJhGXAQAdBAaZARRqDJkBGpkBABUEBpoBIZsBFyICmgEAKwQGnAEhnQEWngEDnAEAMQUGnwEUNwygARciAp8BADEEBqEBDxERogEaoQEALQUEowEBpAESpQEOpAEapAEAMwEbpgEALwUEowEBpwESqAEOpwEapwEAMAUGNhIIAaYBDDgaNgA4IwEEAqMBAakBCKoBAKoBAKoBAjQBAAIIAKoBAQMBqgEAqgEAqgEBqgEAqgEAqgEAqgEAqgEBqwEAqgECqgEAqgEAqgEDqgEAqgECqgEAqgECqgEAqgEAqgEBqgEAqgEAqgECqQEADAcAAAOjAQE6EqwBAQgMOho6ADQBG6YBAAQDBjshPBo7ADUBG6YBADYEBq0BBK4BHK0BGq0BADYBG6YBAAgDBj8hQBo/ADcBG6YBAAAFBkIMrwECERFCGkIACwMGQSFDGkEAOQEbpgEADQMGRCFFGkQAOgEbpgEAPwgGsAEERwexAQCyAQazAQC0AQu1ARqwAQA7ARumAQBDAwtJFQcTKgASBAZIBEkcShpIAD0BG6YBABQDBkshTBpLAD4BG6YBABYDBk0hThpNAD8BG6YBABgDBk8hUBpPAEABG6YBAFAGBrYBBEkFAAk3DLcBGrYBAEIEBrgBCgAWuQEauAEAQwkGugEHAAIAFrsBBwAAAA8AAAAAugEAOQYGvAEESQMKGL0BAyEWvAEAHggGUQtSAFMBVAFVEFYGVxNRADUGBr4BBEkDChi/AQMhFr4BAEYBG6YBACEEBlgESRxZGlgARwEbpgEATAMGwAEhwQEawAEATQQGwgEPABHDARrCAQBJARumAQAXBwbEAQReCMUBBBQCxgELxwEaxAEAVwUGyAEEyQENXw7IARrIAQBLARumAQBMAhumAR8uAEwBG6YBACsDBmIhYxpiAE0BG6YBAFAEBsoBFgAKywEaygEAUQQGzAEWAArNARrMAQBJBgZkDWUGpgEAZgtnGmQAUAMBBRfOAQHPAQBhEwbQARfRAQnQAQPSAQDTAQDUAQDVAQDWAQLXAQDYAQDZAQDaAQDbAQDZAQDZAQDcAQLdAQLTAQLQAQAzDgEGBN4BF98BCeABA+EBAOIBAOMBAeQBAuUBAuYBAOcBAugBBeIBAt4BAGMFBmgSCAHPAQxrGmgAUwEbpgEANQMGbCFtGmwAVAEbpgEANwMGbiFvGm4AVQEbpgEAAAQGcR8HAXEacQBrBQbpARsbBeoBCCYR6QEAOwQGcBxyBHMacABYARumAQA9AwZ0IXUadAAAAQADAFoJDOsBBewBAO0BAe4BAe8BA/ABD/EBA/IBCfMBAFkBG6YBAHMCC3kdHwBCBAZ4BHkcehp4AFsBG6YBAFsDAQUXzgEBzwEAEgMGfCF9GnwAXAMBBRfOAQHPAQAUAwZ+IX8afgBdARvPAQBdAwEFF84BAc8BADgEBoEBFM8BDIIBGoEBAF4DAQUXzgEBzwEAGQMGgwEhhAEagwEAXwEbpgEATgQGhQEccgSGARqFAQBgARumAQBQAwaHASGIARqHAQBhAwEFF84BAc8BAB8DBokBIYoBGokBAGIDAQUXzgEBzwEAIQMGiwEhjAEaiwEAYwMBBRfOAQHPAQAjAwaNASGOARqNAQBkAwEFF84BAc8BACUDBo8BIZABGo8BAGUDAQUXzgEBzwEAJwMGkQEhkgEakQEAZgMBBRfOAQHPAQApAwaTASGUARqTAQBnARumAQB4BgaVAQ30AQamAQD1AQuWARqVAQBoARumAQBgAwaXASGYARqXAQBpARvPAQBpARumAQBjAwaaASGbARqaAQBqARumAQBlBAacASGdARb2AQOcAQBlJQEHBPcBB/gBAPgBAPgBAPgBBPgBA/gBAvgBAPgBAPgBAPgBAfgBAPgBAPgBAPgBAPgBAfkBAPgBAvgBAPgBAPgBAfgBAPgBAPgBAPgBAvgBAPgBAvgBAPgBAPgBAfgBAPgBAPgBAPgBAPgBAPcBAGwBG6YBAGgDBp8BIaABGp8BAG0BG6YBAGoDBqEBIaIBGqEBAAABAAEAbwEbpgEAnQEFBvoBBPsBDaUBDvoBGvoBAJ4BBQSjAQH8ARL9AQ78ARr8AQBwARumAQCgAQUG/gEE/wENqAEO/gEa/gEAcBsBCA2AAgCAAgCAAgiAAgOAAgCAAgCAAgGAAgCAAgCAAgCAAgCAAgKAAgKAAgCAAgCAAgOAAgCAAgKAAgCAAgKAAgCAAgCAAgGAAgCAAgCAAgAAAQAEAKoBCASjAQGpAQ00AQACCAIDC6sBGqkBAKQBBQaBAgSCAg2DAg6BAhqBAgBvARumAQBnBgaEAgSuAQiFAgeGAguHAhqEAgAABAavAQ8REa8BGq8BAK4BBAawARQIDLUBGrABAHgGAAEFiAIPEQQ3DIkCGogCAKMBAwaKAiGLAhqKAgCrAQUEowEBjAISgwIOjAIajAIApQEEBo0CDwARjgIajQIArQEFBrABEggBCAy1ARqwAQBkARumAQB/BAa2AQRJHLcBGrYBAGUBG6YBAGMDBrgBIbkBGrgBAGYBG6YBAGUDBroBIbsBGroBAGcBG6YBAIUBBAa8AQRJHL0BGrwBAGcDAQUXzgEBzwEAdQQGvgEUzwEMvwEavgEAZQEbpgEAiQEDBsABIcEBGsABAGYBG6YBAIsBAwbCASHDARrCAQDCAQQGxAEUCAzHARrEAQC2AQMGjwIhkAIajwIAtwEEBpECDwARkgIakQIAEgMGxAEhxwEaxAEAaQEbpgEAtQEIBpMCBMkBB7EBAJQCBrMBAJUCC5YCGpMCAGUBG6YBAJMBAwbKASHLARrKAQBmARumAQCVAQMGzAEhzQEazAEAxgETBpcCF5gCCZcCA5kCAJoCAJsCAJwCAJ0CAp4CAJ8CAKACAKECAKICAKACAKACAKMCAqQCApoCApcCAGUEBqUCEv0BDqYCGqUCAGcBG6YBALkBAQACALEBAQACALEBAQACALEBAQACALEBAQACALEBAQACAK8BAQACAK8BAQACAK8BAQACAK8BAQACAK8BAQACAK8BAQACAK0BAQACAHQMAQkZpgECpwINqAIAqQIAqgIBqwICrAICrQIArgICrwIFqQIAxwEBAAYAqQEEBt4BFKYBDOABGt4BAMABAQAGAMABAQAGAMABAQAGAL8BAQAGAL0BAQAGALsBAQAGALsBAQAGALsBAQAGAHcBG6YBALIBAwbpASHqARrpAQDkAQEAAwDfAQEAAwC0AQEAAwDeAQEAAwDdAQEAAwC2AQEAAwDRAQEAAwDOAQEAAwDJAQEAAwDlAQMGsAIhsQIasAIA5gEEBrICDwARswIasgIAWAYAAQW0AhQ3DLUCFrYCA7QCAFkiAQoMtwIAtwIAtwIAtwIEtwIDtwICtwIAtwIAtwIAtwIBtwIAtwIAtwIAtwIAtwICtwICtwIAtwIAtwIBtwIAtwIAtwIAtwICtwIAtwICtwIAtwIAtwIBtwIAtwIAtwIAtwIAtwIAAAEABwBEBASjAQH3ASH5ARr3AQBVARumAQC0AQcGuAIE+wEIuQIEpQECugILuwIauAIAVgEbpgEA9QEFBrwCBL0CDf0BDrwCGrwCAFYBG6YBALgBBwa+AgT/AQi/AgSoAQLAAgvBAhq+AgAAAQAIAFUBG6YBALsBBwbCAgSCAgjDAgSsAQLEAgvFAhrCAgD7AQUGxgIExwINgwIOxgIaxgIAggIEBoQCFAgMhwIahAIA9gEDBsgCIckCGsgCAPcBBAbKAg8AEcsCGsoCAFIDBoQCIYcCGoQCAF8GAAEFiAIPEQSmAQyJAhqIAgDRAQQEowEBiAIhiQIaiAIAWAEbpgEA0wEDBooCIYsCGooCAFkBG6YBAFkBG6YBANYBAwaNAiGOAhqNAgBKARumAQDYAQMGjwIhkAIajwIASwEbpgEA2gEDBpECIZICGpECAJECBAaTAhQIDJYCGpMCAIUCAwbMAiHNAhrMAgCGAgQGzgIPABHPAhrOAgBhAwaTAiGWAhqTAgBJARumAQCAAgEABQD4AQEABQD4AQEABQD4AQEABQD4AQEABQD4AQEABQD2AQEABQD2AQEABQD2AQEABQD2AQEABQD2AQEABQD2AQEABQD0AQEABQBHBAalAhL9AQ6mAhqlAgCCAQQGpQIS/QEOpgIapQIAjwIBAAkAhwIBAAkAhwIBAAkAhwIBAAkAhgIBAAkAhAIBAAkAggIBAAkAggIBAAkAggIBAAkAPAEbpgEA+QEDBrACIbECGrACAD0BG6YBAPsBAwayAiGzAhqyAgA9BgABBbQCFKYBDLUCFtACA7QCAP0BBQSjAQG0AiG1Ahb2AQO0AgCYAQEABwAAAQAKALYCBAa4AhQIDLsCGrgCAKoCAwbRAiHSAhrRAgCrAgQG0wIPABHUAhrTAgCGAQMGuAIhuwIauAIAPwEbpgEA9gEHBtUCBL0CCNYCBP0BAtcCC9gCGtUCALwCBAa+AhQIDMECGr4CALACAwbZAiHaAhrZAgCxAgQG2wIPABHcAhrbAgCMAQMGvgIhwQIavgIAwAIEBsICFAgMxQIawgIAtAIDBt0CId4CGt0CALUCBAbfAg8AEeACGt8CAJABAwbCAiHFAhrCAgBDARumAQCAAgcG4QIExwII4gIEgwIC4wIL5AIa4QIAQwEbpgEAkQIDBsgCIckCGsgCAEQBG6YBAJMCAwbKAiHLAhrKAgA4ARumAQCVAgMGzAIhzQIazAIAOQEbpgEAlwIDBs4CIc8CGs4CALIBAQAKABgBG6YBAJoCAwbRAiHSAhrRAgAZARumAQCcAgMG0wIh1AIa0wIA0wIEBtUCFAgM2AIa1QIAxwIDBuUCIeYCGuUCAMgCBAbnAg8AEegCGucCAKMBAwbVAiHYAhrVAgAaARumAQCiAgMG2QIh2gIa2QIAGwEbpgEApAIDBtsCIdwCGtsCABoBG6YBAKYCAwbdAiHeAhrdAgAbARumAQCoAgMG3wIh4AIa3wIA3wIEBuECFAgM5AIa4QIA0wIDBukCIeoCGukCANQCBAbrAg8AEewCGusCAK8BAwbhAiHkAhrhAgAPARumAQCuAgMG5QIh5gIa5QIAEAEbpgEAsAIDBucCIegCGucCAAcBG6YBALICAwbpAiHqAhrpAgAIARumAQC0AgMG6wIh7AIa6wI="],"apple/line":[65,63,11,365,"apple/line_normal",""],"apple/line_cj":[65,63,11,365,"apple/line_normal",""],"apple/char":[21,21,3,16,null,"AQASBgIAAgADAAQABQAEAAYABAAHAAQACAAJAAoABAAEAAkACgALAAABAAEAAAIAAQYCAAAGAAEKBAEEAQQDBAAEAAEECwUDBQMFAAwABQQAAQUAAAAAAAADAwsHAw0EBwAEBBAIAAkDCQAKAAUCEQkACgAGARIKAAcBFw4ACAEKBQAJBAsNAgcADQQNAAoCAQIVDwAAAQAC"]},f="",T="5DAIgAAACAAAAAQDBAYA/+v/+/8CAQF/DBwACAEADhwCCAAUAQQfgAlAFDgAGBwAGFQAJAEANHAAKDgACBwE/1cA/gTAAgAAKwQfgAnAAxAB/xg4AAwBAAiIAwAOHgAYmAIA5gEcADSkAwAoVAAkHAy8lv+5////7////2+kAsADAOoDHAEAWbgHAJ4GHAAVgAcBgBj0EwAakBQArgGYAgH/FgEBf/AFjAgAGAEBmALmBwEMEIwPAFAcALYBtAIAB4gYAYYFiBgBJwzcCgA0jAEAftACAQDbAfQFAMABcACWDRwA",z={"":[8220,0,8221,1,8216,0],agq:[8221,1],am:[171,0,187,1,8249,0,8250,1],ar:[],ast:[171,0,187,1,8220,0,8221,1],bas:[171,0,187,1,8221,1],be:[171,0,187,1,8221,1],bg:[8221,1,8221,1],blo:[171,0,187,1,8220,0,8221,1],bm:[171,0,187,1,8220,0,8221,1],br:[171,0,187,1,8220,0,8221,1],bs:[8221,1,8216,0],bua:[171,0,187,1,8221,1],ca:[171,0,187,1,8220,0,8221,1],cs:[8221,1],cv:[171,0,187,1,8220,0,8221,1],da:[],de:[8221,1],dsb:[8221,1],dua:[171,0,187,1,8216,0],dyo:[171,0,187,1,8220,0,8221,1],el:[171,0,187,1,8220,0,8221,1],eo:[8220,0,8221,1,171,0,187,1],et:[8221,1],eu:[171,0,187,1,8220,0,8221,1],ewo:[171,0,187,1,8220,0,8221,1],fa:[171,0,187,1,8249,0,8250,1],ff:[8221,1],fi:[],fr:[171,0,187,1,171,0,187,1],fur:[8216,0,8220,0,8221,1],gsw:[171,0,187,1,8249,0,8250,1],he:[],hr:[8221,1],hsb:[8221,1],hu:[8221,1,187,0,171,1],hy:[171,0,187,1,171,0,187,1],ia:[8216,0,8220,0,8221,1],ie:[171,0,187,1,8220,0,8221,1],is:[8221,1],it:[171,0,187,1,8220,0,8221,1],ja:[],jgo:[171,0,187,1,8249,0,8250,1],ka:[8221,1,171,0,187,1],kab:[171,0,187,1,8220,0,8221,1],kk:[171,0,187,1,8220,0,8221,1],kkj:[171,0,187,1,8249,0,8250,1],ksf:[171,0,187,1,8216,0],ksh:[8221,1],ky:[171,0,187,1,8221,1],lag:[],lb:[8221,1],lij:[171,0,187,1,8220,0,8221,1],lt:[8221,1,8221,1],luy:[8221,1],mg:[171,0,187,1,8220,0,8221,1],mk:[8221,1],mua:[171,0,187,1,8220,0,8221,1],mzn:[171,0,187,1,8249,0,8250,1],nb:[171,0,187,1,8216,0],nds:[8221,1],nl:[8216,0,8216,0],nmg:[8221,1,171,0,187,1],nn:[171,0,187,1,8216,0],nnh:[171,0,187,1,8220,0,8221,1],no:[171,0,187,1,8216,0],oc:[171,0,187,1,171,0,187,1],os:[171,0,187,1,8221,1],pl:[8221,1,171,0,187,1],pms:[171,0,187,1,8220,0,8221,1],prg:[8221,1,8221,1],rm:[171,0,187,1,8249,0,8250,1],rn:[],ro:[8221,1,171,0,187,1],ru:[171,0,187,1,8221,1],rw:[171,0,187,1,8216,0],sah:[171,0,187,1,8221,1],sc:[171,0,187,1,8220,0,8221,1],se:[],sg:[171,0,187,1,8220,0,8221,1],shi:[171,0,187,1,8221,1],sk:[8221,1],sl:[8221,1],sn:[],sr:[8221,1],ss:[8216,0,8220,0,8221,1],st:[8216,0,8220,0,8221,1],sv:[],syr:[],szl:[8221,1,187,0,171,1],ti:[171,0,187,1,8220,0,8221,1],tk:[8220,0,8221,1,8220,0,8221,1],tn:[8216,0,8220,0,8221,1],ts:[8216,0,8220,0,8221,1],tyv:[171,0,187,1,8221,1],ug:[187,0,171,1,8250,0,8249,1],uk:[171,0,187,1,8221,1],ur:[],uz:[8220,0,8221,1],ve:[8216,0,8220,0,8221,1],wae:[171,0,187,1,8249,0,8250,1],yav:[171,0,187,1,171,0,187,1],yi:[],yue:[],zgh:[171,0,187,1,8221,1],az_Cyrl:[171,0,187,1,8249,0,8250,1],bs_Cyrl:[8221,1],ff_Adlm:[8220,0,8221,1,8216,0],fr_CA:[171,0,187,1],fr_CH:[171,0,187,1,8249,0,8250,1],kk_Arab:[187,0,171,1,8250,0,8249,1],ms_Arab:[],pt_AO:[171,0,187,1,8220,0,8221,1],pt_CH:[171,0,187,1,8220,0,8221,1],pt_CV:[171,0,187,1,8220,0,8221,1],pt_FR:[171,0,187,1,8220,0,8221,1],pt_GQ:[171,0,187,1,8220,0,8221,1],pt_GW:[171,0,187,1,8220,0,8221,1],pt_LU:[171,0,187,1,8220,0,8221,1],pt_MO:[171,0,187,1,8220,0,8221,1],pt_MZ:[171,0,187,1,8220,0,8221,1],pt_PT:[171,0,187,1,8220,0,8221,1],pt_ST:[171,0,187,1,8220,0,8221,1],pt_TL:[171,0,187,1,8220,0,8221,1],ti_ER:[8216,0,8220,0,8221,1],uz_Arab:[8220,0,8221,1,8216,0],uz_Cyrl:[8220,0,8221,1,8216,0],zh_Hant:[]},N=0,X=0,j=0,V="";s(K),a(),R(),A(),w(),Object.assign(c,M,r,i);
@@ -0,0 +1 @@
1
+ import{c as t}from"./chunk-SCKMN2PN.js";import{a as e,b as r,c as n,d as a}from"./chunk-B3WIVP7S.js";import{B as l,C as s,S as u,a as i,e as c,i as o,k as g,l as p,m as h,n as f,o as m,u as S}from"./chunk-A4DB6TWP.js";import"./chunk-JQWGQSV3.js";import{a as d,c as k}from"./chunk-FEELTLSH.js";var j={};function A(e,r,n,a,l,s,u){let{letterSpacing:i,segmentFlags:S}=e;if(0===i)return 0;if(u>0)return 0!==(S[s]&m)?i:0;let d=e.widths.length;if(t(S,d,s,u)||s>a&&s<d&&(S[s]&f)!==p&&1<<(S[s-1]&f)&n)return 0;for(let t=s-1;t>=a;t--){let e=S[t],n=e&f;if(n!==c&&(n===g||n===o||0!==(e&m)||n===h||null!==r&&0!==r[t]))return t===a&&l>0||0!==(e&m)?i:0}return 0}d(j,{getTerminalLetterSpacing(){return A}});var C={};d(C,{GLYPH_COUNT_SPACING(){return P},getExtraSpacings(){return v}});var P=2**20;function v(t,e){if(!e.state.takesLetterSpacing)return s;let r=new Int32Array(t.length),n=i("apple/char",t,0,t.length,r),a=n<=S,c=e.glyphCounts,o=null,g=s;try{let s=0;for(let i=0,p=0;i<n;p=r[i++]){let h=t.slice(a?0:p,r[i]),f=c.get(h);void 0===f&&(null===o&&(o=u(e),o.letterSpacing=`${P}px`),f=Math.round(o.measureText(h).width/P),c.set(h,f));let m=f-(a?s:0)-1;s=f,(0!==m||0!==g.length)&&(0===g.length&&(g=l(n)),g[i]=m)}}finally{null!==o&&(o.letterSpacing=e.letterSpacing)}return g}var y={};function L(t,l,s,u,c){let o=new Int32Array(s-l),g=i(u,t,l,s,o),p=null;for(let s=0,u=l;s<g;u=o[s++])(null===c?0!==(n(t.codePointAt(u))&r):a(c,t,u+1)===e&&160!==t.charCodeAt(u))&&(p??(p=[])).push(s);return p}d(y,{getUnspacedGraphemes(){return L}}),Object.assign(k,j,C,y);
package/package.json CHANGED
@@ -1,6 +1,53 @@
1
1
  {
2
2
  "name": "@weft-js/text",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.1",
4
+ "description": "weft's text: fonts for the build (subsets, matched fallbacks) and exact line breaking in the browser, on Pretext by Cheng Lou (@chenglou/pretext 1.0.0, MIT)",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "sideEffects": [
8
+ "./gen/*/pack-*.ts",
9
+ "./dist/**",
10
+ "./test/**"
11
+ ],
12
+ "exports": {
13
+ ".": {
14
+ "types": "./plugin/index.d.ts",
15
+ "default": "./plugin/index.mjs"
16
+ },
17
+ "./build": "./plugin/build.mjs",
18
+ "./measure": "./plugin/measure.mjs",
19
+ "./engine": "./dist/index.js"
20
+ },
21
+ "pretext": {
22
+ "version": "1.0.0",
23
+ "tarball": "https://registry.npmjs.org/@chenglou/pretext/-/pretext-1.0.0.tgz",
24
+ "sha256": "f1d9ac427846d40d3500854f4ff935272abe657d898e70ec75077065633c060a",
25
+ "integrity": "sha512-BxKiDMxWJhyzL8asvcgg3T9YnUU7OUFsKO8oRaR2SYAPX4Sh2wM9gqTBjrBaZ4fnl84cEQ8czC0Q1M83z3chsA=="
26
+ },
27
+ "dependencies": {
28
+ "@capsizecss/metrics": "4.4.0",
29
+ "@capsizecss/unpack": "4.0.1",
30
+ "@chenglou/pretext": "1.0.0",
31
+ "fontverter": "2.0.0",
32
+ "subset-font": "2.9.0"
33
+ },
34
+ "peerDependencies": {
35
+ "@weft-js/core": "^0.1.1"
36
+ },
37
+ "engines": {
38
+ "node": ">=26"
39
+ },
40
+ "keywords": [
41
+ "weft"
42
+ ],
43
+ "files": [
44
+ "dist",
45
+ "plugin",
46
+ "vendor/pretext/LICENSE",
47
+ "README.md",
48
+ "LICENSE"
49
+ ],
50
+ "publishConfig": {
51
+ "access": "public"
52
+ }
53
+ }
@@ -0,0 +1,225 @@
1
+ // font.build@1 (research 11 §8.2, research 26 §3): subset each face per unicode-range (HarfBuzz via subset-font),
2
+ // generate a metric-matched "<Family> Fallback" face (Capsize's method: size-adjust from the average glyph width,
3
+ // then the vertical overrides divided by it), and list the preloads. Cached by content hash under `cacheDir`.
4
+ //
5
+ // Trimming (on in a build, off in dev, `trim: false` turns it off): font bytes are what set LCP on a text hero. Two
6
+ // cuts keep the design and every character. Custom axes (SOFT, WONK, GRAD…) the source never varies are pinned, and
7
+ // `latin` splits in two: a preloaded core (ASCII, common punctuation, what the source uses) and the rest, which a
8
+ // browser fetches through `unicode-range` only when a page holds one of those characters, so text from a database
9
+ // still gets the face.
10
+ import { createHash } from 'node:crypto'
11
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'
12
+ import { isAbsolute, join } from 'node:path'
13
+ import { brotliCompressSync } from 'node:zlib'
14
+ import { fromBuffer } from '@capsizecss/unpack'
15
+ import fontverter from 'fontverter'
16
+ import subsetFont from 'subset-font'
17
+
18
+ /** Google Fonts' subset ranges (the same tables @fontsource ships). */
19
+ export const RANGES = {
20
+ latin: 'U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD',
21
+ 'latin-ext': 'U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF',
22
+ cyrillic: 'U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116',
23
+ 'cyrillic-ext': 'U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F',
24
+ greek: 'U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF',
25
+ 'greek-ext': 'U+1F00-1FFF',
26
+ vietnamese: 'U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB',
27
+ }
28
+
29
+ /** Budgets (research 11 §8.4): preloaded bytes above the fold, and the generated CSS inlined in the head. */
30
+ export const BUDGET = { preloadBytes: 100 * 1024, cssBrotli: 1536 }
31
+ const VERSION = 2 // bump when the output for the same input changes
32
+
33
+ /** Every code point a `unicode-range` covers, as a string subset-font keeps. */
34
+ export function rangeText(range) {
35
+ let out = ''
36
+ for (const part of range.split(',')) {
37
+ const [a, b = a] = part.trim().replace(/^U\+/i, '').split('-').map(h => parseInt(h, 16))
38
+ for (let c = a; c <= b; c++) if ((c < 0xd800 || c > 0xdfff) && c !== 0) out += String.fromCodePoint(c)
39
+ }
40
+ return out
41
+ }
42
+
43
+ /** `latin`'s preloaded part before the source adds to it: ASCII, and the punctuation any prose uses. */
44
+ const CORE = 'U+0020-007E,U+00A0,U+00AD,U+2013-2014,U+2018-2019,U+201C-201D,U+2026'
45
+ /** CSS drives these through font-weight, font-stretch, font-style and font-optical-sizing: never pinned. */
46
+ const REGISTERED = new Set(['wght', 'wdth', 'opsz', 'slnt', 'ital'])
47
+
48
+ /** A `unicode-range` for a string of code points. */
49
+ export function toRange(text) {
50
+ const hex = n => n.toString(16).toUpperCase().padStart(4, '0')
51
+ const runs = []
52
+ for (const c of [...new Set(Array.from(text, ch => ch.codePointAt(0)))].sort((a, b) => a - b)) {
53
+ const last = runs.at(-1)
54
+ if (last?.[1] === c - 1) last[1] = c
55
+ else runs.push([c, c])
56
+ }
57
+ return runs.map(([a, b]) => (a === b ? `U+${hex(a)}` : `U+${hex(a)}-${hex(b)}`)).join(',')
58
+ }
59
+
60
+ /**
61
+ * Every `font-variation-settings` in the source: the literal values per axis, and whether any value can't be read
62
+ * from the text (a `var()`, a template, an expression), which keeps every axis.
63
+ */
64
+ export function scanAxes(source) {
65
+ const values = new Map()
66
+ let dynamic = false
67
+ for (const m of source.matchAll(/font-?variation-?settings['"`]?([^;}\]\n]*)/gi)) {
68
+ const pairs = /["'`]([\w ]{4})["'`][\s_]+(-?\d*\.?\d+)/g
69
+ for (const [, tag, value] of m[1].matchAll(pairs)) (values.get(tag) ?? values.set(tag, new Set()).get(tag)).add(Number(value))
70
+ if (/[\w$(]/.test(m[1].replace(pairs, '').replace(/\b(?:normal|inherit|initial|unset|revert(?:-layer)?|important)\b/g, ''))) dynamic = true
71
+ }
72
+ return { values, dynamic }
73
+ }
74
+
75
+ /** The axes in a font's `fvar` table (a table-directory read: nothing else needs parsing). */
76
+ export async function readAxes(bytes) {
77
+ const font = Buffer.from(await fontverter.convert(bytes, 'truetype'))
78
+ for (let i = 0, n = font.readUInt16BE(4); i < n; i++) {
79
+ const entry = 12 + i * 16
80
+ if (font.toString('latin1', entry, entry + 4) !== 'fvar') continue
81
+ const table = font.readUInt32BE(entry + 8)
82
+ const first = table + font.readUInt16BE(table + 4)
83
+ const fixed = at => font.readInt32BE(at) / 65536
84
+ return Array.from({ length: font.readUInt16BE(table + 8) }, (_, a) => {
85
+ const at = first + a * font.readUInt16BE(table + 10)
86
+ return { tag: font.toString('latin1', at, at + 4), min: fixed(at + 4), default: fixed(at + 8), max: fixed(at + 12) }
87
+ })
88
+ }
89
+ return []
90
+ }
91
+
92
+ /** The custom axes to pin: the value the source sets, or the default when it sets none. `declared` keeps an axis. */
93
+ export function pinned(axes, declared, { values, dynamic }) {
94
+ const pins = {}
95
+ if (dynamic) return pins
96
+ for (const a of axes) {
97
+ if (REGISTERED.has(a.tag) || declared[a.tag]) continue
98
+ const used = values.get(a.tag)
99
+ if (!used) pins[a.tag] = a.default
100
+ else if (used.size === 1) pins[a.tag] = Math.min(a.max, Math.max(a.min, [...used][0]))
101
+ }
102
+ return pins
103
+ }
104
+
105
+ const camel = name => name.toLowerCase().replace(/[^a-z0-9]+(.)/g, (_, c) => c.toUpperCase())
106
+ const pct = n => `${Math.round(n * 10000) / 100}%`
107
+ const slug = s => s.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')
108
+
109
+ /** Metrics of a system fallback (Capsize's collection), by family name: Arial, Times New Roman, Courier New… */
110
+ async function systemMetrics(family) {
111
+ try {
112
+ return (await import(`@capsizecss/metrics/${camel(family)}`)).default
113
+ } catch {
114
+ throw Object.assign(new Error(`text(): no metrics for fallback "${family}". Use a common system face: Arial, Helvetica, Times New Roman, Georgia, Courier New, Verdana.`), { code: 'P115' })
115
+ }
116
+ }
117
+
118
+ const avgWidth = m => (m.subsets?.latin?.xWidthAvg ?? m.xWidthAvg) / m.unitsPerEm
119
+
120
+ /** The fallback face's descriptors that make `fallback` take the same space as `font` (Capsize / next/font). */
121
+ export function fallbackFace(font, fallback) {
122
+ const sizeAdjust = avgWidth(font) / avgWidth(fallback)
123
+ const k = font.unitsPerEm * sizeAdjust
124
+ return {
125
+ sizeAdjust: pct(sizeAdjust),
126
+ ascentOverride: pct(font.ascent / k),
127
+ descentOverride: pct(Math.abs(font.descent) / k),
128
+ lineGapOverride: pct(font.lineGap / k),
129
+ }
130
+ }
131
+
132
+ /**
133
+ * @param {{ fonts: Record<string, { family: string, src: string, fallback: string, display: string, weight: number, style: string, axes: Record<string, [number, number]>, preload: boolean }>, subsets: string[] }} options
134
+ */
135
+ export function createFontBuild({ fonts, subsets, trim = true }) {
136
+ return {
137
+ /** @param {{ root: string, cacheDir: string, url: (name: string) => string, dev?: boolean, source?: string }} input */
138
+ async build({ root, cacheDir, url, dev = false, source = '' }) {
139
+ mkdirSync(cacheDir, { recursive: true })
140
+ const trimming = trim && !dev
141
+ const scan = scanAxes(source)
142
+ const latin = rangeText(RANGES.latin)
143
+ const core = trimming ? rangeText(CORE) + [...new Set(source)].filter(c => c > '~' && latin.includes(c)).join('') : ''
144
+ const coreSet = new Set(core)
145
+ const parts = subset => trimming && subset === 'latin'
146
+ ? [{ subset, text: core }, { subset: 'latin-rest', text: Array.from(latin).filter(c => !coreSet.has(c)).join('') }].map(p => ({ ...p, range: toRange(p.text) }))
147
+ : [{ subset, text: rangeText(RANGES[subset]), range: RANGES[subset] }]
148
+ const files = []
149
+ const preloads = []
150
+ const metrics = {}
151
+ const faces = []
152
+ const fallbacks = new Map()
153
+ const rules = []
154
+ const seen = new Map() // family+src → its preload flag, so two roles on one face emit it once
155
+
156
+ for (const [role, f] of Object.entries(fonts)) {
157
+ const key = `${f.family}\0${f.src}\0${f.weight}\0${f.style}`
158
+ if (seen.has(key)) {
159
+ if (f.preload && !seen.get(key).preload) seen.get(key).preload = true
160
+ continue
161
+ }
162
+ const entry = { ...f, role, files: [] }
163
+ seen.set(key, entry)
164
+ const bytes = readFileSync(isAbsolute(f.src) ? f.src : join(root, f.src))
165
+ const m = await fromBuffer(bytes)
166
+ metrics[f.family] ??= {
167
+ unitsPerEm: m.unitsPerEm,
168
+ ascent: m.ascent / m.unitsPerEm,
169
+ descent: m.descent / m.unitsPerEm,
170
+ lineGap: m.lineGap / m.unitsPerEm,
171
+ capHeight: m.capHeight / m.unitsPerEm,
172
+ xHeight: m.xHeight / m.unitsPerEm,
173
+ xWidthAvg: avgWidth(m),
174
+ }
175
+ if (!fallbacks.has(f.family)) fallbacks.set(f.family, { fallback: f.fallback, ...fallbackFace(m, await systemMetrics(f.fallback)) })
176
+
177
+ const hash = createHash('sha256').update(bytes).digest('hex').slice(0, 16)
178
+ const pins = trimming ? pinned(await readAxes(bytes), f.axes, scan) : {}
179
+ entry.pins = pins
180
+ for (const { subset, text, range } of subsets.flatMap(parts)) {
181
+ const inputs = createHash('sha256').update(text).update(JSON.stringify(pins)).digest('hex').slice(0, 8)
182
+ const cached = join(cacheDir, `${hash}-${subset}-${inputs}-v${VERSION}.woff2`)
183
+ let out
184
+ if (existsSync(cached)) out = readFileSync(cached)
185
+ else {
186
+ out = await subsetFont(bytes, text, { targetFormat: 'woff2', ...(Object.keys(pins).length && { variationAxes: pins }) })
187
+ writeFileSync(cached, out)
188
+ }
189
+ const name = `${slug(f.family)}-${f.weight}${f.style === 'italic' ? 'i' : ''}-${subset}-${createHash('sha256').update(out).digest('hex').slice(0, 8)}.woff2`
190
+ files.push({ name, bytes: new Uint8Array(out) })
191
+ entry.files.push({ subset, name, range, bytes: out.length })
192
+ }
193
+ faces.push(entry)
194
+ }
195
+
196
+ for (const f of faces) {
197
+ const weight = f.axes.wght ? `${f.axes.wght[0]} ${f.axes.wght[1]}` : f.weight
198
+ for (const file of f.files) {
199
+ rules.push(`@font-face{font-family:"${f.family}";src:url(${url(file.name)}) format("woff2");font-weight:${weight};font-style:${f.style};font-display:${f.display};unicode-range:${file.range}}`)
200
+ }
201
+ const first = f.files.find(x => x.subset === 'latin') ?? f.files[0]
202
+ if (f.preload && first) preloads.push({ href: url(first.name), type: 'font/woff2', bytes: first.bytes })
203
+ }
204
+ for (const [family, fb] of fallbacks) {
205
+ rules.push(`@font-face{font-family:"${family} Fallback";src:local("${fb.fallback}");size-adjust:${fb.sizeAdjust};ascent-override:${fb.ascentOverride};descent-override:${fb.descentOverride};line-gap-override:${fb.lineGapOverride}}`)
206
+ }
207
+ const css = rules.join('\n') + (rules.length ? '\n' : '')
208
+
209
+ const preloadBytes = preloads.reduce((n, p) => n + p.bytes, 0)
210
+ const cssBrotli = brotliCompressSync(css).length
211
+ const overBudget = []
212
+ // Dev keeps whole faces, so its sizes say nothing about what ships.
213
+ if (!dev && preloadBytes > BUDGET.preloadBytes) overBudget.push(['X022', `The preloaded fonts are ${Math.round(preloadBytes / 1024)} KB, over the 100 KB budget for text above the fold: preload fewer faces (\`preload: false\`) or use fewer weights.`])
214
+ if (cssBrotli > BUDGET.cssBrotli) overBudget.push(['X022', `The generated font CSS is ${cssBrotli} B brotli, over the 1.5 KB budget: fewer faces or subsets.`])
215
+
216
+ return {
217
+ css,
218
+ preloads: preloads.map(({ href, type }) => ({ href, type })),
219
+ files,
220
+ metrics,
221
+ report: { faces: faces.map(f => ({ family: f.family, role: f.role, pinned: f.pins, files: f.files.map(({ subset, bytes }) => ({ subset, bytes })) })), preloadBytes, cssBrotli, overBudget },
222
+ }
223
+ },
224
+ }
225
+ }
@@ -0,0 +1,40 @@
1
+ import type { PluginInstance } from '@weft-js/core/plugin'
2
+
3
+ /** One font file and how it's used. */
4
+ export interface Face {
5
+ family: string
6
+ /** The font file, relative to the project root (woff2, woff, ttf or otf). */
7
+ src: string
8
+ /** The system face the fallback is matched to: Arial, Helvetica, Times New Roman, Georgia, Courier New, Verdana… */
9
+ fallback: string
10
+ /** Never `block` or `auto` (X021). Default `swap`. */
11
+ display?: 'swap' | 'optional' | 'fallback'
12
+ weight?: number
13
+ style?: 'normal' | 'italic'
14
+ /** `{ wght: [400, 700] }` sets the face's weight range. A custom axis named here is kept whatever the source sets. */
15
+ axes?: Record<string, [number, number]>
16
+ /** Preload the latin subset. Default: true for `body` and `display`. */
17
+ preload?: boolean
18
+ }
19
+
20
+ /** A Unicode range the fonts are cut to. */
21
+ export type Subset = 'latin' | 'latin-ext' | 'cyrillic' | 'cyrillic-ext' | 'greek' | 'greek-ext' | 'vietnamese'
22
+
23
+ /** Options of `text()`. */
24
+ export interface TextOptions {
25
+ /** Role → face. The only place font files are declared. */
26
+ fonts?: Record<string, Face>
27
+ /** Default `['latin']`. */
28
+ subsets?: Subset[]
29
+ /** `'auto'` provides `text.measure`, loaded lazily by what uses it; `'off'` leaves it unbound. */
30
+ measure?: 'auto' | 'off'
31
+ /** `'slim'` is @weft-js/text/engine; `'pretext'` is pinned upstream (33.9 KB br). */
32
+ engine?: 'slim' | 'pretext'
33
+ /** Pin the custom axes the source never varies and load uncommon latin characters on demand. Builds only. Default `true`. */
34
+ trim?: boolean
35
+ }
36
+
37
+ /** Every subset the build can cut. */
38
+ export declare const SUBSETS: Subset[]
39
+ /** The plugin for `weft.config.ts`: fonts, their fallbacks and `text.measure`. */
40
+ export declare function text(options?: TextOptions): PluginInstance<Required<TextOptions>>
@@ -0,0 +1,79 @@
1
+ // text() for weft.config.ts (research 13 §3.4, research 26 §3, research 33 §6): declares the app's fonts once and
2
+ // provides font.build@1 and text.measure@1. The build (src/build.mjs) runs in @weft-js/core/vite through
3
+ // `.weft/slots/font.build.build.json`; the engine (src/measure.mjs) loads only when something measures.
4
+ import { fileURLToPath } from 'node:url'
5
+ import { definePlugin, defineSlot, provide } from '@weft-js/core/plugin'
6
+
7
+ const fontBuild = defineSlot({ id: 'font.build', version: 1, cardinality: 'one', sides: ['build'] })
8
+ const textMeasure = defineSlot({ id: 'text.measure', version: 1, cardinality: 'one', sides: ['client', 'worker'] })
9
+
10
+ export const SUBSETS = ['latin', 'latin-ext', 'cyrillic', 'cyrillic-ext', 'greek', 'greek-ext', 'vietnamese']
11
+ const DISPLAYS = ['swap', 'optional', 'fallback']
12
+ const ENGINES = ['slim', 'pretext']
13
+ /** Roles preloaded unless a face says otherwise: the text above the fold at every dial stop. */
14
+ const PRELOADED = new Set(['body', 'display'])
15
+
16
+ const fail = (path, message) => {
17
+ throw Object.assign(new Error(message), { path })
18
+ }
19
+
20
+ function face(role, f) {
21
+ const at = `fonts.${role}`
22
+ if (!f || typeof f !== 'object') fail(at, 'expected { family, src, fallback }')
23
+ for (const key of ['family', 'src', 'fallback']) if (typeof f[key] !== 'string' || !f[key]) fail(`${at}.${key}`, 'expected a non-empty string')
24
+ for (const key of Object.keys(f)) if (!['family', 'src', 'fallback', 'display', 'weight', 'style', 'axes', 'preload'].includes(key)) fail(`${at}.${key}`, 'unknown option')
25
+ const display = f.display ?? 'swap'
26
+ if (!DISPLAYS.includes(display)) fail(`${at}.display`, `must be ${DISPLAYS.map(d => `'${d}'`).join(' | ')}: \`block\` and \`auto\` hide text while the font loads (X021)`)
27
+ if (f.style !== undefined && f.style !== 'normal' && f.style !== 'italic') fail(`${at}.style`, "must be 'normal' or 'italic'")
28
+ if (f.weight !== undefined && !(Number.isInteger(f.weight) && f.weight >= 1 && f.weight <= 1000)) fail(`${at}.weight`, 'must be an integer 1–1000')
29
+ const axes = f.axes ?? {}
30
+ for (const [axis, range] of Object.entries(axes)) {
31
+ if (!Array.isArray(range) || range.length !== 2 || !range.every(Number.isFinite)) fail(`${at}.axes.${axis}`, 'expected [min, max]')
32
+ }
33
+ return { family: f.family, src: f.src, fallback: f.fallback, display, weight: f.weight ?? 400, style: f.style ?? 'normal', axes, preload: f.preload ?? PRELOADED.has(role) }
34
+ }
35
+
36
+ function options(input) {
37
+ for (const key of Object.keys(input)) if (!['fonts', 'subsets', 'measure', 'engine', 'trim'].includes(key)) fail(key, 'unknown option')
38
+ const measure = input.measure ?? 'auto'
39
+ if (measure !== 'auto' && measure !== 'off') fail('measure', "must be 'auto' or 'off'")
40
+ const engine = input.engine ?? 'slim'
41
+ if (!ENGINES.includes(engine)) fail('engine', `must be ${ENGINES.map(e => `'${e}'`).join(' | ')}`)
42
+ const trim = input.trim ?? true
43
+ if (typeof trim !== 'boolean') fail('trim', 'must be true or false')
44
+ const subsets = input.subsets ?? ['latin']
45
+ if (!Array.isArray(subsets) || !subsets.length) fail('subsets', 'expected a non-empty array')
46
+ for (const [i, s] of subsets.entries()) if (!SUBSETS.includes(s)) fail(`subsets.${i}`, `unknown subset \`${s}\` (${SUBSETS.join(', ')})`)
47
+ const fonts = {}
48
+ for (const [role, f] of Object.entries(input.fonts ?? {})) fonts[role] = face(role, f)
49
+ return { fonts, subsets, measure, engine, trim }
50
+ }
51
+
52
+ export const text = definePlugin({
53
+ name: '@weft-js/text',
54
+ version: '0.0.0',
55
+ weft: '*',
56
+ options,
57
+ permissions: { fs: { read: ['**/*.{woff2,woff,ttf,otf}'] } },
58
+ contribute: o => ({
59
+ // Generated share cards set their title and text in the app's faces.
60
+ card: { fonts: Object.fromEntries(['display', 'body'].filter(r => o.fonts?.[r]?.src).map(r => [r, { family: o.fonts[r].family, src: o.fonts[r].src, weight: o.fonts[r].weight }])) },
61
+ provides: [
62
+ provide(fontBuild, {
63
+ sides: { build: { module: fileURLToPath(new URL('./build.mjs', import.meta.url)), export: 'createFontBuild', options: { fonts: o.fonts, subsets: o.subsets, trim: o.trim } } },
64
+ }),
65
+ ...(o.measure === 'off' ? [] : [provide(textMeasure, { sides: { client: { module: '@weft-js/text/measure', export: 'createMeasure', options: { engine: o.engine } } } })]),
66
+ ],
67
+ agents: {
68
+ title: 'Fonts (@weft-js/text)',
69
+ text: [
70
+ '- Declare fonts once in `text({ fonts })` in weft.config.ts: `{ body: { family, src, fallback } }`. Never hand-write `@font-face` (X020).',
71
+ "- The build subsets each face by `unicode-range`, adds a metric-matched `\"<Family> Fallback\"` face and preloads `body` and `display`. `@weft-js/core/vite` loads them: no import. `weft docs fonts`.",
72
+ "- A build trims faces on its own: custom axes the source never varies are pinned, and uncommon latin characters load on demand. An axis set at runtime needs declaring in `axes`; `trim: false` turns it all off.",
73
+ '- `text.measure` is lazy: it costs nothing until something measures, a canvas `s.text()`, `measure()`, `lines()` or `fit()` from @weft-js/core/text, or a warp list given `text` (`measure: \'off\'` removes it).',
74
+ "- Font stacks name the fallback second: `font-family: \"Inter\", \"Inter Fallback\", sans-serif`. `font-display` is `swap` or `optional`, never `block` (X021).",
75
+ ].join('\n'),
76
+ },
77
+ catalog: [{ name: 'text', import: '@weft-js/text', summary: 'font.build: subsets, matched fallback faces, preloads; text.measure: lazy line breaking for canvas text and exact row heights' }],
78
+ }),
79
+ })
@@ -0,0 +1,20 @@
1
+ // text.measure@1 (research 33 §6). The slot's generated module calls this through `import()`, so nothing here is in an
2
+ // app until something measures. `slim` is @weft-js/text/engine, which already has the slot's shape.
3
+
4
+ /** Pretext's own lines carry their text, so `lineText` only has to hand it back. */
5
+ function pretext(P) {
6
+ return {
7
+ prepare: (text, font, opts) => Object.assign(P.prepareWithSegments(text, font, opts), { exact: true, ready: null }),
8
+ layout: (h, width, lineHeight) => P.layout(h, width, lineHeight),
9
+ lines: (h, width) => P.layoutWithLines(h, width, 1).lines,
10
+ lineText: (_, line) => line.text,
11
+ clear: P.clearCache,
12
+ }
13
+ }
14
+
15
+ /** The `text.measure` provider: this package's engine, or upstream Pretext behind the same calls. */
16
+ export async function createMeasure({ engine = 'slim' } = {}) {
17
+ if (engine === 'pretext') return pretext(await import('@chenglou/pretext'))
18
+ const { loadTextEngine } = await import('../dist/index.js')
19
+ return loadTextEngine()
20
+ }