@cntrl-site/sdk-nextjs 1.9.77 → 1.9.79

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 (145) hide show
  1. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  2. package/.idea/modules.xml +8 -0
  3. package/.idea/sdk-nextjs.iml +12 -0
  4. package/.idea/vcs.xml +6 -0
  5. package/LICENSE +21 -21
  6. package/README.md +4 -4
  7. package/TODO.md +1 -1
  8. package/eslint.config.mjs +35 -35
  9. package/jest.config.js +6 -6
  10. package/lib/common/useItemFXData.js +5 -5
  11. package/lib/components/Article.js +5 -5
  12. package/lib/components/LayoutStyle.js +4 -4
  13. package/lib/components/Section/Section.js +27 -27
  14. package/lib/components/StructuredBlockItem/StructuredBlockItem.js +13 -13
  15. package/lib/components/StructuredBlockItem/StructuredComponent/StructuredComponent.js +12 -12
  16. package/lib/components/StructuredContent/StructuredContent.js +11 -11
  17. package/lib/components/items/CodeEmbedItem/CodeEmbedItem.js +36 -36
  18. package/lib/components/items/ComponentItem/ComponentItem.js +13 -13
  19. package/lib/components/items/CompoundItem/CompoundChild.js +20 -20
  20. package/lib/components/items/CompoundItem/CompoundItem.js +14 -14
  21. package/lib/components/items/CustomItem/CustomItem.js +9 -9
  22. package/lib/components/items/EmbedVideoItem/VimeoEmbed.js +24 -24
  23. package/lib/components/items/EmbedVideoItem/YoutubeEmbed.js +27 -27
  24. package/lib/components/items/FileItem/ImageItem.js +40 -40
  25. package/lib/components/items/FileItem/VideoItem.js +64 -64
  26. package/lib/components/items/GroupItem/GroupItem.js +14 -14
  27. package/lib/components/items/Item.js +30 -30
  28. package/lib/components/items/RectangleItem/RectangleItem.js +27 -27
  29. package/lib/components/items/RichTextItem/RichTextItem.js +22 -22
  30. package/lib/utils/RichTextConverter/RichTextConverter.js +21 -21
  31. package/package.json +62 -62
  32. package/src/ItemGeometry/CSSPropertyNameMap.ts +37 -37
  33. package/src/ItemGeometry/GenericGeometryController.ts +59 -59
  34. package/src/ItemGeometry/ItemGeometryContext.ts +4 -4
  35. package/src/ItemGeometry/ItemGeometryController.ts +22 -22
  36. package/src/ItemGeometry/ItemGeometryService.ts +34 -34
  37. package/src/ItemGeometry/RichTextGeometryController.ts +166 -166
  38. package/src/ItemGeometry/useItemGeometry.ts +25 -25
  39. package/src/common/useCurrentLayout.ts +52 -52
  40. package/src/common/useExemplary.ts +9 -9
  41. package/src/common/useItemFXData.ts +63 -63
  42. package/src/common/useKeyframeValue.ts +85 -85
  43. package/src/common/useRegisterResize.ts +16 -16
  44. package/src/components/Article.tsx +69 -69
  45. package/src/components/ArticleWrapper.tsx +21 -21
  46. package/src/components/Head.tsx +95 -95
  47. package/src/components/LayoutStyle.tsx +21 -21
  48. package/src/components/Page.tsx +47 -47
  49. package/src/components/ScrollPlaybackVideo.tsx +75 -75
  50. package/src/components/Section/Section.tsx +162 -162
  51. package/src/components/Section/SectionImage.tsx +48 -48
  52. package/src/components/Section/SectionVideo.tsx +144 -144
  53. package/src/components/Section/useSectionColor.ts +19 -19
  54. package/src/components/Section/useSectionHeightMap.ts +19 -19
  55. package/src/components/StructuredBlockItem/StructuredBlockItem.tsx +69 -69
  56. package/src/components/StructuredBlockItem/StructuredComponent/StructuredComponent.tsx +66 -66
  57. package/src/components/StructuredContent/StructuredContent.tsx +42 -42
  58. package/src/components/items/CodeEmbedItem/CodeEmbedItem.tsx +148 -148
  59. package/src/components/items/CodeEmbedItem/useCodeEmbedItem.ts +36 -36
  60. package/src/components/items/ComponentItem/ComponentItem.tsx +85 -85
  61. package/src/components/items/ComponentItem/useComponentItem.ts +35 -35
  62. package/src/components/items/CompoundItem/CompoundChild.tsx +151 -151
  63. package/src/components/items/CompoundItem/CompoundItem.tsx +88 -88
  64. package/src/components/items/CompoundItem/useCompoundItem.ts +21 -21
  65. package/src/components/items/CustomItem/CustomItem.tsx +50 -50
  66. package/src/components/items/EmbedVideoItem/VimeoEmbed.tsx +217 -217
  67. package/src/components/items/EmbedVideoItem/YoutubeEmbed.tsx +201 -201
  68. package/src/components/items/EmbedVideoItem/useEmbedVideoItem.ts +46 -46
  69. package/src/components/items/FileItem/ImageItem.tsx +166 -166
  70. package/src/components/items/FileItem/VideoItem.tsx +287 -287
  71. package/src/components/items/FileItem/useFileItem.ts +81 -81
  72. package/src/components/items/GroupItem/GroupItem.tsx +99 -99
  73. package/src/components/items/GroupItem/useGroupItem.ts +34 -34
  74. package/src/components/items/Item.tsx +268 -268
  75. package/src/components/items/LinkWrapper.tsx +39 -39
  76. package/src/components/items/RectangleItem/RectangleItem.tsx +177 -177
  77. package/src/components/items/RectangleItem/useRectangleItem.ts +89 -89
  78. package/src/components/items/RichTextItem/RichTextItem.tsx +113 -113
  79. package/src/components/items/RichTextItem/useRichTextItem.ts +12 -12
  80. package/src/components/items/RichTextWrapper.tsx +15 -15
  81. package/src/components/items/itemsMap.ts +28 -28
  82. package/src/components/items/useDraggable.ts +252 -252
  83. package/src/components/items/useItemAngle.ts +13 -13
  84. package/src/components/items/useItemArea.ts +35 -35
  85. package/src/components/items/useItemPointerEvents.ts +23 -23
  86. package/src/components/items/useItemScale.ts +17 -17
  87. package/src/components/items/useItemTriggers.ts +15 -15
  88. package/src/components/items/useRichTextItemValues.ts +66 -66
  89. package/src/components/items/useSizing.ts +25 -25
  90. package/src/components/items/useStickyItemTop.ts +21 -21
  91. package/src/components/useLayoutContext.ts +7 -7
  92. package/src/index.ts +25 -25
  93. package/src/interactions/InteractionsRegistry.ts +513 -513
  94. package/src/interactions/ItemInteractionCtrl.ts +78 -78
  95. package/src/interactions/getTransition.ts +27 -27
  96. package/src/interactions/types.ts +36 -36
  97. package/src/interactions/useItemInteractionCtrl.ts +18 -18
  98. package/src/provider/ArticleRectContext.ts +4 -4
  99. package/src/provider/CntrlContext.ts +5 -5
  100. package/src/provider/CntrlProvider.tsx +11 -11
  101. package/src/provider/CntrlSdkContext.ts +113 -113
  102. package/src/provider/CustomItemRegistry.ts +14 -14
  103. package/src/provider/CustomItemTypes.ts +3 -3
  104. package/src/provider/CustomSectionRegistry.ts +25 -25
  105. package/src/provider/InteractionsContext.tsx +73 -73
  106. package/src/provider/Keyframes.ts +11 -11
  107. package/src/provider/KeyframesContext.ts +5 -5
  108. package/src/provider/LayoutContext.ts +3 -3
  109. package/src/provider/WebGLContextManagerContext.tsx +4 -4
  110. package/src/provider/defaultContext.ts +8 -8
  111. package/src/provider/useCntrlContext.ts +8 -8
  112. package/src/styled-jsx.d.ts +1 -1
  113. package/src/types/components-utils.d.ts +7 -7
  114. package/src/utils/Animator/Animator.ts +570 -570
  115. package/src/utils/ArticleRectManager/ArticleRectObserver.ts +93 -93
  116. package/src/utils/ArticleRectManager/useArticleRectObserver.ts +17 -17
  117. package/src/utils/ArticleRectManager/useSectionRegistry.ts +11 -11
  118. package/src/utils/CSSNumeric.ts +19 -19
  119. package/src/utils/EventEmitter.ts +41 -41
  120. package/src/utils/RichTextConverter/RichTextConverter.tsx +342 -342
  121. package/src/utils/ScaleAnchorMap.ts +13 -13
  122. package/src/utils/StickyManager/StickyManager.ts +23 -23
  123. package/src/utils/Youtube/YouTubeIframeApiLoader.ts +58 -58
  124. package/src/utils/Youtube/YoutubeIframeApi.ts +101 -101
  125. package/src/utils/Youtube/useYouTubeIframeApi.ts +12 -12
  126. package/src/utils/areFillsVisible/areFillsVisible.test.ts +63 -63
  127. package/src/utils/areFillsVisible/areFillsVisible.ts +37 -37
  128. package/src/utils/binSearchInsertAt.ts +33 -33
  129. package/src/utils/castObject.ts +10 -10
  130. package/src/utils/checkOverflowClipSupport.ts +13 -13
  131. package/src/utils/domDfs.ts +11 -11
  132. package/src/utils/effects/useImageFx.ts +154 -154
  133. package/src/utils/effects/useVideoFx.ts +156 -156
  134. package/src/utils/evaluateComponentBundle.ts +83 -83
  135. package/src/utils/getAnchoredItemTop.ts +12 -12
  136. package/src/utils/getCompoundBoundaryStyles.ts +60 -60
  137. package/src/utils/getFill.ts +46 -46
  138. package/src/utils/getFontFamilyValue.ts +3 -3
  139. package/src/utils/getInvertedRanges.ts +43 -43
  140. package/src/utils/getItemTopStyle.ts +39 -39
  141. package/src/utils/getStyleFromItemStateAndParams.ts +8 -8
  142. package/src/utils/getValidYoutubeUrl.ts +29 -29
  143. package/src/utils/isItemType.ts +5 -5
  144. package/src/utils/rangeMap.ts +13 -13
  145. package/src/utils/useElementRect.ts +23 -23
@@ -1,13 +1,13 @@
1
- import { AreaAnchor as ScaleAnchor } from '@cntrl-site/sdk';
2
-
3
- export const ScaleAnchorMap = {
4
- [ScaleAnchor.TopLeft]: 'top left',
5
- [ScaleAnchor.TopCenter]: 'top center',
6
- [ScaleAnchor.TopRight]: 'top right',
7
- [ScaleAnchor.MiddleLeft]: 'center left',
8
- [ScaleAnchor.MiddleCenter]: 'center',
9
- [ScaleAnchor.MiddleRight]: 'center right',
10
- [ScaleAnchor.BottomLeft]: 'bottom left',
11
- [ScaleAnchor.BottomCenter]: 'bottom center',
12
- [ScaleAnchor.BottomRight]: 'bottom right'
13
- };
1
+ import { AreaAnchor as ScaleAnchor } from '@cntrl-site/sdk';
2
+
3
+ export const ScaleAnchorMap = {
4
+ [ScaleAnchor.TopLeft]: 'top left',
5
+ [ScaleAnchor.TopCenter]: 'top center',
6
+ [ScaleAnchor.TopRight]: 'top right',
7
+ [ScaleAnchor.MiddleLeft]: 'center left',
8
+ [ScaleAnchor.MiddleCenter]: 'center',
9
+ [ScaleAnchor.MiddleRight]: 'center right',
10
+ [ScaleAnchor.BottomLeft]: 'bottom left',
11
+ [ScaleAnchor.BottomCenter]: 'bottom center',
12
+ [ScaleAnchor.BottomRight]: 'bottom right'
13
+ };
@@ -1,23 +1,23 @@
1
- export type TSticky = { from: number; to?: number; } | null;
2
-
3
- export class StickyManager {
4
- constructor(
5
- private sticky: TSticky
6
- ) {}
7
-
8
- getIsSticky(scroll: number): boolean {
9
- if (!this.sticky) return false;
10
- return (this.sticky.from <= scroll) && (!this.sticky.to || this.sticky.to >= scroll);
11
- }
12
-
13
- getPosition(scroll: number, top: number): number {
14
- if (!this.sticky) return top;
15
- if (this.getIsSticky(scroll)) {
16
- return top - this.sticky.from;
17
- }
18
- if (this.sticky.to !== undefined && this.sticky.to <= scroll) {
19
- return top + this.sticky.to - this.sticky.from;
20
- }
21
- return top;
22
- }
23
- }
1
+ export type TSticky = { from: number; to?: number; } | null;
2
+
3
+ export class StickyManager {
4
+ constructor(
5
+ private sticky: TSticky
6
+ ) {}
7
+
8
+ getIsSticky(scroll: number): boolean {
9
+ if (!this.sticky) return false;
10
+ return (this.sticky.from <= scroll) && (!this.sticky.to || this.sticky.to >= scroll);
11
+ }
12
+
13
+ getPosition(scroll: number, top: number): number {
14
+ if (!this.sticky) return top;
15
+ if (this.getIsSticky(scroll)) {
16
+ return top - this.sticky.from;
17
+ }
18
+ if (this.sticky.to !== undefined && this.sticky.to <= scroll) {
19
+ return top + this.sticky.to - this.sticky.from;
20
+ }
21
+ return top;
22
+ }
23
+ }
@@ -1,58 +1,58 @@
1
- import { YT } from './YoutubeIframeApi';
2
-
3
- const YT_IFRAME_API_URL = 'https://www.youtube.com/iframe_api';
4
-
5
- export class YouTubeIframeApiLoader {
6
- private static instance: YouTubeIframeApiLoader | undefined;
7
-
8
- public static create(): YouTubeIframeApiLoader {
9
- if (!YouTubeIframeApiLoader.instance) {
10
- YouTubeIframeApiLoader.instance = new YouTubeIframeApiLoader();
11
- }
12
- return YouTubeIframeApiLoader.instance;
13
- }
14
-
15
- private loadingPromise: Promise<void>;
16
-
17
- private constructor() {
18
- this.loadingPromise = this.loadApi();
19
- }
20
-
21
- async getApi(): Promise<YT> {
22
- await this.loadingPromise;
23
- if (!window.YT) {
24
- throw new Error('YouTube IFrame API is not loaded');
25
- }
26
- return window.YT;
27
- }
28
-
29
- private loadApi(): Promise<void> {
30
- return new Promise<void>((resolve, reject) => {
31
- const script = document.createElement('script');
32
- script.src = YT_IFRAME_API_URL;
33
- const loadError = new Error('YouTube IFrame API loading failed');
34
- captureStackTrace(loadError);
35
- script.addEventListener('abort', () => {
36
- reject(loadError);
37
- });
38
- script.addEventListener('error', () => {
39
- reject(loadError);
40
- });
41
- window.onYouTubeIframeAPIReady = () => {
42
- window.onYouTubeIframeAPIReady = undefined;
43
- resolve();
44
- };
45
- document.head.appendChild(script);
46
- });
47
- }
48
- }
49
-
50
- export function captureStackTrace(error: Error): void {
51
- if (typeof Error.captureStackTrace === 'function') {
52
- Error.captureStackTrace(error);
53
- return;
54
- }
55
- try {
56
- throw error;
57
- } catch (errWithStack) {}
58
- }
1
+ import { YT } from './YoutubeIframeApi';
2
+
3
+ const YT_IFRAME_API_URL = 'https://www.youtube.com/iframe_api';
4
+
5
+ export class YouTubeIframeApiLoader {
6
+ private static instance: YouTubeIframeApiLoader | undefined;
7
+
8
+ public static create(): YouTubeIframeApiLoader {
9
+ if (!YouTubeIframeApiLoader.instance) {
10
+ YouTubeIframeApiLoader.instance = new YouTubeIframeApiLoader();
11
+ }
12
+ return YouTubeIframeApiLoader.instance;
13
+ }
14
+
15
+ private loadingPromise: Promise<void>;
16
+
17
+ private constructor() {
18
+ this.loadingPromise = this.loadApi();
19
+ }
20
+
21
+ async getApi(): Promise<YT> {
22
+ await this.loadingPromise;
23
+ if (!window.YT) {
24
+ throw new Error('YouTube IFrame API is not loaded');
25
+ }
26
+ return window.YT;
27
+ }
28
+
29
+ private loadApi(): Promise<void> {
30
+ return new Promise<void>((resolve, reject) => {
31
+ const script = document.createElement('script');
32
+ script.src = YT_IFRAME_API_URL;
33
+ const loadError = new Error('YouTube IFrame API loading failed');
34
+ captureStackTrace(loadError);
35
+ script.addEventListener('abort', () => {
36
+ reject(loadError);
37
+ });
38
+ script.addEventListener('error', () => {
39
+ reject(loadError);
40
+ });
41
+ window.onYouTubeIframeAPIReady = () => {
42
+ window.onYouTubeIframeAPIReady = undefined;
43
+ resolve();
44
+ };
45
+ document.head.appendChild(script);
46
+ });
47
+ }
48
+ }
49
+
50
+ export function captureStackTrace(error: Error): void {
51
+ if (typeof Error.captureStackTrace === 'function') {
52
+ Error.captureStackTrace(error);
53
+ return;
54
+ }
55
+ try {
56
+ throw error;
57
+ } catch (errWithStack) {}
58
+ }
@@ -1,101 +1,101 @@
1
- export interface YT {
2
- Player: YTPlayerConstructor;
3
- }
4
-
5
- export interface YTPlayerConstructor {
6
- new(container: string | Element, params: YTPlayerParams): YTPlayer;
7
- }
8
-
9
- export interface YTEvent<Data> {
10
- target: YTPlayer;
11
- data: Data;
12
- }
13
-
14
- type YTBool = 0 | 1 | '0' | '1';
15
-
16
- export interface YTPlayerParams {
17
- width?: string | number;
18
- height?: string | number;
19
- videoId?: string;
20
- playerVars?: Partial<{
21
- autoplay: YTBool;
22
- cc_lang_pref: string;
23
- cc_load_policy: YTBool;
24
- color: string;
25
- controls: YTBool;
26
- disablekb: YTBool;
27
- enablejsapi: YTBool;
28
- end: number | string;
29
- fs: YTBool;
30
- hl: string;
31
- iv_load_policy: 1 | 3 | '1' | '3';
32
- list: string;
33
- listType: 'playlist' | 'user_uploads';
34
- loop: YTBool;
35
- origin: string;
36
- playlist: string;
37
- playsinline: YTBool;
38
- rel: YTBool;
39
- start: number | string;
40
- widget_referrer: string;
41
- }>;
42
- events?: Partial<{
43
- onReady: (event: YTEvent<void>) => void;
44
- onStateChange: (event: YTEvent<YTPlayerState>) => void;
45
- }>
46
- }
47
-
48
- export enum YTPlayerState {
49
- Unstarted = -1,
50
- Ended = 0,
51
- Playing = 1,
52
- Paused = 2,
53
- Buffering = 3,
54
- VideoCued = 5
55
- }
56
-
57
- export interface YTPlayer {
58
- loadVideoById(videoId: string, startSeconds?: number): void;
59
- loadVideoById(params: {
60
- videoId: string;
61
- startSeconds?: number;
62
- endSeconds?: number;
63
- }): void;
64
-
65
- loadVideoByUrl(mediaContentUrl: string, startSeconds?: number): void;
66
- loadVideoByUrl(params: {
67
- mediaContentUrl: string;
68
- startSeconds?: number;
69
- endSeconds?: number;
70
- }): void;
71
-
72
- playVideo(): void;
73
- pauseVideo(): void;
74
- stopVideo(): void;
75
- seekTo(seconds: number, allowSeekAhead: boolean): void;
76
-
77
- mute(): void;
78
- unMute(): void;
79
- isMuted(): void;
80
- setVolume(volume: number): void;
81
- getVolume(): void;
82
- setSize(width: number, height: number): void;
83
- setLoop(loopPlaylists: boolean): void;
84
-
85
- getVideoLoadedFraction(): number;
86
- getPlayerState(): YTPlayerState;
87
-
88
- getDuration(): number; // in seconds
89
- getVideoUrl(): string;
90
- getVideoEmbedCode(): string;
91
-
92
- getIframe(): HTMLIFrameElement | undefined;
93
- destroy(): void;
94
- }
95
-
96
- declare global {
97
- interface Window {
98
- YT?: YT;
99
- onYouTubeIframeAPIReady?: () => void;
100
- }
101
- }
1
+ export interface YT {
2
+ Player: YTPlayerConstructor;
3
+ }
4
+
5
+ export interface YTPlayerConstructor {
6
+ new(container: string | Element, params: YTPlayerParams): YTPlayer;
7
+ }
8
+
9
+ export interface YTEvent<Data> {
10
+ target: YTPlayer;
11
+ data: Data;
12
+ }
13
+
14
+ type YTBool = 0 | 1 | '0' | '1';
15
+
16
+ export interface YTPlayerParams {
17
+ width?: string | number;
18
+ height?: string | number;
19
+ videoId?: string;
20
+ playerVars?: Partial<{
21
+ autoplay: YTBool;
22
+ cc_lang_pref: string;
23
+ cc_load_policy: YTBool;
24
+ color: string;
25
+ controls: YTBool;
26
+ disablekb: YTBool;
27
+ enablejsapi: YTBool;
28
+ end: number | string;
29
+ fs: YTBool;
30
+ hl: string;
31
+ iv_load_policy: 1 | 3 | '1' | '3';
32
+ list: string;
33
+ listType: 'playlist' | 'user_uploads';
34
+ loop: YTBool;
35
+ origin: string;
36
+ playlist: string;
37
+ playsinline: YTBool;
38
+ rel: YTBool;
39
+ start: number | string;
40
+ widget_referrer: string;
41
+ }>;
42
+ events?: Partial<{
43
+ onReady: (event: YTEvent<void>) => void;
44
+ onStateChange: (event: YTEvent<YTPlayerState>) => void;
45
+ }>
46
+ }
47
+
48
+ export enum YTPlayerState {
49
+ Unstarted = -1,
50
+ Ended = 0,
51
+ Playing = 1,
52
+ Paused = 2,
53
+ Buffering = 3,
54
+ VideoCued = 5
55
+ }
56
+
57
+ export interface YTPlayer {
58
+ loadVideoById(videoId: string, startSeconds?: number): void;
59
+ loadVideoById(params: {
60
+ videoId: string;
61
+ startSeconds?: number;
62
+ endSeconds?: number;
63
+ }): void;
64
+
65
+ loadVideoByUrl(mediaContentUrl: string, startSeconds?: number): void;
66
+ loadVideoByUrl(params: {
67
+ mediaContentUrl: string;
68
+ startSeconds?: number;
69
+ endSeconds?: number;
70
+ }): void;
71
+
72
+ playVideo(): void;
73
+ pauseVideo(): void;
74
+ stopVideo(): void;
75
+ seekTo(seconds: number, allowSeekAhead: boolean): void;
76
+
77
+ mute(): void;
78
+ unMute(): void;
79
+ isMuted(): void;
80
+ setVolume(volume: number): void;
81
+ getVolume(): void;
82
+ setSize(width: number, height: number): void;
83
+ setLoop(loopPlaylists: boolean): void;
84
+
85
+ getVideoLoadedFraction(): number;
86
+ getPlayerState(): YTPlayerState;
87
+
88
+ getDuration(): number; // in seconds
89
+ getVideoUrl(): string;
90
+ getVideoEmbedCode(): string;
91
+
92
+ getIframe(): HTMLIFrameElement | undefined;
93
+ destroy(): void;
94
+ }
95
+
96
+ declare global {
97
+ interface Window {
98
+ YT?: YT;
99
+ onYouTubeIframeAPIReady?: () => void;
100
+ }
101
+ }
@@ -1,12 +1,12 @@
1
- import { useEffect, useState } from 'react';
2
- import { YT } from './YoutubeIframeApi';
3
- import { YouTubeIframeApiLoader } from './YouTubeIframeApiLoader';
4
-
5
- export function useYouTubeIframeApi(): YT | undefined {
6
- const [YT, setYT] = useState<YT | undefined>(undefined);
7
- useEffect(() => {
8
- const loader = YouTubeIframeApiLoader.create();
9
- loader.getApi().then((YT) => setYT(YT));
10
- }, []);
11
- return YT;
12
- }
1
+ import { useEffect, useState } from 'react';
2
+ import { YT } from './YoutubeIframeApi';
3
+ import { YouTubeIframeApiLoader } from './YouTubeIframeApiLoader';
4
+
5
+ export function useYouTubeIframeApi(): YT | undefined {
6
+ const [YT, setYT] = useState<YT | undefined>(undefined);
7
+ useEffect(() => {
8
+ const loader = YouTubeIframeApiLoader.create();
9
+ loader.getApi().then((YT) => setYT(YT));
10
+ }, []);
11
+ return YT;
12
+ }
@@ -1,63 +1,63 @@
1
- import { areFillsVisible, FillLayer } from './areFillsVisible';
2
-
3
- const solidFillVisible: FillLayer = {
4
- type: 'solid',
5
- value: 'rgba(0, 0, 0, 1)',
6
- };
7
-
8
- const linearFillVisible: FillLayer = {
9
- type: 'linear-gradient',
10
- colors: [{ value: 'rgba(0, 0, 0, 1)' }, { value: 'rgba(255, 255, 255, 1)' }],
11
- };
12
-
13
- const radialFillVisible: FillLayer = {
14
- type: 'radial-gradient',
15
- colors: [{ value: 'rgba(0, 0, 0, 1)' }, { value: 'rgba(255, 255, 255, 1)' }],
16
- };
17
-
18
- const conicFillVisible: FillLayer = {
19
- type: 'conic-gradient',
20
- colors: [{ value: 'rgba(0, 0, 0, 1)' }, { value: 'rgba(255, 255, 255, 1)' }],
21
- };
22
-
23
- const imageFillVisible: FillLayer = {
24
- type: 'image',
25
- opacity: 1,
26
- };
27
-
28
- const solidFillTransparent: FillLayer = {
29
- type: 'solid',
30
- value: 'rgba(0, 0, 0, 0)',
31
- };
32
-
33
- const linearFillTransparent: FillLayer = {
34
- type: 'linear-gradient',
35
- colors: [{ value: 'rgba(0, 0, 0, 0)' }, { value: 'rgba(255, 255, 255, 0)' }],
36
- };
37
-
38
- const radialFillTransparent: FillLayer = {
39
- type: 'radial-gradient',
40
- colors: [{ value: 'rgba(0, 0, 0, 0)' }, { value: 'rgba(255, 255, 255, 0)' }],
41
- };
42
-
43
- const conicFillTransparent: FillLayer = {
44
- type: 'conic-gradient',
45
- colors: [{ value: 'rgba(0, 0, 0, 0)' }, { value: 'rgba(255, 255, 255, 0)' }],
46
- };
47
-
48
- const imageFillTransparent: FillLayer = {
49
- type: 'image',
50
- opacity: 0,
51
- };
52
-
53
- describe('areFillsVisible', () => {
54
- it('should return true if the fills are visible', () => {
55
- expect(areFillsVisible([solidFillVisible, linearFillVisible, radialFillVisible, conicFillVisible, imageFillVisible])).toBe(true);
56
- });
57
- it('should return false if the fills are transparent', () => {
58
- expect(areFillsVisible([solidFillTransparent, linearFillTransparent, radialFillTransparent, conicFillTransparent, imageFillTransparent])).toBe(false);
59
- });
60
- it('should return true if some fills are visible and some are transparent', () => {
61
- expect(areFillsVisible([solidFillVisible, solidFillTransparent, linearFillVisible, linearFillTransparent, radialFillVisible, radialFillTransparent, conicFillVisible, conicFillTransparent, imageFillVisible, imageFillTransparent])).toBe(true);
62
- });
63
- });
1
+ import { areFillsVisible, FillLayer } from './areFillsVisible';
2
+
3
+ const solidFillVisible: FillLayer = {
4
+ type: 'solid',
5
+ value: 'rgba(0, 0, 0, 1)',
6
+ };
7
+
8
+ const linearFillVisible: FillLayer = {
9
+ type: 'linear-gradient',
10
+ colors: [{ value: 'rgba(0, 0, 0, 1)' }, { value: 'rgba(255, 255, 255, 1)' }],
11
+ };
12
+
13
+ const radialFillVisible: FillLayer = {
14
+ type: 'radial-gradient',
15
+ colors: [{ value: 'rgba(0, 0, 0, 1)' }, { value: 'rgba(255, 255, 255, 1)' }],
16
+ };
17
+
18
+ const conicFillVisible: FillLayer = {
19
+ type: 'conic-gradient',
20
+ colors: [{ value: 'rgba(0, 0, 0, 1)' }, { value: 'rgba(255, 255, 255, 1)' }],
21
+ };
22
+
23
+ const imageFillVisible: FillLayer = {
24
+ type: 'image',
25
+ opacity: 1,
26
+ };
27
+
28
+ const solidFillTransparent: FillLayer = {
29
+ type: 'solid',
30
+ value: 'rgba(0, 0, 0, 0)',
31
+ };
32
+
33
+ const linearFillTransparent: FillLayer = {
34
+ type: 'linear-gradient',
35
+ colors: [{ value: 'rgba(0, 0, 0, 0)' }, { value: 'rgba(255, 255, 255, 0)' }],
36
+ };
37
+
38
+ const radialFillTransparent: FillLayer = {
39
+ type: 'radial-gradient',
40
+ colors: [{ value: 'rgba(0, 0, 0, 0)' }, { value: 'rgba(255, 255, 255, 0)' }],
41
+ };
42
+
43
+ const conicFillTransparent: FillLayer = {
44
+ type: 'conic-gradient',
45
+ colors: [{ value: 'rgba(0, 0, 0, 0)' }, { value: 'rgba(255, 255, 255, 0)' }],
46
+ };
47
+
48
+ const imageFillTransparent: FillLayer = {
49
+ type: 'image',
50
+ opacity: 0,
51
+ };
52
+
53
+ describe('areFillsVisible', () => {
54
+ it('should return true if the fills are visible', () => {
55
+ expect(areFillsVisible([solidFillVisible, linearFillVisible, radialFillVisible, conicFillVisible, imageFillVisible])).toBe(true);
56
+ });
57
+ it('should return false if the fills are transparent', () => {
58
+ expect(areFillsVisible([solidFillTransparent, linearFillTransparent, radialFillTransparent, conicFillTransparent, imageFillTransparent])).toBe(false);
59
+ });
60
+ it('should return true if some fills are visible and some are transparent', () => {
61
+ expect(areFillsVisible([solidFillVisible, solidFillTransparent, linearFillVisible, linearFillTransparent, radialFillVisible, radialFillTransparent, conicFillVisible, conicFillTransparent, imageFillVisible, imageFillTransparent])).toBe(true);
62
+ });
63
+ });
@@ -1,37 +1,37 @@
1
- import { CntrlColor } from '@cntrl-site/color';
2
-
3
- export function areFillsVisible(fills: FillLayer[]) {
4
- return fills.some(fill => {
5
- switch (fill.type) {
6
- case 'solid':
7
- return CntrlColor.parse(fill.value).getAlpha() !== 0;
8
- case 'linear-gradient':
9
- return fill.colors.some(color => CntrlColor.parse(color.value).getAlpha() !== 0);
10
- case 'radial-gradient':
11
- return fill.colors.some(color => CntrlColor.parse(color.value).getAlpha() !== 0);
12
- case 'conic-gradient':
13
- return fill.colors.some(color => CntrlColor.parse(color.value).getAlpha() !== 0);
14
- case 'image':
15
- return fill.opacity !== 0;
16
- default:
17
- return true;
18
- }
19
- });
20
- }
21
-
22
- export type FillLayer = {
23
- type: 'solid';
24
- value: string;
25
- } | {
26
- type: 'linear-gradient';
27
- colors: { value: string; }[];
28
- } | {
29
- type: 'radial-gradient';
30
- colors: { value: string; }[];
31
- } | {
32
- type: 'conic-gradient';
33
- colors: { value: string; }[];
34
- } | {
35
- type: 'image';
36
- opacity: number;
37
- }
1
+ import { CntrlColor } from '@cntrl-site/color';
2
+
3
+ export function areFillsVisible(fills: FillLayer[]) {
4
+ return fills.some(fill => {
5
+ switch (fill.type) {
6
+ case 'solid':
7
+ return CntrlColor.parse(fill.value).getAlpha() !== 0;
8
+ case 'linear-gradient':
9
+ return fill.colors.some(color => CntrlColor.parse(color.value).getAlpha() !== 0);
10
+ case 'radial-gradient':
11
+ return fill.colors.some(color => CntrlColor.parse(color.value).getAlpha() !== 0);
12
+ case 'conic-gradient':
13
+ return fill.colors.some(color => CntrlColor.parse(color.value).getAlpha() !== 0);
14
+ case 'image':
15
+ return fill.opacity !== 0;
16
+ default:
17
+ return true;
18
+ }
19
+ });
20
+ }
21
+
22
+ export type FillLayer = {
23
+ type: 'solid';
24
+ value: string;
25
+ } | {
26
+ type: 'linear-gradient';
27
+ colors: { value: string; }[];
28
+ } | {
29
+ type: 'radial-gradient';
30
+ colors: { value: string; }[];
31
+ } | {
32
+ type: 'conic-gradient';
33
+ colors: { value: string; }[];
34
+ } | {
35
+ type: 'image';
36
+ opacity: number;
37
+ }