@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.
@@ -1,5 +1,5 @@
1
1
  import { CANVAS_COLORS as u } from "./constants/constants.js";
2
- const h = [
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
- ], S = /* @__PURE__ */ new Set([
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
- ]), E = (n) => {
24
- var t;
25
- const e = (t = n.current) == null ? void 0 : t.shadowRoot;
26
- if (e) {
27
- const r = e.querySelectorAll("x-polypad");
28
- if (r[0]) {
29
- const s = r[0].querySelector("svg.canvas"), o = s == null ? void 0 : s.querySelector("path.mask");
30
- o == null || o.setAttribute("stroke", "transparent"), o == null || o.setAttribute("fill", "transparent"), o == null || o.removeAttribute("style");
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
- }, y = (n) => {
34
- var o;
35
- const e = (o = n.current) == null ? void 0 : o.shadowRoot, t = e == null ? void 0 : e.querySelector("x-pp-sidebar"), r = t == null ? void 0 : t.getElementsByClassName("tabs-header"), s = t == null ? void 0 : t.getElementsByClassName("tabs-body");
36
- if (t == null || t.setAttribute("style", "display: none;"), t == null || t.setAttribute("style", "height: 30px;"), r && r.length > 0) {
37
- const a = r[0];
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
- t == null || t.setAttribute("style", "display: block;");
45
- }, b = (n) => {
46
- var t;
47
- const e = (t = n.current.shadowRoot) == null ? void 0 : t.querySelectorAll('[data-key="music"]')[0];
48
- e && (e.style.display = "none");
49
- }, f = (n, e, t, r) => t === "canvas" ? {
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: n,
52
- canvasY: e,
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: n,
60
- canvasY: e,
59
+ canvasX: e,
60
+ canvasY: t,
61
61
  grid: "none",
62
- noPinchPan: r === "STUDENT",
63
- noDeleting: r === "STUDENT",
64
- noCopyPaste: r === "STUDENT",
62
+ noPinchPan: n === "STUDENT",
63
+ noDeleting: n === "STUDENT",
64
+ noCopyPaste: n === "STUDENT",
65
65
  noMusic: !0,
66
66
  noAudio: !0
67
- }, C = (n, e) => n === "canvas" ? {
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: e === "TEACHER",
74
+ sidebarTiles: t === "TEACHER",
75
75
  sidebarSettings: !1,
76
76
  settings: !1,
77
77
  toolbar: !1
78
- }, d = (n) => [n[1], n[0]], v = (n) => {
79
- const e = /* @__PURE__ */ new Map();
80
- return n.forEach((t, r) => {
81
- e.set(r, d(t));
82
- }), e;
83
- }, O = (n) => {
84
- switch (n) {
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 [n, void 0];
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 = (n, e) => e === "whiteboard" ? n === "TEACHER" ? g : A : n === "TEACHER" ? p : T, N = (n, e = "canvas") => e === "whiteboard" ? Object.keys(u).filter(
140
- (t) => !t.startsWith("CANVAS")
141
- ) : n === "TEACHER" ? ["CANVAS_RED", "CANVAS_YELLOW", "CANVAS_GREEN"] : ["CANVAS_BLUE", "CANVAS_PURPLE", "CANVAS_PINK"], _ = (n) => ["pen", "ruler", "marker", "highlighter"].includes(n), k = (n) => Object.values(n).some((e) => !!(!e[0] && e[1] && "name" in e[1] && (e[1].name === "text" || e[1].name === "equation"))), q = (n) => {
142
- const e = n.split(","), t = e[0] ?? "", r = e[1] ?? "", o = t.includes("base64") ? atob(r) : decodeURIComponent(r), a = t.match(/:(.*?);/), l = a ? a[1] : "application/octet-stream", i = new Uint8Array(o.length);
143
- for (let c = 0; c < o.length; c++)
144
- i[c] = o.charCodeAt(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
- h as GRID_NAMES,
149
- S as STATELESS_TOOLS,
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
- E as removeMask,
160
+ y as removeMask,
161
161
  b as removeMusicTiles,
162
- y as removeTileButton
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 s, useEffect as p } from "react";
2
- import { useUIContext as y } from "../ui/context/context.js";
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, c] = l({}), t = w(() => {
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 } = y(), a = s(
8
- async (e, r) => {
7
+ }, []), { onEvent: o } = p(), a = c(
8
+ async (e, n) => {
9
9
  if (!t) {
10
- o("audio_context_not_found", { name: r });
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
- c((_) => ({ ..._, [r]: d }));
16
- } catch (n) {
17
- o("audio_fetch_failed", { error: n });
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 p(() => (u.forEach(({ url: e, name: r }) => {
23
- a(e, r);
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]), s(
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
- if (!r) {
36
+ const n = f[e];
37
+ if (!n) {
38
38
  o("audio_buffer_not_found", { name: e });
39
39
  return;
40
40
  }
41
- const n = t == null ? void 0 : t.createBufferSource();
42
- n.buffer = r, n.connect(t.destination), n.start();
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 const buffer = audioBuffers[name];\n\n if (!context) {\n trackEvent('audio_context_not_found', { name });\n\n return;\n }\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;AACV,YAAAM,IAASjB,EAAaW,CAAI;AAEhC,UAAI,CAACR,GAAS;AACD,QAAAG,EAAA,2BAA2B,EAAE,MAAAK,EAAA,CAAM;AAE9C;AAAA,MACF;AAEA,UAAI,CAACM,GAAQ;AACA,QAAAX,EAAA,0BAA0B,EAAE,MAAAK,EAAA,CAAM;AAE7C;AAAA,MACF;AAEM,YAAAO,IAASf,KAAA,gBAAAA,EAAS;AAExB,MAAAe,EAAO,SAASD,GACTC,EAAA,QAAQf,EAAQ,WAAW,GAClCe,EAAO,MAAM;AAAA,IACf;AAAA,IACA,CAAClB,GAAcG,GAASG,CAAU;AAAA,EAAA;AAItC;"}
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
- // Don't actually create Audio elements or set src to prevent network requests
6213
- this.src = null;
6214
- this.defaultVolume = s;
6215
- // Create a mock player object with the same interface
6216
- this.player = {
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
- // No-op play function that does nothing
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
- // AUDIO FETCH NEUTRALIZED: This section has been modified to prevent any audio-related network requests
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
- // Audio initialization is disabled to prevent network requests
6763
- // The function structure is maintained to prevent errors
6764
- ds = { connect: () => ({ connect: () => ({ connect: () => ({}) }) }) };
6765
- Uo = { buffer: null, connect: () => ({ connect: () => ({}) }) };
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
- // No audio samples are fetched to prevent network requests
6772
- // We create a resolved promise to maintain the expected behavior
6773
- const s = Promise.resolve();
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
- // Mock audio time function
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
- // Return a mock audio gain node with all necessary methods
6936
- // but doesn't actually create any audio connections or processing
6937
- return {
6938
- gain: {
6939
- setValueAtTime: () => {},
6940
- linearRampToValueAtTime: () => {}
6941
- },
6942
- connect: () => ({ connect: () => ({ connect: () => ({}) }) })
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
- // Mock audio playback function that doesn't throw errors
6956
- // and doesn't rely on real audio samples
6957
- const o = Fh.get(e) || { duration: 1 };
6958
-
6959
- // Create a mock buffer and chain
6960
- const n = { gain: { value: 0 } },
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
- const c = [],
6965
- p = 1, // Mock duration
6966
- u = 0.8,
6967
- f = 1,
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
- // Vg();
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
- // Using mock audio objects that don't fetch anything
16891
- roll: { play: () => {} },
16892
- spin: { play: () => {} },
16893
- coinToss: { play: () => {} },
16894
- shuffle: { play: () => {} },
16895
- rng: { play: () => {} },
16896
- draw: { play: () => {} },
16897
- click: { play: () => {} },
16898
- woosh: { play: () => {} },
16899
- rise: { play: () => {} },
16900
- fall: { play: () => {} },
16901
- splitCoins: { play: () => {} },
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,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cuemath/leap",
3
- "version": "3.1.41-as3",
3
+ "version": "3.1.41-as4",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"