@hunterchen/canvas 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +196 -8
  2. package/dist/components/canvas/backgrounds.d.ts +4 -4
  3. package/dist/components/canvas/backgrounds.d.ts.map +1 -1
  4. package/dist/components/canvas/backgrounds.js +68 -39
  5. package/dist/components/canvas/backgrounds.js.map +1 -1
  6. package/dist/components/canvas/canvas.d.ts +3 -1
  7. package/dist/components/canvas/canvas.d.ts.map +1 -1
  8. package/dist/components/canvas/canvas.js +451 -387
  9. package/dist/components/canvas/canvas.js.map +1 -1
  10. package/dist/components/canvas/component.js +108 -174
  11. package/dist/components/canvas/component.js.map +1 -1
  12. package/dist/components/canvas/draggable.js +168 -151
  13. package/dist/components/canvas/draggable.js.map +1 -1
  14. package/dist/components/canvas/navbar/index.d.ts +4 -2
  15. package/dist/components/canvas/navbar/index.d.ts.map +1 -1
  16. package/dist/components/canvas/navbar/index.js +168 -101
  17. package/dist/components/canvas/navbar/index.js.map +1 -1
  18. package/dist/components/canvas/navbar/single-button.d.ts +10 -1
  19. package/dist/components/canvas/navbar/single-button.d.ts.map +1 -1
  20. package/dist/components/canvas/navbar/single-button.js +176 -69
  21. package/dist/components/canvas/navbar/single-button.js.map +1 -1
  22. package/dist/components/canvas/toolbar.js +121 -82
  23. package/dist/components/canvas/toolbar.js.map +1 -1
  24. package/dist/components/canvas/wrapper.js +127 -99
  25. package/dist/components/canvas/wrapper.js.map +1 -1
  26. package/dist/contexts/CanvasContext.js +25 -17
  27. package/dist/contexts/CanvasContext.js.map +1 -1
  28. package/dist/contexts/PerformanceContext.js +51 -50
  29. package/dist/contexts/PerformanceContext.js.map +1 -1
  30. package/dist/hooks/usePerformanceMode.js +36 -37
  31. package/dist/hooks/usePerformanceMode.js.map +1 -1
  32. package/dist/hooks/useWindowDimensions.js +22 -18
  33. package/dist/hooks/useWindowDimensions.js.map +1 -1
  34. package/dist/index.d.ts +1 -1
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +17 -21
  37. package/dist/lib/canvas.js +65 -72
  38. package/dist/lib/canvas.js.map +1 -1
  39. package/dist/lib/constants.js +78 -92
  40. package/dist/lib/constants.js.map +1 -1
  41. package/dist/lib/utils.js +10 -5
  42. package/dist/lib/utils.js.map +1 -1
  43. package/dist/styles.css +1 -1
  44. package/dist/types/index.d.ts +69 -0
  45. package/dist/types/index.d.ts.map +1 -1
  46. package/dist/utils/performance.js +18 -23
  47. package/dist/utils/performance.js.map +1 -1
  48. package/package.json +7 -21
  49. package/src/components/canvas/backgrounds.tsx +7 -7
  50. package/src/components/canvas/canvas.tsx +9 -2
  51. package/src/components/canvas/navbar/index.tsx +91 -15
  52. package/src/components/canvas/navbar/single-button.tsx +210 -56
  53. package/src/index.ts +5 -0
  54. package/src/styles.css +15 -13
  55. package/src/types/index.ts +91 -0
  56. package/dist/components/canvas/offest.js +0 -12
  57. package/dist/components/canvas/offest.js.map +0 -1
  58. package/dist/index.js.map +0 -1
  59. package/dist/types/index.js +0 -6
  60. package/dist/types/index.js.map +0 -1
@@ -1,56 +1,57 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { createContext, useContext, useEffect, useState } from "react";
3
- import useWindowDimensions from "../hooks/useWindowDimensions";
4
- import { isIOS, isMobile, prefersReducedMotion } from "../utils/performance";
1
+ import useWindowDimensions_default from "../hooks/useWindowDimensions.js";
2
+ import { isIOS, isMobile, prefersReducedMotion } from "../utils/performance.js";
3
+ import React, { createContext, useContext, useEffect, useState } from "react";
4
+ import { jsx } from "react/jsx-runtime";
5
+
6
+ //#region src/contexts/PerformanceContext.tsx
5
7
  const defaultConfig = {
6
- mode: "high",
7
- isIOS: false,
8
- isMobile: false,
9
- prefersReducedMotion: false,
10
- enableComplexShadows: true,
8
+ mode: "high",
9
+ isIOS: false,
10
+ isMobile: false,
11
+ prefersReducedMotion: false,
12
+ enableComplexShadows: true
11
13
  };
12
14
  const PerformanceContext = createContext(defaultConfig);
13
- export const usePerformance = () => useContext(PerformanceContext);
14
- // Backward compatibility alias
15
- export const usePerformanceMode = usePerformance;
15
+ const usePerformance = () => useContext(PerformanceContext);
16
+ const usePerformanceMode = usePerformance;
16
17
  /**
17
- * Performance Provider - Centralized performance mode detection
18
- *
19
- * Detects device capabilities and user preferences once at the top level,
20
- * avoiding redundant device detection across multiple components.
21
- *
22
- * Usage:
23
- * <PerformanceProvider>
24
- * <App />
25
- * </PerformanceProvider>
26
- *
27
- * Then in components:
28
- * const { mode, isIOS, enableComplexShadows } = usePerformance();
29
- */
30
- export const PerformanceProvider = ({ children }) => {
31
- const [config, setConfig] = useState(defaultConfig);
32
- const { width } = useWindowDimensions();
33
- useEffect(() => {
34
- const isIOSDevice = isIOS();
35
- const isMobileDevice = isMobile();
36
- const reducedMotion = prefersReducedMotion();
37
- let mode = "high";
38
- // Determine performance mode based on device and screen size
39
- if (isIOSDevice || reducedMotion || width < 768) {
40
- mode = "low";
41
- }
42
- else if (isMobileDevice || width < 1024) {
43
- mode = "medium";
44
- }
45
- setConfig({
46
- mode,
47
- isIOS: isIOSDevice,
48
- isMobile: isMobileDevice,
49
- prefersReducedMotion: reducedMotion,
50
- // Use simpler shadows on iOS and low-end devices for better performance
51
- enableComplexShadows: mode !== "low",
52
- });
53
- }, [width]);
54
- return (_jsx(PerformanceContext.Provider, { value: config, children: children }));
18
+ * Performance Provider - Centralized performance mode detection
19
+ *
20
+ * Detects device capabilities and user preferences once at the top level,
21
+ * avoiding redundant device detection across multiple components.
22
+ *
23
+ * Usage:
24
+ * <PerformanceProvider>
25
+ * <App />
26
+ * </PerformanceProvider>
27
+ *
28
+ * Then in components:
29
+ * const { mode, isIOS, enableComplexShadows } = usePerformance();
30
+ */
31
+ const PerformanceProvider = ({ children }) => {
32
+ const [config, setConfig] = useState(defaultConfig);
33
+ const { width } = useWindowDimensions_default();
34
+ useEffect(() => {
35
+ const isIOSDevice = isIOS();
36
+ const isMobileDevice = isMobile();
37
+ const reducedMotion = prefersReducedMotion();
38
+ let mode = "high";
39
+ if (isIOSDevice || reducedMotion || width < 768) mode = "low";
40
+ else if (isMobileDevice || width < 1024) mode = "medium";
41
+ setConfig({
42
+ mode,
43
+ isIOS: isIOSDevice,
44
+ isMobile: isMobileDevice,
45
+ prefersReducedMotion: reducedMotion,
46
+ enableComplexShadows: mode !== "low"
47
+ });
48
+ }, [width]);
49
+ return /* @__PURE__ */ jsx(PerformanceContext.Provider, {
50
+ value: config,
51
+ children
52
+ });
55
53
  };
54
+
55
+ //#endregion
56
+ export { PerformanceProvider, usePerformance, usePerformanceMode };
56
57
  //# sourceMappingURL=PerformanceContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PerformanceContext.js","sourceRoot":"","sources":["../../src/contexts/PerformanceContext.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAC9F,OAAO,mBAAmB,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAY7E,MAAM,aAAa,GAAsB;IACrC,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,KAAK;IACZ,QAAQ,EAAE,KAAK;IACf,oBAAoB,EAAE,KAAK;IAC3B,oBAAoB,EAAE,IAAI;CAC7B,CAAC;AAEF,MAAM,kBAAkB,GAAG,aAAa,CAAoB,aAAa,CAAC,CAAC;AAE3E,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;AAEnE,+BAA+B;AAC/B,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAMjD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAuC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;IACpF,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAoB,aAAa,CAAC,CAAC;IACvE,MAAM,EAAE,KAAK,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAExC,SAAS,CAAC,GAAG,EAAE;QACX,MAAM,WAAW,GAAG,KAAK,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,QAAQ,EAAE,CAAC;QAClC,MAAM,aAAa,GAAG,oBAAoB,EAAE,CAAC;QAE7C,IAAI,IAAI,GAAoB,MAAM,CAAC;QAEnC,6DAA6D;QAC7D,IAAI,WAAW,IAAI,aAAa,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;YAC9C,IAAI,GAAG,KAAK,CAAC;QACjB,CAAC;aAAM,IAAI,cAAc,IAAI,KAAK,GAAG,IAAI,EAAE,CAAC;YACxC,IAAI,GAAG,QAAQ,CAAC;QACpB,CAAC;QAED,SAAS,CAAC;YACN,IAAI;YACJ,KAAK,EAAE,WAAW;YAClB,QAAQ,EAAE,cAAc;YACxB,oBAAoB,EAAE,aAAa;YACnC,wEAAwE;YACxE,oBAAoB,EAAE,IAAI,KAAK,KAAK;SACvC,CAAC,CAAC;IACP,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,OAAO,CACH,KAAC,kBAAkB,CAAC,QAAQ,IAAC,KAAK,EAAE,MAAM,YACrC,QAAQ,GACiB,CACjC,CAAC;AACN,CAAC,CAAC"}
1
+ {"version":3,"file":"PerformanceContext.js","names":["useWindowDimensions"],"sources":["../../src/contexts/PerformanceContext.tsx"],"sourcesContent":["import React, { createContext, useContext, useEffect, useState, type ReactNode } from \"react\";\nimport useWindowDimensions from \"../hooks/useWindowDimensions\";\nimport { isIOS, isMobile, prefersReducedMotion } from \"../utils/performance\";\n\nexport type PerformanceMode = \"high\" | \"medium\" | \"low\";\n\nexport interface PerformanceConfig {\n mode: PerformanceMode;\n isIOS: boolean;\n isMobile: boolean;\n prefersReducedMotion: boolean;\n enableComplexShadows: boolean;\n}\n\nconst defaultConfig: PerformanceConfig = {\n mode: \"high\",\n isIOS: false,\n isMobile: false,\n prefersReducedMotion: false,\n enableComplexShadows: true,\n};\n\nconst PerformanceContext = createContext<PerformanceConfig>(defaultConfig);\n\nexport const usePerformance = () => useContext(PerformanceContext);\n\n// Backward compatibility alias\nexport const usePerformanceMode = usePerformance;\n\ninterface PerformanceProviderProps {\n children: ReactNode;\n}\n\n/**\n * Performance Provider - Centralized performance mode detection\n * \n * Detects device capabilities and user preferences once at the top level,\n * avoiding redundant device detection across multiple components.\n * \n * Usage:\n * <PerformanceProvider>\n * <App />\n * </PerformanceProvider>\n * \n * Then in components:\n * const { mode, isIOS, enableComplexShadows } = usePerformance();\n */\nexport const PerformanceProvider: React.FC<PerformanceProviderProps> = ({ children }) => {\n const [config, setConfig] = useState<PerformanceConfig>(defaultConfig);\n const { width } = useWindowDimensions();\n\n useEffect(() => {\n const isIOSDevice = isIOS();\n const isMobileDevice = isMobile();\n const reducedMotion = prefersReducedMotion();\n\n let mode: PerformanceMode = \"high\";\n\n // Determine performance mode based on device and screen size\n if (isIOSDevice || reducedMotion || width < 768) {\n mode = \"low\";\n } else if (isMobileDevice || width < 1024) {\n mode = \"medium\";\n }\n\n setConfig({\n mode,\n isIOS: isIOSDevice,\n isMobile: isMobileDevice,\n prefersReducedMotion: reducedMotion,\n // Use simpler shadows on iOS and low-end devices for better performance\n enableComplexShadows: mode !== \"low\",\n });\n }, [width]);\n\n return (\n <PerformanceContext.Provider value={config}>\n {children}\n </PerformanceContext.Provider>\n );\n};\n"],"mappings":";;;;;;AAcA,MAAM,gBAAmC;CACrC,MAAM;CACN,OAAO;CACP,UAAU;CACV,sBAAsB;CACtB,sBAAsB;CACzB;AAED,MAAM,qBAAqB,cAAiC,cAAc;AAE1E,MAAa,uBAAuB,WAAW,mBAAmB;AAGlE,MAAa,qBAAqB;;;;;;;;;;;;;;;AAoBlC,MAAa,uBAA2D,EAAE,eAAe;CACrF,MAAM,CAAC,QAAQ,aAAa,SAA4B,cAAc;CACtE,MAAM,EAAE,UAAUA,6BAAqB;AAEvC,iBAAgB;EACZ,MAAM,cAAc,OAAO;EAC3B,MAAM,iBAAiB,UAAU;EACjC,MAAM,gBAAgB,sBAAsB;EAE5C,IAAI,OAAwB;AAG5B,MAAI,eAAe,iBAAiB,QAAQ,IACxC,QAAO;WACA,kBAAkB,QAAQ,KACjC,QAAO;AAGX,YAAU;GACN;GACA,OAAO;GACP,UAAU;GACV,sBAAsB;GAEtB,sBAAsB,SAAS;GAClC,CAAC;IACH,CAAC,MAAM,CAAC;AAEX,QACI,oBAAC,mBAAmB;EAAS,OAAO;EAC/B;GACyB"}
@@ -1,40 +1,39 @@
1
- import { useState, useEffect } from "react";
2
- import { isIOS, isMobile, prefersReducedMotion } from "../utils/performance";
3
- import useWindowDimensions from "./useWindowDimensions";
1
+ import useWindowDimensions_default from "./useWindowDimensions.js";
2
+ import { isIOS, isMobile, prefersReducedMotion } from "../utils/performance.js";
3
+ import { useEffect, useState } from "react";
4
+
5
+ //#region src/hooks/usePerformanceMode.ts
4
6
  /**
5
- * Hook to determine optimal performance settings based on device capabilities
6
- * Does not disable any animations - only provides info for optimization
7
- */
8
- export const usePerformanceMode = () => {
9
- const [config, setConfig] = useState({
10
- mode: "high",
11
- isIOS: false,
12
- isMobile: false,
13
- prefersReducedMotion: false,
14
- enableComplexShadows: true,
15
- });
16
- const { width } = useWindowDimensions();
17
- useEffect(() => {
18
- const isIOSDevice = isIOS();
19
- const isMobileDevice = isMobile();
20
- const reducedMotion = prefersReducedMotion();
21
- let mode = "high";
22
- // Determine performance mode
23
- if (isIOSDevice || reducedMotion || width < 768) {
24
- mode = "low";
25
- }
26
- else if (isMobileDevice || width < 1024) {
27
- mode = "medium";
28
- }
29
- setConfig({
30
- mode,
31
- isIOS: isIOSDevice,
32
- isMobile: isMobileDevice,
33
- prefersReducedMotion: reducedMotion,
34
- // Use simpler shadows on iOS for better performance
35
- enableComplexShadows: mode !== "low",
36
- });
37
- }, []);
38
- return config;
7
+ * Hook to determine optimal performance settings based on device capabilities
8
+ * Does not disable any animations - only provides info for optimization
9
+ */
10
+ const usePerformanceMode = () => {
11
+ const [config, setConfig] = useState({
12
+ mode: "high",
13
+ isIOS: false,
14
+ isMobile: false,
15
+ prefersReducedMotion: false,
16
+ enableComplexShadows: true
17
+ });
18
+ const { width } = useWindowDimensions_default();
19
+ useEffect(() => {
20
+ const isIOSDevice = isIOS();
21
+ const isMobileDevice = isMobile();
22
+ const reducedMotion = prefersReducedMotion();
23
+ let mode = "high";
24
+ if (isIOSDevice || reducedMotion || width < 768) mode = "low";
25
+ else if (isMobileDevice || width < 1024) mode = "medium";
26
+ setConfig({
27
+ mode,
28
+ isIOS: isIOSDevice,
29
+ isMobile: isMobileDevice,
30
+ prefersReducedMotion: reducedMotion,
31
+ enableComplexShadows: mode !== "low"
32
+ });
33
+ }, []);
34
+ return config;
39
35
  };
36
+
37
+ //#endregion
38
+ export { usePerformanceMode };
40
39
  //# sourceMappingURL=usePerformanceMode.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"usePerformanceMode.js","sourceRoot":"","sources":["../../src/hooks/usePerformanceMode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,mBAAmB,MAAM,uBAAuB,CAAC;AAYxD;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAsB,EAAE;IACxD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAoB;QACtD,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,KAAK;QACf,oBAAoB,EAAE,KAAK;QAC3B,oBAAoB,EAAE,IAAI;KAC3B,CAAC,CAAC;IAEH,MAAM,EAAE,KAAK,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAExC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAG,KAAK,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,QAAQ,EAAE,CAAC;QAClC,MAAM,aAAa,GAAG,oBAAoB,EAAE,CAAC;QAE7C,IAAI,IAAI,GAAoB,MAAM,CAAC;QAEnC,6BAA6B;QAC7B,IAAI,WAAW,IAAI,aAAa,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;YAChD,IAAI,GAAG,KAAK,CAAC;QACf,CAAC;aAAM,IAAI,cAAc,IAAI,KAAK,GAAG,IAAI,EAAE,CAAC;YAC1C,IAAI,GAAG,QAAQ,CAAC;QAClB,CAAC;QAED,SAAS,CAAC;YACR,IAAI;YACJ,KAAK,EAAE,WAAW;YAClB,QAAQ,EAAE,cAAc;YACxB,oBAAoB,EAAE,aAAa;YACnC,oDAAoD;YACpD,oBAAoB,EAAE,IAAI,KAAK,KAAK;SACrC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
1
+ {"version":3,"file":"usePerformanceMode.js","names":["useWindowDimensions"],"sources":["../../src/hooks/usePerformanceMode.ts"],"sourcesContent":["import { useState, useEffect } from \"react\";\nimport { isIOS, isMobile, prefersReducedMotion } from \"../utils/performance\";\nimport useWindowDimensions from \"./useWindowDimensions\";\n\nexport type PerformanceMode = \"high\" | \"medium\" | \"low\";\n\nexport interface PerformanceConfig {\n mode: PerformanceMode;\n isIOS: boolean;\n isMobile: boolean;\n prefersReducedMotion: boolean;\n enableComplexShadows: boolean;\n}\n\n/**\n * Hook to determine optimal performance settings based on device capabilities\n * Does not disable any animations - only provides info for optimization\n */\nexport const usePerformanceMode = (): PerformanceConfig => {\n const [config, setConfig] = useState<PerformanceConfig>({\n mode: \"high\",\n isIOS: false,\n isMobile: false,\n prefersReducedMotion: false,\n enableComplexShadows: true,\n });\n\n const { width } = useWindowDimensions();\n\n useEffect(() => {\n const isIOSDevice = isIOS();\n const isMobileDevice = isMobile();\n const reducedMotion = prefersReducedMotion();\n\n let mode: PerformanceMode = \"high\";\n\n // Determine performance mode\n if (isIOSDevice || reducedMotion || width < 768) {\n mode = \"low\";\n } else if (isMobileDevice || width < 1024) {\n mode = \"medium\";\n }\n\n setConfig({\n mode,\n isIOS: isIOSDevice,\n isMobile: isMobileDevice,\n prefersReducedMotion: reducedMotion,\n // Use simpler shadows on iOS for better performance\n enableComplexShadows: mode !== \"low\",\n });\n }, []);\n\n return config;\n};\n"],"mappings":";;;;;;;;;AAkBA,MAAa,2BAA8C;CACzD,MAAM,CAAC,QAAQ,aAAa,SAA4B;EACtD,MAAM;EACN,OAAO;EACP,UAAU;EACV,sBAAsB;EACtB,sBAAsB;EACvB,CAAC;CAEF,MAAM,EAAE,UAAUA,6BAAqB;AAEvC,iBAAgB;EACd,MAAM,cAAc,OAAO;EAC3B,MAAM,iBAAiB,UAAU;EACjC,MAAM,gBAAgB,sBAAsB;EAE5C,IAAI,OAAwB;AAG5B,MAAI,eAAe,iBAAiB,QAAQ,IAC1C,QAAO;WACE,kBAAkB,QAAQ,KACnC,QAAO;AAGT,YAAU;GACR;GACA,OAAO;GACP,UAAU;GACV,sBAAsB;GAEtB,sBAAsB,SAAS;GAChC,CAAC;IACD,EAAE,CAAC;AAEN,QAAO"}
@@ -1,22 +1,26 @@
1
1
  import { useEffect, useState } from "react";
2
+
3
+ //#region src/hooks/useWindowDimensions.ts
2
4
  const useWindowDimensions = () => {
3
- const [windowDimensions, setWindowDimensions] = useState({
4
- width: typeof window !== "undefined" ? window.innerWidth : 1200,
5
- height: typeof window !== "undefined" ? window.innerHeight : 800,
6
- });
7
- useEffect(() => {
8
- function handleResize() {
9
- setWindowDimensions({
10
- width: window.innerWidth,
11
- height: window.innerHeight,
12
- });
13
- }
14
- // Set initial dimensions on mount
15
- handleResize();
16
- window.addEventListener("resize", handleResize);
17
- return () => window.removeEventListener("resize", handleResize);
18
- }, []); // Empty array ensures that effect is only run on mount
19
- return windowDimensions;
5
+ const [windowDimensions, setWindowDimensions] = useState({
6
+ width: typeof window !== "undefined" ? window.innerWidth : 1200,
7
+ height: typeof window !== "undefined" ? window.innerHeight : 800
8
+ });
9
+ useEffect(() => {
10
+ function handleResize() {
11
+ setWindowDimensions({
12
+ width: window.innerWidth,
13
+ height: window.innerHeight
14
+ });
15
+ }
16
+ handleResize();
17
+ window.addEventListener("resize", handleResize);
18
+ return () => window.removeEventListener("resize", handleResize);
19
+ }, []);
20
+ return windowDimensions;
20
21
  };
21
- export default useWindowDimensions;
22
+ var useWindowDimensions_default = useWindowDimensions;
23
+
24
+ //#endregion
25
+ export { useWindowDimensions_default as default };
22
26
  //# sourceMappingURL=useWindowDimensions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useWindowDimensions.js","sourceRoot":"","sources":["../../src/hooks/useWindowDimensions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAO5C,MAAM,mBAAmB,GAAG,GAAqB,EAAE;IACjD,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAmB;QACzE,KAAK,EAAE,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;QAC/D,MAAM,EAAE,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG;KACjE,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,YAAY;YACnB,mBAAmB,CAAC;gBAClB,KAAK,EAAE,MAAM,CAAC,UAAU;gBACxB,MAAM,EAAE,MAAM,CAAC,WAAW;aAC3B,CAAC,CAAC;QACL,CAAC;QAED,kCAAkC;QAClC,YAAY,EAAE,CAAC;QAEf,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAChD,OAAO,GAAS,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACxE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,uDAAuD;IAE/D,OAAO,gBAAgB,CAAC;AAC1B,CAAC,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"useWindowDimensions.js","names":[],"sources":["../../src/hooks/useWindowDimensions.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\ntype WindowDimentions = {\n width: number;\n height: number;\n};\n\nconst useWindowDimensions = (): WindowDimentions => {\n const [windowDimensions, setWindowDimensions] = useState<WindowDimentions>({\n width: typeof window !== \"undefined\" ? window.innerWidth : 1200,\n height: typeof window !== \"undefined\" ? window.innerHeight : 800,\n });\n\n useEffect(() => {\n function handleResize(): void {\n setWindowDimensions({\n width: window.innerWidth,\n height: window.innerHeight,\n });\n }\n\n // Set initial dimensions on mount\n handleResize();\n\n window.addEventListener(\"resize\", handleResize);\n return (): void => window.removeEventListener(\"resize\", handleResize);\n }, []); // Empty array ensures that effect is only run on mount\n\n return windowDimensions;\n};\n\nexport default useWindowDimensions;\n"],"mappings":";;;AAOA,MAAM,4BAA8C;CAClD,MAAM,CAAC,kBAAkB,uBAAuB,SAA2B;EACzE,OAAO,OAAO,WAAW,cAAc,OAAO,aAAa;EAC3D,QAAQ,OAAO,WAAW,cAAc,OAAO,cAAc;EAC9D,CAAC;AAEF,iBAAgB;EACd,SAAS,eAAqB;AAC5B,uBAAoB;IAClB,OAAO,OAAO;IACd,QAAQ,OAAO;IAChB,CAAC;;AAIJ,gBAAc;AAEd,SAAO,iBAAiB,UAAU,aAAa;AAC/C,eAAmB,OAAO,oBAAoB,UAAU,aAAa;IACpE,EAAE,CAAC;AAEN,QAAO;;AAGT,kCAAe"}
package/dist/index.d.ts CHANGED
@@ -16,5 +16,5 @@ export * from "./lib/canvas";
16
16
  export * from "./lib/constants";
17
17
  export * from "./lib/utils";
18
18
  export * from "./utils/performance";
19
- export type { SectionCoordinates, NavItem, CanvasSection, ToolbarConfig, ToolbarPosition, ToolbarDisplayMode, } from "./types";
19
+ export type { SectionCoordinates, NavItem, CanvasSection, ToolbarConfig, ToolbarPosition, ToolbarDisplayMode, NavbarConfig, NavbarPosition, NavbarDisplayMode, NavbarButtonConfig, NavbarTooltipConfig, } from "./types";
20
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAGrE,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,iCAAiC,CAAC;AACzC,YAAY,EACV,4BAA4B,EAC5B,6BAA6B,EAC7B,wBAAwB,GACzB,MAAM,iCAAiC,CAAC;AAGzC,OAAO,EACL,aAAa,EACb,cAAc,EACd,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,YAAY,EACV,eAAe,EACf,iBAAiB,GAClB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,kBAAkB,IAAI,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAG5F,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AAGpC,YAAY,EACV,kBAAkB,EAClB,OAAO,EACP,aAAa,EACb,aAAa,EACb,eAAe,EACf,kBAAkB,GACnB,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAGrE,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,iCAAiC,CAAC;AACzC,YAAY,EACV,4BAA4B,EAC5B,6BAA6B,EAC7B,wBAAwB,GACzB,MAAM,iCAAiC,CAAC;AAGzC,OAAO,EACL,aAAa,EACb,cAAc,EACd,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,YAAY,EACV,eAAe,EACf,iBAAiB,GAClB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,kBAAkB,IAAI,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAG5F,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AAGpC,YAAY,EACV,kBAAkB,EAClB,OAAO,EACP,aAAa,EACb,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -1,21 +1,17 @@
1
- // Components
2
- export { default as Canvas } from "./components/canvas/canvas";
3
- export { CanvasComponent } from "./components/canvas/component";
4
- export { Draggable, DraggableImage } from "./components/canvas/draggable";
5
- export { CanvasWrapper, growTransition } from "./components/canvas/wrapper";
6
- export { default as CanvasToolbar } from "./components/canvas/toolbar";
7
- export { default as CanvasNavbar } from "./components/canvas/navbar";
8
- // Background Components
9
- export { DefaultCanvasBackground, DefaultWrapperBackground, DefaultIntroContent, DEFAULT_CANVAS_GRADIENT, DEFAULT_INTRO_GRADIENT, DEFAULT_CANVAS_BOX_GRADIENT, } from "./components/canvas/backgrounds";
10
- // Contexts
11
- export { CanvasContext, CanvasProvider, useCanvasContext, } from "./contexts/CanvasContext";
12
- export { PerformanceProvider, usePerformanceMode, usePerformance, } from "./contexts/PerformanceContext";
13
- // Hooks
14
- export { default as useWindowDimensions } from "./hooks/useWindowDimensions";
15
- export { usePerformanceMode as usePerformanceModeLegacy } from "./hooks/usePerformanceMode";
16
- // Utilities
17
- export * from "./lib/canvas";
18
- export * from "./lib/constants";
19
- export * from "./lib/utils";
20
- export * from "./utils/performance";
21
- //# sourceMappingURL=index.js.map
1
+ import { CanvasContext, CanvasProvider, useCanvasContext } from "./contexts/CanvasContext.js";
2
+ import { BLUR_TRANSITION, DEFAULT_CANVAS_HEIGHT, DEFAULT_CANVAS_WIDTH, GROW_TRANSITION, IMAGE_FALLBACK_WIDTH_THRESHOLD, INTERACTIVE_SELECTOR, INTRO_ASPECT_RATIO, MAX_DIM_RATIO, MAX_ZOOM, MIN_ZOOMS, MOUSE_WHEEL_ZOOM_SENSITIVITY, NAVBAR_DEBOUNCE_MS, PAN_SPRING, RESPONSIVE_ZOOM_MAP, STAGE2_TRANSITION, ScreenSizeEnum, TOOLBAR_OPACITY_POS_EPS, TOOLBAR_OPACITY_SCALE_EPS, TRACKPAD_ZOOM_SENSITIVITY, VIEWPORT_HYSTERESIS_BUFFER, ZOOM_BOUND } from "./lib/constants.js";
3
+ import { calcInitialBoxWidth, canvasHeight, canvasWidth, getDistance, getMidpoint, getScreenSizeEnum, getSectionPanCoordinates, panToOffsetScene, useMemoPoint } from "./lib/canvas.js";
4
+ import useWindowDimensions_default from "./hooks/useWindowDimensions.js";
5
+ import { cn } from "./lib/utils.js";
6
+ import { getWillChange, isIOS, isMobile, prefersReducedMotion } from "./utils/performance.js";
7
+ import { usePerformanceMode as usePerformanceMode$1 } from "./hooks/usePerformanceMode.js";
8
+ import Navbar from "./components/canvas/navbar/index.js";
9
+ import toolbar_default from "./components/canvas/toolbar.js";
10
+ import { CanvasWrapper } from "./components/canvas/wrapper.js";
11
+ import { DEFAULT_CANVAS_BOX_GRADIENT, DEFAULT_CANVAS_GRADIENT, DEFAULT_INTRO_GRADIENT, DefaultCanvasBackground, DefaultIntroContent, DefaultWrapperBackground } from "./components/canvas/backgrounds.js";
12
+ import canvas_default from "./components/canvas/canvas.js";
13
+ import { CanvasComponent } from "./components/canvas/component.js";
14
+ import { Draggable, DraggableImage } from "./components/canvas/draggable.js";
15
+ import { PerformanceProvider, usePerformance, usePerformanceMode } from "./contexts/PerformanceContext.js";
16
+
17
+ export { BLUR_TRANSITION, canvas_default as Canvas, CanvasComponent, CanvasContext, Navbar as CanvasNavbar, CanvasProvider, toolbar_default as CanvasToolbar, CanvasWrapper, DEFAULT_CANVAS_BOX_GRADIENT, DEFAULT_CANVAS_GRADIENT, DEFAULT_CANVAS_HEIGHT, DEFAULT_CANVAS_WIDTH, DEFAULT_INTRO_GRADIENT, DefaultCanvasBackground, DefaultIntroContent, DefaultWrapperBackground, Draggable, DraggableImage, GROW_TRANSITION, IMAGE_FALLBACK_WIDTH_THRESHOLD, INTERACTIVE_SELECTOR, INTRO_ASPECT_RATIO, MAX_DIM_RATIO, MAX_ZOOM, MIN_ZOOMS, MOUSE_WHEEL_ZOOM_SENSITIVITY, NAVBAR_DEBOUNCE_MS, PAN_SPRING, PerformanceProvider, RESPONSIVE_ZOOM_MAP, STAGE2_TRANSITION, ScreenSizeEnum, TOOLBAR_OPACITY_POS_EPS, TOOLBAR_OPACITY_SCALE_EPS, TRACKPAD_ZOOM_SENSITIVITY, VIEWPORT_HYSTERESIS_BUFFER, ZOOM_BOUND, calcInitialBoxWidth, canvasHeight, canvasWidth, cn, getDistance, getMidpoint, getScreenSizeEnum, getSectionPanCoordinates, getWillChange, GROW_TRANSITION as growTransition, isIOS, isMobile, panToOffsetScene, prefersReducedMotion, useCanvasContext, useMemoPoint, usePerformance, usePerformanceMode, usePerformanceMode$1 as usePerformanceModeLegacy, useWindowDimensions_default as useWindowDimensions };
@@ -1,82 +1,75 @@
1
+ import { DEFAULT_CANVAS_HEIGHT, DEFAULT_CANVAS_WIDTH, INTERACTIVE_SELECTOR, INTRO_ASPECT_RATIO, MAX_DIM_RATIO, MAX_ZOOM, MIN_ZOOMS, PAN_SPRING, ScreenSizeEnum, ZOOM_BOUND } from "./constants.js";
1
2
  import { animate } from "framer-motion";
2
3
  import { useMemo } from "react";
3
- import { DEFAULT_CANVAS_WIDTH, DEFAULT_CANVAS_HEIGHT, MAX_DIM_RATIO, INTRO_ASPECT_RATIO, PAN_SPRING, ScreenSizeEnum, } from "./constants";
4
- export const canvasWidth = DEFAULT_CANVAS_WIDTH;
5
- export const canvasHeight = DEFAULT_CANVAS_HEIGHT;
6
- // Re-export ScreenSizeEnum for backward compatibility
7
- export { ScreenSizeEnum } from "./constants";
8
- export const useMemoPoint = (x, y) => {
9
- return useMemo(() => ({ x, y }), [x, y]);
4
+
5
+ //#region src/lib/canvas.ts
6
+ const canvasWidth = DEFAULT_CANVAS_WIDTH;
7
+ const canvasHeight = DEFAULT_CANVAS_HEIGHT;
8
+ const useMemoPoint = (x, y) => {
9
+ return useMemo(() => ({
10
+ x,
11
+ y
12
+ }), [x, y]);
10
13
  };
11
- export const getDistance = (p1, p2) => {
12
- const dx = p1.clientX - p2.clientX;
13
- const dy = p1.clientY - p2.clientY;
14
- return Math.sqrt(dx ** 2 + dy ** 2);
14
+ const getDistance = (p1, p2) => {
15
+ const dx = p1.clientX - p2.clientX;
16
+ const dy = p1.clientY - p2.clientY;
17
+ return Math.sqrt(dx ** 2 + dy ** 2);
15
18
  };
16
- export const getMidpoint = (p1, p2) => {
17
- return {
18
- x: (p1.clientX + p2.clientX) / 2,
19
- y: (p1.clientY + p2.clientY) / 2,
20
- };
19
+ const getMidpoint = (p1, p2) => {
20
+ return {
21
+ x: (p1.clientX + p2.clientX) / 2,
22
+ y: (p1.clientY + p2.clientY) / 2
23
+ };
21
24
  };
22
- export const getScreenSizeEnum = (width) => {
23
- // iphone 12 pro is 390px, iphone 14 pro max is 430px, SE 3rd gen is 375px
24
- if (width < 400)
25
- return ScreenSizeEnum.SMALL_MOBILE;
26
- if (width < 768)
27
- return ScreenSizeEnum.MOBILE;
28
- if (width < 1440)
29
- return ScreenSizeEnum.TABLET;
30
- if (width < 1920)
31
- return ScreenSizeEnum.SMALL_DESKTOP;
32
- if (width < 2560)
33
- return ScreenSizeEnum.MEDIUM_DESKTOP;
34
- if (width <= 3440)
35
- return ScreenSizeEnum.LARGE_DESKTOP;
36
- return ScreenSizeEnum.HUGE_DESKTOP;
25
+ const getScreenSizeEnum = (width) => {
26
+ if (width < 400) return ScreenSizeEnum.SMALL_MOBILE;
27
+ if (width < 768) return ScreenSizeEnum.MOBILE;
28
+ if (width < 1440) return ScreenSizeEnum.TABLET;
29
+ if (width < 1920) return ScreenSizeEnum.SMALL_DESKTOP;
30
+ if (width < 2560) return ScreenSizeEnum.MEDIUM_DESKTOP;
31
+ if (width <= 3440) return ScreenSizeEnum.LARGE_DESKTOP;
32
+ return ScreenSizeEnum.HUGE_DESKTOP;
37
33
  };
38
- export function getSectionPanCoordinates({ windowDimensions, coords, targetZoom, negative, }) {
39
- const { width, height } = windowDimensions;
40
- // Calculate the center of the section
41
- const sectionCenterX = coords.x + coords.width / 2;
42
- const sectionCenterY = coords.y + coords.height / 2;
43
- // Calculate the required pan offset to center the section in the viewport
44
- const targetX = width / 2 - sectionCenterX * targetZoom;
45
- const targetY = height / 2 - sectionCenterY * targetZoom;
46
- if (negative) {
47
- return {
48
- x: -targetX,
49
- y: -targetY,
50
- };
51
- }
52
- return {
53
- x: targetX,
54
- y: targetY,
55
- };
34
+ function getSectionPanCoordinates({ windowDimensions, coords, targetZoom, negative }) {
35
+ const { width, height } = windowDimensions;
36
+ const sectionCenterX = coords.x + coords.width / 2;
37
+ const sectionCenterY = coords.y + coords.height / 2;
38
+ const targetX = width / 2 - sectionCenterX * targetZoom;
39
+ const targetY = height / 2 - sectionCenterY * targetZoom;
40
+ if (negative) return {
41
+ x: -targetX,
42
+ y: -targetY
43
+ };
44
+ return {
45
+ x: targetX,
46
+ y: targetY
47
+ };
56
48
  }
57
- export async function panToOffsetScene(offset, x, y, scale, newZoom) {
58
- const animX = animate(x, offset.x, PAN_SPRING);
59
- const animY = animate(y, offset.y, PAN_SPRING);
60
- const animScale = animate(scale, newZoom ?? 1, PAN_SPRING);
61
- await Promise.all([animScale, animX, animY]);
49
+ async function panToOffsetScene(offset, x, y, scale, newZoom) {
50
+ const animX = animate(x, offset.x, PAN_SPRING);
51
+ const animY = animate(y, offset.y, PAN_SPRING);
52
+ const animScale = animate(scale, newZoom ?? 1, PAN_SPRING);
53
+ await Promise.all([
54
+ animScale,
55
+ animX,
56
+ animY
57
+ ]);
62
58
  }
63
- export const calcInitialBoxWidth = (windowWidth, windowHeight) => {
64
- // math CanvasWrapper's bounding box size and compute scale s.t. canvas fits entirely within
65
- const maxWidth = windowWidth * MAX_DIM_RATIO.width;
66
- const maxHeight = windowHeight * MAX_DIM_RATIO.height;
67
- let boxWidth, boxHeight;
68
- if (maxWidth / INTRO_ASPECT_RATIO <= maxHeight) {
69
- boxWidth = maxWidth;
70
- boxHeight = boxWidth / INTRO_ASPECT_RATIO;
71
- }
72
- else {
73
- boxHeight = maxHeight;
74
- boxWidth = boxHeight * INTRO_ASPECT_RATIO;
75
- }
76
- // scale so the canvas fits inside the computed 3:2 box
77
- return Math.min(boxWidth / canvasWidth, boxHeight / canvasHeight);
59
+ const calcInitialBoxWidth = (windowWidth, windowHeight) => {
60
+ const maxWidth = windowWidth * MAX_DIM_RATIO.width;
61
+ const maxHeight = windowHeight * MAX_DIM_RATIO.height;
62
+ let boxWidth, boxHeight;
63
+ if (maxWidth / INTRO_ASPECT_RATIO <= maxHeight) {
64
+ boxWidth = maxWidth;
65
+ boxHeight = boxWidth / INTRO_ASPECT_RATIO;
66
+ } else {
67
+ boxHeight = maxHeight;
68
+ boxWidth = boxHeight * INTRO_ASPECT_RATIO;
69
+ }
70
+ return Math.min(boxWidth / canvasWidth, boxHeight / canvasHeight);
78
71
  };
79
- // Re-export commonly used constants for backward compatibility
80
- export { MAX_DIM_RATIO } from "./constants";
81
- export { INTERACTIVE_SELECTOR, ZOOM_BOUND, MAX_ZOOM, MIN_ZOOMS, } from "./constants";
72
+
73
+ //#endregion
74
+ export { calcInitialBoxWidth, canvasHeight, canvasWidth, getDistance, getMidpoint, getScreenSizeEnum, getSectionPanCoordinates, panToOffsetScene, useMemoPoint };
82
75
  //# sourceMappingURL=canvas.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"canvas.js","sourceRoot":"","sources":["../../src/lib/canvas.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"canvas.js","names":[],"sources":["../../src/lib/canvas.ts"],"sourcesContent":["import { animate, type MotionValue, type Point } from \"framer-motion\";\nimport { useMemo } from \"react\";\nimport {\n DEFAULT_CANVAS_WIDTH,\n DEFAULT_CANVAS_HEIGHT,\n MAX_DIM_RATIO,\n INTRO_ASPECT_RATIO,\n PAN_SPRING,\n ScreenSizeEnum,\n} from \"./constants\";\n\nexport const canvasWidth = DEFAULT_CANVAS_WIDTH;\nexport const canvasHeight = DEFAULT_CANVAS_HEIGHT;\n\n// Re-export ScreenSizeEnum for backward compatibility\nexport { ScreenSizeEnum } from \"./constants\";\n\nexport const useMemoPoint = (x: number, y: number): Point => {\n return useMemo(() => ({ x, y }), [x, y]);\n};\n\nexport interface MinimalPointerInput {\n clientX: number;\n clientY: number;\n}\n\nexport const getDistance = (\n p1: MinimalPointerInput,\n p2: MinimalPointerInput,\n) => {\n const dx = p1.clientX - p2.clientX;\n const dy = p1.clientY - p2.clientY;\n return Math.sqrt(dx ** 2 + dy ** 2);\n};\n\nexport const getMidpoint = (\n p1: MinimalPointerInput,\n p2: MinimalPointerInput,\n): Point => {\n return {\n x: (p1.clientX + p2.clientX) / 2,\n y: (p1.clientY + p2.clientY) / 2,\n };\n};\n\nexport const getScreenSizeEnum = (width: number): ScreenSizeEnum => {\n // iphone 12 pro is 390px, iphone 14 pro max is 430px, SE 3rd gen is 375px\n if (width < 400) return ScreenSizeEnum.SMALL_MOBILE;\n if (width < 768) return ScreenSizeEnum.MOBILE;\n if (width < 1440) return ScreenSizeEnum.TABLET;\n if (width < 1920) return ScreenSizeEnum.SMALL_DESKTOP;\n if (width < 2560) return ScreenSizeEnum.MEDIUM_DESKTOP;\n if (width <= 3440) return ScreenSizeEnum.LARGE_DESKTOP;\n return ScreenSizeEnum.HUGE_DESKTOP;\n};\n\nexport function getSectionPanCoordinates({\n windowDimensions,\n coords,\n targetZoom,\n negative,\n}: {\n windowDimensions: { width: number; height: number };\n coords: { x: number; y: number; width: number; height: number };\n targetZoom: number;\n negative?: boolean;\n}) {\n const { width, height } = windowDimensions;\n // Calculate the center of the section\n const sectionCenterX = coords.x + coords.width / 2;\n const sectionCenterY = coords.y + coords.height / 2;\n\n // Calculate the required pan offset to center the section in the viewport\n const targetX = width / 2 - sectionCenterX * targetZoom;\n const targetY = height / 2 - sectionCenterY * targetZoom;\n\n if (negative) {\n return {\n x: -targetX,\n y: -targetY,\n };\n }\n\n return {\n x: targetX,\n y: targetY,\n };\n}\n\nexport async function panToOffsetScene(\n offset: Point,\n x: MotionValue<number>,\n y: MotionValue<number>,\n scale: MotionValue<number>,\n newZoom?: number,\n): Promise<void> {\n const animX = animate(x, offset.x, PAN_SPRING);\n const animY = animate(y, offset.y, PAN_SPRING);\n const animScale = animate(scale, newZoom ?? 1, PAN_SPRING);\n await Promise.all([animScale, animX, animY]);\n}\n\nexport const calcInitialBoxWidth = (\n windowWidth: number,\n windowHeight: number,\n) => {\n // math CanvasWrapper's bounding box size and compute scale s.t. canvas fits entirely within\n const maxWidth = windowWidth * MAX_DIM_RATIO.width;\n const maxHeight = windowHeight * MAX_DIM_RATIO.height;\n\n let boxWidth, boxHeight;\n\n if (maxWidth / INTRO_ASPECT_RATIO <= maxHeight) {\n boxWidth = maxWidth;\n boxHeight = boxWidth / INTRO_ASPECT_RATIO;\n } else {\n boxHeight = maxHeight;\n boxWidth = boxHeight * INTRO_ASPECT_RATIO;\n }\n\n // scale so the canvas fits inside the computed 3:2 box\n return Math.min(boxWidth / canvasWidth, boxHeight / canvasHeight);\n};\n\n// Re-export commonly used constants for backward compatibility\nexport { MAX_DIM_RATIO } from \"./constants\";\nexport {\n INTERACTIVE_SELECTOR,\n ZOOM_BOUND,\n MAX_ZOOM,\n MIN_ZOOMS,\n} from \"./constants\";\n"],"mappings":";;;;;AAWA,MAAa,cAAc;AAC3B,MAAa,eAAe;AAK5B,MAAa,gBAAgB,GAAW,MAAqB;AAC3D,QAAO,eAAe;EAAE;EAAG;EAAG,GAAG,CAAC,GAAG,EAAE,CAAC;;AAQ1C,MAAa,eACX,IACA,OACG;CACH,MAAM,KAAK,GAAG,UAAU,GAAG;CAC3B,MAAM,KAAK,GAAG,UAAU,GAAG;AAC3B,QAAO,KAAK,KAAK,MAAM,IAAI,MAAM,EAAE;;AAGrC,MAAa,eACX,IACA,OACU;AACV,QAAO;EACL,IAAI,GAAG,UAAU,GAAG,WAAW;EAC/B,IAAI,GAAG,UAAU,GAAG,WAAW;EAChC;;AAGH,MAAa,qBAAqB,UAAkC;AAElE,KAAI,QAAQ,IAAK,QAAO,eAAe;AACvC,KAAI,QAAQ,IAAK,QAAO,eAAe;AACvC,KAAI,QAAQ,KAAM,QAAO,eAAe;AACxC,KAAI,QAAQ,KAAM,QAAO,eAAe;AACxC,KAAI,QAAQ,KAAM,QAAO,eAAe;AACxC,KAAI,SAAS,KAAM,QAAO,eAAe;AACzC,QAAO,eAAe;;AAGxB,SAAgB,yBAAyB,EACvC,kBACA,QACA,YACA,YAMC;CACD,MAAM,EAAE,OAAO,WAAW;CAE1B,MAAM,iBAAiB,OAAO,IAAI,OAAO,QAAQ;CACjD,MAAM,iBAAiB,OAAO,IAAI,OAAO,SAAS;CAGlD,MAAM,UAAU,QAAQ,IAAI,iBAAiB;CAC7C,MAAM,UAAU,SAAS,IAAI,iBAAiB;AAE9C,KAAI,SACF,QAAO;EACL,GAAG,CAAC;EACJ,GAAG,CAAC;EACL;AAGH,QAAO;EACL,GAAG;EACH,GAAG;EACJ;;AAGH,eAAsB,iBACpB,QACA,GACA,GACA,OACA,SACe;CACf,MAAM,QAAQ,QAAQ,GAAG,OAAO,GAAG,WAAW;CAC9C,MAAM,QAAQ,QAAQ,GAAG,OAAO,GAAG,WAAW;CAC9C,MAAM,YAAY,QAAQ,OAAO,WAAW,GAAG,WAAW;AAC1D,OAAM,QAAQ,IAAI;EAAC;EAAW;EAAO;EAAM,CAAC;;AAG9C,MAAa,uBACX,aACA,iBACG;CAEH,MAAM,WAAW,cAAc,cAAc;CAC7C,MAAM,YAAY,eAAe,cAAc;CAE/C,IAAI,UAAU;AAEd,KAAI,WAAW,sBAAsB,WAAW;AAC9C,aAAW;AACX,cAAY,WAAW;QAClB;AACL,cAAY;AACZ,aAAW,YAAY;;AAIzB,QAAO,KAAK,IAAI,WAAW,aAAa,YAAY,aAAa"}