microboard-temp 0.13.72 → 0.13.74

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 (48) hide show
  1. package/dist/cjs/browser.js +15502 -795
  2. package/dist/cjs/index.js +15502 -795
  3. package/dist/cjs/node.js +15507 -800
  4. package/dist/cjs/protocol.js +14659 -0
  5. package/dist/esm/browser.js +15502 -795
  6. package/dist/esm/index.js +15502 -795
  7. package/dist/esm/node.js +15508 -801
  8. package/dist/esm/protocol.js +14638 -0
  9. package/dist/types/Events/EventsCommand.d.ts +0 -1
  10. package/dist/types/Events/Log/getUnpublishedEventFromList.d.ts +1 -5
  11. package/dist/types/Events/Merge.d.ts +0 -1
  12. package/dist/types/Events/MessageRouter/boardMessageInterface.d.ts +41 -112
  13. package/dist/types/Events/MessageRouter/createMessageRouter.d.ts +5 -4
  14. package/dist/types/Events/MessageRouter/handleBoardSubscriptionCompletedMsg.d.ts +2 -5
  15. package/dist/types/Events/MessageRouter/handleModeMessage.d.ts +0 -5
  16. package/dist/types/Events/MessageRouter/socketContract.d.ts +15200 -0
  17. package/dist/types/Events/identity.d.ts +0 -1
  18. package/dist/types/Items/Anchor/Anchor.d.ts +0 -11
  19. package/dist/types/Items/Arc/Arc.d.ts +0 -2
  20. package/dist/types/Items/Connector/Connector.d.ts +0 -3
  21. package/dist/types/Items/Connector/getLine/findOrthogonalPath.d.ts +0 -4
  22. package/dist/types/Items/Curve/Curve.d.ts +2 -1
  23. package/dist/types/Items/ItemsCommandUtils.d.ts +0 -4
  24. package/dist/types/Items/RichText/RichText.d.ts +0 -2
  25. package/dist/types/Items/Shape/Basic/SpeachBubble/index.d.ts +0 -1
  26. package/dist/types/Items/index.d.ts +0 -1
  27. package/dist/types/Presence/throttle.d.ts +0 -1
  28. package/dist/types/SpatialIndex/LayeredIndex/Layers.d.ts +0 -13
  29. package/dist/types/api/initDefaultI18N.d.ts +0 -9
  30. package/dist/types/index.d.ts +0 -1
  31. package/dist/types/protocol.d.ts +8 -0
  32. package/package.json +12 -3
  33. package/dist/types/Events/handleRemoveSnappedObject.d.ts +0 -12
  34. package/dist/types/Items/LinkTo/index.d.ts +0 -0
  35. package/dist/types/Items/Mbr/updateRects.d.ts +0 -15
  36. package/dist/types/Items/RichText/CanvasText/DropflowRender.d.ts +0 -0
  37. package/dist/types/Items/RichText/CanvasText/index.d.ts +0 -2
  38. package/dist/types/Items/RichText/editorHelpers/common/getTextParagraphs.d.ts +0 -0
  39. package/dist/types/Items/RichText/editorHelpers/common/isBlockActive.d.ts +0 -3
  40. package/dist/types/Items/Shape/getRandomRgba.d.ts +0 -1
  41. package/dist/types/Items/Shape/handleUpdate.d.ts +0 -7
  42. package/dist/types/ReversibleOps.d.ts +0 -145
  43. package/dist/types/Selection/Transformer/TextTransformer/index.d.ts +0 -1
  44. package/dist/types/Selection/Transformer/TransformerHelpers/switchResizeType.d.ts +0 -7
  45. package/dist/types/SpatialIndex/LayeredIndex/getContainersToSet.d.ts +0 -8
  46. package/dist/types/Tools/BoardToolContext.d.ts +0 -8
  47. package/dist/types/isFirefox.d.ts +0 -1
  48. package/dist/types/ts-error-prioritizer.d.ts +0 -1
@@ -2,7 +2,6 @@ import type { Connection } from "../Settings";
2
2
  import type { BoardEventBody, BoardEventPackBody } from "./Events";
3
3
  type EventIdentityBody = Pick<BoardEventBody | BoardEventPackBody, "sessionId" | "authorUserId" | "userId">;
4
4
  export declare function getBoardEventSessionId(body: EventIdentityBody): string | undefined;
5
- export declare function getBoardEventAuthorUserId(body: EventIdentityBody): string | undefined;
6
5
  export declare function getConnectionSessionId(connection?: Connection): string;
7
6
  export declare function getConnectionSessionIds(connection?: Connection): string[];
8
7
  export declare function getConnectionAuthorUserId(connection?: Connection): string | undefined;
@@ -1,16 +1,6 @@
1
1
  import { DrawingContext } from '../DrawingContext';
2
2
  import { Mbr } from '../Mbr/Mbr';
3
3
  import { Point } from '../Point/Point';
4
- export declare const ANCHOR_BORDER_COLOR = "rgb(147, 175, 246)";
5
- export declare const ANCHOR_BACKGROUND_COLOR = "rgb(255, 255, 255)";
6
- export declare const ANCHOR_STROKE_WIDTH = 1;
7
- export declare const ANCHOR_RADIUS = 50;
8
- type Center = {
9
- x: number;
10
- y: number;
11
- };
12
- export declare function renderAnchor(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, center: Center, width: number, borderColor: string, backgroundColor: string, strokeWidth: number, scale: number): void;
13
- export declare function renderCircleAnchor(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, center: Center, radius: number, borderColor: string, backgroundColor: string, strokeWidth: number, scale: number): void;
14
4
  /**
15
5
  * The minimum bounding rectangle (MBR), also known as bounding box (BBOX) or envelope.
16
6
  * https://en.wikipedia.org/wiki/Minimum_bounding_rectangle
@@ -30,4 +20,3 @@ export declare class Anchor extends Mbr {
30
20
  getCenter(): Point;
31
21
  render(context: DrawingContext, type?: 'rect' | 'circle', active?: boolean): void;
32
22
  }
33
- export {};
@@ -3,8 +3,6 @@ import { Line } from "../Line/Line";
3
3
  import { Mbr } from "../Mbr/Mbr";
4
4
  import { Matrix } from "../Transformation/Matrix";
5
5
  import { GeometricNormal } from "../GeometricNormal";
6
- export declare class ArcData {
7
- }
8
6
  export declare class Arc {
9
7
  center: Point;
10
8
  radiusX: number;
@@ -22,11 +22,8 @@ import { BaseItem } from "../BaseItem/BaseItem";
22
22
  import type { SerializedItemData } from "../BaseItem/BaseItem";
23
23
  import { ColorValue } from '../../..';
24
24
  import { ConnectionLineWidth, ConnectorLineStyle } from './ConnectorTypes';
25
- export declare const DRAW_TEXT_BORDER = false;
26
- export declare const TEXT_BORDER_PADDING = 0;
27
25
  export declare const CONNECTOR_ANCHOR_COLOR: ConnectorAnchorColors;
28
26
  export declare const CONNECTOR_ANCHOR_TYPE = "rect";
29
- export declare const CONNECTOR_LINE_CAP = "round";
30
27
  export declare class Connector extends BaseItem<Connector> {
31
28
  private startPoint;
32
29
  private endPoint;
@@ -3,10 +3,6 @@ import { Point } from '../../Point';
3
3
  import { ControlPoint } from '../ControlPoint';
4
4
  type Direction = 'vertical' | 'horizontal';
5
5
  export declare function getDirection(from: Point, to?: Point): Direction | null;
6
- /**
7
- * Removes points from centerLine that will probably be visited twice or lengthen the path
8
- */
9
- export declare function removeUnnecessaryPoints(pathToCenterLine: Point[], centerLine: Point[], fromStart: boolean): void;
10
6
  export declare function findOrthogonalPath(start: ControlPoint, end: ControlPoint, obstacles: Mbr[], toVisitPoints?: Point[]): {
11
7
  lines: Line[];
12
8
  newStart?: ControlPoint;
@@ -3,7 +3,7 @@ import { Line } from "../Line/Line";
3
3
  import { Point } from "../Point/Point";
4
4
  import { Matrix } from "../Transformation/Matrix";
5
5
  import { GeometricNormal } from '../GeometricNormal';
6
- export declare class BaseCurve {
6
+ declare class BaseCurve {
7
7
  curve: any;
8
8
  constructor(curve: any);
9
9
  protected updateCache(curve: any): void;
@@ -54,3 +54,4 @@ export declare class CubicBezier extends BaseCurve {
54
54
  copy(): CubicBezier;
55
55
  getMiddle(): Point;
56
56
  }
57
+ export {};
@@ -1,7 +1,3 @@
1
- import { Item } from "./Item";
2
- export declare function reverMapOf<Itm extends Item, T>(item: Itm | Itm[], getCallback: (item: Itm) => T | null | false | undefined): {
3
- [key: string]: T;
4
- };
5
1
  export declare function mapItemsByOperation<Item, O>(item: Item | Item[], getCallback: (item: Item) => O): {
6
2
  item: Item;
7
3
  operation: O;
@@ -22,8 +22,6 @@ import { EditorContainer } from "./EditorContainer";
22
22
  import { RichTextOperation } from "./RichTextOperations";
23
23
  import { BaseItem } from "../BaseItem/BaseItem";
24
24
  import type { SerializedItemData } from "../BaseItem/BaseItem";
25
- export declare function isEditInProcess(): boolean;
26
- export declare function toggleEdit(value: boolean): void;
27
25
  /**
28
26
  * A geometric item to render a rich text on a DrawingContext.
29
27
  *
@@ -9,4 +9,3 @@ export declare const SpeachBubble: {
9
9
  createPath: (mbr: Mbr) => Path;
10
10
  useMbrUnderPointer: boolean;
11
11
  };
12
- export declare const createSpeachBubblePath: (mbr: Mbr) => Path;
@@ -5,7 +5,6 @@ export { Line } from "./Line";
5
5
  export { CubicBezier, QuadraticBezier } from "./Curve";
6
6
  export { Arc } from "./Arc";
7
7
  export { Mbr } from "./Mbr";
8
- export { updateRects } from "./Mbr/updateRects";
9
8
  export { DrawingContext } from "./DrawingContext";
10
9
  export * from "./Path";
11
10
  export * from "./Transformation";
@@ -1,2 +1 @@
1
- export declare function throttle<T extends (...args: any[]) => unknown>(func: T, delay: number): (...args: Parameters<T>) => void;
2
1
  export declare function throttleWithDebounce<T extends (...args: Parameters<T>) => void>(fn: T, throttleDelay: number, debounceDelay: number): T;
@@ -11,16 +11,3 @@ export declare class Layers<Layer> {
11
11
  get(number: number): Layer | undefined;
12
12
  [Symbol.iterator](): Iterator<Layer>;
13
13
  }
14
- export declare class MapLayers<Layer> {
15
- private getNewLayer;
16
- private layers;
17
- private top;
18
- private bottom;
19
- constructor(getNewLayer: () => Layer);
20
- newOnTop(): void;
21
- newOnBottom(): void;
22
- getTop(): number;
23
- getBottom(): number;
24
- get(number: number): Layer | undefined;
25
- [Symbol.iterator](): Iterator<Layer>;
26
- }
@@ -1,11 +1,2 @@
1
1
  import i18n from "i18next";
2
- export declare const defaultNS = "default";
3
- export declare const resources: {
4
- en: {
5
- default: {};
6
- };
7
- ru: {
8
- default: {};
9
- };
10
- };
11
2
  export declare function initDefaultI18N(): typeof i18n;
@@ -9,7 +9,6 @@ export * from "./Subject";
9
9
  export * from "./Camera";
10
10
  export * from "./Pointer";
11
11
  export * from "./Presence";
12
- export * from "./ReversibleOps";
13
12
  export * from "./Selection";
14
13
  export * from "./SessionStorage";
15
14
  export * from "./Validators";
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Public protocol entrypoint for shared websocket and handshake contracts.
3
+ *
4
+ * Downstream packages should import runtime schemas, parse helpers, and inferred
5
+ * transport types from `microboard/protocol` rather than from internal
6
+ * `Events/MessageRouter/*` modules.
7
+ */
8
+ export * from "./Events/MessageRouter/socketContract";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "microboard-temp",
3
- "version": "0.13.72",
3
+ "version": "0.13.74",
4
4
  "description": "A flexible interactive whiteboard library",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -21,6 +21,11 @@
21
21
  },
22
22
  "types": "./dist/types/index.d.ts"
23
23
  },
24
+ "./protocol": {
25
+ "import": "./dist/esm/protocol.js",
26
+ "require": "./dist/cjs/protocol.js",
27
+ "types": "./dist/types/protocol.d.ts"
28
+ },
24
29
  "./style": "./dist/microboard.css"
25
30
  },
26
31
  "files": [
@@ -31,7 +36,8 @@
31
36
  "build": "bun run build.ts",
32
37
  "dev": "bun build ./src/index.ts --outdir ./dist --target browser --format esm --watch --external canvas",
33
38
  "test": "bun test",
34
- "lint": "eslint src/**/*.{ts,tsx}"
39
+ "lint": "eslint src/**/*.{ts,tsx}",
40
+ "knip": "knip --include files,dependencies,unlisted"
35
41
  },
36
42
  "peerDependencies": {
37
43
  "canvas": "^3.1.0",
@@ -50,6 +56,9 @@
50
56
  "optional": true
51
57
  }
52
58
  },
59
+ "dependencies": {
60
+ "zod": "^4.3.6"
61
+ },
53
62
  "devDependencies": {
54
63
  "@types/rbush": "^4.0.0",
55
64
  "bezier-js": "^6.1.4",
@@ -59,9 +68,9 @@
59
68
  "i18next": "23.11.2",
60
69
  "i18next-browser-languagedetector": "7.2.1",
61
70
  "lightningcss": "^1.30.1",
71
+ "knip": "^5.62.0",
62
72
  "rbush": "^4.0.1",
63
73
  "rbush-knn": "^4.0.0",
64
- "react-i18next": "14.1.0",
65
74
  "rehype-parse": "9.0.1",
66
75
  "rehype-remark": "10.0.1",
67
76
  "remark-parse": "^11.0.0",
@@ -1,12 +0,0 @@
1
- import { SyncBoardEvent } from './Events';
2
- import { Board } from '../Board';
3
- import { EventsList } from './Log/createEventsList';
4
- /**
5
- * Handles the removal of snapped objects from the board by replacing any connected
6
- * connectors with updated versions that are no longer attached to the removed item.
7
- *
8
- * @param board - The board instance containing the items
9
- * @param events - Array of synchronization events to process
10
- * @param list - The event list to update
11
- */
12
- export declare function handleRemoveSnappedObject(board: Board, events: SyncBoardEvent[], list: EventsList): void;
File without changes
@@ -1,15 +0,0 @@
1
- import { Board } from '../../Board';
2
- import { Camera } from '../../Camera';
3
- import { Mbr } from './Mbr';
4
- export declare function updateRects(board: Board, ref: any, mbr?: Mbr, verticalOffset?: number, horizontalOffset?: number, fit?: 'hyperLink' | 'boardMenu' | 'contextPanel' | 'linkToBtn' | 'comment' | 'threadPanel'): Mbr | null;
5
- export declare function getContextPanelRect(selectionMbr: Mbr, camera: Camera, panel: HTMLElement, toLeft: boolean, horizontalOffset?: number, verticalOffset?: number): Mbr;
6
- export declare function fitContextPanelToLeft(selectionMbr: Mbr, view: Mbr, panel: Mbr, verticalOffset?: number, horizontalOffset?: number): Mbr;
7
- export declare function fitContextPanelToCenter(selectionMbr: Mbr, view: Mbr, panel: Mbr, verticalOffset?: number, horizontalOffset?: number): Mbr;
8
- export declare function fitContextMenu(button: Mbr, view: Mbr, menu: Mbr, panel: Mbr): Mbr;
9
- export declare function fitOnLeftOrRightOfItem(item: Mbr, view: Mbr, bounds: Mbr, offset: number): Mbr;
10
- export declare function fitLinkToBtn(itemMbr: Mbr, view: Mbr, panel: Mbr, verticalOffset?: number, horizontalOffset?: number): Mbr;
11
- export declare function fitHyperLink(linkMbr: Mbr, panel: Mbr, view: Mbr, offset?: number): Mbr;
12
- export declare function fitComment(anchor: Mbr, panel: Mbr, verticalOffset?: number, horizontalOffset?: number): Mbr;
13
- export declare function fitBoardMenu(anchor: Mbr, view: Mbr, panel: Mbr, verticalOffset?: number, horizontalOffset?: number): Mbr;
14
- export declare function fitThreadPanel(anchor: Mbr, view: Mbr, panel: Mbr, verticalOffset?: number, horizontalOffset?: number): Mbr;
15
- export declare function fitOnTopOrBottomOfItem(item: Mbr, view: Mbr, bounds: Mbr, offset: number): Mbr;
@@ -1,2 +0,0 @@
1
- export * from './Render';
2
- export * from './LayoutBlockNodes';
@@ -1,3 +0,0 @@
1
- import { BlockType } from '../../../RichText/Editor/BlockNode';
2
- import { Editor } from 'slate';
3
- export declare function isBlockActive(editor: Editor, format: BlockType): boolean;
@@ -1 +0,0 @@
1
- export declare function getRandomRgba(min: number, max: number, alphaMin: number, alphaMax: number): string;
@@ -1,7 +0,0 @@
1
- import { TransformationOperation } from "../Transformation";
2
- export declare function handleUpdate(op: TransformationOperation, text: {
3
- getId: () => string;
4
- transformCanvas: () => void;
5
- handleInshapeScale: () => void;
6
- updateElement: () => void;
7
- }): void;
@@ -1,145 +0,0 @@
1
- import { Operation as SlateOperation } from "slate";
2
- /**
3
- * Базовый аргумент операции.
4
- *
5
- * @typeparam T - Тип данных для прямого и обратного действия операции.
6
- */
7
- interface OperationArgument<T> {
8
- /** Уникальный идентификатор элемента, к которому применяется операция. */
9
- itemId: string;
10
- /** Данные для прямого действия операции. */
11
- forward: T;
12
- /** Данные для обратного действия операции. */
13
- reverse: T;
14
- }
15
- /**
16
- * Базовый интерфейс для всех операций.
17
- *
18
- * @typeparam T - Тип данных для аргументов операции.
19
- */
20
- interface Operation<T> {
21
- /** Тип операции. */
22
- type: string;
23
- /** Массив аргументов операции. */
24
- arguments: OperationArgument<T>[];
25
- }
26
- /**
27
- * Операция трансформации элемента.
28
- *
29
- * @remarks
30
- * Матрица в этой операции является афинной матрицей трансформации, состоящей из шести элементов.
31
- * Порядок элементов в матрицы: [a, b, c, d, e, f], где:
32
- * - a: Горизонтальное масштабирование (Horizontal scaling)
33
- * - b: Горизонтальный наклон (Horizontal skew)
34
- * - c: Вертикальный наклон (Vertical skew)
35
- * - d: Вертикальное масштабирование (Vertical scaling)
36
- * - e: Горизонтальное смещение (Horizontal translation)
37
- * - f: Вертикальное смещение (Vertical translation)
38
- *
39
- * Этот порядок соответствует порядку, используемому в API WebCanvas.
40
- *
41
- * Важно отметить, что эта матрица не является финальной матрицей трансформации элемента.
42
- * Она должна быть применена к предыдущей матрице трансформации элемента для получения
43
- * итогового результата.
44
- */
45
- interface TransformOperation extends Operation<{
46
- matrix: number[];
47
- }> {
48
- type: "Transform";
49
- }
50
- interface EditTextOperation extends Operation<{
51
- slateOperations: SlateOperation[];
52
- }> {
53
- type: "EditText";
54
- }
55
- interface SetFillPropertiesOperation extends Operation<{
56
- color?: string;
57
- opacity?: number;
58
- }> {
59
- type: "SetFillProperties";
60
- }
61
- interface SetBorderPropertiesOperation extends Operation<{
62
- color?: string;
63
- opacity?: number;
64
- width?: number;
65
- style?: string;
66
- }> {
67
- type: "SetBorderProperties";
68
- }
69
- interface SetConnectorPointOperation extends Operation<{
70
- pointType: "start" | "end";
71
- itemId: string;
72
- position: {
73
- x: number;
74
- y: number;
75
- };
76
- }> {
77
- type: "SetConnectorPoint";
78
- }
79
- interface SetAspectRatioConstraintOperation extends Operation<{
80
- constrained: boolean;
81
- }> {
82
- type: "SetAspectRatioConstraint";
83
- }
84
- interface AddChildOperation extends Operation<{
85
- parentId: string;
86
- childId: string;
87
- }> {
88
- type: "AddChild";
89
- }
90
- interface RemoveChildOperation extends Operation<{
91
- parentId: string;
92
- childId: string;
93
- }> {
94
- type: "RemoveChild";
95
- }
96
- interface SetLockOperation extends Operation<{
97
- locked: boolean;
98
- }> {
99
- type: "SetLock";
100
- }
101
- /**
102
- * Операция для изменения Z-индекса элемента.
103
- *
104
- * @remarks
105
- * Новый Z-индекс (newIndex) применяется относительно массива дочерних элементов
106
- * текущего родителя этого элемента. Если newIndex выходит за пределы допустимого
107
- * диапазона (например, больше, чем количество элементов у родителя), то элемент
108
- * будет помещен в конец списка дочерних элементов. Если newIndex отрицательный,
109
- * элемент будет помещен в начало списка.
110
- *
111
- * Эта операция не изменяет родителя элемента. Если элемент был перемещен
112
- * в другую группу или фрейм после применения этой операции, новый Z-индекс
113
- * будет интерпретирован в контексте нового родителя при повторном применении операции.
114
- */
115
- interface SetZIndexOperation extends Operation<{
116
- newIndex: number;
117
- }> {
118
- type: "SetZIndex";
119
- }
120
- interface SetShapeTypeOperation extends Operation<{
121
- shapeType: string;
122
- }> {
123
- type: "SetShapeType";
124
- }
125
- interface SetLineStyleOperation extends Operation<{
126
- lineStyle: string;
127
- }> {
128
- type: "SetLineStyle";
129
- }
130
- interface SetPointerStyleOperation extends Operation<{
131
- pointerType: "start" | "end";
132
- style: string;
133
- }> {
134
- type: "SetPointerStyle";
135
- }
136
- interface AddItemOperation extends Operation<{
137
- itemData: any;
138
- }> {
139
- type: "AddItem";
140
- }
141
- interface RemoveItemOperation extends Operation<{}> {
142
- type: "RemoveItem";
143
- }
144
- export type ReversibleOp = TransformOperation | EditTextOperation | SetFillPropertiesOperation | SetBorderPropertiesOperation | SetConnectorPointOperation | SetAspectRatioConstraintOperation | AddChildOperation | RemoveChildOperation | SetLockOperation | SetZIndexOperation | SetShapeTypeOperation | SetLineStyleOperation | SetPointerStyleOperation | AddItemOperation | RemoveItemOperation;
145
- export {};
@@ -1 +0,0 @@
1
- export { getTextResizeType } from "./getTextResizeType";
@@ -1,7 +0,0 @@
1
- import { Mbr, Point } from "../../../Items";
2
- import { ResizeType } from "./getResizeType";
3
- /**
4
- * A function that switches the resize type when the pointer is moved over an opposite edge or corner.
5
- * Currently, it is unused. But leave it here, just in case we need it in the future.
6
- */
7
- export declare function switchResizeType(resizeType: ResizeType, pointer: Point, mbr: Mbr): ResizeType;
@@ -1,8 +0,0 @@
1
- export declare function getContainersToSet<Container extends {
2
- layer: number;
3
- zIndex: number;
4
- }>(toAdd: Container, toChange: Container[]): Container[];
5
- export declare function isTwoOnSameLayer<Container extends {
6
- layer: number;
7
- zIndex: number;
8
- }>(containers: Container[]): boolean;
@@ -1,8 +0,0 @@
1
- import { Board } from "../Board";
2
- import { ToolContext } from "./ToolContext";
3
- import { Tools } from "./Tools";
4
- export declare class BoardToolContext extends ToolContext {
5
- protected boardTools: Tools;
6
- protected board: Board;
7
- constructor(boardTools: Tools, board: Board);
8
- }
@@ -1 +0,0 @@
1
- export declare function isFirefox(): boolean;
@@ -1 +0,0 @@
1
- export {};