@b10cks/vue 0.10.4 → 1.0.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/README.md +17 -43
- package/dist/api.d.ts +39 -0
- package/dist/components/B10cksFallback.vue.d.ts +6 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +208 -120
- package/dist/index.mjs.map +1 -1
- package/dist/preview-bridge.d.ts +2 -36
- package/dist/types.d.ts +17 -2
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @b10cks/vue
|
|
2
2
|
|
|
3
|
-
Vue 3 SDK for integrating b10cks into
|
|
3
|
+
Vue 3 SDK for integrating b10cks into Vue applications.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -15,68 +15,42 @@ npm install @b10cks/vue @b10cks/client
|
|
|
15
15
|
```typescript
|
|
16
16
|
import { createApp } from 'vue'
|
|
17
17
|
import { B10cksVue } from '@b10cks/vue'
|
|
18
|
-
import
|
|
18
|
+
import App from './App.vue'
|
|
19
19
|
|
|
20
20
|
const app = createApp(App)
|
|
21
21
|
|
|
22
22
|
app.use(B10cksVue, {
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
apiClientOptions: {
|
|
24
|
+
token: 'your-access-token',
|
|
25
|
+
baseUrl: 'https://api.b10cks.com/api',
|
|
26
|
+
},
|
|
25
27
|
})
|
|
26
28
|
|
|
27
29
|
app.mount('#app')
|
|
28
30
|
```
|
|
29
31
|
|
|
30
|
-
###
|
|
32
|
+
### Data Composables
|
|
31
33
|
|
|
32
|
-
|
|
34
|
+
```typescript
|
|
35
|
+
import { useB10cksApi } from '@b10cks/vue'
|
|
33
36
|
|
|
34
|
-
|
|
37
|
+
const { useContent, useBlocks } = useB10cksApi()
|
|
35
38
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
Content here
|
|
39
|
-
</div>
|
|
39
|
+
const content = useContent('home', {}, { immediate: true })
|
|
40
|
+
const blocks = useBlocks({}, { immediate: true })
|
|
40
41
|
```
|
|
41
42
|
|
|
42
|
-
|
|
43
|
+
### Directives
|
|
43
44
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
```vue
|
|
47
|
-
<div v-editable="block">
|
|
48
|
-
<h1 v-editable-field="{ id: block.id, field: 'title' }">Title</h1>
|
|
49
|
-
<p v-editable-field="{ id: block.id, field: 'description' }">Description</p>
|
|
50
|
-
</div>
|
|
51
|
-
```
|
|
45
|
+
- `v-editable` marks a block as selectable inside the b10cks preview editor.
|
|
46
|
+
- `v-editable-field` marks a field as inline-editable in preview mode.
|
|
52
47
|
|
|
53
48
|
### Components
|
|
54
49
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
Render b10cks components directly in your Vue app.
|
|
50
|
+
Use `B10cksComponent` to render block-specific Vue components dynamically:
|
|
58
51
|
|
|
59
52
|
```vue
|
|
60
|
-
<B10cksComponent :
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
## API Client
|
|
64
|
-
|
|
65
|
-
Access the underlying API client for direct API calls:
|
|
66
|
-
|
|
67
|
-
```typescript
|
|
68
|
-
import { ApiClient } from '@b10cks/client'
|
|
69
|
-
|
|
70
|
-
const client = new ApiClient(
|
|
71
|
-
{
|
|
72
|
-
baseUrl: 'https://api.b10cks.com/api',
|
|
73
|
-
token: 'your-token',
|
|
74
|
-
fetchClient: fetch,
|
|
75
|
-
},
|
|
76
|
-
new URL(window.location.href)
|
|
77
|
-
)
|
|
78
|
-
|
|
79
|
-
const blocks = await client.get('blocks')
|
|
53
|
+
<B10cksComponent :block="block" v-editable="block" />
|
|
80
54
|
```
|
|
81
55
|
|
|
82
56
|
## License
|
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { B10cksDataApi, Endpoint, GetConfigOptions, IBBaseQueryParams, IBBlock, IBContent, IBContentQueryParams, IBDataEntry, IBDataSource, RedirectMap, IBSpace } from '../../client/src';
|
|
2
|
+
type QueryParams = Omit<IBBaseQueryParams, 'token'>;
|
|
3
|
+
export interface UseB10cksApiOptions<T, P extends QueryParams = QueryParams> {
|
|
4
|
+
immediate?: boolean;
|
|
5
|
+
params?: P;
|
|
6
|
+
transform?: (value: T) => T;
|
|
7
|
+
}
|
|
8
|
+
export interface AsyncState<T> {
|
|
9
|
+
data: import('vue').Ref<T | null>;
|
|
10
|
+
pending: import('vue').Ref<boolean>;
|
|
11
|
+
error: import('vue').Ref<Error | null>;
|
|
12
|
+
execute: () => Promise<T>;
|
|
13
|
+
refresh: () => Promise<T>;
|
|
14
|
+
}
|
|
15
|
+
export interface UseB10cksConfigResult<T> extends AsyncState<T> {
|
|
16
|
+
config: import('vue').ComputedRef<T>;
|
|
17
|
+
}
|
|
18
|
+
export declare function useB10cksDataApi(): B10cksDataApi;
|
|
19
|
+
export declare function useB10cksClient(): import('../../client/src').ApiClient | null;
|
|
20
|
+
export declare function useB10cksApi(): {
|
|
21
|
+
useApiResource: <T>(endpoint: Endpoint, options?: UseB10cksApiOptions<T>) => AsyncState<T>;
|
|
22
|
+
useApiCollection: <T>(endpoint: Endpoint, options?: UseB10cksApiOptions<T[], QueryParams>) => AsyncState<T[]>;
|
|
23
|
+
useContent: <T = Record<string, unknown>>(fullSlug: string, params?: Omit<IBContentQueryParams, "token" | "full_slug">, options?: Omit<UseB10cksApiOptions<IBContent<T>>, "params">) => AsyncState<IBContent<T>>;
|
|
24
|
+
useContents: <T = Record<string, unknown>>(params?: Omit<IBContentQueryParams, "token">, options?: Omit<UseB10cksApiOptions<IBContent<T>[]>, "params">) => AsyncState<IBContent<T>[]>;
|
|
25
|
+
useBlocks: (params?: QueryParams, options?: Omit<UseB10cksApiOptions<IBBlock[]>, "params">) => AsyncState<IBBlock[]>;
|
|
26
|
+
useDataEntries: (source: string, params?: QueryParams, options?: Omit<UseB10cksApiOptions<IBDataEntry[]>, "params">) => AsyncState<IBDataEntry[]>;
|
|
27
|
+
useDataSources: (options?: UseB10cksApiOptions<IBDataSource[]>) => AsyncState<IBDataSource[]>;
|
|
28
|
+
useSpace: (options?: UseB10cksApiOptions<IBSpace>) => AsyncState<IBSpace>;
|
|
29
|
+
useRedirects: (options?: UseB10cksApiOptions<RedirectMap> & {
|
|
30
|
+
forceRefresh?: boolean;
|
|
31
|
+
}) => AsyncState<RedirectMap>;
|
|
32
|
+
useB10cksConfig: <T = Record<string, unknown>>(options?: GetConfigOptions, executionOptions?: {
|
|
33
|
+
immediate?: boolean;
|
|
34
|
+
}) => UseB10cksConfigResult<T>;
|
|
35
|
+
syncRevision: (fallbackRv?: number) => Promise<string | number>;
|
|
36
|
+
dataApi: B10cksDataApi;
|
|
37
|
+
client: import('../../client/src').ApiClient | null;
|
|
38
|
+
};
|
|
39
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { IBContent } from '../../../client/src';
|
|
2
|
+
export interface IB10cksFallbackProps {
|
|
3
|
+
block: IBContent<string> & Record<string, never>;
|
|
4
|
+
}
|
|
5
|
+
declare const _default: import('vue').DefineComponent<IB10cksFallbackProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<IB10cksFallbackProps> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
|
|
6
|
+
export default _default;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { Plugin } from 'vue';
|
|
2
|
-
|
|
3
|
-
export {
|
|
2
|
+
import { default as B10cksFallback } from './components/B10cksFallback.vue';
|
|
3
|
+
export { previewBridge } from '../../client/src';
|
|
4
|
+
export * from './api';
|
|
5
|
+
export { B10cksClientKey, B10cksComponentResolverKey, B10cksDataApiKey, type BlockComponentResolver, } from './types';
|
|
6
|
+
export { B10cksFallback };
|
|
4
7
|
export declare const B10cksVue: Plugin;
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("@b10cks/client"),c=require("vue"),g=Symbol("b10cks:resolveBlockComponent"),B=Symbol("b10cks:client"),y=Symbol("b10cks:data-api"),w=c.defineComponent({__name:"B10cksFallback",props:{block:{}},setup(e){return(s,t)=>(c.openBlock(),c.createElementBlock("div",null,'Component for block type "'+c.toDisplayString(e.block.block)+'" not found.',1))}}),D=c.defineComponent({__name:"B10cksComponent",props:{block:{}},setup(e,{expose:s}){const t=e,i=c.useTemplateRef("blockRef");s({value:i});const m=c.inject(g,null);function b(v){return v.split(/[-_]/).map(o=>o.charAt(0).toUpperCase()+o.slice(1)).join("").replace(/^([a-z])/,o=>o.toUpperCase())}const p=c.computed(()=>{const v=t.block?.block;if(!v)return null;const o=b(v),C=c.resolveDynamicComponent(o);return typeof C=="string"?m?c.defineAsyncComponent(async()=>{try{return await m(o)}catch{return w}}):(console.warn(`Component "${o}" not found. Make sure it's registered in your components directory.`),w):C});return c.computed(()=>t.block?.block||null),(v,o)=>p.value?(c.openBlock(),c.createBlock(c.resolveDynamicComponent(p.value),c.mergeProps({key:0,ref_key:"blockRef",ref:i},{...v.$props,...v.$attrs}),null,16)):c.createCommentVNode("",!0)}}),h={mounted(e,s,t){if(!d.previewBridge.isInPreviewMode())return;const{id:i}=s.value;if(!i){console.warn("v-editable directive requires a block with an id");return}e.classList.add("b10cks-preview");const m=o=>{o.preventDefault(),o.stopPropagation(),d.previewBridge.selectItem(i)},b=({selectedItem:o})=>{t.el&&(o===i?(t.el.classList.add("b10cks-selected"),R(e)):t.el.classList.remove("b10cks-selected"))},p=({selectedItem:o})=>{t.el&&(o===i?t.el.classList.add("b10cks-hover"):t.el.classList.remove("b10cks-hover"))},v=({content:o})=>{if(o&&o.id===i){const C=t.ctx;C.parent.attrs.block=o,C.update(),C.props.block=o,C.update()}};e.addEventListener("click",m),d.previewBridge.on("SELECT_UPDATE",b),d.previewBridge.on("HOVER_UPDATE",p),d.previewBridge.on("CONTENT_UPDATE",v),e._editableCleanup=()=>{e.removeEventListener("click",m)}},updated(e,s,t){d.previewBridge.isInPreviewMode()&&s.value!==s.oldValue&&(e._editableCleanup&&e._editableCleanup(),h.mounted(e,s,t))},unmounted(e){d.previewBridge.isInPreviewMode()&&(e._editableCleanup&&(e._editableCleanup(),delete e._editableCleanup),e.classList.remove("b10cks-preview","b10cks-selected"))}};function R(e){e.scrollIntoView&&e.scrollIntoView({behavior:"smooth"})}if(d.previewBridge.isInPreviewMode()){const e=document.createElement("style");e.innerHTML=`
|
|
2
2
|
.b10cks-hover,
|
|
3
3
|
.b10cks-preview:hover {
|
|
4
4
|
outline: 2px dashed rgba(59, 130, 246, 0.5);
|
|
@@ -8,5 +8,5 @@
|
|
|
8
8
|
outline: 2px solid rgb(59, 130, 246) !important;
|
|
9
9
|
outline-offset: 2px;
|
|
10
10
|
}
|
|
11
|
-
`,document.head.appendChild(e)}const
|
|
11
|
+
`,document.head.appendChild(e)}const _={mounted(e,s){const{id:t,field:i}=s.value;d.previewBridge.isInPreviewMode()&&(e.setAttribute("contenteditable","true"),e.addEventListener("input",m=>{d.previewBridge.updateField(t,i,m.target.innerText)}))}};function A(){const e=c.inject(y,null);if(!e)throw new Error("B10cks data API was not found in Vue injection context. Install B10cksVue with API options or provide B10cksDataApiKey manually.");return e}function E(){return c.inject(B,null)}function I(){const e=A(),s=E();function t(a,l={}){const{immediate:u=!0,params:n={},transform:r}=l;return k(async()=>{const f=await e.getResource(a,n);return r?r(f):f},u)}function i(a,l={}){const{immediate:u=!1,params:n={},transform:r}=l;return k(async()=>{const f=await e.getCollection(a,n);return r?r(f):f},u)}return{useApiResource:t,useApiCollection:i,useContent:(a,l={},u={})=>{const{immediate:n=!0,transform:r}=u;return k(async()=>{const f=await e.getContent(a,l);return r?r(f):f},n)},useContents:(a={},l={})=>{const{immediate:u=!1,transform:n}=l;return k(async()=>{const r=await e.getContents(a);return n?n(r):r},u)},useBlocks:(a={},l={})=>{const{immediate:u=!1,transform:n}=l;return k(async()=>{const r=await e.getBlocks(a);return n?n(r):r},u)},useDataEntries:(a,l={},u={})=>{const{immediate:n=!1,transform:r}=u;return k(async()=>{const f=await e.getDataEntries(a,l);return r?r(f):f},n)},useDataSources:(a={})=>{const{immediate:l=!1,params:u={},transform:n}=a;return k(async()=>{const r=await e.getDataSources(u);return n?n(r):r},l)},useSpace:(a={})=>{const{immediate:l=!0,params:u={},transform:n}=a;return k(async()=>{const r=await e.getSpace(u);return n?n(r):r},l)},useRedirects:(a={})=>{const{immediate:l=!0,params:u={},transform:n,forceRefresh:r=!1}=a;return k(async()=>{const f=await e.getRedirects(u,r);return n?n(f):f},l)},useB10cksConfig:(a={},l={})=>{const{immediate:u=!0}=l,n=k(()=>e.getConfig(a),u);return{...n,config:c.computed(()=>n.data.value??{})}},syncRevision:async a=>e.syncRevision(a),dataApi:e,client:s}}function k(e,s){const t=c.ref(null),i=c.ref(!1),m=c.ref(null),b=async()=>{i.value=!0,m.value=null;try{const p=await e();return t.value=p,p}catch(p){const v=p instanceof Error?p:new Error(`B10cks request failed: ${String(p)}`);throw m.value=v,v}finally{i.value=!1}};return s&&b(),{data:t,pending:i,error:m,execute:b,refresh:b}}const P={install(e,s={}){e.provide("b10cksVueOptions",s),e.directive("editable",h),e.directive("editable-field",_),e.component("B10cksComponent",D),d.previewBridge.isInPreviewMode()&&d.previewBridge.init();const t=S(s),i=s.dataApi||(t?d.createB10cksDataApi(t):null);t&&e.provide(B,t),i&&e.provide(y,i)}};function S(e){if(e.client)return e.client;const s=e.apiClientOptions||L(e);return s?new d.ApiClient(s,e.requestUrl):null}function L(e){const s=e.token||e.accessToken,t=e.baseUrl||e.apiUrl;return!s||!t?null:{token:s,baseUrl:t,rv:e.rv,version:e.version,fetchClient:e.fetchClient,getRv:e.getRv,setRv:e.setRv}}Object.defineProperty(exports,"previewBridge",{enumerable:!0,get:()=>d.previewBridge});exports.B10cksClientKey=B;exports.B10cksComponentResolverKey=g;exports.B10cksDataApiKey=y;exports.B10cksFallback=w;exports.B10cksVue=P;exports.useB10cksApi=I;exports.useB10cksClient=E;exports.useB10cksDataApi=A;
|
|
12
12
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/types.ts","../src/components/B10cksComponent.vue","../src/preview-bridge.ts","../src/directives/v-editable.ts","../src/directives/v-editable-content.ts","../src/index.ts"],"sourcesContent":["import type { B10cksApiClientOptions } from '@b10cks/client'\nimport type { Component, InjectionKey } from 'vue'\n\nexport interface B10cksVuePluginOptions extends B10cksApiClientOptions {}\n\nexport type BlockComponentResolver = (componentName: string) => Promise<Component>\n\nexport const B10cksComponentResolverKey: InjectionKey<BlockComponentResolver> = Symbol(\n 'b10cks:resolveBlockComponent'\n)\n","<script setup lang=\"ts\">\nimport type { IBContent } from '@b10cks/client'\nimport { computed, defineAsyncComponent, inject, shallowRef, useTemplateRef, watch } from 'vue'\n\nimport { B10cksComponentResolverKey } from '../types'\n\nconst props = defineProps<{\n block: IBContent<string> & Record<string, never>\n}>()\n\nconst blockRef = useTemplateRef('blockRef')\ndefineExpose({ value: blockRef })\n\nconst resolvedComponent = shallowRef<ReturnType<typeof defineAsyncComponent> | null>(null)\nconst componentName = computed(() => props.block?.block || null)\n\nconst resolveBlockComponent = inject(B10cksComponentResolverKey, null)\n\nwatch(\n () => componentName.value,\n async (newComponentName: string | null) => {\n if (!newComponentName) {\n resolvedComponent.value = null\n return\n }\n\n if (!resolveBlockComponent) {\n // biome-ignore lint/suspicious/noConsole: give developers feedback\n console.error(\n 'B10cks: No component resolver found. Make sure you are using @b10cks/nuxt module or have provided a custom resolver.'\n )\n resolvedComponent.value = null\n return\n }\n\n try {\n resolvedComponent.value = await resolveBlockComponent(newComponentName)\n } catch (error) {\n // biome-ignore lint/suspicious/noConsole: give developers feedback\n console.warn(`Failed to load block component for type \"${newComponentName}\":`, error)\n resolvedComponent.value = null\n }\n },\n { immediate: true }\n)\n</script>\n<template>\n <component\n :is=\"resolvedComponent\"\n v-if=\"resolvedComponent\"\n ref=\"blockRef\"\n v-bind=\"{ ...$props, ...$attrs }\"\n />\n <div v-else>Component for block type \"{{ componentName }}\" not found.</div>\n</template>\n","export type ContentUpdateEvent = {\n content: Record<string, unknown>\n}\n\nexport type SelectUpdateEvent = {\n selectedItem: string\n}\n\nexport type EventType = 'CONTENT_UPDATE' | 'SELECT_UPDATE' | 'HOVER_UPDATE'\n\nexport type EventPayloadMap = {\n CONTENT_UPDATE: ContentUpdateEvent\n SELECT_UPDATE: SelectUpdateEvent\n HOVER_UPDATE: SelectUpdateEvent\n}\n\nexport type BridgeEvent = {\n type: EventType\n payload: ContentUpdateEvent | SelectUpdateEvent\n b10cksId?: string\n}\n\ntype EventCallback<T> = (payload: T) => void\n\nclass PreviewBridge {\n private static instance: PreviewBridge\n private eventListeners: {\n [key in EventType]?: Array<EventCallback<EventPayloadMap[key]>>\n } = {}\n\n private isEnabled = false\n\n private constructor() {\n this.isEnabled = this.isIframe()\n }\n\n public init(): void {\n if (this.isEnabled && window) {\n window.addEventListener('message', this.handleMessage)\n }\n }\n\n public static getInstance(): PreviewBridge {\n if (!PreviewBridge.instance) {\n PreviewBridge.instance = new PreviewBridge()\n }\n return PreviewBridge.instance\n }\n\n public isInPreviewMode(): boolean {\n return this.isEnabled\n }\n\n private isIframe(): boolean {\n return typeof window !== 'undefined' && window.self !== window.top\n }\n\n private handleMessage = (event: MessageEvent): void => {\n if (!event.data || typeof event.data !== 'object') return\n const { type, payload } = event.data as BridgeEvent\n\n this.notifyListeners(type as EventType, payload)\n }\n\n private notifyListeners<T extends EventType>(type: T, payload: EventPayloadMap[T]): void {\n const listeners = this.eventListeners[type] as\n | Array<EventCallback<EventPayloadMap[T]>>\n | undefined\n\n if (listeners) {\n listeners.forEach((listener) => {\n listener(payload)\n })\n }\n }\n\n public on<T extends EventType>(\n eventType: T,\n callback: EventCallback<EventPayloadMap[T]>\n ): () => void {\n if (!this.isEnabled) return () => {}\n\n if (!this.eventListeners[eventType]) {\n this.eventListeners[eventType] = []\n }\n\n ;(this.eventListeners[eventType] as Array<EventCallback<EventPayloadMap[T]>>).push(callback)\n\n return () => {\n this.eventListeners[eventType] = (\n this.eventListeners[eventType] as Array<EventCallback<EventPayloadMap[T]>>\n ).filter((listener) => listener !== callback) as never\n }\n }\n\n public selectItem(selectedItem: string): void {\n if (!this.isEnabled) return\n\n window.parent.postMessage(\n {\n type: 'SELECT_UPDATE',\n payload: { selectedItem },\n },\n '*'\n )\n }\n\n public updateField(itemId: string, field: string, value: string): void {\n if (!this.isEnabled) return\n\n window.parent.postMessage(\n {\n type: 'FIELD_UPDATE',\n payload: { itemId, field, value },\n },\n '*'\n )\n }\n\n public destroy(): void {\n if (this.isEnabled) {\n window.removeEventListener('message', this.handleMessage)\n this.isEnabled = false\n }\n this.eventListeners = {}\n }\n}\n\nexport const previewBridge = PreviewBridge.getInstance()\n","import type { DirectiveBinding, VNode } from 'vue'\n\nimport type { SelectUpdateEvent } from '../preview-bridge'\n\nimport { previewBridge } from '../preview-bridge'\n\ninterface EditableElement extends HTMLElement {\n _editableCleanup?: () => void\n}\n\nexport const EditableDirective = {\n mounted(el: EditableElement, binding: DirectiveBinding, node: VNode) {\n if (!previewBridge.isInPreviewMode()) return\n const { id: itemId } = binding.value\n\n if (!itemId) {\n // biome-ignore lint/suspicious/noConsole: give developers feedback\n console.warn('v-editable directive requires a block with an id')\n return\n }\n\n el.classList.add('b10cks-preview')\n\n const handleClick = (e: MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n previewBridge.selectItem(itemId)\n }\n\n const handleSelectionChange = ({ selectedItem }: SelectUpdateEvent) => {\n if (!node.el) return\n\n if (selectedItem === itemId) {\n node.el.classList.add('b10cks-selected')\n scrollIntoViewIfNeeded(el)\n } else {\n node.el.classList.remove('b10cks-selected')\n }\n }\n\n const handleHoverChange = ({ selectedItem }: SelectUpdateEvent) => {\n if (!node.el) return\n\n if (selectedItem === itemId) {\n node.el.classList.add('b10cks-hover')\n } else {\n node.el.classList.remove('b10cks-hover')\n }\n }\n\n const handleUpdate = ({ content }: { content: any }) => {\n if (content && content.id === itemId) {\n // biome-ignore lint/suspicious/noExplicitAny: use of any to access internal properties\n const ctx = (node as any).ctx\n ctx.parent.attrs.block = content\n ctx.update()\n ctx.props.block = content\n ctx.update()\n }\n }\n\n el.addEventListener('click', handleClick)\n previewBridge.on('SELECT_UPDATE', handleSelectionChange)\n previewBridge.on('HOVER_UPDATE', handleHoverChange)\n previewBridge.on('CONTENT_UPDATE', handleUpdate)\n\n el._editableCleanup = () => {\n el.removeEventListener('click', handleClick)\n }\n },\n\n updated(el: EditableElement, binding: DirectiveBinding, vnode: VNode) {\n if (!previewBridge.isInPreviewMode()) return\n\n if (binding.value !== binding.oldValue) {\n if (el._editableCleanup) {\n el._editableCleanup()\n }\n\n EditableDirective.mounted(el, binding, vnode)\n }\n },\n\n unmounted(el: EditableElement) {\n if (!previewBridge.isInPreviewMode()) return\n\n if (el._editableCleanup) {\n el._editableCleanup()\n delete el._editableCleanup\n }\n\n el.classList.remove('b10cks-preview', 'b10cks-selected')\n },\n}\n\nfunction scrollIntoViewIfNeeded(el: HTMLElement) {\n if (el.scrollIntoView) {\n el.scrollIntoView({ behavior: 'smooth' })\n }\n}\n\nif (previewBridge.isInPreviewMode()) {\n const style = document.createElement('style')\n style.innerHTML = `\n .b10cks-hover,\n .b10cks-preview:hover {\n outline: 2px dashed rgba(59, 130, 246, 0.5);\n outline-offset: 2px;\n }\n .b10cks-selected {\n outline: 2px solid rgb(59, 130, 246) !important;\n outline-offset: 2px;\n }\n `\n document.head.appendChild(style)\n}\n","import type { Directive, DirectiveBinding } from 'vue'\n\nimport { previewBridge } from '../preview-bridge'\n\nexport const EditableContentDirective: Directive<HTMLElement> = {\n mounted(el: HTMLElement, binding: DirectiveBinding) {\n const { id: itemId, field } = binding.value\n if (!previewBridge.isInPreviewMode()) return\n el.setAttribute('contenteditable', 'true')\n\n el.addEventListener('input', (event: Event) => {\n previewBridge.updateField(itemId, field, (event.target as HTMLInputElement).innerText)\n })\n },\n}\n","import type { Plugin } from 'vue'\n\nimport type { B10cksVuePluginOptions } from './types'\n\nimport B10cksComponent from './components/B10cksComponent.vue'\nimport { EditableDirective } from './directives/v-editable'\nimport { EditableContentDirective } from './directives/v-editable-content'\n\nexport { previewBridge } from './preview-bridge'\nexport { B10cksComponentResolverKey, type BlockComponentResolver } from './types'\n\nexport const B10cksVue: Plugin = {\n install(app, pluginOptions: B10cksVuePluginOptions) {\n app.provide('b10cksVueOptions', pluginOptions)\n\n app.directive('editable', EditableDirective)\n app.directive('editable-field', EditableContentDirective)\n app.component('B10cksComponent', B10cksComponent)\n },\n}\n"],"names":["B10cksComponentResolverKey","props","__props","blockRef","useTemplateRef","__expose","resolvedComponent","shallowRef","componentName","computed","resolveBlockComponent","inject","watch","newComponentName","error","_createBlock","_resolveDynamicComponent","_mergeProps","$props","$attrs","_openBlock","_createElementBlock","_hoisted_1","_toDisplayString","PreviewBridge","event","type","payload","listeners","listener","eventType","callback","selectedItem","itemId","field","value","previewBridge","EditableDirective","el","binding","node","handleClick","e","handleSelectionChange","scrollIntoViewIfNeeded","handleHoverChange","handleUpdate","content","ctx","vnode","style","EditableContentDirective","B10cksVue","app","pluginOptions","B10cksComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/types.ts","../src/components/B10cksFallback.vue","../src/components/B10cksComponent.vue","../src/directives/v-editable.ts","../src/directives/v-editable-content.ts","../src/api.ts","../src/index.ts"],"sourcesContent":["import type { ApiClient, B10cksApiClientOptions, B10cksDataApi, FetchClient } from '@b10cks/client'\nimport type { Component, InjectionKey } from 'vue'\n\nexport interface B10cksVuePluginOptions {\n apiClientOptions?: B10cksApiClientOptions\n client?: ApiClient\n dataApi?: B10cksDataApi\n requestUrl?: URL | string\n token?: string\n baseUrl?: string\n accessToken?: string\n apiUrl?: string\n version?: 'draft' | 'published'\n rv?: string | number\n fetchClient?: FetchClient\n getRv?: () => string | number\n setRv?: (value: string | number) => void\n}\n\nexport type BlockComponentResolver = (componentName: string) => Promise<Component>\n\nexport const B10cksComponentResolverKey: InjectionKey<BlockComponentResolver> = Symbol(\n 'b10cks:resolveBlockComponent'\n)\n\nexport const B10cksClientKey: InjectionKey<ApiClient> = Symbol('b10cks:client')\nexport const B10cksDataApiKey: InjectionKey<B10cksDataApi> = Symbol('b10cks:data-api')\n","<script setup lang=\"ts\">\nimport type { IBContent } from '@b10cks/client'\n\nexport interface IB10cksFallbackProps {\n block: IBContent<string> & Record<string, never>\n}\n\ndefineProps<IB10cksFallbackProps>()\n</script>\n\n<template>\n <div>Component for block type \"{{ block.block }}\" not found.</div>\n</template>\n","<script setup lang=\"ts\">\nimport type { IBContent } from '@b10cks/client'\nimport {\n computed,\n defineAsyncComponent,\n inject,\n resolveDynamicComponent,\n useTemplateRef,\n} from 'vue'\n\nimport { B10cksComponentResolverKey } from '../types'\nimport B10cksFallback from './B10cksFallback.vue'\n\nconst props = defineProps<{\n block: IBContent<string> & Record<string, never>\n}>()\n\nconst blockRef = useTemplateRef('blockRef')\ndefineExpose({ value: blockRef })\n\nconst customResolver = inject(B10cksComponentResolverKey, null)\n\n// Convert component name to PascalCase synchronously\nfunction toPascalCase(name: string): string {\n return name\n .split(/[-_]/)\n .map((part: string) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('')\n .replace(/^([a-z])/, (match: string) => match.toUpperCase())\n}\n\n// Compute the component synchronously for SSR compatibility\nconst resolvedComponent = computed(() => {\n const componentName = props.block?.block\n\n if (!componentName) {\n return null\n }\n\n const pascalCaseName = toPascalCase(componentName)\n\n // Use Vue's built-in resolveDynamicComponent which works in SSR\n // This resolves globally registered components automatically\n const component = resolveDynamicComponent(pascalCaseName)\n\n // resolveDynamicComponent returns a string if component not found\n if (typeof component === 'string') {\n if (customResolver) {\n return defineAsyncComponent(async () => {\n try {\n return await customResolver(pascalCaseName)\n } catch {\n return B10cksFallback\n }\n })\n }\n\n // biome-ignore lint/suspicious/noConsole: give developers feedback\n console.warn(\n `Component \"${pascalCaseName}\" not found. Make sure it's registered in your components directory.`\n )\n return B10cksFallback\n }\n\n return component\n})\n\nconst componentName = computed(() => props.block?.block || null)\n</script>\n\n<template>\n <component\n :is=\"resolvedComponent\"\n v-if=\"resolvedComponent\"\n ref=\"blockRef\"\n v-bind=\"{ ...$props, ...$attrs }\"\n />\n</template>\n","import type { DirectiveBinding, VNode } from 'vue'\n\nimport type { SelectUpdateEvent } from '../preview-bridge'\n\nimport { previewBridge } from '../preview-bridge'\n\ninterface EditableElement extends HTMLElement {\n _editableCleanup?: () => void\n}\n\nexport const EditableDirective = {\n mounted(el: EditableElement, binding: DirectiveBinding, node: VNode) {\n if (!previewBridge.isInPreviewMode()) return\n const { id: itemId } = binding.value\n\n if (!itemId) {\n // biome-ignore lint/suspicious/noConsole: give developers feedback\n console.warn('v-editable directive requires a block with an id')\n return\n }\n\n el.classList.add('b10cks-preview')\n\n const handleClick = (e: MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n previewBridge.selectItem(itemId)\n }\n\n const handleSelectionChange = ({ selectedItem }: SelectUpdateEvent) => {\n if (!node.el) return\n\n if (selectedItem === itemId) {\n node.el.classList.add('b10cks-selected')\n scrollIntoViewIfNeeded(el)\n } else {\n node.el.classList.remove('b10cks-selected')\n }\n }\n\n const handleHoverChange = ({ selectedItem }: SelectUpdateEvent) => {\n if (!node.el) return\n\n if (selectedItem === itemId) {\n node.el.classList.add('b10cks-hover')\n } else {\n node.el.classList.remove('b10cks-hover')\n }\n }\n\n const handleUpdate = ({ content }: { content: any }) => {\n if (content && content.id === itemId) {\n // biome-ignore lint/suspicious/noExplicitAny: use of any to access internal properties\n const ctx = (node as any).ctx\n ctx.parent.attrs.block = content\n ctx.update()\n ctx.props.block = content\n ctx.update()\n }\n }\n\n el.addEventListener('click', handleClick)\n previewBridge.on('SELECT_UPDATE', handleSelectionChange)\n previewBridge.on('HOVER_UPDATE', handleHoverChange)\n previewBridge.on('CONTENT_UPDATE', handleUpdate)\n\n el._editableCleanup = () => {\n el.removeEventListener('click', handleClick)\n }\n },\n\n updated(el: EditableElement, binding: DirectiveBinding, vnode: VNode) {\n if (!previewBridge.isInPreviewMode()) return\n\n if (binding.value !== binding.oldValue) {\n if (el._editableCleanup) {\n el._editableCleanup()\n }\n\n EditableDirective.mounted(el, binding, vnode)\n }\n },\n\n unmounted(el: EditableElement) {\n if (!previewBridge.isInPreviewMode()) return\n\n if (el._editableCleanup) {\n el._editableCleanup()\n delete el._editableCleanup\n }\n\n el.classList.remove('b10cks-preview', 'b10cks-selected')\n },\n}\n\nfunction scrollIntoViewIfNeeded(el: HTMLElement) {\n if (el.scrollIntoView) {\n el.scrollIntoView({ behavior: 'smooth' })\n }\n}\n\nif (previewBridge.isInPreviewMode()) {\n const style = document.createElement('style')\n style.innerHTML = `\n .b10cks-hover,\n .b10cks-preview:hover {\n outline: 2px dashed rgba(59, 130, 246, 0.5);\n outline-offset: 2px;\n }\n .b10cks-selected {\n outline: 2px solid rgb(59, 130, 246) !important;\n outline-offset: 2px;\n }\n `\n document.head.appendChild(style)\n}\n","import type { Directive, DirectiveBinding } from 'vue'\n\nimport { previewBridge } from '../preview-bridge'\n\nexport const EditableContentDirective: Directive<HTMLElement> = {\n mounted(el: HTMLElement, binding: DirectiveBinding) {\n const { id: itemId, field } = binding.value\n if (!previewBridge.isInPreviewMode()) return\n el.setAttribute('contenteditable', 'true')\n\n el.addEventListener('input', (event: Event) => {\n previewBridge.updateField(itemId, field, (event.target as HTMLInputElement).innerText)\n })\n },\n}\n","import type {\n B10cksDataApi,\n Endpoint,\n GetConfigOptions,\n IBBaseQueryParams,\n IBBlock,\n IBContent,\n IBContentQueryParams,\n IBDataEntry,\n IBDataSource,\n RedirectMap,\n IBSpace,\n} from '@b10cks/client'\n\nimport { computed, inject, ref, type Ref } from 'vue'\n\nimport { B10cksClientKey, B10cksDataApiKey } from './types'\n\ntype QueryParams = Omit<IBBaseQueryParams, 'token'>\n\nexport interface UseB10cksApiOptions<T, P extends QueryParams = QueryParams> {\n immediate?: boolean\n params?: P\n transform?: (value: T) => T\n}\n\nexport interface AsyncState<T> {\n data: import('vue').Ref<T | null>\n pending: import('vue').Ref<boolean>\n error: import('vue').Ref<Error | null>\n execute: () => Promise<T>\n refresh: () => Promise<T>\n}\n\nexport interface UseB10cksConfigResult<T> extends AsyncState<T> {\n config: import('vue').ComputedRef<T>\n}\n\nexport function useB10cksDataApi(): B10cksDataApi {\n const dataApi = inject(B10cksDataApiKey, null)\n if (!dataApi) {\n throw new Error(\n 'B10cks data API was not found in Vue injection context. Install B10cksVue with API options or provide B10cksDataApiKey manually.'\n )\n }\n\n return dataApi\n}\n\nexport function useB10cksClient() {\n return inject(B10cksClientKey, null)\n}\n\nexport function useB10cksApi() {\n const dataApi = useB10cksDataApi()\n const client = useB10cksClient()\n\n function useApiResource<T>(\n endpoint: Endpoint,\n options: UseB10cksApiOptions<T> = {}\n ): AsyncState<T> {\n const { immediate = true, params = {}, transform } = options\n return createAsyncState(async () => {\n const value = await dataApi.getResource<T>(endpoint, params)\n return transform ? transform(value) : value\n }, immediate)\n }\n\n function useApiCollection<T>(\n endpoint: Endpoint,\n options: UseB10cksApiOptions<T[], QueryParams> = {}\n ): AsyncState<T[]> {\n const { immediate = false, params = {}, transform } = options\n return createAsyncState(async () => {\n const value = await dataApi.getCollection<T>(endpoint, params)\n return transform ? transform(value) : value\n }, immediate)\n }\n\n const useContent = <T = Record<string, unknown>>(\n fullSlug: string,\n params: Omit<IBContentQueryParams, 'token' | 'full_slug'> = {},\n options: Omit<UseB10cksApiOptions<IBContent<T>>, 'params'> = {}\n ): AsyncState<IBContent<T>> => {\n const { immediate = true, transform } = options\n return createAsyncState(async () => {\n const value = await dataApi.getContent<T>(fullSlug, params)\n return transform ? transform(value) : value\n }, immediate)\n }\n\n const useContents = <T = Record<string, unknown>>(\n params: Omit<IBContentQueryParams, 'token'> = {},\n options: Omit<UseB10cksApiOptions<IBContent<T>[]>, 'params'> = {}\n ): AsyncState<IBContent<T>[]> => {\n const { immediate = false, transform } = options\n return createAsyncState(async () => {\n const value = await dataApi.getContents<T>(params)\n return transform ? transform(value) : value\n }, immediate)\n }\n\n const useBlocks = (\n params: QueryParams = {},\n options: Omit<UseB10cksApiOptions<IBBlock[]>, 'params'> = {}\n ): AsyncState<IBBlock[]> => {\n const { immediate = false, transform } = options\n return createAsyncState(async () => {\n const value = await dataApi.getBlocks(params)\n return transform ? transform(value) : value\n }, immediate)\n }\n\n const useDataEntries = (\n source: string,\n params: QueryParams = {},\n options: Omit<UseB10cksApiOptions<IBDataEntry[]>, 'params'> = {}\n ): AsyncState<IBDataEntry[]> => {\n const { immediate = false, transform } = options\n return createAsyncState(async () => {\n const value = await dataApi.getDataEntries(source, params)\n return transform ? transform(value) : value\n }, immediate)\n }\n\n const useDataSources = (\n options: UseB10cksApiOptions<IBDataSource[]> = {}\n ): AsyncState<IBDataSource[]> => {\n const { immediate = false, params = {}, transform } = options\n return createAsyncState(async () => {\n const value = await dataApi.getDataSources(params)\n return transform ? transform(value) : value\n }, immediate)\n }\n\n const useSpace = (options: UseB10cksApiOptions<IBSpace> = {}): AsyncState<IBSpace> => {\n const { immediate = true, params = {}, transform } = options\n return createAsyncState(async () => {\n const value = await dataApi.getSpace(params)\n return transform ? transform(value) : value\n }, immediate)\n }\n\n const useRedirects = (\n options: UseB10cksApiOptions<RedirectMap> & { forceRefresh?: boolean } = {}\n ): AsyncState<RedirectMap> => {\n const { immediate = true, params = {}, transform, forceRefresh = false } = options\n return createAsyncState(async () => {\n const value = await dataApi.getRedirects(params, forceRefresh)\n return transform ? transform(value) : value\n }, immediate)\n }\n\n const useB10cksConfig = <T = Record<string, unknown>>(\n options: GetConfigOptions = {},\n executionOptions: { immediate?: boolean } = {}\n ): UseB10cksConfigResult<T> => {\n const { immediate = true } = executionOptions\n const state = createAsyncState<T>(() => dataApi.getConfig<T>(options), immediate)\n\n return {\n ...state,\n config: computed(() => state.data.value ?? ({} as T)),\n }\n }\n\n const syncRevision = async (fallbackRv?: number) => dataApi.syncRevision(fallbackRv)\n\n return {\n useApiResource,\n useApiCollection,\n useContent,\n useContents,\n useBlocks,\n useDataEntries,\n useDataSources,\n useSpace,\n useRedirects,\n useB10cksConfig,\n syncRevision,\n dataApi,\n client,\n }\n}\n\nfunction createAsyncState<T>(fetcher: () => Promise<T>, immediate: boolean): AsyncState<T> {\n const data = ref<T | null>(null) as Ref<T | null>\n const pending = ref(false)\n const error = ref<Error | null>(null)\n\n const execute = async (): Promise<T> => {\n pending.value = true\n error.value = null\n\n try {\n const value = await fetcher()\n data.value = value\n return value\n } catch (caughtError) {\n const normalizedError =\n caughtError instanceof Error\n ? caughtError\n : new Error(`B10cks request failed: ${String(caughtError)}`)\n error.value = normalizedError\n throw normalizedError\n } finally {\n pending.value = false\n }\n }\n\n if (immediate) {\n void execute()\n }\n\n return {\n data,\n pending,\n error,\n execute,\n refresh: execute,\n }\n}\n","import type { Plugin } from 'vue'\n\nimport { ApiClient, createB10cksDataApi, previewBridge } from '@b10cks/client'\n\nimport type { B10cksVuePluginOptions } from './types'\n\nimport B10cksComponent from './components/B10cksComponent.vue'\nimport B10cksFallback from './components/B10cksFallback.vue'\nimport { EditableDirective } from './directives/v-editable'\nimport { EditableContentDirective } from './directives/v-editable-content'\nimport { B10cksClientKey, B10cksDataApiKey } from './types'\n\nexport { previewBridge } from '@b10cks/client'\nexport * from './api'\nexport {\n B10cksClientKey,\n B10cksComponentResolverKey,\n B10cksDataApiKey,\n type BlockComponentResolver,\n} from './types'\nexport { B10cksFallback }\n\nexport const B10cksVue: Plugin = {\n install(app, pluginOptions: B10cksVuePluginOptions = {}) {\n app.provide('b10cksVueOptions', pluginOptions)\n\n app.directive('editable', EditableDirective)\n app.directive('editable-field', EditableContentDirective)\n app.component('B10cksComponent', B10cksComponent)\n\n if (previewBridge.isInPreviewMode()) {\n previewBridge.init()\n }\n\n const client = resolveClient(pluginOptions)\n const dataApi = pluginOptions.dataApi || (client ? createB10cksDataApi(client) : null)\n\n if (client) {\n app.provide(B10cksClientKey, client)\n }\n\n if (dataApi) {\n app.provide(B10cksDataApiKey, dataApi)\n }\n },\n}\n\nfunction resolveClient(pluginOptions: B10cksVuePluginOptions): ApiClient | null {\n if (pluginOptions.client) {\n return pluginOptions.client\n }\n\n const apiClientOptions =\n pluginOptions.apiClientOptions || resolveLegacyApiClientOptions(pluginOptions)\n if (!apiClientOptions) {\n return null\n }\n\n return new ApiClient(apiClientOptions, pluginOptions.requestUrl)\n}\n\nfunction resolveLegacyApiClientOptions(\n pluginOptions: B10cksVuePluginOptions\n): B10cksVuePluginOptions['apiClientOptions'] | null {\n const token = pluginOptions.token || pluginOptions.accessToken\n const baseUrl = pluginOptions.baseUrl || pluginOptions.apiUrl\n\n if (!token || !baseUrl) {\n return null\n }\n\n return {\n token,\n baseUrl,\n rv: pluginOptions.rv,\n version: pluginOptions.version,\n fetchClient: pluginOptions.fetchClient,\n getRv: pluginOptions.getRv,\n setRv: pluginOptions.setRv,\n }\n}\n"],"names":["B10cksComponentResolverKey","B10cksClientKey","B10cksDataApiKey","_openBlock","_createElementBlock","_toDisplayString","__props","props","blockRef","useTemplateRef","__expose","customResolver","inject","toPascalCase","name","part","match","resolvedComponent","computed","componentName","pascalCaseName","component","resolveDynamicComponent","defineAsyncComponent","B10cksFallback","_createBlock","_resolveDynamicComponent","_mergeProps","$props","$attrs","EditableDirective","el","binding","node","previewBridge","itemId","handleClick","e","handleSelectionChange","selectedItem","scrollIntoViewIfNeeded","handleHoverChange","handleUpdate","content","ctx","vnode","style","EditableContentDirective","field","event","useB10cksDataApi","dataApi","useB10cksClient","useB10cksApi","client","useApiResource","endpoint","options","immediate","params","transform","createAsyncState","value","useApiCollection","fullSlug","source","forceRefresh","executionOptions","state","fallbackRv","fetcher","data","ref","pending","error","execute","caughtError","normalizedError","B10cksVue","app","pluginOptions","B10cksComponent","resolveClient","createB10cksDataApi","apiClientOptions","resolveLegacyApiClientOptions","ApiClient","token","baseUrl"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,136 +1,85 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { previewBridge as v, createB10cksDataApi as g, ApiClient as I } from "@b10cks/client";
|
|
2
|
+
import { previewBridge as ee } from "@b10cks/client";
|
|
3
|
+
import { defineComponent as A, createElementBlock as P, openBlock as E, toDisplayString as S, useTemplateRef as x, inject as w, computed as y, resolveDynamicComponent as h, defineAsyncComponent as L, createBlock as T, createCommentVNode as U, mergeProps as V, ref as C } from "vue";
|
|
4
|
+
const M = Symbol(
|
|
3
5
|
"b10cks:resolveBlockComponent"
|
|
4
|
-
), _ =
|
|
6
|
+
), _ = Symbol("b10cks:client"), R = Symbol("b10cks:data-api"), B = /* @__PURE__ */ A({
|
|
7
|
+
__name: "B10cksFallback",
|
|
8
|
+
props: {
|
|
9
|
+
block: {}
|
|
10
|
+
},
|
|
11
|
+
setup(e) {
|
|
12
|
+
return (r, t) => (E(), P("div", null, 'Component for block type "' + S(e.block.block) + '" not found.', 1));
|
|
13
|
+
}
|
|
14
|
+
}), N = /* @__PURE__ */ A({
|
|
5
15
|
__name: "B10cksComponent",
|
|
6
16
|
props: {
|
|
7
17
|
block: {}
|
|
8
18
|
},
|
|
9
|
-
setup(e, { expose:
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
() =>
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
"B10cks: No component resolver found. Make sure you are using @b10cks/nuxt module or have provided a custom resolver."
|
|
23
|
-
), o.value = null;
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
19
|
+
setup(e, { expose: r }) {
|
|
20
|
+
const t = e, c = x("blockRef");
|
|
21
|
+
r({ value: c });
|
|
22
|
+
const f = w(M, null);
|
|
23
|
+
function k(d) {
|
|
24
|
+
return d.split(/[-_]/).map((o) => o.charAt(0).toUpperCase() + o.slice(1)).join("").replace(/^([a-z])/, (o) => o.toUpperCase());
|
|
25
|
+
}
|
|
26
|
+
const m = y(() => {
|
|
27
|
+
const d = t.block?.block;
|
|
28
|
+
if (!d)
|
|
29
|
+
return null;
|
|
30
|
+
const o = k(d), b = h(o);
|
|
31
|
+
return typeof b == "string" ? f ? L(async () => {
|
|
26
32
|
try {
|
|
27
|
-
|
|
28
|
-
} catch
|
|
29
|
-
|
|
33
|
+
return await f(o);
|
|
34
|
+
} catch {
|
|
35
|
+
return B;
|
|
30
36
|
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
|
|
37
|
+
}) : (console.warn(
|
|
38
|
+
`Component "${o}" not found. Make sure it's registered in your components directory.`
|
|
39
|
+
), B) : b;
|
|
40
|
+
});
|
|
41
|
+
return y(() => t.block?.block || null), (d, o) => m.value ? (E(), T(h(m.value), V({
|
|
34
42
|
key: 0,
|
|
35
43
|
ref_key: "blockRef",
|
|
36
|
-
ref:
|
|
37
|
-
}, { ...
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
class a {
|
|
41
|
-
static instance;
|
|
42
|
-
eventListeners = {};
|
|
43
|
-
isEnabled = !1;
|
|
44
|
-
constructor() {
|
|
45
|
-
this.isEnabled = this.isIframe();
|
|
46
|
-
}
|
|
47
|
-
init() {
|
|
48
|
-
this.isEnabled && window && window.addEventListener("message", this.handleMessage);
|
|
49
|
-
}
|
|
50
|
-
static getInstance() {
|
|
51
|
-
return a.instance || (a.instance = new a()), a.instance;
|
|
52
|
-
}
|
|
53
|
-
isInPreviewMode() {
|
|
54
|
-
return this.isEnabled;
|
|
55
|
-
}
|
|
56
|
-
isIframe() {
|
|
57
|
-
return typeof window < "u" && window.self !== window.top;
|
|
58
|
-
}
|
|
59
|
-
handleMessage = (t) => {
|
|
60
|
-
if (!t.data || typeof t.data != "object") return;
|
|
61
|
-
const { type: s, payload: n } = t.data;
|
|
62
|
-
this.notifyListeners(s, n);
|
|
63
|
-
};
|
|
64
|
-
notifyListeners(t, s) {
|
|
65
|
-
const n = this.eventListeners[t];
|
|
66
|
-
n && n.forEach((o) => {
|
|
67
|
-
o(s);
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
on(t, s) {
|
|
71
|
-
return this.isEnabled ? (this.eventListeners[t] || (this.eventListeners[t] = []), this.eventListeners[t].push(s), () => {
|
|
72
|
-
this.eventListeners[t] = this.eventListeners[t].filter((n) => n !== s);
|
|
73
|
-
}) : () => {
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
selectItem(t) {
|
|
77
|
-
this.isEnabled && window.parent.postMessage(
|
|
78
|
-
{
|
|
79
|
-
type: "SELECT_UPDATE",
|
|
80
|
-
payload: { selectedItem: t }
|
|
81
|
-
},
|
|
82
|
-
"*"
|
|
83
|
-
);
|
|
44
|
+
ref: c
|
|
45
|
+
}, { ...d.$props, ...d.$attrs }), null, 16)) : U("", !0);
|
|
84
46
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
},
|
|
91
|
-
"*"
|
|
92
|
-
);
|
|
93
|
-
}
|
|
94
|
-
destroy() {
|
|
95
|
-
this.isEnabled && (window.removeEventListener("message", this.handleMessage), this.isEnabled = !1), this.eventListeners = {};
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
const r = a.getInstance(), f = {
|
|
99
|
-
mounted(e, t, s) {
|
|
100
|
-
if (!r.isInPreviewMode()) return;
|
|
101
|
-
const { id: n } = t.value;
|
|
102
|
-
if (!n) {
|
|
47
|
+
}), D = {
|
|
48
|
+
mounted(e, r, t) {
|
|
49
|
+
if (!v.isInPreviewMode()) return;
|
|
50
|
+
const { id: c } = r.value;
|
|
51
|
+
if (!c) {
|
|
103
52
|
console.warn("v-editable directive requires a block with an id");
|
|
104
53
|
return;
|
|
105
54
|
}
|
|
106
55
|
e.classList.add("b10cks-preview");
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
},
|
|
110
|
-
|
|
111
|
-
},
|
|
112
|
-
|
|
113
|
-
},
|
|
114
|
-
if (
|
|
115
|
-
const
|
|
116
|
-
|
|
56
|
+
const f = (o) => {
|
|
57
|
+
o.preventDefault(), o.stopPropagation(), v.selectItem(c);
|
|
58
|
+
}, k = ({ selectedItem: o }) => {
|
|
59
|
+
t.el && (o === c ? (t.el.classList.add("b10cks-selected"), $(e)) : t.el.classList.remove("b10cks-selected"));
|
|
60
|
+
}, m = ({ selectedItem: o }) => {
|
|
61
|
+
t.el && (o === c ? t.el.classList.add("b10cks-hover") : t.el.classList.remove("b10cks-hover"));
|
|
62
|
+
}, d = ({ content: o }) => {
|
|
63
|
+
if (o && o.id === c) {
|
|
64
|
+
const b = t.ctx;
|
|
65
|
+
b.parent.attrs.block = o, b.update(), b.props.block = o, b.update();
|
|
117
66
|
}
|
|
118
67
|
};
|
|
119
|
-
e.addEventListener("click",
|
|
120
|
-
e.removeEventListener("click",
|
|
68
|
+
e.addEventListener("click", f), v.on("SELECT_UPDATE", k), v.on("HOVER_UPDATE", m), v.on("CONTENT_UPDATE", d), e._editableCleanup = () => {
|
|
69
|
+
e.removeEventListener("click", f);
|
|
121
70
|
};
|
|
122
71
|
},
|
|
123
|
-
updated(e,
|
|
124
|
-
|
|
72
|
+
updated(e, r, t) {
|
|
73
|
+
v.isInPreviewMode() && r.value !== r.oldValue && (e._editableCleanup && e._editableCleanup(), D.mounted(e, r, t));
|
|
125
74
|
},
|
|
126
75
|
unmounted(e) {
|
|
127
|
-
|
|
76
|
+
v.isInPreviewMode() && (e._editableCleanup && (e._editableCleanup(), delete e._editableCleanup), e.classList.remove("b10cks-preview", "b10cks-selected"));
|
|
128
77
|
}
|
|
129
78
|
};
|
|
130
|
-
function
|
|
79
|
+
function $(e) {
|
|
131
80
|
e.scrollIntoView && e.scrollIntoView({ behavior: "smooth" });
|
|
132
81
|
}
|
|
133
|
-
if (
|
|
82
|
+
if (v.isInPreviewMode()) {
|
|
134
83
|
const e = document.createElement("style");
|
|
135
84
|
e.innerHTML = `
|
|
136
85
|
.b10cks-hover,
|
|
@@ -144,21 +93,160 @@ if (r.isInPreviewMode()) {
|
|
|
144
93
|
}
|
|
145
94
|
`, document.head.appendChild(e);
|
|
146
95
|
}
|
|
147
|
-
const
|
|
148
|
-
mounted(e,
|
|
149
|
-
const { id:
|
|
150
|
-
|
|
151
|
-
|
|
96
|
+
const K = {
|
|
97
|
+
mounted(e, r) {
|
|
98
|
+
const { id: t, field: c } = r.value;
|
|
99
|
+
v.isInPreviewMode() && (e.setAttribute("contenteditable", "true"), e.addEventListener("input", (f) => {
|
|
100
|
+
v.updateField(t, c, f.target.innerText);
|
|
152
101
|
}));
|
|
153
102
|
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
|
|
103
|
+
};
|
|
104
|
+
function j() {
|
|
105
|
+
const e = w(R, null);
|
|
106
|
+
if (!e)
|
|
107
|
+
throw new Error(
|
|
108
|
+
"B10cks data API was not found in Vue injection context. Install B10cksVue with API options or provide B10cksDataApiKey manually."
|
|
109
|
+
);
|
|
110
|
+
return e;
|
|
111
|
+
}
|
|
112
|
+
function q() {
|
|
113
|
+
return w(_, null);
|
|
114
|
+
}
|
|
115
|
+
function X() {
|
|
116
|
+
const e = j(), r = q();
|
|
117
|
+
function t(a, i = {}) {
|
|
118
|
+
const { immediate: l = !0, params: n = {}, transform: s } = i;
|
|
119
|
+
return p(async () => {
|
|
120
|
+
const u = await e.getResource(a, n);
|
|
121
|
+
return s ? s(u) : u;
|
|
122
|
+
}, l);
|
|
123
|
+
}
|
|
124
|
+
function c(a, i = {}) {
|
|
125
|
+
const { immediate: l = !1, params: n = {}, transform: s } = i;
|
|
126
|
+
return p(async () => {
|
|
127
|
+
const u = await e.getCollection(a, n);
|
|
128
|
+
return s ? s(u) : u;
|
|
129
|
+
}, l);
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
useApiResource: t,
|
|
133
|
+
useApiCollection: c,
|
|
134
|
+
useContent: (a, i = {}, l = {}) => {
|
|
135
|
+
const { immediate: n = !0, transform: s } = l;
|
|
136
|
+
return p(async () => {
|
|
137
|
+
const u = await e.getContent(a, i);
|
|
138
|
+
return s ? s(u) : u;
|
|
139
|
+
}, n);
|
|
140
|
+
},
|
|
141
|
+
useContents: (a = {}, i = {}) => {
|
|
142
|
+
const { immediate: l = !1, transform: n } = i;
|
|
143
|
+
return p(async () => {
|
|
144
|
+
const s = await e.getContents(a);
|
|
145
|
+
return n ? n(s) : s;
|
|
146
|
+
}, l);
|
|
147
|
+
},
|
|
148
|
+
useBlocks: (a = {}, i = {}) => {
|
|
149
|
+
const { immediate: l = !1, transform: n } = i;
|
|
150
|
+
return p(async () => {
|
|
151
|
+
const s = await e.getBlocks(a);
|
|
152
|
+
return n ? n(s) : s;
|
|
153
|
+
}, l);
|
|
154
|
+
},
|
|
155
|
+
useDataEntries: (a, i = {}, l = {}) => {
|
|
156
|
+
const { immediate: n = !1, transform: s } = l;
|
|
157
|
+
return p(async () => {
|
|
158
|
+
const u = await e.getDataEntries(a, i);
|
|
159
|
+
return s ? s(u) : u;
|
|
160
|
+
}, n);
|
|
161
|
+
},
|
|
162
|
+
useDataSources: (a = {}) => {
|
|
163
|
+
const { immediate: i = !1, params: l = {}, transform: n } = a;
|
|
164
|
+
return p(async () => {
|
|
165
|
+
const s = await e.getDataSources(l);
|
|
166
|
+
return n ? n(s) : s;
|
|
167
|
+
}, i);
|
|
168
|
+
},
|
|
169
|
+
useSpace: (a = {}) => {
|
|
170
|
+
const { immediate: i = !0, params: l = {}, transform: n } = a;
|
|
171
|
+
return p(async () => {
|
|
172
|
+
const s = await e.getSpace(l);
|
|
173
|
+
return n ? n(s) : s;
|
|
174
|
+
}, i);
|
|
175
|
+
},
|
|
176
|
+
useRedirects: (a = {}) => {
|
|
177
|
+
const { immediate: i = !0, params: l = {}, transform: n, forceRefresh: s = !1 } = a;
|
|
178
|
+
return p(async () => {
|
|
179
|
+
const u = await e.getRedirects(l, s);
|
|
180
|
+
return n ? n(u) : u;
|
|
181
|
+
}, i);
|
|
182
|
+
},
|
|
183
|
+
useB10cksConfig: (a = {}, i = {}) => {
|
|
184
|
+
const { immediate: l = !0 } = i, n = p(() => e.getConfig(a), l);
|
|
185
|
+
return {
|
|
186
|
+
...n,
|
|
187
|
+
config: y(() => n.data.value ?? {})
|
|
188
|
+
};
|
|
189
|
+
},
|
|
190
|
+
syncRevision: async (a) => e.syncRevision(a),
|
|
191
|
+
dataApi: e,
|
|
192
|
+
client: r
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
function p(e, r) {
|
|
196
|
+
const t = C(null), c = C(!1), f = C(null), k = async () => {
|
|
197
|
+
c.value = !0, f.value = null;
|
|
198
|
+
try {
|
|
199
|
+
const m = await e();
|
|
200
|
+
return t.value = m, m;
|
|
201
|
+
} catch (m) {
|
|
202
|
+
const d = m instanceof Error ? m : new Error(`B10cks request failed: ${String(m)}`);
|
|
203
|
+
throw f.value = d, d;
|
|
204
|
+
} finally {
|
|
205
|
+
c.value = !1;
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
return r && k(), {
|
|
209
|
+
data: t,
|
|
210
|
+
pending: c,
|
|
211
|
+
error: f,
|
|
212
|
+
execute: k,
|
|
213
|
+
refresh: k
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
const Y = {
|
|
217
|
+
install(e, r = {}) {
|
|
218
|
+
e.provide("b10cksVueOptions", r), e.directive("editable", D), e.directive("editable-field", K), e.component("B10cksComponent", N), v.isInPreviewMode() && v.init();
|
|
219
|
+
const t = F(r), c = r.dataApi || (t ? g(t) : null);
|
|
220
|
+
t && e.provide(_, t), c && e.provide(R, c);
|
|
157
221
|
}
|
|
158
222
|
};
|
|
223
|
+
function F(e) {
|
|
224
|
+
if (e.client)
|
|
225
|
+
return e.client;
|
|
226
|
+
const r = e.apiClientOptions || H(e);
|
|
227
|
+
return r ? new I(r, e.requestUrl) : null;
|
|
228
|
+
}
|
|
229
|
+
function H(e) {
|
|
230
|
+
const r = e.token || e.accessToken, t = e.baseUrl || e.apiUrl;
|
|
231
|
+
return !r || !t ? null : {
|
|
232
|
+
token: r,
|
|
233
|
+
baseUrl: t,
|
|
234
|
+
rv: e.rv,
|
|
235
|
+
version: e.version,
|
|
236
|
+
fetchClient: e.fetchClient,
|
|
237
|
+
getRv: e.getRv,
|
|
238
|
+
setRv: e.setRv
|
|
239
|
+
};
|
|
240
|
+
}
|
|
159
241
|
export {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
242
|
+
_ as B10cksClientKey,
|
|
243
|
+
M as B10cksComponentResolverKey,
|
|
244
|
+
R as B10cksDataApiKey,
|
|
245
|
+
B as B10cksFallback,
|
|
246
|
+
Y as B10cksVue,
|
|
247
|
+
ee as previewBridge,
|
|
248
|
+
X as useB10cksApi,
|
|
249
|
+
q as useB10cksClient,
|
|
250
|
+
j as useB10cksDataApi
|
|
163
251
|
};
|
|
164
252
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/types.ts","../src/components/B10cksComponent.vue","../src/preview-bridge.ts","../src/directives/v-editable.ts","../src/directives/v-editable-content.ts","../src/index.ts"],"sourcesContent":["import type { B10cksApiClientOptions } from '@b10cks/client'\nimport type { Component, InjectionKey } from 'vue'\n\nexport interface B10cksVuePluginOptions extends B10cksApiClientOptions {}\n\nexport type BlockComponentResolver = (componentName: string) => Promise<Component>\n\nexport const B10cksComponentResolverKey: InjectionKey<BlockComponentResolver> = Symbol(\n 'b10cks:resolveBlockComponent'\n)\n","<script setup lang=\"ts\">\nimport type { IBContent } from '@b10cks/client'\nimport { computed, defineAsyncComponent, inject, shallowRef, useTemplateRef, watch } from 'vue'\n\nimport { B10cksComponentResolverKey } from '../types'\n\nconst props = defineProps<{\n block: IBContent<string> & Record<string, never>\n}>()\n\nconst blockRef = useTemplateRef('blockRef')\ndefineExpose({ value: blockRef })\n\nconst resolvedComponent = shallowRef<ReturnType<typeof defineAsyncComponent> | null>(null)\nconst componentName = computed(() => props.block?.block || null)\n\nconst resolveBlockComponent = inject(B10cksComponentResolverKey, null)\n\nwatch(\n () => componentName.value,\n async (newComponentName: string | null) => {\n if (!newComponentName) {\n resolvedComponent.value = null\n return\n }\n\n if (!resolveBlockComponent) {\n // biome-ignore lint/suspicious/noConsole: give developers feedback\n console.error(\n 'B10cks: No component resolver found. Make sure you are using @b10cks/nuxt module or have provided a custom resolver.'\n )\n resolvedComponent.value = null\n return\n }\n\n try {\n resolvedComponent.value = await resolveBlockComponent(newComponentName)\n } catch (error) {\n // biome-ignore lint/suspicious/noConsole: give developers feedback\n console.warn(`Failed to load block component for type \"${newComponentName}\":`, error)\n resolvedComponent.value = null\n }\n },\n { immediate: true }\n)\n</script>\n<template>\n <component\n :is=\"resolvedComponent\"\n v-if=\"resolvedComponent\"\n ref=\"blockRef\"\n v-bind=\"{ ...$props, ...$attrs }\"\n />\n <div v-else>Component for block type \"{{ componentName }}\" not found.</div>\n</template>\n","export type ContentUpdateEvent = {\n content: Record<string, unknown>\n}\n\nexport type SelectUpdateEvent = {\n selectedItem: string\n}\n\nexport type EventType = 'CONTENT_UPDATE' | 'SELECT_UPDATE' | 'HOVER_UPDATE'\n\nexport type EventPayloadMap = {\n CONTENT_UPDATE: ContentUpdateEvent\n SELECT_UPDATE: SelectUpdateEvent\n HOVER_UPDATE: SelectUpdateEvent\n}\n\nexport type BridgeEvent = {\n type: EventType\n payload: ContentUpdateEvent | SelectUpdateEvent\n b10cksId?: string\n}\n\ntype EventCallback<T> = (payload: T) => void\n\nclass PreviewBridge {\n private static instance: PreviewBridge\n private eventListeners: {\n [key in EventType]?: Array<EventCallback<EventPayloadMap[key]>>\n } = {}\n\n private isEnabled = false\n\n private constructor() {\n this.isEnabled = this.isIframe()\n }\n\n public init(): void {\n if (this.isEnabled && window) {\n window.addEventListener('message', this.handleMessage)\n }\n }\n\n public static getInstance(): PreviewBridge {\n if (!PreviewBridge.instance) {\n PreviewBridge.instance = new PreviewBridge()\n }\n return PreviewBridge.instance\n }\n\n public isInPreviewMode(): boolean {\n return this.isEnabled\n }\n\n private isIframe(): boolean {\n return typeof window !== 'undefined' && window.self !== window.top\n }\n\n private handleMessage = (event: MessageEvent): void => {\n if (!event.data || typeof event.data !== 'object') return\n const { type, payload } = event.data as BridgeEvent\n\n this.notifyListeners(type as EventType, payload)\n }\n\n private notifyListeners<T extends EventType>(type: T, payload: EventPayloadMap[T]): void {\n const listeners = this.eventListeners[type] as\n | Array<EventCallback<EventPayloadMap[T]>>\n | undefined\n\n if (listeners) {\n listeners.forEach((listener) => {\n listener(payload)\n })\n }\n }\n\n public on<T extends EventType>(\n eventType: T,\n callback: EventCallback<EventPayloadMap[T]>\n ): () => void {\n if (!this.isEnabled) return () => {}\n\n if (!this.eventListeners[eventType]) {\n this.eventListeners[eventType] = []\n }\n\n ;(this.eventListeners[eventType] as Array<EventCallback<EventPayloadMap[T]>>).push(callback)\n\n return () => {\n this.eventListeners[eventType] = (\n this.eventListeners[eventType] as Array<EventCallback<EventPayloadMap[T]>>\n ).filter((listener) => listener !== callback) as never\n }\n }\n\n public selectItem(selectedItem: string): void {\n if (!this.isEnabled) return\n\n window.parent.postMessage(\n {\n type: 'SELECT_UPDATE',\n payload: { selectedItem },\n },\n '*'\n )\n }\n\n public updateField(itemId: string, field: string, value: string): void {\n if (!this.isEnabled) return\n\n window.parent.postMessage(\n {\n type: 'FIELD_UPDATE',\n payload: { itemId, field, value },\n },\n '*'\n )\n }\n\n public destroy(): void {\n if (this.isEnabled) {\n window.removeEventListener('message', this.handleMessage)\n this.isEnabled = false\n }\n this.eventListeners = {}\n }\n}\n\nexport const previewBridge = PreviewBridge.getInstance()\n","import type { DirectiveBinding, VNode } from 'vue'\n\nimport type { SelectUpdateEvent } from '../preview-bridge'\n\nimport { previewBridge } from '../preview-bridge'\n\ninterface EditableElement extends HTMLElement {\n _editableCleanup?: () => void\n}\n\nexport const EditableDirective = {\n mounted(el: EditableElement, binding: DirectiveBinding, node: VNode) {\n if (!previewBridge.isInPreviewMode()) return\n const { id: itemId } = binding.value\n\n if (!itemId) {\n // biome-ignore lint/suspicious/noConsole: give developers feedback\n console.warn('v-editable directive requires a block with an id')\n return\n }\n\n el.classList.add('b10cks-preview')\n\n const handleClick = (e: MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n previewBridge.selectItem(itemId)\n }\n\n const handleSelectionChange = ({ selectedItem }: SelectUpdateEvent) => {\n if (!node.el) return\n\n if (selectedItem === itemId) {\n node.el.classList.add('b10cks-selected')\n scrollIntoViewIfNeeded(el)\n } else {\n node.el.classList.remove('b10cks-selected')\n }\n }\n\n const handleHoverChange = ({ selectedItem }: SelectUpdateEvent) => {\n if (!node.el) return\n\n if (selectedItem === itemId) {\n node.el.classList.add('b10cks-hover')\n } else {\n node.el.classList.remove('b10cks-hover')\n }\n }\n\n const handleUpdate = ({ content }: { content: any }) => {\n if (content && content.id === itemId) {\n // biome-ignore lint/suspicious/noExplicitAny: use of any to access internal properties\n const ctx = (node as any).ctx\n ctx.parent.attrs.block = content\n ctx.update()\n ctx.props.block = content\n ctx.update()\n }\n }\n\n el.addEventListener('click', handleClick)\n previewBridge.on('SELECT_UPDATE', handleSelectionChange)\n previewBridge.on('HOVER_UPDATE', handleHoverChange)\n previewBridge.on('CONTENT_UPDATE', handleUpdate)\n\n el._editableCleanup = () => {\n el.removeEventListener('click', handleClick)\n }\n },\n\n updated(el: EditableElement, binding: DirectiveBinding, vnode: VNode) {\n if (!previewBridge.isInPreviewMode()) return\n\n if (binding.value !== binding.oldValue) {\n if (el._editableCleanup) {\n el._editableCleanup()\n }\n\n EditableDirective.mounted(el, binding, vnode)\n }\n },\n\n unmounted(el: EditableElement) {\n if (!previewBridge.isInPreviewMode()) return\n\n if (el._editableCleanup) {\n el._editableCleanup()\n delete el._editableCleanup\n }\n\n el.classList.remove('b10cks-preview', 'b10cks-selected')\n },\n}\n\nfunction scrollIntoViewIfNeeded(el: HTMLElement) {\n if (el.scrollIntoView) {\n el.scrollIntoView({ behavior: 'smooth' })\n }\n}\n\nif (previewBridge.isInPreviewMode()) {\n const style = document.createElement('style')\n style.innerHTML = `\n .b10cks-hover,\n .b10cks-preview:hover {\n outline: 2px dashed rgba(59, 130, 246, 0.5);\n outline-offset: 2px;\n }\n .b10cks-selected {\n outline: 2px solid rgb(59, 130, 246) !important;\n outline-offset: 2px;\n }\n `\n document.head.appendChild(style)\n}\n","import type { Directive, DirectiveBinding } from 'vue'\n\nimport { previewBridge } from '../preview-bridge'\n\nexport const EditableContentDirective: Directive<HTMLElement> = {\n mounted(el: HTMLElement, binding: DirectiveBinding) {\n const { id: itemId, field } = binding.value\n if (!previewBridge.isInPreviewMode()) return\n el.setAttribute('contenteditable', 'true')\n\n el.addEventListener('input', (event: Event) => {\n previewBridge.updateField(itemId, field, (event.target as HTMLInputElement).innerText)\n })\n },\n}\n","import type { Plugin } from 'vue'\n\nimport type { B10cksVuePluginOptions } from './types'\n\nimport B10cksComponent from './components/B10cksComponent.vue'\nimport { EditableDirective } from './directives/v-editable'\nimport { EditableContentDirective } from './directives/v-editable-content'\n\nexport { previewBridge } from './preview-bridge'\nexport { B10cksComponentResolverKey, type BlockComponentResolver } from './types'\n\nexport const B10cksVue: Plugin = {\n install(app, pluginOptions: B10cksVuePluginOptions) {\n app.provide('b10cksVueOptions', pluginOptions)\n\n app.directive('editable', EditableDirective)\n app.directive('editable-field', EditableContentDirective)\n app.component('B10cksComponent', B10cksComponent)\n },\n}\n"],"names":["B10cksComponentResolverKey","props","__props","blockRef","useTemplateRef","__expose","resolvedComponent","shallowRef","componentName","computed","resolveBlockComponent","inject","watch","newComponentName","error","_createBlock","_resolveDynamicComponent","_mergeProps","$props","$attrs","_openBlock","_createElementBlock","_hoisted_1","_toDisplayString","PreviewBridge","event","type","payload","listeners","listener","eventType","callback","selectedItem","itemId","field","value","previewBridge","EditableDirective","el","binding","node","handleClick","e","handleSelectionChange","scrollIntoViewIfNeeded","handleHoverChange","handleUpdate","content","ctx","vnode","style","EditableContentDirective","B10cksVue","app","pluginOptions","B10cksComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/types.ts","../src/components/B10cksFallback.vue","../src/components/B10cksComponent.vue","../src/directives/v-editable.ts","../src/directives/v-editable-content.ts","../src/api.ts","../src/index.ts"],"sourcesContent":["import type { ApiClient, B10cksApiClientOptions, B10cksDataApi, FetchClient } from '@b10cks/client'\nimport type { Component, InjectionKey } from 'vue'\n\nexport interface B10cksVuePluginOptions {\n apiClientOptions?: B10cksApiClientOptions\n client?: ApiClient\n dataApi?: B10cksDataApi\n requestUrl?: URL | string\n token?: string\n baseUrl?: string\n accessToken?: string\n apiUrl?: string\n version?: 'draft' | 'published'\n rv?: string | number\n fetchClient?: FetchClient\n getRv?: () => string | number\n setRv?: (value: string | number) => void\n}\n\nexport type BlockComponentResolver = (componentName: string) => Promise<Component>\n\nexport const B10cksComponentResolverKey: InjectionKey<BlockComponentResolver> = Symbol(\n 'b10cks:resolveBlockComponent'\n)\n\nexport const B10cksClientKey: InjectionKey<ApiClient> = Symbol('b10cks:client')\nexport const B10cksDataApiKey: InjectionKey<B10cksDataApi> = Symbol('b10cks:data-api')\n","<script setup lang=\"ts\">\nimport type { IBContent } from '@b10cks/client'\n\nexport interface IB10cksFallbackProps {\n block: IBContent<string> & Record<string, never>\n}\n\ndefineProps<IB10cksFallbackProps>()\n</script>\n\n<template>\n <div>Component for block type \"{{ block.block }}\" not found.</div>\n</template>\n","<script setup lang=\"ts\">\nimport type { IBContent } from '@b10cks/client'\nimport {\n computed,\n defineAsyncComponent,\n inject,\n resolveDynamicComponent,\n useTemplateRef,\n} from 'vue'\n\nimport { B10cksComponentResolverKey } from '../types'\nimport B10cksFallback from './B10cksFallback.vue'\n\nconst props = defineProps<{\n block: IBContent<string> & Record<string, never>\n}>()\n\nconst blockRef = useTemplateRef('blockRef')\ndefineExpose({ value: blockRef })\n\nconst customResolver = inject(B10cksComponentResolverKey, null)\n\n// Convert component name to PascalCase synchronously\nfunction toPascalCase(name: string): string {\n return name\n .split(/[-_]/)\n .map((part: string) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('')\n .replace(/^([a-z])/, (match: string) => match.toUpperCase())\n}\n\n// Compute the component synchronously for SSR compatibility\nconst resolvedComponent = computed(() => {\n const componentName = props.block?.block\n\n if (!componentName) {\n return null\n }\n\n const pascalCaseName = toPascalCase(componentName)\n\n // Use Vue's built-in resolveDynamicComponent which works in SSR\n // This resolves globally registered components automatically\n const component = resolveDynamicComponent(pascalCaseName)\n\n // resolveDynamicComponent returns a string if component not found\n if (typeof component === 'string') {\n if (customResolver) {\n return defineAsyncComponent(async () => {\n try {\n return await customResolver(pascalCaseName)\n } catch {\n return B10cksFallback\n }\n })\n }\n\n // biome-ignore lint/suspicious/noConsole: give developers feedback\n console.warn(\n `Component \"${pascalCaseName}\" not found. Make sure it's registered in your components directory.`\n )\n return B10cksFallback\n }\n\n return component\n})\n\nconst componentName = computed(() => props.block?.block || null)\n</script>\n\n<template>\n <component\n :is=\"resolvedComponent\"\n v-if=\"resolvedComponent\"\n ref=\"blockRef\"\n v-bind=\"{ ...$props, ...$attrs }\"\n />\n</template>\n","import type { DirectiveBinding, VNode } from 'vue'\n\nimport type { SelectUpdateEvent } from '../preview-bridge'\n\nimport { previewBridge } from '../preview-bridge'\n\ninterface EditableElement extends HTMLElement {\n _editableCleanup?: () => void\n}\n\nexport const EditableDirective = {\n mounted(el: EditableElement, binding: DirectiveBinding, node: VNode) {\n if (!previewBridge.isInPreviewMode()) return\n const { id: itemId } = binding.value\n\n if (!itemId) {\n // biome-ignore lint/suspicious/noConsole: give developers feedback\n console.warn('v-editable directive requires a block with an id')\n return\n }\n\n el.classList.add('b10cks-preview')\n\n const handleClick = (e: MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n previewBridge.selectItem(itemId)\n }\n\n const handleSelectionChange = ({ selectedItem }: SelectUpdateEvent) => {\n if (!node.el) return\n\n if (selectedItem === itemId) {\n node.el.classList.add('b10cks-selected')\n scrollIntoViewIfNeeded(el)\n } else {\n node.el.classList.remove('b10cks-selected')\n }\n }\n\n const handleHoverChange = ({ selectedItem }: SelectUpdateEvent) => {\n if (!node.el) return\n\n if (selectedItem === itemId) {\n node.el.classList.add('b10cks-hover')\n } else {\n node.el.classList.remove('b10cks-hover')\n }\n }\n\n const handleUpdate = ({ content }: { content: any }) => {\n if (content && content.id === itemId) {\n // biome-ignore lint/suspicious/noExplicitAny: use of any to access internal properties\n const ctx = (node as any).ctx\n ctx.parent.attrs.block = content\n ctx.update()\n ctx.props.block = content\n ctx.update()\n }\n }\n\n el.addEventListener('click', handleClick)\n previewBridge.on('SELECT_UPDATE', handleSelectionChange)\n previewBridge.on('HOVER_UPDATE', handleHoverChange)\n previewBridge.on('CONTENT_UPDATE', handleUpdate)\n\n el._editableCleanup = () => {\n el.removeEventListener('click', handleClick)\n }\n },\n\n updated(el: EditableElement, binding: DirectiveBinding, vnode: VNode) {\n if (!previewBridge.isInPreviewMode()) return\n\n if (binding.value !== binding.oldValue) {\n if (el._editableCleanup) {\n el._editableCleanup()\n }\n\n EditableDirective.mounted(el, binding, vnode)\n }\n },\n\n unmounted(el: EditableElement) {\n if (!previewBridge.isInPreviewMode()) return\n\n if (el._editableCleanup) {\n el._editableCleanup()\n delete el._editableCleanup\n }\n\n el.classList.remove('b10cks-preview', 'b10cks-selected')\n },\n}\n\nfunction scrollIntoViewIfNeeded(el: HTMLElement) {\n if (el.scrollIntoView) {\n el.scrollIntoView({ behavior: 'smooth' })\n }\n}\n\nif (previewBridge.isInPreviewMode()) {\n const style = document.createElement('style')\n style.innerHTML = `\n .b10cks-hover,\n .b10cks-preview:hover {\n outline: 2px dashed rgba(59, 130, 246, 0.5);\n outline-offset: 2px;\n }\n .b10cks-selected {\n outline: 2px solid rgb(59, 130, 246) !important;\n outline-offset: 2px;\n }\n `\n document.head.appendChild(style)\n}\n","import type { Directive, DirectiveBinding } from 'vue'\n\nimport { previewBridge } from '../preview-bridge'\n\nexport const EditableContentDirective: Directive<HTMLElement> = {\n mounted(el: HTMLElement, binding: DirectiveBinding) {\n const { id: itemId, field } = binding.value\n if (!previewBridge.isInPreviewMode()) return\n el.setAttribute('contenteditable', 'true')\n\n el.addEventListener('input', (event: Event) => {\n previewBridge.updateField(itemId, field, (event.target as HTMLInputElement).innerText)\n })\n },\n}\n","import type {\n B10cksDataApi,\n Endpoint,\n GetConfigOptions,\n IBBaseQueryParams,\n IBBlock,\n IBContent,\n IBContentQueryParams,\n IBDataEntry,\n IBDataSource,\n RedirectMap,\n IBSpace,\n} from '@b10cks/client'\n\nimport { computed, inject, ref, type Ref } from 'vue'\n\nimport { B10cksClientKey, B10cksDataApiKey } from './types'\n\ntype QueryParams = Omit<IBBaseQueryParams, 'token'>\n\nexport interface UseB10cksApiOptions<T, P extends QueryParams = QueryParams> {\n immediate?: boolean\n params?: P\n transform?: (value: T) => T\n}\n\nexport interface AsyncState<T> {\n data: import('vue').Ref<T | null>\n pending: import('vue').Ref<boolean>\n error: import('vue').Ref<Error | null>\n execute: () => Promise<T>\n refresh: () => Promise<T>\n}\n\nexport interface UseB10cksConfigResult<T> extends AsyncState<T> {\n config: import('vue').ComputedRef<T>\n}\n\nexport function useB10cksDataApi(): B10cksDataApi {\n const dataApi = inject(B10cksDataApiKey, null)\n if (!dataApi) {\n throw new Error(\n 'B10cks data API was not found in Vue injection context. Install B10cksVue with API options or provide B10cksDataApiKey manually.'\n )\n }\n\n return dataApi\n}\n\nexport function useB10cksClient() {\n return inject(B10cksClientKey, null)\n}\n\nexport function useB10cksApi() {\n const dataApi = useB10cksDataApi()\n const client = useB10cksClient()\n\n function useApiResource<T>(\n endpoint: Endpoint,\n options: UseB10cksApiOptions<T> = {}\n ): AsyncState<T> {\n const { immediate = true, params = {}, transform } = options\n return createAsyncState(async () => {\n const value = await dataApi.getResource<T>(endpoint, params)\n return transform ? transform(value) : value\n }, immediate)\n }\n\n function useApiCollection<T>(\n endpoint: Endpoint,\n options: UseB10cksApiOptions<T[], QueryParams> = {}\n ): AsyncState<T[]> {\n const { immediate = false, params = {}, transform } = options\n return createAsyncState(async () => {\n const value = await dataApi.getCollection<T>(endpoint, params)\n return transform ? transform(value) : value\n }, immediate)\n }\n\n const useContent = <T = Record<string, unknown>>(\n fullSlug: string,\n params: Omit<IBContentQueryParams, 'token' | 'full_slug'> = {},\n options: Omit<UseB10cksApiOptions<IBContent<T>>, 'params'> = {}\n ): AsyncState<IBContent<T>> => {\n const { immediate = true, transform } = options\n return createAsyncState(async () => {\n const value = await dataApi.getContent<T>(fullSlug, params)\n return transform ? transform(value) : value\n }, immediate)\n }\n\n const useContents = <T = Record<string, unknown>>(\n params: Omit<IBContentQueryParams, 'token'> = {},\n options: Omit<UseB10cksApiOptions<IBContent<T>[]>, 'params'> = {}\n ): AsyncState<IBContent<T>[]> => {\n const { immediate = false, transform } = options\n return createAsyncState(async () => {\n const value = await dataApi.getContents<T>(params)\n return transform ? transform(value) : value\n }, immediate)\n }\n\n const useBlocks = (\n params: QueryParams = {},\n options: Omit<UseB10cksApiOptions<IBBlock[]>, 'params'> = {}\n ): AsyncState<IBBlock[]> => {\n const { immediate = false, transform } = options\n return createAsyncState(async () => {\n const value = await dataApi.getBlocks(params)\n return transform ? transform(value) : value\n }, immediate)\n }\n\n const useDataEntries = (\n source: string,\n params: QueryParams = {},\n options: Omit<UseB10cksApiOptions<IBDataEntry[]>, 'params'> = {}\n ): AsyncState<IBDataEntry[]> => {\n const { immediate = false, transform } = options\n return createAsyncState(async () => {\n const value = await dataApi.getDataEntries(source, params)\n return transform ? transform(value) : value\n }, immediate)\n }\n\n const useDataSources = (\n options: UseB10cksApiOptions<IBDataSource[]> = {}\n ): AsyncState<IBDataSource[]> => {\n const { immediate = false, params = {}, transform } = options\n return createAsyncState(async () => {\n const value = await dataApi.getDataSources(params)\n return transform ? transform(value) : value\n }, immediate)\n }\n\n const useSpace = (options: UseB10cksApiOptions<IBSpace> = {}): AsyncState<IBSpace> => {\n const { immediate = true, params = {}, transform } = options\n return createAsyncState(async () => {\n const value = await dataApi.getSpace(params)\n return transform ? transform(value) : value\n }, immediate)\n }\n\n const useRedirects = (\n options: UseB10cksApiOptions<RedirectMap> & { forceRefresh?: boolean } = {}\n ): AsyncState<RedirectMap> => {\n const { immediate = true, params = {}, transform, forceRefresh = false } = options\n return createAsyncState(async () => {\n const value = await dataApi.getRedirects(params, forceRefresh)\n return transform ? transform(value) : value\n }, immediate)\n }\n\n const useB10cksConfig = <T = Record<string, unknown>>(\n options: GetConfigOptions = {},\n executionOptions: { immediate?: boolean } = {}\n ): UseB10cksConfigResult<T> => {\n const { immediate = true } = executionOptions\n const state = createAsyncState<T>(() => dataApi.getConfig<T>(options), immediate)\n\n return {\n ...state,\n config: computed(() => state.data.value ?? ({} as T)),\n }\n }\n\n const syncRevision = async (fallbackRv?: number) => dataApi.syncRevision(fallbackRv)\n\n return {\n useApiResource,\n useApiCollection,\n useContent,\n useContents,\n useBlocks,\n useDataEntries,\n useDataSources,\n useSpace,\n useRedirects,\n useB10cksConfig,\n syncRevision,\n dataApi,\n client,\n }\n}\n\nfunction createAsyncState<T>(fetcher: () => Promise<T>, immediate: boolean): AsyncState<T> {\n const data = ref<T | null>(null) as Ref<T | null>\n const pending = ref(false)\n const error = ref<Error | null>(null)\n\n const execute = async (): Promise<T> => {\n pending.value = true\n error.value = null\n\n try {\n const value = await fetcher()\n data.value = value\n return value\n } catch (caughtError) {\n const normalizedError =\n caughtError instanceof Error\n ? caughtError\n : new Error(`B10cks request failed: ${String(caughtError)}`)\n error.value = normalizedError\n throw normalizedError\n } finally {\n pending.value = false\n }\n }\n\n if (immediate) {\n void execute()\n }\n\n return {\n data,\n pending,\n error,\n execute,\n refresh: execute,\n }\n}\n","import type { Plugin } from 'vue'\n\nimport { ApiClient, createB10cksDataApi, previewBridge } from '@b10cks/client'\n\nimport type { B10cksVuePluginOptions } from './types'\n\nimport B10cksComponent from './components/B10cksComponent.vue'\nimport B10cksFallback from './components/B10cksFallback.vue'\nimport { EditableDirective } from './directives/v-editable'\nimport { EditableContentDirective } from './directives/v-editable-content'\nimport { B10cksClientKey, B10cksDataApiKey } from './types'\n\nexport { previewBridge } from '@b10cks/client'\nexport * from './api'\nexport {\n B10cksClientKey,\n B10cksComponentResolverKey,\n B10cksDataApiKey,\n type BlockComponentResolver,\n} from './types'\nexport { B10cksFallback }\n\nexport const B10cksVue: Plugin = {\n install(app, pluginOptions: B10cksVuePluginOptions = {}) {\n app.provide('b10cksVueOptions', pluginOptions)\n\n app.directive('editable', EditableDirective)\n app.directive('editable-field', EditableContentDirective)\n app.component('B10cksComponent', B10cksComponent)\n\n if (previewBridge.isInPreviewMode()) {\n previewBridge.init()\n }\n\n const client = resolveClient(pluginOptions)\n const dataApi = pluginOptions.dataApi || (client ? createB10cksDataApi(client) : null)\n\n if (client) {\n app.provide(B10cksClientKey, client)\n }\n\n if (dataApi) {\n app.provide(B10cksDataApiKey, dataApi)\n }\n },\n}\n\nfunction resolveClient(pluginOptions: B10cksVuePluginOptions): ApiClient | null {\n if (pluginOptions.client) {\n return pluginOptions.client\n }\n\n const apiClientOptions =\n pluginOptions.apiClientOptions || resolveLegacyApiClientOptions(pluginOptions)\n if (!apiClientOptions) {\n return null\n }\n\n return new ApiClient(apiClientOptions, pluginOptions.requestUrl)\n}\n\nfunction resolveLegacyApiClientOptions(\n pluginOptions: B10cksVuePluginOptions\n): B10cksVuePluginOptions['apiClientOptions'] | null {\n const token = pluginOptions.token || pluginOptions.accessToken\n const baseUrl = pluginOptions.baseUrl || pluginOptions.apiUrl\n\n if (!token || !baseUrl) {\n return null\n }\n\n return {\n token,\n baseUrl,\n rv: pluginOptions.rv,\n version: pluginOptions.version,\n fetchClient: pluginOptions.fetchClient,\n getRv: pluginOptions.getRv,\n setRv: pluginOptions.setRv,\n }\n}\n"],"names":["B10cksComponentResolverKey","B10cksClientKey","B10cksDataApiKey","_openBlock","_createElementBlock","_toDisplayString","__props","props","blockRef","useTemplateRef","__expose","customResolver","inject","toPascalCase","name","part","match","resolvedComponent","computed","componentName","pascalCaseName","component","resolveDynamicComponent","defineAsyncComponent","B10cksFallback","_createBlock","_resolveDynamicComponent","_mergeProps","$props","$attrs","EditableDirective","el","binding","node","previewBridge","itemId","handleClick","e","handleSelectionChange","selectedItem","scrollIntoViewIfNeeded","handleHoverChange","handleUpdate","content","ctx","vnode","style","EditableContentDirective","field","event","useB10cksDataApi","dataApi","useB10cksClient","useB10cksApi","client","useApiResource","endpoint","options","immediate","params","transform","createAsyncState","value","useApiCollection","fullSlug","source","forceRefresh","executionOptions","state","fallbackRv","fetcher","data","ref","pending","error","execute","caughtError","normalizedError","B10cksVue","app","pluginOptions","B10cksComponent","resolveClient","createB10cksDataApi","apiClientOptions","resolveLegacyApiClientOptions","ApiClient","token","baseUrl"],"mappings":"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"}
|
package/dist/preview-bridge.d.ts
CHANGED
|
@@ -1,36 +1,2 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
};
|
|
4
|
-
export type SelectUpdateEvent = {
|
|
5
|
-
selectedItem: string;
|
|
6
|
-
};
|
|
7
|
-
export type EventType = 'CONTENT_UPDATE' | 'SELECT_UPDATE' | 'HOVER_UPDATE';
|
|
8
|
-
export type EventPayloadMap = {
|
|
9
|
-
CONTENT_UPDATE: ContentUpdateEvent;
|
|
10
|
-
SELECT_UPDATE: SelectUpdateEvent;
|
|
11
|
-
HOVER_UPDATE: SelectUpdateEvent;
|
|
12
|
-
};
|
|
13
|
-
export type BridgeEvent = {
|
|
14
|
-
type: EventType;
|
|
15
|
-
payload: ContentUpdateEvent | SelectUpdateEvent;
|
|
16
|
-
b10cksId?: string;
|
|
17
|
-
};
|
|
18
|
-
type EventCallback<T> = (payload: T) => void;
|
|
19
|
-
declare class PreviewBridge {
|
|
20
|
-
private static instance;
|
|
21
|
-
private eventListeners;
|
|
22
|
-
private isEnabled;
|
|
23
|
-
private constructor();
|
|
24
|
-
init(): void;
|
|
25
|
-
static getInstance(): PreviewBridge;
|
|
26
|
-
isInPreviewMode(): boolean;
|
|
27
|
-
private isIframe;
|
|
28
|
-
private handleMessage;
|
|
29
|
-
private notifyListeners;
|
|
30
|
-
on<T extends EventType>(eventType: T, callback: EventCallback<EventPayloadMap[T]>): () => void;
|
|
31
|
-
selectItem(selectedItem: string): void;
|
|
32
|
-
updateField(itemId: string, field: string, value: string): void;
|
|
33
|
-
destroy(): void;
|
|
34
|
-
}
|
|
35
|
-
export declare const previewBridge: PreviewBridge;
|
|
36
|
-
export {};
|
|
1
|
+
export { previewBridge } from '../../client/src';
|
|
2
|
+
export type { BridgeEvent, ContentUpdateEvent, EventPayloadMap, EventType, FieldUpdateEvent, SelectUpdateEvent, } from '../../client/src';
|
package/dist/types.d.ts
CHANGED
|
@@ -1,6 +1,21 @@
|
|
|
1
|
-
import { B10cksApiClientOptions } from '../../client/src';
|
|
1
|
+
import { ApiClient, B10cksApiClientOptions, B10cksDataApi, FetchClient } from '../../client/src';
|
|
2
2
|
import { Component, InjectionKey } from 'vue';
|
|
3
|
-
export interface B10cksVuePluginOptions
|
|
3
|
+
export interface B10cksVuePluginOptions {
|
|
4
|
+
apiClientOptions?: B10cksApiClientOptions;
|
|
5
|
+
client?: ApiClient;
|
|
6
|
+
dataApi?: B10cksDataApi;
|
|
7
|
+
requestUrl?: URL | string;
|
|
8
|
+
token?: string;
|
|
9
|
+
baseUrl?: string;
|
|
10
|
+
accessToken?: string;
|
|
11
|
+
apiUrl?: string;
|
|
12
|
+
version?: 'draft' | 'published';
|
|
13
|
+
rv?: string | number;
|
|
14
|
+
fetchClient?: FetchClient;
|
|
15
|
+
getRv?: () => string | number;
|
|
16
|
+
setRv?: (value: string | number) => void;
|
|
4
17
|
}
|
|
5
18
|
export type BlockComponentResolver = (componentName: string) => Promise<Component>;
|
|
6
19
|
export declare const B10cksComponentResolverKey: InjectionKey<BlockComponentResolver>;
|
|
20
|
+
export declare const B10cksClientKey: InjectionKey<ApiClient>;
|
|
21
|
+
export declare const B10cksDataApiKey: InjectionKey<B10cksDataApi>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@b10cks/vue",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "SDK to integrate b10cks into your vue applications",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Michael Wallner @ Coder's Cantina",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"access": "public"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@b10cks/client": "^0.
|
|
31
|
+
"@b10cks/client": "^1.0.0"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"typescript": "^5.9.3",
|