@cuemath/leap 3.1.41-as3 → 3.1.41-as4
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/dist/features/cue-canvas/cue-canvas-helpers.js +48 -48
- package/dist/features/cue-canvas/cue-canvas-helpers.js.map +1 -1
- package/dist/features/hooks/use-audio-player.js +16 -16
- package/dist/features/hooks/use-audio-player.js.map +1 -1
- package/dist/static/lib/polypad-4.5.4.v1.js +66 -64
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CANVAS_COLORS as u } from "./constants/constants.js";
|
|
2
|
-
const
|
|
2
|
+
const S = [
|
|
3
3
|
"none",
|
|
4
4
|
"square2-grid",
|
|
5
5
|
"square-checked",
|
|
@@ -9,7 +9,7 @@ const h = [
|
|
|
9
9
|
"square-grid",
|
|
10
10
|
"tri-grid",
|
|
11
11
|
"tri2-grid"
|
|
12
|
-
],
|
|
12
|
+
], m = /* @__PURE__ */ new Set([
|
|
13
13
|
"undo",
|
|
14
14
|
"redo",
|
|
15
15
|
"clearAll",
|
|
@@ -20,68 +20,68 @@ const h = [
|
|
|
20
20
|
"zoomOut",
|
|
21
21
|
"upload",
|
|
22
22
|
"download"
|
|
23
|
-
]),
|
|
24
|
-
var
|
|
25
|
-
const
|
|
26
|
-
if (
|
|
27
|
-
const
|
|
28
|
-
if (
|
|
29
|
-
const s =
|
|
30
|
-
|
|
23
|
+
]), y = (e) => {
|
|
24
|
+
var o;
|
|
25
|
+
const t = (o = e.current) == null ? void 0 : o.shadowRoot;
|
|
26
|
+
if (t) {
|
|
27
|
+
const n = t.querySelectorAll("x-polypad");
|
|
28
|
+
if (n[0]) {
|
|
29
|
+
const s = n[0].querySelector("svg.canvas"), r = s == null ? void 0 : s.querySelector("path.mask");
|
|
30
|
+
r == null || r.setAttribute("stroke", "transparent"), r == null || r.setAttribute("fill", "transparent"), r == null || r.removeAttribute("style");
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
-
},
|
|
34
|
-
var
|
|
35
|
-
const
|
|
36
|
-
if (
|
|
37
|
-
const a =
|
|
33
|
+
}, E = (e) => {
|
|
34
|
+
var r;
|
|
35
|
+
const t = (r = e.current) == null ? void 0 : r.shadowRoot, o = t == null ? void 0 : t.querySelector("x-pp-sidebar"), n = o == null ? void 0 : o.getElementsByClassName("tabs-header"), s = o == null ? void 0 : o.getElementsByClassName("tabs-body");
|
|
36
|
+
if (o == null || o.setAttribute("style", "display: none;"), o == null || o.setAttribute("style", "height: 30px;"), n && n.length > 0) {
|
|
37
|
+
const a = n[0];
|
|
38
38
|
a.style.display = "none";
|
|
39
39
|
}
|
|
40
40
|
if (s && s.length > 0) {
|
|
41
41
|
const a = s[0];
|
|
42
42
|
a.style.top = "48px";
|
|
43
43
|
}
|
|
44
|
-
|
|
45
|
-
}, b = (
|
|
46
|
-
var
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
}, f = (
|
|
44
|
+
o == null || o.setAttribute("style", "display: block;");
|
|
45
|
+
}, b = (e) => {
|
|
46
|
+
var n, s;
|
|
47
|
+
const t = (n = e.current.shadowRoot) == null ? void 0 : n.querySelectorAll('[data-key="music"]')[0], o = (s = e.current.shadowRoot) == null ? void 0 : s.querySelectorAll('[data-key="logic"]')[0];
|
|
48
|
+
t && (t.style.display = "none"), o && (o.style.display = "none");
|
|
49
|
+
}, f = (e, t, o, n) => o === "canvas" ? {
|
|
50
50
|
canvas: "notebook",
|
|
51
|
-
canvasX:
|
|
52
|
-
canvasY:
|
|
51
|
+
canvasX: e,
|
|
52
|
+
canvasY: t,
|
|
53
53
|
noPinchPan: !0,
|
|
54
54
|
grid: "none",
|
|
55
55
|
background: "transparent",
|
|
56
56
|
noSnapping: !0
|
|
57
57
|
} : {
|
|
58
58
|
canvas: "infinite",
|
|
59
|
-
canvasX:
|
|
60
|
-
canvasY:
|
|
59
|
+
canvasX: e,
|
|
60
|
+
canvasY: t,
|
|
61
61
|
grid: "none",
|
|
62
|
-
noPinchPan:
|
|
63
|
-
noDeleting:
|
|
64
|
-
noCopyPaste:
|
|
62
|
+
noPinchPan: n === "STUDENT",
|
|
63
|
+
noDeleting: n === "STUDENT",
|
|
64
|
+
noCopyPaste: n === "STUDENT",
|
|
65
65
|
noMusic: !0,
|
|
66
66
|
noAudio: !0
|
|
67
|
-
}, C = (
|
|
67
|
+
}, C = (e, t) => e === "canvas" ? {
|
|
68
68
|
sidebarTiles: !1,
|
|
69
69
|
sidebarSettings: !1,
|
|
70
70
|
settings: !1,
|
|
71
71
|
toolbar: !1,
|
|
72
72
|
canvasMargin: 0
|
|
73
73
|
} : {
|
|
74
|
-
sidebarTiles:
|
|
74
|
+
sidebarTiles: t === "TEACHER",
|
|
75
75
|
sidebarSettings: !1,
|
|
76
76
|
settings: !1,
|
|
77
77
|
toolbar: !1
|
|
78
|
-
}, d = (
|
|
79
|
-
const
|
|
80
|
-
return
|
|
81
|
-
|
|
82
|
-
}),
|
|
83
|
-
}, O = (
|
|
84
|
-
switch (
|
|
78
|
+
}, d = (e) => [e[1], e[0]], v = (e) => {
|
|
79
|
+
const t = /* @__PURE__ */ new Map();
|
|
80
|
+
return e.forEach((o, n) => {
|
|
81
|
+
t.set(n, d(o));
|
|
82
|
+
}), t;
|
|
83
|
+
}, O = (e) => {
|
|
84
|
+
switch (e) {
|
|
85
85
|
case "pen":
|
|
86
86
|
return ["pen", "pen"];
|
|
87
87
|
case "marker":
|
|
@@ -93,7 +93,7 @@ const h = [
|
|
|
93
93
|
case "equation":
|
|
94
94
|
return ["text", "equation"];
|
|
95
95
|
default:
|
|
96
|
-
return [
|
|
96
|
+
return [e, void 0];
|
|
97
97
|
}
|
|
98
98
|
}, g = [
|
|
99
99
|
"pen",
|
|
@@ -136,17 +136,17 @@ const h = [
|
|
|
136
136
|
"move",
|
|
137
137
|
"undo",
|
|
138
138
|
"redo"
|
|
139
|
-
], T = ["pen", "ruler", "eraser", "move", "undo", "redo"], R = (
|
|
140
|
-
(
|
|
141
|
-
) :
|
|
142
|
-
const
|
|
143
|
-
for (let c = 0; c <
|
|
144
|
-
i[c] =
|
|
139
|
+
], T = ["pen", "ruler", "eraser", "move", "undo", "redo"], R = (e, t) => t === "whiteboard" ? e === "TEACHER" ? g : A : e === "TEACHER" ? p : T, N = (e, t = "canvas") => t === "whiteboard" ? Object.keys(u).filter(
|
|
140
|
+
(o) => !o.startsWith("CANVAS")
|
|
141
|
+
) : e === "TEACHER" ? ["CANVAS_RED", "CANVAS_YELLOW", "CANVAS_GREEN"] : ["CANVAS_BLUE", "CANVAS_PURPLE", "CANVAS_PINK"], _ = (e) => ["pen", "ruler", "marker", "highlighter"].includes(e), k = (e) => Object.values(e).some((t) => !!(!t[0] && t[1] && "name" in t[1] && (t[1].name === "text" || t[1].name === "equation"))), q = (e) => {
|
|
142
|
+
const t = e.split(","), o = t[0] ?? "", n = t[1] ?? "", r = o.includes("base64") ? atob(n) : decodeURIComponent(n), a = o.match(/:(.*?);/), l = a ? a[1] : "application/octet-stream", i = new Uint8Array(r.length);
|
|
143
|
+
for (let c = 0; c < r.length; c++)
|
|
144
|
+
i[c] = r.charCodeAt(c);
|
|
145
145
|
return new Blob([i], { type: l });
|
|
146
146
|
};
|
|
147
147
|
export {
|
|
148
|
-
|
|
149
|
-
|
|
148
|
+
S as GRID_NAMES,
|
|
149
|
+
m as STATELESS_TOOLS,
|
|
150
150
|
k as checkTextOrEquationTool,
|
|
151
151
|
q as dataURIToBlob,
|
|
152
152
|
f as getCanvasConfig,
|
|
@@ -157,8 +157,8 @@ export {
|
|
|
157
157
|
v as getReverseMap,
|
|
158
158
|
O as getToolAndSubtool,
|
|
159
159
|
R as getUserTools,
|
|
160
|
-
|
|
160
|
+
y as removeMask,
|
|
161
161
|
b as removeMusicTiles,
|
|
162
|
-
|
|
162
|
+
E as removeTileButton
|
|
163
163
|
};
|
|
164
164
|
//# sourceMappingURL=cue-canvas-helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cue-canvas-helpers.js","sources":["../../../src/features/cue-canvas/cue-canvas-helpers.ts"],"sourcesContent":["import type { TUserTypes } from '../ui/types';\nimport type {\n TCueCanvasColors,\n TCueCanvasChangeData,\n TCueCanvasTool,\n TCueCanvasToolOption,\n TDrawingData,\n TRenderAs,\n TCueCanvasGridName,\n TCueCanvasChangeDataObject,\n} from './types/cue-canvas';\nimport type { IPolypadCreateOptions, IPolypadOptions } from './types/polypad';\n\nimport { CANVAS_COLORS } from './constants/constants';\n\nexport const GRID_NAMES: TCueCanvasGridName[] = [\n 'none',\n 'square2-grid',\n 'square-checked',\n 'square-dots',\n 'tri-dots',\n 'tri2-dots',\n 'square-grid',\n 'tri-grid',\n 'tri2-grid',\n];\n\nexport const STATELESS_TOOLS = new Set<TCueCanvasTool>([\n 'undo',\n 'redo',\n 'clearAll',\n 'home',\n 'lock',\n 'unlock',\n 'zoomIn',\n 'zoomOut',\n 'upload',\n 'download',\n]);\n\nexport const removeMask = (canvasElementRef: React.RefObject<HTMLDivElement>) => {\n const shadowRoot = canvasElementRef.current?.shadowRoot;\n\n if (shadowRoot) {\n const xPolypad = shadowRoot.querySelectorAll('x-polypad');\n\n if (xPolypad[0]) {\n const svgCanvas = xPolypad[0].querySelector('svg.canvas');\n const maskPath = svgCanvas?.querySelector('path.mask');\n\n maskPath?.setAttribute('stroke', 'transparent');\n maskPath?.setAttribute('fill', 'transparent');\n maskPath?.removeAttribute('style');\n }\n }\n\n return undefined;\n};\n\nexport const removeTileButton = (canvasElementRef: React.RefObject<HTMLDivElement>) => {\n const shadowRoot = canvasElementRef.current?.shadowRoot;\n const sidebar = shadowRoot?.querySelector('x-pp-sidebar') as HTMLElement;\n const tabsHeader = sidebar?.getElementsByClassName('tabs-header');\n const tabsBody = sidebar?.getElementsByClassName('tabs-body');\n\n sidebar?.setAttribute('style', 'display: none;');\n sidebar?.setAttribute('style', 'height: 30px;');\n\n if (tabsHeader && tabsHeader.length > 0) {\n const firstTabHeader = tabsHeader[0] as HTMLElement;\n\n firstTabHeader.style.display = 'none';\n }\n\n if (tabsBody && tabsBody.length > 0) {\n const firstTabBody = tabsBody[0] as HTMLElement;\n\n firstTabBody.style.top = '48px';\n }\n sidebar?.setAttribute('style', 'display: block;');\n};\n\nexport const removeMusicTiles = (canvasElementRef: React.RefObject<HTMLDivElement>) => {\n const musicTiles = canvasElementRef.current.shadowRoot?.querySelectorAll(`[data-key=\"music\"]`)[0];\n\n // hiding music tiles\n if (musicTiles) {\n (musicTiles as HTMLElement).style.display = 'none';\n }\n};\n\nexport const getCanvasConfig = (\n width: number,\n height: number,\n renderAs: TRenderAs,\n userType: TUserTypes,\n): IPolypadOptions => {\n return renderAs === 'canvas'\n ? {\n canvas: 'notebook',\n canvasX: width,\n canvasY: height,\n noPinchPan: true,\n grid: 'none',\n background: 'transparent',\n noSnapping: true,\n }\n : {\n canvas: 'infinite',\n canvasX: width,\n canvasY: height,\n grid: 'none',\n noPinchPan: userType === 'STUDENT',\n noDeleting: userType === 'STUDENT',\n noCopyPaste: userType === 'STUDENT',\n noMusic: true,\n noAudio: true,\n };\n};\n\nexport const getCanvasSettings = (\n renderAs: TRenderAs,\n userType: TUserTypes,\n): IPolypadCreateOptions => {\n return renderAs === 'canvas'\n ? {\n sidebarTiles: false,\n sidebarSettings: false,\n settings: false,\n toolbar: false,\n canvasMargin: 0,\n }\n : {\n sidebarTiles: userType === 'TEACHER',\n sidebarSettings: false,\n settings: false,\n toolbar: false,\n };\n};\n\nexport const getReverseAction = (action: TDrawingData[]) => [action[1], action[0]];\n\nexport const getReverseMap = (data: TCueCanvasChangeData) => {\n const newData = new Map<string, TDrawingData[]>();\n\n data.forEach((value, key) => {\n newData.set(key, getReverseAction(value));\n });\n\n return newData;\n};\n\nexport const getToolAndSubtool = (\n tool: TCueCanvasTool,\n): [\n Exclude<TCueCanvasTool, 'marker' | 'highlighter' | 'ruler' | 'equation'>,\n TCueCanvasToolOption | undefined,\n] => {\n switch (tool) {\n case 'pen':\n return ['pen', 'pen'];\n case 'marker':\n return ['pen', 'marker'];\n case 'highlighter':\n return ['pen', 'highlighter'];\n case 'ruler':\n return ['pen', 'ruler'];\n case 'equation':\n return ['text', 'equation'];\n default:\n return [tool, undefined];\n }\n};\n\nconst TEACHER_WHITEBOARD_TOOLS: TCueCanvasTool[] = [\n 'pen',\n 'ruler',\n 'marker',\n 'highlighter',\n 'eraser',\n 'move',\n 'lock',\n 'unlock',\n 'zoomIn',\n 'zoomOut',\n 'pan',\n 'clearAll',\n 'text',\n 'equation',\n 'grid',\n 'home',\n 'undo',\n 'redo',\n\n 'upload',\n 'download',\n];\n\nconst STUDENT_WHITEBOARD_TOOLS: TCueCanvasTool[] = [\n 'pen',\n 'ruler',\n 'marker',\n 'highlighter',\n 'eraser',\n 'move',\n 'text',\n 'undo',\n 'redo',\n 'download',\n];\n\nconst TEACHER_DEFAULT_TOOLS: TCueCanvasTool[] = [\n 'pen',\n 'ruler',\n 'marker',\n 'highlighter',\n 'eraser',\n 'move',\n 'undo',\n 'redo',\n];\n\nconst STUDENT_DEFAULT_TOOLS: TCueCanvasTool[] = ['pen', 'ruler', 'eraser', 'move', 'undo', 'redo'];\n\nexport const getUserTools = (userType: TUserTypes, renderAs: TRenderAs): TCueCanvasTool[] => {\n if (renderAs === 'whiteboard') {\n return userType === 'TEACHER' ? TEACHER_WHITEBOARD_TOOLS : STUDENT_WHITEBOARD_TOOLS;\n }\n\n return userType === 'TEACHER' ? TEACHER_DEFAULT_TOOLS : STUDENT_DEFAULT_TOOLS;\n};\n\nexport const getColorsForUser = (userType: TUserTypes, renderAs: TRenderAs = 'canvas') => {\n if (renderAs === 'whiteboard') {\n return Object.keys(CANVAS_COLORS).filter(\n color => !color.startsWith('CANVAS'),\n ) as TCueCanvasColors[];\n }\n\n return userType === 'TEACHER'\n ? (['CANVAS_RED', 'CANVAS_YELLOW', 'CANVAS_GREEN'] as TCueCanvasColors[])\n : (['CANVAS_BLUE', 'CANVAS_PURPLE', 'CANVAS_PINK'] as TCueCanvasColors[]);\n};\n\nexport const getIsWritingTool = (penTool: string) => {\n return ['pen', 'ruler', 'marker', 'highlighter'].includes(penTool);\n};\n\nexport const checkTextOrEquationTool = (payload: TCueCanvasChangeDataObject) => {\n return Object.values(payload).some(value => {\n if (\n !value[0] &&\n value[1] &&\n 'name' in value[1] &&\n (value[1].name === 'text' || value[1].name === 'equation')\n ) {\n return true;\n }\n\n return false;\n });\n};\n\nexport const dataURIToBlob = (dataURI: string): Blob => {\n const parts = dataURI.split(',');\n const metadata = parts[0] ?? '';\n const base64Data = parts[1] ?? '';\n\n const isBase64 = metadata.includes('base64');\n const byteString = isBase64 ? atob(base64Data) : decodeURIComponent(base64Data);\n\n const mimeTypeMatch = metadata.match(/:(.*?);/);\n const mimeType = mimeTypeMatch ? mimeTypeMatch[1] : 'application/octet-stream';\n\n const byteArray = new Uint8Array(byteString.length);\n\n for (let i = 0; i < byteString.length; i++) {\n byteArray[i] = byteString.charCodeAt(i);\n }\n\n return new Blob([byteArray], { type: mimeType });\n};\n\nexport const jsonToBlob = (json: unknown) => {\n const data = JSON.stringify(json);\n\n return new Blob([data], {\n type: 'application/json',\n });\n};\n"],"names":["GRID_NAMES","STATELESS_TOOLS","removeMask","canvasElementRef","shadowRoot","_a","xPolypad","svgCanvas","maskPath","removeTileButton","sidebar","tabsHeader","tabsBody","firstTabHeader","firstTabBody","removeMusicTiles","musicTiles","getCanvasConfig","width","height","renderAs","userType","getCanvasSettings","getReverseAction","action","getReverseMap","data","newData","value","key","getToolAndSubtool","tool","TEACHER_WHITEBOARD_TOOLS","STUDENT_WHITEBOARD_TOOLS","TEACHER_DEFAULT_TOOLS","STUDENT_DEFAULT_TOOLS","getUserTools","getColorsForUser","CANVAS_COLORS","color","getIsWritingTool","penTool","checkTextOrEquationTool","payload","dataURIToBlob","dataURI","parts","metadata","base64Data","byteString","mimeTypeMatch","mimeType","byteArray","i"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cue-canvas-helpers.js","sources":["../../../src/features/cue-canvas/cue-canvas-helpers.ts"],"sourcesContent":["import type { TUserTypes } from '../ui/types';\nimport type {\n TCueCanvasColors,\n TCueCanvasChangeData,\n TCueCanvasTool,\n TCueCanvasToolOption,\n TDrawingData,\n TRenderAs,\n TCueCanvasGridName,\n TCueCanvasChangeDataObject,\n} from './types/cue-canvas';\nimport type { IPolypadCreateOptions, IPolypadOptions } from './types/polypad';\n\nimport { CANVAS_COLORS } from './constants/constants';\n\nexport const GRID_NAMES: TCueCanvasGridName[] = [\n 'none',\n 'square2-grid',\n 'square-checked',\n 'square-dots',\n 'tri-dots',\n 'tri2-dots',\n 'square-grid',\n 'tri-grid',\n 'tri2-grid',\n];\n\nexport const STATELESS_TOOLS = new Set<TCueCanvasTool>([\n 'undo',\n 'redo',\n 'clearAll',\n 'home',\n 'lock',\n 'unlock',\n 'zoomIn',\n 'zoomOut',\n 'upload',\n 'download',\n]);\n\nexport const removeMask = (canvasElementRef: React.RefObject<HTMLDivElement>) => {\n const shadowRoot = canvasElementRef.current?.shadowRoot;\n\n if (shadowRoot) {\n const xPolypad = shadowRoot.querySelectorAll('x-polypad');\n\n if (xPolypad[0]) {\n const svgCanvas = xPolypad[0].querySelector('svg.canvas');\n const maskPath = svgCanvas?.querySelector('path.mask');\n\n maskPath?.setAttribute('stroke', 'transparent');\n maskPath?.setAttribute('fill', 'transparent');\n maskPath?.removeAttribute('style');\n }\n }\n\n return undefined;\n};\n\nexport const removeTileButton = (canvasElementRef: React.RefObject<HTMLDivElement>) => {\n const shadowRoot = canvasElementRef.current?.shadowRoot;\n const sidebar = shadowRoot?.querySelector('x-pp-sidebar') as HTMLElement;\n const tabsHeader = sidebar?.getElementsByClassName('tabs-header');\n const tabsBody = sidebar?.getElementsByClassName('tabs-body');\n\n sidebar?.setAttribute('style', 'display: none;');\n sidebar?.setAttribute('style', 'height: 30px;');\n\n if (tabsHeader && tabsHeader.length > 0) {\n const firstTabHeader = tabsHeader[0] as HTMLElement;\n\n firstTabHeader.style.display = 'none';\n }\n\n if (tabsBody && tabsBody.length > 0) {\n const firstTabBody = tabsBody[0] as HTMLElement;\n\n firstTabBody.style.top = '48px';\n }\n sidebar?.setAttribute('style', 'display: block;');\n};\n\n/**\n * Hides the music and logic tiles in the canvas to prevent CORS issues with audio elements\n * @param canvasElementRef - Reference to the canvas div element\n */\nexport const removeMusicTiles = (canvasElementRef: React.RefObject<HTMLDivElement>) => {\n const musicTiles = canvasElementRef.current.shadowRoot?.querySelectorAll(`[data-key=\"music\"]`)[0];\n const logicTiles = canvasElementRef.current.shadowRoot?.querySelectorAll(`[data-key=\"logic\"]`)[0];\n\n if (musicTiles) {\n (musicTiles as HTMLElement).style.display = 'none';\n }\n\n if (logicTiles) {\n (logicTiles as HTMLElement).style.display = 'none';\n }\n};\n\nexport const getCanvasConfig = (\n width: number,\n height: number,\n renderAs: TRenderAs,\n userType: TUserTypes,\n): IPolypadOptions => {\n return renderAs === 'canvas'\n ? {\n canvas: 'notebook',\n canvasX: width,\n canvasY: height,\n noPinchPan: true,\n grid: 'none',\n background: 'transparent',\n noSnapping: true,\n }\n : {\n canvas: 'infinite',\n canvasX: width,\n canvasY: height,\n grid: 'none',\n noPinchPan: userType === 'STUDENT',\n noDeleting: userType === 'STUDENT',\n noCopyPaste: userType === 'STUDENT',\n noMusic: true,\n noAudio: true,\n };\n};\n\nexport const getCanvasSettings = (\n renderAs: TRenderAs,\n userType: TUserTypes,\n): IPolypadCreateOptions => {\n return renderAs === 'canvas'\n ? {\n sidebarTiles: false,\n sidebarSettings: false,\n settings: false,\n toolbar: false,\n canvasMargin: 0,\n }\n : {\n sidebarTiles: userType === 'TEACHER',\n sidebarSettings: false,\n settings: false,\n toolbar: false,\n };\n};\n\nexport const getReverseAction = (action: TDrawingData[]) => [action[1], action[0]];\n\nexport const getReverseMap = (data: TCueCanvasChangeData) => {\n const newData = new Map<string, TDrawingData[]>();\n\n data.forEach((value, key) => {\n newData.set(key, getReverseAction(value));\n });\n\n return newData;\n};\n\nexport const getToolAndSubtool = (\n tool: TCueCanvasTool,\n): [\n Exclude<TCueCanvasTool, 'marker' | 'highlighter' | 'ruler' | 'equation'>,\n TCueCanvasToolOption | undefined,\n] => {\n switch (tool) {\n case 'pen':\n return ['pen', 'pen'];\n case 'marker':\n return ['pen', 'marker'];\n case 'highlighter':\n return ['pen', 'highlighter'];\n case 'ruler':\n return ['pen', 'ruler'];\n case 'equation':\n return ['text', 'equation'];\n default:\n return [tool, undefined];\n }\n};\n\nconst TEACHER_WHITEBOARD_TOOLS: TCueCanvasTool[] = [\n 'pen',\n 'ruler',\n 'marker',\n 'highlighter',\n 'eraser',\n 'move',\n 'lock',\n 'unlock',\n 'zoomIn',\n 'zoomOut',\n 'pan',\n 'clearAll',\n 'text',\n 'equation',\n 'grid',\n 'home',\n 'undo',\n 'redo',\n\n 'upload',\n 'download',\n];\n\nconst STUDENT_WHITEBOARD_TOOLS: TCueCanvasTool[] = [\n 'pen',\n 'ruler',\n 'marker',\n 'highlighter',\n 'eraser',\n 'move',\n 'text',\n 'undo',\n 'redo',\n 'download',\n];\n\nconst TEACHER_DEFAULT_TOOLS: TCueCanvasTool[] = [\n 'pen',\n 'ruler',\n 'marker',\n 'highlighter',\n 'eraser',\n 'move',\n 'undo',\n 'redo',\n];\n\nconst STUDENT_DEFAULT_TOOLS: TCueCanvasTool[] = ['pen', 'ruler', 'eraser', 'move', 'undo', 'redo'];\n\nexport const getUserTools = (userType: TUserTypes, renderAs: TRenderAs): TCueCanvasTool[] => {\n if (renderAs === 'whiteboard') {\n return userType === 'TEACHER' ? TEACHER_WHITEBOARD_TOOLS : STUDENT_WHITEBOARD_TOOLS;\n }\n\n return userType === 'TEACHER' ? TEACHER_DEFAULT_TOOLS : STUDENT_DEFAULT_TOOLS;\n};\n\nexport const getColorsForUser = (userType: TUserTypes, renderAs: TRenderAs = 'canvas') => {\n if (renderAs === 'whiteboard') {\n return Object.keys(CANVAS_COLORS).filter(\n color => !color.startsWith('CANVAS'),\n ) as TCueCanvasColors[];\n }\n\n return userType === 'TEACHER'\n ? (['CANVAS_RED', 'CANVAS_YELLOW', 'CANVAS_GREEN'] as TCueCanvasColors[])\n : (['CANVAS_BLUE', 'CANVAS_PURPLE', 'CANVAS_PINK'] as TCueCanvasColors[]);\n};\n\nexport const getIsWritingTool = (penTool: string) => {\n return ['pen', 'ruler', 'marker', 'highlighter'].includes(penTool);\n};\n\nexport const checkTextOrEquationTool = (payload: TCueCanvasChangeDataObject) => {\n return Object.values(payload).some(value => {\n if (\n !value[0] &&\n value[1] &&\n 'name' in value[1] &&\n (value[1].name === 'text' || value[1].name === 'equation')\n ) {\n return true;\n }\n\n return false;\n });\n};\n\nexport const dataURIToBlob = (dataURI: string): Blob => {\n const parts = dataURI.split(',');\n const metadata = parts[0] ?? '';\n const base64Data = parts[1] ?? '';\n\n const isBase64 = metadata.includes('base64');\n const byteString = isBase64 ? atob(base64Data) : decodeURIComponent(base64Data);\n\n const mimeTypeMatch = metadata.match(/:(.*?);/);\n const mimeType = mimeTypeMatch ? mimeTypeMatch[1] : 'application/octet-stream';\n\n const byteArray = new Uint8Array(byteString.length);\n\n for (let i = 0; i < byteString.length; i++) {\n byteArray[i] = byteString.charCodeAt(i);\n }\n\n return new Blob([byteArray], { type: mimeType });\n};\n\nexport const jsonToBlob = (json: unknown) => {\n const data = JSON.stringify(json);\n\n return new Blob([data], {\n type: 'application/json',\n });\n};\n"],"names":["GRID_NAMES","STATELESS_TOOLS","removeMask","canvasElementRef","shadowRoot","_a","xPolypad","svgCanvas","maskPath","removeTileButton","sidebar","tabsHeader","tabsBody","firstTabHeader","firstTabBody","removeMusicTiles","musicTiles","logicTiles","_b","getCanvasConfig","width","height","renderAs","userType","getCanvasSettings","getReverseAction","action","getReverseMap","data","newData","value","key","getToolAndSubtool","tool","TEACHER_WHITEBOARD_TOOLS","STUDENT_WHITEBOARD_TOOLS","TEACHER_DEFAULT_TOOLS","STUDENT_DEFAULT_TOOLS","getUserTools","getColorsForUser","CANVAS_COLORS","color","getIsWritingTool","penTool","checkTextOrEquationTool","payload","dataURIToBlob","dataURI","parts","metadata","base64Data","byteString","mimeTypeMatch","mimeType","byteArray","i"],"mappings":"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"}
|
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
import { useState as l, useMemo as w, useCallback as
|
|
2
|
-
import { useUIContext as
|
|
1
|
+
import { useState as l, useMemo as w, useCallback as c, useEffect as x } from "react";
|
|
2
|
+
import { useUIContext as p } from "../ui/context/context.js";
|
|
3
3
|
const b = (u) => {
|
|
4
|
-
const [f,
|
|
4
|
+
const [f, s] = l({}), t = w(() => {
|
|
5
5
|
const e = window.AudioContext || window.webkitAudioContext;
|
|
6
6
|
return e ? new e() : null;
|
|
7
|
-
}, []), { onEvent: o } =
|
|
8
|
-
async (e,
|
|
7
|
+
}, []), { onEvent: o } = p(), a = c(
|
|
8
|
+
async (e, n) => {
|
|
9
9
|
if (!t) {
|
|
10
|
-
o("audio_context_not_found", { name:
|
|
10
|
+
o("audio_context_not_found", { name: n });
|
|
11
11
|
return;
|
|
12
12
|
}
|
|
13
13
|
try {
|
|
14
14
|
const i = await (await fetch(e)).arrayBuffer(), d = await t.decodeAudioData(i);
|
|
15
|
-
|
|
16
|
-
} catch (
|
|
17
|
-
o("audio_fetch_failed", { error:
|
|
15
|
+
s((_) => ({ ..._, [n]: d }));
|
|
16
|
+
} catch (r) {
|
|
17
|
+
o("audio_fetch_failed", { error: r });
|
|
18
18
|
}
|
|
19
19
|
},
|
|
20
20
|
[t, o]
|
|
21
21
|
);
|
|
22
|
-
return
|
|
23
|
-
a(e,
|
|
22
|
+
return x(() => (u.forEach(({ url: e, name: n }) => {
|
|
23
|
+
a(e, n);
|
|
24
24
|
}), () => {
|
|
25
25
|
try {
|
|
26
26
|
t && (t.state === "running" || t.state === "suspended") && t.close();
|
|
27
27
|
} catch (e) {
|
|
28
28
|
o("audio_context_closing_failed", { error: e });
|
|
29
29
|
}
|
|
30
|
-
}), [u, t, a, o]),
|
|
30
|
+
}), [u, t, a, o]), c(
|
|
31
31
|
(e) => {
|
|
32
|
-
const r = f[e];
|
|
33
32
|
if (!t) {
|
|
34
33
|
o("audio_context_not_found", { name: e });
|
|
35
34
|
return;
|
|
36
35
|
}
|
|
37
|
-
|
|
36
|
+
const n = f[e];
|
|
37
|
+
if (!n) {
|
|
38
38
|
o("audio_buffer_not_found", { name: e });
|
|
39
39
|
return;
|
|
40
40
|
}
|
|
41
|
-
const
|
|
42
|
-
|
|
41
|
+
const r = t.createBufferSource();
|
|
42
|
+
r.buffer = n, r.connect(t.destination), r.start();
|
|
43
43
|
},
|
|
44
44
|
[f, t, o]
|
|
45
45
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-audio-player.js","sources":["../../../src/features/hooks/use-audio-player.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { useUIContext } from '../ui/context/context';\n\ndeclare global {\n interface Window {\n webkitAudioContext?: AudioContext;\n }\n}\n\nconst useAudioPlayer = (audioUrls: { url: string; name: string }[]) => {\n const [audioBuffers, setAudioBuffers] = useState<Record<string, AudioBuffer | null>>({});\n\n const context = useMemo(() => {\n const Ctx = window.AudioContext || window.webkitAudioContext;\n\n if (Ctx) {\n return new Ctx();\n }\n\n return null;\n }, []);\n\n const { onEvent: trackEvent } = useUIContext();\n\n const getAudioBuffer = useCallback(\n async (url: string, name: string) => {\n if (!context) {\n trackEvent('audio_context_not_found', { name });\n\n return;\n }\n\n try {\n const response = await fetch(url);\n const arrayBuffer = await response.arrayBuffer();\n const audioBuffer = await context.decodeAudioData(arrayBuffer);\n\n setAudioBuffers(prev => ({ ...prev, [name]: audioBuffer }));\n } catch (e) {\n trackEvent('audio_fetch_failed', { error: e });\n }\n },\n [context, trackEvent],\n );\n\n useEffect(() => {\n audioUrls.forEach(({ url, name }) => {\n getAudioBuffer(url, name);\n });\n\n return () => {\n try {\n if (context && (context.state === 'running' || context.state === 'suspended')) {\n context.close();\n }\n } catch (e) {\n trackEvent('audio_context_closing_failed', { error: e });\n }\n };\n }, [audioUrls, context, getAudioBuffer, trackEvent]);\n\n const playSound = useCallback(\n (name: string) => {\n
|
|
1
|
+
{"version":3,"file":"use-audio-player.js","sources":["../../../src/features/hooks/use-audio-player.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { useUIContext } from '../ui/context/context';\n\ndeclare global {\n interface Window {\n webkitAudioContext?: AudioContext;\n }\n}\n\nconst useAudioPlayer = (audioUrls: { url: string; name: string }[]) => {\n const [audioBuffers, setAudioBuffers] = useState<Record<string, AudioBuffer | null>>({});\n\n const context = useMemo(() => {\n const Ctx = window.AudioContext || window.webkitAudioContext;\n\n if (Ctx) {\n return new Ctx();\n }\n\n return null;\n }, []);\n\n const { onEvent: trackEvent } = useUIContext();\n\n const getAudioBuffer = useCallback(\n async (url: string, name: string) => {\n if (!context) {\n trackEvent('audio_context_not_found', { name });\n\n return;\n }\n\n try {\n const response = await fetch(url);\n const arrayBuffer = await response.arrayBuffer();\n const audioBuffer = await context.decodeAudioData(arrayBuffer);\n\n setAudioBuffers(prev => ({ ...prev, [name]: audioBuffer }));\n } catch (e) {\n trackEvent('audio_fetch_failed', { error: e });\n }\n },\n [context, trackEvent],\n );\n\n useEffect(() => {\n audioUrls.forEach(({ url, name }) => {\n getAudioBuffer(url, name);\n });\n\n return () => {\n try {\n if (context && (context.state === 'running' || context.state === 'suspended')) {\n context.close();\n }\n } catch (e) {\n trackEvent('audio_context_closing_failed', { error: e });\n }\n };\n }, [audioUrls, context, getAudioBuffer, trackEvent]);\n\n const playSound = useCallback(\n (name: string) => {\n if (!context) {\n trackEvent('audio_context_not_found', { name });\n\n return;\n }\n\n const buffer = audioBuffers[name];\n\n if (!buffer) {\n trackEvent('audio_buffer_not_found', { name });\n\n return;\n }\n\n const source = context.createBufferSource();\n\n source.buffer = buffer;\n source.connect(context.destination);\n source.start();\n },\n [audioBuffers, context, trackEvent],\n );\n\n return playSound;\n};\n\nexport default useAudioPlayer;\n"],"names":["useAudioPlayer","audioUrls","audioBuffers","setAudioBuffers","useState","context","useMemo","Ctx","trackEvent","useUIContext","getAudioBuffer","useCallback","url","name","arrayBuffer","audioBuffer","prev","e","useEffect","buffer","source"],"mappings":";;AAUM,MAAAA,IAAiB,CAACC,MAA+C;AACrE,QAAM,CAACC,GAAcC,CAAe,IAAIC,EAA6C,CAAE,CAAA,GAEjFC,IAAUC,EAAQ,MAAM;AACtB,UAAAC,IAAM,OAAO,gBAAgB,OAAO;AAE1C,WAAIA,IACK,IAAIA,EAAI,IAGV;AAAA,EACT,GAAG,CAAE,CAAA,GAEC,EAAE,SAASC,EAAW,IAAIC,EAAa,GAEvCC,IAAiBC;AAAA,IACrB,OAAOC,GAAaC,MAAiB;AACnC,UAAI,CAACR,GAAS;AACD,QAAAG,EAAA,2BAA2B,EAAE,MAAAK,EAAA,CAAM;AAE9C;AAAA,MACF;AAEI,UAAA;AAEI,cAAAC,IAAc,OADH,MAAM,MAAMF,CAAG,GACG,eAC7BG,IAAc,MAAMV,EAAQ,gBAAgBS,CAAW;AAE7C,QAAAX,EAAA,CAAAa,OAAS,EAAE,GAAGA,GAAM,CAACH,CAAI,GAAGE,EAAc,EAAA;AAAA,eACnDE,GAAG;AACV,QAAAT,EAAW,sBAAsB,EAAE,OAAOS,EAAG,CAAA;AAAA,MAC/C;AAAA,IACF;AAAA,IACA,CAACZ,GAASG,CAAU;AAAA,EAAA;AAGtB,SAAAU,EAAU,OACRjB,EAAU,QAAQ,CAAC,EAAE,KAAAW,GAAK,MAAAC,QAAW;AACnC,IAAAH,EAAeE,GAAKC,CAAI;AAAA,EAAA,CACzB,GAEM,MAAM;AACP,QAAA;AACF,MAAIR,MAAYA,EAAQ,UAAU,aAAaA,EAAQ,UAAU,gBAC/DA,EAAQ,MAAM;AAAA,aAET,GAAG;AACV,MAAAG,EAAW,gCAAgC,EAAE,OAAO,EAAG,CAAA;AAAA,IACzD;AAAA,EAAA,IAED,CAACP,GAAWI,GAASK,GAAgBF,CAAU,CAAC,GAEjCG;AAAA,IAChB,CAACE,MAAiB;AAChB,UAAI,CAACR,GAAS;AACD,QAAAG,EAAA,2BAA2B,EAAE,MAAAK,EAAA,CAAM;AAE9C;AAAA,MACF;AAEM,YAAAM,IAASjB,EAAaW,CAAI;AAEhC,UAAI,CAACM,GAAQ;AACA,QAAAX,EAAA,0BAA0B,EAAE,MAAAK,EAAA,CAAM;AAE7C;AAAA,MACF;AAEM,YAAAO,IAASf,EAAQ;AAEvB,MAAAe,EAAO,SAASD,GACTC,EAAA,QAAQf,EAAQ,WAAW,GAClCe,EAAO,MAAM;AAAA,IACf;AAAA,IACA,CAAClB,GAAcG,GAASG,CAAU;AAAA,EAAA;AAItC;"}
|
|
@@ -6206,22 +6206,18 @@ Polypad API v4.5.4, (c) Mathigon
|
|
|
6206
6206
|
|
|
6207
6207
|
window.addEventListener('online', $g);
|
|
6208
6208
|
window.onbeforeunload = Rh;
|
|
6209
|
-
// AUDIO NEUTRALIZED: Modified to prevent any audio loading or playing
|
|
6210
6209
|
let be = class {
|
|
6211
6210
|
constructor(e, s = 1, t = !0) {
|
|
6212
|
-
|
|
6213
|
-
|
|
6214
|
-
|
|
6215
|
-
|
|
6216
|
-
|
|
6217
|
-
currentTime: 0,
|
|
6218
|
-
volume: 0,
|
|
6219
|
-
play: () => Promise.resolve(),
|
|
6220
|
-
preload: 'none'
|
|
6221
|
-
};
|
|
6211
|
+
(this.src = e),
|
|
6212
|
+
(this.defaultVolume = s),
|
|
6213
|
+
(this.player = new Audio()),
|
|
6214
|
+
(this.player.src = e),
|
|
6215
|
+
t && (this.player.preload = 'auto');
|
|
6222
6216
|
}
|
|
6223
6217
|
play(e) {
|
|
6224
|
-
|
|
6218
|
+
(this.player.currentTime = 0),
|
|
6219
|
+
(this.player.volume = e || this.defaultVolume),
|
|
6220
|
+
this.player.play();
|
|
6225
6221
|
}
|
|
6226
6222
|
},
|
|
6227
6223
|
Pg = _c(['#cd0e66', '#0f82f2', '#22ab24', '#fd8c00']),
|
|
@@ -6744,9 +6740,7 @@ Polypad API v4.5.4, (c) Mathigon
|
|
|
6744
6740
|
ll.set(e, t), Gh.set(e.toUpperCase(), s), window.customElements.define(e, i);
|
|
6745
6741
|
};
|
|
6746
6742
|
}
|
|
6747
|
-
|
|
6748
|
-
// while maintaining the same interface so that the rest of the application continues to work
|
|
6749
|
-
let Tt = { currentTime: 0, createGain: () => ({ gain: { setValueAtTime: () => {}, linearRampToValueAtTime: () => {} }, connect: () => ({ connect: () => ({}) }) }), createBufferSource: () => ({ buffer: null, playbackRate: { value: 0 }, connect: () => ({}), start: () => {} }), createOscillator: () => ({ frequency: { setValueAtTime: () => {} }, connect: () => ({}), start: () => {}, stop: () => {} }), createDynamicsCompressor: () => ({ threshold: { setValueAtTime: () => {} }, knee: { setValueAtTime: () => {} }, ratio: { setValueAtTime: () => {} }, attack: { setValueAtTime: () => {} }, release: { setValueAtTime: () => {} }, connect: () => ({}) }), createConvolver: () => ({ buffer: null, connect: () => ({}) }), decodeAudioData: () => Promise.resolve({ duration: 1 }) },
|
|
6743
|
+
let Tt = new AudioContext(),
|
|
6750
6744
|
Uo,
|
|
6751
6745
|
ds,
|
|
6752
6746
|
us = 0.05,
|
|
@@ -6758,26 +6752,31 @@ Polypad API v4.5.4, (c) Mathigon
|
|
|
6758
6752
|
function Vg() {
|
|
6759
6753
|
return H(this, null, function* () {
|
|
6760
6754
|
if (_h) return;
|
|
6761
|
-
_h = !0
|
|
6762
|
-
|
|
6763
|
-
|
|
6764
|
-
|
|
6765
|
-
|
|
6755
|
+
(_h = !0),
|
|
6756
|
+
(ds = Tt.createDynamicsCompressor()),
|
|
6757
|
+
ds.threshold.setValueAtTime(-5, 0),
|
|
6758
|
+
ds.knee.setValueAtTime(0.4, 0),
|
|
6759
|
+
ds.ratio.setValueAtTime(10, 0),
|
|
6760
|
+
ds.attack.setValueAtTime(0.1, 0),
|
|
6761
|
+
ds.release.setValueAtTime(0.25, 0),
|
|
6762
|
+
(Uo = Tt.createConvolver());
|
|
6763
|
+
const s = yield (yield fetch(`${Hh}IR13.mp3`)).arrayBuffer();
|
|
6764
|
+
|
|
6765
|
+
Uo.buffer = yield Tt.decodeAudioData(s);
|
|
6766
6766
|
});
|
|
6767
6767
|
}
|
|
6768
6768
|
function jo(e) {
|
|
6769
6769
|
if (!e || e === 'synth' || cl.has(e)) return;
|
|
6770
|
-
|
|
6771
|
-
|
|
6772
|
-
|
|
6773
|
-
|
|
6770
|
+
|
|
6771
|
+
const s = fetch(`${Hh}${e}.mp3?v=2`)
|
|
6772
|
+
.then(t => t.arrayBuffer())
|
|
6773
|
+
.then(t => Tt.decodeAudioData(t))
|
|
6774
|
+
.then(t => Fh.set(e, t))
|
|
6775
|
+
.catch(() => console.error('Unable to load sample for', e));
|
|
6776
|
+
|
|
6774
6777
|
cl.set(e, s);
|
|
6775
|
-
|
|
6776
|
-
// Set dummy audio data to prevent errors
|
|
6777
|
-
Fh.set(e, { duration: 1 });
|
|
6778
6778
|
}
|
|
6779
|
-
|
|
6780
|
-
const rr = () => 0,
|
|
6779
|
+
const rr = () => Tt.currentTime,
|
|
6781
6780
|
qh = [
|
|
6782
6781
|
{
|
|
6783
6782
|
key: 'piano',
|
|
@@ -6932,15 +6931,19 @@ Polypad API v4.5.4, (c) Mathigon
|
|
|
6932
6931
|
return t + 12 * i;
|
|
6933
6932
|
}
|
|
6934
6933
|
function Uh(e, s, t) {
|
|
6935
|
-
|
|
6936
|
-
|
|
6937
|
-
|
|
6938
|
-
|
|
6939
|
-
|
|
6940
|
-
|
|
6941
|
-
|
|
6942
|
-
|
|
6943
|
-
|
|
6934
|
+
const i = Tt.createGain();
|
|
6935
|
+
|
|
6936
|
+
i.connect(ds), i.connect(Uo).connect(ds).connect(Tt.destination);
|
|
6937
|
+
let r = e + 1e-5;
|
|
6938
|
+
|
|
6939
|
+
return (
|
|
6940
|
+
i.gain.setValueAtTime(1e-5, r),
|
|
6941
|
+
i.gain.linearRampToValueAtTime(s, (r += t[0])),
|
|
6942
|
+
i.gain.linearRampToValueAtTime(s * 0.8, (r += t[1])),
|
|
6943
|
+
i.gain.setValueAtTime(s * 0.8, (r += t[2])),
|
|
6944
|
+
i.gain.linearRampToValueAtTime(1e-5, r + t[3]),
|
|
6945
|
+
i
|
|
6946
|
+
);
|
|
6944
6947
|
}
|
|
6945
6948
|
function Zo(e, s = 'piano') {
|
|
6946
6949
|
if (e === void 0) return 0;
|
|
@@ -6952,19 +6955,19 @@ Polypad API v4.5.4, (c) Mathigon
|
|
|
6952
6955
|
return 2 ** ((e + 1) / 12 + t) || 0;
|
|
6953
6956
|
}
|
|
6954
6957
|
function Og(e, s, t, i, r) {
|
|
6955
|
-
|
|
6956
|
-
|
|
6957
|
-
|
|
6958
|
-
|
|
6959
|
-
|
|
6960
|
-
|
|
6961
|
-
a = { buffer: o, playbackRate: { value: 0 }, connect: () => {}, start: () => {} },
|
|
6958
|
+
const o = Fh.get(e);
|
|
6959
|
+
|
|
6960
|
+
if (!o) throw new Error(`Missing audio sample: ${e}`);
|
|
6961
|
+
|
|
6962
|
+
const n = Uh(t, i, r),
|
|
6963
|
+
a = Tt.createBufferSource(),
|
|
6962
6964
|
l = Zo(s, e);
|
|
6963
|
-
|
|
6964
|
-
|
|
6965
|
-
|
|
6966
|
-
|
|
6967
|
-
|
|
6965
|
+
|
|
6966
|
+
(a.playbackRate.value = l), (a.buffer = o), a.connect(n), a.start(t);
|
|
6967
|
+
const c = [a],
|
|
6968
|
+
p = a.buffer.duration / l,
|
|
6969
|
+
u = p * 0.5 > 1.5 ? 0.8 : p * 0.5,
|
|
6970
|
+
f = r[2] / 0.6,
|
|
6968
6971
|
v = f / u;
|
|
6969
6972
|
|
|
6970
6973
|
if (f > 1.1 && !Dg.has(e))
|
|
@@ -7020,7 +7023,7 @@ Polypad API v4.5.4, (c) Mathigon
|
|
|
7020
7023
|
);
|
|
7021
7024
|
}
|
|
7022
7025
|
function Zh(e = 0, s = 'piano', t = 1, i = 0.8, r = Tt.currentTime + us, o = 2, n = 8) {
|
|
7023
|
-
|
|
7026
|
+
Vg();
|
|
7024
7027
|
const a = Math.min(1, i),
|
|
7025
7028
|
l = [0.02, a * 0.1, i - a * 0.4, a * 0.3];
|
|
7026
7029
|
|
|
@@ -16887,19 +16890,18 @@ Polypad API v4.5.4, (c) Mathigon
|
|
|
16887
16890
|
};
|
|
16888
16891
|
const Ve = 'https://mathigon.org/polypad/assets/audio',
|
|
16889
16892
|
dd = {
|
|
16890
|
-
|
|
16891
|
-
|
|
16892
|
-
|
|
16893
|
-
|
|
16894
|
-
|
|
16895
|
-
|
|
16896
|
-
|
|
16897
|
-
|
|
16898
|
-
|
|
16899
|
-
|
|
16900
|
-
|
|
16901
|
-
|
|
16902
|
-
mergeCoins: { play: () => {} },
|
|
16893
|
+
roll: new be(`${Ve}/roll.mp3`, 0.6, !1),
|
|
16894
|
+
spin: new be(`${Ve}/spin.mp3`, 0.5, !1),
|
|
16895
|
+
coinToss: new be(`${Ve}/coin-toss.mp3`, 0.3, !1),
|
|
16896
|
+
shuffle: new be(`${Ve}/shuffle.mp3`, 0.3, !1),
|
|
16897
|
+
rng: new be(`${Ve}/rng-roll.mp3`, 0.3, !1),
|
|
16898
|
+
draw: new be(`${Ve}/card-draw.mp3`, 0.2, !1),
|
|
16899
|
+
click: new be(`${Ve}/click.mp3`, 0.3, !1),
|
|
16900
|
+
woosh: new be(`${Ve}/woosh.mp3`, 0.2, !1),
|
|
16901
|
+
rise: new be(`${Ve}/rise.mp3`, 0.3, !1),
|
|
16902
|
+
fall: new be(`${Ve}/fall.mp3`, 0.3, !1),
|
|
16903
|
+
splitCoins: new be(`${Ve}/split-coins.mp3`, 0.175, !1),
|
|
16904
|
+
mergeCoins: new be(`${Ve}/merge-coins.mp3`, 0.3, !1),
|
|
16903
16905
|
};
|
|
16904
16906
|
const is = 25,
|
|
16905
16907
|
tc = (is * Math.sqrt(3)) / 2,
|