@b10cks/vue 0.10.5 → 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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # @b10cks/vue
2
2
 
3
- Vue 3 SDK for integrating b10cks into your Vue applications.
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 app from './App.vue'
18
+ import App from './App.vue'
19
19
 
20
20
  const app = createApp(App)
21
21
 
22
22
  app.use(B10cksVue, {
23
- accessToken: 'your-access-token',
24
- apiUrl: 'https://api.b10cks.com/api',
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
- ### Directives
32
+ ### Data Composables
31
33
 
32
- #### `v-editable`
34
+ ```typescript
35
+ import { useB10cksApi } from '@b10cks/vue'
33
36
 
34
- Mark content as editable within the b10cks editor.
37
+ const { useContent, useBlocks } = useB10cksApi()
35
38
 
36
- ```vue
37
- <div v-editable="block">
38
- Content here
39
- </div>
39
+ const content = useContent('home', {}, { immediate: true })
40
+ const blocks = useBlocks({}, { immediate: true })
40
41
  ```
41
42
 
42
- #### `v-editable-field`
43
+ ### Directives
43
44
 
44
- Mark specific fields within editable blocks.
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
- #### `B10cksComponent`
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 :component="componentData" />
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 {};
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { Plugin } from 'vue';
2
2
  import { default as B10cksFallback } from './components/B10cksFallback.vue';
3
- export { previewBridge } from './preview-bridge';
4
- export { B10cksComponentResolverKey, type BlockComponentResolver } from './types';
3
+ export { previewBridge } from '../../client/src';
4
+ export * from './api';
5
+ export { B10cksClientKey, B10cksComponentResolverKey, B10cksDataApiKey, type BlockComponentResolver, } from './types';
5
6
  export { B10cksFallback };
6
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 i=require("vue"),f=Symbol("b10cks:resolveBlockComponent"),m=i.defineComponent({__name:"B10cksFallback",props:{block:{}},setup(e){return(t,n)=>(i.openBlock(),i.createElementBlock("div",null,'Component for block type "'+i.toDisplayString(e.block.block)+'" not found.',1))}}),v=i.defineComponent({__name:"B10cksComponent",props:{block:{}},setup(e,{expose:t}){const n=e,s=i.useTemplateRef("blockRef");t({value:s}),i.inject(f,null);function c(l){return l.split(/[-_]/).map(a=>a.charAt(0).toUpperCase()+a.slice(1)).join("").replace(/^([a-z])/,a=>a.toUpperCase())}const u=i.computed(()=>{const l=n.block?.block;if(!l)return null;const a=c(l),o=i.resolveDynamicComponent(a);return typeof o=="string"?(console.warn(`Component "${a}" not found. Make sure it's registered in your components directory.`),m):o});return i.computed(()=>n.block?.block||null),(l,a)=>u.value?(i.openBlock(),i.createBlock(i.resolveDynamicComponent(u.value),i.mergeProps({key:0,ref_key:"blockRef",ref:s},{...l.$props,...l.$attrs}),null,16)):i.createCommentVNode("",!0)}});class d{static instance;eventListeners={};isEnabled=!1;constructor(){this.isEnabled=this.isIframe()}init(){this.isEnabled&&window&&window.addEventListener("message",this.handleMessage)}static getInstance(){return d.instance||(d.instance=new d),d.instance}isInPreviewMode(){return this.isEnabled}isIframe(){return typeof window<"u"&&window.self!==window.top}handleMessage=t=>{if(!t.data||typeof t.data!="object")return;const{type:n,payload:s}=t.data;this.notifyListeners(n,s)};notifyListeners(t,n){const s=this.eventListeners[t];s&&s.forEach(c=>{c(n)})}on(t,n){return this.isEnabled?(this.eventListeners[t]||(this.eventListeners[t]=[]),this.eventListeners[t].push(n),()=>{this.eventListeners[t]=this.eventListeners[t].filter(s=>s!==n)}):()=>{}}selectItem(t){this.isEnabled&&window.parent.postMessage({type:"SELECT_UPDATE",payload:{selectedItem:t}},"*")}updateField(t,n,s){this.isEnabled&&window.parent.postMessage({type:"FIELD_UPDATE",payload:{itemId:t,field:n,value:s}},"*")}destroy(){this.isEnabled&&(window.removeEventListener("message",this.handleMessage),this.isEnabled=!1),this.eventListeners={}}}const r=d.getInstance(),b={mounted(e,t,n){if(!r.isInPreviewMode())return;const{id:s}=t.value;if(!s){console.warn("v-editable directive requires a block with an id");return}e.classList.add("b10cks-preview");const c=o=>{o.preventDefault(),o.stopPropagation(),r.selectItem(s)},u=({selectedItem:o})=>{n.el&&(o===s?(n.el.classList.add("b10cks-selected"),k(e)):n.el.classList.remove("b10cks-selected"))},l=({selectedItem:o})=>{n.el&&(o===s?n.el.classList.add("b10cks-hover"):n.el.classList.remove("b10cks-hover"))},a=({content:o})=>{if(o&&o.id===s){const p=n.ctx;p.parent.attrs.block=o,p.update(),p.props.block=o,p.update()}};e.addEventListener("click",c),r.on("SELECT_UPDATE",u),r.on("HOVER_UPDATE",l),r.on("CONTENT_UPDATE",a),e._editableCleanup=()=>{e.removeEventListener("click",c)}},updated(e,t,n){r.isInPreviewMode()&&t.value!==t.oldValue&&(e._editableCleanup&&e._editableCleanup(),b.mounted(e,t,n))},unmounted(e){r.isInPreviewMode()&&(e._editableCleanup&&(e._editableCleanup(),delete e._editableCleanup),e.classList.remove("b10cks-preview","b10cks-selected"))}};function k(e){e.scrollIntoView&&e.scrollIntoView({behavior:"smooth"})}if(r.isInPreviewMode()){const e=document.createElement("style");e.innerHTML=`
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 h={mounted(e,t){const{id:n,field:s}=t.value;r.isInPreviewMode()&&(e.setAttribute("contenteditable","true"),e.addEventListener("input",c=>{r.updateField(n,s,c.target.innerText)}))}},w={install(e,t){e.provide("b10cksVueOptions",t),e.directive("editable",b),e.directive("editable-field",h),e.component("B10cksComponent",v)}};exports.B10cksComponentResolverKey=f;exports.B10cksFallback=m;exports.B10cksVue=w;exports.previewBridge=r;
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/B10cksFallback.vue","../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'\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 { computed, inject, resolveDynamicComponent, useTemplateRef } 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 // 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","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 B10cksFallback from './components/B10cksFallback.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'\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}\n"],"names":["B10cksComponentResolverKey","_openBlock","_createElementBlock","_toDisplayString","__props","props","blockRef","useTemplateRef","__expose","inject","toPascalCase","name","part","match","resolvedComponent","computed","componentName","pascalCaseName","component","resolveDynamicComponent","B10cksFallback","_createBlock","_resolveDynamicComponent","_mergeProps","$props","$attrs","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,135 +1,85 @@
1
- import { defineComponent as b, createElementBlock as v, openBlock as m, toDisplayString as h, useTemplateRef as E, inject as w, computed as p, resolveDynamicComponent as f, createBlock as C, createCommentVNode as L, mergeProps as y } from "vue";
2
- const I = Symbol(
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
- ), _ = /* @__PURE__ */ b({
6
+ ), _ = Symbol("b10cks:client"), R = Symbol("b10cks:data-api"), B = /* @__PURE__ */ A({
5
7
  __name: "B10cksFallback",
6
8
  props: {
7
9
  block: {}
8
10
  },
9
11
  setup(e) {
10
- return (t, s) => (m(), v("div", null, 'Component for block type "' + h(e.block.block) + '" not found.', 1));
12
+ return (r, t) => (E(), P("div", null, 'Component for block type "' + S(e.block.block) + '" not found.', 1));
11
13
  }
12
- }), g = /* @__PURE__ */ b({
14
+ }), N = /* @__PURE__ */ A({
13
15
  __name: "B10cksComponent",
14
16
  props: {
15
17
  block: {}
16
18
  },
17
- setup(e, { expose: t }) {
18
- const s = e, n = E("blockRef");
19
- t({ value: n }), w(I, null);
20
- function l(a) {
21
- return a.split(/[-_]/).map((o) => o.charAt(0).toUpperCase() + o.slice(1)).join("").replace(/^([a-z])/, (o) => o.toUpperCase());
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());
22
25
  }
23
- const d = p(() => {
24
- const a = s.block?.block;
25
- if (!a)
26
+ const m = y(() => {
27
+ const d = t.block?.block;
28
+ if (!d)
26
29
  return null;
27
- const o = l(a), i = f(o);
28
- return typeof i == "string" ? (console.warn(
30
+ const o = k(d), b = h(o);
31
+ return typeof b == "string" ? f ? L(async () => {
32
+ try {
33
+ return await f(o);
34
+ } catch {
35
+ return B;
36
+ }
37
+ }) : (console.warn(
29
38
  `Component "${o}" not found. Make sure it's registered in your components directory.`
30
- ), _) : i;
39
+ ), B) : b;
31
40
  });
32
- return p(() => s.block?.block || null), (a, o) => d.value ? (m(), C(f(d.value), y({
41
+ return y(() => t.block?.block || null), (d, o) => m.value ? (E(), T(h(m.value), V({
33
42
  key: 0,
34
43
  ref_key: "blockRef",
35
- ref: n
36
- }, { ...a.$props, ...a.$attrs }), null, 16)) : L("", !0);
44
+ ref: c
45
+ }, { ...d.$props, ...d.$attrs }), null, 16)) : U("", !0);
37
46
  }
38
- });
39
- class c {
40
- static instance;
41
- eventListeners = {};
42
- isEnabled = !1;
43
- constructor() {
44
- this.isEnabled = this.isIframe();
45
- }
46
- init() {
47
- this.isEnabled && window && window.addEventListener("message", this.handleMessage);
48
- }
49
- static getInstance() {
50
- return c.instance || (c.instance = new c()), c.instance;
51
- }
52
- isInPreviewMode() {
53
- return this.isEnabled;
54
- }
55
- isIframe() {
56
- return typeof window < "u" && window.self !== window.top;
57
- }
58
- handleMessage = (t) => {
59
- if (!t.data || typeof t.data != "object") return;
60
- const { type: s, payload: n } = t.data;
61
- this.notifyListeners(s, n);
62
- };
63
- notifyListeners(t, s) {
64
- const n = this.eventListeners[t];
65
- n && n.forEach((l) => {
66
- l(s);
67
- });
68
- }
69
- on(t, s) {
70
- return this.isEnabled ? (this.eventListeners[t] || (this.eventListeners[t] = []), this.eventListeners[t].push(s), () => {
71
- this.eventListeners[t] = this.eventListeners[t].filter((n) => n !== s);
72
- }) : () => {
73
- };
74
- }
75
- selectItem(t) {
76
- this.isEnabled && window.parent.postMessage(
77
- {
78
- type: "SELECT_UPDATE",
79
- payload: { selectedItem: t }
80
- },
81
- "*"
82
- );
83
- }
84
- updateField(t, s, n) {
85
- this.isEnabled && window.parent.postMessage(
86
- {
87
- type: "FIELD_UPDATE",
88
- payload: { itemId: t, field: s, value: n }
89
- },
90
- "*"
91
- );
92
- }
93
- destroy() {
94
- this.isEnabled && (window.removeEventListener("message", this.handleMessage), this.isEnabled = !1), this.eventListeners = {};
95
- }
96
- }
97
- const r = c.getInstance(), k = {
98
- mounted(e, t, s) {
99
- if (!r.isInPreviewMode()) return;
100
- const { id: n } = t.value;
101
- if (!n) {
47
+ }), D = {
48
+ mounted(e, r, t) {
49
+ if (!v.isInPreviewMode()) return;
50
+ const { id: c } = r.value;
51
+ if (!c) {
102
52
  console.warn("v-editable directive requires a block with an id");
103
53
  return;
104
54
  }
105
55
  e.classList.add("b10cks-preview");
106
- const l = (i) => {
107
- i.preventDefault(), i.stopPropagation(), r.selectItem(n);
108
- }, d = ({ selectedItem: i }) => {
109
- s.el && (i === n ? (s.el.classList.add("b10cks-selected"), M(e)) : s.el.classList.remove("b10cks-selected"));
110
- }, a = ({ selectedItem: i }) => {
111
- s.el && (i === n ? s.el.classList.add("b10cks-hover") : s.el.classList.remove("b10cks-hover"));
112
- }, o = ({ content: i }) => {
113
- if (i && i.id === n) {
114
- const u = s.ctx;
115
- u.parent.attrs.block = i, u.update(), u.props.block = i, u.update();
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();
116
66
  }
117
67
  };
118
- e.addEventListener("click", l), r.on("SELECT_UPDATE", d), r.on("HOVER_UPDATE", a), r.on("CONTENT_UPDATE", o), e._editableCleanup = () => {
119
- e.removeEventListener("click", l);
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);
120
70
  };
121
71
  },
122
- updated(e, t, s) {
123
- r.isInPreviewMode() && t.value !== t.oldValue && (e._editableCleanup && e._editableCleanup(), k.mounted(e, t, s));
72
+ updated(e, r, t) {
73
+ v.isInPreviewMode() && r.value !== r.oldValue && (e._editableCleanup && e._editableCleanup(), D.mounted(e, r, t));
124
74
  },
125
75
  unmounted(e) {
126
- r.isInPreviewMode() && (e._editableCleanup && (e._editableCleanup(), delete e._editableCleanup), e.classList.remove("b10cks-preview", "b10cks-selected"));
76
+ v.isInPreviewMode() && (e._editableCleanup && (e._editableCleanup(), delete e._editableCleanup), e.classList.remove("b10cks-preview", "b10cks-selected"));
127
77
  }
128
78
  };
129
- function M(e) {
79
+ function $(e) {
130
80
  e.scrollIntoView && e.scrollIntoView({ behavior: "smooth" });
131
81
  }
132
- if (r.isInPreviewMode()) {
82
+ if (v.isInPreviewMode()) {
133
83
  const e = document.createElement("style");
134
84
  e.innerHTML = `
135
85
  .b10cks-hover,
@@ -143,22 +93,160 @@ if (r.isInPreviewMode()) {
143
93
  }
144
94
  `, document.head.appendChild(e);
145
95
  }
146
- const D = {
147
- mounted(e, t) {
148
- const { id: s, field: n } = t.value;
149
- r.isInPreviewMode() && (e.setAttribute("contenteditable", "true"), e.addEventListener("input", (l) => {
150
- r.updateField(s, n, l.target.innerText);
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);
151
101
  }));
152
102
  }
153
- }, x = {
154
- install(e, t) {
155
- e.provide("b10cksVueOptions", t), e.directive("editable", k), e.directive("editable-field", D), e.component("B10cksComponent", g);
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);
156
221
  }
157
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
+ }
158
241
  export {
159
- I as B10cksComponentResolverKey,
160
- _ as B10cksFallback,
161
- x as B10cksVue,
162
- r as previewBridge
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/types.ts","../src/components/B10cksFallback.vue","../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'\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 { computed, inject, resolveDynamicComponent, useTemplateRef } 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 // 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","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 B10cksFallback from './components/B10cksFallback.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'\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}\n"],"names":["B10cksComponentResolverKey","_openBlock","_createElementBlock","_toDisplayString","__props","props","blockRef","useTemplateRef","__expose","inject","toPascalCase","name","part","match","resolvedComponent","computed","componentName","pascalCaseName","component","resolveDynamicComponent","B10cksFallback","_createBlock","_resolveDynamicComponent","_mergeProps","$props","$attrs","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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"}
@@ -1,36 +1,2 @@
1
- export type ContentUpdateEvent = {
2
- content: Record<string, unknown>;
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 extends B10cksApiClientOptions {
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.10.5",
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.10.2"
31
+ "@b10cks/client": "^1.0.0"
32
32
  },
33
33
  "devDependencies": {
34
34
  "typescript": "^5.9.3",