@cntrl-site/sdk-nextjs 1.9.43 → 1.9.44

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 (137) 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 +7 -7
  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/items/CodeEmbedItem/CodeEmbedItem.js +36 -36
  15. package/lib/components/items/ComponentItem/ComponentItem.js +13 -13
  16. package/lib/components/items/CompoundItem/CompoundChild.js +20 -20
  17. package/lib/components/items/CompoundItem/CompoundItem.js +14 -14
  18. package/lib/components/items/CustomItem/CustomItem.js +9 -9
  19. package/lib/components/items/EmbedVideoItem/VimeoEmbed.js +24 -24
  20. package/lib/components/items/EmbedVideoItem/YoutubeEmbed.js +27 -27
  21. package/lib/components/items/FileItem/ImageItem.js +40 -40
  22. package/lib/components/items/FileItem/VideoItem.js +64 -64
  23. package/lib/components/items/GroupItem/GroupItem.js +14 -14
  24. package/lib/components/items/Item.js +30 -30
  25. package/lib/components/items/RectangleItem/RectangleItem.js +29 -29
  26. package/lib/components/items/RichTextItem/RichTextItem.js +22 -22
  27. package/lib/utils/RichTextConverter/RichTextConverter.js +21 -21
  28. package/package.json +60 -60
  29. package/src/ItemGeometry/CSSPropertyNameMap.ts +37 -37
  30. package/src/ItemGeometry/GenericGeometryController.ts +59 -59
  31. package/src/ItemGeometry/ItemGeometryContext.ts +4 -4
  32. package/src/ItemGeometry/ItemGeometryController.ts +22 -22
  33. package/src/ItemGeometry/ItemGeometryService.ts +34 -34
  34. package/src/ItemGeometry/RichTextGeometryController.ts +166 -166
  35. package/src/ItemGeometry/useItemGeometry.ts +25 -25
  36. package/src/common/useCurrentLayout.ts +52 -52
  37. package/src/common/useExemplary.ts +9 -9
  38. package/src/common/useItemFXData.ts +47 -47
  39. package/src/common/useKeyframeValue.ts +85 -85
  40. package/src/common/useRegisterResize.ts +16 -16
  41. package/src/components/Article.tsx +75 -75
  42. package/src/components/ArticleWrapper.tsx +21 -21
  43. package/src/components/Head.tsx +56 -56
  44. package/src/components/LayoutStyle.tsx +21 -21
  45. package/src/components/Page.tsx +38 -38
  46. package/src/components/ScrollPlaybackVideo.tsx +56 -56
  47. package/src/components/Section/Section.tsx +129 -129
  48. package/src/components/Section/SectionImage.tsx +48 -48
  49. package/src/components/Section/SectionVideo.tsx +144 -144
  50. package/src/components/Section/useSectionColor.ts +19 -19
  51. package/src/components/Section/useSectionHeightMap.ts +19 -19
  52. package/src/components/items/CodeEmbedItem/CodeEmbedItem.tsx +147 -147
  53. package/src/components/items/CodeEmbedItem/useCodeEmbedItem.ts +36 -36
  54. package/src/components/items/ComponentItem/ComponentItem.tsx +72 -72
  55. package/src/components/items/ComponentItem/useComponentItem.ts +35 -35
  56. package/src/components/items/CompoundItem/CompoundChild.tsx +150 -150
  57. package/src/components/items/CompoundItem/CompoundItem.tsx +87 -87
  58. package/src/components/items/CompoundItem/useCompoundItem.ts +21 -21
  59. package/src/components/items/CustomItem/CustomItem.tsx +50 -50
  60. package/src/components/items/EmbedVideoItem/VimeoEmbed.tsx +216 -216
  61. package/src/components/items/EmbedVideoItem/YoutubeEmbed.tsx +200 -200
  62. package/src/components/items/EmbedVideoItem/useEmbedVideoItem.ts +46 -46
  63. package/src/components/items/FileItem/ImageItem.tsx +165 -165
  64. package/src/components/items/FileItem/VideoItem.tsx +282 -282
  65. package/src/components/items/FileItem/useFileItem.ts +81 -81
  66. package/src/components/items/GroupItem/GroupItem.tsx +98 -98
  67. package/src/components/items/GroupItem/useGroupItem.ts +34 -34
  68. package/src/components/items/Item.tsx +267 -267
  69. package/src/components/items/LinkWrapper.tsx +39 -39
  70. package/src/components/items/RectangleItem/RectangleItem.tsx +184 -184
  71. package/src/components/items/RectangleItem/useRectangleItem.ts +89 -89
  72. package/src/components/items/RichTextItem/RichTextItem.tsx +112 -112
  73. package/src/components/items/RichTextItem/useRichTextItem.ts +12 -12
  74. package/src/components/items/RichTextWrapper.tsx +15 -15
  75. package/src/components/items/itemsMap.ts +28 -28
  76. package/src/components/items/useDraggable.ts +252 -252
  77. package/src/components/items/useItemAngle.ts +13 -13
  78. package/src/components/items/useItemArea.ts +35 -35
  79. package/src/components/items/useItemPointerEvents.ts +23 -23
  80. package/src/components/items/useItemScale.ts +17 -17
  81. package/src/components/items/useItemTriggers.ts +15 -15
  82. package/src/components/items/useRichTextItemValues.ts +66 -66
  83. package/src/components/items/useSizing.ts +25 -25
  84. package/src/components/items/useStickyItemTop.ts +21 -21
  85. package/src/components/useLayoutContext.ts +7 -7
  86. package/src/index.ts +24 -24
  87. package/src/interactions/InteractionsRegistry.ts +512 -512
  88. package/src/interactions/ItemInteractionCtrl.ts +78 -78
  89. package/src/interactions/getTransition.ts +27 -27
  90. package/src/interactions/types.ts +36 -36
  91. package/src/interactions/useItemInteractionCtrl.ts +18 -18
  92. package/src/provider/ArticleRectContext.ts +4 -4
  93. package/src/provider/CntrlContext.ts +5 -5
  94. package/src/provider/CntrlProvider.tsx +11 -11
  95. package/src/provider/CntrlSdkContext.ts +84 -84
  96. package/src/provider/CustomItemRegistry.ts +14 -14
  97. package/src/provider/CustomItemTypes.ts +3 -3
  98. package/src/provider/CustomSectionRegistry.ts +25 -25
  99. package/src/provider/InteractionsContext.tsx +73 -73
  100. package/src/provider/Keyframes.ts +11 -11
  101. package/src/provider/KeyframesContext.ts +5 -5
  102. package/src/provider/LayoutContext.ts +3 -3
  103. package/src/provider/WebGLContextManagerContext.tsx +4 -4
  104. package/src/provider/defaultContext.ts +8 -8
  105. package/src/provider/useCntrlContext.ts +8 -8
  106. package/src/styled-jsx.d.ts +1 -1
  107. package/src/utils/Animator/Animator.ts +570 -570
  108. package/src/utils/ArticleRectManager/ArticleRectObserver.ts +93 -93
  109. package/src/utils/ArticleRectManager/useArticleRectObserver.ts +17 -17
  110. package/src/utils/ArticleRectManager/useSectionRegistry.ts +11 -11
  111. package/src/utils/CSSNumeric.ts +19 -19
  112. package/src/utils/EventEmitter.ts +41 -41
  113. package/src/utils/RichTextConverter/RichTextConverter.tsx +342 -342
  114. package/src/utils/ScaleAnchorMap.ts +13 -13
  115. package/src/utils/StickyManager/StickyManager.ts +23 -23
  116. package/src/utils/Youtube/YouTubeIframeApiLoader.ts +58 -58
  117. package/src/utils/Youtube/YoutubeIframeApi.ts +101 -101
  118. package/src/utils/Youtube/useYouTubeIframeApi.ts +12 -12
  119. package/src/utils/areFillsVisible/areFillsVisible.test.ts +63 -63
  120. package/src/utils/areFillsVisible/areFillsVisible.ts +37 -37
  121. package/src/utils/binSearchInsertAt.ts +33 -33
  122. package/src/utils/castObject.ts +10 -10
  123. package/src/utils/checkOverflowClipSupport.ts +13 -13
  124. package/src/utils/domDfs.ts +11 -11
  125. package/src/utils/effects/useImageFx.ts +156 -156
  126. package/src/utils/effects/useVideoFx.ts +158 -158
  127. package/src/utils/getAnchoredItemTop.ts +12 -12
  128. package/src/utils/getCompoundBoundaryStyles.ts +60 -60
  129. package/src/utils/getFill.ts +46 -46
  130. package/src/utils/getFontFamilyValue.ts +3 -3
  131. package/src/utils/getInvertedRanges.ts +43 -43
  132. package/src/utils/getItemTopStyle.ts +39 -39
  133. package/src/utils/getStyleFromItemStateAndParams.ts +8 -8
  134. package/src/utils/getValidYoutubeUrl.ts +29 -29
  135. package/src/utils/isItemType.ts +5 -5
  136. package/src/utils/rangeMap.ts +13 -13
  137. 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
+ }