vue-datocms 8.1.4 → 8.1.5-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.
package/dist/index.d.ts CHANGED
@@ -1,14 +1,303 @@
1
1
  import * as vue from 'vue';
2
- import { PropType, h, VNode, Ref, UnwrapRef, CSSProperties } from 'vue';
2
+ import { Ref, PropType, h, VNode, UnwrapRef, CSSProperties } from 'vue';
3
+ import { Controller } from '@datocms/content-link';
4
+ export { Controller, decodeStega, stripStega } from '@datocms/content-link';
3
5
  import { TransformedMeta, RenderMarkRule, TransformMetaFn } from 'datocms-structured-text-generic-html-renderer';
4
6
  export { renderMarkRule, renderNodeRule, renderNodeRule as renderRule } from 'datocms-structured-text-generic-html-renderer';
5
- import { Record as Record$1, RenderResult, StructuredText as StructuredText$1, CdaStructuredTextRecord, Document, Node, RenderRule } from 'datocms-structured-text-utils';
7
+ import { Record as Record$1, RenderResult, StructuredText as StructuredText$1, Document, Node, RenderRule } from 'datocms-structured-text-utils';
6
8
  export { CdaStructuredTextRecord, CdaStructuredTextValue, RenderError, Document as StructuredTextDocument, StructuredText as StructuredTextGraphQlResponse, Record as StructuredTextGraphQlResponseRecord, TypesafeCdaStructuredTextValue } from 'datocms-structured-text-utils';
7
9
  import * as hls_js from 'hls.js';
8
- import { StreamTypes, MaxResolutionValue, MinResolutionValue, CmcdTypes, PlaybackTypes } from '@mux/playback-core/.';
10
+ import { StreamTypes, MaxResolutionValue, MinResolutionValue, CmcdTypes, PlaybackTypes, RenditionOrderValue } from '@mux/playback-core/.';
9
11
  import MuxPlayerElement, { Tokens } from '@mux/mux-player';
10
12
  import { Options, ConnectionStatus } from 'datocms-listen';
11
13
 
14
+ type UseContentLinkOptions = {
15
+ /**
16
+ * Whether the controller is enabled, or an options object.
17
+ * - Pass `true` (default): Enables the controller with stega encoding preserved (allows controller recreation)
18
+ * - Pass `false`: Disables the controller completely
19
+ * - Pass `{ stripStega: true }`: Enables the controller and strips stega encoding after stamping
20
+ *
21
+ * When stripStega is false (default): Stega encoding remains in the DOM, allowing controllers
22
+ * to be disposed and recreated on the same page. The invisible characters don't affect display
23
+ * but preserve the source of truth.
24
+ *
25
+ * When stripStega is true: Stega encoding is permanently removed from text nodes, providing
26
+ * clean textContent for programmatic access. However, recreating a controller on the same page
27
+ * won't detect elements since the encoding is lost.
28
+ */
29
+ enabled?: boolean | {
30
+ stripStega: boolean;
31
+ };
32
+ /** Callback when Web Previews plugin requests navigation */
33
+ onNavigateTo?: (path: string) => void;
34
+ /** Root element to limit scanning to (instead of document) */
35
+ root?: Ref<ParentNode | null | undefined>;
36
+ };
37
+ type UseContentLinkResult = {
38
+ /** The controller instance, or null if disabled */
39
+ controller: Ref<Controller | null>;
40
+ /** Enable click-to-edit overlays */
41
+ enableClickToEdit: (options?: {
42
+ scrollToNearestTarget: boolean;
43
+ }) => void;
44
+ /** Disable click-to-edit overlays */
45
+ disableClickToEdit: () => void;
46
+ /** Check if click-to-edit is enabled */
47
+ isClickToEditEnabled: () => boolean;
48
+ /** Highlight all editable elements */
49
+ flashAll: (scrollToNearestTarget?: boolean) => void;
50
+ /** Notify Web Previews plugin of current path */
51
+ setCurrentPath: (path: string) => void;
52
+ };
53
+ /**
54
+ * Composable for managing DatoCMS Content Link controller for Visual Editing.
55
+ *
56
+ * This composable provides low-level control over the @datocms/content-link controller,
57
+ * enabling click-to-edit overlays and integration with the DatoCMS Web Previews plugin.
58
+ *
59
+ * For most use cases, consider using the `<ContentLink />` component instead, which
60
+ * provides a simpler declarative API.
61
+ *
62
+ * @param options - Configuration options for the content link controller
63
+ * @returns Controller instance and methods for managing visual editing
64
+ *
65
+ * @example
66
+ * ```vue
67
+ * <script setup>
68
+ * import { useContentLink } from 'vue-datocms';
69
+ * import { useRouter, useRoute } from 'vue-router';
70
+ *
71
+ * const router = useRouter();
72
+ * const route = useRoute();
73
+ *
74
+ * const { controller, enableClickToEdit, setCurrentPath } = useContentLink({
75
+ * onNavigateTo: (path) => router.push(path),
76
+ * });
77
+ *
78
+ * // Enable click-to-edit on mount
79
+ * onMounted(() => {
80
+ * enableClickToEdit({ scrollToNearestTarget: true });
81
+ * });
82
+ *
83
+ * // Sync current path with Web Previews plugin
84
+ * watch(() => route.path, (newPath) => {
85
+ * setCurrentPath(newPath);
86
+ * });
87
+ * </script>
88
+ * ```
89
+ *
90
+ * @see https://www.npmjs.com/package/@datocms/content-link
91
+ */
92
+ declare function useContentLink(options?: UseContentLinkOptions): UseContentLinkResult;
93
+
94
+ type ContentLinkProps = Omit<UseContentLinkOptions, 'enabled'> & {
95
+ /** Current pathname to sync with Web Previews plugin */
96
+ currentPath?: string;
97
+ /** Enable click-to-edit on mount. Pass true for default behavior or an object with scrollToNearestTarget. If undefined, click-to-edit is disabled. */
98
+ enableClickToEdit?: true | {
99
+ scrollToNearestTarget: true;
100
+ };
101
+ /** Whether to strip stega encoding from text nodes after stamping. */
102
+ stripStega?: boolean;
103
+ };
104
+ /**
105
+ * ContentLink component enables Visual Editing for DatoCMS content.
106
+ *
107
+ * This component provides two powerful editing experiences:
108
+ *
109
+ * 1. **Standalone website editing**: When viewing your draft content on the website,
110
+ * editors can click on any content element to open the DatoCMS editor and modify
111
+ * that specific field. This works by detecting stega-encoded metadata in the content
112
+ * and creating interactive overlays.
113
+ *
114
+ * 2. **Web Previews plugin integration**: When your preview runs inside the Visual Editing
115
+ * mode of the DatoCMS Web Previews plugin, this component automatically establishes
116
+ * bidirectional communication with the plugin. This enables:
117
+ * - Clicking content to instantly open the correct field in the side panel
118
+ * - In-plugin navigation: users can navigate to different URLs within Visual mode
119
+ * (like a browser navigation bar), and the preview updates accordingly
120
+ * - Synchronized state between the preview and the DatoCMS interface
121
+ *
122
+ * The component handles client-side routing by:
123
+ * - Listening to navigation requests from the Web Previews plugin via `onNavigateTo`
124
+ * - Notifying the plugin when the URL changes via `currentPath` prop
125
+ *
126
+ * This integration is completely automatic when running inside the plugin's iframe,
127
+ * with graceful fallback to opening edit URLs in a new tab when running standalone.
128
+ *
129
+ * **Click-to-edit behavior**:
130
+ * - By default, editors can press and hold Alt/Option key to temporarily enable click-to-edit mode
131
+ * - Set `enableClickToEdit` prop to `true` to enable it programmatically on mount
132
+ * - Release the Alt/Option key to disable it again
133
+ *
134
+ * @example
135
+ * Basic usage (no routing):
136
+ * ```vue
137
+ * <script setup>
138
+ * import { ContentLink } from 'vue-datocms';
139
+ * </script>
140
+ *
141
+ * <template>
142
+ * <ContentLink />
143
+ * <!-- Your content here -->
144
+ * </template>
145
+ * ```
146
+ *
147
+ * @example
148
+ * With Vue Router:
149
+ * ```vue
150
+ * <script setup>
151
+ * import { ContentLink } from 'vue-datocms';
152
+ * import { useRouter, useRoute } from 'vue-router';
153
+ *
154
+ * const router = useRouter();
155
+ * const route = useRoute();
156
+ * </script>
157
+ *
158
+ * <template>
159
+ * <ContentLink
160
+ * :on-navigate-to="(path) => router.push(path)"
161
+ * :current-path="route.path"
162
+ * />
163
+ * </template>
164
+ * ```
165
+ *
166
+ * @example
167
+ * With Nuxt:
168
+ * ```vue
169
+ * <script setup>
170
+ * import { ContentLink } from 'vue-datocms';
171
+ * const router = useRouter();
172
+ * const route = useRoute();
173
+ * </script>
174
+ *
175
+ * <template>
176
+ * <ContentLink
177
+ * :on-navigate-to="(path) => router.push(path)"
178
+ * :current-path="route.path"
179
+ * />
180
+ * </template>
181
+ * ```
182
+ *
183
+ * @example
184
+ * Enable click-to-edit programmatically:
185
+ * ```vue
186
+ * <template>
187
+ * <ContentLink :enable-click-to-edit="true" />
188
+ * </template>
189
+ * ```
190
+ *
191
+ * @see https://www.npmjs.com/package/@datocms/content-link
192
+ * @see https://www.datocms.com/marketplace/plugins/i/datocms-plugin-web-previews
193
+ */
194
+ declare const ContentLink: vue.DefineComponent<{
195
+ /**
196
+ * Callback when Web Previews plugin requests navigation.
197
+ * Use this to integrate with your router.
198
+ *
199
+ * @example
200
+ * With Vue Router: `(path) => router.push(path)`
201
+ * With Nuxt: `(path) => navigateTo(path)`
202
+ */
203
+ onNavigateTo: {
204
+ type: PropType<(path: string) => void>;
205
+ required: false;
206
+ };
207
+ /**
208
+ * Root element to limit scanning to (instead of document).
209
+ * Pass a ref to a parent element to limit the scope of content link scanning.
210
+ */
211
+ root: {
212
+ type: PropType<UseContentLinkOptions["root"]>;
213
+ required: false;
214
+ };
215
+ /**
216
+ * Current pathname to sync with Web Previews plugin.
217
+ * This keeps the plugin in sync with the current page being previewed.
218
+ *
219
+ * @example
220
+ * With Vue Router: `route.path`
221
+ * With Nuxt: `route.path`
222
+ */
223
+ currentPath: {
224
+ type: StringConstructor;
225
+ required: false;
226
+ };
227
+ /**
228
+ * Enable click-to-edit on mount. Pass true for default behavior or an object with scrollToNearestTarget.
229
+ * If undefined, click-to-edit is disabled and editors can use Alt/Option key for temporary activation.
230
+ */
231
+ enableClickToEdit: {
232
+ type: PropType<true | {
233
+ scrollToNearestTarget: true;
234
+ }>;
235
+ required: false;
236
+ };
237
+ /**
238
+ * Whether to strip stega encoding from text nodes after stamping.
239
+ */
240
+ stripStega: {
241
+ type: BooleanConstructor;
242
+ required: false;
243
+ };
244
+ }, () => null, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps, Readonly<vue.ExtractPropTypes<{
245
+ /**
246
+ * Callback when Web Previews plugin requests navigation.
247
+ * Use this to integrate with your router.
248
+ *
249
+ * @example
250
+ * With Vue Router: `(path) => router.push(path)`
251
+ * With Nuxt: `(path) => navigateTo(path)`
252
+ */
253
+ onNavigateTo: {
254
+ type: PropType<(path: string) => void>;
255
+ required: false;
256
+ };
257
+ /**
258
+ * Root element to limit scanning to (instead of document).
259
+ * Pass a ref to a parent element to limit the scope of content link scanning.
260
+ */
261
+ root: {
262
+ type: PropType<UseContentLinkOptions["root"]>;
263
+ required: false;
264
+ };
265
+ /**
266
+ * Current pathname to sync with Web Previews plugin.
267
+ * This keeps the plugin in sync with the current page being previewed.
268
+ *
269
+ * @example
270
+ * With Vue Router: `route.path`
271
+ * With Nuxt: `route.path`
272
+ */
273
+ currentPath: {
274
+ type: StringConstructor;
275
+ required: false;
276
+ };
277
+ /**
278
+ * Enable click-to-edit on mount. Pass true for default behavior or an object with scrollToNearestTarget.
279
+ * If undefined, click-to-edit is disabled and editors can use Alt/Option key for temporary activation.
280
+ */
281
+ enableClickToEdit: {
282
+ type: PropType<true | {
283
+ scrollToNearestTarget: true;
284
+ }>;
285
+ required: false;
286
+ };
287
+ /**
288
+ * Whether to strip stega encoding from text nodes after stamping.
289
+ */
290
+ stripStega: {
291
+ type: BooleanConstructor;
292
+ required: false;
293
+ };
294
+ }>>, {
295
+ stripStega: boolean;
296
+ }, {}>;
297
+ declare const DatocmsContentLinkPlugin: {
298
+ install: (Vue: any) => void;
299
+ };
300
+
12
301
  type Maybe$2<T> = T | null;
13
302
  type ResponsiveImageType = {
14
303
  /** A base64-encoded thumbnail to offer during image loading */
@@ -471,19 +760,19 @@ type RenderBlockContext<R extends Record$1 = Record$1> = {
471
760
  declare const StructuredText: vue.DefineComponent<{
472
761
  /** The actual field value you get from DatoCMS **/
473
762
  data: {
474
- type: PropType<StructuredText$1<CdaStructuredTextRecord, CdaStructuredTextRecord, CdaStructuredTextRecord> | Document<string, string> | Node<string, string> | null | undefined>;
763
+ type: PropType<StructuredText$1 | Document | Node | null | undefined>;
475
764
  };
476
765
  /** @deprecated use customNodeRules **/
477
766
  customRules: {
478
- type: PropType<RenderRule<typeof h, (text: string, _key: string) => AdapterReturn, (children: AdapterReturn[], _key: string) => AdapterReturn>[]>;
767
+ type: PropType<RenderRule<H, T, F>[]>;
479
768
  };
480
769
  /** A set of additional rules to convert the document to JSX **/
481
770
  customNodeRules: {
482
- type: PropType<RenderRule<typeof h, (text: string, _key: string) => AdapterReturn, (children: AdapterReturn[], _key: string) => AdapterReturn>[]>;
771
+ type: PropType<RenderRule<H, T, F>[]>;
483
772
  };
484
773
  /** A set of additional rules to convert the document to JSX **/
485
774
  customMarkRules: {
486
- type: PropType<RenderMarkRule<typeof h, (text: string, _key: string) => AdapterReturn, (children: AdapterReturn[], _key: string) => AdapterReturn>[]>;
775
+ type: PropType<RenderMarkRule<H, T, F>[]>;
487
776
  };
488
777
  /** Fuction that converts an 'inlineItem' node into a Vue component **/
489
778
  renderInlineRecord: {
@@ -507,32 +796,32 @@ declare const StructuredText: vue.DefineComponent<{
507
796
  };
508
797
  /** Fuction that converts a simple string text into a Vue component **/
509
798
  renderText: {
510
- type: PropType<(text: string, _key: string) => AdapterReturn>;
799
+ type: PropType<T>;
511
800
  };
512
801
  /** React.createElement-like function to use to convert a node into a Vue component **/
513
802
  renderNode: {
514
- type: PropType<typeof h>;
803
+ type: PropType<H>;
515
804
  };
516
805
  /** Function to use to generate a Vue.Fragment **/
517
806
  renderFragment: {
518
- type: PropType<(children: AdapterReturn[], _key: string) => AdapterReturn>;
807
+ type: PropType<F>;
519
808
  };
520
809
  }, () => RenderResult<typeof h, (text: string, _key: string) => AdapterReturn, (children: AdapterReturn[], _key: string) => AdapterReturn>, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps, Readonly<vue.ExtractPropTypes<{
521
810
  /** The actual field value you get from DatoCMS **/
522
811
  data: {
523
- type: PropType<StructuredText$1<CdaStructuredTextRecord, CdaStructuredTextRecord, CdaStructuredTextRecord> | Document<string, string> | Node<string, string> | null | undefined>;
812
+ type: PropType<StructuredText$1 | Document | Node | null | undefined>;
524
813
  };
525
814
  /** @deprecated use customNodeRules **/
526
815
  customRules: {
527
- type: PropType<RenderRule<typeof h, (text: string, _key: string) => AdapterReturn, (children: AdapterReturn[], _key: string) => AdapterReturn>[]>;
816
+ type: PropType<RenderRule<H, T, F>[]>;
528
817
  };
529
818
  /** A set of additional rules to convert the document to JSX **/
530
819
  customNodeRules: {
531
- type: PropType<RenderRule<typeof h, (text: string, _key: string) => AdapterReturn, (children: AdapterReturn[], _key: string) => AdapterReturn>[]>;
820
+ type: PropType<RenderRule<H, T, F>[]>;
532
821
  };
533
822
  /** A set of additional rules to convert the document to JSX **/
534
823
  customMarkRules: {
535
- type: PropType<RenderMarkRule<typeof h, (text: string, _key: string) => AdapterReturn, (children: AdapterReturn[], _key: string) => AdapterReturn>[]>;
824
+ type: PropType<RenderMarkRule<H, T, F>[]>;
536
825
  };
537
826
  /** Fuction that converts an 'inlineItem' node into a Vue component **/
538
827
  renderInlineRecord: {
@@ -556,15 +845,15 @@ declare const StructuredText: vue.DefineComponent<{
556
845
  };
557
846
  /** Fuction that converts a simple string text into a Vue component **/
558
847
  renderText: {
559
- type: PropType<(text: string, _key: string) => AdapterReturn>;
848
+ type: PropType<T>;
560
849
  };
561
850
  /** React.createElement-like function to use to convert a node into a Vue component **/
562
851
  renderNode: {
563
- type: PropType<typeof h>;
852
+ type: PropType<H>;
564
853
  };
565
854
  /** Function to use to generate a Vue.Fragment **/
566
855
  renderFragment: {
567
- type: PropType<(children: AdapterReturn[], _key: string) => AdapterReturn>;
856
+ type: PropType<F>;
568
857
  };
569
858
  }>>, {}, {}>;
570
859
  declare const DatocmsStructuredTextPlugin: {
@@ -597,7 +886,7 @@ declare const toNativeAttrName: (propName: string, propValue: any) => string | u
597
886
  declare const toNativeAttrValue: (propValue: any, propName: string) => any;
598
887
  declare const VideoPlayer: vue.DefineComponent<{
599
888
  _hlsConfig: {
600
- type: PropType<Readonly<Partial<hls_js.HlsConfig>> | undefined>;
889
+ type: PropType<MuxPlayerElement["_hlsConfig"]>;
601
890
  required: false;
602
891
  };
603
892
  accentColor: {
@@ -609,7 +898,7 @@ declare const VideoPlayer: vue.DefineComponent<{
609
898
  required: false;
610
899
  };
611
900
  autoPlay: {
612
- type: PropType<string | boolean>;
901
+ type: PropType<boolean | string>;
613
902
  required: false;
614
903
  };
615
904
  backwardSeekOffset: {
@@ -780,7 +1069,7 @@ declare const VideoPlayer: vue.DefineComponent<{
780
1069
  required: false;
781
1070
  };
782
1071
  renditionOrder: {
783
- type: PropType<"desc">;
1072
+ type: PropType<RenditionOrderValue>;
784
1073
  required: false;
785
1074
  };
786
1075
  secondaryColor: {
@@ -837,10 +1126,10 @@ declare const VideoPlayer: vue.DefineComponent<{
837
1126
  disableCookies: boolean;
838
1127
  disableTracking: boolean;
839
1128
  preload: string;
840
- style?: (vue.CSSProperties | null) | undefined;
841
- title?: (string | null) | undefined;
842
- playbackId?: (string | null) | undefined;
843
- placeholder?: (string | null) | undefined;
1129
+ style?: vue.CSSProperties | null;
1130
+ title?: string | null;
1131
+ playbackId?: string | null;
1132
+ placeholder?: string | null;
844
1133
  };
845
1134
  otherProps: {
846
1135
  disablePictureInPicture: boolean;
@@ -925,7 +1214,7 @@ declare const VideoPlayer: vue.DefineComponent<{
925
1214
  };
926
1215
  }, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, ("error" | "seeking" | "ended" | "pause" | "play" | "abort" | "canPlay" | "canPlayThrough" | "emptied" | "loadStart" | "loadedData" | "loadedMetadata" | "progress" | "durationChange" | "volumeChange" | "rateChange" | "resize" | "waiting" | "playing" | "timeUpdate" | "seeked" | "stalled" | "suspend" | "cuePointChange" | "cuePointsChange")[], "error" | "seeking" | "ended" | "pause" | "play" | "abort" | "canPlay" | "canPlayThrough" | "emptied" | "loadStart" | "loadedData" | "loadedMetadata" | "progress" | "durationChange" | "volumeChange" | "rateChange" | "resize" | "waiting" | "playing" | "timeUpdate" | "seeked" | "stalled" | "suspend" | "cuePointChange" | "cuePointsChange", vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps, Readonly<vue.ExtractPropTypes<{
927
1216
  _hlsConfig: {
928
- type: PropType<Readonly<Partial<hls_js.HlsConfig>> | undefined>;
1217
+ type: PropType<MuxPlayerElement["_hlsConfig"]>;
929
1218
  required: false;
930
1219
  };
931
1220
  accentColor: {
@@ -937,7 +1226,7 @@ declare const VideoPlayer: vue.DefineComponent<{
937
1226
  required: false;
938
1227
  };
939
1228
  autoPlay: {
940
- type: PropType<string | boolean>;
1229
+ type: PropType<boolean | string>;
941
1230
  required: false;
942
1231
  };
943
1232
  backwardSeekOffset: {
@@ -1108,7 +1397,7 @@ declare const VideoPlayer: vue.DefineComponent<{
1108
1397
  required: false;
1109
1398
  };
1110
1399
  renditionOrder: {
1111
- type: PropType<"desc">;
1400
+ type: PropType<RenditionOrderValue>;
1112
1401
  required: false;
1113
1402
  };
1114
1403
  secondaryColor: {
@@ -1350,4 +1639,4 @@ declare const toHead: (...args: ToMetaTagsType[]) => {
1350
1639
  }[];
1351
1640
  };
1352
1641
 
1353
- export { DatocmsImagePlugin, DatocmsNakedImagePlugin, DatocmsStructuredTextPlugin, DatocmsVideoPlayerPlugin, DisabledQueryListenerOptions, EnabledQueryListenerOptions, GenericClient, Image, NakedImage, QueryListenerOptions, RawSearchResult, RenderBlockContext, RenderInlineRecordContext, RenderRecordLinkContext, ResponsiveImageType, SeoMetaTagType, StructuredText, SubscribeToQueryOptions, ToMetaTagsType, UseSiteSearchConfig, UseSiteSearchData, UseSiteSearchResult, Video, VideoPlayer, appendKeyToValidElement, defaultAdapter, isKeyOf, isNil, toHead, toNativeAttrName, toNativeAttrValue, useQuerySubscription, useSiteSearch, useVideoPlayer };
1642
+ export { ContentLink, ContentLinkProps, DatocmsContentLinkPlugin, DatocmsImagePlugin, DatocmsNakedImagePlugin, DatocmsStructuredTextPlugin, DatocmsVideoPlayerPlugin, DisabledQueryListenerOptions, EnabledQueryListenerOptions, GenericClient, Image, NakedImage, QueryListenerOptions, RawSearchResult, RenderBlockContext, RenderInlineRecordContext, RenderRecordLinkContext, ResponsiveImageType, SeoMetaTagType, StructuredText, SubscribeToQueryOptions, ToMetaTagsType, UseContentLinkOptions, UseContentLinkResult, UseSiteSearchConfig, UseSiteSearchData, UseSiteSearchResult, Video, VideoPlayer, appendKeyToValidElement, defaultAdapter, isKeyOf, isNil, toHead, toNativeAttrName, toNativeAttrValue, useContentLink, useQuerySubscription, useSiteSearch, useVideoPlayer };