allyhub 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/dist/commands/render.js +1 -1
  2. package/dist/commands/sheet.js +7 -7
  3. package/dist/commands/slides.js +1 -1
  4. package/dist/node_modules/@allyhub-next/audio/package.json +1 -1
  5. package/dist/node_modules/@allyhub-next/browser/package.json +1 -1
  6. package/dist/node_modules/@allyhub-next/build/package.json +1 -1
  7. package/dist/node_modules/@allyhub-next/chart/package.json +1 -1
  8. package/dist/node_modules/@allyhub-next/check/package.json +1 -1
  9. package/dist/node_modules/@allyhub-next/cloud/package.json +1 -1
  10. package/dist/node_modules/@allyhub-next/components/package.json +1 -1
  11. package/dist/node_modules/@allyhub-next/dev-server/dist/exports.js +1 -1
  12. package/dist/node_modules/@allyhub-next/dev-server/package.json +1 -1
  13. package/dist/node_modules/@allyhub-next/doc/package.json +1 -1
  14. package/dist/node_modules/@allyhub-next/export/dist/export.d.ts +2 -2
  15. package/dist/node_modules/@allyhub-next/export/dist/export.js +4 -4
  16. package/dist/node_modules/@allyhub-next/export/dist/names.d.ts +1 -1
  17. package/dist/node_modules/@allyhub-next/export/package.json +1 -1
  18. package/dist/node_modules/@allyhub-next/formats/dist/data/sheet.d.ts +179 -0
  19. package/dist/node_modules/@allyhub-next/formats/dist/data/sheet.js +1 -1
  20. package/dist/node_modules/@allyhub-next/formats/dist/data/slides.d.ts +303 -11
  21. package/dist/node_modules/@allyhub-next/formats/dist/data/slides.js +1 -1
  22. package/dist/node_modules/@allyhub-next/formats/dist/index.d.ts +1 -0
  23. package/dist/node_modules/@allyhub-next/formats/dist/index.js +1 -1
  24. package/dist/node_modules/@allyhub-next/formats/dist/items.js +1 -1
  25. package/dist/node_modules/@allyhub-next/formats/dist/schemas.d.ts +135 -3
  26. package/dist/node_modules/@allyhub-next/formats/dist/zip.d.ts +17 -0
  27. package/dist/node_modules/@allyhub-next/formats/dist/zip.js +2 -0
  28. package/dist/node_modules/@allyhub-next/formats/package.json +1 -1
  29. package/dist/node_modules/@allyhub-next/measure/package.json +1 -1
  30. package/dist/node_modules/@allyhub-next/media/package.json +1 -1
  31. package/dist/node_modules/@allyhub-next/model/package.json +1 -1
  32. package/dist/node_modules/@allyhub-next/project/package.json +1 -1
  33. package/dist/node_modules/@allyhub-next/protocol/dist/editor.d.ts +10 -0
  34. package/dist/node_modules/@allyhub-next/protocol/dist/editor.js +1 -1
  35. package/dist/node_modules/@allyhub-next/protocol/dist/notes.d.ts +2 -0
  36. package/dist/node_modules/@allyhub-next/protocol/dist/notes.js +1 -1
  37. package/dist/node_modules/@allyhub-next/protocol/package.json +1 -1
  38. package/dist/node_modules/@allyhub-next/registry/package.json +1 -1
  39. package/dist/node_modules/@allyhub-next/render/dist/exports.d.ts +2 -11
  40. package/dist/node_modules/@allyhub-next/render/dist/exports.js +2 -2
  41. package/dist/node_modules/@allyhub-next/render/dist/page.d.ts +1 -9
  42. package/dist/node_modules/@allyhub-next/render/package.json +1 -1
  43. package/dist/node_modules/@allyhub-next/runtime/package.json +1 -1
  44. package/dist/node_modules/@allyhub-next/runtimes/package.json +1 -1
  45. package/dist/node_modules/@allyhub-next/scaffold/package.json +1 -1
  46. package/dist/node_modules/@allyhub-next/scenery/package.json +1 -1
  47. package/dist/node_modules/@allyhub-next/scenery-host/package.json +1 -1
  48. package/dist/node_modules/@allyhub-next/sheet/dist/api/capabilities.js +1 -1
  49. package/dist/node_modules/@allyhub-next/sheet/dist/api/index.d.ts +1 -0
  50. package/dist/node_modules/@allyhub-next/sheet/dist/api/index.js +1 -1
  51. package/dist/node_modules/@allyhub-next/sheet/dist/api/page.d.ts +83 -0
  52. package/dist/node_modules/@allyhub-next/sheet/dist/api/page.js +2 -0
  53. package/dist/node_modules/@allyhub-next/sheet/dist/api/workbook.d.ts +40 -1
  54. package/dist/node_modules/@allyhub-next/sheet/dist/api/workbook.js +1 -1
  55. package/dist/node_modules/@allyhub-next/sheet/dist/check.js +1 -1
  56. package/dist/node_modules/@allyhub-next/sheet/dist/structure.js +1 -1
  57. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/charts.d.ts +2 -0
  58. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/charts.js +1 -1
  59. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/import.d.ts +3 -0
  60. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/import.js +1 -1
  61. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/read.d.ts +2 -1
  62. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/read.js +1 -1
  63. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/write.js +1 -1
  64. package/dist/node_modules/@allyhub-next/sheet/package.json +1 -1
  65. package/dist/node_modules/@allyhub-next/site/package.json +1 -1
  66. package/dist/node_modules/@allyhub-next/slides-core/dist/api.d.ts +64 -7
  67. package/dist/node_modules/@allyhub-next/slides-core/dist/api.js +2 -2
  68. package/dist/node_modules/@allyhub-next/slides-core/dist/capabilities.js +1 -1
  69. package/dist/node_modules/@allyhub-next/slides-core/dist/chart-api.d.ts +23 -0
  70. package/dist/node_modules/@allyhub-next/slides-core/dist/chart-api.js +1 -1
  71. package/dist/node_modules/@allyhub-next/slides-core/dist/chart-file.js +1 -1
  72. package/dist/node_modules/@allyhub-next/slides-core/dist/enums.d.ts +20 -0
  73. package/dist/node_modules/@allyhub-next/slides-core/dist/enums.js +1 -1
  74. package/dist/node_modules/@allyhub-next/slides-core/dist/index.d.ts +1 -0
  75. package/dist/node_modules/@allyhub-next/slides-core/dist/index.js +1 -1
  76. package/dist/node_modules/@allyhub-next/slides-core/dist/model.d.ts +37 -1
  77. package/dist/node_modules/@allyhub-next/slides-core/dist/office.d.ts +10 -0
  78. package/dist/node_modules/@allyhub-next/slides-core/dist/office.js +1 -1
  79. package/dist/node_modules/@allyhub-next/slides-core/dist/preset.d.ts +5 -0
  80. package/dist/node_modules/@allyhub-next/slides-core/dist/preset.js +2 -0
  81. package/dist/node_modules/@allyhub-next/slides-core/dist/resolve.d.ts +7 -2
  82. package/dist/node_modules/@allyhub-next/slides-core/dist/resolve.js +1 -1
  83. package/dist/node_modules/@allyhub-next/slides-core/package.json +1 -1
  84. package/dist/node_modules/@allyhub-next/slides-pptx/dist/charts.js +1 -1
  85. package/dist/node_modules/@allyhub-next/slides-pptx/dist/import.js +1 -1
  86. package/dist/node_modules/@allyhub-next/slides-pptx/dist/read.d.ts +2 -1
  87. package/dist/node_modules/@allyhub-next/slides-pptx/dist/read.js +2 -2
  88. package/dist/node_modules/@allyhub-next/slides-pptx/dist/shapes.d.ts +6 -1
  89. package/dist/node_modules/@allyhub-next/slides-pptx/dist/shapes.js +1 -1
  90. package/dist/node_modules/@allyhub-next/slides-pptx/dist/text.d.ts +11 -0
  91. package/dist/node_modules/@allyhub-next/slides-pptx/dist/text.js +1 -1
  92. package/dist/node_modules/@allyhub-next/slides-pptx/dist/write.js +2 -2
  93. package/dist/node_modules/@allyhub-next/slides-pptx/dist/xml.d.ts +10 -4
  94. package/dist/node_modules/@allyhub-next/slides-pptx/dist/xml.js +2 -2
  95. package/dist/node_modules/@allyhub-next/slides-pptx/package.json +1 -1
  96. package/dist/node_modules/@allyhub-next/slides-runtime/dist/draw.d.ts +3 -0
  97. package/dist/node_modules/@allyhub-next/slides-runtime/dist/draw.js +2 -2
  98. package/dist/node_modules/@allyhub-next/slides-runtime/dist/edit.js +1 -1
  99. package/dist/node_modules/@allyhub-next/slides-runtime/package.json +1 -1
  100. package/dist/node_modules/@allyhub-next/stage/dist/graphics.js +1 -1
  101. package/dist/node_modules/@allyhub-next/stage/package.json +1 -1
  102. package/dist/node_modules/@allyhub-next/stage-page/dist/page.js +19 -19
  103. package/dist/node_modules/@allyhub-next/stage-page/package.json +1 -1
  104. package/dist/node_modules/@allyhub-next/video-core/package.json +1 -1
  105. package/editor-web/assets/dist-BW2s9FMO.js +4 -0
  106. package/editor-web/assets/{dist-CuW84oPe.js → dist-C-6JmebI.js} +22 -22
  107. package/editor-web/assets/dist-CCYMLMKN.js +6 -0
  108. package/editor-web/assets/dist-CHzurjMx.js +33 -0
  109. package/editor-web/assets/{dist-Yi3sy7Ea.js → dist-DF7H1dxw.js} +1 -1
  110. package/editor-web/assets/dist-Da5AUSKX.js +2 -0
  111. package/editor-web/assets/index-CovQYWvD.js +69 -0
  112. package/editor-web/assets/minus-BrvjaJyO.js +1 -0
  113. package/editor-web/assets/react-DV5fPdiH.js +101 -0
  114. package/editor-web/assets/{textarea-CvxipnGW.js → textarea-B0vCGdZI.js} +2 -2
  115. package/editor-web/assets/{trash-2-Bq1Dt8XG.js → trash-2-B0dvc1cZ.js} +1 -1
  116. package/editor-web/assets/{undo-2-Djhvu4xt.js → undo-2-A1EPubPO.js} +1 -1
  117. package/editor-web/index.html +2 -2
  118. package/package.json +2 -2
  119. package/editor-web/assets/dist-Cg2PdedY.js +0 -6
  120. package/editor-web/assets/dist-CxAS_vp7.js +0 -2
  121. package/editor-web/assets/dist-DCVaj9i1.js +0 -4
  122. package/editor-web/assets/dist-DGVUuVPB.js +0 -33
  123. package/editor-web/assets/index-pwRfZ2Jv.js +0 -69
  124. package/editor-web/assets/minus-BizJdinJ.js +0 -1
  125. package/editor-web/assets/react-D54s6gwK.js +0 -101
@@ -1,2 +1,2 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- import{readMarks as le,markRuns as de}from"@allyhub-next/video-core";import{chartOfFile as se}from"./chart-file.js";import{AUTOSHAPE_STYLE as j,CONNECTOR_STYLE as V,DRAWN_TEXTBOX_FRAME as Z,TEXT_FALLBACK as q,TEXT_INSETS as N,placeholderFrame as fe,styleKindOf as pe}from"./office.js";import{resolveAnimation as ue,resolveTransition as J}from"./animation.js";import{pathSteps as ce}from"./path.js";import{masterPlaceholder as he}from"./placeholders.js";import{DECK_FONTS as me,OFFICE_THEME as ge,themeOver as _e}from"./theme.js";import{Pt as A}from"./units.js";export function joinPath(t,o){if(o.startsWith("/"))return o.slice(1);const m=t===""?[]:t.split("/");for(const l of o.split("/"))l===""||l==="."||(l===".."?m.pop():m.push(l));return m.join("/")}const Q={left:0,top:0,width:0,height:0},P=()=>Array.from({length:9},()=>({...q,font:{...q.font},margin_left:0}));export function levelsOver(t,...o){return t.map((m,l)=>{let s={...m,font:{...m.font}};for(const $ of o){const r=$?.[l];r&&(s={...s,...r.alignment===void 0?{}:{alignment:r.alignment},...r.line_spacing===void 0?{}:{line_spacing:r.line_spacing},...r.space_before===void 0?{}:{space_before:r.space_before},...r.space_after===void 0?{}:{space_after:r.space_after},...r.margin_left===void 0?{}:{margin_left:r.margin_left},...r.indent===void 0?{}:{indent:r.indent},font:{...s.font,...r.font}},r.font?.color!==void 0&&delete s.font.rgb,r.font?.rgb!==void 0&&delete s.font.color,r.bullet===null?delete s.bullet:r.bullet!==void 0?s.bullet={char:r.bullet,...r.bullet_font===void 0?{}:{font:r.bullet_font}}:r.bullet_font!==void 0&&s.bullet&&(s.bullet={...s.bullet,font:r.bullet_font}))}return s})}function K(t,...o){const m=o.filter(s=>s!==void 0),l=s=>{for(let $=m.length-1;$>=0;$--){const r=m[$]?.[s];if(r!==void 0)return r}};return{vertical_anchor:l("vertical_anchor")??t.vertical_anchor,auto_size:l("auto_size")??t.auto_size,word_wrap:l("word_wrap")??t.word_wrap,margins:{left:l("margin_left")??N.left,top:l("margin_top")??N.top,right:l("margin_right")??N.right,bottom:l("margin_bottom")??N.bottom}}}const I={vertical_anchor:"t",auto_size:"none",word_wrap:!0};export const plainLevels=t=>levelsOver(P(),t.text_styles.other);function B(t,o){return{...K(I,o),levels:levelsOver(P(),t.text_styles.other,o.levels)}}function ye(t,o,...m){return{...K(fe(o),...m),levels:levelsOver(P(),t.text_styles[pe(o)],...m.map(l=>l?.levels))}}const $e=Array.from({length:9},()=>({font:{color:j.font_color}})),ee={vertical_anchor:j.vertical_anchor};function ne(t,o){return{...K(I,o),levels:levelsOver(P(),t.text_styles.other,$e,o.levels)}}const L=t=>{const o={...t};return delete o.paragraphs,o},R=t=>({paragraphs:[],levels:[],...t}),W=t=>t==="none"?null:colorOfFile(t),xe=/<span((?:\s+(?:color|font)="[^"\n]*")+)\s*>(.*?)<\/span>/gu,be=/(color|font)="([^"\n]*)"/gu,D=57344,we=256,te="",ke=/[\ue000-\ue100]|[^\ue000-\ue100]+/gu;export const colorOfFile=t=>t.startsWith("#")?{rgb:t.toUpperCase()}:t;function ie(t,o,m=[]){return{...t,rows:t.rows.map((l,s)=>({height:l.height,cells:l.cells.map($=>{const r=m[s];return{...$,text:{paragraphs:$.text.paragraphs,style:H({...B(o,$.text),auto_size:"shape"},r),own:L($.text),empty:!1},...r?{fileText:r}:{}}})}))}}function H(t,o){return o?{...t,levels:t.levels.map(m=>{const l={...m.font,...o.size===void 0?{}:{size:A(o.size)},...o.bold===void 0?{}:{bold:o.bold},...o.italic===void 0?{}:{italic:o.italic},...o.font===void 0?{}:{name:o.font}};if(o.color!==void 0){const s=colorOfFile(o.color);typeof s=="string"?(l.color=s,delete l.rgb):(l.rgb=s.rgb,delete l.color)}return{...m,font:l,...o.align===void 0?{}:{alignment:o.align}}})}:t}function Se(t){const o={};for(const[,m,l=""]of t.matchAll(be))if(m==="font")o.name=l.trim();else{const s=colorOfFile(l);typeof s=="string"?o.color=s:o.rgb=s.rgb}return o}export function paragraphsOfWords(t,o=0,m=me.code){return t===void 0?[]:typeof t=="string"?t.split(/\r?\n/u).map(l=>{const s=[],$=l.replace(xe,(v,T,z)=>(s.push(Se(T)),`${String.fromCharCode(D+s.length-1)}${z}${te}`)),r=le($);let O;const E=de(r.text,r.marks).flatMap(v=>{const T=v.kinds.includes("code"),z={...v.kinds.includes("strong")?{bold:!0}:{},...v.kinds.includes("em")?{italic:!0}:{},...T?{name:m}:{}};return[...v.text.matchAll(ke)].flatMap(U=>{const M=U[0],F=M.charCodeAt(0);if(M===te)return O=void 0,[];if(F>=D&&F<D+we)return O=s[F-D],[];const C={...O,...z};return[{text:M,...Object.keys(C).length>0?{font:C}:{},...T?{code:!0}:{}}]})});return{runs:E.length>0?E:[{text:""}],level:o}}):t.flatMap(l=>paragraphsOfWords(l,Array.isArray(l)?Math.min(o+1,8):o,m))}const oe=t=>({left:A(t.x),top:A(t.y),width:A(t.w),height:A(t.h)}),re=t=>t===void 0?void 0:{left:t.left??0,top:t.top??0,right:t.right??0,bottom:t.bottom??0};export function resolveDeck(t){const{def:o,file:m,words:l,prefix:s,base:$}=t,r=[],O=_e(t.theme??ge,o.theme),E=new Map;for(const e of o.masters)for(const n of e.layouts)E.set(n.name,{layout:n,master:e});const v=[],T=(e,n,f)=>({name:e.name,kind:e.kind,frame:{...e.frame??Q},...e.flip?{flip:{...e.flip}}:{},...e.rotation===void 0?{}:{rotation:e.rotation},level:n,...e.text?{text:{paragraphs:e.text.paragraphs,style:e.kind==="autoshape"?ne(f,e.text):B(f,e.text),own:L(e.text),empty:!1}}:{},...e.fill===void 0?{}:{fill:e.fill},...e.line===void 0?{}:{line:e.line},...e.line_width===void 0?{}:{line_width:e.line_width},...e.line_dash===void 0?{}:{line_dash:e.line_dash},...e.line_begin===void 0?{}:{line_begin:e.line_begin},...e.line_end===void 0?{}:{line_end:e.line_end},...e.path?{path:e.path}:{},...e.table?{table:ie(e.table,f)}:{},...e.chart?{chart:e.chart}:{},...e.group===void 0?{}:{group:e.group},...e.geometry?{geometry:e.geometry}:{},...e.adjustments?{adjustments:[...e.adjustments]}:{},...e.media?{media:{path:joinPath(e.media.base,e.media.path),...e.media.poster===void 0?{}:{poster:e.media.poster}}}:{},...e.component?{component:{...e.component}}:{},sources:{frame:{from:n}}}),z=(e,n)=>{const f=e.placeholder?.type??"body",c=he(n,f),x=e.frame??c?.frame??Q;return{name:e.name,kind:"placeholder",frame:{...x},level:"slide",...e.placeholder?{placeholder:{...e.placeholder}}:{},text:{paragraphs:[],style:ye(n,f,c?.text,e.text),empty:!0},...e.fill===void 0?{}:{fill:e.fill},...e.line===void 0?{}:{line:e.line},sources:{frame:{from:e.frame||!c?"layout":"master"},text:{from:"layout"}}}},U=(e,n,f)=>{const c=o.components[e];if(!c){r.push({...f,message:`There is no component ${e} in slides.ts (it has ${Object.keys(o.components).join(", ")||"none"}).`});return}for(const x of Object.keys(n??{}))Object.hasOwn(c.props,x)||r.push({...f,message:`Component ${e} has no prop ${x} a person sets (it has ${Object.keys(c.props).join(", ")||"none"}).`});return{name:e,props:{...n??{}}}},M=(e,n,f,c,x)=>{const b={slide:c,shape:e,path:f};if(!n.frame){r.push({...b,message:`Shape ${e} is the slide's own: it needs a frame { x, y, w, h } in points.`});return}const S=oe(n.frame),a={frame:{from:"slide",path:`${f}.frame`}},_={name:e,frame:S,level:"slide",...n.fill===void 0?{}:{fill:colorOfFile(n.fill)},...n.line===void 0?{}:{line:W(n.line)},...n.line_dash===void 0?{}:{line_dash:n.line_dash},...n.line_begin===void 0?{}:{line_begin:n.line_begin},...n.line_end===void 0?{}:{line_end:n.line_end},...n.group===void 0?{}:{group:n.group}};if(n.textbox)return{..._,kind:"textbox",text:{paragraphs:paragraphsOfWords(l(`${s}.${c}.${e}`),0,O.fonts.code),style:H(B(x,R(Z)),n.text),own:L(R(Z)),empty:!1},...n.text?{fileText:{...n.text}}:{},sources:{...a,text:{from:"slide",path:`${f}.text`}}};if(n.picture!==void 0){const d=re(n.crop);return{..._,kind:"picture",media:{path:joinPath($,n.picture),...d?{crop:d}:{}},sources:a}}if(n.movie!==void 0)return{..._,kind:"movie",media:{path:joinPath($,n.movie),...n.poster===void 0?{}:{poster:n.poster}},sources:a};if(n.chart){const d=l(`${s}.${c}.${e}`),h=se(n.chart,{title:typeof d=="string"?d:void 0,base:$,rows:i=>t.data?.(i),problem:i=>{r.push({...b,message:`Chart ${e}: ${i}`})}});return h?{..._,kind:"chart",chart:h,sources:a}:void 0}if(n.table){const d=n.table,h=S.width/d.columns.reduce((g,w)=>g+w,0),i=S.height/d.rows.reduce((g,w)=>g+w.height,0),p=l(`${s}.${c}.${e}`),y=Array.isArray(p)?p:[];return y.length>d.rows.length&&r.push({...b,message:`Table ${e} has ${String(d.rows.length)} rows and its words ${String(y.length)}.`}),{..._,kind:"table",table:ie({columns:d.columns.map(g=>Math.round(g*h)),rows:d.rows.map((g,w)=>{const k=y[w],X=Array.isArray(k)?k:k===void 0?[]:[k];return{height:Math.round(g.height*i),cells:d.columns.map((ve,ae)=>({text:{levels:[],paragraphs:paragraphsOfWords(X[ae],0,O.fonts.code)},...g.fill===void 0?{}:{fill:colorOfFile(g.fill)},...g.line===void 0?{}:{borders:{bottom:{color:colorOfFile(g.line),width:A(1)}}}}))}})},x,d.rows.map(g=>g.text)),sources:a}}const u=n.path&&ce(n.path.d);if(n.path&&!u){r.push({...b,message:`Shape ${e}'s path starts with M and says only M, L, C and Z, absolute.`});return}if(n.geometry!==void 0||n.path&&u)return{..._,kind:"autoshape",...n.path&&u?{path:{w:n.path.w,h:n.path.h,steps:u}}:n.geometry===void 0?{}:{geometry:n.geometry},...n.geometry==="line"?{line:n.line===void 0?V.line:W(n.line),line_width:n.line_width===void 0?V.line_width:A(n.line_width)}:{fill:n.fill===void 0?j.fill:colorOfFile(n.fill),line:n.line===void 0?j.line:W(n.line),line_width:n.line_width===void 0?j.line_width:A(n.line_width)},...n.text&&n.geometry!=="line"?{fileText:{...n.text}}:{},...n.geometry==="line"?{}:{text:{paragraphs:paragraphsOfWords(l(`${s}.${c}.${e}`)).map(d=>n.text?.align===void 0?{alignment:j.alignment,...d}:d),style:H(ne(x,R(ee)),n.text),own:L(R(ee)),empty:!1}},sources:{...a,fill:{from:"slide",path:`${f}.fill`}}};if(n.component!==void 0){const d=U(n.component,n.props,b);return d?{..._,kind:"component",component:d,sources:a}:void 0}},F=(e,n,f)=>{if(n.frame&&(e.frame=oe(n.frame),e.sources.frame={from:"slide",path:`${f}.frame`}),n.text&&e.text&&(e.text.style=H(e.text.style,n.text),e.fileText={...n.text},e.sources.text={from:"slide",path:`${f}.text`}),n.line!==void 0&&(e.line=W(n.line),e.sources.line={from:"slide",path:`${f}.line`}),n.line_width!==void 0&&(e.line_width=A(n.line_width)),n.line_dash!==void 0&&(e.line_dash=n.line_dash),n.line_begin!==void 0&&(e.line_begin=n.line_begin),n.line_end!==void 0&&(e.line_end=n.line_end),n.fill!==void 0&&(e.fill=colorOfFile(n.fill),e.sources.fill={from:"slide",path:`${f}.fill`}),(n.picture!==void 0||n.movie!==void 0)&&(e.placeholder?.type==="pic"||e.placeholder?.type==="media"||e.placeholder?.type==="obj")){const c=re(n.crop);e.kind=n.picture!==void 0?"picture":"movie",e.media={path:joinPath($,n.picture??n.movie??""),...c?{crop:c}:{},...n.poster===void 0?{}:{poster:n.poster}},delete e.text}},C=(e,n,f,c,x)=>{const b=E.get(n);if(!b){r.push({slide:e,path:`slides.${String(f)}.layout`,message:`Slide ${e} is on the layout "${n}", which slides.ts does not have (it has ${[...E.keys()].join(", ")||"none"}).`});return}const{layout:S,master:a}=b,_=[...(S.display_master_shapes===!1?[]:a.shapes).filter(d=>d.kind!=="placeholder").map(d=>T(d,"master",a)),...S.shapes.filter(d=>d.kind!=="placeholder").map(d=>T(d,"layout",a))],u=S.shapes.filter(d=>d.kind==="placeholder").map((d,h)=>({shape:z(d,a),order:h}));return{slide:{id:e,layout:S.name,master:a.name,hidden:c,background:S.background??a.background,shapes:_,animations:[],file:{index:f,...x===void 0?{}:{generate:x}}},placed:u,master:a}},G=(e,n,f,c,x,b,S,a,_)=>{const u=new Set(f.map(h=>h.shape.name));let d=f.length;for(const[h,i]of Object.entries(c??{})){const p=b(h);if(p===void 0)continue;const y=`${x}.shapes.${h}`,g=i.textbox!==void 0||i.geometry!==void 0||i.path!==void 0||i.table!==void 0||i.chart!==void 0||i.component!==void 0||(i.picture!==void 0||i.movie!==void 0)&&!u.has(p),w=f.find(X=>X.shape.name===p);if(w&&!g){F(w.shape,i,y),i.z!==void 0&&(w.z=i.z);continue}if(w){r.push({slide:e.id,shape:p,path:y,message:`Slide ${e.id} has a ${w.shape.kind} ${p} already: a shape of its own needs another name.`});continue}if(!g){r.push({slide:e.id,shape:p,path:y,message:`Slide ${e.id} has no shape ${p} to change (its layout's placeholders and its own shapes are ${[...u].join(", ")||"none"}).`});continue}const k=M(p,i,y,e.id,n);k&&(f.push({shape:k,order:d++,...i.z===void 0?{}:{z:i.z}}),u.add(p))}f.sort((h,i)=>(h.z??0)-(i.z??0)||h.order-i.order);for(const h of f){const i=h.shape.text;if(h.shape.kind==="placeholder"&&i){const p=S(h.shape);i.paragraphs=paragraphsOfWords(p,0,O.fonts.code),i.empty=i.paragraphs.length===0||i.paragraphs.every(y=>y.runs.every(g=>g.text===""))}}e.shapes.push(...f.map(h=>h.shape)),a!==void 0&&a.trim()!==""&&(e.notes=a);for(const[h,i]of(_??[]).entries()){const p=b(i.shape);if(p===void 0)continue;const y={slide:e.id,shape:p,path:`${x}.animations.${String(h)}`},g=e.shapes.find(k=>k.name===p&&k.level==="slide");if(!g){r.push({...y,message:`Slide ${e.id} has no shape ${p} to animate (it has ${e.shapes.filter(k=>k.level==="slide").map(k=>k.name).join(", ")}).`});continue}if(i.paragraph!==void 0&&i.paragraph>=(g.text?.paragraphs.length??0)){r.push({...y,message:`Shape ${p} has no paragraph ${String(i.paragraph)} to animate (it has ${String(g.text?.paragraphs.length??0)}).`});continue}const w=ue({...i,shape:p});w?e.animations.push(w):r.push({...y,message:`The animation of ${p} needs a path that starts with M and says only M, L and C, absolute.`})}},Y=new Set;return m.slides.forEach((e,n)=>{const f=`slides.${String(n)}`;if(e.layout!==void 0){const a=C(e.id,e.layout,n,e.hidden===!0);if(!a)return;const _=l(`${s}.${e.id}.notes`);e.transition&&(a.slide.transition=J(e.transition)),G(a.slide,a.master,a.placed,e.shapes,f,u=>u,u=>l(`${s}.${e.id}.${u.name}`),typeof _=="string"?_:void 0,e.animations),v.push(a.slide),Y.add(e.id);return}const c=e.generate??"",x=o.generators[c];if(!x){r.push({slide:e.id,path:`${f}.generate`,message:`There is no generator ${c} in slides.ts (it has ${Object.keys(o.generators).join(", ")||"none"}).`});return}let b;try{b=x.make({data:t.data??(()=>{throw new Error("No data here.")})})}catch(a){r.push({slide:e.id,path:`${f}.generate`,message:`Generator ${c} failed: ${a instanceof Error?a.message:String(a)}`});return}const S=new Set(Array.isArray(e.hidden)?e.hidden:[]);for(const a of b){const _=`${e.id}/${a.id}`,u=C(_,a.layout,n,S.has(a.id),c);if(!u)continue;for(const i of a.shapes){const p=i.placeholder?u.placed.find(y=>y.shape.placeholder?.idx===i.placeholder?.idx):void 0;if(p)i.frame&&(p.shape.frame={...i.frame}),p.shape.sources.frame={from:"code"};else{const y=T(i,"layout",u.master);u.placed.push({shape:{...y,level:"slide",sources:{frame:{from:"code"}}},order:u.placed.length})}}const d=`${a.id}/`,h=a.transition??(a===b[0]?e.transition:void 0);h&&(u.slide.transition=J(h)),G(u.slide,u.master,u.placed,e.shapes,f,i=>i.startsWith(d)?i.slice(d.length):void 0,i=>{const p=i.placeholder===void 0?void 0:a.text[i.placeholder.idx];return p===void 0?void 0:p.map(y=>y.runs.map(g=>g.text).join(""))},a.notes,[...(a.animations??[]).map(i=>({...i,shape:`${d}${i.shape}`})),...e.animations??[]]);for(const i of u.slide.shapes){const p=i.placeholder===void 0?void 0:a.text[i.placeholder.idx];p&&i.text&&(i.text.paragraphs=p,i.text.empty=!1)}v.push(u.slide),Y.add(_)}for(const a of Object.keys(e.shapes??{})){const[_]=a.split("/");_!==void 0&&!b.some(u=>u.id===_)&&r.push({slide:e.id,path:`${f}.shapes.${a}`,message:`Generator ${c} makes no slide ${_}: ${a} changes nothing.`})}}),{deck:{width:o.slide_width,height:o.slide_height,theme:O,slides:v},problems:r}}
2
+ import{readMarks as fe,markRuns as ce}from"@allyhub-next/video-core";import{chartOfFile as ue}from"./chart-file.js";import{AUTOSHAPE_STYLE as j,SHADOW_DEFAULTS as C,CONNECTOR_STYLE as V,DRAWN_TEXTBOX_FRAME as Z,TEXT_FALLBACK as q,TEXT_INSETS as P,placeholderFrame as pe,styleKindOf as he}from"./office.js";import{resolveAnimation as me,resolveTransition as J}from"./animation.js";import{pathSteps as ge}from"./path.js";import{masterPlaceholder as _e}from"./placeholders.js";import{DECK_FONTS as ye,OFFICE_THEME as be,themeOver as xe}from"./theme.js";import{Pt as v}from"./units.js";export function joinPath(i,t){if(t.startsWith("/"))return t.slice(1);const c=i===""?[]:i.split("/");for(const a of t.split("/"))a===""||a==="."||(a===".."?c.pop():c.push(a));return c.join("/")}const Q={left:0,top:0,width:0,height:0},L=()=>Array.from({length:9},()=>({...q,font:{...q.font},margin_left:0}));export function levelsOver(i,...t){return i.map((c,a)=>{let d={...c,font:{...c.font}};for(const y of t){const o=y?.[a];o&&(d={...d,...o.alignment===void 0?{}:{alignment:o.alignment},...o.line_spacing===void 0?{}:{line_spacing:o.line_spacing},...o.space_before===void 0?{}:{space_before:o.space_before},...o.space_after===void 0?{}:{space_after:o.space_after},...o.margin_left===void 0?{}:{margin_left:o.margin_left},...o.indent===void 0?{}:{indent:o.indent},font:{...d.font,...o.font}},o.font?.color!==void 0&&delete d.font.rgb,o.font?.rgb!==void 0&&delete d.font.color,o.numbered!==void 0&&(d.numbered=o.numbered,delete d.bullet),o.bullet===null?(delete d.bullet,delete d.numbered):o.bullet!==void 0?(delete d.numbered,d.bullet={char:o.bullet,...o.bullet_font===void 0?{}:{font:o.bullet_font}}):o.bullet_font!==void 0&&d.bullet&&(d.bullet={...d.bullet,font:o.bullet_font}))}return d})}function B(i,...t){const c=t.filter(d=>d!==void 0),a=d=>{for(let y=c.length-1;y>=0;y--){const o=c[y]?.[d];if(o!==void 0)return o}};return{vertical_anchor:a("vertical_anchor")??i.vertical_anchor,auto_size:a("auto_size")??i.auto_size,word_wrap:a("word_wrap")??i.word_wrap,margins:{left:a("margin_left")??P.left,top:a("margin_top")??P.top,right:a("margin_right")??P.right,bottom:a("margin_bottom")??P.bottom}}}const ee={vertical_anchor:"t",auto_size:"none",word_wrap:!0};export const plainLevels=i=>levelsOver(L(),i.text_styles.other);function G(i,t){return{...B(ee,t),levels:levelsOver(L(),i.text_styles.other,t.levels)}}function $e(i,t,...c){return{...B(pe(t),...c),levels:levelsOver(L(),i.text_styles[he(t)],...c.map(a=>a?.levels))}}const we=Array.from({length:9},()=>({font:{color:j.font_color}})),ne={vertical_anchor:j.vertical_anchor};function te(i,t){return{...B(ee,t),levels:levelsOver(L(),i.text_styles.other,we,t.levels)}}const R=i=>{const t={...i};return delete t.paragraphs,t},D=i=>({paragraphs:[],levels:[],...i}),W=i=>i==="none"?null:colorOfFile(i),ke=/<span((?:\s+(?:color|font|link|highlight|baseline|strike)="[^"\n]*")+)\s*>(.*?)<\/span>/gu,Se=/(color|font|link|highlight|baseline|strike)="([^"\n]*)"/gu,U=57344,ve=256,ie="",Ae=/[\ue000-\ue100]|[^\ue000-\ue100]+/gu;export const colorOfFile=i=>i.startsWith("#")?{rgb:i.toUpperCase()}:i;function oe(i){const{shadow:t,gradient:c}=i;return{...i.fill_transparency===void 0?{}:{fill_transparency:i.fill_transparency},...c?{gradient:{angle:c.angle??0,stops:c.stops.map(a=>({at:a.at,color:colorOfFile(a.color),...a.transparency===void 0?{}:{transparency:a.transparency}}))}}:{},...t?{shadow:{color:t.color===void 0?C.color:colorOfFile(t.color),blur:t.blur===void 0?C.blur:v(t.blur),distance:t.distance===void 0?C.distance:v(t.distance),angle:t.angle??C.angle,transparency:t.transparency??C.transparency}}:{}}}function re(i,t,c=[]){return{...i,rows:i.rows.map((a,d)=>({height:a.height,cells:a.cells.map(y=>{const o=c[d];return{...y,text:{paragraphs:y.text.paragraphs,style:H({...G(t,y.text),auto_size:"shape"},o),own:R(y.text),empty:!1},...o?{fileText:o}:{}}})}))}}function H(i,t){return t?{...i,levels:i.levels.map(c=>{const a={...c.font,...t.size===void 0?{}:{size:v(t.size)},...t.bold===void 0?{}:{bold:t.bold},...t.italic===void 0?{}:{italic:t.italic},...t.font===void 0?{}:{name:t.font}};if(t.color!==void 0){const o=colorOfFile(t.color);typeof o=="string"?(a.color=o,delete a.rgb):(a.rgb=o.rgb,delete a.color)}const{bullet:d,...y}=c;return t.numbered?{...y,font:a,numbered:t.numbered,...c.margin_left===0?{margin_left:ae,indent:-ae}:{},...t.align===void 0?{}:{alignment:t.align}}:{...y,...d?{bullet:d}:{},font:a,...t.align===void 0?{}:{alignment:t.align}}})}:i}function Oe(i){const t={};for(const[,c,a=""]of i.matchAll(Se))if(c==="font")t.name=a.trim();else if(c==="link")t.link=a.trim();else if(c==="highlight")t.highlight=a.trim().toUpperCase();else if(c==="strike")t.strike=a.trim()!=="false";else if(c==="baseline"){const d=Number(a);Number.isFinite(d)&&(t.baseline=d)}else{const d=colorOfFile(a);typeof d=="string"?t.color=d:t.rgb=d.rgb}return t}const ae=342900;export function paragraphsOfWords(i,t=0,c=ye.code){return i===void 0?[]:typeof i=="string"?i.split(/\r?\n/u).map(a=>{const d=[],y=a.replace(ke,(A,T,N)=>(d.push(Oe(T)),`${String.fromCharCode(U+d.length-1)}${N}${ie}`)),o=fe(y);let O;const E=ce(o.text,o.marks).flatMap(A=>{const T=A.kinds.includes("code"),N={...A.kinds.includes("strong")?{bold:!0}:{},...A.kinds.includes("em")?{italic:!0}:{},...T?{name:c}:{}};return[...A.text.matchAll(Ae)].flatMap(X=>{const F=X[0],z=F.charCodeAt(0);if(F===ie)return O=void 0,[];if(z>=U&&z<U+ve)return O=d[z-U],[];const M={...O,...N};return[{text:F,...Object.keys(M).length>0?{font:M}:{},...T?{code:!0}:{}}]})});return{runs:E.length>0?E:[{text:""}],level:t}}):i.flatMap(a=>paragraphsOfWords(a,Array.isArray(a)?Math.min(t+1,8):t,c))}const le=i=>({left:v(i.x),top:v(i.y),width:v(i.w),height:v(i.h)}),de=i=>i===void 0?void 0:{left:i.left??0,top:i.top??0,right:i.right??0,bottom:i.bottom??0};export function resolveDeck(i){const{def:t,file:c,words:a,prefix:d,base:y}=i,o=[],O=xe(i.theme??be,t.theme),E=new Map;for(const e of t.masters)for(const n of e.layouts)E.set(n.name,{layout:n,master:e});const A=[],T=(e,n,s)=>({name:e.name,kind:e.kind,frame:{...e.frame??Q},...e.flip?{flip:{...e.flip}}:{},...e.rotation===void 0?{}:{rotation:e.rotation},level:n,...e.text?{text:{paragraphs:e.text.paragraphs,style:e.kind==="autoshape"?te(s,e.text):G(s,e.text),own:R(e.text),empty:!1}}:{},...e.fill===void 0?{}:{fill:e.fill},...e.fill_transparency===void 0?{}:{fill_transparency:e.fill_transparency},...e.gradient?{gradient:e.gradient}:{},...e.shadow?{shadow:e.shadow}:{},...e.line===void 0?{}:{line:e.line},...e.line_width===void 0?{}:{line_width:e.line_width},...e.line_dash===void 0?{}:{line_dash:e.line_dash},...e.line_begin===void 0?{}:{line_begin:e.line_begin},...e.line_end===void 0?{}:{line_end:e.line_end},...e.path?{path:e.path}:{},...e.table?{table:re(e.table,s)}:{},...e.chart?{chart:e.chart}:{},...e.group===void 0?{}:{group:e.group},...e.geometry?{geometry:e.geometry}:{},...e.adjustments?{adjustments:[...e.adjustments]}:{},...e.media?{media:{path:joinPath(e.media.base,e.media.path),...e.media.poster===void 0?{}:{poster:e.media.poster}}}:{},...e.component?{component:{...e.component}}:{},sources:{frame:{from:n}}}),N=(e,n)=>{const s=e.placeholder?.type??"body",h=_e(n,s),x=e.frame??h?.frame??Q;return{name:e.name,kind:"placeholder",frame:{...x},level:"slide",...e.placeholder?{placeholder:{...e.placeholder}}:{},text:{paragraphs:[],style:$e(n,s,h?.text,e.text),empty:!0},...e.fill===void 0?{}:{fill:e.fill},...e.line===void 0?{}:{line:e.line},sources:{frame:{from:e.frame||!h?"layout":"master"},text:{from:"layout"}}}},X=(e,n,s)=>{const h=t.components[e];if(!h){o.push({...s,message:`There is no component ${e} in slides.ts (it has ${Object.keys(t.components).join(", ")||"none"}).`});return}for(const x of Object.keys(n??{}))Object.hasOwn(h.props,x)||o.push({...s,message:`Component ${e} has no prop ${x} a person sets (it has ${Object.keys(h.props).join(", ")||"none"}).`});return{name:e,props:{...n??{}}}},F=(e,n,s,h,x)=>{const $={slide:h,shape:e,path:s};if(!n.frame){o.push({...$,message:`Shape ${e} is the slide's own: it needs a frame { x, y, w, h } in points.`});return}const S=le(n.frame),l={frame:{from:"slide",path:`${s}.frame`}},_={name:e,frame:S,level:"slide",...n.fill===void 0?{}:{fill:colorOfFile(n.fill)},...oe(n),...n.line===void 0?{}:{line:W(n.line)},...n.line_dash===void 0?{}:{line_dash:n.line_dash},...n.line_begin===void 0?{}:{line_begin:n.line_begin},...n.line_end===void 0?{}:{line_end:n.line_end},...n.group===void 0?{}:{group:n.group}};if(n.textbox)return{..._,kind:"textbox",text:{paragraphs:paragraphsOfWords(a(`${d}.${h}.${e}`),0,O.fonts.code),style:H(G(x,D(Z)),n.text),own:R(D(Z)),empty:!1},...n.text?{fileText:{...n.text}}:{},sources:{...l,text:{from:"slide",path:`${s}.text`}}};if(n.picture!==void 0){const f=de(n.crop);return{..._,kind:"picture",media:{path:joinPath(y,n.picture),...f?{crop:f}:{}},sources:l}}if(n.movie!==void 0)return{..._,kind:"movie",media:{path:joinPath(y,n.movie),...n.poster===void 0?{}:{poster:n.poster}},sources:l};if(n.chart){const f=a(`${d}.${h}.${e}`),m=ue(n.chart,{title:typeof f=="string"?f:void 0,base:y,rows:r=>i.data?.(r),problem:r=>{o.push({...$,message:`Chart ${e}: ${r}`})}});return m?{..._,kind:"chart",chart:m,sources:l}:void 0}if(n.table){const f=n.table,m=S.width/f.columns.reduce((g,w)=>g+w,0),r=S.height/f.rows.reduce((g,w)=>g+w.height,0),u=a(`${d}.${h}.${e}`),b=Array.isArray(u)?u:[];return b.length>f.rows.length&&o.push({...$,message:`Table ${e} has ${String(f.rows.length)} rows and its words ${String(b.length)}.`}),{..._,kind:"table",table:re({columns:f.columns.map(g=>Math.round(g*m)),rows:f.rows.map((g,w)=>{const k=b[w],K=Array.isArray(k)?k:k===void 0?[]:[k];return{height:Math.round(g.height*r),cells:f.columns.map((Te,se)=>({text:{levels:[],paragraphs:paragraphsOfWords(K[se],0,O.fonts.code)},...g.fill===void 0?{}:{fill:colorOfFile(g.fill)},...g.line===void 0?{}:{borders:{bottom:{color:colorOfFile(g.line),width:v(1)}}}}))}})},x,f.rows.map(g=>g.text)),sources:l}}const p=n.path&&ge(n.path.d);if(n.path&&!p){o.push({...$,message:`Shape ${e}'s path starts with M and says only M, L, C and Z, absolute.`});return}if(n.geometry!==void 0||n.path&&p)return{..._,kind:"autoshape",...n.path&&p?{path:{w:n.path.w,h:n.path.h,steps:p}}:n.geometry===void 0?{}:{geometry:n.geometry},...n.geometry==="line"?{line:n.line===void 0?V.line:W(n.line),line_width:n.line_width===void 0?V.line_width:v(n.line_width)}:{fill:n.fill===void 0?j.fill:colorOfFile(n.fill),line:n.line===void 0?j.line:W(n.line),line_width:n.line_width===void 0?j.line_width:v(n.line_width)},...n.text&&n.geometry!=="line"?{fileText:{...n.text}}:{},...n.geometry==="line"?{}:{text:{paragraphs:paragraphsOfWords(a(`${d}.${h}.${e}`)).map(f=>n.text?.align===void 0?{alignment:j.alignment,...f}:f),style:H(te(x,D(ne)),n.text),own:R(D(ne)),empty:!1}},sources:{...l,fill:{from:"slide",path:`${s}.fill`}}};if(n.component!==void 0){const f=X(n.component,n.props,$);return f?{..._,kind:"component",component:f,sources:l}:void 0}},z=(e,n,s)=>{if(n.frame&&(e.frame=le(n.frame),e.sources.frame={from:"slide",path:`${s}.frame`}),n.text&&e.text&&(e.text.style=H(e.text.style,n.text),e.fileText={...n.text},e.sources.text={from:"slide",path:`${s}.text`}),n.line!==void 0&&(e.line=W(n.line),e.sources.line={from:"slide",path:`${s}.line`}),n.line_width!==void 0&&(e.line_width=v(n.line_width)),n.line_dash!==void 0&&(e.line_dash=n.line_dash),n.line_begin!==void 0&&(e.line_begin=n.line_begin),n.line_end!==void 0&&(e.line_end=n.line_end),n.fill!==void 0&&(e.fill=colorOfFile(n.fill),e.sources.fill={from:"slide",path:`${s}.fill`}),Object.assign(e,oe(n)),(n.picture!==void 0||n.movie!==void 0)&&(e.placeholder?.type==="pic"||e.placeholder?.type==="media"||e.placeholder?.type==="obj")){const h=de(n.crop);e.kind=n.picture!==void 0?"picture":"movie",e.media={path:joinPath(y,n.picture??n.movie??""),...h?{crop:h}:{},...n.poster===void 0?{}:{poster:n.poster}},delete e.text}},M=(e,n,s,h,x)=>{const $=E.get(n);if(!$){o.push({slide:e,path:`slides.${String(s)}.layout`,message:`Slide ${e} is on the layout "${n}", which slides.ts does not have (it has ${[...E.keys()].join(", ")||"none"}).`});return}const{layout:S,master:l}=$,_=[...(S.display_master_shapes===!1?[]:l.shapes).filter(f=>f.kind!=="placeholder").map(f=>T(f,"master",l)),...S.shapes.filter(f=>f.kind!=="placeholder").map(f=>T(f,"layout",l))],p=S.shapes.filter(f=>f.kind==="placeholder").map((f,m)=>({shape:N(f,l),order:m}));return{slide:{id:e,layout:S.name,master:l.name,hidden:h,background:S.background??l.background,shapes:_,animations:[],file:{index:s,...x===void 0?{}:{generate:x}}},placed:p,master:l}},Y=(e,n,s,h,x,$,S,l,_)=>{const p=new Set(s.map(m=>m.shape.name));let f=s.length;for(const[m,r]of Object.entries(h??{})){const u=$(m);if(u===void 0)continue;const b=`${x}.shapes.${m}`,g=r.textbox!==void 0||r.geometry!==void 0||r.path!==void 0||r.table!==void 0||r.chart!==void 0||r.component!==void 0||(r.picture!==void 0||r.movie!==void 0)&&!p.has(u),w=s.find(K=>K.shape.name===u);if(w&&!g){z(w.shape,r,b),r.z!==void 0&&(w.z=r.z);continue}if(w){o.push({slide:e.id,shape:u,path:b,message:`Slide ${e.id} has a ${w.shape.kind} ${u} already: a shape of its own needs another name.`});continue}if(!g){o.push({slide:e.id,shape:u,path:b,message:`Slide ${e.id} has no shape ${u} to change (its layout's placeholders and its own shapes are ${[...p].join(", ")||"none"}).`});continue}const k=F(u,r,b,e.id,n);k&&(s.push({shape:k,order:f++,...r.z===void 0?{}:{z:r.z}}),p.add(u))}s.sort((m,r)=>(m.z??0)-(r.z??0)||m.order-r.order);for(const m of s){const r=m.shape.text;if(m.shape.kind==="placeholder"&&r){const u=S(m.shape);r.paragraphs=paragraphsOfWords(u,0,O.fonts.code),r.empty=r.paragraphs.length===0||r.paragraphs.every(b=>b.runs.every(g=>g.text===""))}}e.shapes.push(...s.map(m=>m.shape)),l!==void 0&&l.trim()!==""&&(e.notes=l);for(const[m,r]of(_??[]).entries()){const u=$(r.shape);if(u===void 0)continue;const b={slide:e.id,shape:u,path:`${x}.animations.${String(m)}`},g=e.shapes.find(k=>k.name===u&&k.level==="slide");if(!g){o.push({...b,message:`Slide ${e.id} has no shape ${u} to animate (it has ${e.shapes.filter(k=>k.level==="slide").map(k=>k.name).join(", ")}).`});continue}if(r.paragraph!==void 0&&r.paragraph>=(g.text?.paragraphs.length??0)){o.push({...b,message:`Shape ${u} has no paragraph ${String(r.paragraph)} to animate (it has ${String(g.text?.paragraphs.length??0)}).`});continue}const w=me({...r,shape:u});w?e.animations.push(w):o.push({...b,message:`The animation of ${u} needs a path that starts with M and says only M, L and C, absolute.`})}},I=new Set;return c.slides.forEach((e,n)=>{const s=`slides.${String(n)}`;if(e.layout!==void 0){const l=M(e.id,e.layout,n,e.hidden===!0);if(!l)return;const _=a(`${d}.${e.id}.notes`);e.transition&&(l.slide.transition=J(e.transition)),Y(l.slide,l.master,l.placed,e.shapes,s,p=>p,p=>a(`${d}.${e.id}.${p.name}`),typeof _=="string"?_:void 0,e.animations),A.push(l.slide),I.add(e.id);return}const h=e.generate??"",x=t.generators[h];if(!x){o.push({slide:e.id,path:`${s}.generate`,message:`There is no generator ${h} in slides.ts (it has ${Object.keys(t.generators).join(", ")||"none"}).`});return}let $;try{$=x.make({data:i.data??(()=>{throw new Error("No data here.")})})}catch(l){o.push({slide:e.id,path:`${s}.generate`,message:`Generator ${h} failed: ${l instanceof Error?l.message:String(l)}`});return}const S=new Set(Array.isArray(e.hidden)?e.hidden:[]);for(const l of $){const _=`${e.id}/${l.id}`,p=M(_,l.layout,n,S.has(l.id),h);if(!p)continue;for(const r of l.shapes){const u=r.placeholder?p.placed.find(b=>b.shape.placeholder?.idx===r.placeholder?.idx):void 0;if(u)r.frame&&(u.shape.frame={...r.frame}),u.shape.sources.frame={from:"code"};else{const b=T(r,"layout",p.master);p.placed.push({shape:{...b,level:"slide",sources:{frame:{from:"code"}}},order:p.placed.length})}}const f=`${l.id}/`,m=l.transition??(l===$[0]?e.transition:void 0);m&&(p.slide.transition=J(m)),Y(p.slide,p.master,p.placed,e.shapes,s,r=>r.startsWith(f)?r.slice(f.length):void 0,r=>{const u=r.placeholder===void 0?void 0:l.text[r.placeholder.idx];return u===void 0?void 0:u.map(b=>b.runs.map(g=>g.text).join(""))},l.notes,[...(l.animations??[]).map(r=>({...r,shape:`${f}${r.shape}`})),...e.animations??[]]);for(const r of p.slide.shapes){const u=r.placeholder===void 0?void 0:l.text[r.placeholder.idx];u&&r.text&&(r.text.paragraphs=u,r.text.empty=!1)}A.push(p.slide),I.add(_)}for(const l of Object.keys(e.shapes??{})){const[_]=l.split("/");_!==void 0&&!$.some(p=>p.id===_)&&o.push({slide:e.id,path:`${s}.shapes.${l}`,message:`Generator ${h} makes no slide ${_}: ${l} changes nothing.`})}}),A.forEach((e,n)=>{for(const s of e.shapes)s.placeholder?.type==="sldNum"&&s.text&&(s.text.paragraphs=[{level:0,runs:[{text:String(n+1),field:"slidenum"}]}],s.text.empty=!1)}),{deck:{width:t.slide_width,height:t.slide_height,theme:O,slides:A},problems:o}}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allyhub-next/slides-core",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,2 +1,2 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- import{zipSync as g}from"fflate";import{chartSpaceXml as w,EMU_PER_PT as c}from"@allyhub-next/slides-core";import{el as x,esc as u,HEAD as T}from"./xml.js";const l=t=>t<26?String.fromCharCode(65+t):l(Math.floor(t/26)-1)+String.fromCharCode(65+t%26);export function chartXml(t,s,i){const a=t.categories.length,r=e=>l(e+1);return w(t,{refs:{name:e=>`Sheet1!$${r(e)}$1`,categories:`Sheet1!$A$2:$A$${String(a+1)}`,values:e=>`Sheet1!$${r(e)}$2:$${r(e)}$${String(a+1)}`},frame:{width:s.width/c,height:s.height/c},tail:x("c:externalData",{"r:id":i},x("c:autoUpdate",{val:0}))})}const $="http://schemas.openxmlformats.org/spreadsheetml/2006/main",h="http://schemas.openxmlformats.org/officeDocument/2006/relationships",S=new Date(1980,0,1);export function chartBook(t){const s=(o,n)=>`<c r="${o}" t="inlineStr"><is><t>${u(n)}</t></is></c>`,i=[s("A1",""),...t.series.map((o,n)=>s(`${l(n+1)}1`,o.name))].join(""),a=t.categories.map((o,n)=>{const m=String(n+2),d=t.series.map((f,k)=>{const p=f.values[n];return p==null?"":`<c r="${l(k+1)}${m}"><v>${String(p)}</v></c>`});return`<row r="${m}">${s(`A${m}`,o)}${d.join("")}</row>`}),r=new TextEncoder,e=o=>[r.encode(T+o),{mtime:S}];return g({"[Content_Types].xml":e('<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/><Default Extension="xml" ContentType="application/xml"/><Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/><Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/></Types>'),"_rels/.rels":e(`<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="${h}/officeDocument" Target="xl/workbook.xml"/></Relationships>`),"xl/workbook.xml":e(`<workbook xmlns="${$}" xmlns:r="${h}"><sheets><sheet name="Sheet1" sheetId="1" r:id="rId1"/></sheets></workbook>`),"xl/_rels/workbook.xml.rels":e(`<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="${h}/worksheet" Target="worksheets/sheet1.xml"/></Relationships>`),"xl/worksheets/sheet1.xml":e(`<worksheet xmlns="${$}"><sheetData><row r="1">${i}</row>${a.join("")}</sheetData></worksheet>`)})}
2
+ import{zipSync as T}from"fflate";import{chartSpaceXml as y,EMU_PER_PT as k,isScatter as w}from"@allyhub-next/slides-core";import{el as S,esc as E,HEAD as C}from"./xml.js";const n=t=>t<26?String.fromCharCode(65+t):n(Math.floor(t/26)-1)+String.fromCharCode(65+t%26);export function chartXml(t,r,m){const c=t.categories.length,i=e=>n(e+1),f=w(t.type),p=(e,h)=>{const a=String((t.series[e]?.values.length??0)+1);return`Sheet1!$${n(e*2+h)}$2:$${n(e*2+h)}$${a}`};return y(t,{refs:f?{name:e=>`Sheet1!$${n(e*2+1)}$1`,categories:void 0,values:e=>p(e,1),x:e=>p(e,0)}:{name:e=>`Sheet1!$${i(e)}$1`,categories:`Sheet1!$A$2:$A$${String(c+1)}`,values:e=>`Sheet1!$${i(e)}$2:$${i(e)}$${String(c+1)}`},frame:{width:r.width/k,height:r.height/k},tail:S("c:externalData",{"r:id":m},S("c:autoUpdate",{val:0}))})}const v="http://schemas.openxmlformats.org/spreadsheetml/2006/main",u="http://schemas.openxmlformats.org/officeDocument/2006/relationships",D=new Date(1980,0,1);export function chartBook(t){const r=(s,o)=>`<c r="${s}" t="inlineStr"><is><t>${E(o)}</t></is></c>`,m=w(t.type),c=(m?t.series.flatMap((s,o)=>[r(`${n(o*2)}1`,"X"),r(`${n(o*2+1)}1`,s.name)]):[r("A1",""),...t.series.map((s,o)=>r(`${n(o+1)}1`,s.name))]).join(""),i=(s,o)=>o==null?"":`<c r="${s}"><v>${String(o)}</v></c>`,f=Math.max(0,...t.series.map(s=>s.values.length)),p=Array.from({length:f},(s,o)=>{const l=String(o+2),d=t.series.flatMap(($,x)=>[i(`${n(x*2)}${l}`,$.x?.[o]),i(`${n(x*2+1)}${l}`,$.values[o])]);return`<row r="${l}">${d.join("")}</row>`}),e=t.categories.map((s,o)=>{const l=String(o+2),d=t.series.map(($,x)=>{const g=$.values[o];return g==null?"":`<c r="${n(x+1)}${l}"><v>${String(g)}</v></c>`});return`<row r="${l}">${r(`A${l}`,s)}${d.join("")}</row>`}),h=new TextEncoder,a=s=>[h.encode(C+s),{mtime:D}];return T({"[Content_Types].xml":a('<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/><Default Extension="xml" ContentType="application/xml"/><Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/><Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/></Types>'),"_rels/.rels":a(`<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="${u}/officeDocument" Target="xl/workbook.xml"/></Relationships>`),"xl/workbook.xml":a(`<workbook xmlns="${v}" xmlns:r="${u}"><sheets><sheet name="Sheet1" sheetId="1" r:id="rId1"/></sheets></workbook>`),"xl/_rels/workbook.xml.rels":a(`<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="${u}/worksheet" Target="worksheets/sheet1.xml"/></Relationships>`),"xl/worksheets/sheet1.xml":a(`<worksheet xmlns="${v}"><sheetData><row r="1">${c}</row>${(m?p:e).join("")}</sheetData></worksheet>`)})}
@@ -1,3 +1,3 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- import{stringify as ee}from"yaml";import{AUTOSHAPE_STYLE as z,CONNECTOR_STYLE as G,NAME_OF_TYPE as U,OFFICE_TEXT_STYLES as fe,pathText as ue,SLIDE_SIZES as ce,DRAWN_TEXTBOX_FRAME as me,TEXT_INSETS as A,TEXTBOX_FRAME as _e,toPt as N}from"@allyhub-next/slides-core";const he={l:"PP_ALIGN.LEFT",ctr:"PP_ALIGN.CENTER",r:"PP_ALIGN.RIGHT",just:"PP_ALIGN.JUSTIFY"},pe={t:"MSO_ANCHOR.TOP",ctr:"MSO_ANCHOR.MIDDLE",b:"MSO_ANCHOR.BOTTOM"},$e={none:"MSO_AUTO_SIZE.NONE",shape:"MSO_AUTO_SIZE.SHAPE_TO_FIT_TEXT",text:"MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE"},ge={title:"TITLE",ctrTitle:"CENTER_TITLE",subTitle:"SUBTITLE",body:"BODY",pic:"PICTURE",media:"MEDIA_CLIP",obj:"OBJECT",dt:"DATE",ftr:"FOOTER",sldNum:"SLIDE_NUMBER"},be={rect:"RECTANGLE",roundRect:"ROUNDED_RECTANGLE",ellipse:"OVAL",triangle:"ISOSCELES_TRIANGLE",rightArrow:"RIGHT_ARROW"},S=e=>`Emu(${String(Math.round(e))})`,R=e=>`Pt(${String(Math.round(e/12700*100)/100)})`,$=e=>JSON.stringify(e);export function nameOf(e,n,o){const a=e.normalize("NFKD").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"").slice(0,40)||o;let f=a;for(let l=2;n.has(f);l++)f=`${a}-${String(l)}`;return n.add(f),f}const I=(e,n)=>typeof n=="string"?`${e}.theme_color = ${$(n)};`:`${e}.rgb = ${$(n.rgb)};`;function ne(e,n){return n?[...n.name===void 0?[]:[`${e}.name = ${$(n.name)};`],...n.size===void 0?[]:[`${e}.size = ${R(n.size)};`],...n.bold===void 0?[]:[`${e}.bold = ${String(n.bold)};`],...n.italic===void 0?[]:[`${e}.italic = ${String(n.italic)};`],...n.spacing===void 0?[]:[`${e}.spacing = ${R(n.spacing)};`],...n.underline===void 0?[]:[`${e}.underline = ${String(n.underline)};`],...n.color!==void 0?[I(`${e}.color`,n.color)]:[],...n.rgb!==void 0?[I(`${e}.color`,{rgb:n.rgb})]:[]]:[]}function J(e,n,o){const a=n.line_spacing;return[...n.alignment===void 0?[]:[`${e}.alignment = ${he[n.alignment]};`],...a===void 0?[]:[`${e}.line_spacing = ${"lines"in a?String(Math.round(a.lines*1e3)/1e3):R(a.fixed)};`],...n.space_before===void 0?[]:[`${e}.space_before = ${R(n.space_before)};`],...n.space_after===void 0?[]:[`${e}.space_after = ${R(n.space_after)};`],...o&&n.bullet!==void 0?[`${e}.bullet = ${n.bullet===null?"null":$(n.bullet)};`]:[],...o&&n.bullet_font!==void 0?[`${e}.bullet_font = ${$(n.bullet_font)};`]:[],...o&&n.margin_left!==void 0?[`${e}.margin_left = ${S(n.margin_left)};`]:[],...o&&n.indent!==void 0?[`${e}.indent = ${S(n.indent)};`]:[],...ne(`${e}.font`,n.font)]}function te(e,n){const o=n??[],a=o[0];if(a&&o.length===9&&Object.keys(a).length>0&&o.every(f=>JSON.stringify(f)===JSON.stringify(a))){const f=J("level",a,!0);return[`for (const level of ${e}) {`,...f.map(l=>` ${l}`),"}"]}return o.flatMap((f,l)=>J(`${e}[${String(l)}]`,f,!0))}const X={textbox:{vertical_anchor:"t",..._e,margin_left:A.left,margin_top:A.top,margin_right:A.right,margin_bottom:A.bottom},autoshape:{vertical_anchor:z.vertical_anchor,word_wrap:!0,auto_size:"none",margin_left:A.left,margin_top:A.top,margin_right:A.right,margin_bottom:A.bottom}},ye={...X.textbox,...me};function B(e,n,o={}){if(!n)return[];const a=m=>n[m]===void 0||n[m]===o[m]?void 0:n[m],f=a("vertical_anchor"),l=a("auto_size"),c=a("word_wrap");return[...f===void 0?[]:[`${e}.vertical_anchor = ${pe[f]};`],...l===void 0?[]:[`${e}.auto_size = ${$e[l]};`],...c===void 0?[]:[`${e}.word_wrap = ${String(c)};`],...["margin_left","margin_top","margin_right","margin_bottom"].flatMap(m=>{const y=a(m);return y===void 0?[]:[`${e}.${m} = ${S(y)};`]}),...te(`${e}.list_style`,n.levels)]}const j=(e,n)=>JSON.stringify(e)===JSON.stringify(n);function ie(e,n,o){return n===void 0||j(n,o)?[]:n===null?[`${e}.fill.background();`]:[`${e}.fill.solid();`,I(`${e}.fill.fore_color`,n)]}function Y(e,n,o){return[...n.line===void 0||j(n.line,o.line)?[]:n.line===null?[`${e}.line.fill.background();`]:[I(`${e}.line.color`,n.line)],...n.line_width===void 0||n.line===null||n.line_width===o.line_width?[]:[`${e}.line.width = ${S(n.line_width)};`],...n.line_dash===void 0?[]:[`${e}.line.dash_style = ${$(n.line_dash)};`],...n.line_begin===void 0?[]:[`${e}.line.begin_arrow = ${$(n.line_begin)};`],...n.line_end===void 0?[]:[`${e}.line.end_arrow = ${$(n.line_end)};`]]}const Z=e=>({...e.line_dash===void 0?{}:{line_dash:e.line_dash},...e.line_begin===void 0?{}:{line_begin:e.line_begin},...e.line_end===void 0?{}:{line_end:e.line_end}});function xe(e,n,o){const a=n.frame??{left:0,top:0,width:0,height:0},f=o.w===0?1:a.width/o.w,l=o.h===0?1:a.height/o.h,c=o.steps.flatMap(r=>r.op==="close"?[]:r.op==="curve"?[[r.x1,r.y1],[r.x2,r.y2],[r.x,r.y]]:[[r.x,r.y]]),m=r=>Math.min(...c.map(_=>_[r]??0)),[y,...i]=o.steps,d=y?.op==="move"?`${String(y.x)}, ${String(y.y)}`:"0, 0",s=(y?.op==="move"?i:o.steps).map(r=>r.op==="close"?".add_line_segments([], true)":r.op==="move"?`.move_to(${String(r.x)}, ${String(r.y)})`:r.op==="line"?`.add_line_segments([[${String(r.x)}, ${String(r.y)}]], false)`:`.add_curve_segment(${[r.x1,r.y1,r.x2,r.y2,r.x,r.y].map(String).join(", ")})`);return`${e}.shapes.build_freeform(${d}, [${String(f)}, ${String(l)}])${s.join("")}.convert_to_shape(${S(a.left-Math.round(m(0)*f))}, ${S(a.top-Math.round(m(1)*l))})`}const W=(e,n)=>n.rotation===void 0?[]:[`${e}.rotation = ${String(Math.round(n.rotation*1e3)/1e3)};`];function Se(e){const n=e.text?.levels??[],o=e.text_color??"dk1";if(e.kind!=="autoshape"||j(o,z.font_color))return n;const a=typeof o=="string"?{color:o}:{rgb:o.rgb};return Array.from({length:9},(f,l)=>{const c=n[l]??{};return c.font?.color!==void 0||c.font?.rgb!==void 0?c:{...c,font:{...c.font,...a}}})}function we(e,n,o){return o.flatMap((a,f)=>{const l=`${e}_p${String(f)}`;return[`const ${l} = ${f===0?`${n}.paragraphs[0]`:`${n}.add_paragraph()`};`,...a.level>0?[`${l}.level = ${String(a.level)};`]:[],...J(l,a,!1),...a.runs.flatMap((c,m)=>c.text==="\v"?[`${l}.add_line_break();`]:c.font?[`const ${l}r${String(m)} = ${l}.add_run();`,`${l}r${String(m)}.text = ${$(c.text)};`,...ne(`${l}r${String(m)}.font`,c.font)]:[`${l}.add_run().text = ${$(c.text)};`])]})}const C=e=>`${S(e.left)}, ${S(e.top)}, ${S(e.width)}, ${S(e.height)}`;class Oe{files=new Map;byPart=new Map;parts;constructor(n){this.parts=n}path(n){const o=this.byPart.get(n);if(o)return o;const a=this.parts[n];if(!a)return;const f=n.split("/").pop()??"file";let l=f;for(let c=2;this.files.has(`media/${l}`);c++)l=`${String(c)}-${f}`;return this.files.set(`media/${l}`,a),this.byPart.set(n,`./media/${l}`),`./media/${l}`}}function oe(e,n,o,a,f){const l=[],c=new Set,m=new Map,y=new Map;return n.forEach((i,d)=>{const s=`${e}_s${String(d)}`;let r=e;if(i.group!==void 0&&(r=y.get(i.group)??`${e}_g${String(y.size)}`,y.has(i.group)||(y.set(i.group,r),l.push(`const ${r} = ${e}.shapes.add_group_shape();`,`${r}.name = ${$(i.group)};`))),i.kind==="placeholder"&&i.placeholder){const u=nameOf(U[i.placeholder.type],c,"placeholder");m.set(i.placeholder.idx,u);const h=B(`${s}.text_frame`,i.text);l.push(`${h.length>0?`const ${s} = `:""}${r}.placeholders.add(PP_PLACEHOLDER.${ge[i.placeholder.type]}${i.frame?`, ${C(i.frame)}`:""}${u===U[i.placeholder.type]?"":`, { name: ${$(u)} }`});`,...h);return}const _=nameOf(i.name,c,i.kind);if(!i.frame){a(`${f}: ${i.name} has no frame of its own`);return}if((i.kind==="picture"||i.kind==="movie")&&i.part){const u=o.path(i.part);if(!u){a(`${f}: ${i.name}'s file is not in the file`);return}i.crop&&Object.values(i.crop).some(h=>h>0)&&a(`${f}: ${i.name}'s crop is not kept on a master or a layout`),l.push(...i.rotation===void 0?[`${r}.shapes.${i.kind==="movie"?"add_movie":"add_picture"}(${$(u)}, ${C(i.frame)}).name = ${$(_)};`]:[`const ${s} = ${r}.shapes.${i.kind==="movie"?"add_movie":"add_picture"}(${$(u)}, ${C(i.frame)});`,`${s}.name = ${$(_)};`,...W(s,i)]);return}if(i.table){a(`${f}: table ${i.name} is left out; a table goes on a slide`);return}if(i.geometry==="line"){const u=i.frame,[h,T]=i.flip?.h?[u.left+u.width,u.left]:[u.left,u.left+u.width],[M,O]=i.flip?.v?[u.top+u.height,u.top]:[u.top,u.top+u.height];l.push(`const ${s} = ${r}.shapes.add_connector(MSO_CONNECTOR.STRAIGHT, ${S(h)}, ${S(M)}, ${S(T)}, ${S(O)});`,`${s}.name = ${$(_)};`,...W(s,i),...Y(s,i,G));return}const g=i.path?xe(r,i,i.path):i.kind==="textbox"?`${r}.shapes.add_textbox(${C(i.frame)})`:`${r}.shapes.add_shape(MSO_SHAPE.${be[i.geometry??"rect"]}, ${C(i.frame)})`;l.push(`const ${s} = ${g};`,`${s}.name = ${$(_)};`,...(i.adjustments??[]).map((u,h)=>`${s}.adjustments[${String(h)}] = ${String(Math.round(u*1e5)/1e5)};`),...W(s,i),...i.kind==="textbox"?[...ie(s,i.fill,null),...Y(s,i,{line:null})]:[...ie(s,i.fill,z.fill),...Y(s,i,z)],...B(`${s}.text_frame`,i.text&&{...i.text,levels:Se(i)},X[i.kind==="textbox"?"textbox":"autoshape"]),...i.text?we(s,`${s}.text_frame`,i.text.paragraphs):[])}),{lines:l,names:m}}export function wordsOf(e,n){const o=i=>i.font?.color??i.font?.rgb,a=e.flatMap(i=>i.runs).filter(i=>i.text!=="\v"),f=new Set(a.map(o)).size>1,l=new Set(a.map(i=>i.font?.name)).size>1,c=i=>i.runs.map(d=>{if(d.text==="\v")return n("a line break inside a paragraph is a space")," ";const s=d.font?.bold===!0,r=d.font?.italic===!0,_=o(d);if(d.text.trim()==="")return d.text;const g=d.font?.name,u=[...f&&_!==void 0?[`color="${_}"`]:[],...l&&g!==void 0?[`font="${g}"`]:[]],h=u.length>0?`<span ${u.join(" ")}>${d.text}</span>`:d.text;return s&&r?`***${h}***`:s?`**${h}**`:r?`*${h}*`:h}).join(""),m=e.filter((i,d)=>d<e.length-1||i.runs.length>0);if(m.length===0)return;if(m.every(i=>i.level===0)){const i=m.map(c);return i.length===1?i[0]:i}const y=(i,d)=>{const s=[];let r=i;for(;r<m.length;){const _=m[r];if(!_||_.level<d)break;if(_.level>d){const[g,u]=y(r,d+1);s.push(g),r=u;continue}s.push(c(_)),r++}return[s,r]};return y(0,0)[0]}function re(e,n){const o=e.flatMap(d=>d.runs.filter(s=>s.text!=="\v"));if(o.length===0)return;const a=d=>{const s=o.map(d),r=s[0];return r!==void 0&&s.every(_=>_===r)?r:void 0},f=a(d=>d.font?.size),l=a(d=>d.font?.color??d.font?.rgb),c=a(d=>d.font?.name),m=e.every(d=>d.alignment===e[0]?.alignment)?e[0]?.alignment:void 0;new Set(o.map(d=>d.font?.size).filter(d=>d!==void 0)).size>1&&n("runs of several sizes take the layout's"),o.some(d=>d.font?.underline!==void 0||d.font?.spacing!==void 0)&&n("a run's own underline or letter spacing is not kept");const i={...f===void 0?{}:{size:N(f)},...l===void 0?{}:{color:l},...c===void 0?{}:{font:c},...m===void 0?{}:{align:m}};return Object.keys(i).length>0?i:void 0}const se=e=>({x:N(e.left),y:N(e.top),w:N(e.width),h:N(e.height)}),v=e=>typeof e=="string"?e:e.rgb,le=e=>({...e.minimum_scale===void 0?{}:{min:e.minimum_scale},...e.maximum_scale===void 0?{}:{max:e.maximum_scale},...e.major_unit===void 0?{}:{major:e.major_unit},...e.has_major_gridlines===void 0?{}:{gridlines:e.has_major_gridlines},...e.visible===void 0?{}:{visible:e.visible},...e.number_format===void 0?{}:{format:e.number_format},...e.reverse_order===void 0?{}:{reverse:e.reverse_order},...e.gridline_color===void 0?{}:{gridline_color:v(e.gridline_color)},...e.line_color===void 0?{}:{line_color:v(e.line_color)}});function Ee(e){const n=e.labels;return{type:e.type,categories:e.categories,series:e.series.map(o=>({name:o.name,values:o.values,...o.color===void 0?{}:{color:v(o.color)},...o.number_format===void 0?{}:{format:o.number_format},...o.smooth===void 0?{}:{smooth:o.smooth},...o.line_width===void 0?{}:{line_width:o.line_width},...o.marker_size===void 0?{}:{marker_size:o.marker_size}})),...e.legend===void 0?{}:{legend:e.legend},...n?{labels:{...n.show_value===void 0?{}:{value:n.show_value},...n.show_percentage===void 0?{}:{percentage:n.show_percentage},...n.show_category_name===void 0?{}:{category:n.show_category_name},...n.show_series_name===void 0?{}:{series:n.show_series_name},...n.number_format===void 0?{}:{format:n.number_format},...n.position===void 0?{}:{position:n.position},...n.size===void 0?{}:{size:n.size},...n.color===void 0?{}:{color:v(n.color)}}}:{},...e.gap_width===void 0?{}:{gap_width:e.gap_width},...e.overlap===void 0?{}:{overlap:e.overlap},...e.vary_by_categories===void 0?{}:{vary_by_categories:e.vary_by_categories},...e.hole_size===void 0?{}:{hole_size:e.hole_size},...e.value_axis?{value_axis:le(e.value_axis)}:{},...e.category_axis?{category_axis:le(e.category_axis)}:{},...e.font_size===void 0?{}:{size:e.font_size},...e.title_size===void 0?{}:{title_size:e.title_size},...e.font_color===void 0?{}:{color:v(e.font_color)}}}const ae=e=>JSON.stringify(e,(n,o)=>o&&typeof o=="object"&&!Array.isArray(o)?Object.fromEntries(Object.entries(o).sort(([a],[f])=>a<f?-1:1)):o);export function importDeck(e,n){const o=[...e.skipped],a=new Oe(e.parts),f=Object.entries(ce).find(([,[s,r]])=>s===e.width&&r===e.height)?.[0],l=[];Object.keys(e.theme).length>0&&l.push(`prs.theme.colors = ${JSON.stringify(e.theme)};`),Object.keys(e.fonts).length>0&&l.push(`prs.theme.fonts = ${JSON.stringify(e.fonts)};`);const c=new Map;e.masters.forEach((s,r)=>{const _=`master${String(r+1)}`;l.push("",`const ${_} = prs.slide_masters.add(${$(s.name)});`),s.background&&l.push(`${_}.background.fill.solid();`,I(`${_}.background.fill.fore_color`,s.background));for(const[g,u]of[["title","title_style"],["body","body_style"],["other","other_style"]]){const h=fe[g],T=s.text_styles[g]?.map((M,O)=>ae(M)===ae(h[O])?{}:M);l.push(...te(`${_}.text_styles.${u}`,T))}l.push(...oe(_,s.shapes,a,g=>o.push(g),`master ${s.name}`).lines),s.layouts.forEach((g,u)=>{const h=`${_}_layout${String(u+1)}`;l.push("",`const ${h} = ${_}.slide_layouts.add(${$(g.name)});`),g.display_master_shapes===!1&&l.push(`${h}.display_master_shapes = false;`),g.background&&l.push(`${h}.background.fill.solid();`,I(`${h}.background.fill.fore_color`,g.background));const T=oe(h,g.shapes,a,M=>o.push(M),`layout ${g.name}`);l.push(...T.lines),c.set(g.name,T.names)})});const m=new Set,y=[],i=[];e.slides.forEach((s,r)=>{const _=`slide ${String(r+1)}`,u=s.shapes.find(t=>t.placeholder?.type==="title"||t.placeholder?.type==="ctrTitle")?.text?.paragraphs.map(t=>t.runs.map(b=>b.text).join("")).join(" ")??"",h=nameOf(u,m,`slide-${String(r+1)}`),T=c.get(s.layout)??new Map,M=new Set(T.values()),O={},P={},H=new Map;for(const t of s.shapes){const b=x=>o.push(`${_}, ${t.name}: ${x}`);if(t.placeholder){const x=T.get(t.placeholder.idx)??[...T.values()].find(p=>p===U[t.placeholder?.type??"body"]);if(!x){b("its layout has no such placeholder; it is left out");continue}H.set(t.name,x);const w={};if(t.frame&&(w.frame=se(t.frame)),t.rotation!==void 0&&b("its rotation is left out"),(t.kind==="picture"||t.kind==="movie")&&t.part){const p=a.path(t.part);p&&(w[t.kind==="movie"?"movie":"picture"]=p)}if(t.text){const p=wordsOf(t.text.paragraphs,b);p!==void 0&&(P[x]=p);const E=re(t.text.paragraphs,b);E&&(w.text=E)}t.fill&&(w.fill=v(t.fill)),Object.keys(w).length>0&&(O[x]=w);continue}const k=nameOf(t.name,M,t.kind);if(H.set(t.name,k),!t.frame){b("it has no frame; it is left out");continue}const L=se(t.frame);if(t.chart){O[k]={chart:Ee(t.chart),frame:L},t.chart.title!==void 0&&(P[k]=t.chart.title);continue}if(t.table){const x=t.table.rows,w=p=>p.every(E=>E===p[0])?p[0]:void 0;O[k]={table:{columns:t.table.columns.map(N),rows:x.map(p=>{const E=w(p.cells.map(D=>D.fill)),Q=w(p.cells.map(D=>D.borders?.bottom?.color));return{height:N(p.height),...E?{fill:v(E)}:{},...Q?{line:v(Q)}:{}}})},frame:L},x.some(p=>p.cells.some(E=>E.spanned))&&b("its merged cells are apart"),P[k]=x.map(p=>p.cells.map(E=>wordsOf(E.text.paragraphs,b)??""));continue}if((t.kind==="picture"||t.kind==="movie")&&t.part){const x=a.path(t.part);if(!x)continue;const w=t.crop&&Object.values(t.crop).some(p=>p>0)?t.crop:void 0;O[k]={[t.kind==="movie"?"movie":"picture"]:x,frame:L,...w?{crop:w}:{}};continue}if(t.geometry==="line"){t.flip&&b("a line from bottom left to top right is drawn the other way"),O[k]={geometry:"line",frame:L,...t.line===void 0||j(t.line,G.line)?{}:{line:t.line===null?"none":v(t.line)},...t.line_width===void 0||t.line_width===G.line_width?{}:{line_width:N(t.line_width)},...Z(t)},t.rotation!==void 0&&b("its rotation is left out");continue}const F=t.kind==="textbox"?{textbox:!0,frame:L}:t.path?{path:{w:t.path.w,h:t.path.h,d:ue(t.path.steps)},frame:L,...Z(t)}:{geometry:t.geometry??"rect",frame:L,...Z(t)},V=t.kind==="textbox"?null:z.fill;t.fill&&!j(t.fill,V)&&(F.fill=v(t.fill)),t.fill===null&&V!==null&&b("it has no fill, and is filled as the basic shape is");const de=t.kind==="textbox"?null:z.line;t.line!==void 0&&!j(t.line,de)&&(F.line=t.line===null?"none":v(t.line)),t.kind!=="textbox"&&t.line!==null&&t.line_width!==void 0&&t.line_width!==z.line_width&&b("its outline's width is the basic shape's"),t.rotation!==void 0&&b("its rotation is left out");const q=B("",t.text&&{...t.text,levels:[]},t.kind==="textbox"?ye:X.autoshape);if(q.length>0&&b(`its text frame (${q.map(x=>x.replace(/^\.(\w+) = .*$/u,"$1")).join(", ")}) is the basic ${t.kind==="textbox"?"text box's":"shape's"}`),t.text){const x=wordsOf(t.text.paragraphs,b);x!==void 0&&(P[k]=x);const w=re(t.text.paragraphs,b);w&&(F.text=w)}O[k]={...F,...t.group?{group:t.group}:{}}}const K=s.animations.flatMap(t=>{const b=H.get(t.shape);return b!==void 0?[{...t,shape:b}]:(o.push(`${_}: an animation of ${t.shape}, which is left out`),[])});y.push({id:h,layout:s.layout,...s.hidden?{hidden:!0}:{},...Object.keys(O).length>0?{shapes:O}:{},...K.length>0?{animations:K}:{},...s.transition?{transition:s.transition}:{}}),i.push({id:h,...Object.keys(P).length>0?{text:P}:{},...s.notes===void 0?{}:{notes:s.notes}})});const d=new Map;d.set("slides.ts",['import { Emu, MSO_ANCHOR, MSO_AUTO_SIZE, MSO_CONNECTOR, MSO_SHAPE, PP_ALIGN, PP_PLACEHOLDER, Pt, presentation } from "@allyhub/sdk/slides";',"",`// ${n.source}, imported by allyhub slides import: its masters and layouts.`,`export default presentation({ size: ${f?$(f):`{ width: ${S(e.width)}, height: ${S(e.height)} }`} }, (prs) => {`,...l.map(s=>s===""?"":` ${s}`),"});",""].join(`
2
+ import{stringify as ee}from"yaml";import{AUTOSHAPE_STYLE as L,CONNECTOR_STYLE as J,MSO_SHAPE as fe,NAME_OF_TYPE as U,OFFICE_TEXT_STYLES as ue,pathText as ce,SLIDE_SIZES as me,DRAWN_TEXTBOX_FRAME as _e,TEXT_INSETS as A,TEXTBOX_FRAME as pe,toPt as N}from"@allyhub-next/slides-core";const he={l:"PP_ALIGN.LEFT",ctr:"PP_ALIGN.CENTER",r:"PP_ALIGN.RIGHT",just:"PP_ALIGN.JUSTIFY"},$e={t:"MSO_ANCHOR.TOP",ctr:"MSO_ANCHOR.MIDDLE",b:"MSO_ANCHOR.BOTTOM"},ge={none:"MSO_AUTO_SIZE.NONE",shape:"MSO_AUTO_SIZE.SHAPE_TO_FIT_TEXT",text:"MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE"},be={title:"TITLE",ctrTitle:"CENTER_TITLE",subTitle:"SUBTITLE",body:"BODY",pic:"PICTURE",media:"MEDIA_CLIP",obj:"OBJECT",dt:"DATE",ftr:"FOOTER",sldNum:"SLIDE_NUMBER"},ye=Object.fromEntries(Object.entries(fe).map(([e,n])=>[n,e])),S=e=>`Emu(${String(Math.round(e))})`,C=e=>`Pt(${String(Math.round(e/12700*100)/100)})`,$=e=>JSON.stringify(e);export function nameOf(e,n,o){const a=e.normalize("NFKD").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"").slice(0,40)||o;let f=a;for(let l=2;n.has(f);l++)f=`${a}-${String(l)}`;return n.add(f),f}const j=(e,n)=>typeof n=="string"?`${e}.theme_color = ${$(n)};`:`${e}.rgb = ${$(n.rgb)};`;function ne(e,n){return n?[...n.name===void 0?[]:[`${e}.name = ${$(n.name)};`],...n.size===void 0?[]:[`${e}.size = ${C(n.size)};`],...n.bold===void 0?[]:[`${e}.bold = ${String(n.bold)};`],...n.italic===void 0?[]:[`${e}.italic = ${String(n.italic)};`],...n.spacing===void 0?[]:[`${e}.spacing = ${C(n.spacing)};`],...n.underline===void 0?[]:[`${e}.underline = ${String(n.underline)};`],...n.color!==void 0?[j(`${e}.color`,n.color)]:[],...n.rgb!==void 0?[j(`${e}.color`,{rgb:n.rgb})]:[]]:[]}function X(e,n,o){const a=n.line_spacing;return[...n.alignment===void 0?[]:[`${e}.alignment = ${he[n.alignment]};`],...a===void 0?[]:[`${e}.line_spacing = ${"lines"in a?String(Math.round(a.lines*1e3)/1e3):C(a.fixed)};`],...n.space_before===void 0?[]:[`${e}.space_before = ${C(n.space_before)};`],...n.space_after===void 0?[]:[`${e}.space_after = ${C(n.space_after)};`],...o&&n.bullet!==void 0?[`${e}.bullet = ${n.bullet===null?"null":$(n.bullet)};`]:[],...o&&n.bullet_font!==void 0?[`${e}.bullet_font = ${$(n.bullet_font)};`]:[],...o&&n.margin_left!==void 0?[`${e}.margin_left = ${S(n.margin_left)};`]:[],...o&&n.indent!==void 0?[`${e}.indent = ${S(n.indent)};`]:[],...ne(`${e}.font`,n.font)]}function te(e,n){const o=n??[],a=o[0];if(a&&o.length===9&&Object.keys(a).length>0&&o.every(f=>JSON.stringify(f)===JSON.stringify(a))){const f=X("level",a,!0);return[`for (const level of ${e}) {`,...f.map(l=>` ${l}`),"}"]}return o.flatMap((f,l)=>X(`${e}[${String(l)}]`,f,!0))}const G={textbox:{vertical_anchor:"t",...pe,margin_left:A.left,margin_top:A.top,margin_right:A.right,margin_bottom:A.bottom},autoshape:{vertical_anchor:L.vertical_anchor,word_wrap:!0,auto_size:"none",margin_left:A.left,margin_top:A.top,margin_right:A.right,margin_bottom:A.bottom}},xe={...G.textbox,..._e};function B(e,n,o={}){if(!n)return[];const a=m=>n[m]===void 0||n[m]===o[m]?void 0:n[m],f=a("vertical_anchor"),l=a("auto_size"),c=a("word_wrap");return[...f===void 0?[]:[`${e}.vertical_anchor = ${$e[f]};`],...l===void 0?[]:[`${e}.auto_size = ${ge[l]};`],...c===void 0?[]:[`${e}.word_wrap = ${String(c)};`],...["margin_left","margin_top","margin_right","margin_bottom"].flatMap(m=>{const y=a(m);return y===void 0?[]:[`${e}.${m} = ${S(y)};`]}),...te(`${e}.list_style`,n.levels)]}const I=(e,n)=>JSON.stringify(e)===JSON.stringify(n);function ie(e,n,o){return n===void 0||I(n,o)?[]:n===null?[`${e}.fill.background();`]:[`${e}.fill.solid();`,j(`${e}.fill.fore_color`,n)]}function Y(e,n,o){return[...n.line===void 0||I(n.line,o.line)?[]:n.line===null?[`${e}.line.fill.background();`]:[j(`${e}.line.color`,n.line)],...n.line_width===void 0||n.line===null||n.line_width===o.line_width?[]:[`${e}.line.width = ${S(n.line_width)};`],...n.line_dash===void 0?[]:[`${e}.line.dash_style = ${$(n.line_dash)};`],...n.line_begin===void 0?[]:[`${e}.line.begin_arrow = ${$(n.line_begin)};`],...n.line_end===void 0?[]:[`${e}.line.end_arrow = ${$(n.line_end)};`]]}const Z=e=>({...e.line_dash===void 0?{}:{line_dash:e.line_dash},...e.line_begin===void 0?{}:{line_begin:e.line_begin},...e.line_end===void 0?{}:{line_end:e.line_end}});function Se(e,n,o){const a=n.frame??{left:0,top:0,width:0,height:0},f=o.w===0?1:a.width/o.w,l=o.h===0?1:a.height/o.h,c=o.steps.flatMap(r=>r.op==="close"?[]:r.op==="curve"?[[r.x1,r.y1],[r.x2,r.y2],[r.x,r.y]]:[[r.x,r.y]]),m=r=>Math.min(...c.map(_=>_[r]??0)),[y,...i]=o.steps,d=y?.op==="move"?`${String(y.x)}, ${String(y.y)}`:"0, 0",s=(y?.op==="move"?i:o.steps).map(r=>r.op==="close"?".add_line_segments([], true)":r.op==="move"?`.move_to(${String(r.x)}, ${String(r.y)})`:r.op==="line"?`.add_line_segments([[${String(r.x)}, ${String(r.y)}]], false)`:`.add_curve_segment(${[r.x1,r.y1,r.x2,r.y2,r.x,r.y].map(String).join(", ")})`);return`${e}.shapes.build_freeform(${d}, [${String(f)}, ${String(l)}])${s.join("")}.convert_to_shape(${S(a.left-Math.round(m(0)*f))}, ${S(a.top-Math.round(m(1)*l))})`}const W=(e,n)=>n.rotation===void 0?[]:[`${e}.rotation = ${String(Math.round(n.rotation*1e3)/1e3)};`];function we(e){const n=e.text?.levels??[],o=e.text_color??"dk1";if(e.kind!=="autoshape"||I(o,L.font_color))return n;const a=typeof o=="string"?{color:o}:{rgb:o.rgb};return Array.from({length:9},(f,l)=>{const c=n[l]??{};return c.font?.color!==void 0||c.font?.rgb!==void 0?c:{...c,font:{...c.font,...a}}})}function Oe(e,n,o){return o.flatMap((a,f)=>{const l=`${e}_p${String(f)}`;return[`const ${l} = ${f===0?`${n}.paragraphs[0]`:`${n}.add_paragraph()`};`,...a.level>0?[`${l}.level = ${String(a.level)};`]:[],...X(l,a,!1),...a.runs.flatMap((c,m)=>c.text==="\v"?[`${l}.add_line_break();`]:c.font?[`const ${l}r${String(m)} = ${l}.add_run();`,`${l}r${String(m)}.text = ${$(c.text)};`,...ne(`${l}r${String(m)}.font`,c.font)]:[`${l}.add_run().text = ${$(c.text)};`])]})}const R=e=>`${S(e.left)}, ${S(e.top)}, ${S(e.width)}, ${S(e.height)}`;class Ee{files=new Map;byPart=new Map;parts;constructor(n){this.parts=n}path(n){const o=this.byPart.get(n);if(o)return o;const a=this.parts[n];if(!a)return;const f=n.split("/").pop()??"file";let l=f;for(let c=2;this.files.has(`media/${l}`);c++)l=`${String(c)}-${f}`;return this.files.set(`media/${l}`,a),this.byPart.set(n,`./media/${l}`),`./media/${l}`}}function oe(e,n,o,a,f){const l=[],c=new Set,m=new Map,y=new Map;return n.forEach((i,d)=>{const s=`${e}_s${String(d)}`;let r=e;if(i.group!==void 0&&(r=y.get(i.group)??`${e}_g${String(y.size)}`,y.has(i.group)||(y.set(i.group,r),l.push(`const ${r} = ${e}.shapes.add_group_shape();`,`${r}.name = ${$(i.group)};`))),i.kind==="placeholder"&&i.placeholder){const u=nameOf(U[i.placeholder.type],c,"placeholder");m.set(i.placeholder.idx,u);const p=B(`${s}.text_frame`,i.text);l.push(`${p.length>0?`const ${s} = `:""}${r}.placeholders.add(PP_PLACEHOLDER.${be[i.placeholder.type]}${i.frame?`, ${R(i.frame)}`:""}${u===U[i.placeholder.type]?"":`, { name: ${$(u)} }`});`,...p);return}const _=nameOf(i.name,c,i.kind);if(!i.frame){a(`${f}: ${i.name} has no frame of its own`);return}if((i.kind==="picture"||i.kind==="movie")&&i.part){const u=o.path(i.part);if(!u){a(`${f}: ${i.name}'s file is not in the file`);return}i.crop&&Object.values(i.crop).some(p=>p>0)&&a(`${f}: ${i.name}'s crop is not kept on a master or a layout`),l.push(...i.rotation===void 0?[`${r}.shapes.${i.kind==="movie"?"add_movie":"add_picture"}(${$(u)}, ${R(i.frame)}).name = ${$(_)};`]:[`const ${s} = ${r}.shapes.${i.kind==="movie"?"add_movie":"add_picture"}(${$(u)}, ${R(i.frame)});`,`${s}.name = ${$(_)};`,...W(s,i)]);return}if(i.table){a(`${f}: table ${i.name} is left out; a table goes on a slide`);return}if(i.geometry==="line"){const u=i.frame,[p,T]=i.flip?.h?[u.left+u.width,u.left]:[u.left,u.left+u.width],[M,O]=i.flip?.v?[u.top+u.height,u.top]:[u.top,u.top+u.height];l.push(`const ${s} = ${r}.shapes.add_connector(MSO_CONNECTOR.STRAIGHT, ${S(p)}, ${S(M)}, ${S(T)}, ${S(O)});`,`${s}.name = ${$(_)};`,...W(s,i),...Y(s,i,J));return}const g=i.path?Se(r,i,i.path):i.kind==="textbox"?`${r}.shapes.add_textbox(${R(i.frame)})`:`${r}.shapes.add_shape(MSO_SHAPE.${ye[i.geometry??"rect"]??"RECTANGLE"}, ${R(i.frame)})`;l.push(`const ${s} = ${g};`,`${s}.name = ${$(_)};`,...(i.adjustments??[]).map((u,p)=>`${s}.adjustments[${String(p)}] = ${String(Math.round(u*1e5)/1e5)};`),...W(s,i),...i.kind==="textbox"?[...ie(s,i.fill,null),...Y(s,i,{line:null})]:[...ie(s,i.fill,L.fill),...Y(s,i,L)],...B(`${s}.text_frame`,i.text&&{...i.text,levels:we(i)},G[i.kind==="textbox"?"textbox":"autoshape"]),...i.text?Oe(s,`${s}.text_frame`,i.text.paragraphs):[])}),{lines:l,names:m}}export function wordsOf(e,n){const o=i=>i.font?.color??i.font?.rgb,a=e.flatMap(i=>i.runs).filter(i=>i.text!=="\v"),f=new Set(a.map(o)).size>1,l=new Set(a.map(i=>i.font?.name)).size>1,c=i=>i.runs.map(d=>{if(d.text==="\v")return n("a line break inside a paragraph is a space")," ";const s=d.font?.bold===!0,r=d.font?.italic===!0,_=o(d);if(d.text.trim()==="")return d.text;const g=d.font?.name,u=[...f&&_!==void 0?[`color="${_}"`]:[],...l&&g!==void 0?[`font="${g}"`]:[]],p=u.length>0?`<span ${u.join(" ")}>${d.text}</span>`:d.text;return s&&r?`***${p}***`:s?`**${p}**`:r?`*${p}*`:p}).join(""),m=e.filter((i,d)=>d<e.length-1||i.runs.length>0);if(m.length===0)return;if(m.every(i=>i.level===0)){const i=m.map(c);return i.length===1?i[0]:i}const y=(i,d)=>{const s=[];let r=i;for(;r<m.length;){const _=m[r];if(!_||_.level<d)break;if(_.level>d){const[g,u]=y(r,d+1);s.push(g),r=u;continue}s.push(c(_)),r++}return[s,r]};return y(0,0)[0]}function re(e,n){const o=e.flatMap(d=>d.runs.filter(s=>s.text!=="\v"));if(o.length===0)return;const a=d=>{const s=o.map(d),r=s[0];return r!==void 0&&s.every(_=>_===r)?r:void 0},f=a(d=>d.font?.size),l=a(d=>d.font?.color??d.font?.rgb),c=a(d=>d.font?.name),m=e.every(d=>d.alignment===e[0]?.alignment)?e[0]?.alignment:void 0;new Set(o.map(d=>d.font?.size).filter(d=>d!==void 0)).size>1&&n("runs of several sizes take the layout's"),o.some(d=>d.font?.underline!==void 0||d.font?.spacing!==void 0)&&n("a run's own underline or letter spacing is not kept");const i={...f===void 0?{}:{size:N(f)},...l===void 0?{}:{color:l},...c===void 0?{}:{font:c},...m===void 0?{}:{align:m}};return Object.keys(i).length>0?i:void 0}const se=e=>({x:N(e.left),y:N(e.top),w:N(e.width),h:N(e.height)}),v=e=>typeof e=="string"?e:e.rgb,le=e=>({...e.minimum_scale===void 0?{}:{min:e.minimum_scale},...e.maximum_scale===void 0?{}:{max:e.maximum_scale},...e.major_unit===void 0?{}:{major:e.major_unit},...e.has_major_gridlines===void 0?{}:{gridlines:e.has_major_gridlines},...e.visible===void 0?{}:{visible:e.visible},...e.number_format===void 0?{}:{format:e.number_format},...e.reverse_order===void 0?{}:{reverse:e.reverse_order},...e.gridline_color===void 0?{}:{gridline_color:v(e.gridline_color)},...e.line_color===void 0?{}:{line_color:v(e.line_color)}});function ve(e){const n=e.labels;return{type:e.type,categories:e.categories,series:e.series.map(o=>({name:o.name,values:o.values,...o.color===void 0?{}:{color:v(o.color)},...o.number_format===void 0?{}:{format:o.number_format},...o.smooth===void 0?{}:{smooth:o.smooth},...o.line_width===void 0?{}:{line_width:o.line_width},...o.marker_size===void 0?{}:{marker_size:o.marker_size}})),...e.legend===void 0?{}:{legend:e.legend},...n?{labels:{...n.show_value===void 0?{}:{value:n.show_value},...n.show_percentage===void 0?{}:{percentage:n.show_percentage},...n.show_category_name===void 0?{}:{category:n.show_category_name},...n.show_series_name===void 0?{}:{series:n.show_series_name},...n.number_format===void 0?{}:{format:n.number_format},...n.position===void 0?{}:{position:n.position},...n.size===void 0?{}:{size:n.size},...n.color===void 0?{}:{color:v(n.color)}}}:{},...e.gap_width===void 0?{}:{gap_width:e.gap_width},...e.overlap===void 0?{}:{overlap:e.overlap},...e.vary_by_categories===void 0?{}:{vary_by_categories:e.vary_by_categories},...e.hole_size===void 0?{}:{hole_size:e.hole_size},...e.value_axis?{value_axis:le(e.value_axis)}:{},...e.category_axis?{category_axis:le(e.category_axis)}:{},...e.font_size===void 0?{}:{size:e.font_size},...e.title_size===void 0?{}:{title_size:e.title_size},...e.font_color===void 0?{}:{color:v(e.font_color)}}}const ae=e=>JSON.stringify(e,(n,o)=>o&&typeof o=="object"&&!Array.isArray(o)?Object.fromEntries(Object.entries(o).sort(([a],[f])=>a<f?-1:1)):o);export function importDeck(e,n){const o=[...e.skipped],a=new Ee(e.parts),f=Object.entries(me).find(([,[s,r]])=>s===e.width&&r===e.height)?.[0],l=[];Object.keys(e.theme).length>0&&l.push(`prs.theme.colors = ${JSON.stringify(e.theme)};`),Object.keys(e.fonts).length>0&&l.push(`prs.theme.fonts = ${JSON.stringify(e.fonts)};`);const c=new Map;e.masters.forEach((s,r)=>{const _=`master${String(r+1)}`;l.push("",`const ${_} = prs.slide_masters.add(${$(s.name)});`),s.background&&l.push(`${_}.background.fill.solid();`,j(`${_}.background.fill.fore_color`,s.background));for(const[g,u]of[["title","title_style"],["body","body_style"],["other","other_style"]]){const p=ue[g],T=s.text_styles[g]?.map((M,O)=>ae(M)===ae(p[O])?{}:M);l.push(...te(`${_}.text_styles.${u}`,T))}l.push(...oe(_,s.shapes,a,g=>o.push(g),`master ${s.name}`).lines),s.layouts.forEach((g,u)=>{const p=`${_}_layout${String(u+1)}`;l.push("",`const ${p} = ${_}.slide_layouts.add(${$(g.name)});`),g.display_master_shapes===!1&&l.push(`${p}.display_master_shapes = false;`),g.background&&l.push(`${p}.background.fill.solid();`,j(`${p}.background.fill.fore_color`,g.background));const T=oe(p,g.shapes,a,M=>o.push(M),`layout ${g.name}`);l.push(...T.lines),c.set(g.name,T.names)})});const m=new Set,y=[],i=[];e.slides.forEach((s,r)=>{const _=`slide ${String(r+1)}`,u=s.shapes.find(t=>t.placeholder?.type==="title"||t.placeholder?.type==="ctrTitle")?.text?.paragraphs.map(t=>t.runs.map(b=>b.text).join("")).join(" ")??"",p=nameOf(u,m,`slide-${String(r+1)}`),T=c.get(s.layout)??new Map,M=new Set(T.values()),O={},P={},H=new Map;for(const t of s.shapes){const b=x=>o.push(`${_}, ${t.name}: ${x}`);if(t.placeholder){const x=T.get(t.placeholder.idx)??[...T.values()].find(h=>h===U[t.placeholder?.type??"body"]);if(!x){b("its layout has no such placeholder; it is left out");continue}H.set(t.name,x);const w={};if(t.frame&&(w.frame=se(t.frame)),t.rotation!==void 0&&b("its rotation is left out"),(t.kind==="picture"||t.kind==="movie")&&t.part){const h=a.path(t.part);h&&(w[t.kind==="movie"?"movie":"picture"]=h)}if(t.text){const h=wordsOf(t.text.paragraphs,b);h!==void 0&&(P[x]=h);const E=re(t.text.paragraphs,b);E&&(w.text=E)}t.fill&&(w.fill=v(t.fill)),Object.keys(w).length>0&&(O[x]=w);continue}const k=nameOf(t.name,M,t.kind);if(H.set(t.name,k),!t.frame){b("it has no frame; it is left out");continue}const z=se(t.frame);if(t.chart){O[k]={chart:ve(t.chart),frame:z},t.chart.title!==void 0&&(P[k]=t.chart.title);continue}if(t.table){const x=t.table.rows,w=h=>h.every(E=>E===h[0])?h[0]:void 0;O[k]={table:{columns:t.table.columns.map(N),rows:x.map(h=>{const E=w(h.cells.map(D=>D.fill)),V=w(h.cells.map(D=>D.borders?.bottom?.color));return{height:N(h.height),...E?{fill:v(E)}:{},...V?{line:v(V)}:{}}})},frame:z},x.some(h=>h.cells.some(E=>E.spanned))&&b("its merged cells are apart"),P[k]=x.map(h=>h.cells.map(E=>wordsOf(E.text.paragraphs,b)??""));continue}if((t.kind==="picture"||t.kind==="movie")&&t.part){const x=a.path(t.part);if(!x)continue;const w=t.crop&&Object.values(t.crop).some(h=>h>0)?t.crop:void 0;O[k]={[t.kind==="movie"?"movie":"picture"]:x,frame:z,...w?{crop:w}:{}};continue}if(t.geometry==="line"){t.flip&&b("a line from bottom left to top right is drawn the other way"),O[k]={geometry:"line",frame:z,...t.line===void 0||I(t.line,J.line)?{}:{line:t.line===null?"none":v(t.line)},...t.line_width===void 0||t.line_width===J.line_width?{}:{line_width:N(t.line_width)},...Z(t)},t.rotation!==void 0&&b("its rotation is left out");continue}const F=t.kind==="textbox"?{textbox:!0,frame:z}:t.path?{path:{w:t.path.w,h:t.path.h,d:ce(t.path.steps)},frame:z,...Z(t)}:{geometry:t.geometry??"rect",frame:z,...Z(t)},q=t.kind==="textbox"?null:L.fill;t.fill&&!I(t.fill,q)&&(F.fill=v(t.fill)),t.fill===null&&q!==null&&b("it has no fill, and is filled as the basic shape is");const de=t.kind==="textbox"?null:L.line;t.line!==void 0&&!I(t.line,de)&&(F.line=t.line===null?"none":v(t.line)),t.kind!=="textbox"&&t.line!==null&&t.line_width!==void 0&&t.line_width!==L.line_width&&b("its outline's width is the basic shape's"),t.rotation!==void 0&&b("its rotation is left out");const Q=B("",t.text&&{...t.text,levels:[]},t.kind==="textbox"?xe:G.autoshape);if(Q.length>0&&b(`its text frame (${Q.map(x=>x.replace(/^\.(\w+) = .*$/u,"$1")).join(", ")}) is the basic ${t.kind==="textbox"?"text box's":"shape's"}`),t.text){const x=wordsOf(t.text.paragraphs,b);x!==void 0&&(P[k]=x);const w=re(t.text.paragraphs,b);w&&(F.text=w)}O[k]={...F,...t.group?{group:t.group}:{}}}const K=s.animations.flatMap(t=>{const b=H.get(t.shape);return b!==void 0?[{...t,shape:b}]:(o.push(`${_}: an animation of ${t.shape}, which is left out`),[])});y.push({id:p,layout:s.layout,...s.hidden?{hidden:!0}:{},...Object.keys(O).length>0?{shapes:O}:{},...K.length>0?{animations:K}:{},...s.transition?{transition:s.transition}:{}}),i.push({id:p,...Object.keys(P).length>0?{text:P}:{},...s.notes===void 0?{}:{notes:s.notes}})});const d=new Map;d.set("slides.ts",['import { Emu, MSO_ANCHOR, MSO_AUTO_SIZE, MSO_CONNECTOR, MSO_SHAPE, PP_ALIGN, PP_PLACEHOLDER, Pt, presentation } from "@allyhub/sdk/slides";',"",`// ${n.source}, imported by allyhub slides import: its masters and layouts.`,`export default presentation({ size: ${f?$(f):`{ width: ${S(e.width)}, height: ${S(e.height)} }`} }, (prs) => {`,...l.map(s=>s===""?"":` ${s}`),"});",""].join(`
3
3
  `)),d.set("slides.yaml",ee({slides:y},{lineWidth:0})),d.set(`script.${n.lang}.yaml`,ee({...e.title?{title:e.title}:{},slides:i},{lineWidth:0}));for(const[s,r]of a.files)d.set(s,r);return{files:d,lost:[...new Set(o)]}}
@@ -1,3 +1,4 @@
1
+ import { type ZipLimits } from "@allyhub-next/formats";
1
2
  import type { AnimationFile, TransitionFile } from "@allyhub-next/formats";
2
3
  import type { Color, ShapeDef, TextStylesDef, Theme } from "@allyhub-next/slides-core";
3
4
  /** A shape as read: the model's, with where it is in the file. */
@@ -51,5 +52,5 @@ export interface ReadDeck {
51
52
  parts: Record<string, Uint8Array>;
52
53
  }
53
54
  /** A .pptx file read into the deck's model. */
54
- export declare function readPptx(bytes: Uint8Array): ReadDeck;
55
+ export declare function readPptx(bytes: Uint8Array, zip?: Partial<ZipLimits>): ReadDeck;
55
56
  //# sourceMappingURL=read.d.ts.map
@@ -1,4 +1,4 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- import{strFromU8 as nt,unzipSync as kt}from"fflate";import{XMLParser as Ct}from"fast-xml-parser";import{EMU_PER_PT as mt,TEXT_INSETS as et}from"@allyhub-next/slides-core";import{PRESETS as Tt,SUBTYPES as Mt,TRANSITION_SIDES as jt}from"./timing.js";const ct=(n,t)=>n===void 0?t:n;function gt(n,t){if(!n)return{fill:null,line:null};const s=a=>{const d=o(n,a);return d?{idx:l(e(d,"idx"))??0,color:L(d)}:void 0},i=s("a:fillRef"),r=s("a:lnRef"),f=s("a:fontRef"),c=r&&r.idx>0?t[r.idx-1]:void 0;return{fill:!i||i.idx===0?null:i.color??null,line:!r||r.idx===0?null:r.color??null,...c===void 0?{}:{line_width:c},...f?.color===void 0?{}:{text_color:f.color}}}const Rt={vertical_anchor:"t",word_wrap:!0,auto_size:"none",margin_left:et.left,margin_top:et.top,margin_right:et.right,margin_bottom:et.bottom},ot=new Ct({preserveOrder:!0,ignoreAttributes:!1,attributeNamePrefix:"",trimValues:!1,parseTagValue:!1,parseAttributeValue:!1,processEntities:!0}),T=n=>Object.keys(n).find(t=>t!==":@")??"",I=n=>n?n[T(n)]??[]:[],e=(n,t)=>n?.[":@"]?.[t],o=(n,t)=>I(n).find(s=>T(s)===t),R=(n,t)=>I(n).filter(s=>T(s)===t),b=(n,...t)=>t.reduce((s,i)=>o(s,i),n),K=n=>I(n).map(t=>typeof t["#text"]=="string"?t["#text"]:"").join(""),l=n=>n===void 0||n===""?void 0:Number(n);function bt(n,t){if(t.startsWith("/"))return t.slice(1);const s=n.split("/").slice(0,-1);for(const i of t.split("/"))i===".."?s.pop():i!=="."&&s.push(i);return s.join("/")}const Ft={tx1:"dk1",bg1:"lt1",tx2:"dk2",bg2:"lt2"};function L(n){const t=o(n,"a:schemeClr");if(t){const r=e(t,"val")??"";return Ft[r]??r}const s=o(n,"a:srgbClr");if(s)return{rgb:`#${(e(s,"val")??"000000").toUpperCase()}`};const i=o(n,"a:sysClr");if(i)return{rgb:`#${(e(i,"lastClr")??"000000").toUpperCase()}`}}function Z(n){if(o(n,"a:noFill"))return null;const t=o(n,"a:solidFill");return t?L(t):void 0}function ft(n){const t=o(n,"a:off"),s=o(n,"a:ext");if(!t||!s)return{};const i=e(n,"flipH")==="1",r=e(n,"flipV")==="1",f=l(e(n,"rot"));return{...f?{rotation:f/6e4}:{},frame:{left:l(e(t,"x"))??0,top:l(e(t,"y"))??0,width:l(e(s,"cx"))??0,height:l(e(s,"cy"))??0},...i||r?{flip:{...i?{h:i}:{},...r?{v:r}:{}}}:{}}}function _t(n){if(!n)return;const t={},s=l(e(n,"sz"));s!==void 0&&(t.size=s*127);const i=e(n,"b");i!==void 0&&(t.bold=i==="1"||i==="true");const r=e(n,"i");r!==void 0&&(t.italic=r==="1"||r==="true");const f=e(n,"u");f!==void 0&&(t.underline=f!=="none");const c=l(e(n,"spc"));c!==void 0&&(t.spacing=c*127);const a=L(o(n,"a:solidFill"));typeof a=="string"?t.color=a:a&&(t.rgb=a.rgb);const d=e(o(n,"a:latin"),"typeface");return d&&(t.name=d),Object.keys(t).length>0?t:void 0}function lt(n){const t=l(e(o(n,"a:spcPct"),"val"));if(t!==void 0)return{lines:t/1e5};const s=l(e(o(n,"a:spcPts"),"val"));if(s!==void 0)return{fixed:s*127}}function xt(n){if(!n)return{};const t={},s=e(n,"algn");(s==="l"||s==="ctr"||s==="r"||s==="just")&&(t.alignment=s);const i=l(e(n,"marL"));i!==void 0&&(t.margin_left=i);const r=l(e(n,"indent"));r!==void 0&&(t.indent=r);const f=lt(o(n,"a:lnSpc"));f&&(t.line_spacing=f);const c=lt(o(n,"a:spcBef"));c&&"fixed"in c&&(t.space_before=c.fixed);const a=lt(o(n,"a:spcAft"));a&&"fixed"in a&&(t.space_after=a.fixed),o(n,"a:buNone")&&(t.bullet=null);const d=e(o(n,"a:buChar"),"char");d!==void 0&&(t.bullet=d);const m=e(o(n,"a:buFont"),"typeface");m!==void 0&&(t.bullet_font=m);const u=_t(o(n,"a:defRPr"));return u&&(t.font=u),t}function st(n){return Array.from({length:9},(t,s)=>xt(o(n,`a:lvl${String(s+1)}pPr`)))}function zt(n){return R(n,"a:p").map(t=>{const s=o(t,"a:pPr"),i=[];for(const r of I(t)){const f=T(r);if(f==="a:r"||f==="a:fld"){const c=_t(o(r,"a:rPr"));i.push({text:K(o(r,"a:t")),...c?{font:c}:{}})}else f==="a:br"&&i.push({text:"\v"})}return{...xt(s),runs:i,level:l(e(s,"lvl"))??0}})}function yt(n,t){const s=o(n,"a:bodyPr"),i={...t,paragraphs:zt(n),levels:st(o(n,"a:lstStyle"))},r=e(s,"anchor");(r==="t"||r==="ctr"||r==="b")&&(i.vertical_anchor=r);const f=e(s,"wrap");f!==void 0&&(i.word_wrap=f!=="none"),o(s,"a:normAutofit")?i.auto_size="text":o(s,"a:spAutoFit")?i.auto_size="shape":o(s,"a:noAutofit")&&(i.auto_size="none");const c={lIns:"margin_left",tIns:"margin_top",rIns:"margin_right",bIns:"margin_bottom"};for(const[a,d]of Object.entries(c)){const m=l(e(s,a));m!==void 0&&(i[d]=m)}return i}const vt=new Set(["title","ctrTitle","subTitle","body","pic","media","obj","dt","ftr","sldNum"]),wt=new Set(["rect","roundRect","ellipse","triangle","rightArrow","line"]);function Pt(n){const t=e(o(n,"a:prstDash"),"val"),s=e(o(n,"a:headEnd"),"type"),i=e(o(n,"a:tailEnd"),"type");return{...t===void 0?{}:{line_dash:t},...s===void 0?{}:{line_begin:s},...i===void 0?{}:{line_end:i}}}const dt=n=>{const t=I(n);return Array.isArray(t)?t:[]};function V(n,t){for(const s of dt(n)){if(T(s)===t)return s;const i=V(s,t);if(i)return i}}function Q(n,t){return dt(n).flatMap(s=>[...T(s)===t?[s]:[],...Q(s,t)])}const St=Object.fromEntries(Object.entries(Tt).map(([n,t])=>[`${t.kind}:${String(t.id)}`,n])),Nt=new Map(Object.entries(Mt).map(([n,t])=>[t,n]));function It(n,t){const s=n.trim().split(/\s+/u),i=[];let r=0;for(const f of s){if(/^[A-Za-z]$/u.test(f)){f!=="E"&&i.push(f),r=0;continue}const c=Number(f)*(r%2===0?t.width:t.height),a=String(Math.round(c/mt*100)/100);r===0?i[i.length-1]=`${i.at(-1)??""}${a}`:i.push(a),r++}return i.join(" ")}const $t=n=>n.replace(/^!!/u,""),At=new Map(Object.entries(jt).map(([n,t])=>[t,n]));function Lt(n,t){const s=n&&V(n,"p:transition");if(!s)return;const i=l(e(s,"p14:dur")),r=e(s,"spd"),f=i===void 0?r==="fast"?.5:r==="slow"?2:1:i/1e3,[c]=dt(s),a=c?T(c):"",d=At.get(e(c,"dir")??""),m=a==="p:fade"?"fade":a==="p:push"?"push":a==="p:wipe"?"wipe":a==="p159:morph"?"morph":void 0;return m?{type:m,...d?{direction:d}:{},duration:f}:(t(`its transition ${a}, which is read as a fade`),{type:"fade",duration:f})}function Dt(n,t,s,i){const r=n&&V(n,"p:seq");if(!r)return[];const f=[];for(const c of Q(r,"p:cTn")){const a=e(c,"nodeType");if(a!=="clickEffect"&&a!=="withEffect"&&a!=="afterEffect"||e(c,"presetClass")==="mediacall")continue;const d=e(V(c,"p:spTgt"),"spid")??"",m=t.get(d);if(m===void 0){i(`an animation of shape ${d}, which is not read, is left out`);continue}const u=e(c,"presetClass")??"",g=e(c,"presetID")??"",p=St[`${u}:${g}`]??(u==="path"?"path":u==="exit"?"fade-out":u==="emph"?"pulse":"fade");St[`${u}:${g}`]===void 0&&u!=="path"&&i(`${m}: effect ${u} ${g} is read as ${p}`);const _=l(e(c,"presetSubtype"))??0,x=Nt.get(_),h=l(e(V(c,"p:pRg"),"st")),P=l(e(V(c,"p:cond"),"delay"))??0,w=I(o(c,"p:childTnLst")).filter(C=>T(C)!=="p:set").flatMap(C=>Q(C,"p:cTn").map(M=>(l(e(M,"dur"))??0)*(e(M,"autoRev")==="1"?2:1))),$=e(V(c,"p:animMotion"),"path");f.push({shape:m,effect:p,...h===void 0?{}:{paragraph:h},...x&&_>0?{direction:x}:{},start:a==="clickEffect"?"on-click":a==="withEffect"?"with-previous":"after-previous",duration:Math.max(0,...w)/1e3,...P>0?{delay:P/1e3}:{},...$===void 0?{}:{path:It($,s)}})}return f}function Gt(n){const t=o(n,"a:tblPr"),s=r=>e(t,r)==="1",i=r=>{const f=o(r,"a:tcPr"),c=yt(o(r,"a:txBody"),{}),a=Z(f),d=[["left","a:lnL"],["right","a:lnR"],["top","a:lnT"],["bottom","a:lnB"]].flatMap(([w,$])=>{const C=o(f,$),M=Z(C);return M?[[w,{color:M,width:l(e(C,"w"))??12700}]]:[]}),m=e(f,"anchor"),u=w=>l(e(f,w)),g=w=>l(e(r,w)),[p,_,x,h]=["marL","marR","marT","marB"].map(u),P=g("gridSpan"),E=g("rowSpan");return{text:{...c,...p===void 0?{}:{margin_left:p},..._===void 0?{}:{margin_right:_},...x===void 0?{}:{margin_top:x},...h===void 0?{}:{margin_bottom:h},...m==="t"||m==="ctr"||m==="b"?{vertical_anchor:m}:{}},...a===void 0?{}:{fill:a},...d.length>0?{borders:Object.fromEntries(d)}:{},...P===void 0||P<2?{}:{span_width:P},...E===void 0||E<2?{}:{span_height:E},...e(r,"hMerge")==="1"||e(r,"vMerge")==="1"?{spanned:!0}:{}}};return{columns:R(o(n,"a:tblGrid"),"a:gridCol").map(r=>l(e(r,"w"))??0),rows:R(n,"a:tr").map(r=>({height:l(e(r,"h"))??0,cells:R(r,"a:tc").map(i)})),...s("firstRow")?{first_row:!0}:{},...s("firstCol")?{first_col:!0}:{},...s("lastRow")?{last_row:!0}:{},...s("lastCol")?{last_col:!0}:{},...s("bandRow")?{horz_banding:!0}:{},...s("bandCol")?{vert_banding:!0}:{}}}const rt=n=>{const t=e(n,"val");return t===void 0?n?!0:void 0:t==="1"||t==="true"},ut=n=>{const t=[];for(const s of R(n,"c:pt"))t[l(e(s,"idx"))??t.length]=K(o(s,"c:v"));return Array.from(t,s=>s??"")},Ot=n=>{const t=o(n,"c:scaling"),s=l(e(o(t,"c:min"),"val")),i=l(e(o(t,"c:max"),"val")),r=l(e(o(n,"c:majorUnit"),"val")),f=o(n,"c:numFmt"),c=e(f,"formatCode"),a=g=>L(o(b(g,"c:spPr","a:ln"),"a:solidFill")),d=o(n,"c:majorGridlines"),m=a(d),u=a(n);return{...s===void 0?{}:{minimum_scale:s},...i===void 0?{}:{maximum_scale:i},...r===void 0?{}:{major_unit:r},has_major_gridlines:d!==void 0,...rt(o(n,"c:delete"))===!0?{visible:!1}:{},...c===void 0||c==="General"||e(f,"sourceLinked")==="1"?{}:{number_format:c},...e(o(t,"c:orientation"),"val")==="maxMin"?{reverse_order:!0}:{},...m===void 0?{}:{gridline_color:m},...u===void 0?{}:{line_color:u}}};function Bt(n){const t=o(n,"c:chart"),s=o(t,"c:plotArea"),i=I(s).filter(k=>T(k).endsWith("Chart")),[r]=i;if(!r)return"it has no plot";if(i.length>1)return"it combines several kinds of chart";const f=T(r),c=e(o(r,"c:grouping"),"val"),a=c==="percentStacked"?"-stacked-100":c==="stacked"?"-stacked":"",d=R(r,"c:ser"),m=d.some(k=>e(b(k,"c:marker","c:symbol"),"val")!=="none"),u=(()=>{if(f==="c:barChart")return`${e(o(r,"c:barDir"),"val")==="bar"?"bar":"column"}${a===""?"-clustered":a}`;if(f==="c:lineChart")return a===""?m?"line-markers":"line":void 0;if(f==="c:areaChart")return`area${a}`;if(f==="c:pieChart")return"pie";if(f==="c:doughnutChart")return"doughnut"})();if(!u)return`a deck has no ${f.slice(2)} chart`;const[g]=d,p=ut(o(b(g,"c:cat","c:strRef"),"c:strCache")??o(b(g,"c:cat","c:numRef"),"c:numCache")),_=d.map(k=>{const A=b(k,"c:val","c:numRef","c:numCache"),X=K(o(A,"c:formatCode")),N=ut(A),H=L(b(k,"c:spPr","a:solidFill"))??L(b(k,"c:spPr","a:ln","a:solidFill")),O=rt(o(k,"c:smooth")),j=l(e(b(k,"c:spPr","a:ln"),"w")),J=l(e(b(k,"c:marker","c:size"),"val"));return{name:ut(b(k,"c:tx","c:strRef","c:strCache"))[0]??"",values:p.map((Wt,Et)=>{const at=N[Et];return at===void 0||at===""?null:Number(at)}),...X===""||X==="General"?{}:{number_format:X},...H===void 0?{}:{color:H},...O===!0?{smooth:O}:{},...j===void 0||f!=="c:lineChart"?{}:{line_width:j/mt},...J===void 0?{}:{marker_size:J}}}),x=Q(o(t,"c:title")??{},"a:t").map(K).join(""),h=l(e(V(o(t,"c:title")??{},"a:rPr"),"sz")),P=e(b(t,"c:legend","c:legendPos"),"val"),E={b:"bottom",t:"top",l:"left",r:"right"}[P??"r"],w=o(r,"c:dLbls"),$=k=>rt(o(w,k))===!0,C=e(o(w,"c:numFmt"),"formatCode"),M=e(o(w,"c:dLblPos"),"val"),F=b(w,"c:txPr","a:p","a:pPr","a:defRPr"),G=l(e(F,"sz")),Y=L(o(F,"a:solidFill")),q=l(e(o(r,"c:gapWidth"),"val")),B=l(e(o(r,"c:overlap"),"val")),S=l(e(o(r,"c:holeSize"),"val")),y=rt(o(r,"c:varyColors")),v=b(n,"c:txPr","a:p","a:pPr","a:defRPr"),D=l(e(v,"sz")),U=L(o(v,"a:solidFill")),z=o(s,"c:valAx"),W=o(s,"c:catAx");return{type:u,categories:p,series:_,...x===""?{}:{title:x},...o(t,"c:legend")?{legend:E??"right"}:{},...w&&($("c:showVal")||$("c:showPercent")||$("c:showCatName")||$("c:showSerName"))?{labels:{show_value:$("c:showVal"),show_percentage:$("c:showPercent"),show_category_name:$("c:showCatName"),show_series_name:$("c:showSerName"),...C===void 0?{}:{number_format:C},...M===void 0?{}:{position:M},...G===void 0?{}:{size:G/100},...Y===void 0?{}:{color:Y}}}:{},...q===void 0?{}:{gap_width:q},...B===void 0?{}:{overlap:B},...S===void 0?{}:{hole_size:S},...y===void 0?{}:{vary_by_categories:y},...z?{value_axis:Ot(z)}:{},...W?{category_axis:Ot(W)}:{},...D===void 0?{}:{font_size:D/100},...h===void 0?{}:{title_size:h/100},...U===void 0?{}:{font_color:U}}}function Ut(n){const t=R(o(n,"a:pathLst"),"a:path"),s=t[0];if(!s||t.length>1)return;const i=f=>R(f,"a:pt").map(c=>({x:l(e(c,"x"))??0,y:l(e(c,"y"))??0})),r=[];for(const f of I(s)){const c=T(f),[a,d,m]=i(f);if(c==="a:close")r.push({op:"close"});else if(c==="a:moveTo"&&a)r.push({op:"move",...a});else if(c==="a:lnTo"&&a)r.push({op:"line",...a});else if(c==="a:cubicBezTo"&&a&&d&&m)r.push({op:"curve",x1:a.x,y1:a.y,x2:d.x,y2:d.y,...m});else return}return{w:l(e(s,"w"))??0,h:l(e(s,"h"))??0,steps:r}}function tt(n,t,s,i,r,f=()=>{}){const c=[];for(const a of I(n)){const d=T(a);if(d==="p:nvGrpSpPr"||d==="p:grpSpPr")continue;if(d==="p:sp"){const u=o(a,"p:nvSpPr"),g=e(o(u,"p:cNvPr"),"name")??"",p=b(u,"p:nvPr","p:ph"),_=o(a,"p:spPr"),{frame:x,flip:h,rotation:P}=ft(o(_,"a:xfrm")),E=o(_,"a:prstGeom"),w=e(E,"prst"),$=R(o(E,"a:avLst"),"a:gd").map(v=>Number((e(v,"fmla")??"val 0").replace("val ",""))/1e5),C=o(_,"a:ln"),M=e(o(u,"p:cNvSpPr"),"txBox")==="1",F=p?{}:M?{fill:null}:gt(o(a,"p:style"),r),G=ct(Z(_),F.fill),Y=ct(C?Z(C):void 0,F.line),q=l(e(C,"w"))??F.line_width,B=o(a,"p:txBody"),S={name:g,...x?{frame:x}:{},...h?{flip:h}:{},...P===void 0?{}:{rotation:P},...G===void 0?{}:{fill:G},...Y===void 0?{}:{line:Y},...q===void 0?{}:{line_width:q},...F.text_color===void 0?{}:{text_color:F.text_color},...B?{text:yt(B,p?{}:Rt)}:{}};if(p){const v=e(p,"type")??"obj";if(v==="sldImg")continue;const D=vt.has(v)?v:"body";vt.has(v)||i(`${t}: placeholder ${g} of type ${v}, read as a body`),c.push({...S,kind:"placeholder",placeholder:{type:D,idx:l(e(p,"idx"))??0}});continue}w&&!wt.has(w)&&i(`${t}: shape ${g} is a ${w}, read as a rectangle`);const y=Ut(o(_,"a:custGeom"));!w&&o(_,"a:custGeom")&&!y&&i(`${t}: shape ${g} has a freeform outline this does not read, read as a rectangle`),c.push({...S,...Pt(C),kind:M?"textbox":"autoshape",...y?{path:y}:{geometry:w&&wt.has(w)?w:"rect"},...$.length>0?{adjustments:$}:{}});continue}if(d==="p:cxnSp"){const u=o(a,"p:spPr"),{frame:g,flip:p,rotation:_}=ft(o(u,"a:xfrm")),x=o(u,"a:ln"),h=gt(o(a,"p:style"),r),P=ct(x?Z(x):void 0,h.line),E=l(e(x,"w"))??h.line_width;c.push({name:e(b(a,"p:nvCxnSpPr","p:cNvPr"),"name")??"",kind:"autoshape",geometry:"line",...g?{frame:g}:{},...p?{flip:p}:{},..._===void 0?{}:{rotation:_},...P===void 0?{}:{line:P},...E===void 0?{}:{line_width:E},...Pt(x)});continue}if(d==="p:pic"){const u=o(a,"p:nvPicPr"),g=e(o(u,"p:cNvPr"),"name")??"",{frame:p,rotation:_}=ft(b(a,"p:spPr","a:xfrm")),x=b(a,"p:blipFill","a:blip"),h=e(x,"r:embed"),P=e(b(u,"p:nvPr","a:videoFile"),"r:link"),E=s.get(P??h??""),w=b(a,"p:blipFill","a:srcRect"),$=M=>(l(e(w,M))??0)/1e5,C=w?{left:$("l"),top:$("t"),right:$("r"),bottom:$("b")}:void 0;if(!E){i(`${t}: picture ${g} names no file`);continue}c.push({name:g,kind:P?"movie":"picture",...p?{frame:p}:{},..._===void 0?{}:{rotation:_},part:E,...C&&!P?{crop:C}:{}});continue}if(d==="p:graphicFrame"){const u=b(a,"a:graphic","a:graphicData","a:tbl");if(u){const p=e(b(a,"p:nvGraphicFramePr","p:cNvPr"),"name")??"",_=o(a,"p:xfrm"),x=o(_,"a:off"),h=o(_,"a:ext");c.push({name:p,kind:"table",frame:{left:l(e(x,"x"))??0,top:l(e(x,"y"))??0,width:l(e(h,"cx"))??0,height:l(e(h,"cy"))??0},table:Gt(u)});continue}const g=b(a,"a:graphic","a:graphicData","c:chart");if(g){const p=e(b(a,"p:nvGraphicFramePr","p:cNvPr"),"name")??"",_=s.get(e(g,"r:id")??""),x=Bt(_===void 0?void 0:f(_));if(typeof x=="string"){i(`${t}: chart ${p} is left out: ${x}`);continue}const h=o(a,"p:xfrm"),P=o(h,"a:off"),E=o(h,"a:ext");c.push({name:p,kind:"chart",frame:{left:l(e(P,"x"))??0,top:l(e(P,"y"))??0,width:l(e(E,"cx"))??0,height:l(e(E,"cy"))??0},chart:x});continue}}if(d==="p:grpSp"){const u=e(b(a,"p:nvGrpSpPr","p:cNvPr"),"name")??"group",g=b(a,"p:grpSpPr","a:xfrm"),p=(h,P)=>l(e(o(g,h),P))??0;e(g,"rot")&&i(`${t}: group ${u}'s rotation is left out`);const _=p("a:ext","cx")/(p("a:chExt","cx")||1)||1,x=p("a:ext","cy")/(p("a:chExt","cy")||1)||1;for(const h of tt(a,t,s,i,r,f))c.push({...h,group:u,...h.frame?{frame:{left:Math.round(p("a:off","x")+(h.frame.left-p("a:chOff","x"))*_),top:Math.round(p("a:off","y")+(h.frame.top-p("a:chOff","y"))*x),width:Math.round(h.frame.width*_),height:Math.round(h.frame.height*x)}}:{}});continue}const m=d==="p:graphicFrame"?b(a,"a:graphic","a:graphicData")?.[":@"]!==void 0?`a ${(e(b(a,"a:graphic","a:graphicData"),"uri")??"").split("/").pop()??"graphic"}`:"a graphic frame":d;i(`${t}: ${m} (${e(b(I(a)[0],"p:cNvPr"),"name")??"unnamed"}) is not read`)}return c}function it(n,t){const i=`${t.split("/").slice(0,-1).join("/")}/_rels/${t.split("/").pop()??""}.rels`,r=n[i],f=new Map;if(!r)return f;const c=ot.parse(nt(r)).find(a=>T(a)==="Relationships");for(const a of R(c,"Relationship")){const d=e(a,"Id"),m=e(a,"Target");d&&m&&e(a,"TargetMode")!=="External"&&f.set(d,bt(t,m))}return f}const pt=(n,t,s)=>{const i=t.split("/").slice(0,-1).join("/"),r=n[`${i}/_rels/${t.split("/").pop()??""}.rels`];if(!r)return;const f=ot.parse(nt(r)).find(d=>T(d)==="Relationships"),c=R(f,"Relationship").find(d=>(e(d,"Type")??"").endsWith(`/${s}`)),a=e(c,"Target");return a?bt(t,a):void 0};function ht(n,t,s){const i=o(n,"p:bg");if(!i)return;const r=o(i,"p:bgPr");if(r){const c=Z(r);if(c)return c;s(`${t}: a background that is not one colour (a gradient or a picture) is not read`);return}const f=o(i,"p:bgRef");return L(f)??void 0}export function readPptx(n){const t=kt(n),s=[],i=S=>s.push(S),r=S=>{const y=t[S];if(y)return ot.parse(nt(y)).find(v=>!T(v).startsWith("?"))},f="ppt/presentation.xml",c=r(f),a=it(t,f),d=o(c,"p:sldSz"),m=R(o(c,"p:sldMasterIdLst"),"p:sldMasterId").flatMap(S=>{const y=a.get(e(S,"r:id")??"");return y?[y]:[]}),u={},g={},p=m[0]?pt(t,m[0],"theme"):void 0,_=p?r(p):void 0,x=b(_,"a:themeElements","a:clrScheme");for(const S of I(x)){const y=T(S).replace("a:",""),v=L(S);v&&typeof v!="string"&&(u[y]=v.rgb)}const h=R(b(_,"a:themeElements","a:fmtScheme","a:lnStyleLst"),"a:ln").map(S=>l(e(S,"w"))??0),P=b(_,"a:themeElements","a:fontScheme"),E=(S,y)=>{const v=e(b(P,S,y),"typeface");return v===""?void 0:v},w=E("a:majorFont","a:latin"),$=E("a:minorFont","a:latin"),C=E("a:majorFont","a:ea"),M=E("a:minorFont","a:ea");w&&(g.major=w),$&&(g.minor=$),C&&(g.major_east_asian=C),M&&(g.minor_east_asian=M);const F=new Map,G=m.map((S,y)=>{const v=r(S),D=it(t,S),U=o(v,"p:cSld"),z=o(v,"p:txStyles"),W=R(o(v,"p:sldLayoutIdLst"),"p:sldLayoutId").flatMap(X=>{const N=D.get(e(X,"r:id")??"");if(!N)return[];const H=r(N),O=o(H,"p:cSld");let j=e(O,"name")??`Layout ${String(F.size+1)}`;for(;[...F.values()].includes(j);)j=`${j} (${String(y+1)})`;F.set(N,j);const J=ht(O,N,i);return[{name:j,...J?{background:J}:{},...e(H,"showMasterSp")==="0"?{display_master_shapes:!1}:{},shapes:tt(o(O,"p:spTree"),N,it(t,N),i,h)}]}),k=ht(U,S,i),A={};return o(z,"p:titleStyle")&&(A.title=st(o(z,"p:titleStyle"))),o(z,"p:bodyStyle")&&(A.body=st(o(z,"p:bodyStyle"))),o(z,"p:otherStyle")&&(A.other=st(o(z,"p:otherStyle"))),{name:e(U,"name")??`Master ${String(y+1)}`,...k?{background:k}:{},text_styles:A,shapes:tt(o(U,"p:spTree"),S,D,i,h),layouts:W}}),Y=R(o(c,"p:sldIdLst"),"p:sldId").flatMap(S=>{const y=a.get(e(S,"r:id")??"");if(!y)return[];const v=r(y),D=it(t,y),U=O=>t[O]?ot.parse(nt(t[O])).find(j=>T(j)==="c:chartSpace"):void 0,z=pt(t,y,"slideLayout"),W=pt(t,y,"notesSlide"),k=W?tt(b(r(W),"p:cSld","p:spTree"),W,new Map,()=>{},h).find(O=>O.placeholder?.type==="body"&&O.text!==void 0)?.text?.paragraphs.map(O=>O.runs.map(j=>j.text==="\v"?`
2
+ import{strFromU8 as nt,unzipSync as Ct}from"fflate";import{withinZip as Tt}from"@allyhub-next/formats";import{XMLParser as Mt}from"fast-xml-parser";import{EMU_PER_PT as gt,TEXT_INSETS as et}from"@allyhub-next/slides-core";import{PRESETS as jt,SUBTYPES as Rt,TRANSITION_SIDES as Ft}from"./timing.js";const ft=(n,t)=>n===void 0?t:n;function bt(n,t){if(!n)return{fill:null,line:null};const s=a=>{const d=o(n,a);return d?{idx:l(e(d,"idx"))??0,color:D(d)}:void 0},i=s("a:fillRef"),r=s("a:lnRef"),c=s("a:fontRef"),f=r&&r.idx>0?t[r.idx-1]:void 0;return{fill:!i||i.idx===0?null:i.color??null,line:!r||r.idx===0?null:r.color??null,...f===void 0?{}:{line_width:f},...c?.color===void 0?{}:{text_color:c.color}}}const zt={vertical_anchor:"t",word_wrap:!0,auto_size:"none",margin_left:et.left,margin_top:et.top,margin_right:et.right,margin_bottom:et.bottom},ot=new Mt({preserveOrder:!0,ignoreAttributes:!1,attributeNamePrefix:"",trimValues:!1,parseTagValue:!1,parseAttributeValue:!1,processEntities:!0}),T=n=>Object.keys(n).find(t=>t!==":@")??"",A=n=>n?n[T(n)]??[]:[],e=(n,t)=>n?.[":@"]?.[t],o=(n,t)=>A(n).find(s=>T(s)===t),R=(n,t)=>A(n).filter(s=>T(s)===t),g=(n,...t)=>t.reduce((s,i)=>o(s,i),n),J=n=>A(n).map(t=>typeof t["#text"]=="string"?t["#text"]:"").join(""),l=n=>n===void 0||n===""?void 0:Number(n);function _t(n,t){if(t.startsWith("/"))return t.slice(1);const s=n.split("/").slice(0,-1);for(const i of t.split("/"))i===".."?s.pop():i!=="."&&s.push(i);return s.join("/")}const Nt={tx1:"dk1",bg1:"lt1",tx2:"dk2",bg2:"lt2"};function D(n){const t=o(n,"a:schemeClr");if(t){const r=e(t,"val")??"";return Nt[r]??r}const s=o(n,"a:srgbClr");if(s)return{rgb:`#${(e(s,"val")??"000000").toUpperCase()}`};const i=o(n,"a:sysClr");if(i)return{rgb:`#${(e(i,"lastClr")??"000000").toUpperCase()}`}}function Z(n){if(o(n,"a:noFill"))return null;const t=o(n,"a:solidFill");return t?D(t):void 0}function lt(n){const t=o(n,"a:off"),s=o(n,"a:ext");if(!t||!s)return{};const i=e(n,"flipH")==="1",r=e(n,"flipV")==="1",c=l(e(n,"rot"));return{...c?{rotation:c/6e4}:{},frame:{left:l(e(t,"x"))??0,top:l(e(t,"y"))??0,width:l(e(s,"cx"))??0,height:l(e(s,"cy"))??0},...i||r?{flip:{...i?{h:i}:{},...r?{v:r}:{}}}:{}}}function xt(n){if(!n)return;const t={},s=l(e(n,"sz"));s!==void 0&&(t.size=s*127);const i=e(n,"b");i!==void 0&&(t.bold=i==="1"||i==="true");const r=e(n,"i");r!==void 0&&(t.italic=r==="1"||r==="true");const c=e(n,"u");c!==void 0&&(t.underline=c!=="none");const f=l(e(n,"spc"));f!==void 0&&(t.spacing=f*127);const a=D(o(n,"a:solidFill"));typeof a=="string"?t.color=a:a&&(t.rgb=a.rgb);const d=e(o(n,"a:latin"),"typeface");return d&&(t.name=d),Object.keys(t).length>0?t:void 0}function dt(n){const t=l(e(o(n,"a:spcPct"),"val"));if(t!==void 0)return{lines:t/1e5};const s=l(e(o(n,"a:spcPts"),"val"));if(s!==void 0)return{fixed:s*127}}function yt(n){if(!n)return{};const t={},s=e(n,"algn");(s==="l"||s==="ctr"||s==="r"||s==="just")&&(t.alignment=s);const i=l(e(n,"marL"));i!==void 0&&(t.margin_left=i);const r=l(e(n,"indent"));r!==void 0&&(t.indent=r);const c=dt(o(n,"a:lnSpc"));c&&(t.line_spacing=c);const f=dt(o(n,"a:spcBef"));f&&"fixed"in f&&(t.space_before=f.fixed);const a=dt(o(n,"a:spcAft"));a&&"fixed"in a&&(t.space_after=a.fixed),o(n,"a:buNone")&&(t.bullet=null);const d=e(o(n,"a:buChar"),"char");d!==void 0&&(t.bullet=d);const h=e(o(n,"a:buFont"),"typeface");h!==void 0&&(t.bullet_font=h);const p=xt(o(n,"a:defRPr"));return p&&(t.font=p),t}function st(n){return Array.from({length:9},(t,s)=>yt(o(n,`a:lvl${String(s+1)}pPr`)))}function It(n){return R(n,"a:p").map(t=>{const s=o(t,"a:pPr"),i=[];for(const r of A(t)){const c=T(r);if(c==="a:r"||c==="a:fld"){const f=xt(o(r,"a:rPr"));i.push({text:J(o(r,"a:t")),...f?{font:f}:{}})}else c==="a:br"&&i.push({text:"\v"})}return{...yt(s),runs:i,level:l(e(s,"lvl"))??0}})}function vt(n,t){const s=o(n,"a:bodyPr"),i={...t,paragraphs:It(n),levels:st(o(n,"a:lstStyle"))},r=e(s,"anchor");(r==="t"||r==="ctr"||r==="b")&&(i.vertical_anchor=r);const c=e(s,"wrap");c!==void 0&&(i.word_wrap=c!=="none"),o(s,"a:normAutofit")?i.auto_size="text":o(s,"a:spAutoFit")?i.auto_size="shape":o(s,"a:noAutofit")&&(i.auto_size="none");const f={lIns:"margin_left",tIns:"margin_top",rIns:"margin_right",bIns:"margin_bottom"};for(const[a,d]of Object.entries(f)){const h=l(e(s,a));h!==void 0&&(i[d]=h)}return i}const wt=new Set(["title","ctrTitle","subTitle","body","pic","media","obj","dt","ftr","sldNum"]),Pt=new Set(["rect","roundRect","ellipse","triangle","rightArrow","line"]);function St(n){const t=e(o(n,"a:prstDash"),"val"),s=e(o(n,"a:headEnd"),"type"),i=e(o(n,"a:tailEnd"),"type");return{...t===void 0?{}:{line_dash:t},...s===void 0?{}:{line_begin:s},...i===void 0?{}:{line_end:i}}}const ut=n=>{const t=A(n);return Array.isArray(t)?t:[]};function V(n,t){for(const s of ut(n)){if(T(s)===t)return s;const i=V(s,t);if(i)return i}}function K(n,t){return ut(n).flatMap(s=>[...T(s)===t?[s]:[],...K(s,t)])}const $t=Object.fromEntries(Object.entries(jt).map(([n,t])=>[`${t.kind}:${String(t.id)}`,n])),At=new Map(Object.entries(Rt).map(([n,t])=>[t,n]));function Lt(n,t){const s=n.trim().split(/\s+/u),i=[];let r=0;for(const c of s){if(/^[A-Za-z]$/u.test(c)){c!=="E"&&i.push(c),r=0;continue}const f=Number(c)*(r%2===0?t.width:t.height),a=String(Math.round(f/gt*100)/100);r===0?i[i.length-1]=`${i.at(-1)??""}${a}`:i.push(a),r++}return i.join(" ")}const Ot=n=>n.replace(/^!!/u,""),Dt=new Map(Object.entries(Ft).map(([n,t])=>[t,n]));function Gt(n,t){const s=n&&V(n,"p:transition");if(!s)return;const i=l(e(s,"p14:dur")),r=e(s,"spd"),c=i===void 0?r==="fast"?.5:r==="slow"?2:1:i/1e3,[f]=ut(s),a=f?T(f):"",d=Dt.get(e(f,"dir")??""),h=a==="p:fade"?"fade":a==="p:push"?"push":a==="p:wipe"?"wipe":a==="p159:morph"?"morph":void 0;return h?{type:h,...d?{direction:d}:{},duration:c}:(t(`its transition ${a}, which is read as a fade`),{type:"fade",duration:c})}function Bt(n,t,s,i){const r=n&&V(n,"p:seq");if(!r)return[];const c=[];for(const f of K(r,"p:cTn")){const a=e(f,"nodeType");if(a!=="clickEffect"&&a!=="withEffect"&&a!=="afterEffect"||e(f,"presetClass")==="mediacall")continue;const d=e(V(f,"p:spTgt"),"spid")??"",h=t.get(d);if(h===void 0){i(`an animation of shape ${d}, which is not read, is left out`);continue}const p=e(f,"presetClass")??"",y=e(f,"presetID")??"",u=$t[`${p}:${y}`]??(p==="path"?"path":p==="exit"?"fade-out":p==="emph"?"pulse":"fade");$t[`${p}:${y}`]===void 0&&p!=="path"&&i(`${h}: effect ${p} ${y} is read as ${u}`);const _=l(e(f,"presetSubtype"))??0,x=At.get(_),b=l(e(V(f,"p:pRg"),"st")),w=l(e(V(f,"p:cond"),"delay"))??0,v=A(o(f,"p:childTnLst")).filter(k=>T(k)!=="p:set").flatMap(k=>K(k,"p:cTn").map(M=>(l(e(M,"dur"))??0)*(e(M,"autoRev")==="1"?2:1))),S=e(V(f,"p:animMotion"),"path");c.push({shape:h,effect:u,...b===void 0?{}:{paragraph:b},...x&&_>0?{direction:x}:{},start:a==="clickEffect"?"on-click":a==="withEffect"?"with-previous":"after-previous",duration:Math.max(0,...v)/1e3,...w>0?{delay:w/1e3}:{},...S===void 0?{}:{path:Lt(S,s)}})}return c}function Ut(n){const t=o(n,"a:tblPr"),s=r=>e(t,r)==="1",i=r=>{const c=o(r,"a:tcPr"),f=vt(o(r,"a:txBody"),{}),a=Z(c),d=[["left","a:lnL"],["right","a:lnR"],["top","a:lnT"],["bottom","a:lnB"]].flatMap(([v,S])=>{const k=o(c,S),M=Z(k);return M?[[v,{color:M,width:l(e(k,"w"))??12700}]]:[]}),h=e(c,"anchor"),p=v=>l(e(c,v)),y=v=>l(e(r,v)),[u,_,x,b]=["marL","marR","marT","marB"].map(p),w=y("gridSpan"),E=y("rowSpan");return{text:{...f,...u===void 0?{}:{margin_left:u},..._===void 0?{}:{margin_right:_},...x===void 0?{}:{margin_top:x},...b===void 0?{}:{margin_bottom:b},...h==="t"||h==="ctr"||h==="b"?{vertical_anchor:h}:{}},...a===void 0?{}:{fill:a},...d.length>0?{borders:Object.fromEntries(d)}:{},...w===void 0||w<2?{}:{span_width:w},...E===void 0||E<2?{}:{span_height:E},...e(r,"hMerge")==="1"||e(r,"vMerge")==="1"?{spanned:!0}:{}}};return{columns:R(o(n,"a:tblGrid"),"a:gridCol").map(r=>l(e(r,"w"))??0),rows:R(n,"a:tr").map(r=>({height:l(e(r,"h"))??0,cells:R(r,"a:tc").map(i)})),...s("firstRow")?{first_row:!0}:{},...s("firstCol")?{first_col:!0}:{},...s("lastRow")?{last_row:!0}:{},...s("lastCol")?{last_col:!0}:{},...s("bandRow")?{horz_banding:!0}:{},...s("bandCol")?{vert_banding:!0}:{}}}const rt=n=>{const t=e(n,"val");return t===void 0?n?!0:void 0:t==="1"||t==="true"},pt=n=>{const t=[];for(const s of R(n,"c:pt"))t[l(e(s,"idx"))??t.length]=J(o(s,"c:v"));return Array.from(t,s=>s??"")},Et=n=>{const t=o(n,"c:scaling"),s=l(e(o(t,"c:min"),"val")),i=l(e(o(t,"c:max"),"val")),r=l(e(o(n,"c:majorUnit"),"val")),c=o(n,"c:numFmt"),f=e(c,"formatCode"),a=y=>D(o(g(y,"c:spPr","a:ln"),"a:solidFill")),d=o(n,"c:majorGridlines"),h=a(d),p=a(n);return{...s===void 0?{}:{minimum_scale:s},...i===void 0?{}:{maximum_scale:i},...r===void 0?{}:{major_unit:r},has_major_gridlines:d!==void 0,...rt(o(n,"c:delete"))===!0?{visible:!1}:{},...f===void 0||f==="General"||e(c,"sourceLinked")==="1"?{}:{number_format:f},...e(o(t,"c:orientation"),"val")==="maxMin"?{reverse_order:!0}:{},...h===void 0?{}:{gridline_color:h},...p===void 0?{}:{line_color:p}}};function Wt(n){const t=o(n,"c:chart"),s=o(t,"c:plotArea"),i=A(s).filter(C=>T(C).endsWith("Chart")),[r]=i;if(!r)return"it has no plot";if(i.length>1)return"it combines several kinds of chart";const c=T(r),f=e(o(r,"c:grouping"),"val"),a=f==="percentStacked"?"-stacked-100":f==="stacked"?"-stacked":"",d=R(r,"c:ser"),h=d.some(C=>e(g(C,"c:marker","c:symbol"),"val")!=="none"),p=(()=>{if(c==="c:barChart")return`${e(o(r,"c:barDir"),"val")==="bar"?"bar":"column"}${a===""?"-clustered":a}`;if(c==="c:lineChart")return a===""?h?"line-markers":"line":void 0;if(c==="c:areaChart")return`area${a}`;if(c==="c:pieChart")return"pie";if(c==="c:doughnutChart")return"doughnut"})();if(!p)return`a deck has no ${c.slice(2)} chart`;const[y]=d,u=pt(o(g(y,"c:cat","c:strRef"),"c:strCache")??o(g(y,"c:cat","c:numRef"),"c:numCache")),_=d.map(C=>{const G=g(C,"c:val","c:numRef","c:numCache"),I=J(o(G,"c:formatCode")),tt=pt(G),F=D(g(C,"c:spPr","a:solidFill"))??D(g(C,"c:spPr","a:ln","a:solidFill")),X=rt(o(C,"c:smooth")),$=l(e(g(C,"c:spPr","a:ln"),"w")),j=l(e(g(C,"c:marker","c:size"),"val"));return{name:pt(g(C,"c:tx","c:strRef","c:strCache"))[0]??"",values:u.map((at,kt)=>{const ct=tt[kt];return ct===void 0||ct===""?null:Number(ct)}),...I===""||I==="General"?{}:{number_format:I},...F===void 0?{}:{color:F},...X===!0?{smooth:X}:{},...$===void 0||c!=="c:lineChart"?{}:{line_width:$/gt},...j===void 0?{}:{marker_size:j}}}),x=K(o(t,"c:title")??{},"a:t").map(J).join(""),b=l(e(V(o(t,"c:title")??{},"a:rPr"),"sz")),w=e(g(t,"c:legend","c:legendPos"),"val"),E={b:"bottom",t:"top",l:"left",r:"right"}[w??"r"],v=o(r,"c:dLbls"),S=C=>rt(o(v,C))===!0,k=e(o(v,"c:numFmt"),"formatCode"),M=e(o(v,"c:dLblPos"),"val"),N=g(v,"c:txPr","a:p","a:pPr","a:defRPr"),L=l(e(N,"sz")),B=D(o(N,"a:solidFill")),Y=l(e(o(r,"c:gapWidth"),"val")),q=l(e(o(r,"c:overlap"),"val")),U=l(e(o(r,"c:holeSize"),"val")),P=rt(o(r,"c:varyColors")),m=g(n,"c:txPr","a:p","a:pPr","a:defRPr"),O=l(e(m,"sz")),H=D(o(m,"a:solidFill")),W=o(s,"c:valAx"),z=o(s,"c:catAx");return{type:p,categories:u,series:_,...x===""?{}:{title:x},...o(t,"c:legend")?{legend:E??"right"}:{},...v&&(S("c:showVal")||S("c:showPercent")||S("c:showCatName")||S("c:showSerName"))?{labels:{show_value:S("c:showVal"),show_percentage:S("c:showPercent"),show_category_name:S("c:showCatName"),show_series_name:S("c:showSerName"),...k===void 0?{}:{number_format:k},...M===void 0?{}:{position:M},...L===void 0?{}:{size:L/100},...B===void 0?{}:{color:B}}}:{},...Y===void 0?{}:{gap_width:Y},...q===void 0?{}:{overlap:q},...U===void 0?{}:{hole_size:U},...P===void 0?{}:{vary_by_categories:P},...W?{value_axis:Et(W)}:{},...z?{category_axis:Et(z)}:{},...O===void 0?{}:{font_size:O/100},...b===void 0?{}:{title_size:b/100},...H===void 0?{}:{font_color:H}}}function Vt(n){const t=R(o(n,"a:pathLst"),"a:path"),s=t[0];if(!s||t.length>1)return;const i=c=>R(c,"a:pt").map(f=>({x:l(e(f,"x"))??0,y:l(e(f,"y"))??0})),r=[];for(const c of A(s)){const f=T(c),[a,d,h]=i(c);if(f==="a:close")r.push({op:"close"});else if(f==="a:moveTo"&&a)r.push({op:"move",...a});else if(f==="a:lnTo"&&a)r.push({op:"line",...a});else if(f==="a:cubicBezTo"&&a&&d&&h)r.push({op:"curve",x1:a.x,y1:a.y,x2:d.x,y2:d.y,...h});else return}return{w:l(e(s,"w"))??0,h:l(e(s,"h"))??0,steps:r}}function Q(n,t,s,i,r,c=()=>{}){const f=[];for(const a of A(n)){const d=T(a);if(d==="p:nvGrpSpPr"||d==="p:grpSpPr")continue;if(d==="p:sp"){const p=o(a,"p:nvSpPr"),y=e(o(p,"p:cNvPr"),"name")??"",u=g(p,"p:nvPr","p:ph"),_=o(a,"p:spPr"),{frame:x,flip:b,rotation:w}=lt(o(_,"a:xfrm")),E=o(_,"a:prstGeom"),v=e(E,"prst"),S=R(o(E,"a:avLst"),"a:gd").map(m=>Number((e(m,"fmla")??"val 0").replace("val ",""))/1e5),k=o(_,"a:ln"),M=e(o(p,"p:cNvSpPr"),"txBox")==="1",N=u?{}:M?{fill:null}:bt(o(a,"p:style"),r),L=ft(Z(_),N.fill),B=ft(k?Z(k):void 0,N.line),Y=l(e(k,"w"))??N.line_width,q=o(a,"p:txBody"),U={name:y,...x?{frame:x}:{},...b?{flip:b}:{},...w===void 0?{}:{rotation:w},...L===void 0?{}:{fill:L},...B===void 0?{}:{line:B},...Y===void 0?{}:{line_width:Y},...N.text_color===void 0?{}:{text_color:N.text_color},...q?{text:vt(q,u?{}:zt)}:{}};if(u){const m=e(u,"type")??"obj";if(m==="sldImg")continue;const O=wt.has(m)?m:"body";wt.has(m)||i(`${t}: placeholder ${y} of type ${m}, read as a body`),f.push({...U,kind:"placeholder",placeholder:{type:O,idx:l(e(u,"idx"))??0}});continue}v&&!Pt.has(v)&&i(`${t}: shape ${y} is a ${v}, read as a rectangle`);const P=Vt(o(_,"a:custGeom"));!v&&o(_,"a:custGeom")&&!P&&i(`${t}: shape ${y} has a freeform outline this does not read, read as a rectangle`),f.push({...U,...St(k),kind:M?"textbox":"autoshape",...P?{path:P}:{geometry:v&&Pt.has(v)?v:"rect"},...S.length>0?{adjustments:S}:{}});continue}if(d==="p:cxnSp"){const p=o(a,"p:spPr"),{frame:y,flip:u,rotation:_}=lt(o(p,"a:xfrm")),x=o(p,"a:ln"),b=bt(o(a,"p:style"),r),w=ft(x?Z(x):void 0,b.line),E=l(e(x,"w"))??b.line_width;f.push({name:e(g(a,"p:nvCxnSpPr","p:cNvPr"),"name")??"",kind:"autoshape",geometry:"line",...y?{frame:y}:{},...u?{flip:u}:{},..._===void 0?{}:{rotation:_},...w===void 0?{}:{line:w},...E===void 0?{}:{line_width:E},...St(x)});continue}if(d==="p:pic"){const p=o(a,"p:nvPicPr"),y=e(o(p,"p:cNvPr"),"name")??"",{frame:u,rotation:_}=lt(g(a,"p:spPr","a:xfrm")),x=g(a,"p:blipFill","a:blip"),b=e(x,"r:embed"),w=e(g(p,"p:nvPr","a:videoFile"),"r:link"),E=s.get(w??b??""),v=g(a,"p:blipFill","a:srcRect"),S=M=>(l(e(v,M))??0)/1e5,k=v?{left:S("l"),top:S("t"),right:S("r"),bottom:S("b")}:void 0;if(!E){i(`${t}: picture ${y} names no file`);continue}f.push({name:y,kind:w?"movie":"picture",...u?{frame:u}:{},..._===void 0?{}:{rotation:_},part:E,...k&&!w?{crop:k}:{}});continue}if(d==="p:graphicFrame"){const p=g(a,"a:graphic","a:graphicData","a:tbl");if(p){const u=e(g(a,"p:nvGraphicFramePr","p:cNvPr"),"name")??"",_=o(a,"p:xfrm"),x=o(_,"a:off"),b=o(_,"a:ext");f.push({name:u,kind:"table",frame:{left:l(e(x,"x"))??0,top:l(e(x,"y"))??0,width:l(e(b,"cx"))??0,height:l(e(b,"cy"))??0},table:Ut(p)});continue}const y=g(a,"a:graphic","a:graphicData","c:chart");if(y){const u=e(g(a,"p:nvGraphicFramePr","p:cNvPr"),"name")??"",_=s.get(e(y,"r:id")??""),x=Wt(_===void 0?void 0:c(_));if(typeof x=="string"){i(`${t}: chart ${u} is left out: ${x}`);continue}const b=o(a,"p:xfrm"),w=o(b,"a:off"),E=o(b,"a:ext");f.push({name:u,kind:"chart",frame:{left:l(e(w,"x"))??0,top:l(e(w,"y"))??0,width:l(e(E,"cx"))??0,height:l(e(E,"cy"))??0},chart:x});continue}}if(d==="p:grpSp"){const p=e(g(a,"p:nvGrpSpPr","p:cNvPr"),"name")??"group",y=g(a,"p:grpSpPr","a:xfrm"),u=(b,w)=>l(e(o(y,b),w))??0;e(y,"rot")&&i(`${t}: group ${p}'s rotation is left out`);const _=u("a:ext","cx")/(u("a:chExt","cx")||1)||1,x=u("a:ext","cy")/(u("a:chExt","cy")||1)||1;for(const b of Q(a,t,s,i,r,c))f.push({...b,group:p,...b.frame?{frame:{left:Math.round(u("a:off","x")+(b.frame.left-u("a:chOff","x"))*_),top:Math.round(u("a:off","y")+(b.frame.top-u("a:chOff","y"))*x),width:Math.round(b.frame.width*_),height:Math.round(b.frame.height*x)}}:{}});continue}const h=d==="p:graphicFrame"?g(a,"a:graphic","a:graphicData")?.[":@"]!==void 0?`a ${(e(g(a,"a:graphic","a:graphicData"),"uri")??"").split("/").pop()??"graphic"}`:"a graphic frame":d;i(`${t}: ${h} (${e(g(A(a)[0],"p:cNvPr"),"name")??"unnamed"}) is not read`)}return f}function it(n,t){const i=`${t.split("/").slice(0,-1).join("/")}/_rels/${t.split("/").pop()??""}.rels`,r=n[i],c=new Map;if(!r)return c;const f=ot.parse(nt(r)).find(a=>T(a)==="Relationships");for(const a of R(f,"Relationship")){const d=e(a,"Id"),h=e(a,"Target");d&&h&&e(a,"TargetMode")!=="External"&&c.set(d,_t(t,h))}return c}const ht=(n,t,s)=>{const i=t.split("/").slice(0,-1).join("/"),r=n[`${i}/_rels/${t.split("/").pop()??""}.rels`];if(!r)return;const c=ot.parse(nt(r)).find(d=>T(d)==="Relationships"),f=R(c,"Relationship").find(d=>(e(d,"Type")??"").endsWith(`/${s}`)),a=e(f,"Target");return a?_t(t,a):void 0};function mt(n,t,s){const i=o(n,"p:bg");if(!i)return;const r=o(i,"p:bgPr");if(r){const f=Z(r);if(f)return f;s(`${t}: a background that is not one colour (a gradient or a picture) is not read`);return}const c=o(i,"p:bgRef");return D(c)??void 0}export function readPptx(n,t){const s=Ct(n,{filter:Tt(t)}),i=[],r=P=>i.push(P),c=P=>{const m=s[P];if(m)return ot.parse(nt(m)).find(O=>!T(O).startsWith("?"))},f="ppt/presentation.xml",a=c(f),d=it(s,f),h=o(a,"p:sldSz"),p=R(o(a,"p:sldMasterIdLst"),"p:sldMasterId").flatMap(P=>{const m=d.get(e(P,"r:id")??"");return m?[m]:[]}),y={},u={},_=p[0]?ht(s,p[0],"theme"):void 0,x=_?c(_):void 0,b=g(x,"a:themeElements","a:clrScheme");for(const P of A(b)){const m=T(P).replace("a:",""),O=D(P);O&&typeof O!="string"&&(y[m]=O.rgb)}const w=R(g(x,"a:themeElements","a:fmtScheme","a:lnStyleLst"),"a:ln").map(P=>l(e(P,"w"))??0),E=g(x,"a:themeElements","a:fontScheme"),v=(P,m)=>{const O=e(g(E,P,m),"typeface");return O===""?void 0:O},S=v("a:majorFont","a:latin"),k=v("a:minorFont","a:latin"),M=v("a:majorFont","a:ea"),N=v("a:minorFont","a:ea");S&&(u.major=S),k&&(u.minor=k),M&&(u.major_east_asian=M),N&&(u.minor_east_asian=N);const L=new Map,B=p.map((P,m)=>{const O=c(P),H=it(s,P),W=o(O,"p:cSld"),z=o(O,"p:txStyles"),C=R(o(O,"p:sldLayoutIdLst"),"p:sldLayoutId").flatMap(tt=>{const F=H.get(e(tt,"r:id")??"");if(!F)return[];const X=c(F),$=o(X,"p:cSld");let j=e($,"name")??`Layout ${String(L.size+1)}`;for(;[...L.values()].includes(j);)j=`${j} (${String(m+1)})`;L.set(F,j);const at=mt($,F,r);return[{name:j,...at?{background:at}:{},...e(X,"showMasterSp")==="0"?{display_master_shapes:!1}:{},shapes:Q(o($,"p:spTree"),F,it(s,F),r,w)}]}),G=mt(W,P,r),I={};return o(z,"p:titleStyle")&&(I.title=st(o(z,"p:titleStyle"))),o(z,"p:bodyStyle")&&(I.body=st(o(z,"p:bodyStyle"))),o(z,"p:otherStyle")&&(I.other=st(o(z,"p:otherStyle"))),{name:e(W,"name")??`Master ${String(m+1)}`,...G?{background:G}:{},text_styles:I,shapes:Q(o(W,"p:spTree"),P,H,r,w),layouts:C}}),Y=R(o(a,"p:sldIdLst"),"p:sldId").flatMap(P=>{const m=d.get(e(P,"r:id")??"");if(!m)return[];const O=c(m),H=it(s,m),W=$=>s[$]?ot.parse(nt(s[$])).find(j=>T(j)==="c:chartSpace"):void 0,z=ht(s,m,"slideLayout"),C=ht(s,m,"notesSlide"),G=C?Q(g(c(C),"p:cSld","p:spTree"),C,new Map,()=>{},w).find($=>$.placeholder?.type==="body"&&$.text!==void 0)?.text?.paragraphs.map($=>$.runs.map(j=>j.text==="\v"?`
3
3
  `:j.text).join("")).join(`
4
- `):void 0,A=Lt(v,O=>{i(`${y}: ${O}`)});ht(o(v,"p:cSld"),y,i)&&i(`${y}: a background of its own is not read; the layout's shows`);const N=b(v,"p:cSld","p:spTree"),H=new Map((N?Q(N,"p:cNvPr"):[]).flatMap(O=>{const j=e(O,"id");return j===void 0?[]:[[j,$t(e(O,"name")??"")]]}));return[{layout:(z?F.get(z):void 0)??G[0]?.layouts[0]?.name??"",hidden:e(v,"show")==="0",...k!==void 0&&k.trim()!==""?{notes:k}:{},shapes:tt(N,y,D,i,h,U).map(O=>({...O,name:$t(O.name)})),...A?{transition:A}:{},animations:Dt(o(v,"p:timing"),H,{width:l(e(d,"cx"))??12192e3,height:l(e(d,"cy"))??6858e3},O=>{i(`${y}: ${O}`)})}]}),q=r("docProps/core.xml"),B=K(o(q,"dc:title")).trim();return{width:l(e(d,"cx"))??12192e3,height:l(e(d,"cy"))??6858e3,...B===""?{}:{title:B},theme:u,fonts:g,masters:G,slides:Y,skipped:s,parts:t}}
4
+ `):void 0,I=Gt(O,$=>{r(`${m}: ${$}`)});mt(o(O,"p:cSld"),m,r)&&r(`${m}: a background of its own is not read; the layout's shows`);const F=g(O,"p:cSld","p:spTree"),X=new Map((F?K(F,"p:cNvPr"):[]).flatMap($=>{const j=e($,"id");return j===void 0?[]:[[j,Ot(e($,"name")??"")]]}));return[{layout:(z?L.get(z):void 0)??B[0]?.layouts[0]?.name??"",hidden:e(O,"show")==="0",...G!==void 0&&G.trim()!==""?{notes:G}:{},shapes:Q(F,m,H,r,w,W).map($=>({...$,name:Ot($.name)})),...I?{transition:I}:{},animations:Bt(o(O,"p:timing"),X,{width:l(e(h,"cx"))??12192e3,height:l(e(h,"cy"))??6858e3},$=>{r(`${m}: ${$}`)})}]}),q=c("docProps/core.xml"),U=J(o(q,"dc:title")).trim();return{width:l(e(h,"cx"))??12192e3,height:l(e(h,"cy"))??6858e3,...U===""?{}:{title:U},theme:y,fonts:u,masters:B,slides:Y,skipped:i,parts:s}}
@@ -1,5 +1,5 @@
1
1
  import type { LineDash, LineEnd } from "@allyhub-next/formats";
2
- import type { FreeformPath, Color, Frame, ParagraphDef, PlaceholderType } from "@allyhub-next/slides-core";
2
+ import type { FreeformPath, Color, Frame, GradientDef, ParagraphDef, PlaceholderType, ShadowDef } from "@allyhub-next/slides-core";
3
3
  /** A shape ready to write: what any level (master, layout, slide) has. */
4
4
  export interface ShapeOut {
5
5
  id: number;
@@ -27,6 +27,11 @@ export interface ShapeOut {
27
27
  adjustments?: readonly number[];
28
28
  /** Its own fill, line and line width (`p:spPr`), where they differ from its style's. */
29
29
  fill?: Color | null;
30
+ /** How much of its fill shows through, a share. */
31
+ fillTransparency?: number;
32
+ /** A gradient in place of its fill. */
33
+ gradient?: GradientDef;
34
+ shadow?: ShadowDef;
30
35
  line?: Color | null;
31
36
  lineWidth?: number;
32
37
  lineDash?: LineDash;
@@ -1,2 +1,2 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- import{NS as s,el as n,fill as x}from"./xml.js";const m=(e,r={})=>n("a:xfrm",{rot:r.rotation===void 0?void 0:Math.round(r.rotation*6e4),flipH:r.flip?.h?1:void 0,flipV:r.flip?.v?1:void 0},n("a:off",{x:e.left,y:e.top}),n("a:ext",{cx:e.width,cy:e.height})),h=(e,r)=>n("a:prstGeom",{prst:e},n("a:avLst",{},...(r??[]).map((a,t)=>n("a:gd",{name:r?.length===1?"adj":`adj${String(t+1)}`,fmla:`val ${String(Math.round(a*1e5))}`}))));function P(e){const r=(t,i)=>n("a:pt",{x:Math.round(t),y:Math.round(i)}),a=e.steps.map(t=>t.op==="close"?n("a:close"):t.op==="move"?n("a:moveTo",{},r(t.x,t.y)):t.op==="line"?n("a:lnTo",{},r(t.x,t.y)):n("a:cubicBezTo",{},r(t.x1,t.y1),r(t.x2,t.y2),r(t.x,t.y)));return n("a:custGeom",{},n("a:avLst"),n("a:gdLst"),n("a:ahLst"),n("a:cxnLst"),n("a:rect",{l:"l",t:"t",r:"r",b:"b"}),n("a:pathLst",{},n("a:path",{w:Math.round(e.w),h:Math.round(e.h)},...a)))}const o=e=>e.line===void 0&&e.lineWidth===void 0&&e.lineDash===void 0&&e.lineBegin===void 0&&e.lineEnd===void 0?"":n("a:ln",{w:e.lineWidth},e.line===void 0?"":x(e.line),e.lineDash===void 0?"":n("a:prstDash",{val:e.lineDash}),e.lineBegin===void 0?"":n("a:headEnd",{type:e.lineBegin}),e.lineEnd===void 0?"":n("a:tailEnd",{type:e.lineEnd})),c=(e,r,a)=>n(e,{idx:r},n("a:schemeClr",{val:a})),g={shape:n("p:style",{},c("a:lnRef",1,"accent1"),c("a:fillRef",3,"accent1"),c("a:effectRef",2,"accent1"),c("a:fontRef","minor","lt1")),connector:n("p:style",{},c("a:lnRef",2,"accent1"),c("a:fillRef",0,"accent1"),c("a:effectRef",1,"accent1"),c("a:fontRef","minor","tx1"))},y=e=>n("p:ph",{type:e.type==="obj"?void 0:e.type,idx:e.idx===0?void 0:e.idx,sz:e.sz}),v=(e,r="")=>n("p:nvPr",{},e.placeholder?y(e.placeholder):"",r);export function shapeXml(e){if(e.kind==="table"||e.kind==="chart")return n("p:graphicFrame",{},n("p:nvGraphicFramePr",{},n("p:cNvPr",{id:e.id,name:e.name}),n("p:cNvGraphicFramePr",{},n("a:graphicFrameLocks",{noGrp:1})),n("p:nvPr")),n("p:xfrm",{},n("a:off",{x:e.frame?.left??0,y:e.frame?.top??0}),n("a:ext",{cx:e.frame?.width??0,cy:e.frame?.height??0})),n("a:graphic",{},n("a:graphicData",{uri:`http://schemas.openxmlformats.org/drawingml/2006/${e.kind}`},e.kind==="table"?e.table??"":n("c:chart",{"xmlns:c":"http://schemas.openxmlformats.org/drawingml/2006/chart","xmlns:r":s.r,"r:id":e.chart??""}))));if(e.kind==="cxn")return n("p:cxnSp",{},n("p:nvCxnSpPr",{},n("p:cNvPr",{id:e.id,name:e.name}),n("p:cNvCxnSpPr"),n("p:nvPr")),n("p:spPr",{},e.frame?m(e.frame,e):"",h("line"),o(e)),e.style?g[e.style]:"");if(e.kind==="pic"){const a=e.video;return n("p:pic",{},n("p:nvPicPr",{},n("p:cNvPr",{id:e.id,name:e.name,descr:e.picture?.descr},a?n("a:hlinkClick",{"r:id":"",action:"ppaction://media"}):""),n("p:cNvPicPr",{},n("a:picLocks",{noChangeAspect:1})),v(e,a?n("a:videoFile",{"r:link":a.link})+n("p:extLst",{},n("p:ext",{uri:"{DAA4B4D4-6D71-4841-9C94-3DE7FCFB9230}"},n("p14:media",{"xmlns:p14":s.p14,"r:embed":a.media}))):"")),n("p:blipFill",{},n("a:blip",{"r:embed":e.picture?.image}),e.picture?.crop?n("a:srcRect",{l:f(e.picture.crop.left),t:f(e.picture.crop.top),r:f(e.picture.crop.right),b:f(e.picture.crop.bottom)}):"",n("a:stretch",{},n("a:fillRect"))),n("p:spPr",{},e.frame?m(e.frame,e):"",h("rect")))}const r=e.placeholder?n("a:spLocks",{noGrp:1}):"";return n("p:sp",{},n("p:nvSpPr",{},n("p:cNvPr",{id:e.id,name:e.name}),n("p:cNvSpPr",{txBox:e.textbox?1:void 0},r),v(e)),n("p:spPr",{},e.frame?m(e.frame,e):"",e.path?P(e.path):e.geometry?h(e.geometry,e.adjustments):"",e.fill===void 0?"":x(e.fill),o(e)),e.style?g[e.style]:"",e.text??"")}function b(e,r,a){const t=a.flatMap(p=>p.frame?[p.frame]:[]),i=Math.min(...t.map(p=>p.left)),l=Math.min(...t.map(p=>p.top)),d=Math.max(...t.map(p=>p.left+p.width))-i,u=Math.max(...t.map(p=>p.top+p.height))-l;return n("p:grpSp",{},n("p:nvGrpSpPr",{},n("p:cNvPr",{id:e,name:r}),n("p:cNvGrpSpPr"),n("p:nvPr")),n("p:grpSpPr",{},n("a:xfrm",{},n("a:off",{x:i,y:l}),n("a:ext",{cx:d,cy:u}),n("a:chOff",{x:i,y:l}),n("a:chExt",{cx:d,cy:u}))),...a.map(shapeXml))}export function treeXml(e){const r=[];let a=Math.max(0,...e.map(t=>t.id));for(let t=0;t<e.length;t++){const i=e[t];if(!i)continue;if(i.group===void 0){r.push(shapeXml(i));continue}const l=[i];for(;e[t+1]?.group===i.group;){const d=e[++t];d&&l.push(d)}r.push(b(++a,i.group,l))}return r}const f=e=>e===0?void 0:Math.round(e*1e5);export const NO_PARAGRAPHS=[];
2
+ import{NS as u,effects as x,el as n,fill as o,gradientFill as P}from"./xml.js";const m=(e,a={})=>n("a:xfrm",{rot:a.rotation===void 0?void 0:Math.round(a.rotation*6e4),flipH:a.flip?.h?1:void 0,flipV:a.flip?.v?1:void 0},n("a:off",{x:e.left,y:e.top}),n("a:ext",{cx:e.width,cy:e.height})),h=(e,a)=>n("a:prstGeom",{prst:e},n("a:avLst",{},...(a??[]).map((r,t)=>n("a:gd",{name:a?.length===1?"adj":`adj${String(t+1)}`,fmla:`val ${String(Math.round(r*1e5))}`}))));function b(e){const a=(t,i)=>n("a:pt",{x:Math.round(t),y:Math.round(i)}),r=e.steps.map(t=>t.op==="close"?n("a:close"):t.op==="move"?n("a:moveTo",{},a(t.x,t.y)):t.op==="line"?n("a:lnTo",{},a(t.x,t.y)):n("a:cubicBezTo",{},a(t.x1,t.y1),a(t.x2,t.y2),a(t.x,t.y)));return n("a:custGeom",{},n("a:avLst"),n("a:gdLst"),n("a:ahLst"),n("a:cxnLst"),n("a:rect",{l:"l",t:"t",r:"r",b:"b"}),n("a:pathLst",{},n("a:path",{w:Math.round(e.w),h:Math.round(e.h)},...r)))}const g=e=>e.line===void 0&&e.lineWidth===void 0&&e.lineDash===void 0&&e.lineBegin===void 0&&e.lineEnd===void 0?"":n("a:ln",{w:e.lineWidth},e.line===void 0?"":o(e.line),e.lineDash===void 0?"":n("a:prstDash",{val:e.lineDash}),e.lineBegin===void 0?"":n("a:headEnd",{type:e.lineBegin}),e.lineEnd===void 0?"":n("a:tailEnd",{type:e.lineEnd})),c=(e,a,r)=>n(e,{idx:a},n("a:schemeClr",{val:r})),v={shape:n("p:style",{},c("a:lnRef",1,"accent1"),c("a:fillRef",3,"accent1"),c("a:effectRef",2,"accent1"),c("a:fontRef","minor","lt1")),connector:n("p:style",{},c("a:lnRef",2,"accent1"),c("a:fillRef",0,"accent1"),c("a:effectRef",1,"accent1"),c("a:fontRef","minor","tx1"))},k=e=>n("p:ph",{type:e.type==="obj"?void 0:e.type,idx:e.idx===0?void 0:e.idx,sz:e.sz}),y=(e,a="")=>n("p:nvPr",{},e.placeholder?k(e.placeholder):"",a);export function shapeXml(e){if(e.kind==="table"||e.kind==="chart")return n("p:graphicFrame",{},n("p:nvGraphicFramePr",{},n("p:cNvPr",{id:e.id,name:e.name}),n("p:cNvGraphicFramePr",{},n("a:graphicFrameLocks",{noGrp:1})),n("p:nvPr")),n("p:xfrm",{},n("a:off",{x:e.frame?.left??0,y:e.frame?.top??0}),n("a:ext",{cx:e.frame?.width??0,cy:e.frame?.height??0})),n("a:graphic",{},n("a:graphicData",{uri:`http://schemas.openxmlformats.org/drawingml/2006/${e.kind}`},e.kind==="table"?e.table??"":n("c:chart",{"xmlns:c":"http://schemas.openxmlformats.org/drawingml/2006/chart","xmlns:r":u.r,"r:id":e.chart??""}))));if(e.kind==="cxn")return n("p:cxnSp",{},n("p:nvCxnSpPr",{},n("p:cNvPr",{id:e.id,name:e.name}),n("p:cNvCxnSpPr"),n("p:nvPr")),n("p:spPr",{},e.frame?m(e.frame,e):"",h("line"),g(e)),e.style?v[e.style]:"");if(e.kind==="pic"){const r=e.video;return n("p:pic",{},n("p:nvPicPr",{},n("p:cNvPr",{id:e.id,name:e.name,descr:e.picture?.descr},r?n("a:hlinkClick",{"r:id":"",action:"ppaction://media"}):""),n("p:cNvPicPr",{},n("a:picLocks",{noChangeAspect:1})),y(e,r?n("a:videoFile",{"r:link":r.link})+n("p:extLst",{},n("p:ext",{uri:"{DAA4B4D4-6D71-4841-9C94-3DE7FCFB9230}"},n("p14:media",{"xmlns:p14":u.p14,"r:embed":r.media}))):"")),n("p:blipFill",{},n("a:blip",{"r:embed":e.picture?.image}),e.picture?.crop?n("a:srcRect",{l:f(e.picture.crop.left),t:f(e.picture.crop.top),r:f(e.picture.crop.right),b:f(e.picture.crop.bottom)}):"",n("a:stretch",{},n("a:fillRect"))),n("p:spPr",{},e.frame?m(e.frame,e):"",h("rect"),e.shadow?x(e.shadow):""))}const a=e.placeholder?n("a:spLocks",{noGrp:1}):"";return n("p:sp",{},n("p:nvSpPr",{},n("p:cNvPr",{id:e.id,name:e.name}),n("p:cNvSpPr",{txBox:e.textbox?1:void 0},a),y(e)),n("p:spPr",{},e.frame?m(e.frame,e):"",e.path?b(e.path):e.geometry?h(e.geometry,e.adjustments):"",e.gradient?P(e.gradient):e.fill===void 0?"":o(e.fill,e.fillTransparency),g(e),e.shadow?x(e.shadow):""),e.style?v[e.style]:"",e.text??"")}function S(e,a,r){const t=r.flatMap(p=>p.frame?[p.frame]:[]),i=Math.min(...t.map(p=>p.left)),d=Math.min(...t.map(p=>p.top)),l=Math.max(...t.map(p=>p.left+p.width))-i,s=Math.max(...t.map(p=>p.top+p.height))-d;return n("p:grpSp",{},n("p:nvGrpSpPr",{},n("p:cNvPr",{id:e,name:a}),n("p:cNvGrpSpPr"),n("p:nvPr")),n("p:grpSpPr",{},n("a:xfrm",{},n("a:off",{x:i,y:d}),n("a:ext",{cx:l,cy:s}),n("a:chOff",{x:i,y:d}),n("a:chExt",{cx:l,cy:s}))),...r.map(shapeXml))}export function treeXml(e){const a=[];let r=Math.max(0,...e.map(t=>t.id));for(let t=0;t<e.length;t++){const i=e[t];if(!i)continue;if(i.group===void 0){a.push(shapeXml(i));continue}const d=[i];for(;e[t+1]?.group===i.group;){const l=e[++t];l&&d.push(l)}a.push(S(++r,i.group,d))}return a}const f=e=>e===0?void 0:Math.round(e*1e5);export const NO_PARAGRAPHS=[];
@@ -1,4 +1,9 @@
1
1
  import type { FontDef, LevelStyle, LevelsDef, ParagraphDef, ParagraphFormatDef, TextFrameDef, TextStyle } from "@allyhub-next/slides-core";
2
+ /**
3
+ * How a run's address waits in its text until the slide's writer makes it a
4
+ * relationship (`linked`): a text is written before its part's are known.
5
+ */
6
+ export declare const LINK = "link:";
2
7
  /** A run's or a level's character properties (`a:rPr`, `a:defRPr`, `a:endParaRPr`). */
3
8
  export declare function runProps(tag: "a:rPr" | "a:defRPr" | "a:endParaRPr", f: FontDef | undefined, lang?: string): string;
4
9
  /** A list style's levels as `a:lvl1pPr`…`a:lvl9pPr`, the empty ones left out; under `tag`. */
@@ -13,7 +18,13 @@ export declare const bodyOfStyle: (s: TextStyle) => Parameters<typeof bodyProps>
13
18
  export interface TextOverride {
14
19
  font: FontDef;
15
20
  alignment?: ParagraphFormatDef["alignment"];
21
+ numbered?: ParagraphFormatDef["numbered"];
22
+ /** A list's room for its numbers. */
23
+ margin_left?: ParagraphFormatDef["margin_left"];
24
+ indent?: ParagraphFormatDef["indent"];
16
25
  }
26
+ /** A slide number as a master or a layout has it: PowerPoint's sign for a number. */
27
+ export declare const SLIDE_NUMBER: ParagraphDef[];
17
28
  /** A paragraph: its level and own properties, its runs, `\v` a line break. */
18
29
  export declare function paragraph(p: ParagraphDef, lang: string | undefined, over?: TextOverride): string;
19
30
  /** A text body: body properties, list style, paragraphs (at least one, as the schema asks). */
@@ -1,2 +1,2 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- import{face as g}from"./theme.js";import{centipoints as d,el as t,esc as b,fill as f}from"./xml.js";const h={t:"t",ctr:"ctr",b:"b"},P={"+mj-lt":"+mj-ea","+mn-lt":"+mn-ea"};export function runProps(n,e,a){const r=e?.rgb!==void 0?f({rgb:e.rgb}):e?.color!==void 0?f(e.color):"",i=e?.name===void 0?void 0:P[e.name];return t(n,{lang:a,sz:e?.size===void 0?void 0:d(e.size),b:e?.bold,i:e?.italic,u:e?.underline===void 0?void 0:e.underline?"sng":"none",spc:e?.spacing===void 0?void 0:d(e.spacing)},r,e?.name===void 0?"":t("a:latin",{typeface:g(e.name)}),i===void 0?"":t("a:ea",{typeface:i}))}function m(n,e){const a=n.line_spacing;return{attrs:{marL:n.margin_left,indent:n.indent,algn:n.alignment},children:[a===void 0?"":t("a:lnSpc",{},"lines"in a?t("a:spcPct",{val:Math.round(a.lines*1e5)}):t("a:spcPts",{val:d(a.fixed)})),n.space_before===void 0?"":t("a:spcBef",{},t("a:spcPts",{val:d(n.space_before)})),n.space_after===void 0?"":t("a:spcAft",{},t("a:spcPts",{val:d(n.space_after)})),n.bullet_font===void 0||n.bullet===null?"":t("a:buFont",{typeface:n.bullet_font}),n.bullet===void 0?"":n.bullet===null?t("a:buNone"):t("a:buChar",{char:n.bullet}),e&&n.font&&Object.keys(n.font).length>0?runProps("a:defRPr",n.font):""]}}export function listStyle(n,e="a:lstStyle"){const a=n.slice(0,9).flatMap((r,i)=>{const{attrs:o,children:l}=m(r,!0),u=l.join("");return u===""&&Object.values(o).every(s=>s===void 0)?[]:[t(`a:lvl${String(i+1)}pPr`,o,u)]});return t(e,{},...a)}export function levelOf(n){return{alignment:n.alignment,line_spacing:n.line_spacing,space_before:n.space_before,space_after:n.space_after,bullet:n.bullet?n.bullet.char:null,...n.bullet?.font===void 0?{}:{bullet_font:n.bullet.font},margin_left:n.margin_left,indent:n.indent,font:n.font}}export function bodyProps(n,e,a={}){const r=e!==void 0?t("a:normAutofit",{fontScale:Math.round(e*1e5)}):n.auto_size==="text"?t("a:normAutofit"):n.auto_size==="shape"?t("a:spAutoFit"):n.auto_size==="none"?t("a:noAutofit"):"";return t("a:bodyPr",{wrap:n.word_wrap===void 0?void 0:n.word_wrap?"square":"none",lIns:n.margin_left,tIns:n.margin_top,rIns:n.margin_right,bIns:n.margin_bottom,anchor:n.vertical_anchor===void 0?void 0:h[n.vertical_anchor],...a},r)}export const bodyOfStyle=n=>({vertical_anchor:n.vertical_anchor,auto_size:n.auto_size,word_wrap:n.word_wrap,margin_left:n.margins.left,margin_top:n.margins.top,margin_right:n.margins.right,margin_bottom:n.margins.bottom});export function paragraph(n,e,a){const{attrs:r,children:i}=m({...n,...a?.alignment===void 0?{}:{alignment:a.alignment}},!1),o=t("a:pPr",{...r,lvl:n.level>0?n.level:void 0},...i),l=n.runs.flatMap(u=>u.text.split("\v").flatMap((c,s)=>{const p={...n.font,...a?.font,...u.font},_=runProps("a:rPr",Object.keys(p).length>0?p:void 0,e);return[...s>0?[t("a:br",{},runProps("a:rPr",void 0,e))]:[],...c===""?[]:[t("a:r",{},_,t("a:t",{},b(c)))]]}));return t("a:p",{},o==="<a:pPr/>"?"":o,...l,l.length===0?runProps("a:endParaRPr",a?.font,e):"")}export function txBody(n,e,a,r,i,o){const l=r.map(u=>paragraph(u,i,o));return t(n,{},e,a,...l.length>0?l:[t("a:p")])}
2
+ import{face as _}from"./theme.js";import{centipoints as u,color as h,el as t,esc as m,fill as b}from"./xml.js";const y={t:"t",ctr:"ctr",b:"b"},P={"+mj-lt":"+mj-ea","+mn-lt":"+mn-ea"};export const LINK="link:";export function runProps(n,e,i){const a=e?.rgb!==void 0?b({rgb:e.rgb}):e?.color!==void 0?b(e.color):"",d=e?.name===void 0?void 0:P[e.name];return t(n,{lang:i,sz:e?.size===void 0?void 0:u(e.size),b:e?.bold,i:e?.italic,u:e?.underline===void 0?void 0:e.underline?"sng":"none",strike:e?.strike===void 0?void 0:e.strike?"sngStrike":"noStrike",baseline:e?.baseline===void 0?void 0:Math.round(e.baseline*1e5),spc:e?.spacing===void 0?void 0:u(e.spacing)},a,e?.highlight===void 0?"":t("a:highlight",{},h({rgb:e.highlight})),e?.name===void 0?"":t("a:latin",{typeface:_(e.name)}),d===void 0?"":t("a:ea",{typeface:d}),e?.link===void 0?"":t("a:hlinkClick",{"r:id":`${LINK}${e.link}`}))}function g(n,e){const i=n.line_spacing;return{attrs:{marL:n.margin_left,indent:n.indent,algn:n.alignment},children:[i===void 0?"":t("a:lnSpc",{},"lines"in i?t("a:spcPct",{val:Math.round(i.lines*1e5)}):t("a:spcPts",{val:u(i.fixed)})),n.space_before===void 0?"":t("a:spcBef",{},t("a:spcPts",{val:u(n.space_before)})),n.space_after===void 0?"":t("a:spcAft",{},t("a:spcPts",{val:u(n.space_after)})),n.numbered!==void 0||n.bullet_font===void 0||n.bullet===null?"":t("a:buFont",{typeface:n.bullet_font}),n.numbered!==void 0?t("a:buAutoNum",{type:n.numbered}):n.bullet===void 0?"":n.bullet===null?t("a:buNone"):t("a:buChar",{char:n.bullet}),e&&n.font&&Object.keys(n.font).length>0?runProps("a:defRPr",n.font):""]}}export function listStyle(n,e="a:lstStyle"){const i=n.slice(0,9).flatMap((a,d)=>{const{attrs:l,children:o}=g(a,!0),r=o.join("");return r===""&&Object.values(l).every(c=>c===void 0)?[]:[t(`a:lvl${String(d+1)}pPr`,l,r)]});return t(e,{},...i)}export function levelOf(n){return{alignment:n.alignment,line_spacing:n.line_spacing,space_before:n.space_before,space_after:n.space_after,...n.numbered===void 0?{bullet:n.bullet?n.bullet.char:null}:{numbered:n.numbered},...n.bullet?.font===void 0?{}:{bullet_font:n.bullet.font},margin_left:n.margin_left,indent:n.indent,font:n.font}}export function bodyProps(n,e,i={}){const a=e!==void 0?t("a:normAutofit",{fontScale:Math.round(e*1e5)}):n.auto_size==="text"?t("a:normAutofit"):n.auto_size==="shape"?t("a:spAutoFit"):n.auto_size==="none"?t("a:noAutofit"):"";return t("a:bodyPr",{wrap:n.word_wrap===void 0?void 0:n.word_wrap?"square":"none",lIns:n.margin_left,tIns:n.margin_top,rIns:n.margin_right,bIns:n.margin_bottom,anchor:n.vertical_anchor===void 0?void 0:y[n.vertical_anchor],...i},a)}export const bodyOfStyle=n=>({vertical_anchor:n.vertical_anchor,auto_size:n.auto_size,word_wrap:n.word_wrap,margin_left:n.margins.left,margin_top:n.margins.top,margin_right:n.margins.right,margin_bottom:n.margins.bottom});const x="{B6F15528-21DE-4FAA-801E-634DDDAF4B2B}";export const SLIDE_NUMBER=[{level:0,runs:[{text:"‹#›",field:"slidenum"}]}];export function paragraph(n,e,i){const{attrs:a,children:d}=g({...n,...i?.alignment===void 0?{}:{alignment:i.alignment},...i?.numbered===void 0?{}:{numbered:i.numbered},...i?.margin_left===void 0?{}:{margin_left:i.margin_left},...i?.indent===void 0?{}:{indent:i.indent}},!1),l=t("a:pPr",{...a,lvl:n.level>0?n.level:void 0},...d),o=n.runs.flatMap(r=>r.text.split("\v").flatMap((s,c)=>{const p={...n.font,...i?.font,...r.font},f=runProps("a:rPr",Object.keys(p).length>0?p:void 0,e);return[...c>0?[t("a:br",{},runProps("a:rPr",void 0,e))]:[],...s===""?[]:[r.field?t("a:fld",{id:x,type:r.field},f,t("a:t",{},m(s))):t("a:r",{},f,t("a:t",{},m(s)))]]}));return t("a:p",{},l==="<a:pPr/>"?"":l,...o,o.length===0?runProps("a:endParaRPr",i?.font,e):"")}export function txBody(n,e,i,a,d,l){const o=a.map(r=>paragraph(r,d,l));return t(n,{},e,i,...o.length>0?o:[t("a:p")])}