@braincrew-lab/langchain-canvas 0.2.0 → 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.
@@ -0,0 +1,207 @@
1
+ import { createContext, useContext, useCallback } from 'react';
2
+ import { jsx } from 'react/jsx-runtime';
3
+
4
+ // src/i18n/i18n.tsx
5
+ var MESSAGES = {
6
+ // --- shell / header ---
7
+ undo: { en: "Undo", ko: "\uC2E4\uD589 \uCDE8\uC18C" },
8
+ redo: { en: "Redo", ko: "\uB2E4\uC2DC \uC2E4\uD589" },
9
+ export: { en: "Export \u25BE", ko: "\uB0B4\uBCF4\uB0B4\uAE30 \u25BE" },
10
+ openInTab: { en: "Open in new tab \u2197", ko: "\uC0C8 \uD0ED\uC5D0\uC11C \uC5F4\uAE30 \u2197" },
11
+ copyHtml: { en: "Copy HTML", ko: "HTML \uBCF5\uC0AC" },
12
+ copied: { en: "Copied \u2713", ko: "\uBCF5\uC0AC\uB428 \u2713" },
13
+ versionHistory: { en: "Version history", ko: "\uBC84\uC804 \uAE30\uB85D" },
14
+ prevVersion: { en: "Previous version", ko: "\uC774\uC804 \uBC84\uC804" },
15
+ nextVersion: { en: "Next version", ko: "\uB2E4\uC74C \uBC84\uC804" },
16
+ backToLatest: { en: "Back to latest", ko: "\uCD5C\uC2E0\uC73C\uB85C \uB3CC\uC544\uAC00\uAE30" },
17
+ historyNote: {
18
+ en: "read-only \u2014 select the latest version to edit",
19
+ ko: "\uC77D\uAE30 \uC804\uC6A9 \u2014 \uD3B8\uC9D1\uD558\uB824\uBA74 \uCD5C\uC2E0 \uBC84\uC804\uC744 \uC120\uD0DD\uD558\uC138\uC694"
20
+ },
21
+ loading: { en: "Loading\u2026", ko: "\uBD88\uB7EC\uC624\uB294 \uC911\u2026" },
22
+ noRenderer: { en: "No renderer registered for type", ko: "\uB4F1\uB85D\uB41C \uB80C\uB354\uB7EC\uAC00 \uC5C6\uB294 \uD0C0\uC785:" },
23
+ writing: { en: "writing\u2026", ko: "\uC791\uC131 \uC911\u2026" },
24
+ open: { en: "open \u2192", ko: "\uC5F4\uAE30 \u2192" },
25
+ // --- artifact kinds (cards / tabs) ---
26
+ kindWeb: { en: "Web page", ko: "\uC6F9 \uD398\uC774\uC9C0" },
27
+ kindDocument: { en: "Word document", ko: "\uBB38\uC11C" },
28
+ kindChart: { en: "Chart", ko: "\uCC28\uD2B8" },
29
+ kindTable: { en: "Excel sheet", ko: "\uC2A4\uD504\uB808\uB4DC\uC2DC\uD2B8" },
30
+ kindSlides: { en: "PowerPoint deck", ko: "\uD504\uB808\uC820\uD14C\uC774\uC158" },
31
+ kindPdf: { en: "PDF", ko: "PDF" },
32
+ // --- html (web) toolbar ---
33
+ design: { en: "Design", ko: "\uB514\uC790\uC778" },
34
+ code: { en: "Code", ko: "\uCF54\uB4DC" },
35
+ add: { en: "ADD", ko: "\uCD94\uAC00" },
36
+ heading: { en: "Heading", ko: "\uC81C\uBAA9" },
37
+ text: { en: "Text", ko: "\uD14D\uC2A4\uD2B8" },
38
+ button: { en: "Button", ko: "\uBC84\uD2BC" },
39
+ image: { en: "Image", ko: "\uC774\uBBF8\uC9C0" },
40
+ divider: { en: "Divider", ko: "\uAD6C\uBD84\uC120" },
41
+ pageMenu: { en: "Page\u2026", ko: "\uD398\uC774\uC9C0\u2026" },
42
+ sectionMenu: { en: "Section\u2026", ko: "\uC139\uC158\u2026" },
43
+ outlineMenu: { en: "Outline\u2026", ko: "\uAC1C\uC694\u2026" },
44
+ layoutMenu: { en: "Layout\u2026", ko: "\uB808\uC774\uC544\uC6C3\u2026" },
45
+ themeMenu: { en: "Theme\u2026", ko: "\uD14C\uB9C8\u2026" },
46
+ fontMenu: { en: "Font\u2026", ko: "\uAE00\uAF34\u2026" },
47
+ shapeMenu: { en: "Shape\u2026", ko: "\uB3C4\uD615\u2026" },
48
+ a11yCheck: { en: "\u267F Check", ko: "\u267F \uAC80\uC0AC" },
49
+ a11yTitle: { en: "Accessibility check", ko: "\uC811\uADFC\uC131 \uAC80\uC0AC" },
50
+ a11yClean: { en: "No issues found \u{1F389}", ko: "\uBB38\uC81C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4 \u{1F389}" },
51
+ bgImage: { en: "\u{1F5BC} BG", ko: "\u{1F5BC} \uBC30\uACBD" },
52
+ present: { en: "Present", ko: "\uBC1C\uD45C" },
53
+ // --- document toolbar ---
54
+ bold: { en: "Bold", ko: "\uAD75\uAC8C" },
55
+ italic: { en: "Italic", ko: "\uAE30\uC6B8\uC784" },
56
+ inlineCode: { en: "Code", ko: "\uCF54\uB4DC" },
57
+ bulletList: { en: "Bullet list", ko: "\uAE00\uBA38\uB9AC \uAE30\uD638" },
58
+ numberedList: { en: "Numbered list", ko: "\uBC88\uD638 \uB9E4\uAE30\uAE30" },
59
+ quote: { en: "Quote", ko: "\uC778\uC6A9" },
60
+ link: { en: "Link", ko: "\uB9C1\uD06C" },
61
+ words: { en: "words", ko: "\uB2E8\uC5B4" },
62
+ minRead: { en: "min read", ko: "\uBD84 \uBD84\uB7C9" },
63
+ // --- table toolbar ---
64
+ addColumn: { en: "\uFF0B Column", ko: "\uFF0B \uC5F4" },
65
+ addRow: { en: "\uFF0B Row", ko: "\uFF0B \uD589" },
66
+ sortBy: { en: "Sort\u2026", ko: "\uC815\uB82C\u2026" },
67
+ filterRows: { en: "Filter\u2026", ko: "\uD544\uD130\u2026" },
68
+ cleanStyling: { en: "Clean styling", ko: "\uC2A4\uD0C0\uC77C \uC815\uB9AC" },
69
+ freezeHeader: { en: "Freeze panes", ko: "\uD2C0 \uACE0\uC815" },
70
+ fillColor: { en: "Fill color", ko: "\uCC44\uC6B0\uAE30 \uC0C9" },
71
+ textColor: { en: "Text color", ko: "\uAE00\uC790 \uC0C9" },
72
+ alignLeft: { en: "Align left", ko: "\uC67C\uCABD \uC815\uB82C" },
73
+ alignCenter: { en: "Align center", ko: "\uAC00\uC6B4\uB370 \uC815\uB82C" },
74
+ alignRight: { en: "Align right", ko: "\uC624\uB978\uCABD \uC815\uB82C" },
75
+ numberFormat: { en: "Fmt\u2026", ko: "\uC11C\uC2DD\u2026" },
76
+ mergeCells: { en: "Merge", ko: "\uBCD1\uD569" },
77
+ unmergeCells: { en: "Unmerge", ko: "\uBCD1\uD569 \uD574\uC81C" },
78
+ sheetHint: {
79
+ en: "Right-click a header for more, or drag to edit",
80
+ ko: "\uBA38\uB9AC\uAE00 \uC6B0\uD074\uB9AD\uC73C\uB85C \uB354 \uBCF4\uAE30 \xB7 \uB4DC\uB798\uADF8\uB85C \uD3B8\uC9D1"
81
+ },
82
+ // --- table extras ---
83
+ quickFunction: { en: "\u03A3 fx", ko: "\u03A3 \uD568\uC218" },
84
+ quickFunctionTip: { en: "Quick function \u2014 writes the formula below the selection (right, for a single row)", ko: "\uBE60\uB978 \uD568\uC218 \u2014 \uC120\uD0DD \uC601\uC5ED \uC544\uB798(\uD55C \uD589\uC774\uBA74 \uC624\uB978\uCABD)\uC5D0 \uC218\uC2DD \uC785\uB825" },
85
+ mergeTip: { en: "Merge the selected cells", ko: "\uC120\uD0DD\uD55C \uC140 \uBCD1\uD569" },
86
+ unmergeTip: { en: "Unmerge the selected cells", ko: "\uC120\uD0DD\uD55C \uC140 \uBCD1\uD569 \uD574\uC81C" },
87
+ cleanStylingTip: { en: "Remove all cell fills and font colors", ko: "\uBAA8\uB4E0 \uC140 \uCC44\uC6B0\uAE30\xB7\uAE00\uC790 \uC0C9 \uC81C\uAC70" },
88
+ freezeOnTip: { en: "Keep the header row visible while scrolling", ko: "\uC2A4\uD06C\uB864 \uC2DC \uBA38\uB9AC\uAE00 \uD589 \uACE0\uC815" },
89
+ freezeOffTip: { en: "Unfreeze the header row", ko: "\uBA38\uB9AC\uAE00 \uD589 \uACE0\uC815 \uD574\uC81C" },
90
+ numberFormatTip: { en: "Number format", ko: "\uC22B\uC790 \uC11C\uC2DD" },
91
+ sortByColumn: { en: "Sort by column", ko: "\uC5F4 \uAE30\uC900 \uC815\uB82C" },
92
+ ascending: { en: "Ascending", ko: "\uC624\uB984\uCC28\uC21C" },
93
+ descending: { en: "Descending", ko: "\uB0B4\uB9BC\uCC28\uC21C" },
94
+ filterTip: { en: "Filter rows", ko: "\uD589 \uD544\uD130" },
95
+ fxPlaceholder: { en: "=formula or value", ko: "=\uC218\uC2DD \uB610\uB294 \uAC12 \uC785\uB825" },
96
+ groupInsert: { en: "Insert", ko: "\uC0BD\uC785" },
97
+ groupFont: { en: "Font", ko: "\uAE00\uAF34" },
98
+ groupAlign: { en: "Alignment", ko: "\uB9DE\uCDA4" },
99
+ groupNumber: { en: "Number", ko: "\uD45C\uC2DC \uD615\uC2DD" },
100
+ groupEdit: { en: "Editing", ko: "\uD3B8\uC9D1" },
101
+ groupView: { en: "View", ko: "\uBCF4\uAE30" },
102
+ boldGlyph: { en: "B", ko: "\uAC00" },
103
+ textGlyph: { en: "A", ko: "\uAC00" },
104
+ autoSum: { en: "\u03A3 AutoSum", ko: "\u03A3 \uC790\uB3D9 \uD569\uACC4" },
105
+ fmtGeneral: { en: "General", ko: "\uC77C\uBC18" },
106
+ fmtCurrency: { en: "Currency", ko: "\uD1B5\uD654" },
107
+ fmtPercent: { en: "Percent", ko: "\uD37C\uC13C\uD2B8" },
108
+ fmtThousands: { en: "Thousands", ko: "\uCC9C\uB2E8\uC704" },
109
+ fmtDecimal: { en: "Decimal", ko: "\uC18C\uC218" },
110
+ fmtDate: { en: "Date", ko: "\uB0A0\uC9DC" },
111
+ // --- chart ---
112
+ chartTitle: { en: "Chart title\u2026", ko: "\uCC28\uD2B8 \uC81C\uBAA9\u2026" },
113
+ editData: { en: "Edit data", ko: "\uB370\uC774\uD130 \uD3B8\uC9D1" },
114
+ doneEditing: { en: "Done", ko: "\uC644\uB8CC" },
115
+ addRowBtn: { en: "+ Add row", ko: "+ \uD589 \uCD94\uAC00" },
116
+ downloadPng: { en: "\u2913 PNG", ko: "\u2913 PNG" },
117
+ stacked: { en: "Stacked", ko: "\uB204\uC801" },
118
+ seriesColor: { en: "Series color", ko: "\uACC4\uC5F4 \uC0C9" },
119
+ seriesName: { en: "Series name", ko: "\uACC4\uC5F4 \uC774\uB984" },
120
+ removeRow: { en: "Remove row", ko: "\uD589 \uC0AD\uC81C" },
121
+ // --- slides (deck) ---
122
+ addText: { en: "+ Text", ko: "+ \uD14D\uC2A4\uD2B8" },
123
+ addImage: { en: "+ Image", ko: "+ \uC774\uBBF8\uC9C0" },
124
+ addShape: { en: "+ Shape", ko: "+ \uB3C4\uD615" },
125
+ arrangeMenu: { en: "\u2922 Arrange\u2026", ko: "\u2922 \uC815\uB82C\u2026" },
126
+ padding: { en: "Pad", ko: "\uC5EC\uBC31" },
127
+ duplicate: { en: "Duplicate", ko: "\uBCF5\uC81C" },
128
+ delete: { en: "Delete", ko: "\uC0AD\uC81C" },
129
+ group: { en: "Group", ko: "\uADF8\uB8F9" },
130
+ ungroup: { en: "Ungroup", ko: "\uADF8\uB8F9 \uD574\uC81C" },
131
+ bringToFront: { en: "Bring to front", ko: "\uB9E8 \uC55E\uC73C\uB85C" },
132
+ sendToBack: { en: "Send to back", ko: "\uB9E8 \uB4A4\uB85C" },
133
+ fontSize: { en: "Font size", ko: "\uAE00\uC790 \uD06C\uAE30" },
134
+ resizeTip: { en: "Resize (hold Shift to lock aspect)", ko: "\uD06C\uAE30 \uC870\uC808 (Shift: \uBE44\uC728 \uACE0\uC815)" },
135
+ fitToggle: { en: "Fill / Fit", ko: "\uCC44\uC6B0\uAE30 / \uB9DE\uCDA4" },
136
+ cornerRadius: { en: "Corner radius (px)", ko: "\uBAA8\uC11C\uB9AC \uB77C\uC6B4\uB4DC (px)" },
137
+ rotateStep: { en: "Rotate 15\xB0 (Shift: \u221215\xB0)", ko: "15\xB0 \uD68C\uC804 (Shift: \u221215\xB0)" },
138
+ rotationDeg: { en: "Rotation (degrees, clockwise)", ko: "\uD68C\uC804 \uAC01\uB3C4 (\uC2DC\uACC4 \uBC29\uD5A5)" },
139
+ duplicateShort: { en: "Duplicate (\u2318D)", ko: "\uBCF5\uC81C (\u2318D)" },
140
+ bringForward: { en: "Bring forward (\u2318])", ko: "\uC55E\uC73C\uB85C (\u2318])" },
141
+ sendBackward: { en: "Send backward (\u2318[)", ko: "\uB4A4\uB85C (\u2318[)" },
142
+ groupShort: { en: "Group (\u2318G)", ko: "\uADF8\uB8F9 (\u2318G)" },
143
+ ungroupShort: { en: "Ungroup (\u2318\u21E7G)", ko: "\uADF8\uB8F9 \uD574\uC81C (\u2318\u21E7G)" },
144
+ alignLeftEdges: { en: "Align left edges", ko: "\uC67C\uCABD \uAC00\uC7A5\uC790\uB9AC \uC815\uB82C" },
145
+ alignHCenters: { en: "Align horizontal centers", ko: "\uAC00\uB85C \uC911\uC559 \uC815\uB82C" },
146
+ alignRightEdges: { en: "Align right edges", ko: "\uC624\uB978\uCABD \uAC00\uC7A5\uC790\uB9AC \uC815\uB82C" },
147
+ alignTopEdges: { en: "Align top edges", ko: "\uC704 \uAC00\uC7A5\uC790\uB9AC \uC815\uB82C" },
148
+ alignVCenters: { en: "Align vertical centers", ko: "\uC138\uB85C \uC911\uC559 \uC815\uB82C" },
149
+ alignBottomEdges: { en: "Align bottom edges", ko: "\uC544\uB798 \uAC00\uC7A5\uC790\uB9AC \uC815\uB82C" },
150
+ deleteSelection: { en: "Delete selection", ko: "\uC120\uD0DD \uC0AD\uC81C" },
151
+ presentHint: { en: "\u2190 \u2192 to navigate \xB7 Esc to exit", ko: "\u2190 \u2192 \uC774\uB3D9 \xB7 Esc \uC885\uB8CC" },
152
+ speakerNotes: { en: "Speaker notes\u2026", ko: "\uBC1C\uD45C\uC790 \uB178\uD2B8\u2026" },
153
+ // --- pdf ---
154
+ download: { en: "\u2913 Download", ko: "\u2913 \uB2E4\uC6B4\uB85C\uB4DC" },
155
+ openBtn: { en: "\u2197 Open", ko: "\u2197 \uC5F4\uAE30" },
156
+ fitWidth: { en: "Fit", ko: "\uB9DE\uCDA4" },
157
+ zoomIn: { en: "Zoom in", ko: "\uD655\uB300" },
158
+ zoomOut: { en: "Zoom out", ko: "\uCD95\uC18C" },
159
+ waitingPdf: { en: "Waiting for PDF\u2026", ko: "PDF\uB97C \uAE30\uB2E4\uB9AC\uB294 \uC911\u2026" },
160
+ // --- slides deck extras ---
161
+ addTextBox: { en: "Add text box", ko: "\uD14D\uC2A4\uD2B8 \uC0C1\uC790 \uCD94\uAC00" },
162
+ addImageTip: { en: "Add image", ko: "\uC774\uBBF8\uC9C0 \uCD94\uAC00" },
163
+ addShapeTip: { en: "Add a shape", ko: "\uB3C4\uD615 \uCD94\uAC00" },
164
+ applyLayout: { en: "Apply a layout", ko: "\uB808\uC774\uC544\uC6C3 \uC801\uC6A9" },
165
+ autoLayoutTip: { en: "Auto layout \u2014 align & distribute elements", ko: "\uC790\uB3D9 \uC815\uB82C \u2014 \uC694\uC18C \uC815\uB82C\xB7\uBC30\uBD84" },
166
+ bgColor: { en: "Background color", ko: "\uBC30\uACBD\uC0C9" },
167
+ bgImageTip: { en: "Background image", ko: "\uBC30\uACBD \uC774\uBBF8\uC9C0" },
168
+ padTip: { en: "Content padding (% of slide)", ko: "\uCF58\uD150\uCE20 \uC5EC\uBC31 (\uC2AC\uB77C\uC774\uB4DC %)" },
169
+ presentTip: { en: "Present (full screen)", ko: "\uBC1C\uD45C (\uC804\uCCB4 \uD654\uBA74)" },
170
+ duplicateSlide: { en: "Duplicate slide", ko: "\uC2AC\uB77C\uC774\uB4DC \uBCF5\uC81C" },
171
+ deleteSlide: { en: "Delete slide", ko: "\uC2AC\uB77C\uC774\uB4DC \uC0AD\uC81C" },
172
+ theme: { en: "Theme", ko: "\uD14C\uB9C8" },
173
+ // --- devices ---
174
+ desktop: { en: "Desktop", ko: "\uB370\uC2A4\uD06C\uD1B1" },
175
+ tablet: { en: "Tablet", ko: "\uD0DC\uBE14\uB9BF" },
176
+ mobile: { en: "Mobile", ko: "\uBAA8\uBC14\uC77C" },
177
+ a11yIssues: { en: "accessibility issues", ko: "\uC811\uADFC\uC131 \uBB38\uC81C" },
178
+ a11yNone: { en: "\u267F No accessibility issues found", ko: "\u267F \uC811\uADFC\uC131 \uBB38\uC81C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4" },
179
+ pageTemplateTitle: { en: "Start from a full page template (replaces the page)", ko: "\uC804\uCCB4 \uD398\uC774\uC9C0 \uD15C\uD50C\uB9BF\uC73C\uB85C \uC2DC\uC791 (\uAE30\uC874 \uD398\uC774\uC9C0 \uB300\uCCB4)" },
180
+ sectionTemplateTitle: { en: "Insert a section template", ko: "\uC139\uC158 \uD15C\uD50C\uB9BF \uC0BD\uC785" },
181
+ jumpToHeading: { en: "Jump to a heading", ko: "\uC81C\uBAA9\uC73C\uB85C \uC774\uB3D9" },
182
+ insertSlideLayout: { en: "Insert a slide layout", ko: "\uC2AC\uB77C\uC774\uB4DC \uB808\uC774\uC544\uC6C3 \uC0BD\uC785" },
183
+ applySlideTheme: { en: "Apply a slide theme", ko: "\uC2AC\uB77C\uC774\uB4DC \uD14C\uB9C8 \uC801\uC6A9" },
184
+ insertShape: { en: "Insert a shape", ko: "\uB3C4\uD615 \uC0BD\uC785" },
185
+ slideFont: { en: "Slide font", ko: "\uC2AC\uB77C\uC774\uB4DC \uAE00\uAF34" },
186
+ slideBgImage: { en: "Slide background image", ko: "\uC2AC\uB77C\uC774\uB4DC \uBC30\uACBD \uC774\uBBF8\uC9C0" },
187
+ moveUp: { en: "Move up", ko: "\uC704\uB85C" },
188
+ moveDown: { en: "Move down", ko: "\uC544\uB798\uB85C" },
189
+ // --- misc states ---
190
+ waitingData: { en: "Waiting for data\u2026", ko: "\uB370\uC774\uD130\uB97C \uAE30\uB2E4\uB9AC\uB294 \uC911\u2026" },
191
+ calculating: { en: "Calculating\u2026", ko: "\uACC4\uC0B0 \uC911\u2026" },
192
+ loadingSheet: { en: "Loading spreadsheet\u2026", ko: "\uC2A4\uD504\uB808\uB4DC\uC2DC\uD2B8 \uBD88\uB7EC\uC624\uB294 \uC911\u2026" },
193
+ dropToOpen: { en: "Drop to open", ko: "\uB193\uC544\uC11C \uC5F4\uAE30" }
194
+ };
195
+ var LocaleContext = createContext("en");
196
+ function CanvasLocaleProvider({ locale = "en", children }) {
197
+ return /* @__PURE__ */ jsx(LocaleContext.Provider, { value: locale, children });
198
+ }
199
+ function useLocale() {
200
+ return useContext(LocaleContext);
201
+ }
202
+ function useT() {
203
+ const locale = useContext(LocaleContext);
204
+ return useCallback((key) => MESSAGES[key][locale] ?? MESSAGES[key].en, [locale]);
205
+ }
206
+
207
+ export { CanvasLocaleProvider, useLocale, useT };
@@ -46,8 +46,24 @@ function reduceCanvas(state, event) {
46
46
  if (!current) return state;
47
47
  return replaceInPlace(state, { ...current, status: event.status });
48
48
  }
49
+ case "canvas.commit": {
50
+ const current = state.artifacts[event.id];
51
+ if (!current) return state;
52
+ const snapshot = {
53
+ ...current,
54
+ version: current.version + 1,
55
+ meta: {
56
+ ...current.meta ?? {},
57
+ commitDescription: event.description,
58
+ ...event.revision ? { revision: event.revision } : {}
59
+ }
60
+ };
61
+ return pushVersion(state, snapshot);
62
+ }
49
63
  case "canvas.close":
50
64
  return state.activeId === event.id ? { ...state, activeId: lastOf(state.order, event.id) } : state;
65
+ default:
66
+ return state;
51
67
  }
52
68
  }
53
69
  function create(state, artifact) {