@efxlab/motion-canvas-responsive 4.0.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 (133) hide show
  1. package/lib/components/ParticleGroup.d.ts +9 -0
  2. package/lib/components/ParticleGroup.d.ts.map +1 -0
  3. package/lib/components/ParticleGroup.js +20 -0
  4. package/lib/components/ParticleGroup.js.map +1 -0
  5. package/lib/components/RatioLayer.d.ts +7 -0
  6. package/lib/components/RatioLayer.d.ts.map +1 -0
  7. package/lib/components/RatioLayer.js +8 -0
  8. package/lib/components/RatioLayer.js.map +1 -0
  9. package/lib/components/index.d.ts +3 -0
  10. package/lib/components/index.d.ts.map +1 -0
  11. package/lib/components/index.js +3 -0
  12. package/lib/components/index.js.map +1 -0
  13. package/lib/context/ResponsiveContext.d.ts +45 -0
  14. package/lib/context/ResponsiveContext.d.ts.map +1 -0
  15. package/lib/context/ResponsiveContext.js +118 -0
  16. package/lib/context/ResponsiveContext.js.map +1 -0
  17. package/lib/context/ResponsiveContext.test.d.ts +2 -0
  18. package/lib/context/ResponsiveContext.test.d.ts.map +1 -0
  19. package/lib/context/ResponsiveContext.test.js +74 -0
  20. package/lib/helpers/color.d.ts +26 -0
  21. package/lib/helpers/color.d.ts.map +1 -0
  22. package/lib/helpers/color.js +10 -0
  23. package/lib/helpers/color.js.map +1 -0
  24. package/lib/helpers/filter.d.ts +25 -0
  25. package/lib/helpers/filter.d.ts.map +1 -0
  26. package/lib/helpers/filter.js +8 -0
  27. package/lib/helpers/filter.js.map +1 -0
  28. package/lib/helpers/helpers.test.d.ts +2 -0
  29. package/lib/helpers/helpers.test.d.ts.map +1 -0
  30. package/lib/helpers/helpers.test.js +224 -0
  31. package/lib/helpers/index.d.ts +8 -0
  32. package/lib/helpers/index.d.ts.map +1 -0
  33. package/lib/helpers/index.js +8 -0
  34. package/lib/helpers/index.js.map +1 -0
  35. package/lib/helpers/path.d.ts +32 -0
  36. package/lib/helpers/path.d.ts.map +1 -0
  37. package/lib/helpers/path.js +28 -0
  38. package/lib/helpers/path.js.map +1 -0
  39. package/lib/helpers/position.d.ts +20 -0
  40. package/lib/helpers/position.d.ts.map +1 -0
  41. package/lib/helpers/position.js +52 -0
  42. package/lib/helpers/position.js.map +1 -0
  43. package/lib/helpers/rotation.d.ts +33 -0
  44. package/lib/helpers/rotation.d.ts.map +1 -0
  45. package/lib/helpers/rotation.js +14 -0
  46. package/lib/helpers/rotation.js.map +1 -0
  47. package/lib/helpers/scale.d.ts +31 -0
  48. package/lib/helpers/scale.d.ts.map +1 -0
  49. package/lib/helpers/scale.js +24 -0
  50. package/lib/helpers/scale.js.map +1 -0
  51. package/lib/helpers/visibility.d.ts +21 -0
  52. package/lib/helpers/visibility.d.ts.map +1 -0
  53. package/lib/helpers/visibility.js +7 -0
  54. package/lib/helpers/visibility.js.map +1 -0
  55. package/lib/hooks/index.d.ts +5 -0
  56. package/lib/hooks/index.d.ts.map +1 -0
  57. package/lib/hooks/index.js +5 -0
  58. package/lib/hooks/index.js.map +1 -0
  59. package/lib/hooks/useRatio.d.ts +2 -0
  60. package/lib/hooks/useRatio.d.ts.map +1 -0
  61. package/lib/hooks/useRatio.js +2 -0
  62. package/lib/hooks/useRatio.js.map +1 -0
  63. package/lib/hooks/useRatioEffect.d.ts +5 -0
  64. package/lib/hooks/useRatioEffect.d.ts.map +1 -0
  65. package/lib/hooks/useRatioEffect.js +29 -0
  66. package/lib/hooks/useRatioEffect.js.map +1 -0
  67. package/lib/hooks/useRatioElement.d.ts +11 -0
  68. package/lib/hooks/useRatioElement.d.ts.map +1 -0
  69. package/lib/hooks/useRatioElement.js +47 -0
  70. package/lib/hooks/useRatioElement.js.map +1 -0
  71. package/lib/hooks/useResponsive.d.ts +3 -0
  72. package/lib/hooks/useResponsive.d.ts.map +1 -0
  73. package/lib/hooks/useResponsive.js +29 -0
  74. package/lib/hooks/useResponsive.js.map +1 -0
  75. package/lib/hooks/useResponsiveAnimation.d.ts +3 -0
  76. package/lib/hooks/useResponsiveAnimation.d.ts.map +1 -0
  77. package/lib/hooks/useResponsiveAnimation.js +5 -0
  78. package/lib/hooks/useResponsiveAnimation.js.map +1 -0
  79. package/lib/index.d.ts +20 -0
  80. package/lib/index.d.ts.map +1 -0
  81. package/lib/index.js +12 -0
  82. package/lib/index.js.map +1 -0
  83. package/lib/layout/ResponsiveLayout.d.ts +39 -0
  84. package/lib/layout/ResponsiveLayout.d.ts.map +1 -0
  85. package/lib/layout/ResponsiveLayout.js +48 -0
  86. package/lib/layout/ResponsiveLayout.js.map +1 -0
  87. package/lib/layout/ResponsiveLayout.test.d.ts +2 -0
  88. package/lib/layout/ResponsiveLayout.test.d.ts.map +1 -0
  89. package/lib/layout/ResponsiveLayout.test.js +65 -0
  90. package/lib/scene/index.d.ts +3 -0
  91. package/lib/scene/index.d.ts.map +1 -0
  92. package/lib/scene/index.js +3 -0
  93. package/lib/scene/index.js.map +1 -0
  94. package/lib/scene/integration.d.ts +7 -0
  95. package/lib/scene/integration.d.ts.map +1 -0
  96. package/lib/scene/integration.js +7 -0
  97. package/lib/scene/integration.js.map +1 -0
  98. package/lib/scene/makeResponsiveScene.d.ts +19 -0
  99. package/lib/scene/makeResponsiveScene.d.ts.map +1 -0
  100. package/lib/scene/makeResponsiveScene.js +19 -0
  101. package/lib/scene/makeResponsiveScene.js.map +1 -0
  102. package/lib/types.d.ts +35 -0
  103. package/lib/types.d.ts.map +1 -0
  104. package/lib/types.js +2 -0
  105. package/lib/types.js.map +1 -0
  106. package/package.json +42 -0
  107. package/src/components/ParticleGroup.tsx +36 -0
  108. package/src/components/RatioLayer.tsx +19 -0
  109. package/src/components/index.ts +2 -0
  110. package/src/context/ResponsiveContext.test.ts +112 -0
  111. package/src/context/ResponsiveContext.ts +146 -0
  112. package/src/helpers/color.ts +21 -0
  113. package/src/helpers/filter.ts +18 -0
  114. package/src/helpers/helpers.test.ts +252 -0
  115. package/src/helpers/index.ts +7 -0
  116. package/src/helpers/path.ts +49 -0
  117. package/src/helpers/position.ts +75 -0
  118. package/src/helpers/rotation.ts +27 -0
  119. package/src/helpers/scale.ts +42 -0
  120. package/src/helpers/visibility.ts +13 -0
  121. package/src/hooks/index.ts +4 -0
  122. package/src/hooks/useRatio.ts +1 -0
  123. package/src/hooks/useRatioEffect.ts +42 -0
  124. package/src/hooks/useRatioElement.ts +61 -0
  125. package/src/hooks/useResponsive.ts +36 -0
  126. package/src/hooks/useResponsiveAnimation.ts +8 -0
  127. package/src/index.ts +17 -0
  128. package/src/layout/ResponsiveLayout.test.ts +82 -0
  129. package/src/layout/ResponsiveLayout.ts +89 -0
  130. package/src/scene/index.ts +2 -0
  131. package/src/scene/integration.ts +13 -0
  132. package/src/scene/makeResponsiveScene.ts +49 -0
  133. package/src/types.ts +44 -0
@@ -0,0 +1,29 @@
1
+ import { useEffect } from 'react';
2
+ import { detectRatioClass, useResponsiveContext, } from '../context/ResponsiveContext';
3
+ export function useRatioEffect(condition, callback, deps = []) {
4
+ const state = useResponsiveContext();
5
+ const aspectRatio = state.width / state.height;
6
+ const ratioClass = detectRatioClass(aspectRatio);
7
+ const conditions = Array.isArray(condition) ? condition : [condition];
8
+ const matches = conditions.some(cond => {
9
+ if (cond === state.ratio)
10
+ return true;
11
+ if (cond === ratioClass)
12
+ return true;
13
+ if (cond === 'portrait' && ratioClass === 'portrait')
14
+ return true;
15
+ if (cond === 'landscape' && ratioClass === 'landscape')
16
+ return true;
17
+ if (cond === 'square' && ratioClass === 'square')
18
+ return true;
19
+ if (cond === 'ultrawide' && ratioClass === 'ultrawide')
20
+ return true;
21
+ return false;
22
+ });
23
+ useEffect(() => {
24
+ if (matches) {
25
+ return callback();
26
+ }
27
+ }, [matches, ...deps]);
28
+ }
29
+ //# sourceMappingURL=useRatioEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRatioEffect.js","sourceRoot":"","sources":["../../src/hooks/useRatioEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AAChC,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AAWtC,MAAM,UAAU,cAAc,CAC5B,SAA4C,EAC5C,QAAmC,EACnC,OAAc,EAAE;IAEhB,MAAM,KAAK,GAAG,oBAAoB,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAC/C,MAAM,UAAU,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAEjD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAEtE,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACrC,IAAI,IAAI,KAAK,KAAK,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACtC,IAAI,IAAI,KAAK,UAAU;YAAE,OAAO,IAAI,CAAC;QACrC,IAAI,IAAI,KAAK,UAAU,IAAI,UAAU,KAAK,UAAU;YAAE,OAAO,IAAI,CAAC;QAClE,IAAI,IAAI,KAAK,WAAW,IAAI,UAAU,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QACpE,IAAI,IAAI,KAAK,QAAQ,IAAI,UAAU,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC9D,IAAI,IAAI,KAAK,WAAW,IAAI,UAAU,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QACpE,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,QAAQ,EAAE,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import type { RatioClass, RatioId } from '../types';
3
+ type RatioCondition = RatioId | RatioClass | 'portrait' | 'landscape' | 'square' | 'ultrawide';
4
+ export interface UseRatioElementOptions {
5
+ only?: RatioCondition[];
6
+ except?: RatioCondition[];
7
+ element: () => React.ReactElement | null;
8
+ }
9
+ export declare function useRatioElement(options: UseRatioElementOptions): React.ReactElement | null;
10
+ export {};
11
+ //# sourceMappingURL=useRatioElement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRatioElement.d.ts","sourceRoot":"","sources":["../../src/hooks/useRatioElement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAgB,MAAM,OAAO,CAAC;AAKrC,OAAO,KAAK,EAAC,UAAU,EAAE,OAAO,EAAC,MAAM,UAAU,CAAC;AAElD,KAAK,cAAc,GACf,OAAO,GACP,UAAU,GACV,UAAU,GACV,WAAW,GACX,QAAQ,GACR,WAAW,CAAC;AAEhB,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,cAAc,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;CAC1C;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,sBAAsB,GAC9B,KAAK,CAAC,YAAY,GAAG,IAAI,CAqC3B"}
@@ -0,0 +1,47 @@
1
+ import { useMemo } from 'react';
2
+ import { detectRatioClass, useResponsiveContext, } from '../context/ResponsiveContext';
3
+ export function useRatioElement(options) {
4
+ const state = useResponsiveContext();
5
+ const aspectRatio = state.width / state.height;
6
+ const ratioClass = detectRatioClass(aspectRatio);
7
+ return useMemo(() => {
8
+ const conditions = options.only ?? [];
9
+ const exceptions = options.except ?? [];
10
+ const matchesConditions = conditions.length === 0 ||
11
+ conditions.some(cond => {
12
+ if (cond === state.ratio)
13
+ return true;
14
+ if (cond === ratioClass)
15
+ return true;
16
+ if (cond === 'portrait' && ratioClass === 'portrait')
17
+ return true;
18
+ if (cond === 'landscape' && ratioClass === 'landscape')
19
+ return true;
20
+ if (cond === 'square' && ratioClass === 'square')
21
+ return true;
22
+ if (cond === 'ultrawide' && ratioClass === 'ultrawide')
23
+ return true;
24
+ return false;
25
+ });
26
+ const matchesExceptions = exceptions.some(cond => {
27
+ if (cond === state.ratio)
28
+ return true;
29
+ if (cond === ratioClass)
30
+ return true;
31
+ if (cond === 'portrait' && ratioClass === 'portrait')
32
+ return true;
33
+ if (cond === 'landscape' && ratioClass === 'landscape')
34
+ return true;
35
+ if (cond === 'square' && ratioClass === 'square')
36
+ return true;
37
+ if (cond === 'ultrawide' && ratioClass === 'ultrawide')
38
+ return true;
39
+ return false;
40
+ });
41
+ if (matchesConditions && !matchesExceptions) {
42
+ return options.element();
43
+ }
44
+ return null;
45
+ }, [state.ratio, ratioClass, options]);
46
+ }
47
+ //# sourceMappingURL=useRatioElement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRatioElement.js","sourceRoot":"","sources":["../../src/hooks/useRatioElement.ts"],"names":[],"mappings":"AAAA,OAAc,EAAC,OAAO,EAAC,MAAM,OAAO,CAAC;AACrC,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AAiBtC,MAAM,UAAU,eAAe,CAC7B,OAA+B;IAE/B,MAAM,KAAK,GAAG,oBAAoB,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAC/C,MAAM,UAAU,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAEjD,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QACtC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;QAExC,MAAM,iBAAiB,GACrB,UAAU,CAAC,MAAM,KAAK,CAAC;YACvB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACrB,IAAI,IAAI,KAAK,KAAK,CAAC,KAAK;oBAAE,OAAO,IAAI,CAAC;gBACtC,IAAI,IAAI,KAAK,UAAU;oBAAE,OAAO,IAAI,CAAC;gBACrC,IAAI,IAAI,KAAK,UAAU,IAAI,UAAU,KAAK,UAAU;oBAAE,OAAO,IAAI,CAAC;gBAClE,IAAI,IAAI,KAAK,WAAW,IAAI,UAAU,KAAK,WAAW;oBAAE,OAAO,IAAI,CAAC;gBACpE,IAAI,IAAI,KAAK,QAAQ,IAAI,UAAU,KAAK,QAAQ;oBAAE,OAAO,IAAI,CAAC;gBAC9D,IAAI,IAAI,KAAK,WAAW,IAAI,UAAU,KAAK,WAAW;oBAAE,OAAO,IAAI,CAAC;gBACpE,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;QAEL,MAAM,iBAAiB,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC/C,IAAI,IAAI,KAAK,KAAK,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC;YACtC,IAAI,IAAI,KAAK,UAAU;gBAAE,OAAO,IAAI,CAAC;YACrC,IAAI,IAAI,KAAK,UAAU,IAAI,UAAU,KAAK,UAAU;gBAAE,OAAO,IAAI,CAAC;YAClE,IAAI,IAAI,KAAK,WAAW,IAAI,UAAU,KAAK,WAAW;gBAAE,OAAO,IAAI,CAAC;YACpE,IAAI,IAAI,KAAK,QAAQ,IAAI,UAAU,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAC9D,IAAI,IAAI,KAAK,WAAW,IAAI,UAAU,KAAK,WAAW;gBAAE,OAAO,IAAI,CAAC;YACpE,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,IAAI,iBAAiB,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5C,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ResponsiveConfig } from '../types';
2
+ export declare function useResponsive<T>(config: ResponsiveConfig<T>): T;
3
+ //# sourceMappingURL=useResponsive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useResponsive.d.ts","sourceRoot":"","sources":["../../src/hooks/useResponsive.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,UAAU,CAAC;AAE/C,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CA6B/D"}
@@ -0,0 +1,29 @@
1
+ import { detectRatioClass, useResponsiveContext, } from '../context/ResponsiveContext';
2
+ export function useResponsive(config) {
3
+ const state = useResponsiveContext();
4
+ const aspectRatio = state.width / state.height;
5
+ const ratioClass = detectRatioClass(aspectRatio);
6
+ let result = { ...config.base };
7
+ const classOverrides = [];
8
+ if (config.portrait && ratioClass === 'portrait') {
9
+ classOverrides.push(config.portrait);
10
+ }
11
+ else if (config.landscape && ratioClass === 'landscape') {
12
+ classOverrides.push(config.landscape);
13
+ }
14
+ else if (config.square && ratioClass === 'square') {
15
+ classOverrides.push(config.square);
16
+ }
17
+ else if (config.ultrawide && ratioClass === 'ultrawide') {
18
+ classOverrides.push(config.ultrawide);
19
+ }
20
+ const specificOverride = config[state.ratio];
21
+ if (specificOverride) {
22
+ classOverrides.push(specificOverride);
23
+ }
24
+ for (const override of classOverrides) {
25
+ result = { ...result, ...override };
26
+ }
27
+ return result;
28
+ }
29
+ //# sourceMappingURL=useResponsive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useResponsive.js","sourceRoot":"","sources":["../../src/hooks/useResponsive.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AAGtC,MAAM,UAAU,aAAa,CAAI,MAA2B;IAC1D,MAAM,KAAK,GAAG,oBAAoB,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAC/C,MAAM,UAAU,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAEjD,IAAI,MAAM,GAAQ,EAAC,GAAG,MAAM,CAAC,IAAI,EAAC,CAAC;IAEnC,MAAM,cAAc,GAAiB,EAAE,CAAC;IAExC,IAAI,MAAM,CAAC,QAAQ,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;QACjD,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;SAAM,IAAI,MAAM,CAAC,SAAS,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;QAC1D,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;SAAM,IAAI,MAAM,CAAC,MAAM,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QACpD,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;SAAM,IAAI,MAAM,CAAC,SAAS,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;QAC1D,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,gBAAgB,EAAE,CAAC;QACrB,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;QACtC,MAAM,GAAG,EAAC,GAAG,MAAM,EAAE,GAAG,QAAQ,EAAC,CAAC;IACpC,CAAC;IAED,OAAO,MAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AnimationConfig, ResponsiveConfig } from '../types';
2
+ export declare function useResponsiveAnimation(config: ResponsiveConfig<AnimationConfig>): AnimationConfig;
3
+ //# sourceMappingURL=useResponsiveAnimation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useResponsiveAnimation.d.ts","sourceRoot":"","sources":["../../src/hooks/useResponsiveAnimation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,eAAe,EAAE,gBAAgB,EAAC,MAAM,UAAU,CAAC;AAGhE,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,gBAAgB,CAAC,eAAe,CAAC,GACxC,eAAe,CAEjB"}
@@ -0,0 +1,5 @@
1
+ import { useResponsive } from './useResponsive';
2
+ export function useResponsiveAnimation(config) {
3
+ return useResponsive(config);
4
+ }
5
+ //# sourceMappingURL=useResponsiveAnimation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useResponsiveAnimation.js","sourceRoot":"","sources":["../../src/hooks/useResponsiveAnimation.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAE9C,MAAM,UAAU,sBAAsB,CACpC,MAAyC;IAEzC,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ export * from './components';
2
+ export * from './context/ResponsiveContext';
3
+ export * from './helpers';
4
+ export * from './hooks/useRatio';
5
+ export * from './hooks/useRatioEffect';
6
+ export * from './hooks/useRatioElement';
7
+ export * from './hooks/useResponsive';
8
+ export * from './hooks/useResponsiveAnimation';
9
+ export * from './layout/ResponsiveLayout';
10
+ export * from './scene';
11
+ export * from './types';
12
+ declare module '@efxlab/motion-canvas-core' {
13
+ interface Scene {
14
+ setResponsiveSetup(callback: (size: {
15
+ x: number;
16
+ y: number;
17
+ }) => void): void;
18
+ }
19
+ }
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AAExB,OAAO,QAAQ,4BAA4B,CAAC;IAC1C,UAAU,KAAK;QACb,kBAAkB,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAC,KAAK,IAAI,GAAG,IAAI,CAAC;KAC5E;CACF"}
package/lib/index.js ADDED
@@ -0,0 +1,12 @@
1
+ export * from './components';
2
+ export * from './context/ResponsiveContext';
3
+ export * from './helpers';
4
+ export * from './hooks/useRatio';
5
+ export * from './hooks/useRatioEffect';
6
+ export * from './hooks/useRatioElement';
7
+ export * from './hooks/useResponsive';
8
+ export * from './hooks/useResponsiveAnimation';
9
+ export * from './layout/ResponsiveLayout';
10
+ export * from './scene';
11
+ export * from './types';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { RatioClass, RatioId } from '../types';
2
+ export interface ResponsiveLayout {
3
+ ratio: RatioId;
4
+ ratioClass: RatioClass;
5
+ width: number;
6
+ height: number;
7
+ w: number;
8
+ h: number;
9
+ hw: number;
10
+ hh: number;
11
+ ar: number;
12
+ isPortrait: boolean;
13
+ isLandscape: boolean;
14
+ isSquare: boolean;
15
+ isUltrawide: boolean;
16
+ px: (frac: number) => number;
17
+ py: (frac: number) => number;
18
+ sz: (base: number) => number;
19
+ sx: (frac: number) => number;
20
+ sy: (frac: number) => number;
21
+ pad: (frac: number) => number;
22
+ topPad: (basePadding: number) => number;
23
+ bottomPad: (basePadding: number) => number;
24
+ leftPad: (basePadding: number) => number;
25
+ rightPad: (basePadding: number) => number;
26
+ }
27
+ export declare function createResponsiveLayout(width: number, height: number, ratio?: RatioId): ResponsiveLayout;
28
+ export declare function useRatio(): ResponsiveLayout;
29
+ /**
30
+ * Create a responsive layout from width and height values.
31
+ * This is a standalone version that doesn't require the responsive context,
32
+ * useful for creating layouts from raw values.
33
+ *
34
+ * @param width - The width of the view
35
+ * @param height - The height of the view
36
+ * @param ratio - Optional ratio ID (default: '16x9')
37
+ */
38
+ export declare function viewLayout(width: number, height: number, ratio?: RatioId): ResponsiveLayout;
39
+ //# sourceMappingURL=ResponsiveLayout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResponsiveLayout.d.ts","sourceRoot":"","sources":["../../src/layout/ResponsiveLayout.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,UAAU,EAAE,OAAO,EAAC,MAAM,UAAU,CAAC;AAElD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7B,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7B,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7B,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7B,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9B,MAAM,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,SAAS,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,OAAO,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC;IACzC,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC;CAC3C;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,OAAgB,GACtB,gBAAgB,CA8BlB;AAED,wBAAgB,QAAQ,IAAI,gBAAgB,CAG3C;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,OAAgB,GACtB,gBAAgB,CAElB"}
@@ -0,0 +1,48 @@
1
+ import { detectRatioClass, useResponsiveContext, } from '../context/ResponsiveContext';
2
+ export function createResponsiveLayout(width, height, ratio = '16x9') {
3
+ const aspectRatio = width / height;
4
+ const ratioClass = detectRatioClass(aspectRatio);
5
+ const scale = Math.min(width, height) / 1080;
6
+ return {
7
+ ratio,
8
+ ratioClass,
9
+ width,
10
+ height,
11
+ w: width,
12
+ h: height,
13
+ hw: width / 2,
14
+ hh: height / 2,
15
+ ar: aspectRatio,
16
+ isPortrait: ratioClass === 'portrait',
17
+ isLandscape: ratioClass === 'landscape',
18
+ isSquare: ratioClass === 'square',
19
+ isUltrawide: ratioClass === 'ultrawide',
20
+ px: (frac) => frac * width,
21
+ py: (frac) => frac * height,
22
+ sz: (base) => base * scale,
23
+ sx: (frac) => frac * width,
24
+ sy: (frac) => frac * height,
25
+ pad: (frac) => frac * Math.min(width, height),
26
+ topPad: (basePadding) => -(height / 2) + basePadding * scale,
27
+ bottomPad: (basePadding) => height / 2 - basePadding * scale,
28
+ leftPad: (basePadding) => -(width / 2) + basePadding * scale,
29
+ rightPad: (basePadding) => width / 2 - basePadding * scale,
30
+ };
31
+ }
32
+ export function useRatio() {
33
+ const state = useResponsiveContext();
34
+ return createResponsiveLayout(state.width, state.height, state.ratio);
35
+ }
36
+ /**
37
+ * Create a responsive layout from width and height values.
38
+ * This is a standalone version that doesn't require the responsive context,
39
+ * useful for creating layouts from raw values.
40
+ *
41
+ * @param width - The width of the view
42
+ * @param height - The height of the view
43
+ * @param ratio - Optional ratio ID (default: '16x9')
44
+ */
45
+ export function viewLayout(width, height, ratio = '16x9') {
46
+ return createResponsiveLayout(width, height, ratio);
47
+ }
48
+ //# sourceMappingURL=ResponsiveLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResponsiveLayout.js","sourceRoot":"","sources":["../../src/layout/ResponsiveLayout.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AA6BtC,MAAM,UAAU,sBAAsB,CACpC,KAAa,EACb,MAAc,EACd,QAAiB,MAAM;IAEvB,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,CAAC;IACnC,MAAM,UAAU,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAE7C,OAAO;QACL,KAAK;QACL,UAAU;QACV,KAAK;QACL,MAAM;QACN,CAAC,EAAE,KAAK;QACR,CAAC,EAAE,MAAM;QACT,EAAE,EAAE,KAAK,GAAG,CAAC;QACb,EAAE,EAAE,MAAM,GAAG,CAAC;QACd,EAAE,EAAE,WAAW;QACf,UAAU,EAAE,UAAU,KAAK,UAAU;QACrC,WAAW,EAAE,UAAU,KAAK,WAAW;QACvC,QAAQ,EAAE,UAAU,KAAK,QAAQ;QACjC,WAAW,EAAE,UAAU,KAAK,WAAW;QACvC,EAAE,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK;QAClC,EAAE,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,GAAG,MAAM;QACnC,EAAE,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK;QAClC,EAAE,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK;QAClC,EAAE,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,GAAG,MAAM;QACnC,GAAG,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;QACrD,MAAM,EAAE,CAAC,WAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,GAAG,KAAK;QACpE,SAAS,EAAE,CAAC,WAAmB,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,GAAG,WAAW,GAAG,KAAK;QACpE,OAAO,EAAE,CAAC,WAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,WAAW,GAAG,KAAK;QACpE,QAAQ,EAAE,CAAC,WAAmB,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,GAAG,WAAW,GAAG,KAAK;KACnE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,MAAM,KAAK,GAAG,oBAAoB,EAAE,CAAC;IACrC,OAAO,sBAAsB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;AACxE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CACxB,KAAa,EACb,MAAc,EACd,QAAiB,MAAM;IAEvB,OAAO,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ResponsiveLayout.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResponsiveLayout.test.d.ts","sourceRoot":"","sources":["../../src/layout/ResponsiveLayout.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var vitest_1 = require("vitest");
4
+ var ResponsiveLayout_1 = require("../layout/ResponsiveLayout");
5
+ (0, vitest_1.describe)('ResponsiveLayout', function () {
6
+ (0, vitest_1.describe)('createResponsiveLayout', function () {
7
+ (0, vitest_1.it)('should create layout for 16:9 landscape', function () {
8
+ var layout = (0, ResponsiveLayout_1.createResponsiveLayout)(1920, 1080, '16x9');
9
+ (0, vitest_1.expect)(layout.ratio).toBe('16x9');
10
+ (0, vitest_1.expect)(layout.ratioClass).toBe('landscape');
11
+ (0, vitest_1.expect)(layout.width).toBe(1920);
12
+ (0, vitest_1.expect)(layout.height).toBe(1080);
13
+ (0, vitest_1.expect)(layout.ar).toBeCloseTo(1.778, 2);
14
+ (0, vitest_1.expect)(layout.isLandscape).toBe(true);
15
+ (0, vitest_1.expect)(layout.isPortrait).toBe(false);
16
+ });
17
+ (0, vitest_1.it)('should create layout for 9:16 portrait', function () {
18
+ var layout = (0, ResponsiveLayout_1.createResponsiveLayout)(1080, 1920, '9x16');
19
+ (0, vitest_1.expect)(layout.ratio).toBe('9x16');
20
+ (0, vitest_1.expect)(layout.ratioClass).toBe('portrait');
21
+ (0, vitest_1.expect)(layout.isPortrait).toBe(true);
22
+ (0, vitest_1.expect)(layout.isLandscape).toBe(false);
23
+ });
24
+ (0, vitest_1.it)('should create layout for 1:1 square', function () {
25
+ var layout = (0, ResponsiveLayout_1.createResponsiveLayout)(1080, 1080, '1x1');
26
+ (0, vitest_1.expect)(layout.ratioClass).toBe('square');
27
+ (0, vitest_1.expect)(layout.isSquare).toBe(true);
28
+ });
29
+ (0, vitest_1.it)('should create layout for 21:9 ultrawide', function () {
30
+ var layout = (0, ResponsiveLayout_1.createResponsiveLayout)(2520, 1080, '21x9');
31
+ (0, vitest_1.expect)(layout.ratioClass).toBe('ultrawide');
32
+ (0, vitest_1.expect)(layout.isUltrawide).toBe(true);
33
+ });
34
+ (0, vitest_1.it)('should calculate px correctly', function () {
35
+ var layout = (0, ResponsiveLayout_1.createResponsiveLayout)(1920, 1080, '16x9');
36
+ (0, vitest_1.expect)(layout.px(0)).toBe(0);
37
+ (0, vitest_1.expect)(layout.px(-0.5)).toBe(-960);
38
+ (0, vitest_1.expect)(layout.px(0.5)).toBe(960);
39
+ });
40
+ (0, vitest_1.it)('should calculate py correctly', function () {
41
+ var layout = (0, ResponsiveLayout_1.createResponsiveLayout)(1920, 1080, '16x9');
42
+ (0, vitest_1.expect)(layout.py(0)).toBe(0);
43
+ (0, vitest_1.expect)(layout.py(-0.5)).toBe(-540);
44
+ (0, vitest_1.expect)(layout.py(0.5)).toBe(540);
45
+ });
46
+ (0, vitest_1.it)('should calculate sz correctly', function () {
47
+ var layout = (0, ResponsiveLayout_1.createResponsiveLayout)(1920, 1080, '16x9');
48
+ (0, vitest_1.expect)(layout.sz(1080)).toBe(1080); // base 1080 at 1080 min dimension
49
+ (0, vitest_1.expect)(layout.sz(64)).toBeCloseTo(64);
50
+ });
51
+ (0, vitest_1.it)('should calculate half dimensions', function () {
52
+ var layout = (0, ResponsiveLayout_1.createResponsiveLayout)(1920, 1080, '16x9');
53
+ (0, vitest_1.expect)(layout.hw).toBe(960);
54
+ (0, vitest_1.expect)(layout.hh).toBe(540);
55
+ });
56
+ (0, vitest_1.it)('should calculate padding correctly', function () {
57
+ var layout = (0, ResponsiveLayout_1.createResponsiveLayout)(1920, 1080, '16x9');
58
+ // topPad: -h/2 + sz(padding)
59
+ // -540 + (100 * scale) where scale = 1080/1080 = 1
60
+ (0, vitest_1.expect)(layout.topPad(100)).toBe(-440);
61
+ // bottomPad: h/2 - sz(padding)
62
+ (0, vitest_1.expect)(layout.bottomPad(100)).toBe(440);
63
+ });
64
+ });
65
+ });
@@ -0,0 +1,3 @@
1
+ export * from './integration';
2
+ export * from './makeResponsiveScene';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scene/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './integration';
2
+ export * from './makeResponsiveScene';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scene/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Vector2 } from '@efxlab/motion-canvas-core';
2
+ import type { RatioId } from '../types';
3
+ export interface ResponsiveSetupOptions {
4
+ ratio?: RatioId;
5
+ }
6
+ export declare function createResponsiveSetup(options?: ResponsiveSetupOptions): (size: Vector2) => void;
7
+ //# sourceMappingURL=integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../../src/scene/integration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,4BAA4B,CAAC;AAExD,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,UAAU,CAAC;AAEtC,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,sBAA2B,IAChE,MAAM,OAAO,UAGtB"}
@@ -0,0 +1,7 @@
1
+ import { initResponsiveFromSize } from '../context/ResponsiveContext';
2
+ export function createResponsiveSetup(options = {}) {
3
+ return (size) => {
4
+ initResponsiveFromSize(size, options.ratio ?? '16x9');
5
+ };
6
+ }
7
+ //# sourceMappingURL=integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.js","sourceRoot":"","sources":["../../src/scene/integration.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,sBAAsB,EAAC,MAAM,8BAA8B,CAAC;AAOpE,MAAM,UAAU,qBAAqB,CAAC,UAAkC,EAAE;IACxE,OAAO,CAAC,IAAa,EAAE,EAAE;QACvB,sBAAsB,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC;IACxD,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { Scene2D } from '@efxlab/motion-canvas-2d';
2
+ import type { ThreadGenerator, ThreadGeneratorFactory } from '@efxlab/motion-canvas-core';
3
+ type SceneFactory = () => ThreadGenerator;
4
+ export interface ResponsiveSceneConfig {
5
+ base: SceneFactory;
6
+ portrait?: SceneFactory;
7
+ landscape?: SceneFactory;
8
+ square?: SceneFactory;
9
+ ultrawide?: SceneFactory;
10
+ '16x9'?: SceneFactory;
11
+ '9x16'?: SceneFactory;
12
+ '4x3'?: SceneFactory;
13
+ '1x1'?: SceneFactory;
14
+ fullwindow?: SceneFactory;
15
+ [key: string]: SceneFactory | undefined;
16
+ }
17
+ export declare function makeResponsiveScene(config: ResponsiveSceneConfig): ThreadGeneratorFactory<Scene2D>;
18
+ export {};
19
+ //# sourceMappingURL=makeResponsiveScene.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makeResponsiveScene.d.ts","sourceRoot":"","sources":["../../src/scene/makeResponsiveScene.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EACvB,MAAM,4BAA4B,CAAC;AAGpC,KAAK,YAAY,GAAG,MAAM,eAAe,CAAC;AAE1C,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,YAAY,CAAC;IAEzB,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB,KAAK,CAAC,EAAE,YAAY,CAAC;IAErB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAAC;CACzC;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,qBAAqB,GAC5B,sBAAsB,CAAC,OAAO,CAAC,CAmBjC"}
@@ -0,0 +1,19 @@
1
+ import { useResponsiveContext } from '../context/ResponsiveContext';
2
+ export function makeResponsiveScene(config) {
3
+ return function* () {
4
+ // Note: _view parameter is required by ThreadGeneratorFactory but scene is selected via config
5
+ const state = useResponsiveContext();
6
+ const specificFactory = config[state.ratio];
7
+ if (specificFactory) {
8
+ yield* specificFactory();
9
+ return;
10
+ }
11
+ const classFactory = config[state.ratioClass];
12
+ if (classFactory) {
13
+ yield* classFactory();
14
+ return;
15
+ }
16
+ yield* config.base();
17
+ };
18
+ }
19
+ //# sourceMappingURL=makeResponsiveScene.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makeResponsiveScene.js","sourceRoot":"","sources":["../../src/scene/makeResponsiveScene.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,oBAAoB,EAAC,MAAM,8BAA8B,CAAC;AAsBlE,MAAM,UAAU,mBAAmB,CACjC,MAA6B;IAE7B,OAAO,QAAQ,CAAC;QACd,+FAA+F;QAC/F,MAAM,KAAK,GAAG,oBAAoB,EAAE,CAAC;QAErC,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,eAAe,EAAE,CAAC;YACpB,KAAK,CAAC,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,YAAY,EAAE,CAAC;YACjB,KAAK,CAAC,CAAC,YAAY,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC,CAAC;AACJ,CAAC"}
package/lib/types.d.ts ADDED
@@ -0,0 +1,35 @@
1
+ export type RatioId = '16x9' | '9x16' | '4x3' | '1x1' | 'fullwindow' | string;
2
+ export type RatioClass = 'landscape' | 'portrait' | 'square' | 'ultrawide';
3
+ export interface ResponsiveRatioConfig {
4
+ aspect: string;
5
+ ratioClass?: RatioClass;
6
+ }
7
+ export interface ResponsiveRatiosConfig {
8
+ [ratioId: string]: ResponsiveRatioConfig;
9
+ }
10
+ export interface ResponsiveConfig<T> {
11
+ base: T;
12
+ portrait?: Partial<T>;
13
+ landscape?: Partial<T>;
14
+ square?: Partial<T>;
15
+ ultrawide?: Partial<T>;
16
+ '16x9'?: Partial<T>;
17
+ '9x16'?: Partial<T>;
18
+ '4x3'?: Partial<T>;
19
+ '1x1'?: Partial<T>;
20
+ fullwindow?: Partial<T>;
21
+ [key: string]: Partial<T> | undefined;
22
+ }
23
+ export interface ResponsiveState {
24
+ ratio: RatioId;
25
+ ratioClass: RatioClass;
26
+ width: number;
27
+ height: number;
28
+ }
29
+ export interface AnimationConfig {
30
+ duration?: number;
31
+ easing?: any;
32
+ delay?: number;
33
+ [key: string]: any;
34
+ }
35
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,YAAY,GAAG,MAAM,CAAC;AAE9E,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE3E,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,CAAC;CAC1C;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,IAAI,EAAE,CAAC,CAAC;IACR,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAEvB,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAEpB,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAEpB,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAEnB,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB"}
package/lib/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@efxlab/motion-canvas-responsive",
3
+ "version": "4.0.0",
4
+ "description": "Ratio-independent animation system for Motion Canvas",
5
+ "author": "motion-canvas",
6
+ "homepage": "https://motioncanvas.io/",
7
+ "bugs": "https://github.com/motion-canvas/motion-canvas/issues",
8
+ "license": "MIT",
9
+ "main": "lib/index.js",
10
+ "types": "./lib/index.d.ts",
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "scripts": {
15
+ "dev": "ts-patch install -s && tsc -w",
16
+ "build": "ts-patch install -s && tsc",
17
+ "bundle": "rollup -c rollup.config.mjs",
18
+ "test": "vitest"
19
+ },
20
+ "sideEffects": false,
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/electroheadfx/efx-motion-canvas.git"
24
+ },
25
+ "files": [
26
+ "lib",
27
+ "src",
28
+ "tsconfig.project.json"
29
+ ],
30
+ "devDependencies": {
31
+ "@efxlab/motion-canvas-internal": "workspace:*",
32
+ "@preact/signals": "^1.2.1",
33
+ "@types/node": "^25.2.3",
34
+ "jsdom": "^22.1.0",
35
+ "preact": "10.19.3",
36
+ "ts-patch": "^3.3.0",
37
+ "vitest": "^0.34.6"
38
+ },
39
+ "dependencies": {
40
+ "@efxlab/motion-canvas-core": "workspace:*"
41
+ }
42
+ }
@@ -0,0 +1,36 @@
1
+ import {cloneElement, isValidElement, ReactElement} from 'react';
2
+ import {useRatio} from '../layout/ResponsiveLayout';
3
+
4
+ export interface ParticleGroupProps {
5
+ count: number;
6
+ compositeOperation?: GlobalCompositeOperation;
7
+ opacity?: number;
8
+ children: (index: number) => ReactElement;
9
+ }
10
+
11
+ export function ParticleGroup({
12
+ count,
13
+ compositeOperation = 'source-over',
14
+ opacity = 1,
15
+ children,
16
+ }: ParticleGroupProps): ReactElement[] {
17
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
18
+ const _layout = useRatio();
19
+ const elements: ReactElement[] = [];
20
+
21
+ for (let i = 0; i < count; i++) {
22
+ const child = children(i);
23
+ if (isValidElement(child)) {
24
+ const childOpacity = (child.props as any).opacity ?? 1;
25
+ elements.push(
26
+ cloneElement(child, {
27
+ key: i,
28
+ compositeOperation,
29
+ opacity: childOpacity * opacity,
30
+ } as any),
31
+ );
32
+ }
33
+ }
34
+
35
+ return elements;
36
+ }
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import {
3
+ useRatioElement,
4
+ UseRatioElementOptions,
5
+ } from '../hooks/useRatioElement';
6
+
7
+ export interface RatioLayerProps extends UseRatioElementOptions {
8
+ children?: React.ReactElement | null;
9
+ }
10
+
11
+ export function RatioLayer({
12
+ children,
13
+ ...options
14
+ }: RatioLayerProps): React.ReactElement | null {
15
+ return useRatioElement({
16
+ ...options,
17
+ element: () => children ?? null,
18
+ });
19
+ }
@@ -0,0 +1,2 @@
1
+ export * from './ParticleGroup';
2
+ export * from './RatioLayer';