jvetrau-ds 0.2.17 → 0.2.18

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 (31) hide show
  1. package/components/embed-viewer/embed-viewer.cjs +91 -3
  2. package/components/embed-viewer/embed-viewer.cjs.map +1 -1
  3. package/components/embed-viewer/embed-viewer.d.ts +3 -0
  4. package/components/embed-viewer/embed-viewer.js +86 -3
  5. package/components/embed-viewer/embed-viewer.js.map +1 -1
  6. package/components/embed-viewer/open-graph.cjs +61 -0
  7. package/components/embed-viewer/open-graph.cjs.map +1 -0
  8. package/components/embed-viewer/open-graph.d.ts +5 -0
  9. package/components/embed-viewer/open-graph.js +59 -0
  10. package/components/embed-viewer/open-graph.js.map +1 -0
  11. package/components/embed-viewer/providers/figma.cjs +44 -0
  12. package/components/embed-viewer/providers/figma.cjs.map +1 -0
  13. package/components/embed-viewer/providers/figma.d.ts +4 -0
  14. package/components/embed-viewer/providers/figma.js +42 -0
  15. package/components/embed-viewer/providers/figma.js.map +1 -0
  16. package/components/embed-viewer/providers/google.cjs +78 -0
  17. package/components/embed-viewer/providers/google.cjs.map +1 -0
  18. package/components/embed-viewer/providers/google.d.ts +5 -0
  19. package/components/embed-viewer/providers/google.js +76 -0
  20. package/components/embed-viewer/providers/google.js.map +1 -0
  21. package/components/embed-viewer/providers/miro.cjs +37 -0
  22. package/components/embed-viewer/providers/miro.cjs.map +1 -0
  23. package/components/embed-viewer/providers/miro.d.ts +4 -0
  24. package/components/embed-viewer/providers/miro.js +35 -0
  25. package/components/embed-viewer/providers/miro.js.map +1 -0
  26. package/components/embed-viewer/resolver.cjs +64 -0
  27. package/components/embed-viewer/resolver.cjs.map +1 -0
  28. package/components/embed-viewer/resolver.d.ts +15 -0
  29. package/components/embed-viewer/resolver.js +62 -0
  30. package/components/embed-viewer/resolver.js.map +1 -0
  31. package/package.json +1 -1
@@ -1,13 +1,33 @@
1
1
  'use strict';
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
+ var react = require('react');
4
5
  require('./embed-viewer.css');
6
+ var ActionGroup = require('../action-group');
7
+ var Button = require('../button');
5
8
  var classnames = require('../helpers/classnames');
9
+ var openGraph = require('./open-graph');
10
+ var resolver = require('./resolver');
6
11
 
12
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
13
+
14
+ var ActionGroup__default = /*#__PURE__*/_interopDefault(ActionGroup);
15
+ var Button__default = /*#__PURE__*/_interopDefault(Button);
16
+
17
+ function openUrl(url) {
18
+ window.open(
19
+ url,
20
+ "_blank",
21
+ "noopener,noreferrer"
22
+ );
23
+ }
7
24
  const EmbedViewer = ({
8
25
  src,
26
+ embedSrc,
9
27
  iframeTitle,
10
28
  description,
29
+ showTemplateAction = false,
30
+ showOpenAction = false,
11
31
  actions,
12
32
  className = "",
13
33
  ...props
@@ -17,6 +37,43 @@ const EmbedViewer = ({
17
37
  className,
18
38
  {}
19
39
  );
40
+ const resolvedResource = resolver.resolveEmbedResource({
41
+ src,
42
+ embedSrc
43
+ });
44
+ const [
45
+ previewImageUrl,
46
+ setPreviewImageUrl
47
+ ] = react.useState(
48
+ null
49
+ );
50
+ react.useEffect(() => {
51
+ setPreviewImageUrl(null);
52
+ if (resolvedResource.embedUrl || !resolvedResource.sourceUrl) {
53
+ return;
54
+ }
55
+ const controller = new AbortController();
56
+ void openGraph.resolveOpenGraphImage(
57
+ resolvedResource.sourceUrl,
58
+ controller.signal
59
+ ).then((imageUrl) => {
60
+ if (!controller.signal.aborted) {
61
+ setPreviewImageUrl(
62
+ imageUrl
63
+ );
64
+ }
65
+ });
66
+ return () => {
67
+ controller.abort();
68
+ };
69
+ }, [
70
+ resolvedResource.embedUrl,
71
+ resolvedResource.sourceUrl
72
+ ]);
73
+ const templateActionUrl = showTemplateAction && resolvedResource.sourceUrl ? resolvedResource.copyUrl ?? resolvedResource.sourceUrl : null;
74
+ const openActionUrl = showOpenAction && resolvedResource.sourceUrl ? resolvedResource.sourceUrl : null;
75
+ const hasStandardActions = templateActionUrl !== null || openActionUrl !== null;
76
+ const hasActions = hasStandardActions || Boolean(actions);
20
77
  return /* @__PURE__ */ jsxRuntime.jsxs(
21
78
  "div",
22
79
  {
@@ -24,15 +81,46 @@ const EmbedViewer = ({
24
81
  ...props,
25
82
  children: [
26
83
  description && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "embed-viewer__description", children: description }),
27
- /* @__PURE__ */ jsxRuntime.jsx(
84
+ resolvedResource.embedUrl && /* @__PURE__ */ jsxRuntime.jsx(
28
85
  "iframe",
29
86
  {
30
87
  className: "embed-viewer__frame",
31
- src,
88
+ src: resolvedResource.embedUrl,
32
89
  title: iframeTitle
33
90
  }
34
91
  ),
35
- actions && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "embed-viewer__actions", children: actions })
92
+ !resolvedResource.embedUrl && previewImageUrl && /* @__PURE__ */ jsxRuntime.jsx(
93
+ "img",
94
+ {
95
+ className: "embed-viewer__preview",
96
+ src: previewImageUrl,
97
+ alt: ""
98
+ }
99
+ ),
100
+ hasActions && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "embed-viewer__actions", children: [
101
+ hasStandardActions && /* @__PURE__ */ jsxRuntime.jsxs(ActionGroup__default.default, { children: [
102
+ templateActionUrl && /* @__PURE__ */ jsxRuntime.jsx(
103
+ Button__default.default,
104
+ {
105
+ onClick: () => openUrl(
106
+ templateActionUrl
107
+ ),
108
+ children: "\u0421\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0448\u0430\u0431\u043B\u043E\u043D"
109
+ }
110
+ ),
111
+ openActionUrl && /* @__PURE__ */ jsxRuntime.jsx(
112
+ Button__default.default,
113
+ {
114
+ rank: "link",
115
+ onClick: () => openUrl(
116
+ openActionUrl
117
+ ),
118
+ children: "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0432\u043E \u0432\u0435\u0441\u044C \u044D\u043A\u0440\u0430\u043D"
119
+ }
120
+ )
121
+ ] }),
122
+ actions
123
+ ] })
36
124
  ]
37
125
  }
38
126
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/embed-viewer/embed-viewer.tsx"],"names":["classnames","jsxs","jsx"],"mappings":";;;;;;AAgBA,MAAM,cAEF,CAAC;AAAA,EACH,GAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,OAAA,GAAUA,qBAAA;AAAA,IACd,cAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,uBACEC,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,OAAA;AAAA,MACV,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,WAAA,oBACCC,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACZ,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,wBAGFA,cAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,qBAAA;AAAA,YACV,GAAA;AAAA,YACA,KAAA,EAAO;AAAA;AAAA,SACT;AAAA,QAEC,OAAA,oBACCA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBACZ,QAAA,EAAA,OAAA,EACH;AAAA;AAAA;AAAA,GAEJ;AAEJ,CAAA;AAEA,IAAO,oBAAA,GAAQ","file":"embed-viewer.cjs","sourcesContent":["import React from 'react';\n\nimport './embed-viewer.css';\nimport { classnames } from '../helpers/classnames';\n\nexport interface EmbedViewerProps\n extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n > {\n src: string;\n iframeTitle: string;\n description?: React.ReactNode;\n actions?: React.ReactNode;\n}\n\nconst EmbedViewer: React.FC<\n EmbedViewerProps\n> = ({\n src,\n iframeTitle,\n description,\n actions,\n className = '',\n ...props\n}) => {\n const classes = classnames(\n 'embed-viewer',\n className,\n {},\n );\n\n return (\n <div\n className={classes}\n {...props}\n >\n {description && (\n <div className=\"embed-viewer__description\">\n {description}\n </div>\n )}\n\n <iframe\n className=\"embed-viewer__frame\"\n src={src}\n title={iframeTitle}\n />\n\n {actions && (\n <div className=\"embed-viewer__actions\">\n {actions}\n </div>\n )}\n </div>\n );\n};\n\nexport default EmbedViewer;\n"]}
1
+ {"version":3,"sources":["../../../src/components/embed-viewer/embed-viewer.tsx"],"names":["classnames","resolveEmbedResource","useState","useEffect","resolveOpenGraphImage","jsxs","jsx","ActionGroup","Button"],"mappings":"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","file":"embed-viewer.cjs","sourcesContent":["import React, {\n useEffect,\n useState,\n} from 'react';\n\nimport './embed-viewer.css';\nimport ActionGroup from '../action-group';\nimport Button from '../button';\nimport { classnames } from '../helpers/classnames';\nimport {\n resolveOpenGraphImage,\n} from './open-graph';\nimport {\n resolveEmbedResource,\n} from './resolver';\n\nexport interface EmbedViewerProps\n extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n > {\n src: string;\n embedSrc?: string;\n iframeTitle: string;\n description?: React.ReactNode;\n showTemplateAction?: boolean;\n showOpenAction?: boolean;\n actions?: React.ReactNode;\n}\n\nfunction openUrl(url: string) {\n window.open(\n url,\n '_blank',\n 'noopener,noreferrer',\n );\n}\n\nconst EmbedViewer: React.FC<\n EmbedViewerProps\n> = ({\n src,\n embedSrc,\n iframeTitle,\n description,\n showTemplateAction = false,\n showOpenAction = false,\n actions,\n className = '',\n ...props\n}) => {\n const classes = classnames(\n 'embed-viewer',\n className,\n {},\n );\n\n const resolvedResource =\n resolveEmbedResource({\n src,\n embedSrc,\n });\n\n const [\n previewImageUrl,\n setPreviewImageUrl,\n ] = useState<string | null>(\n null,\n );\n\n useEffect(() => {\n setPreviewImageUrl(null);\n\n if (\n resolvedResource.embedUrl ||\n !resolvedResource.sourceUrl\n ) {\n return;\n }\n\n const controller =\n new AbortController();\n\n void resolveOpenGraphImage(\n resolvedResource.sourceUrl,\n controller.signal,\n ).then((imageUrl) => {\n if (\n !controller.signal.aborted\n ) {\n setPreviewImageUrl(\n imageUrl,\n );\n }\n });\n\n return () => {\n controller.abort();\n };\n }, [\n resolvedResource.embedUrl,\n resolvedResource.sourceUrl,\n ]);\n\n const templateActionUrl =\n showTemplateAction &&\n resolvedResource.sourceUrl\n ? (\n resolvedResource.copyUrl ??\n resolvedResource.sourceUrl\n )\n : null;\n\n const openActionUrl =\n showOpenAction &&\n resolvedResource.sourceUrl\n ? resolvedResource.sourceUrl\n : null;\n\n const hasStandardActions =\n templateActionUrl !== null ||\n openActionUrl !== null;\n\n const hasActions =\n hasStandardActions ||\n Boolean(actions);\n\n return (\n <div\n className={classes}\n {...props}\n >\n {description && (\n <div className=\"embed-viewer__description\">\n {description}\n </div>\n )}\n\n {resolvedResource.embedUrl && (\n <iframe\n className=\"embed-viewer__frame\"\n src={\n resolvedResource.embedUrl\n }\n title={iframeTitle}\n />\n )}\n\n {!resolvedResource.embedUrl &&\n previewImageUrl && (\n <img\n className=\"embed-viewer__preview\"\n src={previewImageUrl}\n alt=\"\"\n />\n )}\n\n {hasActions && (\n <div className=\"embed-viewer__actions\">\n {hasStandardActions && (\n <ActionGroup>\n {templateActionUrl && (\n <Button\n onClick={() =>\n openUrl(\n templateActionUrl,\n )\n }\n >\n Скопировать шаблон\n </Button>\n )}\n\n {openActionUrl && (\n <Button\n rank=\"link\"\n onClick={() =>\n openUrl(\n openActionUrl,\n )\n }\n >\n Открыть во весь экран\n </Button>\n )}\n </ActionGroup>\n )}\n\n {actions}\n </div>\n )}\n </div>\n );\n};\n\nexport default EmbedViewer;\n"]}
@@ -2,8 +2,11 @@ import React from 'react';
2
2
  import './embed-viewer.css';
3
3
  export interface EmbedViewerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {
4
4
  src: string;
5
+ embedSrc?: string;
5
6
  iframeTitle: string;
6
7
  description?: React.ReactNode;
8
+ showTemplateAction?: boolean;
9
+ showOpenAction?: boolean;
7
10
  actions?: React.ReactNode;
8
11
  }
9
12
  declare const EmbedViewer: React.FC<EmbedViewerProps>;
@@ -1,11 +1,26 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useState, useEffect } from 'react';
2
3
  import './embed-viewer.css';
4
+ import ActionGroup from '../action-group';
5
+ import Button from '../button';
3
6
  import { classnames } from '../helpers/classnames';
7
+ import { resolveOpenGraphImage } from './open-graph';
8
+ import { resolveEmbedResource } from './resolver';
4
9
 
10
+ function openUrl(url) {
11
+ window.open(
12
+ url,
13
+ "_blank",
14
+ "noopener,noreferrer"
15
+ );
16
+ }
5
17
  const EmbedViewer = ({
6
18
  src,
19
+ embedSrc,
7
20
  iframeTitle,
8
21
  description,
22
+ showTemplateAction = false,
23
+ showOpenAction = false,
9
24
  actions,
10
25
  className = "",
11
26
  ...props
@@ -15,6 +30,43 @@ const EmbedViewer = ({
15
30
  className,
16
31
  {}
17
32
  );
33
+ const resolvedResource = resolveEmbedResource({
34
+ src,
35
+ embedSrc
36
+ });
37
+ const [
38
+ previewImageUrl,
39
+ setPreviewImageUrl
40
+ ] = useState(
41
+ null
42
+ );
43
+ useEffect(() => {
44
+ setPreviewImageUrl(null);
45
+ if (resolvedResource.embedUrl || !resolvedResource.sourceUrl) {
46
+ return;
47
+ }
48
+ const controller = new AbortController();
49
+ void resolveOpenGraphImage(
50
+ resolvedResource.sourceUrl,
51
+ controller.signal
52
+ ).then((imageUrl) => {
53
+ if (!controller.signal.aborted) {
54
+ setPreviewImageUrl(
55
+ imageUrl
56
+ );
57
+ }
58
+ });
59
+ return () => {
60
+ controller.abort();
61
+ };
62
+ }, [
63
+ resolvedResource.embedUrl,
64
+ resolvedResource.sourceUrl
65
+ ]);
66
+ const templateActionUrl = showTemplateAction && resolvedResource.sourceUrl ? resolvedResource.copyUrl ?? resolvedResource.sourceUrl : null;
67
+ const openActionUrl = showOpenAction && resolvedResource.sourceUrl ? resolvedResource.sourceUrl : null;
68
+ const hasStandardActions = templateActionUrl !== null || openActionUrl !== null;
69
+ const hasActions = hasStandardActions || Boolean(actions);
18
70
  return /* @__PURE__ */ jsxs(
19
71
  "div",
20
72
  {
@@ -22,15 +74,46 @@ const EmbedViewer = ({
22
74
  ...props,
23
75
  children: [
24
76
  description && /* @__PURE__ */ jsx("div", { className: "embed-viewer__description", children: description }),
25
- /* @__PURE__ */ jsx(
77
+ resolvedResource.embedUrl && /* @__PURE__ */ jsx(
26
78
  "iframe",
27
79
  {
28
80
  className: "embed-viewer__frame",
29
- src,
81
+ src: resolvedResource.embedUrl,
30
82
  title: iframeTitle
31
83
  }
32
84
  ),
33
- actions && /* @__PURE__ */ jsx("div", { className: "embed-viewer__actions", children: actions })
85
+ !resolvedResource.embedUrl && previewImageUrl && /* @__PURE__ */ jsx(
86
+ "img",
87
+ {
88
+ className: "embed-viewer__preview",
89
+ src: previewImageUrl,
90
+ alt: ""
91
+ }
92
+ ),
93
+ hasActions && /* @__PURE__ */ jsxs("div", { className: "embed-viewer__actions", children: [
94
+ hasStandardActions && /* @__PURE__ */ jsxs(ActionGroup, { children: [
95
+ templateActionUrl && /* @__PURE__ */ jsx(
96
+ Button,
97
+ {
98
+ onClick: () => openUrl(
99
+ templateActionUrl
100
+ ),
101
+ children: "\u0421\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0448\u0430\u0431\u043B\u043E\u043D"
102
+ }
103
+ ),
104
+ openActionUrl && /* @__PURE__ */ jsx(
105
+ Button,
106
+ {
107
+ rank: "link",
108
+ onClick: () => openUrl(
109
+ openActionUrl
110
+ ),
111
+ children: "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0432\u043E \u0432\u0435\u0441\u044C \u044D\u043A\u0440\u0430\u043D"
112
+ }
113
+ )
114
+ ] }),
115
+ actions
116
+ ] })
34
117
  ]
35
118
  }
36
119
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/embed-viewer/embed-viewer.tsx"],"names":[],"mappings":";;;;AAgBA,MAAM,cAEF,CAAC;AAAA,EACH,GAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,OAAA,GAAU,UAAA;AAAA,IACd,cAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,OAAA;AAAA,MACV,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,WAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACZ,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,wBAGF,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,qBAAA;AAAA,YACV,GAAA;AAAA,YACA,KAAA,EAAO;AAAA;AAAA,SACT;AAAA,QAEC,OAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBACZ,QAAA,EAAA,OAAA,EACH;AAAA;AAAA;AAAA,GAEJ;AAEJ,CAAA;AAEA,IAAO,oBAAA,GAAQ","file":"embed-viewer.js","sourcesContent":["import React from 'react';\n\nimport './embed-viewer.css';\nimport { classnames } from '../helpers/classnames';\n\nexport interface EmbedViewerProps\n extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n > {\n src: string;\n iframeTitle: string;\n description?: React.ReactNode;\n actions?: React.ReactNode;\n}\n\nconst EmbedViewer: React.FC<\n EmbedViewerProps\n> = ({\n src,\n iframeTitle,\n description,\n actions,\n className = '',\n ...props\n}) => {\n const classes = classnames(\n 'embed-viewer',\n className,\n {},\n );\n\n return (\n <div\n className={classes}\n {...props}\n >\n {description && (\n <div className=\"embed-viewer__description\">\n {description}\n </div>\n )}\n\n <iframe\n className=\"embed-viewer__frame\"\n src={src}\n title={iframeTitle}\n />\n\n {actions && (\n <div className=\"embed-viewer__actions\">\n {actions}\n </div>\n )}\n </div>\n );\n};\n\nexport default EmbedViewer;\n"]}
1
+ {"version":3,"sources":["../../../src/components/embed-viewer/embed-viewer.tsx"],"names":[],"mappings":"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","file":"embed-viewer.js","sourcesContent":["import React, {\n useEffect,\n useState,\n} from 'react';\n\nimport './embed-viewer.css';\nimport ActionGroup from '../action-group';\nimport Button from '../button';\nimport { classnames } from '../helpers/classnames';\nimport {\n resolveOpenGraphImage,\n} from './open-graph';\nimport {\n resolveEmbedResource,\n} from './resolver';\n\nexport interface EmbedViewerProps\n extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n > {\n src: string;\n embedSrc?: string;\n iframeTitle: string;\n description?: React.ReactNode;\n showTemplateAction?: boolean;\n showOpenAction?: boolean;\n actions?: React.ReactNode;\n}\n\nfunction openUrl(url: string) {\n window.open(\n url,\n '_blank',\n 'noopener,noreferrer',\n );\n}\n\nconst EmbedViewer: React.FC<\n EmbedViewerProps\n> = ({\n src,\n embedSrc,\n iframeTitle,\n description,\n showTemplateAction = false,\n showOpenAction = false,\n actions,\n className = '',\n ...props\n}) => {\n const classes = classnames(\n 'embed-viewer',\n className,\n {},\n );\n\n const resolvedResource =\n resolveEmbedResource({\n src,\n embedSrc,\n });\n\n const [\n previewImageUrl,\n setPreviewImageUrl,\n ] = useState<string | null>(\n null,\n );\n\n useEffect(() => {\n setPreviewImageUrl(null);\n\n if (\n resolvedResource.embedUrl ||\n !resolvedResource.sourceUrl\n ) {\n return;\n }\n\n const controller =\n new AbortController();\n\n void resolveOpenGraphImage(\n resolvedResource.sourceUrl,\n controller.signal,\n ).then((imageUrl) => {\n if (\n !controller.signal.aborted\n ) {\n setPreviewImageUrl(\n imageUrl,\n );\n }\n });\n\n return () => {\n controller.abort();\n };\n }, [\n resolvedResource.embedUrl,\n resolvedResource.sourceUrl,\n ]);\n\n const templateActionUrl =\n showTemplateAction &&\n resolvedResource.sourceUrl\n ? (\n resolvedResource.copyUrl ??\n resolvedResource.sourceUrl\n )\n : null;\n\n const openActionUrl =\n showOpenAction &&\n resolvedResource.sourceUrl\n ? resolvedResource.sourceUrl\n : null;\n\n const hasStandardActions =\n templateActionUrl !== null ||\n openActionUrl !== null;\n\n const hasActions =\n hasStandardActions ||\n Boolean(actions);\n\n return (\n <div\n className={classes}\n {...props}\n >\n {description && (\n <div className=\"embed-viewer__description\">\n {description}\n </div>\n )}\n\n {resolvedResource.embedUrl && (\n <iframe\n className=\"embed-viewer__frame\"\n src={\n resolvedResource.embedUrl\n }\n title={iframeTitle}\n />\n )}\n\n {!resolvedResource.embedUrl &&\n previewImageUrl && (\n <img\n className=\"embed-viewer__preview\"\n src={previewImageUrl}\n alt=\"\"\n />\n )}\n\n {hasActions && (\n <div className=\"embed-viewer__actions\">\n {hasStandardActions && (\n <ActionGroup>\n {templateActionUrl && (\n <Button\n onClick={() =>\n openUrl(\n templateActionUrl,\n )\n }\n >\n Скопировать шаблон\n </Button>\n )}\n\n {openActionUrl && (\n <Button\n rank=\"link\"\n onClick={() =>\n openUrl(\n openActionUrl,\n )\n }\n >\n Открыть во весь экран\n </Button>\n )}\n </ActionGroup>\n )}\n\n {actions}\n </div>\n )}\n </div>\n );\n};\n\nexport default EmbedViewer;\n"]}
@@ -0,0 +1,61 @@
1
+ 'use strict';
2
+
3
+ const defaultFetchResource = async (url, init) => fetch(
4
+ url,
5
+ init
6
+ );
7
+ function isHtmlResponse(response) {
8
+ const contentType = response.headers.get(
9
+ "content-type"
10
+ );
11
+ return contentType === null || contentType.includes("text/html");
12
+ }
13
+ function parseOpenGraphImage(html, sourceUrl) {
14
+ const document = new DOMParser().parseFromString(
15
+ html,
16
+ "text/html"
17
+ );
18
+ const image = document.head.querySelector(
19
+ 'meta[property="og:image"]'
20
+ );
21
+ const content = image?.getAttribute("content");
22
+ if (!content) {
23
+ return null;
24
+ }
25
+ try {
26
+ const url = new URL(
27
+ content,
28
+ sourceUrl
29
+ );
30
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
31
+ return null;
32
+ }
33
+ return url.toString();
34
+ } catch {
35
+ return null;
36
+ }
37
+ }
38
+ async function resolveOpenGraphImage(sourceUrl, signal, fetchResource = defaultFetchResource) {
39
+ try {
40
+ const response = await fetchResource(
41
+ sourceUrl,
42
+ {
43
+ signal
44
+ }
45
+ );
46
+ if (!response.ok || !isHtmlResponse(response)) {
47
+ return null;
48
+ }
49
+ const html = await response.text();
50
+ return parseOpenGraphImage(
51
+ html,
52
+ sourceUrl
53
+ );
54
+ } catch {
55
+ return null;
56
+ }
57
+ }
58
+
59
+ exports.resolveOpenGraphImage = resolveOpenGraphImage;
60
+ //# sourceMappingURL=open-graph.cjs.map
61
+ //# sourceMappingURL=open-graph.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/embed-viewer/open-graph.ts"],"names":[],"mappings":";;AAOA,MAAM,oBAAA,GACJ,OACE,GAAA,EACA,IAAA,KAEA,KAAA;AAAA,EACE,GAAA;AAAA,EACA;AACF,CAAA;AAEJ,SAAS,eACP,QAAA,EACS;AACT,EAAA,MAAM,WAAA,GACJ,SAAS,OAAA,CAAQ,GAAA;AAAA,IACf;AAAA,GACF;AAEF,EAAA,OACE,WAAA,KAAgB,IAAA,IAChB,WAAA,CAAY,QAAA,CAAS,WAAW,CAAA;AAEpC;AAEA,SAAS,mBAAA,CACP,MACA,SAAA,EACe;AACf,EAAA,MAAM,QAAA,GACJ,IAAI,SAAA,EAAU,CAAE,eAAA;AAAA,IACd,IAAA;AAAA,IACA;AAAA,GACF;AAEF,EAAA,MAAM,KAAA,GACJ,SAAS,IAAA,CAAK,aAAA;AAAA,IACZ;AAAA,GACF;AAEF,EAAA,MAAM,OAAA,GACJ,KAAA,EAAO,YAAA,CAAa,SAAS,CAAA;AAE/B,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MACJ,IAAI,GAAA;AAAA,MACF,OAAA;AAAA,MACA;AAAA,KACF;AAEF,IAAA,IACE,GAAA,CAAI,QAAA,KAAa,OAAA,IACjB,GAAA,CAAI,aAAa,QAAA,EACjB;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,eAAsB,qBAAA,CACpB,SAAA,EACA,MAAA,EACA,aAAA,GACE,oBAAA,EACsB;AACxB,EAAA,IAAI;AACF,IAAA,MAAM,WACJ,MAAM,aAAA;AAAA,MACJ,SAAA;AAAA,MACA;AAAA,QACE;AAAA;AACF,KACF;AAEF,IAAA,IACE,CAAC,QAAA,CAAS,EAAA,IACV,CAAC,cAAA,CAAe,QAAQ,CAAA,EACxB;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,GACJ,MAAM,QAAA,CAAS,IAAA,EAAK;AAEtB,IAAA,OAAO,mBAAA;AAAA,MACL,IAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF","file":"open-graph.cjs","sourcesContent":["type FetchResource = (\n url: string,\n init?: {\n signal?: AbortSignal;\n },\n) => Promise<Response>;\n\nconst defaultFetchResource: FetchResource =\n async (\n url,\n init,\n ) =>\n fetch(\n url,\n init,\n );\n\nfunction isHtmlResponse(\n response: Response,\n): boolean {\n const contentType =\n response.headers.get(\n 'content-type',\n );\n\n return (\n contentType === null ||\n contentType.includes('text/html')\n );\n}\n\nfunction parseOpenGraphImage(\n html: string,\n sourceUrl: string,\n): string | null {\n const document =\n new DOMParser().parseFromString(\n html,\n 'text/html',\n );\n\n const image =\n document.head.querySelector(\n 'meta[property=\"og:image\"]',\n );\n\n const content =\n image?.getAttribute('content');\n\n if (!content) {\n return null;\n }\n\n try {\n const url =\n new URL(\n content,\n sourceUrl,\n );\n\n if (\n url.protocol !== 'http:' &&\n url.protocol !== 'https:'\n ) {\n return null;\n }\n\n return url.toString();\n } catch {\n return null;\n }\n}\n\nexport async function resolveOpenGraphImage(\n sourceUrl: string,\n signal?: AbortSignal,\n fetchResource: FetchResource =\n defaultFetchResource,\n): Promise<string | null> {\n try {\n const response =\n await fetchResource(\n sourceUrl,\n {\n signal,\n },\n );\n\n if (\n !response.ok ||\n !isHtmlResponse(response)\n ) {\n return null;\n }\n\n const html =\n await response.text();\n\n return parseOpenGraphImage(\n html,\n sourceUrl,\n );\n } catch {\n return null;\n }\n}\n"]}
@@ -0,0 +1,5 @@
1
+ type FetchResource = (url: string, init?: {
2
+ signal?: AbortSignal;
3
+ }) => Promise<Response>;
4
+ export declare function resolveOpenGraphImage(sourceUrl: string, signal?: AbortSignal, fetchResource?: FetchResource): Promise<string | null>;
5
+ export {};
@@ -0,0 +1,59 @@
1
+ const defaultFetchResource = async (url, init) => fetch(
2
+ url,
3
+ init
4
+ );
5
+ function isHtmlResponse(response) {
6
+ const contentType = response.headers.get(
7
+ "content-type"
8
+ );
9
+ return contentType === null || contentType.includes("text/html");
10
+ }
11
+ function parseOpenGraphImage(html, sourceUrl) {
12
+ const document = new DOMParser().parseFromString(
13
+ html,
14
+ "text/html"
15
+ );
16
+ const image = document.head.querySelector(
17
+ 'meta[property="og:image"]'
18
+ );
19
+ const content = image?.getAttribute("content");
20
+ if (!content) {
21
+ return null;
22
+ }
23
+ try {
24
+ const url = new URL(
25
+ content,
26
+ sourceUrl
27
+ );
28
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
29
+ return null;
30
+ }
31
+ return url.toString();
32
+ } catch {
33
+ return null;
34
+ }
35
+ }
36
+ async function resolveOpenGraphImage(sourceUrl, signal, fetchResource = defaultFetchResource) {
37
+ try {
38
+ const response = await fetchResource(
39
+ sourceUrl,
40
+ {
41
+ signal
42
+ }
43
+ );
44
+ if (!response.ok || !isHtmlResponse(response)) {
45
+ return null;
46
+ }
47
+ const html = await response.text();
48
+ return parseOpenGraphImage(
49
+ html,
50
+ sourceUrl
51
+ );
52
+ } catch {
53
+ return null;
54
+ }
55
+ }
56
+
57
+ export { resolveOpenGraphImage };
58
+ //# sourceMappingURL=open-graph.js.map
59
+ //# sourceMappingURL=open-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/embed-viewer/open-graph.ts"],"names":[],"mappings":"AAOA,MAAM,oBAAA,GACJ,OACE,GAAA,EACA,IAAA,KAEA,KAAA;AAAA,EACE,GAAA;AAAA,EACA;AACF,CAAA;AAEJ,SAAS,eACP,QAAA,EACS;AACT,EAAA,MAAM,WAAA,GACJ,SAAS,OAAA,CAAQ,GAAA;AAAA,IACf;AAAA,GACF;AAEF,EAAA,OACE,WAAA,KAAgB,IAAA,IAChB,WAAA,CAAY,QAAA,CAAS,WAAW,CAAA;AAEpC;AAEA,SAAS,mBAAA,CACP,MACA,SAAA,EACe;AACf,EAAA,MAAM,QAAA,GACJ,IAAI,SAAA,EAAU,CAAE,eAAA;AAAA,IACd,IAAA;AAAA,IACA;AAAA,GACF;AAEF,EAAA,MAAM,KAAA,GACJ,SAAS,IAAA,CAAK,aAAA;AAAA,IACZ;AAAA,GACF;AAEF,EAAA,MAAM,OAAA,GACJ,KAAA,EAAO,YAAA,CAAa,SAAS,CAAA;AAE/B,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MACJ,IAAI,GAAA;AAAA,MACF,OAAA;AAAA,MACA;AAAA,KACF;AAEF,IAAA,IACE,GAAA,CAAI,QAAA,KAAa,OAAA,IACjB,GAAA,CAAI,aAAa,QAAA,EACjB;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,eAAsB,qBAAA,CACpB,SAAA,EACA,MAAA,EACA,aAAA,GACE,oBAAA,EACsB;AACxB,EAAA,IAAI;AACF,IAAA,MAAM,WACJ,MAAM,aAAA;AAAA,MACJ,SAAA;AAAA,MACA;AAAA,QACE;AAAA;AACF,KACF;AAEF,IAAA,IACE,CAAC,QAAA,CAAS,EAAA,IACV,CAAC,cAAA,CAAe,QAAQ,CAAA,EACxB;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,GACJ,MAAM,QAAA,CAAS,IAAA,EAAK;AAEtB,IAAA,OAAO,mBAAA;AAAA,MACL,IAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF","file":"open-graph.js","sourcesContent":["type FetchResource = (\n url: string,\n init?: {\n signal?: AbortSignal;\n },\n) => Promise<Response>;\n\nconst defaultFetchResource: FetchResource =\n async (\n url,\n init,\n ) =>\n fetch(\n url,\n init,\n );\n\nfunction isHtmlResponse(\n response: Response,\n): boolean {\n const contentType =\n response.headers.get(\n 'content-type',\n );\n\n return (\n contentType === null ||\n contentType.includes('text/html')\n );\n}\n\nfunction parseOpenGraphImage(\n html: string,\n sourceUrl: string,\n): string | null {\n const document =\n new DOMParser().parseFromString(\n html,\n 'text/html',\n );\n\n const image =\n document.head.querySelector(\n 'meta[property=\"og:image\"]',\n );\n\n const content =\n image?.getAttribute('content');\n\n if (!content) {\n return null;\n }\n\n try {\n const url =\n new URL(\n content,\n sourceUrl,\n );\n\n if (\n url.protocol !== 'http:' &&\n url.protocol !== 'https:'\n ) {\n return null;\n }\n\n return url.toString();\n } catch {\n return null;\n }\n}\n\nexport async function resolveOpenGraphImage(\n sourceUrl: string,\n signal?: AbortSignal,\n fetchResource: FetchResource =\n defaultFetchResource,\n): Promise<string | null> {\n try {\n const response =\n await fetchResource(\n sourceUrl,\n {\n signal,\n },\n );\n\n if (\n !response.ok ||\n !isHtmlResponse(response)\n ) {\n return null;\n }\n\n const html =\n await response.text();\n\n return parseOpenGraphImage(\n html,\n sourceUrl,\n );\n } catch {\n return null;\n }\n}\n"]}
@@ -0,0 +1,44 @@
1
+ 'use strict';
2
+
3
+ const FIGMA_HOSTNAMES = /* @__PURE__ */ new Set([
4
+ "figma.com",
5
+ "www.figma.com"
6
+ ]);
7
+ const FIGMA_RESOURCE_TYPES = /* @__PURE__ */ new Set([
8
+ "board",
9
+ "deck",
10
+ "design",
11
+ "proto",
12
+ "slides"
13
+ ]);
14
+ function isFigmaResourceType(value) {
15
+ return FIGMA_RESOURCE_TYPES.has(
16
+ value
17
+ );
18
+ }
19
+ function resolveFigmaResource(url) {
20
+ if (!FIGMA_HOSTNAMES.has(
21
+ url.hostname
22
+ )) {
23
+ return null;
24
+ }
25
+ const segments = url.pathname.split("/").filter(Boolean);
26
+ if (segments.length < 2 || !isFigmaResourceType(
27
+ segments[0]
28
+ ) || !segments[1]) {
29
+ return null;
30
+ }
31
+ const embedUrl = new URL(url.toString());
32
+ embedUrl.hostname = "embed.figma.com";
33
+ embedUrl.searchParams.set(
34
+ "embed-host",
35
+ "jvetrau-ds"
36
+ );
37
+ return {
38
+ embedUrl: embedUrl.toString()
39
+ };
40
+ }
41
+
42
+ exports.resolveFigmaResource = resolveFigmaResource;
43
+ //# sourceMappingURL=figma.cjs.map
44
+ //# sourceMappingURL=figma.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/embed-viewer/providers/figma.ts"],"names":[],"mappings":";;AAWA,MAAM,eAAA,uBACA,GAAA,CAAI;AAAA,EACN,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEH,MAAM,oBAAA,uBACA,GAAA,CAAuB;AAAA,EACzB,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEH,SAAS,oBACP,KAAA,EAC4B;AAC5B,EAAA,OAAO,oBAAA,CAAqB,GAAA;AAAA,IAC1B;AAAA,GACF;AACF;AAEO,SAAS,qBACd,GAAA,EAC2B;AAC3B,EAAA,IACE,CAAC,eAAA,CAAgB,GAAA;AAAA,IACf,GAAA,CAAI;AAAA,GACN,EACA;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WACJ,GAAA,CAAI,QAAA,CACD,MAAM,GAAG,CAAA,CACT,OAAO,OAAO,CAAA;AAEnB,EAAA,IACE,QAAA,CAAS,MAAA,GAAS,CAAA,IAClB,CAAC,mBAAA;AAAA,IACC,SAAS,CAAC;AAAA,GACZ,IACA,CAAC,QAAA,CAAS,CAAC,CAAA,EACX;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GACJ,IAAI,GAAA,CAAI,GAAA,CAAI,UAAU,CAAA;AAExB,EAAA,QAAA,CAAS,QAAA,GACP,iBAAA;AAEF,EAAA,QAAA,CAAS,YAAA,CAAa,GAAA;AAAA,IACpB,YAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,QAAA,EACE,SAAS,QAAA;AAAS,GACtB;AACF","file":"figma.cjs","sourcesContent":["export interface FigmaEmbedResource {\n embedUrl: string;\n}\n\ntype FigmaResourceType =\n | 'board'\n | 'deck'\n | 'design'\n | 'proto'\n | 'slides';\n\nconst FIGMA_HOSTNAMES =\n new Set([\n 'figma.com',\n 'www.figma.com',\n ]);\n\nconst FIGMA_RESOURCE_TYPES =\n new Set<FigmaResourceType>([\n 'board',\n 'deck',\n 'design',\n 'proto',\n 'slides',\n ]);\n\nfunction isFigmaResourceType(\n value: string,\n): value is FigmaResourceType {\n return FIGMA_RESOURCE_TYPES.has(\n value as FigmaResourceType,\n );\n}\n\nexport function resolveFigmaResource(\n url: URL,\n): FigmaEmbedResource | null {\n if (\n !FIGMA_HOSTNAMES.has(\n url.hostname,\n )\n ) {\n return null;\n }\n\n const segments =\n url.pathname\n .split('/')\n .filter(Boolean);\n\n if (\n segments.length < 2 ||\n !isFigmaResourceType(\n segments[0],\n ) ||\n !segments[1]\n ) {\n return null;\n }\n\n const embedUrl =\n new URL(url.toString());\n\n embedUrl.hostname =\n 'embed.figma.com';\n\n embedUrl.searchParams.set(\n 'embed-host',\n 'jvetrau-ds',\n );\n\n return {\n embedUrl:\n embedUrl.toString(),\n };\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export interface FigmaEmbedResource {
2
+ embedUrl: string;
3
+ }
4
+ export declare function resolveFigmaResource(url: URL): FigmaEmbedResource | null;
@@ -0,0 +1,42 @@
1
+ const FIGMA_HOSTNAMES = /* @__PURE__ */ new Set([
2
+ "figma.com",
3
+ "www.figma.com"
4
+ ]);
5
+ const FIGMA_RESOURCE_TYPES = /* @__PURE__ */ new Set([
6
+ "board",
7
+ "deck",
8
+ "design",
9
+ "proto",
10
+ "slides"
11
+ ]);
12
+ function isFigmaResourceType(value) {
13
+ return FIGMA_RESOURCE_TYPES.has(
14
+ value
15
+ );
16
+ }
17
+ function resolveFigmaResource(url) {
18
+ if (!FIGMA_HOSTNAMES.has(
19
+ url.hostname
20
+ )) {
21
+ return null;
22
+ }
23
+ const segments = url.pathname.split("/").filter(Boolean);
24
+ if (segments.length < 2 || !isFigmaResourceType(
25
+ segments[0]
26
+ ) || !segments[1]) {
27
+ return null;
28
+ }
29
+ const embedUrl = new URL(url.toString());
30
+ embedUrl.hostname = "embed.figma.com";
31
+ embedUrl.searchParams.set(
32
+ "embed-host",
33
+ "jvetrau-ds"
34
+ );
35
+ return {
36
+ embedUrl: embedUrl.toString()
37
+ };
38
+ }
39
+
40
+ export { resolveFigmaResource };
41
+ //# sourceMappingURL=figma.js.map
42
+ //# sourceMappingURL=figma.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/embed-viewer/providers/figma.ts"],"names":[],"mappings":"AAWA,MAAM,eAAA,uBACA,GAAA,CAAI;AAAA,EACN,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEH,MAAM,oBAAA,uBACA,GAAA,CAAuB;AAAA,EACzB,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEH,SAAS,oBACP,KAAA,EAC4B;AAC5B,EAAA,OAAO,oBAAA,CAAqB,GAAA;AAAA,IAC1B;AAAA,GACF;AACF;AAEO,SAAS,qBACd,GAAA,EAC2B;AAC3B,EAAA,IACE,CAAC,eAAA,CAAgB,GAAA;AAAA,IACf,GAAA,CAAI;AAAA,GACN,EACA;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WACJ,GAAA,CAAI,QAAA,CACD,MAAM,GAAG,CAAA,CACT,OAAO,OAAO,CAAA;AAEnB,EAAA,IACE,QAAA,CAAS,MAAA,GAAS,CAAA,IAClB,CAAC,mBAAA;AAAA,IACC,SAAS,CAAC;AAAA,GACZ,IACA,CAAC,QAAA,CAAS,CAAC,CAAA,EACX;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GACJ,IAAI,GAAA,CAAI,GAAA,CAAI,UAAU,CAAA;AAExB,EAAA,QAAA,CAAS,QAAA,GACP,iBAAA;AAEF,EAAA,QAAA,CAAS,YAAA,CAAa,GAAA;AAAA,IACpB,YAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,QAAA,EACE,SAAS,QAAA;AAAS,GACtB;AACF","file":"figma.js","sourcesContent":["export interface FigmaEmbedResource {\n embedUrl: string;\n}\n\ntype FigmaResourceType =\n | 'board'\n | 'deck'\n | 'design'\n | 'proto'\n | 'slides';\n\nconst FIGMA_HOSTNAMES =\n new Set([\n 'figma.com',\n 'www.figma.com',\n ]);\n\nconst FIGMA_RESOURCE_TYPES =\n new Set<FigmaResourceType>([\n 'board',\n 'deck',\n 'design',\n 'proto',\n 'slides',\n ]);\n\nfunction isFigmaResourceType(\n value: string,\n): value is FigmaResourceType {\n return FIGMA_RESOURCE_TYPES.has(\n value as FigmaResourceType,\n );\n}\n\nexport function resolveFigmaResource(\n url: URL,\n): FigmaEmbedResource | null {\n if (\n !FIGMA_HOSTNAMES.has(\n url.hostname,\n )\n ) {\n return null;\n }\n\n const segments =\n url.pathname\n .split('/')\n .filter(Boolean);\n\n if (\n segments.length < 2 ||\n !isFigmaResourceType(\n segments[0],\n ) ||\n !segments[1]\n ) {\n return null;\n }\n\n const embedUrl =\n new URL(url.toString());\n\n embedUrl.hostname =\n 'embed.figma.com';\n\n embedUrl.searchParams.set(\n 'embed-host',\n 'jvetrau-ds',\n );\n\n return {\n embedUrl:\n embedUrl.toString(),\n };\n}\n"]}
@@ -0,0 +1,78 @@
1
+ 'use strict';
2
+
3
+ const GOOGLE_HOSTNAME = "docs.google.com";
4
+ const GOOGLE_RESOURCE_TYPES = /* @__PURE__ */ new Set([
5
+ "document",
6
+ "presentation",
7
+ "spreadsheets"
8
+ ]);
9
+ function isGoogleResourceType(value) {
10
+ return GOOGLE_RESOURCE_TYPES.has(
11
+ value
12
+ );
13
+ }
14
+ function getSheetsGid(url) {
15
+ const queryGid = url.searchParams.get("gid");
16
+ if (queryGid) {
17
+ return queryGid;
18
+ }
19
+ const hash = url.hash.startsWith("#") ? url.hash.slice(1) : url.hash;
20
+ if (!hash) {
21
+ return null;
22
+ }
23
+ return new URLSearchParams(
24
+ hash
25
+ ).get("gid");
26
+ }
27
+ function createGoogleActionUrl({
28
+ resourceType,
29
+ resourceId,
30
+ action,
31
+ gid
32
+ }) {
33
+ const url = new URL(
34
+ `https://${GOOGLE_HOSTNAME}/${resourceType}/d/${resourceId}/${action}`
35
+ );
36
+ if (resourceType === "spreadsheets" && gid) {
37
+ url.searchParams.set(
38
+ "gid",
39
+ gid
40
+ );
41
+ }
42
+ return url.toString();
43
+ }
44
+ function resolveGoogleResource(url) {
45
+ if (url.hostname !== GOOGLE_HOSTNAME) {
46
+ return null;
47
+ }
48
+ const segments = url.pathname.split("/").filter(Boolean);
49
+ if (segments.length < 4 || !isGoogleResourceType(
50
+ segments[0]
51
+ ) || segments[1] !== "d") {
52
+ return null;
53
+ }
54
+ const resourceType = segments[0];
55
+ const resourceId = segments[2];
56
+ if (!resourceId) {
57
+ return null;
58
+ }
59
+ const gid = resourceType === "spreadsheets" ? getSheetsGid(url) : null;
60
+ return {
61
+ embedUrl: createGoogleActionUrl({
62
+ resourceType,
63
+ resourceId,
64
+ action: "preview",
65
+ gid
66
+ }),
67
+ copyUrl: createGoogleActionUrl({
68
+ resourceType,
69
+ resourceId,
70
+ action: "copy",
71
+ gid
72
+ })
73
+ };
74
+ }
75
+
76
+ exports.resolveGoogleResource = resolveGoogleResource;
77
+ //# sourceMappingURL=google.cjs.map
78
+ //# sourceMappingURL=google.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/embed-viewer/providers/google.ts"],"names":[],"mappings":";;AAUA,MAAM,eAAA,GACJ,iBAAA;AAEF,MAAM,qBAAA,uBACA,GAAA,CAAwB;AAAA,EAC1B,UAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEH,SAAS,qBACP,KAAA,EAC6B;AAC7B,EAAA,OAAO,qBAAA,CAAsB,GAAA;AAAA,IAC3B;AAAA,GACF;AACF;AAEA,SAAS,aACP,GAAA,EACe;AACf,EAAA,MAAM,QAAA,GACJ,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA;AAE5B,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GACJ,GAAA,CAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GACnB,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAChB,GAAA,CAAI,IAAA;AAEV,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAI,eAAA;AAAA,IACT;AAAA,GACF,CAAE,IAAI,KAAK,CAAA;AACb;AAEA,SAAS,qBAAA,CAAsB;AAAA,EAC7B,YAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAKW;AACT,EAAA,MAAM,MAAM,IAAI,GAAA;AAAA,IACd,WAAW,eAAe,CAAA,CAAA,EAAI,YAAY,CAAA,GAAA,EAAM,UAAU,IAAI,MAAM,CAAA;AAAA,GACtE;AAEA,EAAA,IACE,YAAA,KAAiB,kBACjB,GAAA,EACA;AACA,IAAA,GAAA,CAAI,YAAA,CAAa,GAAA;AAAA,MACf,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAI,QAAA,EAAS;AACtB;AAEO,SAAS,sBACd,GAAA,EAC4B;AAC5B,EAAA,IACE,GAAA,CAAI,aAAa,eAAA,EACjB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WACJ,GAAA,CAAI,QAAA,CACD,MAAM,GAAG,CAAA,CACT,OAAO,OAAO,CAAA;AAEnB,EAAA,IACE,QAAA,CAAS,MAAA,GAAS,CAAA,IAClB,CAAC,oBAAA;AAAA,IACC,SAAS,CAAC;AAAA,GACZ,IACA,QAAA,CAAS,CAAC,CAAA,KAAM,GAAA,EAChB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAA,GACJ,SAAS,CAAC,CAAA;AAEZ,EAAA,MAAM,UAAA,GACJ,SAAS,CAAC,CAAA;AAEZ,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,GAAA,GACJ,YAAA,KAAiB,cAAA,GACb,YAAA,CAAa,GAAG,CAAA,GAChB,IAAA;AAEN,EAAA,OAAO;AAAA,IACL,UACE,qBAAA,CAAsB;AAAA,MACpB,YAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA,EAAQ,SAAA;AAAA,MACR;AAAA,KACD,CAAA;AAAA,IACH,SACE,qBAAA,CAAsB;AAAA,MACpB,YAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA,EAAQ,MAAA;AAAA,MACR;AAAA,KACD;AAAA,GACL;AACF","file":"google.cjs","sourcesContent":["export interface GoogleEmbedResource {\n embedUrl: string;\n copyUrl: string;\n}\n\ntype GoogleResourceType =\n | 'document'\n | 'presentation'\n | 'spreadsheets';\n\nconst GOOGLE_HOSTNAME =\n 'docs.google.com';\n\nconst GOOGLE_RESOURCE_TYPES =\n new Set<GoogleResourceType>([\n 'document',\n 'presentation',\n 'spreadsheets',\n ]);\n\nfunction isGoogleResourceType(\n value: string,\n): value is GoogleResourceType {\n return GOOGLE_RESOURCE_TYPES.has(\n value as GoogleResourceType,\n );\n}\n\nfunction getSheetsGid(\n url: URL,\n): string | null {\n const queryGid =\n url.searchParams.get('gid');\n\n if (queryGid) {\n return queryGid;\n }\n\n const hash =\n url.hash.startsWith('#')\n ? url.hash.slice(1)\n : url.hash;\n\n if (!hash) {\n return null;\n }\n\n return new URLSearchParams(\n hash,\n ).get('gid');\n}\n\nfunction createGoogleActionUrl({\n resourceType,\n resourceId,\n action,\n gid,\n}: {\n resourceType: GoogleResourceType;\n resourceId: string;\n action: 'copy' | 'preview';\n gid: string | null;\n}): string {\n const url = new URL(\n `https://${GOOGLE_HOSTNAME}/${resourceType}/d/${resourceId}/${action}`,\n );\n\n if (\n resourceType === 'spreadsheets' &&\n gid\n ) {\n url.searchParams.set(\n 'gid',\n gid,\n );\n }\n\n return url.toString();\n}\n\nexport function resolveGoogleResource(\n url: URL,\n): GoogleEmbedResource | null {\n if (\n url.hostname !== GOOGLE_HOSTNAME\n ) {\n return null;\n }\n\n const segments =\n url.pathname\n .split('/')\n .filter(Boolean);\n\n if (\n segments.length < 4 ||\n !isGoogleResourceType(\n segments[0],\n ) ||\n segments[1] !== 'd'\n ) {\n return null;\n }\n\n const resourceType =\n segments[0];\n\n const resourceId =\n segments[2];\n\n if (!resourceId) {\n return null;\n }\n\n const gid =\n resourceType === 'spreadsheets'\n ? getSheetsGid(url)\n : null;\n\n return {\n embedUrl:\n createGoogleActionUrl({\n resourceType,\n resourceId,\n action: 'preview',\n gid,\n }),\n copyUrl:\n createGoogleActionUrl({\n resourceType,\n resourceId,\n action: 'copy',\n gid,\n }),\n };\n}\n"]}
@@ -0,0 +1,5 @@
1
+ export interface GoogleEmbedResource {
2
+ embedUrl: string;
3
+ copyUrl: string;
4
+ }
5
+ export declare function resolveGoogleResource(url: URL): GoogleEmbedResource | null;
@@ -0,0 +1,76 @@
1
+ const GOOGLE_HOSTNAME = "docs.google.com";
2
+ const GOOGLE_RESOURCE_TYPES = /* @__PURE__ */ new Set([
3
+ "document",
4
+ "presentation",
5
+ "spreadsheets"
6
+ ]);
7
+ function isGoogleResourceType(value) {
8
+ return GOOGLE_RESOURCE_TYPES.has(
9
+ value
10
+ );
11
+ }
12
+ function getSheetsGid(url) {
13
+ const queryGid = url.searchParams.get("gid");
14
+ if (queryGid) {
15
+ return queryGid;
16
+ }
17
+ const hash = url.hash.startsWith("#") ? url.hash.slice(1) : url.hash;
18
+ if (!hash) {
19
+ return null;
20
+ }
21
+ return new URLSearchParams(
22
+ hash
23
+ ).get("gid");
24
+ }
25
+ function createGoogleActionUrl({
26
+ resourceType,
27
+ resourceId,
28
+ action,
29
+ gid
30
+ }) {
31
+ const url = new URL(
32
+ `https://${GOOGLE_HOSTNAME}/${resourceType}/d/${resourceId}/${action}`
33
+ );
34
+ if (resourceType === "spreadsheets" && gid) {
35
+ url.searchParams.set(
36
+ "gid",
37
+ gid
38
+ );
39
+ }
40
+ return url.toString();
41
+ }
42
+ function resolveGoogleResource(url) {
43
+ if (url.hostname !== GOOGLE_HOSTNAME) {
44
+ return null;
45
+ }
46
+ const segments = url.pathname.split("/").filter(Boolean);
47
+ if (segments.length < 4 || !isGoogleResourceType(
48
+ segments[0]
49
+ ) || segments[1] !== "d") {
50
+ return null;
51
+ }
52
+ const resourceType = segments[0];
53
+ const resourceId = segments[2];
54
+ if (!resourceId) {
55
+ return null;
56
+ }
57
+ const gid = resourceType === "spreadsheets" ? getSheetsGid(url) : null;
58
+ return {
59
+ embedUrl: createGoogleActionUrl({
60
+ resourceType,
61
+ resourceId,
62
+ action: "preview",
63
+ gid
64
+ }),
65
+ copyUrl: createGoogleActionUrl({
66
+ resourceType,
67
+ resourceId,
68
+ action: "copy",
69
+ gid
70
+ })
71
+ };
72
+ }
73
+
74
+ export { resolveGoogleResource };
75
+ //# sourceMappingURL=google.js.map
76
+ //# sourceMappingURL=google.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/embed-viewer/providers/google.ts"],"names":[],"mappings":"AAUA,MAAM,eAAA,GACJ,iBAAA;AAEF,MAAM,qBAAA,uBACA,GAAA,CAAwB;AAAA,EAC1B,UAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEH,SAAS,qBACP,KAAA,EAC6B;AAC7B,EAAA,OAAO,qBAAA,CAAsB,GAAA;AAAA,IAC3B;AAAA,GACF;AACF;AAEA,SAAS,aACP,GAAA,EACe;AACf,EAAA,MAAM,QAAA,GACJ,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA;AAE5B,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GACJ,GAAA,CAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GACnB,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAChB,GAAA,CAAI,IAAA;AAEV,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAI,eAAA;AAAA,IACT;AAAA,GACF,CAAE,IAAI,KAAK,CAAA;AACb;AAEA,SAAS,qBAAA,CAAsB;AAAA,EAC7B,YAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAKW;AACT,EAAA,MAAM,MAAM,IAAI,GAAA;AAAA,IACd,WAAW,eAAe,CAAA,CAAA,EAAI,YAAY,CAAA,GAAA,EAAM,UAAU,IAAI,MAAM,CAAA;AAAA,GACtE;AAEA,EAAA,IACE,YAAA,KAAiB,kBACjB,GAAA,EACA;AACA,IAAA,GAAA,CAAI,YAAA,CAAa,GAAA;AAAA,MACf,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAI,QAAA,EAAS;AACtB;AAEO,SAAS,sBACd,GAAA,EAC4B;AAC5B,EAAA,IACE,GAAA,CAAI,aAAa,eAAA,EACjB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WACJ,GAAA,CAAI,QAAA,CACD,MAAM,GAAG,CAAA,CACT,OAAO,OAAO,CAAA;AAEnB,EAAA,IACE,QAAA,CAAS,MAAA,GAAS,CAAA,IAClB,CAAC,oBAAA;AAAA,IACC,SAAS,CAAC;AAAA,GACZ,IACA,QAAA,CAAS,CAAC,CAAA,KAAM,GAAA,EAChB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAA,GACJ,SAAS,CAAC,CAAA;AAEZ,EAAA,MAAM,UAAA,GACJ,SAAS,CAAC,CAAA;AAEZ,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,GAAA,GACJ,YAAA,KAAiB,cAAA,GACb,YAAA,CAAa,GAAG,CAAA,GAChB,IAAA;AAEN,EAAA,OAAO;AAAA,IACL,UACE,qBAAA,CAAsB;AAAA,MACpB,YAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA,EAAQ,SAAA;AAAA,MACR;AAAA,KACD,CAAA;AAAA,IACH,SACE,qBAAA,CAAsB;AAAA,MACpB,YAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA,EAAQ,MAAA;AAAA,MACR;AAAA,KACD;AAAA,GACL;AACF","file":"google.js","sourcesContent":["export interface GoogleEmbedResource {\n embedUrl: string;\n copyUrl: string;\n}\n\ntype GoogleResourceType =\n | 'document'\n | 'presentation'\n | 'spreadsheets';\n\nconst GOOGLE_HOSTNAME =\n 'docs.google.com';\n\nconst GOOGLE_RESOURCE_TYPES =\n new Set<GoogleResourceType>([\n 'document',\n 'presentation',\n 'spreadsheets',\n ]);\n\nfunction isGoogleResourceType(\n value: string,\n): value is GoogleResourceType {\n return GOOGLE_RESOURCE_TYPES.has(\n value as GoogleResourceType,\n );\n}\n\nfunction getSheetsGid(\n url: URL,\n): string | null {\n const queryGid =\n url.searchParams.get('gid');\n\n if (queryGid) {\n return queryGid;\n }\n\n const hash =\n url.hash.startsWith('#')\n ? url.hash.slice(1)\n : url.hash;\n\n if (!hash) {\n return null;\n }\n\n return new URLSearchParams(\n hash,\n ).get('gid');\n}\n\nfunction createGoogleActionUrl({\n resourceType,\n resourceId,\n action,\n gid,\n}: {\n resourceType: GoogleResourceType;\n resourceId: string;\n action: 'copy' | 'preview';\n gid: string | null;\n}): string {\n const url = new URL(\n `https://${GOOGLE_HOSTNAME}/${resourceType}/d/${resourceId}/${action}`,\n );\n\n if (\n resourceType === 'spreadsheets' &&\n gid\n ) {\n url.searchParams.set(\n 'gid',\n gid,\n );\n }\n\n return url.toString();\n}\n\nexport function resolveGoogleResource(\n url: URL,\n): GoogleEmbedResource | null {\n if (\n url.hostname !== GOOGLE_HOSTNAME\n ) {\n return null;\n }\n\n const segments =\n url.pathname\n .split('/')\n .filter(Boolean);\n\n if (\n segments.length < 4 ||\n !isGoogleResourceType(\n segments[0],\n ) ||\n segments[1] !== 'd'\n ) {\n return null;\n }\n\n const resourceType =\n segments[0];\n\n const resourceId =\n segments[2];\n\n if (!resourceId) {\n return null;\n }\n\n const gid =\n resourceType === 'spreadsheets'\n ? getSheetsGid(url)\n : null;\n\n return {\n embedUrl:\n createGoogleActionUrl({\n resourceType,\n resourceId,\n action: 'preview',\n gid,\n }),\n copyUrl:\n createGoogleActionUrl({\n resourceType,\n resourceId,\n action: 'copy',\n gid,\n }),\n };\n}\n"]}
@@ -0,0 +1,37 @@
1
+ 'use strict';
2
+
3
+ const MIRO_HOSTNAMES = /* @__PURE__ */ new Set([
4
+ "miro.com",
5
+ "www.miro.com"
6
+ ]);
7
+ function resolveMiroResource(url) {
8
+ if (!MIRO_HOSTNAMES.has(
9
+ url.hostname
10
+ )) {
11
+ return null;
12
+ }
13
+ const match = url.pathname.match(
14
+ /^\/app\/board\/([^/]+)\/?$/
15
+ );
16
+ if (!match) {
17
+ return null;
18
+ }
19
+ const boardId = match[1];
20
+ if (!boardId) {
21
+ return null;
22
+ }
23
+ const embedUrl = new URL(
24
+ `https://miro.com/app/live-embed/${boardId}/`
25
+ );
26
+ embedUrl.searchParams.set(
27
+ "autoplay",
28
+ "true"
29
+ );
30
+ return {
31
+ embedUrl: embedUrl.toString()
32
+ };
33
+ }
34
+
35
+ exports.resolveMiroResource = resolveMiroResource;
36
+ //# sourceMappingURL=miro.cjs.map
37
+ //# sourceMappingURL=miro.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/embed-viewer/providers/miro.ts"],"names":[],"mappings":";;AAIA,MAAM,cAAA,uBACA,GAAA,CAAI;AAAA,EACN,UAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEI,SAAS,oBACd,GAAA,EAC0B;AAC1B,EAAA,IACE,CAAC,cAAA,CAAe,GAAA;AAAA,IACd,GAAA,CAAI;AAAA,GACN,EACA;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GACJ,IAAI,QAAA,CAAS,KAAA;AAAA,IACX;AAAA,GACF;AAEF,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GACJ,MAAM,CAAC,CAAA;AAET,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WACJ,IAAI,GAAA;AAAA,IACF,mCAAmC,OAAO,CAAA,CAAA;AAAA,GAC5C;AAEF,EAAA,QAAA,CAAS,YAAA,CAAa,GAAA;AAAA,IACpB,UAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,QAAA,EACE,SAAS,QAAA;AAAS,GACtB;AACF","file":"miro.cjs","sourcesContent":["export interface MiroEmbedResource {\n embedUrl: string;\n}\n\nconst MIRO_HOSTNAMES =\n new Set([\n 'miro.com',\n 'www.miro.com',\n ]);\n\nexport function resolveMiroResource(\n url: URL,\n): MiroEmbedResource | null {\n if (\n !MIRO_HOSTNAMES.has(\n url.hostname,\n )\n ) {\n return null;\n }\n\n const match =\n url.pathname.match(\n /^\\/app\\/board\\/([^/]+)\\/?$/,\n );\n\n if (!match) {\n return null;\n }\n\n const boardId =\n match[1];\n\n if (!boardId) {\n return null;\n }\n\n const embedUrl =\n new URL(\n `https://miro.com/app/live-embed/${boardId}/`,\n );\n\n embedUrl.searchParams.set(\n 'autoplay',\n 'true',\n );\n\n return {\n embedUrl:\n embedUrl.toString(),\n };\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export interface MiroEmbedResource {
2
+ embedUrl: string;
3
+ }
4
+ export declare function resolveMiroResource(url: URL): MiroEmbedResource | null;
@@ -0,0 +1,35 @@
1
+ const MIRO_HOSTNAMES = /* @__PURE__ */ new Set([
2
+ "miro.com",
3
+ "www.miro.com"
4
+ ]);
5
+ function resolveMiroResource(url) {
6
+ if (!MIRO_HOSTNAMES.has(
7
+ url.hostname
8
+ )) {
9
+ return null;
10
+ }
11
+ const match = url.pathname.match(
12
+ /^\/app\/board\/([^/]+)\/?$/
13
+ );
14
+ if (!match) {
15
+ return null;
16
+ }
17
+ const boardId = match[1];
18
+ if (!boardId) {
19
+ return null;
20
+ }
21
+ const embedUrl = new URL(
22
+ `https://miro.com/app/live-embed/${boardId}/`
23
+ );
24
+ embedUrl.searchParams.set(
25
+ "autoplay",
26
+ "true"
27
+ );
28
+ return {
29
+ embedUrl: embedUrl.toString()
30
+ };
31
+ }
32
+
33
+ export { resolveMiroResource };
34
+ //# sourceMappingURL=miro.js.map
35
+ //# sourceMappingURL=miro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/embed-viewer/providers/miro.ts"],"names":[],"mappings":"AAIA,MAAM,cAAA,uBACA,GAAA,CAAI;AAAA,EACN,UAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEI,SAAS,oBACd,GAAA,EAC0B;AAC1B,EAAA,IACE,CAAC,cAAA,CAAe,GAAA;AAAA,IACd,GAAA,CAAI;AAAA,GACN,EACA;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GACJ,IAAI,QAAA,CAAS,KAAA;AAAA,IACX;AAAA,GACF;AAEF,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GACJ,MAAM,CAAC,CAAA;AAET,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WACJ,IAAI,GAAA;AAAA,IACF,mCAAmC,OAAO,CAAA,CAAA;AAAA,GAC5C;AAEF,EAAA,QAAA,CAAS,YAAA,CAAa,GAAA;AAAA,IACpB,UAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,QAAA,EACE,SAAS,QAAA;AAAS,GACtB;AACF","file":"miro.js","sourcesContent":["export interface MiroEmbedResource {\n embedUrl: string;\n}\n\nconst MIRO_HOSTNAMES =\n new Set([\n 'miro.com',\n 'www.miro.com',\n ]);\n\nexport function resolveMiroResource(\n url: URL,\n): MiroEmbedResource | null {\n if (\n !MIRO_HOSTNAMES.has(\n url.hostname,\n )\n ) {\n return null;\n }\n\n const match =\n url.pathname.match(\n /^\\/app\\/board\\/([^/]+)\\/?$/,\n );\n\n if (!match) {\n return null;\n }\n\n const boardId =\n match[1];\n\n if (!boardId) {\n return null;\n }\n\n const embedUrl =\n new URL(\n `https://miro.com/app/live-embed/${boardId}/`,\n );\n\n embedUrl.searchParams.set(\n 'autoplay',\n 'true',\n );\n\n return {\n embedUrl:\n embedUrl.toString(),\n };\n}\n"]}
@@ -0,0 +1,64 @@
1
+ 'use strict';
2
+
3
+ var figma = require('./providers/figma');
4
+ var google = require('./providers/google');
5
+ var miro = require('./providers/miro');
6
+
7
+ function parseHttpUrl(value) {
8
+ try {
9
+ const url = new URL(value);
10
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
11
+ return null;
12
+ }
13
+ return url;
14
+ } catch {
15
+ return null;
16
+ }
17
+ }
18
+ function createEmptyResource() {
19
+ return {
20
+ sourceUrl: null,
21
+ embedUrl: null,
22
+ previewImageUrl: null,
23
+ copyUrl: null,
24
+ capabilities: {
25
+ embed: false,
26
+ open: false
27
+ }
28
+ };
29
+ }
30
+ function resolveEmbedResource({
31
+ src,
32
+ embedSrc
33
+ }) {
34
+ const sourceUrl = parseHttpUrl(src);
35
+ if (!sourceUrl) {
36
+ return createEmptyResource();
37
+ }
38
+ const googleResource = google.resolveGoogleResource(
39
+ sourceUrl
40
+ );
41
+ const miroResource = miro.resolveMiroResource(
42
+ sourceUrl
43
+ );
44
+ const figmaResource = figma.resolveFigmaResource(
45
+ sourceUrl
46
+ );
47
+ const providerEmbedUrl = googleResource?.embedUrl ?? miroResource?.embedUrl ?? figmaResource?.embedUrl ?? null;
48
+ const explicitEmbedUrl = embedSrc ? parseHttpUrl(embedSrc) : null;
49
+ const resolvedEmbedUrl = explicitEmbedUrl?.toString() ?? providerEmbedUrl;
50
+ return {
51
+ sourceUrl: sourceUrl.toString(),
52
+ embedUrl: resolvedEmbedUrl,
53
+ previewImageUrl: null,
54
+ copyUrl: googleResource?.copyUrl ?? null,
55
+ capabilities: {
56
+ embed: resolvedEmbedUrl !== null,
57
+ open: true
58
+ }
59
+ };
60
+ }
61
+
62
+ exports.resolveEmbedResource = resolveEmbedResource;
63
+ //# sourceMappingURL=resolver.cjs.map
64
+ //# sourceMappingURL=resolver.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/embed-viewer/resolver.ts"],"names":["resolveGoogleResource","resolveMiroResource","resolveFigmaResource"],"mappings":";;;;;;AA0BA,SAAS,aACP,KAAA,EACY;AACZ,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GACJ,IAAI,GAAA,CAAI,KAAK,CAAA;AAEf,IAAA,IACE,GAAA,CAAI,QAAA,KAAa,OAAA,IACjB,GAAA,CAAI,aAAa,QAAA,EACjB;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,mBAAA,GAA6C;AACpD,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,IAAA;AAAA,IACX,QAAA,EAAU,IAAA;AAAA,IACV,eAAA,EAAiB,IAAA;AAAA,IACjB,OAAA,EAAS,IAAA;AAAA,IACT,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO,KAAA;AAAA,MACP,IAAA,EAAM;AAAA;AACR,GACF;AACF;AAEO,SAAS,oBAAA,CAAqB;AAAA,EACnC,GAAA;AAAA,EACA;AACF,CAAA,EAAuD;AACrD,EAAA,MAAM,SAAA,GACJ,aAAa,GAAG,CAAA;AAElB,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,mBAAA,EAAoB;AAAA,EAC7B;AAEA,EAAA,MAAM,cAAA,GACJA,4BAAA;AAAA,IACE;AAAA,GACF;AAEF,EAAA,MAAM,YAAA,GACJC,wBAAA;AAAA,IACE;AAAA,GACF;AAEF,EAAA,MAAM,aAAA,GACJC,0BAAA;AAAA,IACE;AAAA,GACF;AAEF,EAAA,MAAM,mBACJ,cAAA,EAAgB,QAAA,IAChB,YAAA,EAAc,QAAA,IACd,eAAe,QAAA,IACf,IAAA;AAEF,EAAA,MAAM,gBAAA,GACJ,QAAA,GACI,YAAA,CAAa,QAAQ,CAAA,GACrB,IAAA;AAEN,EAAA,MAAM,gBAAA,GACJ,gBAAA,EAAkB,QAAA,EAAS,IAC3B,gBAAA;AAEF,EAAA,OAAO;AAAA,IACL,SAAA,EACE,UAAU,QAAA,EAAS;AAAA,IACrB,QAAA,EACE,gBAAA;AAAA,IACF,eAAA,EAAiB,IAAA;AAAA,IACjB,OAAA,EACE,gBAAgB,OAAA,IAChB,IAAA;AAAA,IACF,YAAA,EAAc;AAAA,MACZ,OACE,gBAAA,KAAqB,IAAA;AAAA,MACvB,IAAA,EAAM;AAAA;AACR,GACF;AACF","file":"resolver.cjs","sourcesContent":["import {\n resolveFigmaResource,\n} from './providers/figma';\nimport {\n resolveGoogleResource,\n} from './providers/google';\nimport {\n resolveMiroResource,\n} from './providers/miro';\n\nexport interface ResolvedEmbedResource {\n sourceUrl: string | null;\n embedUrl: string | null;\n previewImageUrl: string | null;\n copyUrl: string | null;\n capabilities: {\n embed: boolean;\n open: boolean;\n };\n}\n\nexport interface ResolveEmbedResourceOptions {\n src: string;\n embedSrc?: string;\n}\n\nfunction parseHttpUrl(\n value: string,\n): URL | null {\n try {\n const url =\n new URL(value);\n\n if (\n url.protocol !== 'http:' &&\n url.protocol !== 'https:'\n ) {\n return null;\n }\n\n return url;\n } catch {\n return null;\n }\n}\n\nfunction createEmptyResource(): ResolvedEmbedResource {\n return {\n sourceUrl: null,\n embedUrl: null,\n previewImageUrl: null,\n copyUrl: null,\n capabilities: {\n embed: false,\n open: false,\n },\n };\n}\n\nexport function resolveEmbedResource({\n src,\n embedSrc,\n}: ResolveEmbedResourceOptions): ResolvedEmbedResource {\n const sourceUrl =\n parseHttpUrl(src);\n\n if (!sourceUrl) {\n return createEmptyResource();\n }\n\n const googleResource =\n resolveGoogleResource(\n sourceUrl,\n );\n\n const miroResource =\n resolveMiroResource(\n sourceUrl,\n );\n\n const figmaResource =\n resolveFigmaResource(\n sourceUrl,\n );\n\n const providerEmbedUrl =\n googleResource?.embedUrl ??\n miroResource?.embedUrl ??\n figmaResource?.embedUrl ??\n null;\n\n const explicitEmbedUrl =\n embedSrc\n ? parseHttpUrl(embedSrc)\n : null;\n\n const resolvedEmbedUrl =\n explicitEmbedUrl?.toString() ??\n providerEmbedUrl;\n\n return {\n sourceUrl:\n sourceUrl.toString(),\n embedUrl:\n resolvedEmbedUrl,\n previewImageUrl: null,\n copyUrl:\n googleResource?.copyUrl ??\n null,\n capabilities: {\n embed:\n resolvedEmbedUrl !== null,\n open: true,\n },\n };\n}\n"]}
@@ -0,0 +1,15 @@
1
+ export interface ResolvedEmbedResource {
2
+ sourceUrl: string | null;
3
+ embedUrl: string | null;
4
+ previewImageUrl: string | null;
5
+ copyUrl: string | null;
6
+ capabilities: {
7
+ embed: boolean;
8
+ open: boolean;
9
+ };
10
+ }
11
+ export interface ResolveEmbedResourceOptions {
12
+ src: string;
13
+ embedSrc?: string;
14
+ }
15
+ export declare function resolveEmbedResource({ src, embedSrc, }: ResolveEmbedResourceOptions): ResolvedEmbedResource;
@@ -0,0 +1,62 @@
1
+ import { resolveFigmaResource } from './providers/figma';
2
+ import { resolveGoogleResource } from './providers/google';
3
+ import { resolveMiroResource } from './providers/miro';
4
+
5
+ function parseHttpUrl(value) {
6
+ try {
7
+ const url = new URL(value);
8
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
9
+ return null;
10
+ }
11
+ return url;
12
+ } catch {
13
+ return null;
14
+ }
15
+ }
16
+ function createEmptyResource() {
17
+ return {
18
+ sourceUrl: null,
19
+ embedUrl: null,
20
+ previewImageUrl: null,
21
+ copyUrl: null,
22
+ capabilities: {
23
+ embed: false,
24
+ open: false
25
+ }
26
+ };
27
+ }
28
+ function resolveEmbedResource({
29
+ src,
30
+ embedSrc
31
+ }) {
32
+ const sourceUrl = parseHttpUrl(src);
33
+ if (!sourceUrl) {
34
+ return createEmptyResource();
35
+ }
36
+ const googleResource = resolveGoogleResource(
37
+ sourceUrl
38
+ );
39
+ const miroResource = resolveMiroResource(
40
+ sourceUrl
41
+ );
42
+ const figmaResource = resolveFigmaResource(
43
+ sourceUrl
44
+ );
45
+ const providerEmbedUrl = googleResource?.embedUrl ?? miroResource?.embedUrl ?? figmaResource?.embedUrl ?? null;
46
+ const explicitEmbedUrl = embedSrc ? parseHttpUrl(embedSrc) : null;
47
+ const resolvedEmbedUrl = explicitEmbedUrl?.toString() ?? providerEmbedUrl;
48
+ return {
49
+ sourceUrl: sourceUrl.toString(),
50
+ embedUrl: resolvedEmbedUrl,
51
+ previewImageUrl: null,
52
+ copyUrl: googleResource?.copyUrl ?? null,
53
+ capabilities: {
54
+ embed: resolvedEmbedUrl !== null,
55
+ open: true
56
+ }
57
+ };
58
+ }
59
+
60
+ export { resolveEmbedResource };
61
+ //# sourceMappingURL=resolver.js.map
62
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/embed-viewer/resolver.ts"],"names":[],"mappings":";;;;AA0BA,SAAS,aACP,KAAA,EACY;AACZ,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GACJ,IAAI,GAAA,CAAI,KAAK,CAAA;AAEf,IAAA,IACE,GAAA,CAAI,QAAA,KAAa,OAAA,IACjB,GAAA,CAAI,aAAa,QAAA,EACjB;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,mBAAA,GAA6C;AACpD,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,IAAA;AAAA,IACX,QAAA,EAAU,IAAA;AAAA,IACV,eAAA,EAAiB,IAAA;AAAA,IACjB,OAAA,EAAS,IAAA;AAAA,IACT,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO,KAAA;AAAA,MACP,IAAA,EAAM;AAAA;AACR,GACF;AACF;AAEO,SAAS,oBAAA,CAAqB;AAAA,EACnC,GAAA;AAAA,EACA;AACF,CAAA,EAAuD;AACrD,EAAA,MAAM,SAAA,GACJ,aAAa,GAAG,CAAA;AAElB,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,mBAAA,EAAoB;AAAA,EAC7B;AAEA,EAAA,MAAM,cAAA,GACJ,qBAAA;AAAA,IACE;AAAA,GACF;AAEF,EAAA,MAAM,YAAA,GACJ,mBAAA;AAAA,IACE;AAAA,GACF;AAEF,EAAA,MAAM,aAAA,GACJ,oBAAA;AAAA,IACE;AAAA,GACF;AAEF,EAAA,MAAM,mBACJ,cAAA,EAAgB,QAAA,IAChB,YAAA,EAAc,QAAA,IACd,eAAe,QAAA,IACf,IAAA;AAEF,EAAA,MAAM,gBAAA,GACJ,QAAA,GACI,YAAA,CAAa,QAAQ,CAAA,GACrB,IAAA;AAEN,EAAA,MAAM,gBAAA,GACJ,gBAAA,EAAkB,QAAA,EAAS,IAC3B,gBAAA;AAEF,EAAA,OAAO;AAAA,IACL,SAAA,EACE,UAAU,QAAA,EAAS;AAAA,IACrB,QAAA,EACE,gBAAA;AAAA,IACF,eAAA,EAAiB,IAAA;AAAA,IACjB,OAAA,EACE,gBAAgB,OAAA,IAChB,IAAA;AAAA,IACF,YAAA,EAAc;AAAA,MACZ,OACE,gBAAA,KAAqB,IAAA;AAAA,MACvB,IAAA,EAAM;AAAA;AACR,GACF;AACF","file":"resolver.js","sourcesContent":["import {\n resolveFigmaResource,\n} from './providers/figma';\nimport {\n resolveGoogleResource,\n} from './providers/google';\nimport {\n resolveMiroResource,\n} from './providers/miro';\n\nexport interface ResolvedEmbedResource {\n sourceUrl: string | null;\n embedUrl: string | null;\n previewImageUrl: string | null;\n copyUrl: string | null;\n capabilities: {\n embed: boolean;\n open: boolean;\n };\n}\n\nexport interface ResolveEmbedResourceOptions {\n src: string;\n embedSrc?: string;\n}\n\nfunction parseHttpUrl(\n value: string,\n): URL | null {\n try {\n const url =\n new URL(value);\n\n if (\n url.protocol !== 'http:' &&\n url.protocol !== 'https:'\n ) {\n return null;\n }\n\n return url;\n } catch {\n return null;\n }\n}\n\nfunction createEmptyResource(): ResolvedEmbedResource {\n return {\n sourceUrl: null,\n embedUrl: null,\n previewImageUrl: null,\n copyUrl: null,\n capabilities: {\n embed: false,\n open: false,\n },\n };\n}\n\nexport function resolveEmbedResource({\n src,\n embedSrc,\n}: ResolveEmbedResourceOptions): ResolvedEmbedResource {\n const sourceUrl =\n parseHttpUrl(src);\n\n if (!sourceUrl) {\n return createEmptyResource();\n }\n\n const googleResource =\n resolveGoogleResource(\n sourceUrl,\n );\n\n const miroResource =\n resolveMiroResource(\n sourceUrl,\n );\n\n const figmaResource =\n resolveFigmaResource(\n sourceUrl,\n );\n\n const providerEmbedUrl =\n googleResource?.embedUrl ??\n miroResource?.embedUrl ??\n figmaResource?.embedUrl ??\n null;\n\n const explicitEmbedUrl =\n embedSrc\n ? parseHttpUrl(embedSrc)\n : null;\n\n const resolvedEmbedUrl =\n explicitEmbedUrl?.toString() ??\n providerEmbedUrl;\n\n return {\n sourceUrl:\n sourceUrl.toString(),\n embedUrl:\n resolvedEmbedUrl,\n previewImageUrl: null,\n copyUrl:\n googleResource?.copyUrl ??\n null,\n capabilities: {\n embed:\n resolvedEmbedUrl !== null,\n open: true,\n },\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jvetrau-ds",
3
- "version": "0.2.17",
3
+ "version": "0.2.18",
4
4
  "description": "Multi-brand React design system with semantic tokens",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",