@editframe/react 0.30.1-beta.0 → 0.31.0-beta.0

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/dist/_virtual/rolldown_runtime.js +31 -0
  2. package/dist/components/TimelineRoot.d.ts +41 -0
  3. package/dist/components/TimelineRoot.js +78 -0
  4. package/dist/components/TimelineRoot.js.map +1 -0
  5. package/dist/elements/PanZoom.d.ts +10 -0
  6. package/dist/elements/PanZoom.js +16 -0
  7. package/dist/elements/PanZoom.js.map +1 -0
  8. package/dist/gui/EFTransformHandles.d.ts +11 -0
  9. package/dist/gui/EFTransformHandles.js +18 -0
  10. package/dist/gui/EFTransformHandles.js.map +1 -0
  11. package/dist/gui/OverlayItem.d.ts +16 -0
  12. package/dist/gui/OverlayItem.js +16 -0
  13. package/dist/gui/OverlayItem.js.map +1 -0
  14. package/dist/gui/OverlayLayer.d.ts +8 -0
  15. package/dist/gui/OverlayLayer.js +15 -0
  16. package/dist/gui/OverlayLayer.js.map +1 -0
  17. package/dist/gui/Scrubber.d.ts +15 -3
  18. package/dist/gui/Scrubber.js +27 -3
  19. package/dist/gui/Scrubber.js.map +1 -1
  20. package/dist/gui/TimelineRuler.d.ts +16 -0
  21. package/dist/gui/TimelineRuler.js +33 -0
  22. package/dist/gui/TimelineRuler.js.map +1 -0
  23. package/dist/hooks/usePanZoomTransform.d.ts +25 -0
  24. package/dist/hooks/usePanZoomTransform.js +49 -0
  25. package/dist/hooks/usePanZoomTransform.js.map +1 -0
  26. package/dist/index.d.ts +10 -2
  27. package/dist/index.js +9 -1
  28. package/dist/node_modules/react-dom/cjs/react-dom.development.js +16845 -0
  29. package/dist/node_modules/react-dom/cjs/react-dom.development.js.map +1 -0
  30. package/dist/node_modules/react-dom/client.js +22 -0
  31. package/dist/node_modules/react-dom/client.js.map +1 -0
  32. package/dist/node_modules/react-dom/index.js +13 -0
  33. package/dist/node_modules/react-dom/index.js.map +1 -0
  34. package/dist/node_modules/scheduler/cjs/scheduler.development.js +391 -0
  35. package/dist/node_modules/scheduler/cjs/scheduler.development.js.map +1 -0
  36. package/dist/node_modules/scheduler/index.js +13 -0
  37. package/dist/node_modules/scheduler/index.js.map +1 -0
  38. package/package.json +3 -3
  39. package/types.json +1 -1
@@ -0,0 +1,31 @@
1
+ //#region rolldown:runtime
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __commonJS = (cb, mod) => function() {
9
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
13
+ key = keys[i];
14
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
15
+ get: ((k) => from[k]).bind(null, key),
16
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
17
+ });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
22
+ value: mod,
23
+ enumerable: true
24
+ }) : target, mod));
25
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { get: (a, b) => (typeof require !== "undefined" ? require : a)[b] }) : x)(function(x) {
26
+ if (typeof require !== "undefined") return require.apply(this, arguments);
27
+ throw Error("Calling `require` for \"" + x + "\" in an environment that doesn't expose the `require` function.");
28
+ });
29
+
30
+ //#endregion
31
+ export { __commonJS, __require, __toESM };
@@ -0,0 +1,41 @@
1
+ import * as React$1 from "react";
2
+
3
+ //#region src/components/TimelineRoot.d.ts
4
+ interface TimelineRootProps {
5
+ /** Unique identifier for the root timegroup */
6
+ id: string;
7
+ /** React component that renders the timeline content (must include a Timegroup at root) */
8
+ component: React$1.ComponentType;
9
+ /** Optional CSS class name for the container */
10
+ className?: string;
11
+ /** Optional inline styles for the container */
12
+ style?: React$1.CSSProperties;
13
+ /** Optional children to render alongside the component (e.g., Configuration wrapper) */
14
+ children?: React$1.ReactNode;
15
+ }
16
+ /**
17
+ * TimelineRoot - Factory wrapper for React-based timelines.
18
+ *
19
+ * This component enables proper clone rendering by providing a factory pattern
20
+ * for creating fully functional timeline instances. When render clones are created
21
+ * (for exports, thumbnails, etc.), the initializer re-renders the React component
22
+ * tree to ensure all JavaScript state and React lifecycle methods work correctly.
23
+ *
24
+ * @example
25
+ * ```tsx
26
+ * const MyTimelineContent = () => (
27
+ * <Timegroup mode="sequence">
28
+ * <MyScenes />
29
+ * </Timegroup>
30
+ * );
31
+ *
32
+ * // Wrap with Configuration if needed
33
+ * <Configuration apiHost="...">
34
+ * <TimelineRoot id="root" component={MyTimelineContent} />
35
+ * </Configuration>
36
+ * ```
37
+ */
38
+ declare const TimelineRoot: React$1.FC<TimelineRootProps>;
39
+ //#endregion
40
+ export { TimelineRoot };
41
+ //# sourceMappingURL=TimelineRoot.d.ts.map
@@ -0,0 +1,78 @@
1
+ import { __toESM } from "../_virtual/rolldown_runtime.js";
2
+ import { require_react_dom } from "../node_modules/react-dom/index.js";
3
+ import { require_client } from "../node_modules/react-dom/client.js";
4
+ import { useEffect, useRef } from "react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+
7
+ //#region src/components/TimelineRoot.tsx
8
+ var import_client = /* @__PURE__ */ __toESM(require_client());
9
+ var import_react_dom = /* @__PURE__ */ __toESM(require_react_dom());
10
+ /**
11
+ * TimelineRoot - Factory wrapper for React-based timelines.
12
+ *
13
+ * This component enables proper clone rendering by providing a factory pattern
14
+ * for creating fully functional timeline instances. When render clones are created
15
+ * (for exports, thumbnails, etc.), the initializer re-renders the React component
16
+ * tree to ensure all JavaScript state and React lifecycle methods work correctly.
17
+ *
18
+ * @example
19
+ * ```tsx
20
+ * const MyTimelineContent = () => (
21
+ * <Timegroup mode="sequence">
22
+ * <MyScenes />
23
+ * </Timegroup>
24
+ * );
25
+ *
26
+ * // Wrap with Configuration if needed
27
+ * <Configuration apiHost="...">
28
+ * <TimelineRoot id="root" component={MyTimelineContent} />
29
+ * </Configuration>
30
+ * ```
31
+ */
32
+ const TimelineRoot = ({ id, component: Component, className, style, children }) => {
33
+ const containerRef = useRef(null);
34
+ useEffect(() => {
35
+ const container = containerRef.current;
36
+ if (!container) return;
37
+ const timegroup = container.querySelector("ef-timegroup");
38
+ if (!timegroup) {
39
+ console.warn("[TimelineRoot] No ef-timegroup found in component. Ensure your component renders a Timegroup.");
40
+ return;
41
+ }
42
+ timegroup.id = id;
43
+ timegroup.initializer = (cloneEl) => {
44
+ const cloneContainer = cloneEl.parentElement;
45
+ if (!cloneContainer) {
46
+ console.error("[TimelineRoot] No parent container for clone");
47
+ return;
48
+ }
49
+ cloneEl.remove();
50
+ const root = import_client.createRoot(cloneContainer);
51
+ (0, import_react_dom.flushSync)(() => {
52
+ root.render(/* @__PURE__ */ jsx(Component, {}));
53
+ });
54
+ const newTimegroup = cloneContainer.querySelector("ef-timegroup");
55
+ if (newTimegroup) newTimegroup._reactRoot = root;
56
+ else {
57
+ cloneContainer._reactRoot = root;
58
+ console.error("[TimelineRoot] No ef-timegroup found after React render");
59
+ }
60
+ };
61
+ return () => {
62
+ timegroup.initializer = void 0;
63
+ };
64
+ }, [id, Component]);
65
+ return /* @__PURE__ */ jsxs("div", {
66
+ ref: containerRef,
67
+ className,
68
+ style: {
69
+ display: "contents",
70
+ ...style
71
+ },
72
+ children: [children, /* @__PURE__ */ jsx(Component, {})]
73
+ });
74
+ };
75
+
76
+ //#endregion
77
+ export { TimelineRoot };
78
+ //# sourceMappingURL=TimelineRoot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimelineRoot.js","names":["TimelineRoot: React.FC<TimelineRootProps>"],"sources":["../../src/components/TimelineRoot.tsx"],"sourcesContent":["import * as React from 'react';\nimport * as ReactDOM from 'react-dom/client';\nimport { flushSync } from 'react-dom';\nimport { useEffect, useRef } from 'react';\nimport type { EFTimegroup } from '@editframe/elements';\n\ninterface TimelineRootProps {\n /** Unique identifier for the root timegroup */\n id: string;\n /** React component that renders the timeline content (must include a Timegroup at root) */\n component: React.ComponentType;\n /** Optional CSS class name for the container */\n className?: string;\n /** Optional inline styles for the container */\n style?: React.CSSProperties;\n /** Optional children to render alongside the component (e.g., Configuration wrapper) */\n children?: React.ReactNode;\n}\n\n/**\n * TimelineRoot - Factory wrapper for React-based timelines.\n * \n * This component enables proper clone rendering by providing a factory pattern\n * for creating fully functional timeline instances. When render clones are created\n * (for exports, thumbnails, etc.), the initializer re-renders the React component\n * tree to ensure all JavaScript state and React lifecycle methods work correctly.\n * \n * @example\n * ```tsx\n * const MyTimelineContent = () => (\n * <Timegroup mode=\"sequence\">\n * <MyScenes />\n * </Timegroup>\n * );\n * \n * // Wrap with Configuration if needed\n * <Configuration apiHost=\"...\">\n * <TimelineRoot id=\"root\" component={MyTimelineContent} />\n * </Configuration>\n * ```\n */\nexport const TimelineRoot: React.FC<TimelineRootProps> = ({\n id,\n component: Component,\n className,\n style,\n children,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n \n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n \n // Find the root timegroup rendered by Component\n const timegroup = container.querySelector('ef-timegroup') as EFTimegroup;\n if (!timegroup) {\n console.warn('[TimelineRoot] No ef-timegroup found in component. Ensure your component renders a Timegroup.');\n return;\n }\n \n // Ensure the timegroup has the specified ID\n timegroup.id = id;\n \n // Register factory initializer - MUST be synchronous\n // Uses flushSync to force React to render synchronously\n timegroup.initializer = (cloneEl: EFTimegroup) => {\n const cloneContainer = cloneEl.parentElement;\n if (!cloneContainer) {\n console.error('[TimelineRoot] No parent container for clone');\n return;\n }\n \n // Remove the cloned DOM - React will render a fresh component tree\n // The cloned DOM doesn't have React bindings, so we need to replace it\n cloneEl.remove();\n \n // Create React root for the clone container\n const root = ReactDOM.createRoot(cloneContainer);\n \n // Use flushSync to render synchronously (required by initializer contract)\n // This ensures the component tree is fully rendered before initializer returns\n flushSync(() => {\n root.render(<Component />);\n });\n \n // Find the new timegroup rendered by React and store the React root on it\n // This is needed for cleanup in createRenderClone\n const newTimegroup = cloneContainer.querySelector('ef-timegroup');\n if (newTimegroup) {\n (newTimegroup as any)._reactRoot = root;\n } else {\n // Store root on container so we can still clean up\n (cloneContainer as any)._reactRoot = root;\n console.error('[TimelineRoot] No ef-timegroup found after React render');\n }\n };\n \n // Cleanup: remove initializer when component unmounts\n return () => {\n timegroup.initializer = undefined;\n };\n }, [id, Component]);\n \n return (\n <div \n ref={containerRef} \n className={className} \n style={{ display: 'contents', ...style }}\n >\n {children}\n <Component />\n </div>\n );\n};\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,MAAaA,gBAA6C,EACxD,IACA,WAAW,WACX,WACA,OACA,eACI;CACJ,MAAM,eAAe,OAAuB,KAAK;AAEjD,iBAAgB;EACd,MAAM,YAAY,aAAa;AAC/B,MAAI,CAAC,UAAW;EAGhB,MAAM,YAAY,UAAU,cAAc,eAAe;AACzD,MAAI,CAAC,WAAW;AACd,WAAQ,KAAK,gGAAgG;AAC7G;;AAIF,YAAU,KAAK;AAIf,YAAU,eAAe,YAAyB;GAChD,MAAM,iBAAiB,QAAQ;AAC/B,OAAI,CAAC,gBAAgB;AACnB,YAAQ,MAAM,+CAA+C;AAC7D;;AAKF,WAAQ,QAAQ;GAGhB,MAAM,qBAAgB,WAAW,eAAe;AAIhD,yCAAgB;AACd,SAAK,OAAO,oBAAC,cAAY,CAAC;KAC1B;GAIF,MAAM,eAAe,eAAe,cAAc,eAAe;AACjE,OAAI,aACF,CAAC,aAAqB,aAAa;QAC9B;AAEL,IAAC,eAAuB,aAAa;AACrC,YAAQ,MAAM,0DAA0D;;;AAK5E,eAAa;AACX,aAAU,cAAc;;IAEzB,CAAC,IAAI,UAAU,CAAC;AAEnB,QACE,qBAAC;EACC,KAAK;EACM;EACX,OAAO;GAAE,SAAS;GAAY,GAAG;GAAO;aAEvC,UACD,oBAAC,cAAY;GACT"}
@@ -0,0 +1,10 @@
1
+ import { ReactWebComponent } from "../hooks/create-element.js";
2
+ import { EFPanZoom } from "@editframe/elements";
3
+
4
+ //#region src/elements/PanZoom.d.ts
5
+ declare const PanZoom: ReactWebComponent<EFPanZoom, {
6
+ onTransformChanged: string;
7
+ }>;
8
+ //#endregion
9
+ export { PanZoom };
10
+ //# sourceMappingURL=PanZoom.d.ts.map
@@ -0,0 +1,16 @@
1
+ import { createComponent } from "../hooks/create-element.js";
2
+ import { EFPanZoom } from "@editframe/elements";
3
+ import React from "react";
4
+
5
+ //#region src/elements/PanZoom.ts
6
+ const PanZoom = createComponent({
7
+ tagName: "ef-pan-zoom",
8
+ elementClass: EFPanZoom,
9
+ react: React,
10
+ displayName: "PanZoom",
11
+ events: { onTransformChanged: "transform-changed" }
12
+ });
13
+
14
+ //#endregion
15
+ export { PanZoom };
16
+ //# sourceMappingURL=PanZoom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PanZoom.js","names":["EFPanZoomElement"],"sources":["../../src/elements/PanZoom.ts"],"sourcesContent":["import { EFPanZoom as EFPanZoomElement } from \"@editframe/elements\";\nimport React from \"react\";\nimport { createComponent } from \"../hooks/create-element\";\n\nexport const PanZoom = createComponent({\n tagName: \"ef-pan-zoom\",\n elementClass: EFPanZoomElement,\n react: React,\n displayName: \"PanZoom\",\n events: {\n onTransformChanged: \"transform-changed\",\n },\n});\n"],"mappings":";;;;;AAIA,MAAa,UAAU,gBAAgB;CACrC,SAAS;CACT,cAAcA;CACd,OAAO;CACP,aAAa;CACb,QAAQ,EACN,oBAAoB,qBACrB;CACF,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { ReactWebComponent } from "../hooks/create-element.js";
2
+ import { EFTransformHandles } from "@editframe/elements";
3
+
4
+ //#region src/gui/EFTransformHandles.d.ts
5
+ declare const TransformHandles: ReactWebComponent<EFTransformHandles, {
6
+ onBoundsChange: string;
7
+ onRotationChange: string;
8
+ }>;
9
+ //#endregion
10
+ export { TransformHandles };
11
+ //# sourceMappingURL=EFTransformHandles.d.ts.map
@@ -0,0 +1,18 @@
1
+ import { createComponent } from "../hooks/create-element.js";
2
+ import { EFTransformHandles } from "@editframe/elements";
3
+ import React from "react";
4
+
5
+ //#region src/gui/EFTransformHandles.ts
6
+ const TransformHandles = createComponent({
7
+ tagName: "ef-transform-handles",
8
+ elementClass: EFTransformHandles,
9
+ react: React,
10
+ events: {
11
+ onBoundsChange: "bounds-change",
12
+ onRotationChange: "rotation-change"
13
+ }
14
+ });
15
+
16
+ //#endregion
17
+ export { TransformHandles };
18
+ //# sourceMappingURL=EFTransformHandles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EFTransformHandles.js","names":["EFTransformHandlesElement"],"sources":["../../src/gui/EFTransformHandles.ts"],"sourcesContent":["import { EFTransformHandles as EFTransformHandlesElement } from \"@editframe/elements\";\nimport React from \"react\";\nimport { createComponent } from \"../hooks/create-element\";\n\nexport const TransformHandles = createComponent({\n tagName: \"ef-transform-handles\",\n elementClass: EFTransformHandlesElement,\n react: React,\n events: {\n onBoundsChange: \"bounds-change\",\n onRotationChange: \"rotation-change\",\n },\n});\n"],"mappings":";;;;;AAIA,MAAa,mBAAmB,gBAAgB;CAC9C,SAAS;CACT,cAAcA;CACd,OAAO;CACP,QAAQ;EACN,gBAAgB;EAChB,kBAAkB;EACnB;CACF,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { EFOverlayItem } from "@editframe/elements";
2
+ import React from "react";
3
+
4
+ //#region src/gui/OverlayItem.d.ts
5
+ interface OverlayItemProps {
6
+ /** Element ID - automatically resolves to [data-element-id] or [data-timegroup-id] selector */
7
+ elementId?: string;
8
+ /** Target element or selector - use for custom targeting when elementId doesn't work */
9
+ target?: HTMLElement | string;
10
+ /** Called when position changes. Receives CustomEvent with OverlayItemPosition as detail. */
11
+ onPositionChanged?: (e: Event) => void;
12
+ }
13
+ declare const OverlayItem: React.ForwardRefExoticComponent<OverlayItemProps & React.RefAttributes<EFOverlayItem>>;
14
+ //#endregion
15
+ export { OverlayItem, OverlayItemProps };
16
+ //# sourceMappingURL=OverlayItem.d.ts.map
@@ -0,0 +1,16 @@
1
+ import { createComponent } from "../hooks/create-element.js";
2
+ import { EFOverlayItem } from "@editframe/elements";
3
+ import React from "react";
4
+
5
+ //#region src/gui/OverlayItem.tsx
6
+ const OverlayItem = createComponent({
7
+ tagName: "ef-overlay-item",
8
+ elementClass: EFOverlayItem,
9
+ react: React,
10
+ displayName: "OverlayItem",
11
+ events: { onPositionChanged: "position-changed" }
12
+ });
13
+
14
+ //#endregion
15
+ export { OverlayItem };
16
+ //# sourceMappingURL=OverlayItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OverlayItem.js","names":["EFOverlayItemElement"],"sources":["../../src/gui/OverlayItem.tsx"],"sourcesContent":["import {\n EFOverlayItem as EFOverlayItemElement,\n} from \"@editframe/elements\";\nimport React from \"react\";\nimport { createComponent } from \"../hooks/create-element\";\n\nexport interface OverlayItemProps {\n /** Element ID - automatically resolves to [data-element-id] or [data-timegroup-id] selector */\n elementId?: string;\n /** Target element or selector - use for custom targeting when elementId doesn't work */\n target?: HTMLElement | string;\n /** Called when position changes. Receives CustomEvent with OverlayItemPosition as detail. */\n onPositionChanged?: (e: Event) => void;\n}\n\nexport const OverlayItem = createComponent<\n EFOverlayItemElement,\n { onPositionChanged: \"position-changed\" }\n>({\n tagName: \"ef-overlay-item\",\n elementClass: EFOverlayItemElement,\n react: React,\n displayName: \"OverlayItem\",\n events: {\n onPositionChanged: \"position-changed\",\n },\n}) as React.ForwardRefExoticComponent<OverlayItemProps & React.RefAttributes<EFOverlayItemElement>>;\n"],"mappings":";;;;;AAeA,MAAa,cAAc,gBAGzB;CACA,SAAS;CACT,cAAcA;CACd,OAAO;CACP,aAAa;CACb,QAAQ,EACN,mBAAmB,oBACpB;CACF,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { ReactWebComponent } from "../hooks/create-element.js";
2
+ import { EFOverlayLayer } from "@editframe/elements";
3
+
4
+ //#region src/gui/OverlayLayer.d.ts
5
+ declare const OverlayLayer: ReactWebComponent<EFOverlayLayer, {}>;
6
+ //#endregion
7
+ export { OverlayLayer };
8
+ //# sourceMappingURL=OverlayLayer.d.ts.map
@@ -0,0 +1,15 @@
1
+ import { createComponent } from "../hooks/create-element.js";
2
+ import { EFOverlayLayer } from "@editframe/elements";
3
+ import React from "react";
4
+
5
+ //#region src/gui/OverlayLayer.tsx
6
+ const OverlayLayer = createComponent({
7
+ tagName: "ef-overlay-layer",
8
+ elementClass: EFOverlayLayer,
9
+ react: React,
10
+ displayName: "OverlayLayer"
11
+ });
12
+
13
+ //#endregion
14
+ export { OverlayLayer };
15
+ //# sourceMappingURL=OverlayLayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OverlayLayer.js","names":["EFOverlayLayerElement"],"sources":["../../src/gui/OverlayLayer.tsx"],"sourcesContent":["import { EFOverlayLayer as EFOverlayLayerElement } from \"@editframe/elements\";\nimport React from \"react\";\nimport { createComponent } from \"../hooks/create-element\";\n\n// OverlayLayer discovers PanZoom automatically via:\n// - Lit context (if PanZoom is ancestor)\n// - Direct DOM query (if PanZoom is sibling)\n// No React props needed for coordination!\n\nexport const OverlayLayer = createComponent<EFOverlayLayerElement, {}>({\n tagName: \"ef-overlay-layer\",\n elementClass: EFOverlayLayerElement,\n react: React,\n displayName: \"OverlayLayer\",\n});\n"],"mappings":";;;;;AASA,MAAa,eAAe,gBAA2C;CACrE,SAAS;CACT,cAAcA;CACd,OAAO;CACP,aAAa;CACd,CAAC"}
@@ -1,8 +1,20 @@
1
- import { ReactWebComponent } from "../hooks/create-element.js";
2
1
  import { EFScrubber } from "@editframe/elements";
2
+ import React from "react";
3
3
 
4
4
  //#region src/gui/Scrubber.d.ts
5
- declare const Scrubber: ReactWebComponent<EFScrubber, {}>;
5
+ interface ScrubberProps {
6
+ orientation?: "horizontal" | "vertical";
7
+ currentTimeMs?: number;
8
+ durationMs?: number;
9
+ zoomScale?: number;
10
+ containerWidth?: number;
11
+ fps?: number;
12
+ rawScrubTimeMs?: number | null;
13
+ scrollContainerRef?: React.RefObject<HTMLElement>;
14
+ isScrubbingRef?: React.MutableRefObject<boolean>;
15
+ onSeek?: (time: number) => void;
16
+ }
17
+ declare const Scrubber: React.ForwardRefExoticComponent<ScrubberProps & React.RefAttributes<EFScrubber>>;
6
18
  //#endregion
7
- export { Scrubber };
19
+ export { Scrubber, ScrubberProps };
8
20
  //# sourceMappingURL=Scrubber.d.ts.map
@@ -1,13 +1,37 @@
1
1
  import { createComponent } from "../hooks/create-element.js";
2
2
  import { EFScrubber } from "@editframe/elements";
3
3
  import React from "react";
4
+ import { jsx } from "react/jsx-runtime";
4
5
 
5
- //#region src/gui/Scrubber.ts
6
- const Scrubber = createComponent({
6
+ //#region src/gui/Scrubber.tsx
7
+ const BaseScrubber = createComponent({
7
8
  tagName: "ef-scrubber",
8
9
  elementClass: EFScrubber,
9
- react: React
10
+ react: React,
11
+ displayName: "Scrubber",
12
+ events: { onSeek: "seek" }
10
13
  });
14
+ const Scrubber = React.forwardRef((props, ref) => {
15
+ const { scrollContainerRef, isScrubbingRef,...restProps } = props;
16
+ const elementRef = React.useRef(null);
17
+ React.useLayoutEffect(() => {
18
+ if (elementRef.current) {
19
+ if (scrollContainerRef?.current) elementRef.current.scrollContainerRef = scrollContainerRef;
20
+ else elementRef.current.scrollContainerRef = void 0;
21
+ if (isScrubbingRef) elementRef.current.isScrubbingRef = isScrubbingRef;
22
+ else elementRef.current.isScrubbingRef = void 0;
23
+ }
24
+ }, [scrollContainerRef?.current, isScrubbingRef]);
25
+ return /* @__PURE__ */ jsx(BaseScrubber, {
26
+ ...restProps,
27
+ ref: (node) => {
28
+ elementRef.current = node;
29
+ if (typeof ref === "function") ref(node);
30
+ else if (ref) ref.current = node;
31
+ }
32
+ });
33
+ });
34
+ Scrubber.displayName = "Scrubber";
11
35
 
12
36
  //#endregion
13
37
  export { Scrubber };
@@ -1 +1 @@
1
- {"version":3,"file":"Scrubber.js","names":["EFScrubberElement"],"sources":["../../src/gui/Scrubber.ts"],"sourcesContent":["import { EFScrubber as EFScrubberElement } from \"@editframe/elements\";\nimport React from \"react\";\nimport { createComponent } from \"../hooks/create-element\";\n\nexport const Scrubber = createComponent({\n tagName: \"ef-scrubber\",\n elementClass: EFScrubberElement,\n react: React,\n});\n"],"mappings":";;;;;AAIA,MAAa,WAAW,gBAAgB;CACtC,SAAS;CACT,cAAcA;CACd,OAAO;CACR,CAAC"}
1
+ {"version":3,"file":"Scrubber.js","names":[],"sources":["../../src/gui/Scrubber.tsx"],"sourcesContent":["import { EFScrubber } from \"@editframe/elements\";\nimport React from \"react\";\nimport { createComponent } from \"../hooks/create-element\";\n\nexport interface ScrubberProps {\n orientation?: \"horizontal\" | \"vertical\";\n currentTimeMs?: number;\n durationMs?: number;\n zoomScale?: number;\n containerWidth?: number;\n fps?: number;\n rawScrubTimeMs?: number | null;\n scrollContainerRef?: React.RefObject<HTMLElement>;\n isScrubbingRef?: React.MutableRefObject<boolean>;\n onSeek?: (time: number) => void;\n}\n\nconst BaseScrubber = createComponent<\n EFScrubber,\n { onSeek: \"seek\" }\n>({\n tagName: \"ef-scrubber\",\n elementClass: EFScrubber,\n react: React,\n displayName: \"Scrubber\",\n events: {\n onSeek: \"seek\",\n },\n}) as React.ForwardRefExoticComponent<ScrubberProps & React.RefAttributes<EFScrubber>>;\n\nexport const Scrubber = React.forwardRef<EFScrubber, ScrubberProps>(\n (props, ref) => {\n const { scrollContainerRef, isScrubbingRef, ...restProps } = props;\n const elementRef = React.useRef<EFScrubber | null>(null);\n\n React.useLayoutEffect(() => {\n if (elementRef.current) {\n if (scrollContainerRef?.current) {\n elementRef.current.scrollContainerRef = scrollContainerRef;\n } else {\n elementRef.current.scrollContainerRef = undefined;\n }\n if (isScrubbingRef) {\n elementRef.current.isScrubbingRef = isScrubbingRef;\n } else {\n elementRef.current.isScrubbingRef = undefined;\n }\n }\n }, [scrollContainerRef?.current, isScrubbingRef]);\n\n return (\n <BaseScrubber\n {...restProps}\n ref={(node) => {\n elementRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n />\n );\n },\n);\n\nScrubber.displayName = \"Scrubber\";\n"],"mappings":";;;;;;AAiBA,MAAM,eAAe,gBAGnB;CACA,SAAS;CACT,cAAc;CACd,OAAO;CACP,aAAa;CACb,QAAQ,EACN,QAAQ,QACT;CACF,CAAC;AAEF,MAAa,WAAW,MAAM,YAC3B,OAAO,QAAQ;CACd,MAAM,EAAE,oBAAoB,eAAgB,GAAG,cAAc;CAC7D,MAAM,aAAa,MAAM,OAA0B,KAAK;AAExD,OAAM,sBAAsB;AAC1B,MAAI,WAAW,SAAS;AACtB,OAAI,oBAAoB,QACtB,YAAW,QAAQ,qBAAqB;OAExC,YAAW,QAAQ,qBAAqB;AAE1C,OAAI,eACF,YAAW,QAAQ,iBAAiB;OAEpC,YAAW,QAAQ,iBAAiB;;IAGvC,CAAC,oBAAoB,SAAS,eAAe,CAAC;AAEjD,QACE,oBAAC;EACC,GAAI;EACJ,MAAM,SAAS;AACb,cAAW,UAAU;AACrB,OAAI,OAAO,QAAQ,WAAY,KAAI,KAAK;YAC/B,IAAK,KAAI,UAAU;;GAE9B;EAGP;AAED,SAAS,cAAc"}
@@ -0,0 +1,16 @@
1
+ import { EFTimelineRuler } from "@editframe/elements";
2
+ import React from "react";
3
+
4
+ //#region src/gui/TimelineRuler.d.ts
5
+ interface TimelineRulerProps {
6
+ durationMs?: number;
7
+ zoomScale?: number;
8
+ containerWidth?: number;
9
+ fps?: number;
10
+ scrollContainerSelector?: string;
11
+ scrollContainerRef?: React.RefObject<HTMLElement>;
12
+ }
13
+ declare const TimelineRuler: React.ForwardRefExoticComponent<TimelineRulerProps & React.RefAttributes<EFTimelineRuler>>;
14
+ //#endregion
15
+ export { TimelineRuler };
16
+ //# sourceMappingURL=TimelineRuler.d.ts.map
@@ -0,0 +1,33 @@
1
+ import { createComponent } from "../hooks/create-element.js";
2
+ import { EFTimelineRuler } from "@editframe/elements";
3
+ import React from "react";
4
+ import { jsx } from "react/jsx-runtime";
5
+
6
+ //#region src/gui/TimelineRuler.tsx
7
+ const BaseTimelineRuler = createComponent({
8
+ tagName: "ef-timeline-ruler",
9
+ elementClass: EFTimelineRuler,
10
+ react: React,
11
+ displayName: "TimelineRuler"
12
+ });
13
+ const TimelineRuler = React.forwardRef((props, ref) => {
14
+ const { scrollContainerRef,...restProps } = props;
15
+ const elementRef = React.useRef(null);
16
+ React.useLayoutEffect(() => {
17
+ if (elementRef.current && scrollContainerRef?.current) elementRef.current.scrollContainerElement = scrollContainerRef.current;
18
+ else if (elementRef.current) elementRef.current.scrollContainerElement = null;
19
+ }, [scrollContainerRef?.current]);
20
+ return /* @__PURE__ */ jsx(BaseTimelineRuler, {
21
+ ...restProps,
22
+ ref: (node) => {
23
+ elementRef.current = node;
24
+ if (typeof ref === "function") ref(node);
25
+ else if (ref) ref.current = node;
26
+ }
27
+ });
28
+ });
29
+ TimelineRuler.displayName = "TimelineRuler";
30
+
31
+ //#endregion
32
+ export { TimelineRuler };
33
+ //# sourceMappingURL=TimelineRuler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimelineRuler.js","names":[],"sources":["../../src/gui/TimelineRuler.tsx"],"sourcesContent":["import { EFTimelineRuler } from \"@editframe/elements\";\nimport React from \"react\";\nimport { createComponent } from \"../hooks/create-element\";\n\nexport interface TimelineRulerProps {\n durationMs?: number;\n zoomScale?: number;\n containerWidth?: number;\n fps?: number;\n scrollContainerSelector?: string;\n scrollContainerRef?: React.RefObject<HTMLElement>;\n}\n\nconst BaseTimelineRuler = createComponent<\n EFTimelineRuler,\n {}\n>({\n tagName: \"ef-timeline-ruler\",\n elementClass: EFTimelineRuler,\n react: React,\n displayName: \"TimelineRuler\",\n}) as React.ForwardRefExoticComponent<TimelineRulerProps & React.RefAttributes<EFTimelineRuler>>;\n\nexport const TimelineRuler = React.forwardRef<\n EFTimelineRuler,\n TimelineRulerProps\n>((props, ref) => {\n const { scrollContainerRef, ...restProps } = props;\n const elementRef = React.useRef<EFTimelineRuler | null>(null);\n\n React.useLayoutEffect(() => {\n if (elementRef.current && scrollContainerRef?.current) {\n (elementRef.current as any).scrollContainerElement = scrollContainerRef.current;\n } else if (elementRef.current) {\n (elementRef.current as any).scrollContainerElement = null;\n }\n }, [scrollContainerRef?.current]);\n\n return (\n <BaseTimelineRuler\n {...(restProps as any)}\n ref={(node) => {\n elementRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n />\n );\n});\n\nTimelineRuler.displayName = \"TimelineRuler\";\n"],"mappings":";;;;;;AAaA,MAAM,oBAAoB,gBAGxB;CACA,SAAS;CACT,cAAc;CACd,OAAO;CACP,aAAa;CACd,CAAC;AAEF,MAAa,gBAAgB,MAAM,YAGhC,OAAO,QAAQ;CAChB,MAAM,EAAE,mBAAoB,GAAG,cAAc;CAC7C,MAAM,aAAa,MAAM,OAA+B,KAAK;AAE7D,OAAM,sBAAsB;AAC1B,MAAI,WAAW,WAAW,oBAAoB,QAC5C,CAAC,WAAW,QAAgB,yBAAyB,mBAAmB;WAC/D,WAAW,QACpB,CAAC,WAAW,QAAgB,yBAAyB;IAEtD,CAAC,oBAAoB,QAAQ,CAAC;AAEjC,QACE,oBAAC;EACC,GAAK;EACL,MAAM,SAAS;AACb,cAAW,UAAU;AACrB,OAAI,OAAO,QAAQ,WAAY,KAAI,KAAK;YAC/B,IAAK,KAAI,UAAU;;GAE9B;EAEJ;AAEF,cAAc,cAAc"}
@@ -0,0 +1,25 @@
1
+ import { PanZoomTransform } from "@editframe/elements";
2
+ import React from "react";
3
+
4
+ //#region src/hooks/usePanZoomTransform.d.ts
5
+
6
+ /**
7
+ * Hook to get PanZoom transform values from a PanZoom element ref.
8
+ * Listens to transform-changed events to keep transform values in sync.
9
+ *
10
+ * @param panZoomRef - Ref to the PanZoom element
11
+ * @returns Current transform values (scale, x, y)
12
+ *
13
+ * @example
14
+ * const panZoomRef = useRef<EFPanZoom | null>(null);
15
+ * const transform = usePanZoomTransform(panZoomRef);
16
+ * // transform.scale, transform.x, transform.y
17
+ */
18
+ declare function usePanZoomTransform(panZoomRef: React.RefObject<(EventTarget & {
19
+ scale: number;
20
+ x: number;
21
+ y: number;
22
+ }) | null>): PanZoomTransform;
23
+ //#endregion
24
+ export { usePanZoomTransform };
25
+ //# sourceMappingURL=usePanZoomTransform.d.ts.map
@@ -0,0 +1,49 @@
1
+ import { useEffect, useState } from "react";
2
+
3
+ //#region src/hooks/usePanZoomTransform.ts
4
+ /**
5
+ * Hook to get PanZoom transform values from a PanZoom element ref.
6
+ * Listens to transform-changed events to keep transform values in sync.
7
+ *
8
+ * @param panZoomRef - Ref to the PanZoom element
9
+ * @returns Current transform values (scale, x, y)
10
+ *
11
+ * @example
12
+ * const panZoomRef = useRef<EFPanZoom | null>(null);
13
+ * const transform = usePanZoomTransform(panZoomRef);
14
+ * // transform.scale, transform.x, transform.y
15
+ */
16
+ function usePanZoomTransform(panZoomRef) {
17
+ const [transform, setTransform] = useState({
18
+ scale: 1,
19
+ x: 0,
20
+ y: 0
21
+ });
22
+ useEffect(() => {
23
+ const panZoom = panZoomRef.current;
24
+ if (!panZoom) return;
25
+ setTransform({
26
+ scale: panZoom.scale ?? 1,
27
+ x: panZoom.x ?? 0,
28
+ y: panZoom.y ?? 0
29
+ });
30
+ const handleTransformChanged = (e) => {
31
+ const customEvent = e;
32
+ if (customEvent.detail) setTransform(customEvent.detail);
33
+ else setTransform({
34
+ scale: panZoom.scale ?? 1,
35
+ x: panZoom.x ?? 0,
36
+ y: panZoom.y ?? 0
37
+ });
38
+ };
39
+ panZoom.addEventListener("transform-changed", handleTransformChanged);
40
+ return () => {
41
+ panZoom.removeEventListener("transform-changed", handleTransformChanged);
42
+ };
43
+ }, [panZoomRef]);
44
+ return transform;
45
+ }
46
+
47
+ //#endregion
48
+ export { usePanZoomTransform };
49
+ //# sourceMappingURL=usePanZoomTransform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePanZoomTransform.js","names":[],"sources":["../../src/hooks/usePanZoomTransform.ts"],"sourcesContent":["import { type PanZoomTransform } from \"@editframe/elements\";\nimport React, { useEffect, useState } from \"react\";\n\n/**\n * Hook to get PanZoom transform values from a PanZoom element ref.\n * Listens to transform-changed events to keep transform values in sync.\n *\n * @param panZoomRef - Ref to the PanZoom element\n * @returns Current transform values (scale, x, y)\n *\n * @example\n * const panZoomRef = useRef<EFPanZoom | null>(null);\n * const transform = usePanZoomTransform(panZoomRef);\n * // transform.scale, transform.x, transform.y\n */\nexport function usePanZoomTransform(\n panZoomRef: React.RefObject<(EventTarget & { scale: number; x: number; y: number }) | null>,\n): PanZoomTransform {\n const [transform, setTransform] = useState<PanZoomTransform>({\n scale: 1,\n x: 0,\n y: 0,\n });\n\n useEffect(() => {\n const panZoom = panZoomRef.current;\n if (!panZoom) {\n return;\n }\n\n // Initialize with current values\n setTransform({\n scale: panZoom.scale ?? 1,\n x: panZoom.x ?? 0,\n y: panZoom.y ?? 0,\n });\n\n // Listen for transform changes\n const handleTransformChanged = (e: Event) => {\n const customEvent = e as CustomEvent<PanZoomTransform>;\n if (customEvent.detail) {\n setTransform(customEvent.detail);\n } else {\n // Fallback to reading from element if detail is not available\n setTransform({\n scale: panZoom.scale ?? 1,\n x: panZoom.x ?? 0,\n y: panZoom.y ?? 0,\n });\n }\n };\n\n panZoom.addEventListener(\"transform-changed\", handleTransformChanged);\n\n return () => {\n panZoom.removeEventListener(\"transform-changed\", handleTransformChanged);\n };\n }, [panZoomRef]);\n\n return transform;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAeA,SAAgB,oBACd,YACkB;CAClB,MAAM,CAAC,WAAW,gBAAgB,SAA2B;EAC3D,OAAO;EACP,GAAG;EACH,GAAG;EACJ,CAAC;AAEF,iBAAgB;EACd,MAAM,UAAU,WAAW;AAC3B,MAAI,CAAC,QACH;AAIF,eAAa;GACX,OAAO,QAAQ,SAAS;GACxB,GAAG,QAAQ,KAAK;GAChB,GAAG,QAAQ,KAAK;GACjB,CAAC;EAGF,MAAM,0BAA0B,MAAa;GAC3C,MAAM,cAAc;AACpB,OAAI,YAAY,OACd,cAAa,YAAY,OAAO;OAGhC,cAAa;IACX,OAAO,QAAQ,SAAS;IACxB,GAAG,QAAQ,KAAK;IAChB,GAAG,QAAQ,KAAK;IACjB,CAAC;;AAIN,UAAQ,iBAAiB,qBAAqB,uBAAuB;AAErE,eAAa;AACX,WAAQ,oBAAoB,qBAAqB,uBAAuB;;IAEzE,CAAC,WAAW,CAAC;AAEhB,QAAO"}
package/dist/index.d.ts CHANGED
@@ -6,21 +6,29 @@ import { Image } from "./elements/Image.js";
6
6
  import { Surface } from "./elements/Surface.js";
7
7
  import { ThumbnailStrip } from "./elements/ThumbnailStrip.js";
8
8
  import { Timegroup } from "./elements/Timegroup.js";
9
+ import { TimelineRoot } from "./components/TimelineRoot.js";
9
10
  import { Video } from "./elements/Video.js";
10
11
  import { Waveform } from "./elements/Waveform.js";
12
+ import { PanZoom } from "./elements/PanZoom.js";
13
+ import { OverlayLayer } from "./gui/OverlayLayer.js";
14
+ import { OverlayItem, OverlayItemProps } from "./gui/OverlayItem.js";
11
15
  import { Configuration } from "./gui/Configuration.js";
12
16
  import { Controls } from "./gui/Controls.js";
13
17
  import { Dial } from "./gui/EFDial.js";
14
18
  import { ResizableBox } from "./gui/EFResizableBox.js";
19
+ import { TransformHandles } from "./gui/EFTransformHandles.js";
15
20
  import { Filmstrip } from "./gui/Filmstrip.js";
16
21
  import { FitScale } from "./gui/FitScale.js";
17
22
  import { FocusOverlay } from "./gui/FocusOverlay.js";
18
23
  import { Pause } from "./gui/Pause.js";
19
24
  import { Play } from "./gui/Play.js";
20
25
  import { Preview } from "./gui/Preview.js";
21
- import { Scrubber } from "./gui/Scrubber.js";
26
+ import { Scrubber, ScrubberProps } from "./gui/Scrubber.js";
27
+ import { TimelineRuler } from "./gui/TimelineRuler.js";
22
28
  import { ToggleLoop } from "./gui/ToggleLoop.js";
23
29
  import { TogglePlay } from "./gui/TogglePlay.js";
24
30
  import { Workbench } from "./gui/Workbench.js";
25
31
  import { useTimingInfo } from "./hooks/useTimingInfo.js";
26
- export { Audio, Captions, CaptionsActiveWord, CaptionsAfterActiveWord, CaptionsBeforeActiveWord, CaptionsSegment, Configuration, Controls, Dial, Filmstrip, FitScale, FocusOverlay, Image, Pause, Play, Preview, ResizableBox, Scrubber, Surface, Text, TextSegment, ThumbnailStrip, TimeDisplay, Timegroup, ToggleLoop, TogglePlay, Video, Waveform, Workbench, useTimingInfo };
32
+ import { usePanZoomTransform } from "./hooks/usePanZoomTransform.js";
33
+ import { elementNeedsFitScale, needsFitScale } from "@editframe/elements";
34
+ export { Audio, Captions, CaptionsActiveWord, CaptionsAfterActiveWord, CaptionsBeforeActiveWord, CaptionsSegment, Configuration, Controls, Dial, Filmstrip, FitScale, FocusOverlay, Image, OverlayItem, type OverlayItemProps, OverlayLayer, PanZoom, Pause, Play, Preview, ResizableBox, Scrubber, type ScrubberProps, Surface, Text, TextSegment, ThumbnailStrip, TimeDisplay, Timegroup, TimelineRoot, TimelineRuler, ToggleLoop, TogglePlay, TransformHandles, Video, Waveform, Workbench, elementNeedsFitScale, needsFitScale, usePanZoomTransform, useTimingInfo };
package/dist/index.js CHANGED
@@ -6,12 +6,17 @@ import { Image } from "./elements/Image.js";
6
6
  import { Surface } from "./elements/Surface.js";
7
7
  import { ThumbnailStrip } from "./elements/ThumbnailStrip.js";
8
8
  import { Timegroup } from "./elements/Timegroup.js";
9
+ import { TimelineRoot } from "./components/TimelineRoot.js";
9
10
  import { Video } from "./elements/Video.js";
10
11
  import { Waveform } from "./elements/Waveform.js";
12
+ import { PanZoom } from "./elements/PanZoom.js";
13
+ import { OverlayLayer } from "./gui/OverlayLayer.js";
14
+ import { OverlayItem } from "./gui/OverlayItem.js";
11
15
  import { Configuration } from "./gui/Configuration.js";
12
16
  import { Controls } from "./gui/Controls.js";
13
17
  import { Dial } from "./gui/EFDial.js";
14
18
  import { ResizableBox } from "./gui/EFResizableBox.js";
19
+ import { TransformHandles } from "./gui/EFTransformHandles.js";
15
20
  import { Filmstrip } from "./gui/Filmstrip.js";
16
21
  import { FitScale } from "./gui/FitScale.js";
17
22
  import { FocusOverlay } from "./gui/FocusOverlay.js";
@@ -19,9 +24,12 @@ import { Pause } from "./gui/Pause.js";
19
24
  import { Play } from "./gui/Play.js";
20
25
  import { Preview } from "./gui/Preview.js";
21
26
  import { Scrubber } from "./gui/Scrubber.js";
27
+ import { TimelineRuler } from "./gui/TimelineRuler.js";
22
28
  import { ToggleLoop } from "./gui/ToggleLoop.js";
23
29
  import { TogglePlay } from "./gui/TogglePlay.js";
24
30
  import { Workbench } from "./gui/Workbench.js";
25
31
  import { useTimingInfo } from "./hooks/useTimingInfo.js";
32
+ import { usePanZoomTransform } from "./hooks/usePanZoomTransform.js";
33
+ import { elementNeedsFitScale, needsFitScale } from "@editframe/elements";
26
34
 
27
- export { Audio, Captions, CaptionsActiveWord, CaptionsAfterActiveWord, CaptionsBeforeActiveWord, CaptionsSegment, Configuration, Controls, Dial, Filmstrip, FitScale, FocusOverlay, Image, Pause, Play, Preview, ResizableBox, Scrubber, Surface, Text, TextSegment, ThumbnailStrip, TimeDisplay, Timegroup, ToggleLoop, TogglePlay, Video, Waveform, Workbench, useTimingInfo };
35
+ export { Audio, Captions, CaptionsActiveWord, CaptionsAfterActiveWord, CaptionsBeforeActiveWord, CaptionsSegment, Configuration, Controls, Dial, Filmstrip, FitScale, FocusOverlay, Image, OverlayItem, OverlayLayer, PanZoom, Pause, Play, Preview, ResizableBox, Scrubber, Surface, Text, TextSegment, ThumbnailStrip, TimeDisplay, Timegroup, TimelineRoot, TimelineRuler, ToggleLoop, TogglePlay, TransformHandles, Video, Waveform, Workbench, elementNeedsFitScale, needsFitScale, usePanZoomTransform, useTimingInfo };