Skip to content

Commit d2534a1

Browse files
add youtube & google maps support with -x-flags
1 parent dd02284 commit d2534a1

15 files changed

Lines changed: 256 additions & 9 deletions

File tree

packages/builder-web-core/widgets-native/html-iframe-googlemaps/index.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ export class HtmlIframeGoogleMaps extends HtmlIframe {
1212
key,
1313
loading = "lazy",
1414
referrerpolicy = "no-referrer-when-downgrade",
15+
sandbox = "allow-scripts",
1516
q,
1617
...rest
1718
}: { key: WidgetKey } & GoogleMapsProps & IWHStyleWidget) {
1819
super({
1920
key,
2021
...rest,
2122
loading,
23+
sandbox,
2224
referrerpolicy,
2325
src: gmapurl(q),
2426
});
@@ -31,11 +33,15 @@ function gmapurl(q: string, apikey?: string): string {
3133
query.set("q", q);
3234
if (apikey) {
3335
query.set("key", apikey);
34-
}
35-
36-
// build url
37-
const url = new URL("https://www.google.com/maps/embed/v1/place");
38-
url.search = query.toString();
36+
// build url
37+
const url = new URL("https://www.google.com/maps/embed/v1/place");
38+
url.search = query.toString();
3939

40-
return url.toString();
40+
return url.toString();
41+
} else {
42+
query.set("output", "embed");
43+
const url = new URL("https://maps.google.com/maps");
44+
url.search = query.toString();
45+
return url.toString();
46+
}
4147
}

packages/builder-web-core/widgets-native/html-iframe-youtube/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ export class HtmlIframeYoutube extends HtmlIframe {
1212
key,
1313
loading = "lazy",
1414
referrerpolicy = "no-referrer-when-downgrade",
15+
sandbox = ["allow-scripts", "allow-same-origin"],
1516
video,
1617
...rest
1718
}: { key: WidgetKey } & YoutubeProps & IWHStyleWidget) {
1819
super({
1920
key,
2021
...rest,
2122
loading,
23+
sandbox,
2224
referrerpolicy,
2325
src: yturl(video),
2426
});

packages/builder-web-core/widgets-native/html-iframe/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ export class HtmlIframe extends Container implements IIframeProps {
122122
this.height &&
123123
new JSXAttribute("height", new StringLiteral(css.length(this.height))),
124124

125-
this.sandbox.length > 0 &&
125+
this.sandbox?.length > 0 &&
126126
new JSXAttribute(
127127
"sandbox",
128128
new StringLiteral(

packages/builder-web-core/widgets-native/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export * from "./html-input";
1212
export { HtmlIframe as Iframe } from "./html-iframe";
1313
export { HtmlIframeGoogleMaps as GoogleMaps } from "./html-iframe-googlemaps";
1414
export { HtmlIframeOpenStreetMap as OpenStreetMap } from "./html-iframe-osm";
15+
export { HtmlIframeYoutube as Youtube } from "./html-iframe-youtube";
1516
export { HtmlIframeFigma as EmbedFigma } from "./html-iframe-figma";
1617
export * from "./error-widget";
1718

packages/designto-token/support-flags/index.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ import { tokenize_flagged_button } from "./token-button";
1818
import { tokenize_flagged_slider } from "./token-slider";
1919
import { tokenize_flagged_progress } from "./token-progress";
2020

21+
import { tokenize_flagged_google_maps_view } from "./token-x-google-maps-view";
22+
import { tokenize_gradient_direction_from_angle } from "../token-gradient";
23+
import { tokenize_flagged_youtube_view } from "./token-x-youtube-view";
24+
2125
export default function handleWithFlags(node: ReflectSceneNode) {
2226
const flags = parse(node.name);
2327
return _handle_with_flags(node, flags);
@@ -63,6 +67,22 @@ function _handle_with_flags(node, flags: FlagsParseResult) {
6367
}
6468
// #endregion
6569

70+
// #region exetnded views
71+
if (flags.__meta?.contains_x_google_maps_view_flag) {
72+
return tokenize_flagged_google_maps_view(
73+
node,
74+
flags[keys.flag_key__x_google_maps_view]
75+
);
76+
}
77+
78+
if (flags.__meta?.contains_x_youtube_view_flag) {
79+
return tokenize_flagged_youtube_view(
80+
node,
81+
flags[keys.flag_key__x_youtube_view]
82+
);
83+
}
84+
// #end exetnded views
85+
6686
// #region element altering flags
6787
// heading
6888
const heading_flag_alias =

packages/designto-token/support-flags/token-x-figma-embed-view/index.ts

Whitespace-only changes.
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import type {
2+
ReflectFrameNode,
3+
ReflectGroupNode,
4+
ReflectRectangleNode,
5+
ReflectSceneNode,
6+
} from "@design-sdk/figma-node";
7+
import type { Container } from "@reflect-ui/core";
8+
import { tokenizeLayout } from "../../token-layout";
9+
import { tokenizeContainer } from "../../token-container";
10+
import { unwrappedChild } from "../../wrappings";
11+
import type { XGoogleMapsFlag } from "@code-features/flags";
12+
import { WrappingContainer, XGoogleMapsView } from "../../tokens";
13+
import assert from "assert";
14+
import { keyFromNode } from "../../key";
15+
16+
export function tokenize_flagged_google_maps_view(
17+
node: ReflectSceneNode,
18+
flag: XGoogleMapsFlag
19+
) {
20+
try {
21+
const q = flag.value;
22+
node = validate_input(node);
23+
const _key = keyFromNode(node);
24+
25+
const container = unwrappedChild(
26+
node.type === "RECTANGLE"
27+
? tokenizeContainer.fromRectangle(node)
28+
: tokenizeLayout.fromFrameOrGroup(node, [], { is_root: false }, {})
29+
) as Container;
30+
31+
return new WrappingContainer({
32+
...container,
33+
key: keyFromNode(node),
34+
child: new XGoogleMapsView({
35+
key: _key,
36+
...container,
37+
q: q,
38+
}),
39+
});
40+
} catch (e) {
41+
throw new Error(`failed to tokenize google maps view: ${e.message}`);
42+
}
43+
}
44+
45+
type GoogleMapsViewCompatNodeType =
46+
| ReflectFrameNode
47+
| ReflectGroupNode
48+
| ReflectRectangleNode;
49+
50+
function validate_input(node: ReflectSceneNode): GoogleMapsViewCompatNodeType {
51+
assert(
52+
node.type === "FRAME" || node.type === "GROUP" || node.type === "RECTANGLE",
53+
`google maps view target input must be a frame, group or rectangle, but "${node.type}" was given`
54+
);
55+
56+
return node;
57+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import type {
2+
ReflectFrameNode,
3+
ReflectGroupNode,
4+
ReflectRectangleNode,
5+
ReflectSceneNode,
6+
} from "@design-sdk/figma-node";
7+
import type { Container } from "@reflect-ui/core";
8+
import { tokenizeLayout } from "../../token-layout";
9+
import { tokenizeContainer } from "../../token-container";
10+
import { unwrappedChild } from "../../wrappings";
11+
import type { XYoutubeFlag } from "@code-features/flags";
12+
import { WrappingContainer, XYoutubeView } from "../../tokens";
13+
import assert from "assert";
14+
import { keyFromNode } from "../../key";
15+
16+
export function tokenize_flagged_youtube_view(
17+
node: ReflectSceneNode,
18+
flag: XYoutubeFlag
19+
) {
20+
try {
21+
const videoid = flag.value;
22+
node = validate_input(node);
23+
const _key = keyFromNode(node);
24+
25+
const container = unwrappedChild(
26+
node.type === "RECTANGLE"
27+
? tokenizeContainer.fromRectangle(node)
28+
: tokenizeLayout.fromFrameOrGroup(node, [], { is_root: false }, {})
29+
) as Container;
30+
31+
return new WrappingContainer({
32+
...container,
33+
key: keyFromNode(node),
34+
child: new XYoutubeView({
35+
key: _key,
36+
...container,
37+
video: videoid,
38+
}),
39+
});
40+
} catch (e) {
41+
throw new Error(`failed to tokenize google maps view: ${e.message}`);
42+
}
43+
}
44+
45+
type YoutubeViewCompatNodeType =
46+
| ReflectFrameNode
47+
| ReflectGroupNode
48+
| ReflectRectangleNode;
49+
50+
function validate_input(node: ReflectSceneNode): YoutubeViewCompatNodeType {
51+
assert(
52+
node.type === "FRAME" || node.type === "GROUP" || node.type === "RECTANGLE",
53+
`youtube view target input must be a frame, group or rectangle, but "${node.type}" was given`
54+
);
55+
56+
return node;
57+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,7 @@
11
export * from "./stretched";
22
export * from "./wrapping-container";
3+
4+
export * from "./x-figma-embed-view";
5+
export * from "./x-google-maps-view";
6+
export * from "./x-osm-view";
7+
export * from "./x-youtube-view";
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { Container, Widget, WidgetKey } from "@reflect-ui/core";
2+
3+
export class XFigmaEmbedView extends Container {
4+
readonly _type = "x/figma-embed-view";
5+
constructor({ key }: { key: WidgetKey }) {
6+
super({ key });
7+
}
8+
}

0 commit comments

Comments
 (0)