telva 1.1.1 → 1.1.2
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/README.md +25 -270
- package/dist/Telva.d.ts +3 -3
- package/dist/components/CenterToolbar/CenterToolbar.d.ts.map +1 -1
- package/dist/components/ContextMenu/ContextMenu.d.ts +1 -1
- package/dist/components/Primitives/DropdownMenu/DMCheckboxItem.d.ts +1 -1
- package/dist/components/Primitives/DropdownMenu/DMItem.d.ts +1 -1
- package/dist/components/Primitives/DropdownMenu/DMRadioItem.d.ts +1 -1
- package/dist/components/Primitives/DropdownMenu/DMTriggerIcon.d.ts +1 -1
- package/dist/components/Primitives/Panel/Panel.d.ts +1 -1
- package/dist/components/Primitives/RowButton/RowButton.d.ts +1 -1
- package/dist/components/Primitives/TextField/TextField.d.ts +1 -1
- package/dist/components/Primitives/ToolButton/ToolButton.d.ts +2 -2
- package/dist/components/RightPanel/PropertiesPanel.d.ts.map +1 -1
- package/dist/components/ToolsPanel/PrimaryTools.d.ts.map +1 -1
- package/dist/components/ToolsPanel/ShapesMenu.d.ts +1 -1
- package/dist/components/TopPanel/Menu/Menu.d.ts.map +1 -1
- package/dist/components/TopPanel/PageMenu/PageMenu.d.ts +1 -1
- package/dist/components/TopPanel/PageOptionsDialog/PageOptionsDialog.d.ts +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/hooks/useFileSystem.d.ts +1 -1
- package/dist/hooks/useKeyboardShortcuts.d.ts.map +1 -1
- package/dist/hooks/useTelvaApp.d.ts +1 -1
- package/dist/hooks/useTheme.d.ts +1 -1
- package/dist/hooks/useTranslation.d.ts +2 -2
- package/dist/hooks/useTranslation.d.ts.map +1 -1
- package/dist/index.js +10 -10
- package/dist/index.js.map +3 -3
- package/dist/index.mjs +30283 -18
- package/dist/index.mjs.map +3 -3
- package/dist/state/StateManager/StateManager.d.ts +1 -1
- package/dist/state/TVDR.d.ts +1 -1
- package/dist/state/TelvaApp.d.ts +8 -8
- package/dist/state/TelvaApp.d.ts.map +1 -1
- package/dist/state/commands/alignShapes/alignShapes.d.ts +2 -2
- package/dist/state/commands/changePage/changePage.d.ts +2 -2
- package/dist/state/commands/createPage/createPage.d.ts +2 -2
- package/dist/state/commands/createShapes/createShapes.d.ts +2 -2
- package/dist/state/commands/deletePage/deletePage.d.ts +2 -2
- package/dist/state/commands/deleteShapes/deleteShapes.d.ts +2 -2
- package/dist/state/commands/distributeShapes/distributeShapes.d.ts +2 -2
- package/dist/state/commands/duplicatePage/duplicatePage.d.ts +2 -2
- package/dist/state/commands/duplicateShapes/duplicateShapes.d.ts +2 -2
- package/dist/state/commands/flipShapes/flipShapes.d.ts +3 -3
- package/dist/state/commands/groupShapes/groupShapes.d.ts +2 -2
- package/dist/state/commands/insertContent/insertContent.d.ts +2 -2
- package/dist/state/commands/movePage/movePage.d.ts +2 -2
- package/dist/state/commands/moveShapesToPage/moveShapesToPage.d.ts +2 -2
- package/dist/state/commands/renamePage/renamePage.d.ts +2 -2
- package/dist/state/commands/reorderShapes/reorderShapes.d.ts +2 -2
- package/dist/state/commands/resetBounds/resetBounds.d.ts +2 -2
- package/dist/state/commands/rotateShapes/rotateShapes.d.ts +2 -2
- package/dist/state/commands/setShapesProps/setShapesProps.d.ts +2 -2
- package/dist/state/commands/shared/removeShapesFromPage.d.ts +1 -1
- package/dist/state/commands/stretchShapes/stretchShapes.d.ts +3 -3
- package/dist/state/commands/styleShapes/styleShapes.d.ts +2 -2
- package/dist/state/commands/toggleShapesDecoration/toggleShapesDecoration.d.ts +2 -2
- package/dist/state/commands/toggleShapesProp/toggleShapesProp.d.ts +2 -2
- package/dist/state/commands/translateShapes/translateShapes.d.ts +2 -2
- package/dist/state/commands/ungroupShapes/ungroupShapes.d.ts +3 -3
- package/dist/state/commands/updateShapes/updateShapes.d.ts +2 -2
- package/dist/state/data/filesystem.d.ts +1 -1
- package/dist/state/data/filesystem.d.ts.map +1 -1
- package/dist/state/data/migrate.d.ts +1 -1
- package/dist/state/data/migrate.d.ts.map +1 -1
- package/dist/state/sessions/ArrowSession/ArrowSession.d.ts +3 -3
- package/dist/state/sessions/BaseSession.d.ts +2 -2
- package/dist/state/sessions/BrushSession/BrushSession.d.ts +3 -3
- package/dist/state/sessions/DrawSession/DrawSession.d.ts +3 -3
- package/dist/state/sessions/EditSession/EditSession.d.ts +3 -3
- package/dist/state/sessions/EraseSession/EraseSession.d.ts +4 -4
- package/dist/state/sessions/GridSession/GridSession.d.ts +3 -3
- package/dist/state/sessions/HandleSession/HandleSession.d.ts +3 -3
- package/dist/state/sessions/RotateSession/RotateSession.d.ts +3 -3
- package/dist/state/sessions/TransformSession/TransformSession.d.ts +3 -3
- package/dist/state/sessions/TransformSingleSession/TransformSingleSession.d.ts +3 -3
- package/dist/state/sessions/TranslateLabelSession/TranslateLabelSession.d.ts +3 -3
- package/dist/state/sessions/TranslateSession/TranslateSession.d.ts +3 -3
- package/dist/state/sessions/index.d.ts +1 -1
- package/dist/state/shapes/ArrowUtil/ArrowUtil.d.ts +3 -3
- package/dist/state/shapes/ArrowUtil/ArrowUtil.d.ts.map +1 -1
- package/dist/state/shapes/ArrowUtil/arrowHelpers.d.ts +1 -1
- package/dist/state/shapes/ArrowUtil/components/CurvedArrow.tsx.d.ts +1 -1
- package/dist/state/shapes/ArrowUtil/components/StraightArrow.d.ts +1 -1
- package/dist/state/shapes/DrawUtil/DrawUtil.d.ts +3 -3
- package/dist/state/shapes/DrawUtil/DrawUtil.d.ts.map +1 -1
- package/dist/state/shapes/DrawUtil/drawHelpers.d.ts +1 -1
- package/dist/state/shapes/EllipseUtil/EllipseUtil.d.ts +3 -3
- package/dist/state/shapes/EllipseUtil/EllipseUtil.d.ts.map +1 -1
- package/dist/state/shapes/EllipseUtil/components/DashedEllipse.d.ts +1 -1
- package/dist/state/shapes/EllipseUtil/components/DrawEllipse.d.ts +1 -1
- package/dist/state/shapes/EllipseUtil/ellipseHelpers.d.ts +1 -1
- package/dist/state/shapes/GroupUtil/GroupUtil.d.ts +5 -5
- package/dist/state/shapes/GroupUtil/GroupUtil.d.ts.map +1 -1
- package/dist/state/shapes/ImageUtil/ImageUtil.d.ts +6 -6
- package/dist/state/shapes/ImageUtil/ImageUtil.d.ts.map +1 -1
- package/dist/state/shapes/PenUtil/PenUtil.d.ts +3 -3
- package/dist/state/shapes/PenUtil/PenUtil.d.ts.map +1 -1
- package/dist/state/shapes/PenUtil/penHelpers.d.ts +9 -6
- package/dist/state/shapes/PenUtil/penHelpers.d.ts.map +1 -1
- package/dist/state/shapes/ReactComponentUtil/ReactComponentUtil.d.ts +6 -6
- package/dist/state/shapes/ReactComponentUtil/ReactComponentUtil.d.ts.map +1 -1
- package/dist/state/shapes/RectangleUtil/RectangleUtil.d.ts +6 -6
- package/dist/state/shapes/RectangleUtil/RectangleUtil.d.ts.map +1 -1
- package/dist/state/shapes/RectangleUtil/components/DashedRectangle.d.ts +1 -1
- package/dist/state/shapes/RectangleUtil/components/DrawRectangle.d.ts +1 -1
- package/dist/state/shapes/RectangleUtil/rectangleHelpers.d.ts +1 -1
- package/dist/state/shapes/StickyUtil/StickyUtil.d.ts +3 -3
- package/dist/state/shapes/StickyUtil/StickyUtil.d.ts.map +1 -1
- package/dist/state/shapes/TVShapeUtil.d.ts +1 -1
- package/dist/state/shapes/TextUtil/TextUtil.d.ts +9 -9
- package/dist/state/shapes/TextUtil/TextUtil.d.ts.map +1 -1
- package/dist/state/shapes/TriangleUtil/TriangleUtil.d.ts +4 -4
- package/dist/state/shapes/TriangleUtil/TriangleUtil.d.ts.map +1 -1
- package/dist/state/shapes/TriangleUtil/components/DashedTriangle.d.ts +1 -1
- package/dist/state/shapes/TriangleUtil/components/DrawTriangle.d.ts +1 -1
- package/dist/state/shapes/TriangleUtil/triangleHelpers.d.ts +1 -1
- package/dist/state/shapes/VideoUtil/VideoUtil.d.ts +6 -6
- package/dist/state/shapes/VideoUtil/VideoUtil.d.ts.map +1 -1
- package/dist/state/shapes/index.d.ts +2 -2
- package/dist/state/shapes/shared/TextLabel.d.ts +1 -1
- package/dist/state/shapes/shared/TextLabel.d.ts.map +1 -1
- package/dist/state/shapes/shared/getTextAlign.d.ts +2 -2
- package/dist/state/shapes/shared/getTextSvgElement.d.ts +1 -1
- package/dist/state/shapes/shared/gradient-fill.d.ts +1 -1
- package/dist/state/shapes/shared/shape-styles.d.ts +1 -1
- package/dist/state/tools/ArrowTool/ArrowTool.d.ts +2 -2
- package/dist/state/tools/BaseTool.d.ts +2 -2
- package/dist/state/tools/DrawTool/DrawTool.d.ts +2 -2
- package/dist/state/tools/EllipseTool/EllipseTool.d.ts +2 -2
- package/dist/state/tools/EraseTool/EraseTool.d.ts +1 -1
- package/dist/state/tools/LineTool/LineTool.d.ts +2 -2
- package/dist/state/tools/PenEditTool.d.ts +3 -2
- package/dist/state/tools/PenEditTool.d.ts.map +1 -1
- package/dist/state/tools/PenTool/PenTool.d.ts +4 -3
- package/dist/state/tools/PenTool/PenTool.d.ts.map +1 -1
- package/dist/state/tools/RectangleTool/RectangleTool.d.ts +2 -2
- package/dist/state/tools/SelectTool/SelectTool.d.ts +56 -56
- package/dist/state/tools/StickyTool/StickyTool.d.ts +2 -2
- package/dist/state/tools/TextTool/TextTool.d.ts +2 -2
- package/dist/state/tools/TriangleTool/TriangleTool.d.ts +2 -2
- package/dist/state/tools/index.d.ts +1 -1
- package/dist/types.d.ts +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,86 +1,24 @@
|
|
|
1
|
-
|
|
1
|
+
# telva
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Embeddable React drawing editor package.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Install
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
[](LICENSE.md)
|
|
11
|
-
[](https://www.npmjs.com/package/@telva/telva)
|
|
12
|
-
[](https://www.npmjs.com/package/@telva/core)
|
|
13
|
-
|
|
14
|
-
</div>
|
|
15
|
-
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
## Why Telva?
|
|
19
|
-
|
|
20
|
-
Design tooling has been locked behind proprietary walls for too long. Figma is great — but it charges per seat, owns your data, and cannot be self-hosted or extended at a deep level. **Telva changes that.**
|
|
21
|
-
|
|
22
|
-
Telva is a **production-grade, open-source vector design canvas** that runs entirely in the browser as a React component. Drop it into your product, your internal tool, or your SaaS. Customize every shape, behavior, panel, and shortcut. Ship it as your own.
|
|
23
|
-
|
|
24
|
-
> Built and maintained by **[vmaspad](https://github.com/vmaspad)**.
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## What makes Telva different
|
|
29
|
-
|
|
30
|
-
| Feature | Telva | Figma |
|
|
31
|
-
| ----------------------------- | ------------------- | ---------------------- |
|
|
32
|
-
| Open source | ✅ MIT license | ❌ Proprietary |
|
|
33
|
-
| Self-hostable | ✅ | ❌ |
|
|
34
|
-
| Embeddable in React | ✅ Single component | ❌ |
|
|
35
|
-
| Custom React shapes on canvas | ✅ Native support | ❌ |
|
|
36
|
-
| Real-time multiplayer | ✅ Built-in | ✅ |
|
|
37
|
-
| Offline-first | ✅ | ❌ |
|
|
38
|
-
| Per-seat pricing | ✅ Free forever | ❌ $12–45/seat |
|
|
39
|
-
| Extend with code | ✅ Full API | ❌ Plugin sandbox only |
|
|
40
|
-
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
## The killer feature: React Components as Canvas Shapes
|
|
44
|
-
|
|
45
|
-
Telva is the only open-source design tool that lets you place **live, interactive React components** directly onto the canvas as first-class shapes.
|
|
46
|
-
|
|
47
|
-
```tsx
|
|
48
|
-
import { Telva } from '@telva/telva'
|
|
49
|
-
import { MyChart, MyDataTable, MyForm } from './components'
|
|
50
|
-
|
|
51
|
-
// Register your React components as canvas shapes
|
|
52
|
-
const registry = {
|
|
53
|
-
chart: MyChart,
|
|
54
|
-
table: MyDataTable,
|
|
55
|
-
form: MyForm,
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export default function App() {
|
|
59
|
-
return (
|
|
60
|
-
<div style={{ width: '100vw', height: '100vh' }}>
|
|
61
|
-
<Telva reactComponents={registry} />
|
|
62
|
-
</div>
|
|
63
|
-
)
|
|
64
|
-
}
|
|
7
|
+
```bash
|
|
8
|
+
npm i telva
|
|
65
9
|
```
|
|
66
10
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
---
|
|
11
|
+
## Peer dependencies
|
|
70
12
|
|
|
71
|
-
|
|
13
|
+
- `react >= 16.8`
|
|
14
|
+
- `react-dom >= 16.8`
|
|
72
15
|
|
|
73
|
-
|
|
74
|
-
npm install @telva/telva
|
|
75
|
-
# or
|
|
76
|
-
yarn add @telva/telva
|
|
77
|
-
```
|
|
16
|
+
## Basic usage
|
|
78
17
|
|
|
79
18
|
```tsx
|
|
80
|
-
import { Telva } from '
|
|
81
|
-
import '@telva/telva/telva.css'
|
|
19
|
+
import { Telva } from 'telva'
|
|
82
20
|
|
|
83
|
-
export
|
|
21
|
+
export function App() {
|
|
84
22
|
return (
|
|
85
23
|
<div style={{ width: '100vw', height: '100vh' }}>
|
|
86
24
|
<Telva />
|
|
@@ -89,210 +27,27 @@ export default function App() {
|
|
|
89
27
|
}
|
|
90
28
|
```
|
|
91
29
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
---
|
|
95
|
-
|
|
96
|
-
## Full Feature Set
|
|
97
|
-
|
|
98
|
-
### Drawing & Shapes
|
|
99
|
-
|
|
100
|
-
Telva ships with a complete set of professional vector shapes out of the box:
|
|
101
|
-
|
|
102
|
-
- **Rectangle** — with fill, stroke, dash styles, border radius, and opacity
|
|
103
|
-
- **Ellipse** — perfect circles and ovals with the same full style set
|
|
104
|
-
- **Triangle** — directional shapes for diagrams and flows
|
|
105
|
-
- **Arrow** — straight and curved arrows with decorations (heads, dots, bars) on either end; snap-to-shape binding
|
|
106
|
-
- **Draw** — freehand pencil tool with perfect-freehand smoothing
|
|
107
|
-
- **Text** — rich inline text with font family, size, weight, and alignment options
|
|
108
|
-
- **Sticky Note** — color-coded sticky notes with full text editing
|
|
109
|
-
- **Image** — drag-and-drop image placement and resizing
|
|
110
|
-
- **Video** — embedded video playback as a canvas shape
|
|
111
|
-
- **Group** — group any combination of shapes and operate on them as one
|
|
112
|
-
- **React Component** — any React component rendered live as a resizable canvas shape
|
|
113
|
-
|
|
114
|
-
### Editing & Interaction
|
|
115
|
-
|
|
116
|
-
- Infinite canvas with smooth pan and zoom
|
|
117
|
-
- Select tool with click, drag-box, and deep-click-into-group
|
|
118
|
-
- Multi-select, group select, select all
|
|
119
|
-
- Move, rotate, resize, flip, align, distribute, stretch
|
|
120
|
-
- Snap-to-grid and snap-to-shape guidelines
|
|
121
|
-
- Erase tool
|
|
122
|
-
- Undo / redo with full command history
|
|
123
|
-
- Copy, paste, duplicate
|
|
124
|
-
- Lock shapes to prevent accidental edits
|
|
125
|
-
- Keyboard shortcuts for every action
|
|
126
|
-
|
|
127
|
-
### Styles & Theming
|
|
128
|
-
|
|
129
|
-
- Per-shape styles: color, fill, stroke, dash, opacity, font, size, alignment
|
|
130
|
-
- Dark mode and light mode with a single prop
|
|
131
|
-
- Fully themeable UI via CSS custom properties and Stitches
|
|
132
|
-
- Custom color palettes per project
|
|
133
|
-
|
|
134
|
-
### Layers & Organization
|
|
135
|
-
|
|
136
|
-
- Layers panel with full reordering, visibility toggle, and lock
|
|
137
|
-
- Page management — create, rename, duplicate, and reorder pages in a document
|
|
138
|
-
- Focus mode to minimize the UI while working
|
|
139
|
-
|
|
140
|
-
### Export
|
|
141
|
-
|
|
142
|
-
- Export to PNG with configurable DPI
|
|
143
|
-
- Export to SVG (vector-perfect)
|
|
144
|
-
- Export any selection, current page, or entire document
|
|
145
|
-
- Transparent or white background
|
|
146
|
-
- Programmatic export via API
|
|
147
|
-
|
|
148
|
-
### Real-time Collaboration
|
|
149
|
-
|
|
150
|
-
Built-in multiplayer support with live presence:
|
|
30
|
+
## Next.js client-only usage
|
|
151
31
|
|
|
152
32
|
```tsx
|
|
153
|
-
import
|
|
33
|
+
import dynamic from 'next/dynamic'
|
|
154
34
|
|
|
155
|
-
|
|
156
|
-
```
|
|
35
|
+
;('use client')
|
|
157
36
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
- Read-only viewer mode for stakeholders
|
|
162
|
-
- Compatible with Liveblocks, Yjs, or any CRDT backend
|
|
37
|
+
const Telva = dynamic(() => import('telva').then((m) => m.Telva), {
|
|
38
|
+
ssr: false,
|
|
39
|
+
})
|
|
163
40
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
- Load and save `.tlvr` files to disk
|
|
168
|
-
- Full document JSON API for custom storage (database, S3, anywhere)
|
|
169
|
-
- Load documents programmatically at runtime
|
|
170
|
-
|
|
171
|
-
### Programmatic API
|
|
172
|
-
|
|
173
|
-
The `TelvaApp` gives you full imperative control over the canvas at runtime:
|
|
174
|
-
|
|
175
|
-
```tsx
|
|
176
|
-
const app = useTelvaApp()
|
|
177
|
-
|
|
178
|
-
// Create shapes
|
|
179
|
-
app.createShapes([{ type: 'rectangle', ... }])
|
|
180
|
-
|
|
181
|
-
// Select shapes
|
|
182
|
-
app.select('shape-id-1', 'shape-id-2')
|
|
183
|
-
|
|
184
|
-
// Move the camera
|
|
185
|
-
app.zoomToFit()
|
|
186
|
-
app.zoomTo(1.5)
|
|
187
|
-
|
|
188
|
-
// Export
|
|
189
|
-
const svg = await app.getSvg(['shape-id-1'])
|
|
190
|
-
const png = await app.exportImage(...)
|
|
191
|
-
|
|
192
|
-
// Undo/redo
|
|
193
|
-
app.undo()
|
|
194
|
-
app.redo()
|
|
195
|
-
|
|
196
|
-
// React to everything
|
|
197
|
-
app.on('change', (state) => syncToServer(state))
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
### Embedding Modes
|
|
201
|
-
|
|
202
|
-
Telva is designed for embedding. Every aspect of the UI is optional:
|
|
203
|
-
|
|
204
|
-
```tsx
|
|
205
|
-
<Telva
|
|
206
|
-
id="my-editor" // persist state under this key
|
|
207
|
-
darkMode={true} // dark or light theme
|
|
208
|
-
showMenu={false} // hide the file menu
|
|
209
|
-
showPages={false} // single-page mode
|
|
210
|
-
showTools={false} // hide the toolbar
|
|
211
|
-
showUI={false} // canvas-only, no UI at all
|
|
212
|
-
readOnly={true} // viewer mode
|
|
213
|
-
autofocus={true} // grab focus on mount
|
|
214
|
-
document={myDocument} // controlled document prop
|
|
215
|
-
onMount={(app) => {}} // access the app instance
|
|
216
|
-
onChange={(state, reason) => {}} // listen to every change
|
|
217
|
-
/>
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
---
|
|
221
|
-
|
|
222
|
-
## Packages
|
|
223
|
-
|
|
224
|
-
This is a Yarn/Turborepo monorepo containing:
|
|
225
|
-
|
|
226
|
-
| Package | Description |
|
|
227
|
-
| ---------------------------------------- | -------------------------------------------------- |
|
|
228
|
-
| [`@telva/telva`](packages/telva) | The full editor — a turnkey React component |
|
|
229
|
-
| [`@telva/core`](packages/core) | The canvas renderer — build your own editor on top |
|
|
230
|
-
| [`@telva/vec`](packages/vec) | 2D vector math utilities |
|
|
231
|
-
| [`@telva/intersect`](packages/intersect) | Geometry intersection utilities |
|
|
232
|
-
| [`@telva/curve`](packages/curve) | Bezier curve utilities |
|
|
233
|
-
|
|
234
|
-
### Build your own editor with `@telva/core`
|
|
235
|
-
|
|
236
|
-
`@telva/core` is the low-level canvas renderer that powers `@telva/telva`. Use it to build a completely custom canvas-based experience — flowcharts, whiteboards, diagram editors, design systems, game maps — with your own shapes, tools, and UI.
|
|
237
|
-
|
|
238
|
-
```tsx
|
|
239
|
-
import { Renderer } from '@telva/core'
|
|
240
|
-
|
|
241
|
-
;<Renderer
|
|
242
|
-
page={page}
|
|
243
|
-
pageState={pageState}
|
|
244
|
-
shapeUtils={myCustomShapeUtils}
|
|
245
|
-
onPointShape={handlePointShape}
|
|
246
|
-
onDragShape={handleDragShape}
|
|
247
|
-
// ... full event API
|
|
248
|
-
/>
|
|
41
|
+
export default function Page() {
|
|
42
|
+
return <Telva />
|
|
43
|
+
}
|
|
249
44
|
```
|
|
250
45
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
## Examples
|
|
254
|
-
|
|
255
|
-
| Example | Description |
|
|
256
|
-
| ------------------------------------------------------------------ | ---------------------------------------- |
|
|
257
|
-
| [`examples/telva-example`](examples/telva-example) | Full editor with all features enabled |
|
|
258
|
-
| [`examples/core-example`](examples/core-example) | Minimal custom canvas with `@telva/core` |
|
|
259
|
-
| [`examples/core-example-advanced`](examples/core-example-advanced) | Advanced custom shapes and interactions |
|
|
260
|
-
|
|
261
|
-
Run any example locally:
|
|
46
|
+
## Workspace scripts
|
|
262
47
|
|
|
263
48
|
```bash
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
yarn
|
|
267
|
-
yarn
|
|
268
|
-
# → http://localhost:5420
|
|
49
|
+
yarn dev
|
|
50
|
+
yarn build
|
|
51
|
+
yarn test
|
|
52
|
+
yarn lint
|
|
269
53
|
```
|
|
270
|
-
|
|
271
|
-
---
|
|
272
|
-
|
|
273
|
-
## Roadmap highlights
|
|
274
|
-
|
|
275
|
-
- [ ] Vector pen tool
|
|
276
|
-
- [ ] Component variants and slots
|
|
277
|
-
- [ ] Plugin system
|
|
278
|
-
- [ ] AI-assisted layout
|
|
279
|
-
- [ ] Export to Tailwind / CSS
|
|
280
|
-
- [ ] Design tokens integration
|
|
281
|
-
|
|
282
|
-
---
|
|
283
|
-
|
|
284
|
-
## Contributing
|
|
285
|
-
|
|
286
|
-
Contributions are welcome and encouraged. See the [contributing guide](CONTRIBUTING.md) for how to get started — whether that's fixing bugs, adding shapes, improving docs, or translating the UI.
|
|
287
|
-
|
|
288
|
-
## Support
|
|
289
|
-
|
|
290
|
-
Found a bug or need help? [Open an issue](https://github.com/vmaspad/telva-v1/issues/new).
|
|
291
|
-
|
|
292
|
-
## License
|
|
293
|
-
|
|
294
|
-
MIT — free to use, modify, and distribute, including in commercial products.
|
|
295
|
-
|
|
296
|
-
## Author & Maintainer
|
|
297
|
-
|
|
298
|
-
**vmaspad** — [github.com/vmaspad](https://github.com/vmaspad)
|
package/dist/Telva.d.ts
CHANGED
|
@@ -5,9 +5,9 @@ import '@fontsource/recursive';
|
|
|
5
5
|
import '@fontsource/source-code-pro';
|
|
6
6
|
import '@fontsource/source-sans-pro';
|
|
7
7
|
import { CursorComponent } from 'telva-core';
|
|
8
|
-
import { TVCallbacks } from '
|
|
9
|
-
import { ReactComponentEntry } from '
|
|
10
|
-
import { TVDocument } from '
|
|
8
|
+
import { TVCallbacks } from '~state';
|
|
9
|
+
import { ReactComponentEntry } from '~state/reactRegistry';
|
|
10
|
+
import { TVDocument } from '~types';
|
|
11
11
|
export interface TelvaProps extends TVCallbacks {
|
|
12
12
|
/**
|
|
13
13
|
* (optional) If provided, the component will load / persist state under this key.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CenterToolbar.d.ts","sourceRoot":"","sources":["../../../src/components/CenterToolbar/CenterToolbar.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CenterToolbar.d.ts","sourceRoot":"","sources":["../../../src/components/CenterToolbar/CenterToolbar.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAY9B,eAAO,MAAM,aAAa,oCAsIxB,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const DMRadioItem: import("@stitches/react/types/styled-component").StyledComponent<import("react").ForwardRefExoticComponent<import("@radix-ui/react-dropdown-menu").DropdownMenuRadioItemProps & import("react").RefAttributes<HTMLDivElement>>, {
|
|
2
|
-
isActive?: boolean | "
|
|
2
|
+
isActive?: boolean | "true" | "false" | undefined;
|
|
3
3
|
bp?: "small" | "mobile" | undefined;
|
|
4
4
|
}, {
|
|
5
5
|
micro: "(max-width: 370px)";
|
|
@@ -17,7 +17,7 @@ export declare const StyledRowButton: import("@stitches/react/types/styled-compo
|
|
|
17
17
|
variant?: "wide" | "styleMenu" | undefined;
|
|
18
18
|
size?: "icon" | undefined;
|
|
19
19
|
isWarning?: boolean | "true" | undefined;
|
|
20
|
-
isActive?: boolean | "
|
|
20
|
+
isActive?: boolean | "true" | "false" | undefined;
|
|
21
21
|
}, {
|
|
22
22
|
micro: "(max-width: 370px)";
|
|
23
23
|
sm: "(min-width: 640px)";
|
|
@@ -2,5 +2,5 @@ import * as React from 'react';
|
|
|
2
2
|
export interface TextFieldProps extends React.HTMLProps<HTMLInputElement> {
|
|
3
3
|
icon?: React.ReactElement;
|
|
4
4
|
}
|
|
5
|
-
export declare const TextField: React.ForwardRefExoticComponent<Pick<TextFieldProps, "cite" | "data" | "
|
|
5
|
+
export declare const TextField: React.ForwardRefExoticComponent<Pick<TextFieldProps, "open" | "label" | "start" | "type" | "size" | "style" | "id" | "name" | "children" | "width" | "height" | "cite" | "data" | "dir" | "form" | "slot" | "span" | "summary" | "title" | "pattern" | "color" | "value" | "target" | "selected" | "key" | "content" | "translate" | "hidden" | "default" | "wrap" | "icon" | "sizes" | "onBlur" | "onChange" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "className" | "contentEditable" | "contextMenu" | "draggable" | "lang" | "placeholder" | "spellCheck" | "tabIndex" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlurCapture" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "list" | "as" | "step" | "autoComplete" | "autoFocus" | "cols" | "disabled" | "maxLength" | "minLength" | "readOnly" | "required" | "rows" | "shape" | "crossOrigin" | "href" | "max" | "media" | "method" | "min" | "src" | "multiple" | "capture" | "kind" | "scrolling" | "accept" | "acceptCharset" | "action" | "allowFullScreen" | "allowTransparency" | "alt" | "async" | "autoPlay" | "cellPadding" | "cellSpacing" | "charSet" | "challenge" | "checked" | "classID" | "colSpan" | "controls" | "coords" | "dateTime" | "defer" | "download" | "encType" | "formAction" | "formEncType" | "formMethod" | "formNoValidate" | "formTarget" | "frameBorder" | "headers" | "high" | "hrefLang" | "htmlFor" | "httpEquiv" | "integrity" | "keyParams" | "keyType" | "loop" | "low" | "manifest" | "marginHeight" | "marginWidth" | "mediaGroup" | "muted" | "nonce" | "noValidate" | "optimum" | "playsInline" | "poster" | "preload" | "rel" | "reversed" | "rowSpan" | "sandbox" | "scope" | "scoped" | "seamless" | "srcDoc" | "srcLang" | "srcSet" | "useMap" | "wmode"> & React.RefAttributes<HTMLInputElement>>;
|
|
6
6
|
//# sourceMappingURL=TextField.d.ts.map
|
|
@@ -236,8 +236,8 @@ export declare const StyledToolButtonInner: import("@stitches/react/types/styled
|
|
|
236
236
|
};
|
|
237
237
|
}>>;
|
|
238
238
|
export declare const StyledToolButton: import("@stitches/react/types/styled-component").StyledComponent<"button", {
|
|
239
|
-
variant?: "
|
|
240
|
-
isActive?: boolean | "
|
|
239
|
+
variant?: "text" | "circle" | "icon" | "primary" | undefined;
|
|
240
|
+
isActive?: boolean | "true" | "false" | undefined;
|
|
241
241
|
bp?: "small" | "mobile" | undefined;
|
|
242
242
|
}, {
|
|
243
243
|
micro: "(max-width: 370px)";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PropertiesPanel.d.ts","sourceRoot":"","sources":["../../../src/components/RightPanel/PropertiesPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAsD9B,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"PropertiesPanel.d.ts","sourceRoot":"","sources":["../../../src/components/RightPanel/PropertiesPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAsD9B,eAAO,MAAM,eAAe,oCAoG1B,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PrimaryTools.d.ts","sourceRoot":"","sources":["../../../src/components/ToolsPanel/PrimaryTools.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAe9B,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"PrimaryTools.d.ts","sourceRoot":"","sources":["../../../src/components/ToolsPanel/PrimaryTools.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAe9B,eAAO,MAAM,YAAY,oCAqIvB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../../../src/components/TopPanel/Menu/Menu.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAW9B,UAAU,SAAS;IACjB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAUD,eAAO,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../../../src/components/TopPanel/Menu/Menu.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAW9B,UAAU,SAAS;IACjB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAUD,eAAO,MAAM,IAAI,uCAgTf,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
export declare function PageMenu(): JSX.Element;
|
|
3
|
-
export declare const PageButton: import("@stitches/react/types/styled-component").StyledComponent<React.ForwardRefExoticComponent<import("
|
|
3
|
+
export declare const PageButton: import("@stitches/react/types/styled-component").StyledComponent<React.ForwardRefExoticComponent<import("~components/Primitives/RowButton").RowButtonProps & React.RefAttributes<HTMLButtonElement>>, {}, {
|
|
4
4
|
micro: "(max-width: 370px)";
|
|
5
5
|
sm: "(min-width: 640px)";
|
|
6
6
|
md: "(min-width: 768px)";
|
package/dist/constants.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { TelvaApp } from '
|
|
1
|
+
import type { TelvaApp } from '~state';
|
|
2
2
|
import { DialogState } from './useDialog';
|
|
3
3
|
export declare function useFileSystem(): {
|
|
4
4
|
onNewProject: (app: TelvaApp, openDialog: (dialogState: DialogState, onYes: () => Promise<void>, onNo: () => Promise<void>, onCancel: () => Promise<void>) => void) => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useKeyboardShortcuts.d.ts","sourceRoot":"","sources":["../../src/hooks/useKeyboardShortcuts.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"useKeyboardShortcuts.d.ts","sourceRoot":"","sources":["../../src/hooks/useKeyboardShortcuts.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,QAsuBxE"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import type { TelvaApp } from '
|
|
2
|
+
import type { TelvaApp } from '~state';
|
|
3
3
|
export declare const TelvaContext: React.Context<TelvaApp>;
|
|
4
4
|
export declare function useTelvaApp(): TelvaApp;
|
|
5
5
|
export declare const ContainerContext: React.Context<React.RefObject<HTMLDivElement>>;
|
package/dist/hooks/useTheme.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { TVLanguage } from '
|
|
2
|
-
export declare function useTranslation(locale?: TVLanguage): import("
|
|
1
|
+
import { TVLanguage } from '~translations';
|
|
2
|
+
export declare function useTranslation(locale?: TVLanguage): import("~translations").TVTranslation;
|
|
3
3
|
//# sourceMappingURL=useTranslation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTranslation.d.ts","sourceRoot":"","sources":["../../src/hooks/useTranslation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAkB,MAAM,eAAe,CAAA;AAE1D,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"useTranslation.d.ts","sourceRoot":"","sources":["../../src/hooks/useTranslation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAkB,MAAM,eAAe,CAAA;AAE1D,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,UAAU,yCAOjD"}
|