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
@@ -456,6 +456,7 @@ export declare const DATA_FILES: {
456
456
  }, z.core.$strict>>;
457
457
  width: z.ZodOptional<z.ZodNumber>;
458
458
  hidden: z.ZodOptional<z.ZodBoolean>;
459
+ level: z.ZodOptional<z.ZodNumber>;
459
460
  }, z.core.$strict>>>;
460
461
  rows: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
461
462
  format: z.ZodOptional<z.ZodString>;
@@ -596,6 +597,7 @@ export declare const DATA_FILES: {
596
597
  }, z.core.$strict>>;
597
598
  height: z.ZodOptional<z.ZodNumber>;
598
599
  hidden: z.ZodOptional<z.ZodBoolean>;
600
+ level: z.ZodOptional<z.ZodNumber>;
599
601
  }, z.core.$strict>>>;
600
602
  cells: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodUnion<readonly [z.ZodNumber, z.ZodBoolean, z.ZodString, z.ZodNull]>, z.ZodObject<{
601
603
  format: z.ZodOptional<z.ZodString>;
@@ -1671,6 +1673,58 @@ export declare const DATA_FILES: {
1671
1673
  title_size: z.ZodOptional<z.ZodNumber>;
1672
1674
  color: z.ZodOptional<z.ZodString>;
1673
1675
  }, z.core.$strict>>>;
1676
+ pictures: z.ZodOptional<z.ZodArray<z.ZodObject<{
1677
+ file: z.ZodString;
1678
+ at: z.ZodString;
1679
+ x: z.ZodOptional<z.ZodNumber>;
1680
+ y: z.ZodOptional<z.ZodNumber>;
1681
+ width: z.ZodOptional<z.ZodNumber>;
1682
+ height: z.ZodOptional<z.ZodNumber>;
1683
+ }, z.core.$strict>>>;
1684
+ links: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
1685
+ notes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
1686
+ text: z.ZodString;
1687
+ author: z.ZodOptional<z.ZodString>;
1688
+ }, z.core.$strict>]>>>;
1689
+ print: z.ZodOptional<z.ZodObject<{
1690
+ area: z.ZodOptional<z.ZodString>;
1691
+ title_rows: z.ZodOptional<z.ZodString>;
1692
+ title_cols: z.ZodOptional<z.ZodString>;
1693
+ orientation: z.ZodOptional<z.ZodEnum<{
1694
+ portrait: "portrait";
1695
+ landscape: "landscape";
1696
+ }>>;
1697
+ paper: z.ZodOptional<z.ZodEnum<{
1698
+ letter: "letter";
1699
+ legal: "legal";
1700
+ a3: "a3";
1701
+ a4: "a4";
1702
+ a5: "a5";
1703
+ }>>;
1704
+ fit: z.ZodOptional<z.ZodObject<{
1705
+ width: z.ZodOptional<z.ZodNumber>;
1706
+ height: z.ZodOptional<z.ZodNumber>;
1707
+ }, z.core.$strict>>;
1708
+ margins: z.ZodOptional<z.ZodObject<{
1709
+ left: z.ZodOptional<z.ZodNumber>;
1710
+ right: z.ZodOptional<z.ZodNumber>;
1711
+ top: z.ZodOptional<z.ZodNumber>;
1712
+ bottom: z.ZodOptional<z.ZodNumber>;
1713
+ header: z.ZodOptional<z.ZodNumber>;
1714
+ footer: z.ZodOptional<z.ZodNumber>;
1715
+ }, z.core.$strict>>;
1716
+ header: z.ZodOptional<z.ZodObject<{
1717
+ left: z.ZodOptional<z.ZodString>;
1718
+ center: z.ZodOptional<z.ZodString>;
1719
+ right: z.ZodOptional<z.ZodString>;
1720
+ }, z.core.$strict>>;
1721
+ footer: z.ZodOptional<z.ZodObject<{
1722
+ left: z.ZodOptional<z.ZodString>;
1723
+ center: z.ZodOptional<z.ZodString>;
1724
+ right: z.ZodOptional<z.ZodString>;
1725
+ }, z.core.$strict>>;
1726
+ }, z.core.$strict>>;
1727
+ protect: z.ZodOptional<z.ZodBoolean>;
1674
1728
  }, z.core.$strict>>;
1675
1729
  checks: z.ZodOptional<z.ZodArray<z.ZodObject<{
1676
1730
  name: z.ZodString;
@@ -1710,6 +1764,48 @@ export declare const DATA_FILES: {
1710
1764
  hlink: "hlink";
1711
1765
  folHlink: "folHlink";
1712
1766
  }>, z.ZodString]>>;
1767
+ fill_transparency: z.ZodOptional<z.ZodNumber>;
1768
+ gradient: z.ZodOptional<z.ZodObject<{
1769
+ angle: z.ZodOptional<z.ZodNumber>;
1770
+ stops: z.ZodArray<z.ZodObject<{
1771
+ at: z.ZodNumber;
1772
+ color: z.ZodUnion<readonly [z.ZodEnum<{
1773
+ dk1: "dk1";
1774
+ lt1: "lt1";
1775
+ dk2: "dk2";
1776
+ lt2: "lt2";
1777
+ accent1: "accent1";
1778
+ accent2: "accent2";
1779
+ accent3: "accent3";
1780
+ accent4: "accent4";
1781
+ accent5: "accent5";
1782
+ accent6: "accent6";
1783
+ hlink: "hlink";
1784
+ folHlink: "folHlink";
1785
+ }>, z.ZodString]>;
1786
+ transparency: z.ZodOptional<z.ZodNumber>;
1787
+ }, z.core.$strict>>;
1788
+ }, z.core.$strict>>;
1789
+ shadow: z.ZodOptional<z.ZodObject<{
1790
+ color: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
1791
+ dk1: "dk1";
1792
+ lt1: "lt1";
1793
+ dk2: "dk2";
1794
+ lt2: "lt2";
1795
+ accent1: "accent1";
1796
+ accent2: "accent2";
1797
+ accent3: "accent3";
1798
+ accent4: "accent4";
1799
+ accent5: "accent5";
1800
+ accent6: "accent6";
1801
+ hlink: "hlink";
1802
+ folHlink: "folHlink";
1803
+ }>, z.ZodString]>>;
1804
+ blur: z.ZodOptional<z.ZodNumber>;
1805
+ distance: z.ZodOptional<z.ZodNumber>;
1806
+ angle: z.ZodOptional<z.ZodNumber>;
1807
+ transparency: z.ZodOptional<z.ZodNumber>;
1808
+ }, z.core.$strict>>;
1713
1809
  line: z.ZodOptional<z.ZodUnion<readonly [z.ZodUnion<readonly [z.ZodEnum<{
1714
1810
  dk1: "dk1";
1715
1811
  lt1: "lt1";
@@ -1738,17 +1834,17 @@ export declare const DATA_FILES: {
1738
1834
  line_begin: z.ZodOptional<z.ZodEnum<{
1739
1835
  arrow: "arrow";
1740
1836
  triangle: "triangle";
1837
+ diamond: "diamond";
1741
1838
  none: "none";
1742
1839
  stealth: "stealth";
1743
- diamond: "diamond";
1744
1840
  oval: "oval";
1745
1841
  }>>;
1746
1842
  line_end: z.ZodOptional<z.ZodEnum<{
1747
1843
  arrow: "arrow";
1748
1844
  triangle: "triangle";
1845
+ diamond: "diamond";
1749
1846
  none: "none";
1750
1847
  stealth: "stealth";
1751
- diamond: "diamond";
1752
1848
  oval: "oval";
1753
1849
  }>>;
1754
1850
  text: z.ZodOptional<z.ZodObject<{
@@ -1776,6 +1872,14 @@ export declare const DATA_FILES: {
1776
1872
  ctr: "ctr";
1777
1873
  just: "just";
1778
1874
  }>>;
1875
+ numbered: z.ZodOptional<z.ZodEnum<{
1876
+ arabicPeriod: "arabicPeriod";
1877
+ arabicParenR: "arabicParenR";
1878
+ alphaLcPeriod: "alphaLcPeriod";
1879
+ alphaUcPeriod: "alphaUcPeriod";
1880
+ romanLcPeriod: "romanLcPeriod";
1881
+ romanUcPeriod: "romanUcPeriod";
1882
+ }>>;
1779
1883
  }, z.core.$strict>>;
1780
1884
  textbox: z.ZodOptional<z.ZodLiteral<true>>;
1781
1885
  picture: z.ZodOptional<z.ZodString>;
@@ -1794,6 +1898,22 @@ export declare const DATA_FILES: {
1794
1898
  ellipse: "ellipse";
1795
1899
  triangle: "triangle";
1796
1900
  rightArrow: "rightArrow";
1901
+ leftArrow: "leftArrow";
1902
+ upArrow: "upArrow";
1903
+ downArrow: "downArrow";
1904
+ leftRightArrow: "leftRightArrow";
1905
+ diamond: "diamond";
1906
+ parallelogram: "parallelogram";
1907
+ trapezoid: "trapezoid";
1908
+ pentagon: "pentagon";
1909
+ hexagon: "hexagon";
1910
+ octagon: "octagon";
1911
+ chevron: "chevron";
1912
+ homePlate: "homePlate";
1913
+ plus: "plus";
1914
+ star4: "star4";
1915
+ star5: "star5";
1916
+ wedgeRectCallout: "wedgeRectCallout";
1797
1917
  }>>;
1798
1918
  path: z.ZodOptional<z.ZodObject<{
1799
1919
  w: z.ZodNumber;
@@ -1843,6 +1963,14 @@ export declare const DATA_FILES: {
1843
1963
  ctr: "ctr";
1844
1964
  just: "just";
1845
1965
  }>>;
1966
+ numbered: z.ZodOptional<z.ZodEnum<{
1967
+ arabicPeriod: "arabicPeriod";
1968
+ arabicParenR: "arabicParenR";
1969
+ alphaLcPeriod: "alphaLcPeriod";
1970
+ alphaUcPeriod: "alphaUcPeriod";
1971
+ romanLcPeriod: "romanLcPeriod";
1972
+ romanUcPeriod: "romanUcPeriod";
1973
+ }>>;
1846
1974
  }, z.core.$strict>>;
1847
1975
  line: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
1848
1976
  dk1: "dk1";
@@ -1875,12 +2003,16 @@ export declare const DATA_FILES: {
1875
2003
  "area-stacked-100": "area-stacked-100";
1876
2004
  pie: "pie";
1877
2005
  doughnut: "doughnut";
2006
+ scatter: "scatter";
2007
+ "scatter-lines": "scatter-lines";
2008
+ "scatter-smooth": "scatter-smooth";
1878
2009
  }>;
1879
2010
  data: z.ZodOptional<z.ZodString>;
1880
- categories: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>;
2011
+ categories: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
1881
2012
  series: z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
1882
2013
  name: z.ZodString;
1883
2014
  values: z.ZodOptional<z.ZodArray<z.ZodNullable<z.ZodNumber>>>;
2015
+ x: z.ZodOptional<z.ZodArray<z.ZodNullable<z.ZodNumber>>>;
1884
2016
  color: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
1885
2017
  dk1: "dk1";
1886
2018
  lt1: "lt1";
@@ -0,0 +1,17 @@
1
+ export interface ZipLimits {
2
+ /** Entries in the file. */
3
+ parts: number;
4
+ /** Bytes of all its entries unzipped. */
5
+ bytes: number;
6
+ }
7
+ /** What Office's own files stay well under, and a hosted Studio can afford. */
8
+ export declare const ZIP_LIMITS: ZipLimits;
9
+ /** A file past its limits: a reader says it as it is. */
10
+ export declare class ZipLimitError extends Error {
11
+ }
12
+ /** An `unzipSync` filter that refuses a file past `limits`, before anything is inflated. */
13
+ export declare function withinZip(limits?: Partial<ZipLimits>): (entry: {
14
+ name: string;
15
+ originalSize: number;
16
+ }) => boolean;
17
+ //# sourceMappingURL=zip.d.ts.map
@@ -0,0 +1,2 @@
1
+ /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
+ export const ZIP_LIMITS={parts:1e4,bytes:1610612736};export class ZipLimitError extends Error{}export function withinZip(t={}){const{parts:r,bytes:n}={...ZIP_LIMITS,...t};let e=0,o=0;return i=>{if(e+=1,o+=i.originalSize,e>r)throw new ZipLimitError(`It has more than ${String(r)} parts.`);if(o>n)throw new ZipLimitError(`It unzips to more than ${String(Math.round(n/1024/1024))} MB.`);return!0}}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allyhub-next/formats",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allyhub-next/measure",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allyhub-next/media",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allyhub-next/model",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allyhub-next/project",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -17,6 +17,7 @@ export declare const HostContextSchema: z.ZodObject<{
17
17
  project: z.ZodObject<{
18
18
  name: z.ZodString;
19
19
  }, z.core.$strict>;
20
+ notes: z.ZodOptional<z.ZodBoolean>;
20
21
  item: z.ZodObject<{
21
22
  kind: z.ZodEnum<{
22
23
  video: "video";
@@ -65,6 +66,7 @@ export declare const HOST_METHODS: {
65
66
  project: z.ZodObject<{
66
67
  name: z.ZodString;
67
68
  }, z.core.$strict>;
69
+ notes: z.ZodOptional<z.ZodBoolean>;
68
70
  item: z.ZodObject<{
69
71
  kind: z.ZodEnum<{
70
72
  video: "video";
@@ -121,6 +123,9 @@ export declare const HOST_METHODS: {
121
123
  }, z.core.$strict>, z.ZodObject<{
122
124
  delivered: z.ZodBoolean;
123
125
  }, z.core.$strict>>;
126
+ readonly "note/begin": import("./jsonrpc.js").MethodSpec<z.ZodObject<{}, z.core.$strict>, z.ZodObject<{
127
+ begun: z.ZodBoolean;
128
+ }, z.core.$strict>>;
124
129
  readonly "tools/call": import("./jsonrpc.js").MethodSpec<z.ZodObject<{
125
130
  name: z.ZodString;
126
131
  arguments: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
@@ -221,6 +226,7 @@ export declare const HOST_NOTIFICATIONS: {
221
226
  project: z.ZodObject<{
222
227
  name: z.ZodString;
223
228
  }, z.core.$strict>;
229
+ notes: z.ZodOptional<z.ZodBoolean>;
224
230
  item: z.ZodObject<{
225
231
  kind: z.ZodEnum<{
226
232
  video: "video";
@@ -263,6 +269,7 @@ export declare const EDITOR_HOST_METHODS: {
263
269
  project: z.ZodObject<{
264
270
  name: z.ZodString;
265
271
  }, z.core.$strict>;
272
+ notes: z.ZodOptional<z.ZodBoolean>;
266
273
  item: z.ZodObject<{
267
274
  kind: z.ZodEnum<{
268
275
  video: "video";
@@ -319,6 +326,9 @@ export declare const EDITOR_HOST_METHODS: {
319
326
  }, z.core.$strict>, z.ZodObject<{
320
327
  delivered: z.ZodBoolean;
321
328
  }, z.core.$strict>>;
329
+ readonly "note/begin": import("./jsonrpc.js").MethodSpec<z.ZodObject<{}, z.core.$strict>, z.ZodObject<{
330
+ begun: z.ZodBoolean;
331
+ }, z.core.$strict>>;
322
332
  readonly "tools/call": import("./jsonrpc.js").MethodSpec<z.ZodObject<{
323
333
  name: z.ZodString;
324
334
  arguments: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
@@ -1,2 +1,2 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- import{z as t}from"zod";import{EDITORS as s,KINDS as n}from"@allyhub-next/formats";import{FILE_METHODS as i,FILE_NOTIFICATIONS as a,PathSchema as o}from"./files.js";import{method as e,notification as r}from"./jsonrpc.js";import{TOOL_NOTIFICATIONS as c}from"./tools.js";export const ThemeSchema=t.enum(["light","dark"]),HostContextSchema=t.strictObject({locale:t.string().min(2),theme:ThemeSchema,agent:t.strictObject({name:t.string().min(1)}).optional(),project:t.strictObject({name:t.string().min(1)}),item:t.strictObject({kind:t.enum(n),dir:o,entry:o}),editor:t.enum(s)}),OpenTargetSchema=t.discriminatedUnion("type",[t.strictObject({type:t.literal("file"),path:o,line:t.int().positive().optional()}),t.strictObject({type:t.literal("browser"),url:t.url({protocol:/^https?$/u}).optional(),tabId:t.string().min(1).optional()})]),EDITOR_STATES=["saved","saving","unsaved","error"],HOST_METHODS={"host/context":e(t.strictObject({}),HostContextSchema,"Where the editor runs."),"items/open":e(t.strictObject({target:OpenTargetSchema}),t.strictObject({}),"Shows another item, a file or a page, where the host shows things."),"storage/get":e(t.strictObject({key:t.string().min(1)}),t.strictObject({value:t.unknown()}),"What the editor kept for this person on this computer (a hand sort, what was last seen), or null."),"storage/set":e(t.strictObject({key:t.string().min(1),value:t.unknown()}),t.strictObject({}),"Keeps a value for this person on this computer; null removes it."),"editor/state":e(t.strictObject({state:t.enum(EDITOR_STATES),message:t.string().optional()}),t.strictObject({}),"Says whether what the person typed is saved."),"agent/ask":e(t.strictObject({text:t.string().min(1)}),t.strictObject({delivered:t.boolean()}),"Puts words before the person's agent, for them to go on and send; false where no agent takes them. Never sent by itself."),"tools/call":e(t.strictObject({name:t.string().min(1),arguments:t.record(t.string(),t.unknown()).default({})}),t.strictObject({result:t.unknown()}),"Runs one of the project server's tools (tools.ts's PROJECT_TOOLS), for an editor that needs more than files (a video's preview, a still).")},HOST_NOTIFICATIONS={"host/context-changed":r(HostContextSchema,"The language, theme or agent changed."),"editor/command":r(t.strictObject({command:t.enum(["export"])}),"The host around the editor asked it to do what its own shortcut does."),...a,...c},EDITOR_HOST_METHODS={...i,...HOST_METHODS};
2
+ import{z as t}from"zod";import{EDITORS as s,KINDS as r}from"@allyhub-next/formats";import{FILE_METHODS as i,FILE_NOTIFICATIONS as a,PathSchema as o}from"./files.js";import{method as e,notification as n}from"./jsonrpc.js";import{TOOL_NOTIFICATIONS as c}from"./tools.js";export const ThemeSchema=t.enum(["light","dark"]),HostContextSchema=t.strictObject({locale:t.string().min(2),theme:ThemeSchema,agent:t.strictObject({name:t.string().min(1)}).optional(),project:t.strictObject({name:t.string().min(1)}),notes:t.boolean().optional(),item:t.strictObject({kind:t.enum(r),dir:o,entry:o}),editor:t.enum(s)}),OpenTargetSchema=t.discriminatedUnion("type",[t.strictObject({type:t.literal("file"),path:o,line:t.int().positive().optional()}),t.strictObject({type:t.literal("browser"),url:t.url({protocol:/^https?$/u}).optional(),tabId:t.string().min(1).optional()})]),EDITOR_STATES=["saved","saving","unsaved","error"],HOST_METHODS={"host/context":e(t.strictObject({}),HostContextSchema,"Where the editor runs."),"items/open":e(t.strictObject({target:OpenTargetSchema}),t.strictObject({}),"Shows another item, a file or a page, where the host shows things."),"storage/get":e(t.strictObject({key:t.string().min(1)}),t.strictObject({value:t.unknown()}),"What the editor kept for this person on this computer (a hand sort, what was last seen), or null."),"storage/set":e(t.strictObject({key:t.string().min(1),value:t.unknown()}),t.strictObject({}),"Keeps a value for this person on this computer; null removes it."),"editor/state":e(t.strictObject({state:t.enum(EDITOR_STATES),message:t.string().optional()}),t.strictObject({}),"Says whether what the person typed is saved."),"agent/ask":e(t.strictObject({text:t.string().min(1)}),t.strictObject({delivered:t.boolean()}),"Puts words before the person's agent, for them to go on and send; false where no agent takes them. Never sent by itself."),"note/begin":e(t.strictObject({}),t.strictObject({begun:t.boolean()}),"Starts the host's Note mode on what is on show, as its own Note button does, so a person can mark anything up for their agent from wherever they are; false where the host has none. Sends nothing."),"tools/call":e(t.strictObject({name:t.string().min(1),arguments:t.record(t.string(),t.unknown()).default({})}),t.strictObject({result:t.unknown()}),"Runs one of the project server's tools (tools.ts's PROJECT_TOOLS), for an editor that needs more than files (a video's preview, a still).")},HOST_NOTIFICATIONS={"host/context-changed":n(HostContextSchema,"The language, theme or agent changed."),"editor/command":n(t.strictObject({command:t.enum(["export"])}),"The host around the editor asked it to do what its own shortcut does."),...a,...c},EDITOR_HOST_METHODS={...i,...HOST_METHODS};
@@ -85,6 +85,8 @@ export type NoteElement = z.infer<typeof NoteElementSchema>;
85
85
  export declare const NOTE_READY = "note/ready";
86
86
  /** What a framed page tells the window: words for the agent's composer. */
87
87
  export declare const AGENT_ASK = "agent/ask";
88
+ /** What a framed page tells the window: the person asked for Note mode. */
89
+ export declare const NOTE_BEGIN = "note/begin";
88
90
  export declare const NOTE_GONE = "note/gone";
89
91
  export declare const NOTE_METHODS: {
90
92
  readonly "note/freeze": import("./jsonrpc.js").MethodSpec<z.ZodObject<{}, z.core.$strict>, z.ZodObject<{
@@ -1,2 +1,2 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- import{z as t}from"zod";import{pointsOf as r,mapShape as n,touches as s}from"@allyhub-next/formats";import{PathSchema as i}from"./files.js";import{method as e}from"./jsonrpc.js";export const NoteRectSchema=t.strictObject({x:t.number(),y:t.number(),width:t.number().nonnegative(),height:t.number().nonnegative()});const o=t.strictObject({x:t.number(),y:t.number()});export const NoteShapeSchema=t.discriminatedUnion("kind",[t.strictObject({kind:t.literal("box"),rect:NoteRectSchema}),t.strictObject({kind:t.literal("round"),rect:NoteRectSchema}),t.strictObject({kind:t.literal("arrow"),from:o,to:o}),t.strictObject({kind:t.literal("line"),points:t.array(o).min(1)})]);export{n as mapShape,r as pointsOf,s as touches};export const NoteSourceSchema=t.strictObject({path:i,line:t.int().positive().optional()}),FrozenSchema=t.strictObject({key:t.string().min(1),what:t.string(),source:NoteSourceSchema.optional()}),NotePictureSchema=t.strictObject({rect:NoteRectSchema.optional(),mime:t.string().min(1),data:t.string().min(1)}),NoteElementSchema=t.strictObject({name:t.string().min(1),source:NoteSourceSchema.optional(),text:t.string().optional()}),NOTE_READY="note/ready",AGENT_ASK="agent/ask",NOTE_GONE="note/gone",NOTE_METHODS={"note/freeze":e(t.strictObject({}),FrozenSchema,"Stops what moves and says what is on show. Answered once it is drawn, so a page still loading is not captured empty."),"note/pictures":e(t.strictObject({page:t.boolean()}),t.strictObject({pictures:t.array(NotePictureSchema)}),"What is on show drawn better than a screenshot can, or what a screenshot cannot reach: a render's frame, a frame of its own. Laid in order over the host's screenshot."),"note/locate":e(t.strictObject({mark:NoteShapeSchema}),t.strictObject({elements:t.array(NoteElementSchema)}),"What a mark is on, while frozen: the surface alone knows what it shows, and says it in its own terms, with its file and line where it knows them. Empty is an answer: the mark's place still goes."),"note/thaw":e(t.strictObject({}),t.strictObject({}),"The person is done. Nothing starts by itself: a video that was paused stays paused.")};
2
+ import{z as t}from"zod";import{pointsOf as n,mapShape as r,touches as s}from"@allyhub-next/formats";import{PathSchema as i}from"./files.js";import{method as e}from"./jsonrpc.js";export const NoteRectSchema=t.strictObject({x:t.number(),y:t.number(),width:t.number().nonnegative(),height:t.number().nonnegative()});const o=t.strictObject({x:t.number(),y:t.number()});export const NoteShapeSchema=t.discriminatedUnion("kind",[t.strictObject({kind:t.literal("box"),rect:NoteRectSchema}),t.strictObject({kind:t.literal("round"),rect:NoteRectSchema}),t.strictObject({kind:t.literal("arrow"),from:o,to:o}),t.strictObject({kind:t.literal("line"),points:t.array(o).min(1)})]);export{r as mapShape,n as pointsOf,s as touches};export const NoteSourceSchema=t.strictObject({path:i,line:t.int().positive().optional()}),FrozenSchema=t.strictObject({key:t.string().min(1),what:t.string(),source:NoteSourceSchema.optional()}),NotePictureSchema=t.strictObject({rect:NoteRectSchema.optional(),mime:t.string().min(1),data:t.string().min(1)}),NoteElementSchema=t.strictObject({name:t.string().min(1),source:NoteSourceSchema.optional(),text:t.string().optional()}),NOTE_READY="note/ready",AGENT_ASK="agent/ask",NOTE_BEGIN="note/begin",NOTE_GONE="note/gone",NOTE_METHODS={"note/freeze":e(t.strictObject({}),FrozenSchema,"Stops what moves and says what is on show. Answered once it is drawn, so a page still loading is not captured empty."),"note/pictures":e(t.strictObject({page:t.boolean()}),t.strictObject({pictures:t.array(NotePictureSchema)}),"What is on show drawn better than a screenshot can, or what a screenshot cannot reach: a render's frame, a frame of its own. Laid in order over the host's screenshot."),"note/locate":e(t.strictObject({mark:NoteShapeSchema}),t.strictObject({elements:t.array(NoteElementSchema)}),"What a mark is on, while frozen: the surface alone knows what it shows, and says it in its own terms, with its file and line where it knows them. Empty is an answer: the mark's place still goes."),"note/thaw":e(t.strictObject({}),t.strictObject({}),"The person is done. Nothing starts by itself: a video that was paused stays paused.")};
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allyhub-next/protocol",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allyhub-next/registry",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -10,14 +10,6 @@ export interface ExportOptions extends Tools {
10
10
  out: string;
11
11
  /** A deck's pages: a PDF page, a PNG or a slide per step, not only each page's last; default false. */
12
12
  steps?: boolean;
13
- /**
14
- * A PPTX's slides: "picture", each a full-bleed picture (the default),
15
- * or "editable", each the picture with its text hidden under a text box
16
- * per block of text, as measured on the page (its box, size, weight,
17
- * colour and font), so the words can be edited in PowerPoint, Keynote or
18
- * Google Slides.
19
- */
20
- pptx?: "picture" | "editable";
21
13
  }
22
14
  /** A moment an export draws: a part's (or a step's) still. */
23
15
  interface Still {
@@ -67,9 +59,8 @@ export declare function renderPdf(opts: ExportOptions): Promise<ExportResult>;
67
59
  export declare function renderPng(opts: ExportOptions): Promise<ExportResult>;
68
60
  /**
69
61
  * One slide per part or page (per step with `steps`), each the still as a
70
- * full-bleed picture, or, `editable`, the still without its text under a
71
- * text box per block of text; the speaker notes are a page's notes, else
72
- * what a part says, else the text it shows.
62
+ * full-bleed picture; the speaker notes are a page's notes, else what a
63
+ * part says, else the text it shows.
73
64
  */
74
65
  export declare function renderPptx(opts: ExportOptions): Promise<ExportResult>;
75
66
  export {};
@@ -1,3 +1,3 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- import{writeFile as S}from"node:fs/promises";import{createRequire as $}from"node:module";import{captionCues as M,paperOf as j,subtitleCues as v,toSrt as L,toVtt as T}from"@allyhub-next/video-core";import{RenderError as O}from"./errors.js";import{backgroundStill as z,finalStill as w,footageStill as C}from"./stills.js";export function stillsOf(t,e=!1){const a=[];for(const[o,i]of t.parts.entries()){if(i.hidden===!0)continue;const n=i.title??String(o+1),r=e&&i.steps!==void 0?i.steps:[i.still];r.forEach((c,s)=>{a.push({part:i,at:c,title:r.length>1?`${n} (${String(s+1)})`:n})})}return a}async function h(t,e,a){return await S(t,e),{out:t,units:a,bytes:e.byteLength}}const b=t=>({target:t.target,look:t.look,media:t.media,...t.ffmpeg===void 0?{}:{ffmpeg:t.ffmpeg},...t.ffprobe===void 0?{}:{ffprobe:t.ffprobe}});export async function renderCaptions(t){const{timeline:e}=t.page,a=await t.page.lines();if(a.length===0)throw new O("no-speech",`${t.target.output} of ${t.target.piece} (${t.target.combo.lang??"this combo"}) says nothing with word times, so there are no subtitles to export.`,{hint:'Give parts speech: speech: take("./take.mp4") with its .words.json beside it, or say(s("…")) and allyhub voice.'});const o={lines:a,fps:e.fps},i=t.captions?M(o,t.captions):v(o,await t.page.captionOptions()),n=t.type==="srt"?L(i):T(i);return h(t.out,new TextEncoder().encode(n),i.length)}export async function renderCover(t){const{page:e}=t,a=await e.covers()>0?await z(e.timeline,await e.cover(0),"jpeg",t):await w(e,e.timeline.parts[0]?.still??0,{...b(t),format:"jpeg"});return h(t.out,a,1)}export async function renderPdf(t){const{timeline:e}=t.page,a=e.background,o=[];for(const n of stillsOf(e,t.steps)){const r=await C(t.media,e,n.at,"jpeg",t);o.push({still:n.at,title:n.title,background:r?`url(data:image/jpeg;base64,${r.toString("base64")}) 0 0 / 100% 100% no-repeat`:a})}const i=await t.page.print(o,e.paper??j(t.target.format));return h(t.out,i,o.length)}export async function renderPng(t){const e=stillsOf(t.page.timeline,t.steps),a=Math.max(2,String(e.length).length),o=t.out.replace(/\.png$/i,""),i=[];let n=0;for(const[r,c]of e.entries()){const s=e.length===1?t.out:`${o}.${String(r+1).padStart(a,"0")}.png`,l=await w(t.page,c.at,b(t));await S(s,l),i.push(s),n+=l.byteLength}return{out:i[0]??t.out,units:i.length,bytes:n,files:i}}const P=$(import.meta.url)("pptxgenjs"),E=t=>({color:t.slice(0,3).map(e=>Math.round(e).toString(16).padStart(2,"0")).join(""),transparency:Math.round((1-t[3])*100)}),N=t=>t?.[0]?.replace(/^["']|["']$/gu,"").replace(/ Variable$/u,"");async function A(t,e,a,o){const i=await t.inks?.(a)??[];for(const n of i){if(n.text.text.trim()==="")continue;const[r,c,s,l]=n.text.box,g=n.lines.find(p=>p.fill!==void 0)?.fill,f=g?E(g):void 0,u=Math.max(1,n.lines.length),d=N(n.text.fonts);e.addText(n.text.text,{x:r*o,y:c*o,w:Math.max(s,1)*o,h:Math.max(l,1)*o,fontSize:Math.max(1,Math.round(n.size*o*72*10)/10),...d===void 0?{}:{fontFace:d},...f===void 0?{}:{color:f.color,...f.transparency>0?{transparency:f.transparency}:{}},bold:n.weight>=600,margin:0,valign:"top",fit:"none",...u===1?{wrap:!1}:{},...u>1&&n.size>0?{lineSpacingMultiple:l/u/n.size/1.2}:{}})}}export async function renderPptx(t){const{timeline:e}=t.page,{width:a,height:o}=e,i=/^([\d.]+)in ([\d.]+)in$/u.exec(e.paper??""),n=13.333/Math.max(a,o),r=i?Number(i[1]):a*n,c=i?Number(i[2]):o*n,s=new P;s.defineLayout({name:"ALLYHUB",width:r,height:c}),s.layout="ALLYHUB";const l=await t.page.text(),g=t.pptx==="editable"&&t.page.inks!==void 0&&t.page.hideText!==void 0,f=stillsOf(e,t.steps);for(const d of f){g&&await t.page.hideText?.(!0);let p;try{p=await w(t.page,d.at,b(t))}finally{g&&await t.page.hideText?.(!1)}const m=s.addSlide();m.addImage({data:`image/png;base64,${p.toString("base64")}`,x:0,y:0,w:r,h:c}),g&&await A(t.page,m,d.at,r/a);const x=l.find(k=>k.key===d.part.key),y=x?.notes??x?.spoken??x?.onScreen.join(`
3
- `)??"";y&&m.addNotes(y)}const u=await s.write({outputType:"nodebuffer"});return h(t.out,u,f.length)}
2
+ import{writeFile as b}from"node:fs/promises";import{createRequire as k}from"node:module";import{captionCues as $,paperOf as j,subtitleCues as L,toSrt as v,toVtt as C}from"@allyhub-next/video-core";import{RenderError as O}from"./errors.js";import{backgroundStill as P,finalStill as p,footageStill as E}from"./stills.js";export function stillsOf(t,e=!1){const i=[];for(const[o,n]of t.parts.entries()){if(n.hidden===!0)continue;const a=n.title??String(o+1),r=e&&n.steps!==void 0?n.steps:[n.still];r.forEach((c,s)=>{i.push({part:n,at:c,title:r.length>1?`${a} (${String(s+1)})`:a})})}return i}async function g(t,e,i){return await b(t,e),{out:t,units:i,bytes:e.byteLength}}const u=t=>({target:t.target,look:t.look,media:t.media,...t.ffmpeg===void 0?{}:{ffmpeg:t.ffmpeg},...t.ffprobe===void 0?{}:{ffprobe:t.ffprobe}});export async function renderCaptions(t){const{timeline:e}=t.page,i=await t.page.lines();if(i.length===0)throw new O("no-speech",`${t.target.output} of ${t.target.piece} (${t.target.combo.lang??"this combo"}) says nothing with word times, so there are no subtitles to export.`,{hint:'Give parts speech: speech: take("./take.mp4") with its .words.json beside it, or say(s("…")) and allyhub voice.'});const o={lines:i,fps:e.fps},n=t.captions?$(o,t.captions):L(o,await t.page.captionOptions()),a=t.type==="srt"?v(n):C(n);return g(t.out,new TextEncoder().encode(a),n.length)}export async function renderCover(t){const{page:e}=t,i=await e.covers()>0?await P(e.timeline,await e.cover(0),"jpeg",t):await p(e,e.timeline.parts[0]?.still??0,{...u(t),format:"jpeg"});return g(t.out,i,1)}export async function renderPdf(t){const{timeline:e}=t.page,i=e.background,o=[];for(const a of stillsOf(e,t.steps)){const r=await E(t.media,e,a.at,"jpeg",t);o.push({still:a.at,title:a.title,background:r?`url(data:image/jpeg;base64,${r.toString("base64")}) 0 0 / 100% 100% no-repeat`:i})}const n=await t.page.print(o,e.paper??j(t.target.format));return g(t.out,n,o.length)}export async function renderPng(t){const e=stillsOf(t.page.timeline,t.steps),i=Math.max(2,String(e.length).length),o=t.out.replace(/\.png$/i,""),n=[];let a=0;for(const[r,c]of e.entries()){const s=e.length===1?t.out:`${o}.${String(r+1).padStart(i,"0")}.png`,l=await p(t.page,c.at,u(t));await b(s,l),n.push(s),a+=l.byteLength}return{out:n[0]??t.out,units:n.length,bytes:a,files:n}}const N=k(import.meta.url)("pptxgenjs");export async function renderPptx(t){const{timeline:e}=t.page,{width:i,height:o}=e,n=/^([\d.]+)in ([\d.]+)in$/u.exec(e.paper??""),a=13.333/Math.max(i,o),r=n?Number(n[1]):i*a,c=n?Number(n[2]):o*a,s=new N;s.defineLayout({name:"ALLYHUB",width:r,height:c}),s.layout="ALLYHUB";const l=await t.page.text(),d=stillsOf(e,t.steps);for(const m of d){const x=await p(t.page,m.at,u(t)),h=s.addSlide();h.addImage({data:`image/png;base64,${x.toString("base64")}`,x:0,y:0,w:r,h:c});const f=l.find(S=>S.key===m.part.key),w=f?.notes??f?.spoken??f?.onScreen.join(`
3
+ `)??"";w&&h.addNotes(w)}const y=await s.write({outputType:"nodebuffer"});return g(t.out,y,d.length)}
@@ -1,4 +1,4 @@
1
- import type { TextInk, CaptionLine, CaptionOptions, CaptureOptions, Combo, MediaInfo, Problem, Timeline } from "@allyhub-next/video-core";
1
+ import type { CaptionLine, CaptionOptions, CaptureOptions, Combo, MediaInfo, Problem, Timeline } from "@allyhub-next/video-core";
2
2
  /** Which output a render is of: a piece's output in one combo and format. */
3
3
  export interface RenderTarget {
4
4
  piece: string;
@@ -129,16 +129,8 @@ export interface ExportPage extends GraphicsPage {
129
129
  captionOptions(): Promise<CaptionOptions | undefined>;
130
130
  /** Each part's notes and text, for a deck's speaker notes. */
131
131
  text(): Promise<readonly PartText[]>;
132
- /**
133
- * Each text block drawn at film time t, with its lines' glyph boxes and
134
- * fills, its size and weight (LoadedOutput.inks): an editable PPTX's
135
- * text boxes. Absent where the page cannot measure.
136
- */
137
- inks?(t: number): Promise<TextInk[]>;
138
132
  /** A deck as it was drawn (slides-core's DrawnDeck): its PowerPoint file's model. Absent on a video. */
139
133
  deck?(): Promise<unknown>;
140
- /** Hides every text's fill while on (HIDE_TEXT_CSS): the picture behind an editable PPTX's text boxes. */
141
- hideText?(on: boolean): Promise<void>;
142
134
  /** How many covers the output has (video(…, { covers })). */
143
135
  covers(): Promise<number>;
144
136
  /**
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allyhub-next/render",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allyhub-next/runtime",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allyhub-next/runtimes",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allyhub-next/scaffold",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allyhub-next/scenery",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allyhub-next/scenery-host",
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{publicNames as n}from"@allyhub-next/formats";import{FUNCTIONS as h}from"../calc/functions/index.js";import{AreaChart as d,BarChart as p,DataLabelList as m,DoughnutChart as c,GraphicalProperties as w,Legend as f,LineChart as u,LineProperties as y,Marker as b,NumericAxis as g,PieChart as k,Reference as _,ScatterChart as x,Scaling as C,Series as A,TextAxis as v}from"./charts.js";import{AutoFilter as S,ConditionalFormattingList as D,DataValidation as L,DataValidationList as R,DifferentialStyle as T,Rule as F}from"./rules.js";import{Alignment as N,Border as P,Color as E,Font as V,PatternFill as B,Side as I}from"./styles.js";import{Cell as j,ColumnDimension as W,DefinedName as G,DefinedNameDict as M,RowDimension as O,Table as z,TableList as H,Workbook as U,Worksheet as q}from"./workbook.js";const a={Series:{title:"A series' name in words, openpyxl's SeriesFactory argument, kept here as a field."},Workbook:{open:"Workbook.open(dir): a workbook's folder read (load_workbook(dir) is the same).",block_cells:"How many typed cells together go in a CSV file of their own: 100 unless set.",title:"The workbook's title, sheet.yaml's.",check:"wb.check(): what allyhub check would say of the workbook as it stands: a list of { file, line, message }."},Cell:{computed:"What the cell computes to, the workbook as it stands, saved or not."},Table:{key:"The column that lines rows up when two hands' changes merge."},DataValidation:{multiple:"A list's cell may hold several of its values, joined by separator: an .xlsx keeps them as text.",separator:"What joins a cell's choices: a comma and a space unless set."},ColumnDimension:{files:"Its cells name files, from the sheet's folder: true, or { separator, height }."}},X=["add_data","set_categories","append","title","legend","width","height","style","anchor","series","dataLabels","x_axis","y_axis"],J={BarChart:["type","grouping","overlap","gapWidth","varyColors"],LineChart:["grouping"],AreaChart:["grouping"],PieChart:["varyColors"],DoughnutChart:["holeSize"],ScatterChart:[]},K={Workbook:U.prototype,Worksheet:q.prototype,Cell:j.prototype,Font:V.prototype,PatternFill:B.prototype,Border:P.prototype,Side:I.prototype,Alignment:N.prototype,Color:E.prototype,Table:z.prototype,TableList:H.prototype,DefinedName:G.prototype,DefinedNameDict:M.prototype,ColumnDimension:W.prototype,RowDimension:O.prototype,ConditionalFormattingList:D.prototype,Rule:F.prototype,DifferentialStyle:T.prototype,DataValidation:L.prototype,DataValidationList:R.prototype,AutoFilter:S.prototype,BarChart:p.prototype,LineChart:u.prototype,AreaChart:d.prototype,PieChart:k.prototype,DoughnutChart:c.prototype,ScatterChart:x.prototype,Reference:_.prototype,Series:A.prototype,Legend:f.prototype,Scaling:C.prototype,TextAxis:v.prototype,NumericAxis:g.prototype,DataLabelList:m.prototype,Marker:b.prototype,GraphicalProperties:w.prototype,LineProperties:y.prototype},r=["title","scaling","majorUnit","number_format","delete","majorGridlines"],Q={Workbook:["worksheets","defined_names","data_only","path","title","block_cells"],Cell:["row","column"],Worksheet:["min_row","min_column"],Font:["name","size","bold","italic","underline","strike","color"],PatternFill:["fill_type","fgColor","bgColor"],Border:["left","right","top","bottom"],Side:["style","color"],Alignment:["horizontal","vertical","wrap_text","shrink_to_fit","indent","text_rotation"],Color:["rgb"],Table:["displayName","ref","key","autoFilter"],DefinedName:["name","attr_text"],ColumnDimension:["index"],RowDimension:["index"],Rule:["type","operator","formula","stopIfTrue","rank","percent","bottom","aboveAverage","equalAverage","text","dxf"],DifferentialStyle:["font","fill","border"],DataValidation:["type","formula1","formula2","operator","allow_blank","showDropDown","showErrorMessage","showInputMessage","errorStyle","errorTitle","error","promptTitle","prompt","sqref"],DataValidationList:["dataValidation"],AutoFilter:["ref"],...Object.fromEntries(Object.entries(J).map(([e,t])=>[e,[...X.filter(o=>!(/^(?:Pie|Doughnut)/u.test(e)&&o.endsWith("_axis"))),...t]])),Reference:["worksheet","min_col","min_row","max_col","max_row"],Series:["val","xVal","title","smooth","marker","graphicalProperties"],Legend:["position"],Scaling:["min","max","orientation"],TextAxis:r.filter(e=>e!=="majorUnit"),NumericAxis:r,DataLabelList:["showVal","showPercent","showCatName","showSerName","dLblPos"],Marker:["symbol","size"],GraphicalProperties:["solidFill","noFill","line"],LineProperties:["width","solidFill","noFill"]};export const HELPERS=["CellIsRule","ColorScaleRule","DataBarRule","FormulaRule","IconSetRule","column_index_from_string","coordinate_to_tuple","get_column_letter","range_boundaries"];const Y=()=>{const e={};for(const[t,o]of Object.entries(K)){const i=a[t]??{};e[t]=[...n(o),...Q[t]??[]].filter(l=>!Object.hasOwn(i,l)).sort()}return e},s=e=>[...h.values()].filter(t=>t.from===e).map(t=>t.name).sort();export const CAPABILITIES={reference:{library:"openpyxl",version:"3.1.5",docs:"https://openpyxl.readthedocs.io/"},holds:Y(),functions:HELPERS,differs:["A workbook is a folder, not a file: load_workbook(dir) reads sheet.yaml and its CSV files, wb.save(dir) writes them, and only what changed is written. .xlsx is not read or written yet.","A keyword argument of openpyxl's is a field of an object: new Font({ bold: true }), new Table({ displayName, ref }), new DefinedName(name, { attr_text }). Classes are made with new.","A name openpyxl has that is not held throws where it is used, naming what the class holds. ws['A1'], ws['A1:B2'], ws['A'], ws[1], wb['Sheet'], ws.tables['t'], wb.defined_names['n'], ws.column_dimensions['A'] and ws.row_dimensions[1] are held; in TypeScript ws['A1'] is typed as a Cell, so write ws['A1'].value = v (ws['A1'] = v works at run time), and wb.get_sheet_by_name(name) is typed where wb[name] is not.","Rows and columns count from 1, as openpyxl's. iter_rows, rows, columns and values give arrays, not generators.","A colour is #RRGGBB; RRGGBB and AARRGGBB are taken, the alpha left out. Theme colours are not held.","cell.value of a date is a Date (read in UTC), a formula's its text, and with load_workbook(dir, { data_only: true }) what it computes to, which openpyxl reads from a file's cache and this computes.","column_dimensions' width is Excel's unit and row_dimensions' height points, as openpyxl's; the file holds pixels.","ws.merged_cells is an array of each merged range's text.","A table's rows are its CSV file, so ws.add_table(new Table({ displayName, ref })) moves the cells of ref there; its header row names its columns. A column whose every row has one formula, moved, is written as a calculated column.","A run of cells with one formula, moved, is written as one range key, and at least wb.block_cells typed cells together in a CSV file of their own (a block).","ws.title = 'New' renames the sheet in every formula, which openpyxl leaves to you.","ws.insert_rows, delete_rows, insert_cols and delete_cols rewrite every formula of the workbook as Excel does (a reference moves, a range grows or shrinks, one to what went is #REF!), move tables, blocks, merges and looks, and take rows and columns in or out of a table's CSV file. openpyxl moves cells and leaves formulas as they were. A table's header row is not deleted unless all of the table is.","A string that reads as another value (=, 12%, 2026-01-01) stays text, as openpyxl's does: its cell is written with a leading ' unless it starts with =, which makes it a formula.","A DataValidation refuses what breaks it and shows its prompt unless showErrorMessage or showInputMessage is false, as Excel's dialog starts: openpyxl's leave both off. A list's cell keeps its blank unless allow_blank is false.","ws.auto_filter.ref and add_filter_column say what a filter keeps, and the rows it leaves out are worked out from that, never written: a file made by openpyxl hides nothing until Excel reapplies it. A table has its own, table.autoFilter. add_sort_condition is not held: sorting is the rows of the files in order.","A chart reads its cells live, whatever else is in the file: there is no cache to refresh. chart.add_data and set_categories, and Series, take a Reference or a formula's text for a table's column or a spill, as add_data('orders[total]', { title: 'Total' }) or set_categories('orders[month]'), since a Reference cannot name one.","Series is made with new Series(values, { xvalues, title, title_from_data }); openpyxl's is the SeriesFactory function.","A chart's width and height are centimetres, as openpyxl's; the file holds pixels, and anchor a cell: ws.add_chart(chart, 'E2').","A LineChart's grouping is standard; a stacked area is an AreaChart. Chart styles are kept but draw nothing, as sheet.yaml has no place for them: chart.style is only read.","ws._charts lists a sheet's charts, those read from sheet.yaml among them, as the classes above.","In a rule, a fill's bgColor paints, or its fgColor where it has none. A rule's font holds bold, italic, underline, strike and a colour; alignment and number formats in a rule are not held.","workbook((wb, { data }) => { … }), the default export of an item's sheet.ts, makes sheets with these classes, on a workbook of its own that starts with none. They are made again from the code wherever the workbook is read, never saved: wb.save throws there."],adds:a,formulas:{own:s("allyhub"),formulajs:s("formulajs")}};
2
+ import{publicNames as n}from"@allyhub-next/formats";import{FUNCTIONS as h}from"../calc/functions/index.js";import{AreaChart as d,BarChart as p,DataLabelList as m,DoughnutChart as c,GraphicalProperties as w,Legend as f,LineChart as u,LineProperties as y,Marker as g,NumericAxis as b,PieChart as k,Reference as _,ScatterChart as x,Scaling as C,Series as A,TextAxis as S}from"./charts.js";import{AutoFilter as v,ConditionalFormattingList as D,DataValidation as P,DataValidationList as F,DifferentialStyle as L,Rule as T}from"./rules.js";import{Alignment as R,Border as I,Color as N,Font as E,PatternFill as V,Side as B}from"./styles.js";import{Cell as W,ColumnDimension as j,DefinedName as G,DefinedNameDict as H,RowDimension as M,Table as O,TableList as U,Workbook as z,Worksheet as q}from"./workbook.js";import{Comment as X,HeaderFooter as J,HeaderFooterPart as K,Image as Q,PageMargins as Y,PageSetup as Z,SheetProtection as $}from"./page.js";const a={Series:{title:"A series' name in words, openpyxl's SeriesFactory argument, kept here as a field."},Workbook:{open:"Workbook.open(dir): a workbook's folder read (load_workbook(dir) is the same).",block_cells:"How many typed cells together go in a CSV file of their own: 100 unless set.",title:"The workbook's title, sheet.yaml's.",check:"wb.check(): what allyhub check would say of the workbook as it stands: a list of { file, line, message }."},Cell:{computed:"What the cell computes to, the workbook as it stands, saved or not."},Table:{key:"The column that lines rows up when two hands' changes merge."},DataValidation:{multiple:"A list's cell may hold several of its values, joined by separator: an .xlsx keeps them as text.",separator:"What joins a cell's choices: a comma and a space unless set."},PageSetup:{fitToWidth:"Pages wide; setting it or fitToHeight fits the sheet, with no pageSetUpPr to set."},ColumnDimension:{files:"Its cells name files, from the sheet's folder: true, or { separator, height }."}},ee=["add_data","set_categories","append","title","legend","width","height","style","anchor","series","dataLabels","x_axis","y_axis"],te={BarChart:["type","grouping","overlap","gapWidth","varyColors"],LineChart:["grouping"],AreaChart:["grouping"],PieChart:["varyColors"],DoughnutChart:["holeSize"],ScatterChart:[]},oe={Workbook:z.prototype,Worksheet:q.prototype,Cell:W.prototype,Font:E.prototype,PatternFill:V.prototype,Border:I.prototype,Side:B.prototype,Alignment:R.prototype,Color:N.prototype,Table:O.prototype,TableList:U.prototype,DefinedName:G.prototype,DefinedNameDict:H.prototype,ColumnDimension:j.prototype,RowDimension:M.prototype,ConditionalFormattingList:D.prototype,Rule:T.prototype,DifferentialStyle:L.prototype,DataValidation:P.prototype,DataValidationList:F.prototype,AutoFilter:v.prototype,BarChart:p.prototype,LineChart:u.prototype,AreaChart:d.prototype,PieChart:k.prototype,DoughnutChart:c.prototype,ScatterChart:x.prototype,Reference:_.prototype,Series:A.prototype,Legend:f.prototype,Scaling:C.prototype,TextAxis:S.prototype,NumericAxis:b.prototype,DataLabelList:m.prototype,Marker:g.prototype,GraphicalProperties:w.prototype,LineProperties:y.prototype,PageSetup:Z.prototype,PageMargins:Y.prototype,_HeaderFooterItem:J.prototype,_HeaderFooterPart:K.prototype,SheetProtection:$.prototype,Comment:X.prototype,Image:Q.prototype},r=["title","scaling","majorUnit","number_format","delete","majorGridlines"],ae={_HeaderFooterItem:["left","center","right"],Comment:["text","author"],Image:["path","width","height","anchor"],Workbook:["worksheets","defined_names","data_only","path","title","block_cells"],Cell:["row","column"],Worksheet:["min_row","min_column"],Font:["name","size","bold","italic","underline","strike","color"],PatternFill:["fill_type","fgColor","bgColor"],Border:["left","right","top","bottom"],Side:["style","color"],Alignment:["horizontal","vertical","wrap_text","shrink_to_fit","indent","text_rotation"],Color:["rgb"],Table:["displayName","ref","key","autoFilter"],DefinedName:["name","attr_text"],ColumnDimension:["index"],RowDimension:["index"],Rule:["type","operator","formula","stopIfTrue","rank","percent","bottom","aboveAverage","equalAverage","text","dxf"],DifferentialStyle:["font","fill","border"],DataValidation:["type","formula1","formula2","operator","allow_blank","showDropDown","showErrorMessage","showInputMessage","errorStyle","errorTitle","error","promptTitle","prompt","sqref"],DataValidationList:["dataValidation"],AutoFilter:["ref"],...Object.fromEntries(Object.entries(te).map(([e,t])=>[e,[...ee.filter(o=>!(/^(?:Pie|Doughnut)/u.test(e)&&o.endsWith("_axis"))),...t]])),Reference:["worksheet","min_col","min_row","max_col","max_row"],Series:["val","xVal","title","smooth","marker","graphicalProperties"],Legend:["position"],Scaling:["min","max","orientation"],TextAxis:r.filter(e=>e!=="majorUnit"),NumericAxis:r,DataLabelList:["showVal","showPercent","showCatName","showSerName","dLblPos"],Marker:["symbol","size"],GraphicalProperties:["solidFill","noFill","line"],LineProperties:["width","solidFill","noFill"]};export const HELPERS=["CellIsRule","ColorScaleRule","DataBarRule","FormulaRule","IconSetRule","column_index_from_string","coordinate_to_tuple","get_column_letter","range_boundaries"];const re=()=>{const e={};for(const[t,o]of Object.entries(oe)){const i=a[t]??{};e[t]=[...n(o),...ae[t]??[]].filter(l=>!Object.hasOwn(i,l)).sort()}return e},s=e=>[...h.values()].filter(t=>t.from===e).map(t=>t.name).sort();export const CAPABILITIES={reference:{library:"openpyxl",version:"3.1.5",docs:"https://openpyxl.readthedocs.io/"},holds:re(),functions:HELPERS,differs:["A workbook is a folder, not a file: load_workbook(dir) reads sheet.yaml and its CSV files, wb.save(dir) writes them, and only what changed is written. This API does not read or write .xlsx: allyhub sheet import and allyhub render --type xlsx do.","A keyword argument of openpyxl's is a field of an object: new Font({ bold: true }), new Table({ displayName, ref }), new DefinedName(name, { attr_text }). Classes are made with new.","A name openpyxl has that is not held throws where it is used, naming what the class holds. ws['A1'], ws['A1:B2'], ws['A'], ws[1], wb['Sheet'], ws.tables['t'], wb.defined_names['n'], ws.column_dimensions['A'] and ws.row_dimensions[1] are held; in TypeScript ws['A1'] is typed as a Cell, so write ws['A1'].value = v (ws['A1'] = v works at run time), and wb.get_sheet_by_name(name) is typed where wb[name] is not.","Rows and columns count from 1, as openpyxl's. iter_rows, rows, columns and values give arrays, not generators.","A colour is #RRGGBB; RRGGBB and AARRGGBB are taken, the alpha left out. Theme colours are not held.","cell.value of a date is a Date (read in UTC), a formula's its text, and with load_workbook(dir, { data_only: true }) what it computes to, which openpyxl reads from a file's cache and this computes.","column_dimensions' width is Excel's unit and row_dimensions' height points, as openpyxl's; the file holds pixels.","ws.merged_cells is an array of each merged range's text.","A table's rows are its CSV file, so ws.add_table(new Table({ displayName, ref })) moves the cells of ref there; its header row names its columns. A column whose every row has one formula, moved, is written as a calculated column.","A run of cells with one formula, moved, is written as one range key, and at least wb.block_cells typed cells together in a CSV file of their own (a block).","ws.title = 'New' renames the sheet in every formula, which openpyxl leaves to you.","ws.insert_rows, delete_rows, insert_cols and delete_cols rewrite every formula of the workbook as Excel does (a reference moves, a range grows or shrinks, one to what went is #REF!), move tables, blocks, merges and looks, and take rows and columns in or out of a table's CSV file. openpyxl moves cells and leaves formulas as they were. A table's header row is not deleted unless all of the table is.","A string that reads as another value (=, 12%, 2026-01-01) stays text, as openpyxl's does: its cell is written with a leading ' unless it starts with =, which makes it a formula.","A DataValidation refuses what breaks it and shows its prompt unless showErrorMessage or showInputMessage is false, as Excel's dialog starts: openpyxl's leave both off. A list's cell keeps its blank unless allow_blank is false.","ws.auto_filter.ref and add_filter_column say what a filter keeps, and the rows it leaves out are worked out from that, never written: a file made by openpyxl hides nothing until Excel reapplies it. A table has its own, table.autoFilter. add_sort_condition is not held: sorting is the rows of the files in order.","A chart reads its cells live, whatever else is in the file: there is no cache to refresh. chart.add_data and set_categories, and Series, take a Reference or a formula's text for a table's column or a spill, as add_data('orders[total]', { title: 'Total' }) or set_categories('orders[month]'), since a Reference cannot name one.","Series is made with new Series(values, { xvalues, title, title_from_data }); openpyxl's is the SeriesFactory function.","A chart's width and height are centimetres, as openpyxl's; the file holds pixels, and anchor a cell: ws.add_chart(chart, 'E2').","A LineChart's grouping is standard; a stacked area is an AreaChart. Chart styles are kept but draw nothing, as sheet.yaml has no place for them: chart.style is only read.","ws._charts lists a sheet's charts, those read from sheet.yaml among them, as the classes above.","In a rule, a fill's bgColor paints, or its fgColor where it has none. A rule's font holds bold, italic, underline, strike and a colour; alignment and number formats in a rule are not held.","workbook((wb, { data }) => { … }), the default export of an item's sheet.ts, makes sheets with these classes, on a workbook of its own that starts with none. They are made again from the code wherever the workbook is read, never saved: wb.save throws there."],adds:a,formulas:{own:s("allyhub"),formulajs:s("formulajs")}};
@@ -4,4 +4,5 @@ export { AutoFilter, CellIsRule, ColorScaleRule, ConditionalFormattingList, Data
4
4
  export { AreaChart, BarChart, ChartBase, DataLabelList, DoughnutChart, GraphicalProperties, Legend, LineChart, LineProperties, Marker, NumericAxis, PieChart, Reference, ScatterChart, Scaling, Series, TextAxis, type BarChartOptions, type ChartData, type ReferenceOptions, type SeriesOptions, } from "./charts.js";
5
5
  export { CAPABILITIES, HELPERS, type Capabilities } from "./capabilities.js";
6
6
  export { WORKBOOK_BRAND, isSheetCode, workbook, type SheetCode, type SheetCodeBuild, type SheetCodeContext, } from "./code.js";
7
+ export { Comment, HeaderFooter, Image, PageMargins, PageSetup, SheetProtection, } from "./page.js";
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1,2 +1,2 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- export{Alignment,Border,Color,Font,PatternFill,Side}from"./styles.js";export{BLOCK_CELLS,Cell,ColumnDimension,DefinedName,DefinedNameDict,RowDimension,Table,TableList,Workbook,Worksheet,column_index_from_string,coordinate_to_tuple,get_column_letter,load_workbook,range_boundaries}from"./workbook.js";export{AutoFilter,CellIsRule,ColorScaleRule,ConditionalFormattingList,DataBarRule,DataValidation,DataValidationList,DifferentialStyle,FormulaRule,IconSetRule,Rule}from"./rules.js";export{AreaChart,BarChart,ChartBase,DataLabelList,DoughnutChart,GraphicalProperties,Legend,LineChart,LineProperties,Marker,NumericAxis,PieChart,Reference,ScatterChart,Scaling,Series,TextAxis}from"./charts.js";export{CAPABILITIES,HELPERS}from"./capabilities.js";export{WORKBOOK_BRAND,isSheetCode,workbook}from"./code.js";
2
+ export{Alignment,Border,Color,Font,PatternFill,Side}from"./styles.js";export{BLOCK_CELLS,Cell,ColumnDimension,DefinedName,DefinedNameDict,RowDimension,Table,TableList,Workbook,Worksheet,column_index_from_string,coordinate_to_tuple,get_column_letter,load_workbook,range_boundaries}from"./workbook.js";export{AutoFilter,CellIsRule,ColorScaleRule,ConditionalFormattingList,DataBarRule,DataValidation,DataValidationList,DifferentialStyle,FormulaRule,IconSetRule,Rule}from"./rules.js";export{AreaChart,BarChart,ChartBase,DataLabelList,DoughnutChart,GraphicalProperties,Legend,LineChart,LineProperties,Marker,NumericAxis,PieChart,Reference,ScatterChart,Scaling,Series,TextAxis}from"./charts.js";export{CAPABILITIES,HELPERS}from"./capabilities.js";export{WORKBOOK_BRAND,isSheetCode,workbook}from"./code.js";export{Comment,HeaderFooter,Image,PageMargins,PageSetup,SheetProtection}from"./page.js";