@kwiz/fluentui 1.0.40 → 1.0.42

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. package/dist/controls/ColorPickerDialog.d.ts +13 -0
  2. package/dist/controls/ColorPickerDialog.js +34 -0
  3. package/dist/controls/ColorPickerDialog.js.map +1 -0
  4. package/dist/controls/canvas/CustomEventTargetBase.d.ts +7 -0
  5. package/dist/controls/canvas/CustomEventTargetBase.js +22 -0
  6. package/dist/controls/canvas/CustomEventTargetBase.js.map +1 -0
  7. package/dist/controls/canvas/DrawPad.d.ts +17 -0
  8. package/dist/controls/canvas/DrawPad.js +161 -0
  9. package/dist/controls/canvas/DrawPad.js.map +1 -0
  10. package/dist/controls/canvas/DrawPadManager.d.ts +84 -0
  11. package/dist/controls/canvas/DrawPadManager.js +486 -0
  12. package/dist/controls/canvas/DrawPadManager.js.map +1 -0
  13. package/dist/controls/canvas/bezier.d.ts +17 -0
  14. package/dist/controls/canvas/bezier.js +65 -0
  15. package/dist/controls/canvas/bezier.js.map +1 -0
  16. package/dist/controls/canvas/point.d.ts +16 -0
  17. package/dist/controls/canvas/point.js +26 -0
  18. package/dist/controls/canvas/point.js.map +1 -0
  19. package/dist/controls/file-upload.js +1 -0
  20. package/dist/controls/file-upload.js.map +1 -1
  21. package/dist/helpers/drag-drop/drag-drop-context.js +1 -1
  22. package/dist/helpers/drag-drop/drag-drop-context.js.map +1 -1
  23. package/dist/helpers/hooks.d.ts +4 -0
  24. package/dist/helpers/hooks.js +28 -0
  25. package/dist/helpers/hooks.js.map +1 -1
  26. package/dist/index.d.ts +2 -0
  27. package/dist/index.js +2 -0
  28. package/dist/index.js.map +1 -1
  29. package/package.json +3 -2
  30. package/src/controls/ColorPickerDialog.tsx +77 -0
  31. package/src/controls/canvas/CustomEventTargetBase.ts +33 -0
  32. package/src/controls/canvas/DrawPad.tsx +206 -0
  33. package/src/controls/canvas/DrawPadManager.ts +677 -0
  34. package/src/controls/canvas/bezier.ts +110 -0
  35. package/src/controls/canvas/point.ts +45 -0
  36. package/src/controls/file-upload.tsx +1 -0
  37. package/src/helpers/drag-drop/drag-drop-context.tsx +1 -2
  38. package/src/helpers/hooks.tsx +31 -0
  39. package/src/index.ts +2 -0
@@ -0,0 +1,13 @@
1
+ import * as React from "react";
2
+ export interface iProps {
3
+ label?: string;
4
+ value: string;
5
+ onChange: (newValue: string) => void;
6
+ required?: boolean;
7
+ showValidationErrors?: boolean;
8
+ underlined?: boolean;
9
+ width?: number;
10
+ buttonOnly?: boolean;
11
+ placeholder?: string;
12
+ }
13
+ export declare const ColorPickerEx: React.FunctionComponent<iProps>;
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Field } from "@fluentui/react-components";
3
+ import { ColorRegular } from "@fluentui/react-icons";
4
+ import { isFunction, isNullOrEmptyString, isNumber } from "@kwiz/common";
5
+ import * as React from "react";
6
+ import ColorPicker from 'react-pick-color';
7
+ import { useEffectOnlyOnMount, useStateEX } from "../helpers/hooks";
8
+ import { ButtonEX } from "./button";
9
+ import { InputEx } from "./input";
10
+ import { Prompter } from "./prompt";
11
+ export const ColorPickerEx = (props) => {
12
+ const [isOpen, setIsOpen] = useStateEX(false);
13
+ const [selectedColor, setSelectedColor] = useStateEX(props.value);
14
+ const getColorCells = React.useCallback(() => {
15
+ let cells = [
16
+ "white", "black"
17
+ ];
18
+ return cells;
19
+ }, useEffectOnlyOnMount);
20
+ return _jsxs(_Fragment, { children: [props.buttonOnly
21
+ ? _jsx(ButtonEX, { title: "Open color picker", icon: _jsx(ColorRegular, { color: selectedColor }), onClick: (e) => setIsOpen(true) })
22
+ : _jsx(Field, { label: props.label, required: props.required === true, validationMessage: props.showValidationErrors && props.required === true && isNullOrEmptyString(selectedColor) ? "You can't leave this blank." : undefined, children: _jsx(InputEx, { placeholder: props.placeholder || "Enter value here", style: isNumber(props.width) ? { width: props.width } : undefined, value: selectedColor, onChange: (e, data) => {
23
+ setSelectedColor(data.value);
24
+ if (isFunction(props.onChange)) {
25
+ props.onChange(data.value);
26
+ }
27
+ }, contentAfter: _jsx(ButtonEX, { title: "Open color picker", icon: _jsx(ColorRegular, { color: selectedColor }), onClick: (e) => setIsOpen(true) }) }) }), isOpen && _jsx(Prompter, { maxWidth: 332, hideOk: true, hideCancel: true, onCancel: () => {
28
+ if (isFunction(props.onChange)) {
29
+ props.onChange(selectedColor);
30
+ }
31
+ setIsOpen(false);
32
+ }, showCancelInTitle: true, title: props.label || "Choose a color", children: _jsx(ColorPicker, { color: selectedColor, onChange: color => setSelectedColor(color.hex), presets: getColorCells() }) })] });
33
+ };
34
+ //# sourceMappingURL=ColorPickerDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColorPickerDialog.js","sourceRoot":"","sources":["../../src/controls/ColorPickerDialog.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare class CustomEventTargetBase implements EventTarget {
2
+ private _et;
3
+ constructor();
4
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject | null, options?: boolean | AddEventListenerOptions): void;
5
+ dispatchEvent(event: Event): boolean;
6
+ removeEventListener(type: string, callback: EventListenerOrEventListenerObject | null, options?: boolean | EventListenerOptions): void;
7
+ }
@@ -0,0 +1,22 @@
1
+ export class CustomEventTargetBase {
2
+ constructor() {
3
+ try {
4
+ this._et = new EventTarget();
5
+ }
6
+ catch (error) {
7
+ // Using document as EventTarget to support iOS 13 and older.
8
+ // Because EventTarget constructor just exists at iOS 14 and later.
9
+ this._et = document;
10
+ }
11
+ }
12
+ addEventListener(type, listener, options) {
13
+ this._et.addEventListener(type, listener, options);
14
+ }
15
+ dispatchEvent(event) {
16
+ return this._et.dispatchEvent(event);
17
+ }
18
+ removeEventListener(type, callback, options) {
19
+ this._et.removeEventListener(type, callback, options);
20
+ }
21
+ }
22
+ //# sourceMappingURL=CustomEventTargetBase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomEventTargetBase.js","sourceRoot":"","sources":["../../../src/controls/canvas/CustomEventTargetBase.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,qBAAqB;IAG9B;QACI,IAAI,CAAC;YACD,IAAI,CAAC,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,6DAA6D;YAC7D,mEAAmE;YACnE,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC;QACxB,CAAC;IACL,CAAC;IAEM,gBAAgB,CACnB,IAAY,EACZ,QAAmD,EACnD,OAA2C;QAE3C,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAEM,aAAa,CAAC,KAAY;QAC7B,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAEM,mBAAmB,CACtB,IAAY,EACZ,QAAmD,EACnD,OAAwC;QAExC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;CACJ"}
@@ -0,0 +1,17 @@
1
+ import * as React from "react";
2
+ interface iProps {
3
+ BackgroundColor?: string;
4
+ BorderColor?: string;
5
+ LineColor?: string;
6
+ minWidth?: number;
7
+ minHeight?: number;
8
+ Value?: string;
9
+ OnChange?: (newValue: string) => void;
10
+ ReadOnly?: boolean;
11
+ SignAsText?: string;
12
+ HideUpload?: boolean;
13
+ HideClear?: boolean;
14
+ HideColorPicker?: boolean;
15
+ }
16
+ export declare const DrawPad: React.FunctionComponent<iProps>;
17
+ export {};
@@ -0,0 +1,161 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
11
+ import { tokens } from "@fluentui/react-components";
12
+ import { ArrowUploadRegular, CalligraphyPenRegular, DismissRegular } from "@fluentui/react-icons";
13
+ import { ImageFileTypes, debounce, isElement, isFunction, isNullOrEmptyArray, isNullOrEmptyString } from "@kwiz/common";
14
+ import * as React from "react";
15
+ import { useElementSize, useStateEX } from "../../helpers/hooks";
16
+ import { ButtonEX } from "../button";
17
+ import { ColorPickerEx } from "../ColorPickerDialog";
18
+ import { FileUpload } from "../file-upload";
19
+ import { Horizontal } from "../horizontal";
20
+ import { Vertical } from "../vertical";
21
+ import DrawPadManager from "./DrawPadManager";
22
+ export const DrawPad = (props) => {
23
+ const [LineColor, setLineColor] = useStateEX(props.LineColor || tokens.colorBrandForeground1);
24
+ const [manager, setmanager] = useStateEX(null);
25
+ const [canUndo, setcanUndo] = useStateEX(false);
26
+ const [loadedFontNames, setloadedFontNames] = useStateEX([]);
27
+ const canvasArea = React.useRef();
28
+ const canvasContainerDiv = React.useRef();
29
+ //load font for sign as text
30
+ React.useEffect(() => {
31
+ if (props.SignAsText && isNullOrEmptyArray(loadedFontNames)) {
32
+ let DancingScriptFont = new FontFace("Dancing Script", "url(https://fonts.gstatic.com/s/dancingscript/v25/If2RXTr6YS-zF4S-kcSWSVi_szLgiuE.woff2) format('woff2')", {
33
+ style: "normal",
34
+ weight: "400 700",
35
+ display: "swap",
36
+ unicodeRange: "U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD"
37
+ });
38
+ DancingScriptFont.load().then((loadedFont) => __awaiter(void 0, void 0, void 0, function* () {
39
+ document.fonts.add(loadedFont);
40
+ yield document.fonts.ready;
41
+ setloadedFontNames(["Dancing Script"]);
42
+ }));
43
+ }
44
+ }, [props.SignAsText, loadedFontNames]);
45
+ //setup manager
46
+ React.useEffect(() => {
47
+ if (!props.ReadOnly) {
48
+ //this gets called after each render...
49
+ if (!manager) {
50
+ if (canvasArea.current) {
51
+ let manager = new DrawPadManager(canvasArea.current);
52
+ setmanager(manager).then(() => UpdateCanvas());
53
+ if (isFunction(props.OnChange)) {
54
+ manager.addEventListener("endStroke", () => {
55
+ let value = "";
56
+ if (!manager.isEmpty()) {
57
+ value = manager.toDataURL("image/png");
58
+ }
59
+ if (!canUndo)
60
+ setcanUndo(true);
61
+ props.OnChange(value);
62
+ });
63
+ }
64
+ }
65
+ }
66
+ else {
67
+ UpdateCanvas();
68
+ }
69
+ }
70
+ }); //run every time after render
71
+ //set value to canvas
72
+ const UpdateCanvas = React.useCallback(debounce(() => {
73
+ if (manager) {
74
+ manager.penColor.value = LineColor;
75
+ if (!isNullOrEmptyString(props.Value))
76
+ manager.fromDataURL(props.Value, { clear: true });
77
+ else
78
+ manager.clear();
79
+ }
80
+ }, 200, this), [manager, props.Value, LineColor]);
81
+ const onSignAs = React.useCallback(() => {
82
+ let canvas = canvasArea.current;
83
+ if (!isElement(canvas)) {
84
+ return;
85
+ }
86
+ let height = canvas.clientHeight;
87
+ let width = canvas.clientWidth;
88
+ let fontName = loadedFontNames[0];
89
+ let signAs = props.SignAsText;
90
+ let ctx = canvas.getContext("2d");
91
+ ctx.fillStyle = LineColor || LineColor || tokens.colorBrandForeground1;
92
+ let fontSize = 0.6 * height;
93
+ ctx.font = `${fontSize}px ${fontName}`;
94
+ let textMeasurement = ctx.measureText(signAs);
95
+ let textWidth = textMeasurement.width;
96
+ let maxWidth = 0.9 * width;
97
+ while (textWidth > maxWidth && fontSize > 1) {
98
+ fontSize = fontSize - 1;
99
+ ctx.font = `${fontSize}px ${fontName}`;
100
+ textMeasurement = ctx.measureText(signAs);
101
+ textWidth = textMeasurement.width;
102
+ }
103
+ let x = (width - textWidth) / 2;
104
+ let y = 0.6 * height; //baseline not starting point
105
+ ctx.fillText(signAs, x, y, width);
106
+ let url = canvas.toDataURL("image/png");
107
+ props.OnChange(url);
108
+ }, [canvasArea, props.OnChange]);
109
+ const HideButtons = props.HideClear && props.HideColorPicker && props.HideUpload;
110
+ const sizer = useElementSize(canvasContainerDiv.current);
111
+ const [size, setSize] = useStateEX({});
112
+ React.useEffect(() => {
113
+ if (canvasContainerDiv.current) {
114
+ setSize({
115
+ width: canvasContainerDiv.current.clientWidth,
116
+ height: canvasContainerDiv.current.clientHeight,
117
+ });
118
+ }
119
+ }, [canvasContainerDiv, sizer]);
120
+ return _jsxs(Horizontal, { nogap: true, children: [_jsx("div", { ref: canvasContainerDiv, style: {
121
+ flexGrow: 1,
122
+ position: "relative",
123
+ minWidth: props.minWidth,
124
+ minHeight: props.minHeight,
125
+ backgroundColor: props.BackgroundColor,
126
+ border: `1px solid ${props.BorderColor || tokens.colorNeutralStroke1}`
127
+ }, children: props.ReadOnly
128
+ ? _jsx("img", { src: props.Value, style: { position: "absolute", left: 0, top: 0, width: size.width, height: size.height } })
129
+ :
130
+ _jsxs("div", { style: { position: "absolute", left: 0, top: 0, width: size.width, height: size.height }, children: [_jsx("canvas", { ref: canvasArea, style: {
131
+ touchAction: "none",
132
+ userSelect: "none",
133
+ position: "absolute",
134
+ left: 0,
135
+ top: 0,
136
+ width: size.width,
137
+ height: size.height,
138
+ border: tokens.colorBrandStroke1
139
+ } }), isNullOrEmptyString(props.Value)
140
+ && !isNullOrEmptyString(props.SignAsText)
141
+ && !isNullOrEmptyArray(loadedFontNames)
142
+ && _jsx(ButtonEX, { style: {
143
+ position: "absolute",
144
+ bottom: 0,
145
+ border: 0,
146
+ margin: 0,
147
+ right: 0,
148
+ height: 16
149
+ }, icon: _jsx(CalligraphyPenRegular, {}), title: `Sign as ${props.SignAsText}`, onClick: () => {
150
+ onSignAs();
151
+ } })] }) }), !props.ReadOnly && !HideButtons && _jsxs(Vertical, { nogap: true, children: [props.HideColorPicker || _jsx(ColorPickerEx, { buttonOnly: true, value: props.LineColor, onChange: newColor => {
152
+ setLineColor(newColor);
153
+ } }), props.HideClear || _jsx(ButtonEX, { disabled: isNullOrEmptyString(props.Value), title: "Clear", icon: _jsx(DismissRegular, {}), onClick: () => {
154
+ //can call clear on the canvas, or can call the onchange which will cause a re-draw
155
+ props.OnChange("");
156
+ } }), props.HideUpload || _jsx(FileUpload, { title: "Load background image", icon: _jsx(ArrowUploadRegular, {}), limitFileTypes: ImageFileTypes, asBase64: base64 => {
157
+ props.OnChange(base64[0].base64); //this will trigger a change and state update
158
+ //self.state.manager.fromDataURL(base64);//this will just set the image to the canvas but won't trigger a change
159
+ } })] })] });
160
+ };
161
+ //# sourceMappingURL=DrawPad.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DrawPad.js","sourceRoot":"","sources":["../../../src/controls/canvas/DrawPad.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import { CustomEventTargetBase } from './CustomEventTargetBase';
2
+ import { BasicPoint } from './point';
3
+ declare global {
4
+ interface CSSStyleDeclaration {
5
+ msTouchAction: string | null;
6
+ }
7
+ }
8
+ export type DrawPadEvent = MouseEvent | Touch | PointerEvent;
9
+ export interface FromDataOptions {
10
+ clear?: boolean;
11
+ }
12
+ export interface PointGroupOptions {
13
+ dotSize: number;
14
+ minWidth: number;
15
+ maxWidth: number;
16
+ penColor: string;
17
+ }
18
+ export interface Options extends Partial<PointGroupOptions> {
19
+ minDistance?: number;
20
+ velocityFilterWeight?: number;
21
+ backgroundColor?: string;
22
+ throttle?: number;
23
+ }
24
+ export interface PointGroup extends PointGroupOptions {
25
+ points: BasicPoint[];
26
+ }
27
+ export default class DrawPadManager extends CustomEventTargetBase {
28
+ private canvas;
29
+ dotSize: import("@kwiz/common").DefaultProp<number>;
30
+ minWidth: import("@kwiz/common").DefaultProp<number>;
31
+ maxWidth: import("@kwiz/common").DefaultProp<number>;
32
+ penColor: import("@kwiz/common").DefaultProp<string>;
33
+ minDistance: import("@kwiz/common").DefaultProp<number>;
34
+ velocityFilterWeight: import("@kwiz/common").DefaultProp<number>;
35
+ backgroundColor: import("@kwiz/common").DefaultProp<string>;
36
+ throttle: import("@kwiz/common").DefaultProp<number>;
37
+ private _ctx;
38
+ private _drawningStroke;
39
+ private _isEmpty;
40
+ private _lastPoints;
41
+ private _data;
42
+ private _lastVelocity;
43
+ private _lastWidth;
44
+ private _strokeMoveUpdate;
45
+ constructor(canvas: HTMLCanvasElement, options?: Options);
46
+ clear(): void;
47
+ fromDataURL(dataUrl: string, options?: {
48
+ clear?: boolean;
49
+ }): Promise<void>;
50
+ toDataURL(type?: 'image/png' | 'image/jpeg' | 'image/svg+xml', encoderOptions?: number): string;
51
+ on(): void;
52
+ off(): void;
53
+ isEmpty(): boolean;
54
+ canUndo(): boolean;
55
+ undoLast(): void;
56
+ resizeCanvas(): void;
57
+ fromData(pointGroups: PointGroup[], { clear }?: FromDataOptions): void;
58
+ toData(): PointGroup[];
59
+ private _handleMouseDown;
60
+ private _handleMouseMove;
61
+ private _handleMouseUp;
62
+ private _handleTouchStart;
63
+ private _handleTouchMove;
64
+ private _handleTouchEnd;
65
+ private _handlePointerStart;
66
+ private _handlePointerMove;
67
+ private _handlePointerEnd;
68
+ private _strokeBegin;
69
+ private _strokeUpdate;
70
+ private _strokeEnd;
71
+ private _handlePointerEvents;
72
+ private _handleMouseEvents;
73
+ private _handleTouchEvents;
74
+ private _reset;
75
+ private _createPoint;
76
+ private _addPoint;
77
+ private _calculateCurveWidths;
78
+ private _strokeWidth;
79
+ private _drawCurveSegment;
80
+ private _drawCurve;
81
+ private _drawDot;
82
+ private _fromData;
83
+ private _toSVG;
84
+ }