js-draw 1.19.1 → 1.20.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. package/README.md +52 -1
  2. package/dist/Editor.css +49 -7
  3. package/dist/bundle.js +2 -2
  4. package/dist/bundledStyles.js +1 -1
  5. package/dist/cjs/SVGLoader/index.js +3 -1
  6. package/dist/cjs/image/EditorImage.d.ts +2 -1
  7. package/dist/cjs/image/EditorImage.js +101 -5
  8. package/dist/cjs/rendering/renderers/CanvasRenderer.js +4 -4
  9. package/dist/cjs/toolbar/localization.d.ts +1 -0
  10. package/dist/cjs/toolbar/localization.js +1 -0
  11. package/dist/cjs/toolbar/widgets/InsertImageWidget/ImageWrapper.d.ts +1 -0
  12. package/dist/cjs/toolbar/widgets/InsertImageWidget/ImageWrapper.js +7 -0
  13. package/dist/cjs/toolbar/widgets/InsertImageWidget/index.js +11 -3
  14. package/dist/cjs/toolbar/widgets/components/makeFileInput.js +12 -1
  15. package/dist/cjs/toolbar/widgets/components/makeSnappedList.js +69 -4
  16. package/dist/cjs/tools/Eraser.js +22 -5
  17. package/dist/cjs/tools/PanZoom.d.ts +54 -0
  18. package/dist/cjs/tools/PanZoom.js +54 -2
  19. package/dist/cjs/util/ReactiveValue.d.ts +4 -0
  20. package/dist/cjs/util/ReactiveValue.js +5 -0
  21. package/dist/cjs/version.js +1 -1
  22. package/dist/mjs/SVGLoader/index.mjs +3 -1
  23. package/dist/mjs/image/EditorImage.d.ts +2 -1
  24. package/dist/mjs/image/EditorImage.mjs +101 -5
  25. package/dist/mjs/rendering/renderers/CanvasRenderer.mjs +4 -4
  26. package/dist/mjs/toolbar/localization.d.ts +1 -0
  27. package/dist/mjs/toolbar/localization.mjs +1 -0
  28. package/dist/mjs/toolbar/widgets/InsertImageWidget/ImageWrapper.d.ts +1 -0
  29. package/dist/mjs/toolbar/widgets/InsertImageWidget/ImageWrapper.mjs +7 -0
  30. package/dist/mjs/toolbar/widgets/InsertImageWidget/index.mjs +11 -3
  31. package/dist/mjs/toolbar/widgets/components/makeFileInput.mjs +12 -1
  32. package/dist/mjs/toolbar/widgets/components/makeSnappedList.mjs +69 -4
  33. package/dist/mjs/tools/Eraser.mjs +22 -5
  34. package/dist/mjs/tools/PanZoom.d.ts +54 -0
  35. package/dist/mjs/tools/PanZoom.mjs +54 -2
  36. package/dist/mjs/util/ReactiveValue.d.ts +4 -0
  37. package/dist/mjs/util/ReactiveValue.mjs +5 -0
  38. package/dist/mjs/version.mjs +1 -1
  39. package/docs/img/readme-images/unsupported-elements--in-editor.png +0 -0
  40. package/package.json +2 -2
  41. package/src/toolbar/EdgeToolbar.scss +8 -3
  42. package/src/toolbar/widgets/components/makeFileInput.scss +3 -2
  43. package/src/toolbar/widgets/components/makeSnappedList.scss +58 -12
package/README.md CHANGED
@@ -15,6 +15,55 @@
15
15
 
16
16
  For example usage, see [one of the examples](https://github.com/personalizedrefrigerator/js-draw/blob/main/docs/examples.md) or read [the documentation](https://personalizedrefrigerator.github.io/js-draw/typedoc/).
17
17
 
18
+ # Features
19
+
20
+ ## Very large zoom range
21
+
22
+ A core feature of `js-draw` is its [large zoom range](https://personalizedrefrigerator.github.io/js-draw/typedoc/interfaces/js_draw.EditorSettings.html#maxZoom) (from roughly 10⁻¹⁰x to 10¹⁰x).
23
+
24
+ <details open><summary><strong>Demo</strong></summary>
25
+
26
+ <video src="https://github.com/personalizedrefrigerator/js-draw/assets/46334387/f1c4afea-d7c8-4c36-835b-e01f2a646424" alt="Video: Shows zooming out further and further" controls></video>
27
+
28
+ </details>
29
+
30
+ Applications using `js-draw` can adjust this zoom range with custom [EditorSettings](https://personalizedrefrigerator.github.io/js-draw/typedoc/interfaces/js_draw.EditorSettings.html).
31
+
32
+ ## Touchscreen and stylus support
33
+
34
+ `js-draw` supports touchscreen pinch zoom and rotate gestures. To simplify editing, screen rotation snaps to multiples of 90 degrees.
35
+
36
+ <details><summary><strong>Demo</strong></summary>
37
+
38
+ <video src="https://github.com/personalizedrefrigerator/js-draw/assets/46334387/1f4ebeb1-9d2f-4884-9410-9fb1d5e455ee" alt="Video: Shows canvas being rotated" controls></video>
39
+
40
+ </details>
41
+
42
+ It's also possible to disable touch drawing. This can be useful when drawing with a stylus and can be done with either [PanZoomTool.setMode](https://personalizedrefrigerator.github.io/js-draw/typedoc/classes/js_draw.PanZoomTool.html#setMode) or, by a user, with the "hand" tool menu:
43
+
44
+ <img alt="screenshot: Hand tool menu at the bottom of the screen includes 'lock rotation' and 'touchscreen panning'. 'Touchscreen panning' is highlighted." src="https://github.com/personalizedrefrigerator/js-draw/assets/46334387/d96e2df5-6132-4122-954d-d25402754bc2" width="400"/>
45
+
46
+ ## User-configurable tools
47
+
48
+ With the default toolbar, users can change the pen style, color, and more:
49
+
50
+ <img alt="screenshot: Pen configuration menu includes pen size, color, type, stabilization, autocorrect,..." src="https://github.com/personalizedrefrigerator/js-draw/assets/46334387/476ad0e4-1f95-43bf-925d-549292d141e3" width="400"/>
51
+
52
+ It's possible for applications using `js-draw` to [add custom pen types](https://personalizedrefrigerator.github.io/js-draw/typedoc/modules/Additional_Documentation.CustomizingTools__.html) that can also be customized in this way. It's also possible to [save the toolbar state](https://github.com/personalizedrefrigerator/js-draw/blob/main/docs/examples/example-save-restore-toolbar-state/example.ts) and restore it after reloading the app.
53
+
54
+ ## More features
55
+
56
+ `js-draw` also supports:
57
+
58
+ - <details><summary>Partial stroke erasing</summary>
59
+
60
+ <video src="https://github.com/personalizedrefrigerator/js-draw/assets/46334387/c8c2b8d5-5537-4df8-a8b5-899c2d7ea5ce"></video>
61
+
62
+ </details>
63
+ - [Collaborative editing](https://github.com/personalizedrefrigerator/js-draw/tree/main/docs/examples/example-collaborative)
64
+ - Saving to and loading from a subset of SVG
65
+
66
+
18
67
  # API
19
68
 
20
69
  ## Creating an `Editor`
@@ -123,7 +172,7 @@ For example, although `js-draw` doesn't support `<circle/>` elements,
123
172
  ```
124
173
  renders as
125
174
 
126
- ![screenshot of the image editor, displaying a green checkmark. The circle is invisible](docs/img/readme-images/unsupported-elements--in-editor.png)
175
+ <img alt="screenshot of the image editor, displaying a green checkmark. The circle is invisible" src="docs/img/readme-images/unsupported-elements--in-editor.png" width="600"/>
127
176
 
128
177
  but exports to
129
178
  ```xml
@@ -329,6 +378,8 @@ body .imageEditorContainer {
329
378
  ```
330
379
  disables the dark theme and creates a theme that primarily uses yellow/green colors.
331
380
 
381
+ See also [adjustEditorThemeForContrast](https://personalizedrefrigerator.github.io/js-draw/typedoc/functions/js_draw.adjustEditorThemeForContrast.html).
382
+
332
383
  # Examples and resources
333
384
 
334
385
  - [Examples](https://github.com/personalizedrefrigerator/js-draw/blob/main/docs/examples.md)
package/dist/Editor.css CHANGED
@@ -232,8 +232,9 @@
232
232
  in srgb, var(--foreground-color-1), transparent
233
233
  );
234
234
  }
235
- .toolbar-element .toolbar--file-input-container > label > .cancel-button {
236
- display: block;
235
+ .toolbar-element .toolbar--file-input-container > label .cancel-button {
236
+ padding-left: 3px;
237
+ padding-right: 3px;
237
238
  }
238
239
  .toolbar-element .toolbar--file-input-container > label > .toolbar--file-input-description {
239
240
  background-color: var(--background-color-3);
@@ -318,13 +319,21 @@
318
319
  }
319
320
 
320
321
  :root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list {
321
- overflow-y: auto;
322
- scroll-snap-type: y mandatory;
323
322
  height: min(200px, 50vh);
323
+ position: relative;
324
+ display: flex;
325
+ align-items: center;
326
+ }
327
+ :root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list > .scroller {
324
328
  display: flex;
325
329
  flex-direction: column;
330
+ overflow-y: auto;
331
+ scroll-snap-type: y mandatory;
332
+ height: 100%;
333
+ width: 100%;
334
+ flex-grow: 1;
326
335
  }
327
- :root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list > .item {
336
+ :root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list > .scroller > .item {
328
337
  height: 100%;
329
338
  width: 100%;
330
339
  flex-shrink: 0;
@@ -338,6 +347,34 @@
338
347
  :root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.-empty {
339
348
  display: none;
340
349
  }
350
+ :root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list > .page-markers {
351
+ overflow: hidden;
352
+ display: flex;
353
+ flex-direction: column;
354
+ align-items: center;
355
+ max-height: 100%;
356
+ min-height: 0;
357
+ }
358
+ :root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list > .page-markers.-one-element {
359
+ visibility: hidden;
360
+ }
361
+ :root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list > .page-markers > .marker {
362
+ padding: 2px;
363
+ opacity: 0.1;
364
+ cursor: pointer;
365
+ left: 0;
366
+ transition: left 0.2s ease;
367
+ }
368
+ :root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list > .page-markers > .marker > .content {
369
+ background-color: var(--foreground-color-1);
370
+ border-radius: 2px;
371
+ padding: 2px;
372
+ }
373
+ :root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list > .page-markers > .marker.-active {
374
+ position: relative;
375
+ left: 2px;
376
+ opacity: 0.2;
377
+ }
341
378
 
342
379
  /* The *main* root toolbar element */
343
380
  .toolbar-root {
@@ -913,14 +950,19 @@
913
950
  box-shadow: none;
914
951
  border: none;
915
952
  padding: 10px;
916
- color: var(--foreground-color-1);
917
953
  transition: 0.2s ease box-shadow;
918
954
  font-weight: bold;
919
955
  color: var(--primary-action-foreground-color);
920
956
  }
921
- .toolbar-edgemenu-container button:hover {
957
+ .toolbar-edgemenu-container button:not(:disabled):hover {
922
958
  box-shadow: 0 1px 2px var(--shadow-color);
923
959
  }
960
+ .toolbar-edgemenu-container button:disabled {
961
+ opacity: 0.5;
962
+ font-weight: unset;
963
+ cursor: unset;
964
+ color: var(--foreground-color-1);
965
+ }
924
966
  .toolbar-edgemenu-container .toolbar-grid-selector .choice-button {
925
967
  --button-label-hover-offset-y: var(--button-size);
926
968
  }