@myoc/common 0.19.518 → 0.19.520

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 (66) hide show
  1. package/dist/dev/index.js +33 -65
  2. package/dist/dev/index.js.map +3 -3
  3. package/dist/prod/index.js +3 -3
  4. package/dist/types/common/src/colors.d.ts +1 -1
  5. package/dist/types/common/src/constants.d.ts +8 -5
  6. package/dist/types/common/src/utils.d.ts +0 -42
  7. package/dist/types/element/src/bounds.d.ts +18 -1
  8. package/dist/types/element/src/comparisons.d.ts +1 -0
  9. package/dist/types/element/src/image.d.ts +5 -0
  10. package/dist/types/element/src/newElement.d.ts +2 -0
  11. package/dist/types/element/src/types.d.ts +8 -0
  12. package/dist/types/excalidraw/actions/actionBoundText.d.ts +6 -2
  13. package/dist/types/excalidraw/actions/actionCanvas.d.ts +33 -11
  14. package/dist/types/excalidraw/actions/actionClipboard.d.ts +6 -2
  15. package/dist/types/excalidraw/actions/actionCropEditor.d.ts +3 -1
  16. package/dist/types/excalidraw/actions/actionDeleteSelected.d.ts +9 -3
  17. package/dist/types/excalidraw/actions/actionDeselect.d.ts +3 -1
  18. package/dist/types/excalidraw/actions/actionElementLink.d.ts +3 -1
  19. package/dist/types/excalidraw/actions/actionElementLock.d.ts +6 -2
  20. package/dist/types/excalidraw/actions/actionEmbeddable.d.ts +3 -1
  21. package/dist/types/excalidraw/actions/actionExport.d.ts +6 -2
  22. package/dist/types/excalidraw/actions/actionFrame.d.ts +14 -4
  23. package/dist/types/excalidraw/actions/actionGroup.d.ts +6 -2
  24. package/dist/types/excalidraw/actions/actionLinearEditor.d.ts +5 -1
  25. package/dist/types/excalidraw/actions/actionLink.d.ts +3 -1
  26. package/dist/types/excalidraw/actions/actionMenu.d.ts +3 -1
  27. package/dist/types/excalidraw/actions/actionProperties.d.ts +18 -5
  28. package/dist/types/excalidraw/actions/actionSelectAll.d.ts +3 -1
  29. package/dist/types/excalidraw/actions/actionStyles.d.ts +3 -1
  30. package/dist/types/excalidraw/actions/actionToggleArrowBinding.d.ts +3 -1
  31. package/dist/types/excalidraw/actions/actionToggleGridMode.d.ts +3 -1
  32. package/dist/types/excalidraw/actions/actionToggleMidpointSnapping.d.ts +3 -1
  33. package/dist/types/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +3 -1
  34. package/dist/types/excalidraw/actions/actionToggleSearchMenu.d.ts +3 -1
  35. package/dist/types/excalidraw/actions/actionToggleStats.d.ts +3 -1
  36. package/dist/types/excalidraw/actions/actionToggleViewMode.d.ts +5 -3
  37. package/dist/types/excalidraw/actions/actionToggleZenMode.d.ts +3 -1
  38. package/dist/types/excalidraw/actions/index.d.ts +1 -1
  39. package/dist/types/excalidraw/actions/types.d.ts +1 -1
  40. package/dist/types/excalidraw/appState.d.ts +2 -1
  41. package/dist/types/excalidraw/components/App.d.ts +13 -28
  42. package/dist/types/excalidraw/components/ColorPicker/colorPickerUtils.d.ts +1 -1
  43. package/dist/types/excalidraw/components/ConvertElementTypePopup.d.ts +1 -1
  44. package/dist/types/excalidraw/components/EyeDropper.d.ts +1 -1
  45. package/dist/types/excalidraw/components/OverwriteConfirm/OverwriteConfirmState.d.ts +1 -1
  46. package/dist/types/excalidraw/components/SearchMenu.d.ts +1 -1
  47. package/dist/types/excalidraw/components/Sidebar/Sidebar.d.ts +1 -1
  48. package/dist/types/excalidraw/components/canvases/StaticCanvas.d.ts +2 -1
  49. package/dist/types/excalidraw/components/icons.d.ts +2 -0
  50. package/dist/types/excalidraw/components/main-menu/DefaultItems.d.ts +7 -4
  51. package/dist/types/excalidraw/data/blob.d.ts +3 -1
  52. package/dist/types/excalidraw/data/json.d.ts +3 -1
  53. package/dist/types/excalidraw/renderer/animation.d.ts +1 -0
  54. package/dist/types/excalidraw/scene/Renderer.d.ts +2 -0
  55. package/dist/types/excalidraw/scene/index.d.ts +1 -1
  56. package/dist/types/excalidraw/scene/types.d.ts +1 -0
  57. package/dist/types/excalidraw/scroll.d.ts +46 -0
  58. package/dist/types/excalidraw/types.d.ts +24 -3
  59. package/dist/types/laser-pointer/src/index.d.ts +2 -0
  60. package/dist/types/laser-pointer/src/math.d.ts +16 -0
  61. package/dist/types/laser-pointer/src/simplify.d.ts +2 -0
  62. package/dist/types/laser-pointer/src/state.d.ts +35 -0
  63. package/dist/types/utils/src/index.d.ts +1 -2
  64. package/package.json +1 -1
  65. package/dist/types/utils/src/bbox.d.ts +0 -9
  66. package/dist/types/utils/src/withinBounds.d.ts +0 -19
@@ -12,4 +12,5 @@ export declare class AnimationController {
12
12
  private static tick;
13
13
  static running(key: string): boolean;
14
14
  static cancel(key: string): void;
15
+ static reset(): void;
15
16
  }
@@ -272,6 +272,7 @@ export declare class Renderer {
272
272
  type: "image";
273
273
  fileId: import("@excalidraw/element/types").FileId | null;
274
274
  fileName: string | null;
275
+ thumbHash: string | null;
275
276
  status: "pending" | "saved" | "error";
276
277
  scale: [number, number];
277
278
  crop: import("@excalidraw/element/types").ImageCrop | null;
@@ -427,6 +428,7 @@ export declare class Renderer {
427
428
  points: readonly import("@excalidraw/math").LocalPoint[];
428
429
  pressures: readonly number[];
429
430
  simulatePressure: boolean;
431
+ strokeOptions: import("@excalidraw/element/types").StrokeOptions;
430
432
  }> & {
431
433
  isDeleted: boolean;
432
434
  }) | null;
@@ -1,4 +1,4 @@
1
1
  export { isSomeElementSelected, getElementsWithinSelection, getSelectedElements, getTargetElements, } from "@excalidraw/element";
2
2
  export { calculateScrollCenter } from "./scroll";
3
- export { hasBackground, hasStrokeWidth, hasStrokeStyle, canHaveArrowheads, canChangeRoundness, } from "@excalidraw/element";
3
+ export { hasBackground, hasStrokeWidth, hasStrokeStyle, hasFreedrawMode, canHaveArrowheads, canChangeRoundness, } from "@excalidraw/element";
4
4
  export { getNormalizedZoom, getNormalizedGridSize, getNormalizedGridStep, } from "./normalize";
@@ -8,6 +8,7 @@ export type RenderableElementsMap = NonDeletedElementsMap & MakeBrand<"Renderabl
8
8
  export type StaticCanvasRenderConfig = {
9
9
  canvasBackgroundColor: AppState["viewBackgroundColor"];
10
10
  imageCache: AppClassProperties["imageCache"];
11
+ imageTransitionDuration?: number;
11
12
  renderGrid: boolean;
12
13
  /** when exporting the behavior is slightly different (e.g. we can't use
13
14
  CSS filters), and we disable render optimizations for best output */
@@ -0,0 +1,46 @@
1
+ import type { ExcalidrawElement } from "@excalidraw/element/types";
2
+ import type { AppState, Offsets } from "./types";
3
+ export declare const SCROLL_TO_CONTENT_ANIMATION_KEY = "animateScrollToContent";
4
+ export type ScrollToContentOptions = ({
5
+ fitToContent?: boolean;
6
+ fitToViewport?: never;
7
+ viewportZoomFactor?: number;
8
+ animate?: boolean;
9
+ duration?: number;
10
+ } | {
11
+ fitToContent?: never;
12
+ fitToViewport?: boolean;
13
+ /** when fitToViewport=true, how much screen should the content cover,
14
+ * between 0.1 (10%) and 1 (100%) */
15
+ viewportZoomFactor?: number;
16
+ animate?: boolean;
17
+ duration?: number;
18
+ }) & {
19
+ minZoom?: number;
20
+ maxZoom?: number;
21
+ canvasOffsets?: Offsets;
22
+ };
23
+ type Viewport = Pick<AppState, "scrollX" | "scrollY" | "zoom">;
24
+ /**
25
+ * Scrolls (and optionally zooms) the viewport so that the given target is in
26
+ * view, optionally animating the transition.
27
+ */
28
+ export declare const scrollToElements: (state: AppState, target: readonly ExcalidrawElement[], onFrame: (state: Pick<AppState, "scrollX" | "scrollY" | "zoom" | "shouldCacheIgnoreZoom">) => void, opts?: ScrollToContentOptions) => void;
29
+ /**
30
+ * Interpolates the viewport from `from` to `target` at the (already-eased)
31
+ * blend amount `factor` (0 = `from`, 1 = `target`).
32
+ *
33
+ * Zoom is interpolated geometrically (so it feels uniform), and rather than
34
+ * tweening scrollX/scrollY directly we tween the *focal point* — the scene
35
+ * point under the viewport center — and derive scroll from it. Mixing a linear
36
+ * scroll with a geometric zoom makes the focal point swoop sideways
37
+ * mid-animation (most visible when zooming out); gliding the focal point keeps
38
+ * it steady. `width/2/zoom - scroll` is the inverse of `centerScrollOn` without
39
+ * offsets, so factor 0/1 land exactly on `from`/`target`.
40
+ */
41
+ export declare const interpolateViewport: ({ from, target, factor, }: {
42
+ from: Pick<AppState, "scrollX" | "scrollY" | "zoom" | "width" | "height">;
43
+ target: Viewport;
44
+ factor: number;
45
+ }) => Viewport;
46
+ export {};
@@ -1,7 +1,7 @@
1
- import type { IMAGE_MIME_TYPES, UserIdleState, throttleRAF, MIME_TYPES, ColorTuple, EditorInterface } from "@excalidraw/common";
1
+ import type { IMAGE_MIME_TYPES, UserIdleState, throttleRAF, MIME_TYPES, ColorTuple, EditorInterface, StrokeWidthKey } from "@excalidraw/common";
2
2
  import type { LinearElementEditor } from "@excalidraw/element";
3
3
  import type { MaybeTransformHandleType } from "@excalidraw/element";
4
- import type { PointerType, ExcalidrawLinearElement, NonDeletedExcalidrawElement, NonDeleted, TextAlign, ExcalidrawElement, GroupId, ExcalidrawBindableElement, Arrowhead, FontFamilyValues, FileId, Theme, StrokeRoundness, ExcalidrawEmbeddableElement, ExcalidrawMagicFrameElement, ExcalidrawFrameLikeElement, ExcalidrawElementType, ExcalidrawIframeLikeElement, OrderedExcalidrawElement, ExcalidrawNonSelectionElement, ArrangeAlgorithms, BindMode, ExcalidrawTextElement } from "@excalidraw/element/types";
4
+ import type { PointerType, ExcalidrawLinearElement, NonDeletedExcalidrawElement, NonDeleted, TextAlign, ExcalidrawElement, GroupId, ExcalidrawBindableElement, Arrowhead, FontFamilyValues, FileId, Theme, StrokeRoundness, ExcalidrawEmbeddableElement, ExcalidrawMagicFrameElement, ExcalidrawFrameLikeElement, ExcalidrawElementType, ExcalidrawIframeLikeElement, OrderedExcalidrawElement, ExcalidrawNonSelectionElement, ArrangeAlgorithms, BindMode, ExcalidrawTextElement, StrokeVariability } from "@excalidraw/element/types";
5
5
  import type { Merge, MaybePromise, ValueOf, MakeBrand } from "@excalidraw/common/utility-types";
6
6
  import type { CaptureUpdateActionType, DurableIncrement, EphemeralIncrement } from "@excalidraw/element";
7
7
  import type { GlobalPoint } from "@excalidraw/math";
@@ -64,6 +64,8 @@ export type BinaryFileData = {
64
64
  id: FileId;
65
65
  fileName: string;
66
66
  dataURL: DataURL;
67
+ /** compact image placeholder, also stored on the corresponding image element */
68
+ thumbHash?: string;
67
69
  /**
68
70
  * Epoch timestamp in milliseconds
69
71
  */
@@ -294,9 +296,10 @@ export interface AppState {
294
296
  currentItemStrokeColor: string;
295
297
  currentItemBackgroundColor: string;
296
298
  currentItemFillStyle: ExcalidrawElement["fillStyle"];
297
- currentItemStrokeWidth: number;
299
+ currentItemStrokeWidthKey: StrokeWidthKey;
298
300
  currentItemStrokeStyle: ExcalidrawElement["strokeStyle"];
299
301
  currentItemRoughness: number;
302
+ currentItemStrokeVariability: StrokeVariability;
300
303
  currentItemOpacity: number;
301
304
  currentItemFontFamily: FontFamilyValues;
302
305
  currentItemFontSize: number;
@@ -365,6 +368,7 @@ export interface AppState {
365
368
  gridStep: number;
366
369
  gridModeEnabled: boolean;
367
370
  viewModeEnabled: boolean;
371
+ viewModeOnly: boolean;
368
372
  /** top-most selected groups (i.e. does not include nested groups) */
369
373
  selectedGroupIds: {
370
374
  [groupId: string]: boolean;
@@ -464,6 +468,7 @@ export type CompressImageFileOpts = {
464
468
  export type CompressImageFile = (file: File, opts: CompressImageFileOpts) => Promise<File>;
465
469
  export interface ExcalidrawProps {
466
470
  onChange?: (elements: readonly OrderedExcalidrawElement[], appState: AppState, files: BinaryFiles) => void;
471
+ onThemeChange?: (theme: Theme | "system") => void;
467
472
  /**
468
473
  * note: only subscribes if the props.onIncrement is defined on initial render
469
474
  */
@@ -514,6 +519,7 @@ export interface ExcalidrawProps {
514
519
  renderTopRightUI?: (isMobile: boolean, appState: UIAppState) => JSX.Element | null;
515
520
  langCode?: Language["code"];
516
521
  viewModeEnabled?: boolean;
522
+ viewModeOnly?: boolean;
517
523
  zenModeEnabled?: boolean;
518
524
  gridModeEnabled?: boolean;
519
525
  objectsSnapModeEnabled?: boolean;
@@ -587,12 +593,19 @@ export type ExportOpts = {
587
593
  export type ImageOptions = Partial<{
588
594
  maxWidthOrHeight: number;
589
595
  maxFileSizeBytes: number;
596
+ /** duration of the placeholder-to-full-image crossfade in milliseconds */
597
+ placeholderTransitionDuration: number;
590
598
  }>;
591
599
  export type CanvasActions = Partial<{
592
600
  changeViewBackgroundColor: boolean;
593
601
  export: false | ExportOpts;
594
602
  loadScene: boolean;
595
603
  saveToActiveFile: boolean;
604
+ /**
605
+ * defaults to true if `props.theme` is omitted or `props.onThemeChange`
606
+ * is supplied (at which point the theme is considered as host-app controlled),
607
+ * else default to false
608
+ * */
596
609
  toggleTheme: boolean | null;
597
610
  saveAsImage: boolean;
598
611
  }>;
@@ -637,7 +650,13 @@ export type AppClassProperties = {
637
650
  imageCache: Map<FileId, {
638
651
  image: HTMLImageElement | Promise<HTMLImageElement>;
639
652
  mimeType: ValueOf<typeof IMAGE_MIME_TYPES>;
653
+ isPlaceholder?: boolean;
654
+ placeholderImage?: HTMLImageElement;
655
+ transitionStart?: number;
640
656
  }>;
657
+ imageLoadingProgress: App["imageLoadingProgress"];
658
+ imageLoadingProgressEmitter: App["imageLoadingProgressEmitter"];
659
+ imagePlaceholderUpdateEmitter: App["imagePlaceholderUpdateEmitter"];
641
660
  files: BinaryFiles;
642
661
  editorInterface: App["editorInterface"];
643
662
  scene: App["scene"];
@@ -766,6 +785,8 @@ export interface ExcalidrawImperativeAPI {
766
785
  refresh: InstanceType<typeof App>["refresh"];
767
786
  setToast: InstanceType<typeof App>["setToast"];
768
787
  addFiles: (data: BinaryFileData[]) => void;
788
+ addImagePlaceholder: (fileId: FileId, file: File) => Promise<void>;
789
+ setImageLoadingProgress: (fileId: FileId, progress: number | null) => void;
769
790
  addImageElementsToScene: (imageFiles: {
770
791
  file: File;
771
792
  customData: Record<string, any>;
@@ -0,0 +1,2 @@
1
+ export * from "./state";
2
+ export type { Point } from "./math";
@@ -0,0 +1,16 @@
1
+ export type Point = [x: number, y: number, r: number];
2
+ export declare function add([ax, ay, ar]: Point, [bx, by, br]: Point): Point;
3
+ export declare function sub([ax, ay, ar]: Point, [bx, by, br]: Point): Point;
4
+ export declare function smul([x, y, r]: Point, s: number): Point;
5
+ export declare function norm([x, y, r]: Point): Point;
6
+ export declare function rot([x, y, r]: Point, rad: number): Point;
7
+ export declare function plerp(a: Point, b: Point, t: number): Point;
8
+ export declare function lerp(a: number, b: number, t: number): number;
9
+ export declare function angle(p: Point, p1: Point, p2: Point): number;
10
+ export declare function normAngle(a: number): number;
11
+ export declare function mag([x, y]: Point): number;
12
+ export declare function dist([ax, ay]: Point, [bx, by]: Point): number;
13
+ export declare function getCircleAndPerpendicularLineIntersectionsAtPoint(point: Point, direction: Point, radius: number): [Point, Point];
14
+ export declare function runLength(ps: Point[]): number;
15
+ export declare const clamp: (v: number, min: number, max: number) => number;
16
+ export declare function distancePointToSegment(p3: Point, p1: Point, p2: Point): number;
@@ -0,0 +1,2 @@
1
+ import { type Point } from "./math";
2
+ export declare function douglasPeucker(points: Point[], epsilon: number): Point[];
@@ -0,0 +1,35 @@
1
+ import type { Point } from "./math";
2
+ export type SizeMappingDetails = {
3
+ pressure: number;
4
+ runningLength: number;
5
+ currentIndex: number;
6
+ totalLength: number;
7
+ };
8
+ export type LaserPointerOptions = {
9
+ size: number;
10
+ streamline: number;
11
+ simplify: number;
12
+ simplifyPhase: "tail" | "output" | "input";
13
+ keepHead: boolean;
14
+ sizeMapping: (details: SizeMappingDetails) => number;
15
+ };
16
+ export declare class LaserPointer {
17
+ static defaults: LaserPointerOptions;
18
+ static constants: {
19
+ cornerDetectionMaxAngle: number;
20
+ cornerDetectionVariance: (s: number) => 1 | 0.5;
21
+ maxTailLength: number;
22
+ };
23
+ options: LaserPointerOptions;
24
+ constructor(options: Partial<LaserPointerOptions>);
25
+ originalPoints: Point[];
26
+ private stablePoints;
27
+ private tailPoints;
28
+ private isFresh;
29
+ private get lastPoint();
30
+ addPoint(point: Point): void;
31
+ close(): void;
32
+ stabilizeTail(): void;
33
+ private getSize;
34
+ getStrokeOutline(sizeOverride?: number | undefined): Point[];
35
+ }
@@ -1,4 +1,3 @@
1
1
  export * from "./export";
2
- export * from "./withinBounds";
3
- export * from "./bbox";
2
+ export { elementsOverlappingBBox } from "@excalidraw/element";
4
3
  export { getCommonBounds } from "@excalidraw/element";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@myoc/common",
3
- "version": "0.19.518",
3
+ "version": "0.19.520",
4
4
  "type": "module",
5
5
  "types": "./dist/types/common/src/index.d.ts",
6
6
  "main": "./dist/prod/index.js",
@@ -1,9 +0,0 @@
1
- import { type GlobalPoint, type LocalPoint } from "@excalidraw/math";
2
- import type { Bounds } from "@excalidraw/common";
3
- export type LineSegment<P extends LocalPoint | GlobalPoint> = [P, P];
4
- export declare function getBBox<P extends LocalPoint | GlobalPoint>(line: LineSegment<P>): Bounds;
5
- export declare function doBBoxesIntersect(a: Bounds, b: Bounds): boolean;
6
- export declare function isPointOnLine<P extends GlobalPoint | LocalPoint>(l: LineSegment<P>, p: P): boolean;
7
- export declare function isPointRightOfLine<P extends GlobalPoint | LocalPoint>(l: LineSegment<P>, p: P): boolean;
8
- export declare function isLineSegmentTouchingOrCrossingLine<P extends GlobalPoint | LocalPoint>(a: LineSegment<P>, b: LineSegment<P>): boolean;
9
- export declare function doLineSegmentsIntersect<P extends GlobalPoint | LocalPoint>(a: LineSegment<P>, b: LineSegment<P>): boolean;
@@ -1,19 +0,0 @@
1
- import { type Bounds } from "@excalidraw/common";
2
- import type { ExcalidrawElement, NonDeletedExcalidrawElement } from "@excalidraw/element/types";
3
- type Element = NonDeletedExcalidrawElement;
4
- type Elements = readonly NonDeletedExcalidrawElement[];
5
- export declare const isElementInsideBBox: (element: Element, bbox: Bounds, eitherDirection?: boolean) => boolean;
6
- export declare const elementPartiallyOverlapsWithOrContainsBBox: (element: Element, bbox: Bounds) => boolean;
7
- export declare const elementsOverlappingBBox: ({ elements, bounds, type, errorMargin, }: {
8
- elements: Elements;
9
- bounds: Bounds | ExcalidrawElement;
10
- /** safety offset. Defaults to 0. */
11
- errorMargin?: number;
12
- /**
13
- * - overlap: elements overlapping or inside bounds
14
- * - contain: elements inside bounds or bounds inside elements
15
- * - inside: elements inside bounds
16
- **/
17
- type: "overlap" | "contain" | "inside";
18
- }) => NonDeletedExcalidrawElement[];
19
- export {};