@braincrew-lab/langchain-canvas 0.1.14 → 0.3.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.
package/dist/index.d.ts CHANGED
@@ -52,7 +52,7 @@ interface ChartOptions {
52
52
  colors?: string[];
53
53
  }
54
54
  interface ChartData {
55
- chart: "line" | "bar" | "area" | "pie";
55
+ chart: "line" | "bar" | "area" | "pie" | "scatter" | "donut";
56
56
  /** Tidy/long-form rows, consumed directly by the charting library. */
57
57
  rows: Array<Record<string, string | number>>;
58
58
  /** Category / x-axis field. */
@@ -82,6 +82,16 @@ interface TableData {
82
82
  */
83
83
  sheet?: Array<Record<string, unknown>>;
84
84
  }
85
+ /**
86
+ * A PDF shown in the browser's native viewer. `src` is a `data:application/pdf`
87
+ * URL (self-contained, the common case for agent/file-sourced PDFs), a `blob:`
88
+ * URL, or an `https:` URL the host is allowed to frame.
89
+ */
90
+ interface PdfData {
91
+ src: string;
92
+ /** Optional original filename, used for the download attribute. */
93
+ filename?: string;
94
+ }
85
95
  /** A freely-positioned element on a "blank" slide (percent geometry, 0–100). */
86
96
  interface SlideElement {
87
97
  id: string;
@@ -100,6 +110,17 @@ interface SlideElement {
100
110
  shape?: "rect" | "ellipse" | "line";
101
111
  /** Fill (rect/ellipse) or stroke (line) color for a shape. */
102
112
  fill?: string;
113
+ /** Rotation in degrees, clockwise, about the element's center. Purely visual:
114
+ * `x`/`y`/`w`/`h` always describe the unrotated box. */
115
+ rotate?: number;
116
+ /** How an image fills its box — "contain" (default, letterboxed) or "cover"
117
+ * (fill and crop). */
118
+ fit?: "contain" | "cover";
119
+ /** Corner radius in px (0–32) for images and rect shapes. */
120
+ radius?: number;
121
+ /** Editor-only grouping: elements sharing a `group` id select and move as
122
+ * one. Purely additive — exporters and the presenter ignore it. */
123
+ group?: string;
103
124
  }
104
125
  interface Slide {
105
126
  /** title · content (bullets) · section · image · two-column · blank (free canvas). */
@@ -117,6 +138,12 @@ interface Slide {
117
138
  background?: string;
118
139
  /** Slide text color (hex). */
119
140
  textColor?: string;
141
+ /** Theme accent color (hex) — used by quick layouts and new shapes for rules,
142
+ * section numbers, and stats. Set by the theme presets. */
143
+ accent?: string;
144
+ /** Font stack for the slide's text (system fonts only, no external loads).
145
+ * Set by the theme presets; cascades to every element. */
146
+ fontFamily?: string;
120
147
  /** Speaker notes (not shown on the slide; exported to the .pptx notes pane). */
121
148
  notes?: string;
122
149
  /** Content padding as a percent of the slide width (a safe margin around the
@@ -141,7 +168,10 @@ type TableArtifact = Artifact<TableData> & {
141
168
  type SlidesArtifact = Artifact<SlidesData> & {
142
169
  type: "slides";
143
170
  };
144
- type KnownArtifact = HtmlArtifact | DocumentArtifact | ChartArtifact | TableArtifact | SlidesArtifact;
171
+ type PdfArtifact = Artifact<PdfData> & {
172
+ type: "pdf";
173
+ };
174
+ type KnownArtifact = HtmlArtifact | DocumentArtifact | ChartArtifact | TableArtifact | SlidesArtifact | PdfArtifact;
145
175
 
146
176
  /**
147
177
  * Canvas Wire Protocol v1 — event envelopes. Mirror of
@@ -207,6 +237,16 @@ interface CanvasStatus {
207
237
  id: string;
208
238
  status: ArtifactStatus;
209
239
  }
240
+ /**
241
+ * Promote the artifact's current state to a described version snapshot.
242
+ * `revision` is the opaque store revision when a CanvasStore backs the canvas.
243
+ */
244
+ interface CanvasCommit {
245
+ type: "canvas.commit";
246
+ id: string;
247
+ description: string;
248
+ revision?: string;
249
+ }
210
250
  interface CanvasClose {
211
251
  type: "canvas.close";
212
252
  id: string;
@@ -219,7 +259,7 @@ interface DoneEvent {
219
259
  type: "done";
220
260
  }
221
261
  type ChatEvent = MessageDelta | MessageEnd | ToolStart | ToolEnd;
222
- type CanvasEvent = CanvasCreate | CanvasAppend | CanvasPatch | CanvasNodePatch | CanvasReplace | CanvasStatus | CanvasClose;
262
+ type CanvasEvent = CanvasCreate | CanvasAppend | CanvasPatch | CanvasNodePatch | CanvasReplace | CanvasStatus | CanvasCommit | CanvasClose;
223
263
  type StreamEvent = ChatEvent | CanvasEvent | ErrorEvent | DoneEvent;
224
264
  /** Narrow a `StreamEvent` to the canvas family. */
225
265
  declare function isCanvasEvent(event: StreamEvent): event is CanvasEvent;
@@ -486,6 +526,34 @@ declare function useCanvasReplay(): {
486
526
  */
487
527
  declare function useArtifactPatch(id: string): (patch: Record<string, unknown>) => void;
488
528
 
529
+ /**
530
+ * `useCanvasSave` — debounced whole-artifact persistence for user edits.
531
+ *
532
+ * The store's `onUserEdit` handler fires per committed user edit (never for
533
+ * agent streaming). This hook turns an `onSave` handler into a debounced
534
+ * per-edit callback for that signal: after `debounceMs` of quiet it hands the
535
+ * latest reconciled artifact to `onSave`. The host decides where it goes — a
536
+ * `CanvasStore`-backed endpoint, local storage, anywhere.
537
+ *
538
+ * `<Canvas onSave={...}>` wires this automatically (composed with the host's
539
+ * own `onUserEdit`, both sharing the store's single user-edit slot). Headless
540
+ * hosts can call the hook themselves and register the returned callback via
541
+ * `setOnUserEdit`.
542
+ *
543
+ * `baseRevision` is the artifact's last known store revision (stamped into
544
+ * `meta.revision` by `canvas.commit` events); hosts pass it to their save
545
+ * endpoint so a stale write can be rejected instead of overwriting.
546
+ */
547
+
548
+ interface CanvasSavePayload {
549
+ artifactId: string;
550
+ artifact: Artifact;
551
+ /** Store revision the user's edit is based on, when known. */
552
+ baseRevision: string | null;
553
+ }
554
+ type CanvasSaveHandler = (payload: CanvasSavePayload) => void | Promise<void>;
555
+ declare function useCanvasSave(onSave: CanvasSaveHandler | undefined, debounceMs?: number): ((artifact: Artifact) => void) | null;
556
+
489
557
  /**
490
558
  * Schema fixtures — scripted wire-event sequences that render the canvas with no
491
559
  * backend. Feed one to `useCanvasReplay().play(scenario.events)`.
@@ -503,6 +571,699 @@ interface Scenario {
503
571
  }
504
572
  declare const scenarios: Scenario[];
505
573
 
574
+ type CanvasLocale = "en" | "ko";
575
+ declare const MESSAGES: {
576
+ undo: {
577
+ en: string;
578
+ ko: string;
579
+ };
580
+ redo: {
581
+ en: string;
582
+ ko: string;
583
+ };
584
+ export: {
585
+ en: string;
586
+ ko: string;
587
+ };
588
+ openInTab: {
589
+ en: string;
590
+ ko: string;
591
+ };
592
+ copyHtml: {
593
+ en: string;
594
+ ko: string;
595
+ };
596
+ copied: {
597
+ en: string;
598
+ ko: string;
599
+ };
600
+ versionHistory: {
601
+ en: string;
602
+ ko: string;
603
+ };
604
+ prevVersion: {
605
+ en: string;
606
+ ko: string;
607
+ };
608
+ nextVersion: {
609
+ en: string;
610
+ ko: string;
611
+ };
612
+ backToLatest: {
613
+ en: string;
614
+ ko: string;
615
+ };
616
+ historyNote: {
617
+ en: string;
618
+ ko: string;
619
+ };
620
+ loading: {
621
+ en: string;
622
+ ko: string;
623
+ };
624
+ noRenderer: {
625
+ en: string;
626
+ ko: string;
627
+ };
628
+ writing: {
629
+ en: string;
630
+ ko: string;
631
+ };
632
+ open: {
633
+ en: string;
634
+ ko: string;
635
+ };
636
+ kindWeb: {
637
+ en: string;
638
+ ko: string;
639
+ };
640
+ kindDocument: {
641
+ en: string;
642
+ ko: string;
643
+ };
644
+ kindChart: {
645
+ en: string;
646
+ ko: string;
647
+ };
648
+ kindTable: {
649
+ en: string;
650
+ ko: string;
651
+ };
652
+ kindSlides: {
653
+ en: string;
654
+ ko: string;
655
+ };
656
+ kindPdf: {
657
+ en: string;
658
+ ko: string;
659
+ };
660
+ design: {
661
+ en: string;
662
+ ko: string;
663
+ };
664
+ code: {
665
+ en: string;
666
+ ko: string;
667
+ };
668
+ add: {
669
+ en: string;
670
+ ko: string;
671
+ };
672
+ heading: {
673
+ en: string;
674
+ ko: string;
675
+ };
676
+ text: {
677
+ en: string;
678
+ ko: string;
679
+ };
680
+ button: {
681
+ en: string;
682
+ ko: string;
683
+ };
684
+ image: {
685
+ en: string;
686
+ ko: string;
687
+ };
688
+ divider: {
689
+ en: string;
690
+ ko: string;
691
+ };
692
+ pageMenu: {
693
+ en: string;
694
+ ko: string;
695
+ };
696
+ sectionMenu: {
697
+ en: string;
698
+ ko: string;
699
+ };
700
+ outlineMenu: {
701
+ en: string;
702
+ ko: string;
703
+ };
704
+ layoutMenu: {
705
+ en: string;
706
+ ko: string;
707
+ };
708
+ themeMenu: {
709
+ en: string;
710
+ ko: string;
711
+ };
712
+ fontMenu: {
713
+ en: string;
714
+ ko: string;
715
+ };
716
+ shapeMenu: {
717
+ en: string;
718
+ ko: string;
719
+ };
720
+ a11yCheck: {
721
+ en: string;
722
+ ko: string;
723
+ };
724
+ a11yTitle: {
725
+ en: string;
726
+ ko: string;
727
+ };
728
+ a11yClean: {
729
+ en: string;
730
+ ko: string;
731
+ };
732
+ bgImage: {
733
+ en: string;
734
+ ko: string;
735
+ };
736
+ present: {
737
+ en: string;
738
+ ko: string;
739
+ };
740
+ bold: {
741
+ en: string;
742
+ ko: string;
743
+ };
744
+ italic: {
745
+ en: string;
746
+ ko: string;
747
+ };
748
+ inlineCode: {
749
+ en: string;
750
+ ko: string;
751
+ };
752
+ bulletList: {
753
+ en: string;
754
+ ko: string;
755
+ };
756
+ numberedList: {
757
+ en: string;
758
+ ko: string;
759
+ };
760
+ quote: {
761
+ en: string;
762
+ ko: string;
763
+ };
764
+ link: {
765
+ en: string;
766
+ ko: string;
767
+ };
768
+ words: {
769
+ en: string;
770
+ ko: string;
771
+ };
772
+ minRead: {
773
+ en: string;
774
+ ko: string;
775
+ };
776
+ addColumn: {
777
+ en: string;
778
+ ko: string;
779
+ };
780
+ addRow: {
781
+ en: string;
782
+ ko: string;
783
+ };
784
+ sortBy: {
785
+ en: string;
786
+ ko: string;
787
+ };
788
+ filterRows: {
789
+ en: string;
790
+ ko: string;
791
+ };
792
+ cleanStyling: {
793
+ en: string;
794
+ ko: string;
795
+ };
796
+ freezeHeader: {
797
+ en: string;
798
+ ko: string;
799
+ };
800
+ fillColor: {
801
+ en: string;
802
+ ko: string;
803
+ };
804
+ textColor: {
805
+ en: string;
806
+ ko: string;
807
+ };
808
+ alignLeft: {
809
+ en: string;
810
+ ko: string;
811
+ };
812
+ alignCenter: {
813
+ en: string;
814
+ ko: string;
815
+ };
816
+ alignRight: {
817
+ en: string;
818
+ ko: string;
819
+ };
820
+ numberFormat: {
821
+ en: string;
822
+ ko: string;
823
+ };
824
+ mergeCells: {
825
+ en: string;
826
+ ko: string;
827
+ };
828
+ unmergeCells: {
829
+ en: string;
830
+ ko: string;
831
+ };
832
+ sheetHint: {
833
+ en: string;
834
+ ko: string;
835
+ };
836
+ quickFunction: {
837
+ en: string;
838
+ ko: string;
839
+ };
840
+ quickFunctionTip: {
841
+ en: string;
842
+ ko: string;
843
+ };
844
+ mergeTip: {
845
+ en: string;
846
+ ko: string;
847
+ };
848
+ unmergeTip: {
849
+ en: string;
850
+ ko: string;
851
+ };
852
+ cleanStylingTip: {
853
+ en: string;
854
+ ko: string;
855
+ };
856
+ freezeOnTip: {
857
+ en: string;
858
+ ko: string;
859
+ };
860
+ freezeOffTip: {
861
+ en: string;
862
+ ko: string;
863
+ };
864
+ numberFormatTip: {
865
+ en: string;
866
+ ko: string;
867
+ };
868
+ sortByColumn: {
869
+ en: string;
870
+ ko: string;
871
+ };
872
+ ascending: {
873
+ en: string;
874
+ ko: string;
875
+ };
876
+ descending: {
877
+ en: string;
878
+ ko: string;
879
+ };
880
+ filterTip: {
881
+ en: string;
882
+ ko: string;
883
+ };
884
+ fxPlaceholder: {
885
+ en: string;
886
+ ko: string;
887
+ };
888
+ groupInsert: {
889
+ en: string;
890
+ ko: string;
891
+ };
892
+ groupFont: {
893
+ en: string;
894
+ ko: string;
895
+ };
896
+ groupAlign: {
897
+ en: string;
898
+ ko: string;
899
+ };
900
+ groupNumber: {
901
+ en: string;
902
+ ko: string;
903
+ };
904
+ groupEdit: {
905
+ en: string;
906
+ ko: string;
907
+ };
908
+ groupView: {
909
+ en: string;
910
+ ko: string;
911
+ };
912
+ boldGlyph: {
913
+ en: string;
914
+ ko: string;
915
+ };
916
+ textGlyph: {
917
+ en: string;
918
+ ko: string;
919
+ };
920
+ autoSum: {
921
+ en: string;
922
+ ko: string;
923
+ };
924
+ fmtGeneral: {
925
+ en: string;
926
+ ko: string;
927
+ };
928
+ fmtCurrency: {
929
+ en: string;
930
+ ko: string;
931
+ };
932
+ fmtPercent: {
933
+ en: string;
934
+ ko: string;
935
+ };
936
+ fmtThousands: {
937
+ en: string;
938
+ ko: string;
939
+ };
940
+ fmtDecimal: {
941
+ en: string;
942
+ ko: string;
943
+ };
944
+ fmtDate: {
945
+ en: string;
946
+ ko: string;
947
+ };
948
+ chartTitle: {
949
+ en: string;
950
+ ko: string;
951
+ };
952
+ editData: {
953
+ en: string;
954
+ ko: string;
955
+ };
956
+ doneEditing: {
957
+ en: string;
958
+ ko: string;
959
+ };
960
+ addRowBtn: {
961
+ en: string;
962
+ ko: string;
963
+ };
964
+ downloadPng: {
965
+ en: string;
966
+ ko: string;
967
+ };
968
+ stacked: {
969
+ en: string;
970
+ ko: string;
971
+ };
972
+ seriesColor: {
973
+ en: string;
974
+ ko: string;
975
+ };
976
+ seriesName: {
977
+ en: string;
978
+ ko: string;
979
+ };
980
+ removeRow: {
981
+ en: string;
982
+ ko: string;
983
+ };
984
+ addText: {
985
+ en: string;
986
+ ko: string;
987
+ };
988
+ addImage: {
989
+ en: string;
990
+ ko: string;
991
+ };
992
+ addShape: {
993
+ en: string;
994
+ ko: string;
995
+ };
996
+ arrangeMenu: {
997
+ en: string;
998
+ ko: string;
999
+ };
1000
+ padding: {
1001
+ en: string;
1002
+ ko: string;
1003
+ };
1004
+ duplicate: {
1005
+ en: string;
1006
+ ko: string;
1007
+ };
1008
+ delete: {
1009
+ en: string;
1010
+ ko: string;
1011
+ };
1012
+ group: {
1013
+ en: string;
1014
+ ko: string;
1015
+ };
1016
+ ungroup: {
1017
+ en: string;
1018
+ ko: string;
1019
+ };
1020
+ bringToFront: {
1021
+ en: string;
1022
+ ko: string;
1023
+ };
1024
+ sendToBack: {
1025
+ en: string;
1026
+ ko: string;
1027
+ };
1028
+ fontSize: {
1029
+ en: string;
1030
+ ko: string;
1031
+ };
1032
+ resizeTip: {
1033
+ en: string;
1034
+ ko: string;
1035
+ };
1036
+ fitToggle: {
1037
+ en: string;
1038
+ ko: string;
1039
+ };
1040
+ cornerRadius: {
1041
+ en: string;
1042
+ ko: string;
1043
+ };
1044
+ rotateStep: {
1045
+ en: string;
1046
+ ko: string;
1047
+ };
1048
+ rotationDeg: {
1049
+ en: string;
1050
+ ko: string;
1051
+ };
1052
+ duplicateShort: {
1053
+ en: string;
1054
+ ko: string;
1055
+ };
1056
+ bringForward: {
1057
+ en: string;
1058
+ ko: string;
1059
+ };
1060
+ sendBackward: {
1061
+ en: string;
1062
+ ko: string;
1063
+ };
1064
+ groupShort: {
1065
+ en: string;
1066
+ ko: string;
1067
+ };
1068
+ ungroupShort: {
1069
+ en: string;
1070
+ ko: string;
1071
+ };
1072
+ alignLeftEdges: {
1073
+ en: string;
1074
+ ko: string;
1075
+ };
1076
+ alignHCenters: {
1077
+ en: string;
1078
+ ko: string;
1079
+ };
1080
+ alignRightEdges: {
1081
+ en: string;
1082
+ ko: string;
1083
+ };
1084
+ alignTopEdges: {
1085
+ en: string;
1086
+ ko: string;
1087
+ };
1088
+ alignVCenters: {
1089
+ en: string;
1090
+ ko: string;
1091
+ };
1092
+ alignBottomEdges: {
1093
+ en: string;
1094
+ ko: string;
1095
+ };
1096
+ deleteSelection: {
1097
+ en: string;
1098
+ ko: string;
1099
+ };
1100
+ presentHint: {
1101
+ en: string;
1102
+ ko: string;
1103
+ };
1104
+ speakerNotes: {
1105
+ en: string;
1106
+ ko: string;
1107
+ };
1108
+ download: {
1109
+ en: string;
1110
+ ko: string;
1111
+ };
1112
+ openBtn: {
1113
+ en: string;
1114
+ ko: string;
1115
+ };
1116
+ fitWidth: {
1117
+ en: string;
1118
+ ko: string;
1119
+ };
1120
+ zoomIn: {
1121
+ en: string;
1122
+ ko: string;
1123
+ };
1124
+ zoomOut: {
1125
+ en: string;
1126
+ ko: string;
1127
+ };
1128
+ waitingPdf: {
1129
+ en: string;
1130
+ ko: string;
1131
+ };
1132
+ addTextBox: {
1133
+ en: string;
1134
+ ko: string;
1135
+ };
1136
+ addImageTip: {
1137
+ en: string;
1138
+ ko: string;
1139
+ };
1140
+ addShapeTip: {
1141
+ en: string;
1142
+ ko: string;
1143
+ };
1144
+ applyLayout: {
1145
+ en: string;
1146
+ ko: string;
1147
+ };
1148
+ autoLayoutTip: {
1149
+ en: string;
1150
+ ko: string;
1151
+ };
1152
+ bgColor: {
1153
+ en: string;
1154
+ ko: string;
1155
+ };
1156
+ bgImageTip: {
1157
+ en: string;
1158
+ ko: string;
1159
+ };
1160
+ padTip: {
1161
+ en: string;
1162
+ ko: string;
1163
+ };
1164
+ presentTip: {
1165
+ en: string;
1166
+ ko: string;
1167
+ };
1168
+ duplicateSlide: {
1169
+ en: string;
1170
+ ko: string;
1171
+ };
1172
+ deleteSlide: {
1173
+ en: string;
1174
+ ko: string;
1175
+ };
1176
+ theme: {
1177
+ en: string;
1178
+ ko: string;
1179
+ };
1180
+ desktop: {
1181
+ en: string;
1182
+ ko: string;
1183
+ };
1184
+ tablet: {
1185
+ en: string;
1186
+ ko: string;
1187
+ };
1188
+ mobile: {
1189
+ en: string;
1190
+ ko: string;
1191
+ };
1192
+ a11yIssues: {
1193
+ en: string;
1194
+ ko: string;
1195
+ };
1196
+ a11yNone: {
1197
+ en: string;
1198
+ ko: string;
1199
+ };
1200
+ pageTemplateTitle: {
1201
+ en: string;
1202
+ ko: string;
1203
+ };
1204
+ sectionTemplateTitle: {
1205
+ en: string;
1206
+ ko: string;
1207
+ };
1208
+ jumpToHeading: {
1209
+ en: string;
1210
+ ko: string;
1211
+ };
1212
+ insertSlideLayout: {
1213
+ en: string;
1214
+ ko: string;
1215
+ };
1216
+ applySlideTheme: {
1217
+ en: string;
1218
+ ko: string;
1219
+ };
1220
+ insertShape: {
1221
+ en: string;
1222
+ ko: string;
1223
+ };
1224
+ slideFont: {
1225
+ en: string;
1226
+ ko: string;
1227
+ };
1228
+ slideBgImage: {
1229
+ en: string;
1230
+ ko: string;
1231
+ };
1232
+ moveUp: {
1233
+ en: string;
1234
+ ko: string;
1235
+ };
1236
+ moveDown: {
1237
+ en: string;
1238
+ ko: string;
1239
+ };
1240
+ waitingData: {
1241
+ en: string;
1242
+ ko: string;
1243
+ };
1244
+ calculating: {
1245
+ en: string;
1246
+ ko: string;
1247
+ };
1248
+ loadingSheet: {
1249
+ en: string;
1250
+ ko: string;
1251
+ };
1252
+ dropToOpen: {
1253
+ en: string;
1254
+ ko: string;
1255
+ };
1256
+ };
1257
+ type MessageKey = keyof typeof MESSAGES;
1258
+ interface CanvasLocaleProviderProps {
1259
+ locale?: CanvasLocale;
1260
+ children: ReactNode;
1261
+ }
1262
+ declare function CanvasLocaleProvider({ locale, children }: CanvasLocaleProviderProps): react.JSX.Element;
1263
+ declare function useLocale(): CanvasLocale;
1264
+ /** `const t = useT(); t("sortBy")` → the label in the canvas's locale. */
1265
+ declare function useT(): (key: MessageKey) => string;
1266
+
506
1267
  interface RendererProps<TData = unknown> {
507
1268
  artifact: Artifact<TData>;
508
1269
  }
@@ -521,6 +1282,8 @@ declare function mergeRegistries(...registries: ArtifactRegistry[]): ArtifactReg
521
1282
  interface CanvasProps {
522
1283
  /** Renderer map. Defaults to the built-in html/document/chart/table renderers. */
523
1284
  registry?: ArtifactRegistry;
1285
+ /** UI language for the canvas chrome (toolbars, menus, states). Default "en". */
1286
+ locale?: CanvasLocale;
524
1287
  /** Rendered when no artifact has been opened yet. */
525
1288
  emptyState?: ReactNode;
526
1289
  /**
@@ -537,8 +1300,15 @@ interface CanvasProps {
537
1300
  * debounce further on the host before hitting the network.
538
1301
  */
539
1302
  onUserEdit?: (artifact: Artifact) => void;
1303
+ /**
1304
+ * Persist user edits: the debounced companion to `onUserEdit` (see
1305
+ * `useCanvasSave`). Called after edits go quiet, with the artifact and the
1306
+ * `baseRevision` to hand a store-backed save endpoint. When omitted, edits
1307
+ * stay in-memory exactly as before.
1308
+ */
1309
+ onSave?: CanvasSaveHandler;
540
1310
  }
541
- declare function Canvas({ registry, emptyState, onEditElement, onUserEdit }: CanvasProps): react.JSX.Element;
1311
+ declare function Canvas({ registry, locale, emptyState, onEditElement, onUserEdit, onSave }: CanvasProps): react.JSX.Element;
542
1312
 
543
1313
  interface ExportMenuProps {
544
1314
  artifact: Artifact;
@@ -569,6 +1339,8 @@ declare function ArtifactCard({ artifactId }: {
569
1339
  artifactId: string;
570
1340
  }): react.JSX.Element | null;
571
1341
 
1342
+ declare function PdfRenderer$1({ artifact }: RendererProps<PdfData>): react.JSX.Element;
1343
+
572
1344
  declare function SlidesRenderer$1({ artifact }: RendererProps<SlidesData>): react.JSX.Element;
573
1345
 
574
1346
  declare function TableRenderer$1({ artifact }: RendererProps<TableData>): react.JSX.Element;
@@ -583,6 +1355,7 @@ declare const ChartRenderer: react.LazyExoticComponent<typeof ChartRenderer$1>;
583
1355
  declare const DocumentRenderer: react.LazyExoticComponent<typeof DocumentRenderer$1>;
584
1356
  declare const TableRenderer: react.LazyExoticComponent<typeof TableRenderer$1>;
585
1357
  declare const SlidesRenderer: react.LazyExoticComponent<typeof SlidesRenderer$1>;
1358
+ declare const PdfRenderer: react.LazyExoticComponent<typeof PdfRenderer$1>;
586
1359
 
587
1360
  /**
588
1361
  * The batteries-included renderers. `html` is the base substrate (sandboxed
@@ -670,7 +1443,7 @@ declare function printToPdf(html: string): void;
670
1443
  */
671
1444
 
672
1445
  /** Extensions we can turn into an artifact, for `accept="…"` and drop filtering. */
673
- declare const IMPORTABLE_EXTENSIONS: readonly [".csv", ".md", ".markdown", ".txt", ".html", ".htm", ".json", ".xlsx"];
1446
+ declare const IMPORTABLE_EXTENSIONS: readonly [".csv", ".md", ".markdown", ".txt", ".html", ".htm", ".json", ".xlsx", ".pdf", ".hwpx", ".hwp", ".docx", ".pptx"];
674
1447
  /** True when the file has an extension we know how to import. */
675
1448
  declare const canImport: (file: File) => boolean;
676
1449
  /**
@@ -695,4 +1468,4 @@ declare function useCanvasImport(): {
695
1468
  canImport: (file: File) => boolean;
696
1469
  };
697
1470
 
698
- export { type Artifact, ArtifactCard, type ArtifactRegistry, type ArtifactRenderer, type ArtifactStatus, Canvas, type CanvasAppend, type CanvasClose, type CanvasCreate, type CanvasEvent, type CanvasNodePatch, type CanvasPatch, type CanvasProps, CanvasProvider, type CanvasProviderProps, CanvasRegistryProvider, type CanvasReplace, type CanvasState, type CanvasStatus, type CanvasStore, type ChartArtifact, type ChartData, type ChartOptions, ChartRenderer, type ChartSeries, type ChatEvent, type ChatMessage, type ChatRequest, type DocumentArtifact, type DocumentData, DocumentRenderer, type DoneEvent, type ElementSelection, type ErrorEvent, ExportMenu, type FileExport, type HtmlArtifact, type HtmlData, HtmlRenderer, IMPORTABLE_EXTENSIONS, INSPECTOR_MARK, type IframeCommand, type KnownArtifact, type MessageDelta, type MessageEnd, type MockStreamOptions, type RendererProps, STYLE_PROPS, type Scenario, SelectionBar, type Slide, type SlideElement, type SlidesArtifact, type SlidesData, SlidesRenderer, type StreamEvent, type StreamOptions, StylePanel, type TableArtifact, type TableColumn, type TableData, TableRenderer, type ToolEnd, type ToolStart, type UseCanvasStreamOptions, type UserEditHandler, builtinRenderers, canImport, createCanvasStore, dataExporters, downloadBlob, emptyCanvasState, importFile, isCanvasEvent, isChatEvent, mergePatch, mergeRegistries, mockStream, parseCsv, parseSSE, printToPdf, reduceCanvas, scenarios, slidesToPrintHtml, slugify, streamChat, toStandaloneHtml, useArtifactPatch, useCanvasImport, useCanvasReplay, useCanvasStore, useCanvasStoreApi, useCanvasStream, useRenderer, withInspector };
1471
+ export { type Artifact, ArtifactCard, type ArtifactRegistry, type ArtifactRenderer, type ArtifactStatus, Canvas, type CanvasAppend, type CanvasClose, type CanvasCommit, type CanvasCreate, type CanvasEvent, type CanvasLocale, CanvasLocaleProvider, type CanvasNodePatch, type CanvasPatch, type CanvasProps, CanvasProvider, type CanvasProviderProps, CanvasRegistryProvider, type CanvasReplace, type CanvasSaveHandler, type CanvasSavePayload, type CanvasState, type CanvasStatus, type CanvasStore, type ChartArtifact, type ChartData, type ChartOptions, ChartRenderer, type ChartSeries, type ChatEvent, type ChatMessage, type ChatRequest, type DocumentArtifact, type DocumentData, DocumentRenderer, type DoneEvent, type ElementSelection, type ErrorEvent, ExportMenu, type FileExport, type HtmlArtifact, type HtmlData, HtmlRenderer, IMPORTABLE_EXTENSIONS, INSPECTOR_MARK, type IframeCommand, type KnownArtifact, type MessageDelta, type MessageEnd, type MessageKey, type MockStreamOptions, type PdfArtifact, type PdfData, PdfRenderer, type RendererProps, STYLE_PROPS, type Scenario, SelectionBar, type Slide, type SlideElement, type SlidesArtifact, type SlidesData, SlidesRenderer, type StreamEvent, type StreamOptions, StylePanel, type TableArtifact, type TableColumn, type TableData, TableRenderer, type ToolEnd, type ToolStart, type UseCanvasStreamOptions, type UserEditHandler, builtinRenderers, canImport, createCanvasStore, dataExporters, downloadBlob, emptyCanvasState, importFile, isCanvasEvent, isChatEvent, mergePatch, mergeRegistries, mockStream, parseCsv, parseSSE, printToPdf, reduceCanvas, scenarios, slidesToPrintHtml, slugify, streamChat, toStandaloneHtml, useArtifactPatch, useCanvasImport, useCanvasReplay, useCanvasSave, useCanvasStore, useCanvasStoreApi, useCanvasStream, useLocale, useRenderer, useT, withInspector };