@cntrl-site/sdk-nextjs 1.8.40-alpha.0 → 1.8.40

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 (39) hide show
  1. package/lib/components/items/FileItem/ImageItem.js +22 -46
  2. package/lib/components/items/FileItem/VideoItem.js +21 -45
  3. package/lib/components/items/FileItem/useFileItem.js +5 -12
  4. package/lib/components/items/RectangleItem/RectangleItem.js +22 -78
  5. package/lib/components/items/RectangleItem/useRectangleItem.js +8 -15
  6. package/lib/interactions/CSSPropertyNameMap.js +18 -18
  7. package/lib/utils/Animator/Animator.js +19 -171
  8. package/package.json +2 -2
  9. package/src/components/items/CodeEmbedItem/CodeEmbedItem.tsx +1 -1
  10. package/src/components/items/ComponentItem/ComponentItem.tsx +1 -1
  11. package/src/components/items/CompoundItem/CompoundChild.tsx +2 -2
  12. package/src/components/items/CompoundItem/CompoundItem.tsx +1 -1
  13. package/src/components/items/CustomItem/CustomItem.tsx +1 -1
  14. package/src/components/items/EmbedVideoItem/VimeoEmbed.tsx +2 -2
  15. package/src/components/items/EmbedVideoItem/YoutubeEmbed.tsx +2 -2
  16. package/src/components/items/FileItem/ImageItem.tsx +11 -60
  17. package/src/components/items/FileItem/VideoItem.tsx +12 -61
  18. package/src/components/items/FileItem/useFileItem.ts +6 -14
  19. package/src/components/items/GroupItem/GroupItem.tsx +1 -1
  20. package/src/components/items/Item.tsx +2 -2
  21. package/src/components/items/RectangleItem/RectangleItem.tsx +24 -126
  22. package/src/components/items/RectangleItem/useRectangleItem.ts +10 -17
  23. package/src/components/items/RichTextItem/RichTextItem.tsx +5 -5
  24. package/src/interactions/CSSPropertyNameMap.ts +19 -18
  25. package/src/interactions/ItemInteractionCtrl.ts +4 -4
  26. package/src/interactions/types.ts +7 -7
  27. package/src/provider/InteractionsContext.old.tsx +66 -0
  28. package/src/provider/InteractionsContext.test.tsx +97 -0
  29. package/src/utils/Animator/Animator.ts +27 -227
  30. package/src/utils/getStyleFromItemStateAndParams.ts +2 -2
  31. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  32. package/.idea/modules.xml +0 -8
  33. package/.idea/sdk-nextjs.iml +0 -12
  34. package/.idea/vcs.xml +0 -6
  35. package/lib/utils/areFillsVisible/areFillsVisible.js +0 -23
  36. package/lib/utils/getFill.js +0 -43
  37. package/src/utils/areFillsVisible/areFillsVisible.test.ts +0 -63
  38. package/src/utils/areFillsVisible/areFillsVisible.ts +0 -37
  39. package/src/utils/getFill.ts +0 -46
@@ -2,7 +2,6 @@ import { KeyframeType, KeyframeValueMap } from '@cntrl-site/sdk';
2
2
  import { CntrlColor } from '@cntrl-site/color';
3
3
  import { binSearchInsertAt, createInsert } from '../binSearchInsertAt';
4
4
  import { rangeMap } from '../rangeMap';
5
- import { FillLayer } from '@cntrl-site/sdk/dist/types/article/Item';
6
5
 
7
6
  export interface AnimationData<T extends KeyframeType> {
8
7
  position: number;
@@ -19,12 +18,6 @@ export type KeyframesMap = {
19
18
  [T in KeyframeType]: AnimationData<T>[];
20
19
  };
21
20
 
22
- type ColorPoint = {
23
- id: string;
24
- value: string;
25
- position: number;
26
- };
27
-
28
21
  const compare = (lhs: { position: number }, rhs: { position: number }) => lhs.position - rhs.position;
29
22
  const insertBin = createInsert(binSearchInsertAt, compare);
30
23
 
@@ -100,32 +93,40 @@ export class Animator {
100
93
  };
101
94
  }
102
95
 
103
- getBorderFill(
104
- values: KeyframeValueMap[KeyframeType.BorderFill],
96
+ getColor(
97
+ values: KeyframeValueMap[KeyframeType.Color],
105
98
  pos: number
106
- ): FillLayer[] {
107
- const keyframes = this.keyframesMap[KeyframeType.BorderFill];
99
+ ): KeyframeValueMap[KeyframeType.Color] {
100
+ const keyframes = this.keyframesMap[KeyframeType.Color];
108
101
  if (!keyframes || !keyframes.length) return values;
109
102
  if (keyframes.length === 1) {
110
103
  const [keyframe] = keyframes;
111
- return keyframe.value;
104
+ return {
105
+ color: keyframe.value.color
106
+ };
112
107
  }
113
- const { start, end } = this.getStartEnd<KeyframeType.BorderFill>(pos, keyframes);
114
- return this.getRangeGradient(start, end, pos);
108
+ const { start, end } = this.getStartEnd<KeyframeType.Color>(pos, keyframes);
109
+ return {
110
+ color: this.getRangeColor(start, end, pos)
111
+ };
115
112
  }
116
113
 
117
- getFill(
118
- values: KeyframeValueMap[KeyframeType.Fill],
114
+ getBorderColor(
115
+ values: KeyframeValueMap[KeyframeType.BorderColor],
119
116
  pos: number
120
- ): FillLayer[] {
121
- const keyframes = this.keyframesMap[KeyframeType.Fill];
117
+ ): KeyframeValueMap[KeyframeType.BorderColor] {
118
+ const keyframes = this.keyframesMap[KeyframeType.BorderColor];
122
119
  if (!keyframes || !keyframes.length) return values;
123
120
  if (keyframes.length === 1) {
124
121
  const [keyframe] = keyframes;
125
- return keyframe.value;
122
+ return {
123
+ color: keyframe.value.color
124
+ };
126
125
  }
127
- const { start, end } = this.getStartEnd<KeyframeType.Fill>(pos, keyframes);
128
- return this.getRangeGradient(start, end, pos);
126
+ const { start, end } = this.getStartEnd<KeyframeType.BorderColor>(pos, keyframes);
127
+ return {
128
+ color: this.getRangeColor(start, end, pos)
129
+ };
129
130
  }
130
131
 
131
132
  getRadius(
@@ -337,8 +338,8 @@ export class Animator {
337
338
  }
338
339
 
339
340
  private getRangeColor(
340
- start: AnimationData<KeyframeType.TextColor>,
341
- end: AnimationData<KeyframeType.TextColor>,
341
+ start: AnimationData<KeyframeType.Color | KeyframeType.BorderColor | KeyframeType.TextColor>,
342
+ end: AnimationData<KeyframeType.Color | KeyframeType.BorderColor | KeyframeType.TextColor>,
342
343
  position: number
343
344
  ): string {
344
345
  const rangeAmount = rangeMap(position, start.position, end.position, 0, 1, true);
@@ -347,207 +348,6 @@ export class Animator {
347
348
  const mixedColor = startColor.mix(endColor, rangeAmount);
348
349
  return mixedColor.fmt('oklch');
349
350
  }
350
-
351
- private getRangeGradient(
352
- start: AnimationData<KeyframeType.Fill | KeyframeType.BorderFill>,
353
- end: AnimationData<KeyframeType.Fill | KeyframeType.BorderFill>,
354
- position: number
355
- ): FillLayer[] {
356
- const rangeAmount = rangeMap(position, start.position, end.position, 0, 1, true);
357
- const allLayerIds = new Set([
358
- ...start.value.map(layer => layer.id),
359
- ...end.value.map(layer => layer.id)
360
- ]);
361
- const result: FillLayer[] = [];
362
- for (const layerId of allLayerIds) {
363
- const startLayers = start.value.find(layer => layer.id === layerId);
364
- const endLayers = end.value.find(layer => layer.id === layerId);
365
- const startLayersArray = Array.isArray(startLayers) ? startLayers : startLayers ? [startLayers] : [];
366
- const endLayersArray = Array.isArray(endLayers) ? endLayers : endLayers ? [endLayers] : [];
367
- if (startLayersArray.length > 0 && endLayersArray.length === 0) {
368
- result.push(...startLayersArray);
369
- continue;
370
- }
371
- if (startLayersArray.length === 0 && endLayersArray.length > 0) {
372
- result.push(...endLayersArray);
373
- continue;
374
- }
375
- if (startLayersArray.length > 0 && endLayersArray.length > 0) {
376
- result.push(...this.interpolateFillLayerArray(startLayersArray, endLayersArray, rangeAmount));
377
- }
378
- }
379
-
380
- return result;
381
- }
382
-
383
- private interpolateFillLayerArray(startLayers: FillLayer[], endLayers: FillLayer[], rangeAmount: number): FillLayer[] {
384
- const startLayerMap = new Map(startLayers.map(layer => [layer.id, layer]));
385
- const endLayerMap = new Map(endLayers.map(layer => [layer.id, layer]));
386
- const allLayerIds = new Set([
387
- ...startLayers.map(layer => layer.id),
388
- ...endLayers.map(layer => layer.id)
389
- ]);
390
-
391
- const interpolatedLayers: FillLayer[] = [];
392
-
393
- for (const layerId of allLayerIds) {
394
- const startLayer = startLayerMap.get(layerId);
395
- const endLayer = endLayerMap.get(layerId);
396
- if (startLayer && !endLayer) {
397
- interpolatedLayers.push(startLayer);
398
- continue;
399
- }
400
- if (!startLayer && endLayer) {
401
- interpolatedLayers.push(endLayer);
402
- continue;
403
- }
404
- if (startLayer && endLayer) {
405
- interpolatedLayers.push(this.interpolateFillLayer(startLayer, endLayer, rangeAmount));
406
- }
407
- }
408
- const result: FillLayer[] = [];
409
- for (const startLayer of startLayers) {
410
- const interpolatedLayer = interpolatedLayers.find(layer => layer.id === startLayer.id);
411
- if (interpolatedLayer) {
412
- result.push(interpolatedLayer);
413
- }
414
- }
415
- for (const endLayer of endLayers) {
416
- if (!startLayerMap.has(endLayer.id)) {
417
- const interpolatedLayer = interpolatedLayers.find(layer => layer.id === endLayer.id);
418
- if (interpolatedLayer) {
419
- result.push(interpolatedLayer);
420
- }
421
- }
422
- }
423
-
424
- return result;
425
- }
426
-
427
- private interpolateFillLayer(startLayer: FillLayer, endLayer: FillLayer, rangeAmount: number): FillLayer {
428
- if (startLayer.type !== endLayer.type) {
429
- return startLayer;
430
- }
431
-
432
- switch (startLayer.type) {
433
- case 'solid': {
434
- const endSolidLayer = endLayer as typeof startLayer;
435
- const startColor = CntrlColor.parse(startLayer.value);
436
- const endColor = CntrlColor.parse(endSolidLayer.value);
437
- const mixedColor = startColor.mix(endColor, rangeAmount);
438
- return {
439
- ...startLayer,
440
- value: mixedColor.fmt('oklch')
441
- };
442
- }
443
-
444
- case 'linear-gradient': {
445
- const endLinearLayer = endLayer as typeof startLayer;
446
- const interpolatedColors = this.interpolateColorStops(startLayer.colors, endLinearLayer.colors, rangeAmount);
447
- const angle = startLayer.angle + (endLinearLayer.angle - startLayer.angle) * rangeAmount;
448
- const startPoint: [number, number] = [
449
- startLayer.start[0] + (endLinearLayer.start[0] - startLayer.start[0]) * rangeAmount,
450
- startLayer.start[1] + (endLinearLayer.start[1] - startLayer.start[1]) * rangeAmount
451
- ];
452
- const endPoint: [number, number] = [
453
- startLayer.end[0] + (endLinearLayer.end[0] - startLayer.end[0]) * rangeAmount,
454
- startLayer.end[1] + (endLinearLayer.end[1] - startLayer.end[1]) * rangeAmount
455
- ];
456
- return {
457
- ...startLayer,
458
- colors: interpolatedColors,
459
- angle,
460
- start: startPoint,
461
- end: endPoint
462
- };
463
- }
464
-
465
- case 'radial-gradient': {
466
- const endRadialLayer = endLayer as typeof startLayer;
467
- const interpolatedColors = this.interpolateColorStops(startLayer.colors, endRadialLayer.colors, rangeAmount);
468
- const angle = startLayer.angle + (endRadialLayer.angle - startLayer.angle) * rangeAmount;
469
- const center: [number, number] = [
470
- startLayer.center[0] + (endRadialLayer.center[0] - startLayer.center[0]) * rangeAmount,
471
- startLayer.center[1] + (endRadialLayer.center[1] - startLayer.center[1]) * rangeAmount
472
- ];
473
- const diameter = startLayer.diameter + (endRadialLayer.diameter - startLayer.diameter) * rangeAmount;
474
- return {
475
- ...startLayer,
476
- colors: interpolatedColors,
477
- angle,
478
- center,
479
- diameter
480
- };
481
- }
482
-
483
- case 'conic-gradient': {
484
- const endConicLayer = endLayer as typeof startLayer;
485
- const interpolatedColors = this.interpolateColorStops(startLayer.colors, endConicLayer.colors, rangeAmount);
486
- const angle = startLayer.angle + (endConicLayer.angle - startLayer.angle) * rangeAmount;
487
- const center: [number, number] = [
488
- startLayer.center[0] + (endConicLayer.center[0] - startLayer.center[0]) * rangeAmount,
489
- startLayer.center[1] + (endConicLayer.center[1] - startLayer.center[1]) * rangeAmount
490
- ];
491
- return {
492
- ...startLayer,
493
- colors: interpolatedColors,
494
- angle,
495
- center
496
- };
497
- }
498
-
499
- case 'image': {
500
- const endImageLayer = endLayer as typeof startLayer;
501
- const opacity = startLayer.opacity + (endImageLayer.opacity - startLayer.opacity) * rangeAmount;
502
- const backgroundSize = startLayer.backgroundSize + (endImageLayer.backgroundSize - startLayer.backgroundSize) * rangeAmount;
503
- return {
504
- ...startLayer,
505
- opacity,
506
- backgroundSize
507
- };
508
- }
509
-
510
- default:
511
- return startLayer;
512
- }
513
- }
514
-
515
- private interpolateColorStops(startColors: ColorPoint[], endColors: ColorPoint[], rangeAmount: number): ColorPoint[] {
516
- const startColorMap = new Map(startColors.map(stop => [stop.id, stop]));
517
- const endColorMap = new Map(endColors.map(stop => [stop.id, stop]));
518
- const allStopIds = new Set([
519
- ...startColors.map(stop => stop.id),
520
- ...endColors.map(stop => stop.id)
521
- ]);
522
-
523
- const interpolatedStops: ColorPoint[] = [];
524
-
525
- for (const stopId of allStopIds) {
526
- const startStop = startColorMap.get(stopId);
527
- const endStop = endColorMap.get(stopId);
528
- if (startStop && !endStop) {
529
- interpolatedStops.push(startStop);
530
- continue;
531
- }
532
- if (!startStop && endStop) {
533
- interpolatedStops.push(endStop);
534
- continue;
535
- }
536
- if (startStop && endStop) {
537
- const startColor = CntrlColor.parse(startStop.value);
538
- const endColor = CntrlColor.parse(endStop.value);
539
- const mixedColor = startColor.mix(endColor, rangeAmount);
540
- const position = startStop.position + (endStop.position - startStop.position) * rangeAmount;
541
-
542
- interpolatedStops.push({
543
- id: stopId,
544
- value: mixedColor.fmt('oklch'),
545
- position
546
- });
547
- }
548
- }
549
- return interpolatedStops.sort((a, b) => a.position - b.position);
550
- }
551
351
  }
552
352
 
553
353
  function createKeyframesMap(): KeyframesMap {
@@ -556,8 +356,9 @@ function createKeyframesMap(): KeyframesMap {
556
356
  [KeyframeType.Position]: [],
557
357
  [KeyframeType.BorderWidth]: [],
558
358
  [KeyframeType.BorderRadius]: [],
359
+ [KeyframeType.Color]: [],
559
360
  [KeyframeType.Rotation]: [],
560
- [KeyframeType.BorderFill]: [],
361
+ [KeyframeType.BorderColor]: [],
561
362
  [KeyframeType.Opacity]: [],
562
363
  [KeyframeType.Scale]: [],
563
364
  [KeyframeType.Blur]: [],
@@ -565,7 +366,6 @@ function createKeyframesMap(): KeyframesMap {
565
366
  [KeyframeType.LetterSpacing]: [],
566
367
  [KeyframeType.WordSpacing]: [],
567
368
  [KeyframeType.TextColor]: [],
568
- [KeyframeType.FXParams]: [],
569
- [KeyframeType.Fill]: []
369
+ [KeyframeType.FXParams]: []
570
370
  };
571
371
  }
@@ -1,5 +1,5 @@
1
- export function getStyleFromItemStateAndParams<T>(
2
- stateValue: T | undefined,
1
+ export function getStyleFromItemStateAndParams<T extends string | number>(
2
+ stateValue: string | number | undefined,
3
3
  paramsValue: T | undefined
4
4
  ): T | undefined {
5
5
  return (stateValue as T) !== undefined
@@ -1,5 +0,0 @@
1
- <component name="ProjectCodeStyleConfiguration">
2
- <state>
3
- <option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
4
- </state>
5
- </component>
package/.idea/modules.xml DELETED
@@ -1,8 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="ProjectModuleManager">
4
- <modules>
5
- <module fileurl="file://$PROJECT_DIR$/.idea/sdk-nextjs.iml" filepath="$PROJECT_DIR$/.idea/sdk-nextjs.iml" />
6
- </modules>
7
- </component>
8
- </project>
@@ -1,12 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <module type="WEB_MODULE" version="4">
3
- <component name="NewModuleRootManager">
4
- <content url="file://$MODULE_DIR$">
5
- <excludeFolder url="file://$MODULE_DIR$/temp" />
6
- <excludeFolder url="file://$MODULE_DIR$/.tmp" />
7
- <excludeFolder url="file://$MODULE_DIR$/tmp" />
8
- </content>
9
- <orderEntry type="inheritedJdk" />
10
- <orderEntry type="sourceFolder" forTests="false" />
11
- </component>
12
- </module>
package/.idea/vcs.xml DELETED
@@ -1,6 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="VcsDirectoryMappings">
4
- <mapping directory="$PROJECT_DIR$" vcs="Git" />
5
- </component>
6
- </project>
@@ -1,23 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.areFillsVisible = void 0;
4
- const color_1 = require("@cntrl-site/color");
5
- function areFillsVisible(fills) {
6
- return fills.some(fill => {
7
- switch (fill.type) {
8
- case 'solid':
9
- return color_1.CntrlColor.parse(fill.value).getAlpha() !== 0;
10
- case 'linear-gradient':
11
- return fill.colors.some(color => color_1.CntrlColor.parse(color.value).getAlpha() !== 0);
12
- case 'radial-gradient':
13
- return fill.colors.some(color => color_1.CntrlColor.parse(color.value).getAlpha() !== 0);
14
- case 'conic-gradient':
15
- return fill.colors.some(color => color_1.CntrlColor.parse(color.value).getAlpha() !== 0);
16
- case 'image':
17
- return fill.opacity !== 0;
18
- default:
19
- return true;
20
- }
21
- });
22
- }
23
- exports.areFillsVisible = areFillsVisible;
@@ -1,43 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getFill = void 0;
4
- function getFill(fill) {
5
- var _a;
6
- if (fill.type === 'linear-gradient' && Array.isArray(fill.colors)) {
7
- return `linear-gradient(${fill.angle}deg, ${fill.colors
8
- .map(c => `${c.value} ${c.position}%`)
9
- .join(', ')})`;
10
- }
11
- if (fill.type === 'radial-gradient' && Array.isArray(fill.colors)) {
12
- const center = fill.center
13
- ? `${fill.center[0] * 100}% ${fill.center[1] * 100}%`
14
- : '50% 50%';
15
- const diameter = fill.diameter;
16
- return `radial-gradient(circle ${diameter * 100} at ${center}, ${fill.colors
17
- .map(c => `${c.value} ${c.position}%`)
18
- .join(', ')})`;
19
- }
20
- if (fill.type === 'conic-gradient' && Array.isArray(fill.colors)) {
21
- const center = fill.center
22
- ? `${fill.center[0] * 100}% ${fill.center[1] * 100}%`
23
- : '50% 50%';
24
- const angle = ((_a = fill.angle) !== null && _a !== void 0 ? _a : 0);
25
- const hasMultipleStops = fill.colors.length > 1;
26
- const lastStop = fill.colors[fill.colors.length - 1];
27
- const shouldAppendWrapStop = hasMultipleStops && typeof lastStop.position === 'number' && lastStop.position < 100;
28
- const colorsWithWrap = shouldAppendWrapStop
29
- ? [...fill.colors, { value: fill.colors[0].value, position: 100 }]
30
- : fill.colors;
31
- return `conic-gradient(from ${angle + 90}deg at ${center}, ${colorsWithWrap
32
- .map(c => `${c.value} ${c.position}%`)
33
- .join(', ')})`;
34
- }
35
- if (fill.type === 'image' && fill.src) {
36
- return `url(${fill.src})`;
37
- }
38
- if (fill.type === 'solid') {
39
- return fill.value;
40
- }
41
- return 'transparent';
42
- }
43
- exports.getFill = getFill;
@@ -1,63 +0,0 @@
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 +0,0 @@
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,46 +0,0 @@
1
- import { FillLayer } from '@cntrl-site/sdk/dist/types/article/Item';
2
-
3
- export function getFill(fill: FillLayer) {
4
- if (fill.type === 'linear-gradient' && Array.isArray(fill.colors)) {
5
- return `linear-gradient(${fill.angle}deg, ${fill.colors
6
- .map(c => `${c.value} ${c.position}%`)
7
- .join(', ')})`;
8
- }
9
-
10
- if (fill.type === 'radial-gradient' && Array.isArray(fill.colors)) {
11
- const center = fill.center
12
- ? `${fill.center[0] * 100}% ${fill.center[1] * 100}%`
13
- : '50% 50%';
14
- const diameter = fill.diameter;
15
- return `radial-gradient(circle ${diameter * 100} at ${center}, ${fill.colors
16
- .map(c => `${c.value} ${c.position}%`)
17
- .join(', ')})`;
18
- }
19
-
20
- if (fill.type === 'conic-gradient' && Array.isArray(fill.colors)) {
21
- const center = fill.center
22
- ? `${fill.center[0] * 100}% ${fill.center[1] * 100}%`
23
- : '50% 50%';
24
- const angle = (fill.angle ?? 0);
25
- const hasMultipleStops = fill.colors.length > 1;
26
- const lastStop = fill.colors[fill.colors.length - 1];
27
- const shouldAppendWrapStop = hasMultipleStops && typeof lastStop.position === 'number' && lastStop.position < 100;
28
- const colorsWithWrap = shouldAppendWrapStop
29
- ? [...fill.colors, { value: fill.colors[0].value, position: 100 }]
30
- : fill.colors;
31
-
32
- return `conic-gradient(from ${angle + 90}deg at ${center}, ${colorsWithWrap
33
- .map(c => `${c.value} ${c.position}%`)
34
- .join(', ')})`;
35
- }
36
-
37
- if (fill.type === 'image' && fill.src) {
38
- return `url(${fill.src})`;
39
- }
40
-
41
- if (fill.type === 'solid') {
42
- return fill.value;
43
- }
44
-
45
- return 'transparent';
46
- }