Skip to content

Commit 2963dd8

Browse files
authored
feat: Handle transform arrays (#37)
Closes CLIF-2705
1 parent 2307f31 commit 2963dd8

File tree

7 files changed

+105
-3
lines changed

7 files changed

+105
-3
lines changed

.changeset/weak-cups-attack.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@plextv/react-lightning-plugin-css-transform": patch
3+
"@plextv/react-lightning-example": patch
4+
---
5+
6+
Allow transforms to be given as arrays

apps/react-lightning-example/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"@plextv/react-lightning": "workspace:*",
2727
"@plextv/react-lightning-components": "workspace:*",
2828
"@plextv/react-lightning-plugin-flexbox": "workspace:*",
29+
"@plextv/react-lightning-plugin-css-transform": "workspace:*",
2930
"react": "18.3.1",
3031
"react-dom": "18.3.1",
3132
"react-router-dom": "7.1.5",

apps/react-lightning-example/src/index.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
type RenderOptions,
55
createRoot as createRootLng,
66
} from '@plextv/react-lightning';
7+
import { plugin as cssTransformPlugin } from '@plextv/react-lightning-plugin-css-transform';
78
import { plugin as flexPlugin } from '@plextv/react-lightning-plugin-flexbox';
89
import { createRoot as createRootDom } from 'react-dom/client';
910
import { RouterProvider, createBrowserRouter } from 'react-router-dom';
@@ -16,6 +17,7 @@ import { Page60 } from './pages/Page60';
1617
import { PosterPage } from './pages/PosterPage';
1718
import { ShaderPage } from './pages/ShaderPage';
1819
import { TexturePage } from './pages/TexturePage';
20+
import { TransformsPage } from './pages/TransformsPage';
1921
import { MyCustomShader } from './shaders/MyCustomShader';
2022
import { MyCustomTexture } from './shaders/MyCustomTexture';
2123
import { NoiseEffect } from './shaders/NoiseEffect';
@@ -51,6 +53,10 @@ const router = createBrowserRouter([
5153
path: '/texture',
5254
element: <TexturePage />,
5355
},
56+
{
57+
path: '/transforms',
58+
element: <TransformsPage />,
59+
},
5460
{
5561
path: '/page60',
5662
element: <Page60 />,
@@ -77,7 +83,7 @@ const options: RenderOptions = {
7783
}),
7884
],
7985
enableContextSpy: true,
80-
plugins: [flexPlugin()],
86+
plugins: [cssTransformPlugin(), flexPlugin()],
8187
effects: {
8288
Noise: NoiseEffect,
8389
StaticAlpha: StaticAlphaEffect,
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { Column, Row } from '@plextv/react-lightning-components';
2+
import { useCallback, useState } from 'react';
3+
import Button from '../components/Button';
4+
5+
const img =
6+
'https://images.plex.tv/photo?size=large-720&scale=2&url=https://image.tmdb.org/t/p/original/65firYWt2FoK18KuYxnmHmVaEsL.jpg';
7+
8+
export const TransformsPage = () => {
9+
const [scale, setScale] = useState(1);
10+
const [rotation, setRotation] = useState(0);
11+
12+
const scaleUp = useCallback(() => {
13+
setScale((state) => state * 1.25);
14+
}, []);
15+
const scaleDown = useCallback(() => {
16+
setScale((state) => state * 0.8);
17+
}, []);
18+
const rotateLeft = useCallback(() => {
19+
setRotation((state) => state + 15);
20+
}, []);
21+
const rotateRight = useCallback(() => {
22+
setRotation((state) => state - 15);
23+
}, []);
24+
25+
return (
26+
<Column
27+
focusable
28+
style={{
29+
gap: 20,
30+
zIndex: 10,
31+
position: 'absolute',
32+
top: 0,
33+
left: 0,
34+
width: 1920,
35+
height: 1080,
36+
justifyContent: 'center',
37+
alignItems: 'center',
38+
}}
39+
>
40+
<Row>
41+
<Button onPress={scaleUp}>Scale Up</Button>
42+
<Button onPress={scaleDown}>Scale Down</Button>
43+
<Button onPress={rotateLeft}>Rotate Left</Button>
44+
<Button onPress={rotateRight}>Rotate Right</Button>
45+
</Row>
46+
<lng-image
47+
src={img}
48+
style={{
49+
width: 720,
50+
zIndex: -1,
51+
transform: [{ scale }, { rotate: `${rotation}deg` }],
52+
}}
53+
/>
54+
</Column>
55+
);
56+
};

packages/plugin-css-transform/src/utils/convertCSSTransformToLightning.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ export function convertCSSTransformToLightning(
9696
transformResult.scaleY = getValue(transformValue, 1, Number.parseFloat);
9797
break;
9898
case 'rotate':
99+
case 'rotation':
99100
transformResult.rotation = getValue(
100101
transformValue,
101102
0,

packages/plugin-css-transform/src/utils/parseTransform.ts

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,42 @@ import { convertCSSTransformToLightning } from './convertCSSTransformToLightning
33

44
const transformPartRegex = /(\w+)\(([^)]+)\)/g;
55

6-
export function parseTransform(transform?: string): Transform {
6+
export function parseTransform(
7+
transform?: string | object | Array<object | string>,
8+
): Transform {
79
if (!transform) {
810
return {};
911
}
1012

13+
if (Array.isArray(transform)) {
14+
const transforms = {};
15+
16+
for (const t of transform) {
17+
Object.assign(transforms, parseTransform(t));
18+
}
19+
20+
return transforms;
21+
}
22+
1123
if (typeof transform === 'object') {
12-
return transform;
24+
const safeTransform: Transform = {};
25+
const originalTranform = transform as Record<
26+
string,
27+
string | number | number[]
28+
>;
29+
30+
for (const t of Object.keys(originalTranform)) {
31+
if (!originalTranform[t]) {
32+
continue;
33+
}
34+
35+
Object.assign(
36+
safeTransform,
37+
convertCSSTransformToLightning(t, originalTranform[t]),
38+
);
39+
}
40+
41+
return safeTransform;
1342
}
1443

1544
const transformParts = transform.match(transformPartRegex);

pnpm-lock.yaml

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)