@obelism/content 0.17.0 → 0.19.1
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 +45 -7
- package/dist/bridge.d.mts +16 -3
- package/dist/bridge.d.mts.map +1 -1
- package/dist/bridge.d.ts +16 -3
- package/dist/bridge.d.ts.map +1 -1
- package/dist/bridge.global.js +16 -5
- package/dist/bridge.js +239 -28
- package/dist/bridge.mjs +239 -28
- package/dist/index.d.mts +15 -4
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +15 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.mjs +3 -3
- package/dist/{preview-mpwfmnla.js → preview-ijk3ixwb.js} +17 -0
- package/dist/{preview-h7rwp06v.mjs → preview-jcmxxj92.mjs} +15 -1
- package/dist/site.js +5 -0
- package/dist/site.mjs +5 -0
- package/dist/{types-e5nvgudo.d.ts → types-mtjco3a5.d.ts} +10 -2
- package/dist/types-mtjco3a5.d.ts.map +1 -0
- package/package.json +1 -1
- package/dist/types-e5nvgudo.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -155,6 +155,26 @@ getContentBridge({ pagePath: (path, locale) => `/${locale}/${path}` })
|
|
|
155
155
|
await bridge.createPage('/pricing', 'Our plans, for agencies') // or your own UI
|
|
156
156
|
```
|
|
157
157
|
|
|
158
|
+
On a product route, mark the Shopify product the page shows. When the
|
|
159
|
+
product has no product page yet (nothing on the page is `editable(entry)`),
|
|
160
|
+
the box offers **Add a product page**: the CMS makes a draft of the space's
|
|
161
|
+
product page type for it (its handle as slug, in the `products` folder)
|
|
162
|
+
and the page reloads, now finding it. The page list opens product pages at the environment's product path (Settings →
|
|
163
|
+
Preview URL in the CMS, `/products/{handle}` by default), or at your own
|
|
164
|
+
`productPath`:
|
|
165
|
+
|
|
166
|
+
```tsx
|
|
167
|
+
import { editable, editableProduct } from '@obelism/content'
|
|
168
|
+
|
|
169
|
+
// app/products/[handle]/page.tsx: the store's product, and its page if any.
|
|
170
|
+
;<main {...editableProduct(product)} {...editable(productPage)}>
|
|
171
|
+
…
|
|
172
|
+
</main>
|
|
173
|
+
|
|
174
|
+
getContentBridge({ productPath: (handle, locale) => `/${locale}/p/${handle}` })
|
|
175
|
+
await bridge.createProductPage() // or your own UI; bridge.product says which
|
|
176
|
+
```
|
|
177
|
+
|
|
158
178
|
There the box also switches between **Prompt** and **Form**. Form shows the
|
|
159
179
|
CMS's own form for the page — or for the entry around the selected block —
|
|
160
180
|
right in the box: the fields, and blocks as cards to open and add,
|
|
@@ -297,19 +317,25 @@ const xml = sitemapXml(pages, {
|
|
|
297
317
|
|
|
298
318
|
## Links
|
|
299
319
|
|
|
300
|
-
A `link` field goes to a page of the space
|
|
301
|
-
optional query and anchor. It is
|
|
302
|
-
`title`, `slug` and `path` (never its
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
320
|
+
A `link` field goes to a page of the space, to any address, or (with
|
|
321
|
+
`products: true`) to a product of the space's Shopify store, each with an optional query and anchor. It is
|
|
322
|
+
delivered as `Link`: the page's `id`, `title`, `slug` and `path` (never its
|
|
323
|
+
fields), the `url`, or the `product` (`{ id, handle }`) with its product
|
|
324
|
+
page as `entry` (`null` when it has none), plus `query` and `hash` without
|
|
325
|
+
their `?` and `#`. A link to a page that isn't published is `null`. Where a
|
|
326
|
+
page's path lives on your site is your routing, so `linkHref` takes it as
|
|
327
|
+
`url` (default `/<path>`), a product's address as `product` (default
|
|
328
|
+
`/products/<handle>`), and adds the query and hash:
|
|
306
329
|
|
|
307
330
|
```tsx
|
|
308
331
|
import { linkHref } from '@obelism/content'
|
|
309
332
|
|
|
310
333
|
;<a
|
|
311
334
|
href={
|
|
312
|
-
linkHref(button.link, {
|
|
335
|
+
linkHref(button.link, {
|
|
336
|
+
url: (path) => `/${locale}/${path}`,
|
|
337
|
+
product: ({ handle }) => `/${locale}/products/${handle}`,
|
|
338
|
+
}) ?? undefined
|
|
313
339
|
}
|
|
314
340
|
>
|
|
315
341
|
{button.label}
|
|
@@ -367,6 +393,18 @@ collection?.products.map((product) => ({
|
|
|
367
393
|
}))
|
|
368
394
|
```
|
|
369
395
|
|
|
396
|
+
A page type with a unique product field is a product page type: one page
|
|
397
|
+
per product, for what the store doesn't hold. On your product route, find
|
|
398
|
+
the page by the product's id, and render the store's product alone when there
|
|
399
|
+
is none:
|
|
400
|
+
|
|
401
|
+
```ts
|
|
402
|
+
const productPage = await content.getFirstEntry({
|
|
403
|
+
contentType: 'productPage',
|
|
404
|
+
fields: { product: product.id }, // gid://shopify/Product/…
|
|
405
|
+
})
|
|
406
|
+
```
|
|
407
|
+
|
|
370
408
|
`fetchShopifyProducts(items, options)` does the same for a product field
|
|
371
409
|
(one item or a list), in the field's order. Both leave out what the store no
|
|
372
410
|
longer has. A Hydrogen or Liquid site can use the `id` with its own
|
package/dist/bridge.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Entry } from './index.mjs';
|
|
1
|
+
import { Entry, ShopifyItem } from './index.mjs';
|
|
2
2
|
|
|
3
3
|
type BlockStats = {
|
|
4
4
|
clicks: number;
|
|
@@ -54,6 +54,11 @@ type CreatePageResult = {
|
|
|
54
54
|
path: string;
|
|
55
55
|
url: string;
|
|
56
56
|
};
|
|
57
|
+
type CreateProductPageResult = {
|
|
58
|
+
entryId: string;
|
|
59
|
+
path: string;
|
|
60
|
+
created: boolean;
|
|
61
|
+
};
|
|
57
62
|
type ApplyJsonResult = {
|
|
58
63
|
changed: string[];
|
|
59
64
|
view?: Record<string, unknown> | undefined;
|
|
@@ -73,18 +78,21 @@ type SitePage = {
|
|
|
73
78
|
status: 'draft' | 'published' | 'changed';
|
|
74
79
|
path: string;
|
|
75
80
|
url: string;
|
|
81
|
+
product: ShopifyItem | null;
|
|
76
82
|
};
|
|
77
83
|
type ContentBridge = {
|
|
78
84
|
readonly isEditing: boolean;
|
|
79
85
|
readonly mode: 'editor' | 'site' | null;
|
|
80
86
|
readonly entryId: string | null;
|
|
81
87
|
readonly environment: string | null;
|
|
88
|
+
readonly product: ShopifyItem | null;
|
|
82
89
|
on<E extends BridgeEvent>(event: E, listener: BridgeListener<E>): () => void;
|
|
83
90
|
getState(): BridgeState;
|
|
84
91
|
prompt(prompt: string, options?: {
|
|
85
92
|
uid?: string | null;
|
|
86
93
|
}): Promise<PromptResult>;
|
|
87
94
|
createPage(path: string, prompt: string): Promise<CreatePageResult>;
|
|
95
|
+
createProductPage(product?: ShopifyItem): Promise<CreateProductPageResult>;
|
|
88
96
|
view(options?: {
|
|
89
97
|
uid?: string | null | undefined;
|
|
90
98
|
}): Promise<Record<string, unknown>>;
|
|
@@ -145,6 +153,10 @@ type PromptLabels = {
|
|
|
145
153
|
pageCurrent: string;
|
|
146
154
|
pageDraft: string;
|
|
147
155
|
pageChanged: string;
|
|
156
|
+
addProductPage: string;
|
|
157
|
+
addingProductPage: string;
|
|
158
|
+
addedProductPage: string;
|
|
159
|
+
productPageHint: string;
|
|
148
160
|
};
|
|
149
161
|
declare const DEFAULT_PROMPT_LABELS: PromptLabels;
|
|
150
162
|
type PromptBoxOptions = {
|
|
@@ -156,10 +168,11 @@ type BridgeOptions = {
|
|
|
156
168
|
url?: string | undefined;
|
|
157
169
|
prompt?: boolean | PromptBoxOptions | undefined;
|
|
158
170
|
pagePath?: ((path: string, locale: string) => string) | undefined;
|
|
171
|
+
productPath?: ((handle: string, locale: string) => string) | undefined;
|
|
159
172
|
};
|
|
160
173
|
declare const peekContentBridge: () => ContentBridge | null;
|
|
161
|
-
declare const getContentBridge: ({ url, prompt, pagePath, }?: BridgeOptions) => ContentBridge;
|
|
174
|
+
declare const getContentBridge: ({ url, prompt, pagePath, productPath, }?: BridgeOptions) => ContentBridge;
|
|
162
175
|
|
|
163
176
|
export { DEFAULT_PROMPT_LABELS, DEFAULT_STATS_LABELS, INITIAL_STATE, getContentBridge, mountPromptBox, mountStatsOverlay, peekContentBridge };
|
|
164
|
-
export type { ApplyJsonResult, BlockStats, BridgeEvent, BridgeEvents, BridgeListener, BridgeOptions, BridgeState, ContentBridge, CreatePageResult, FormHandle, FormOptions, PromptBoxOptions, PromptLabels, PromptResult, SitePage, StatsLabels, StatsOverlay };
|
|
177
|
+
export type { ApplyJsonResult, BlockStats, BridgeEvent, BridgeEvents, BridgeListener, BridgeOptions, BridgeState, ContentBridge, CreatePageResult, CreateProductPageResult, FormHandle, FormOptions, PromptBoxOptions, PromptLabels, PromptResult, SitePage, StatsLabels, StatsOverlay };
|
|
165
178
|
//# sourceMappingURL=bridge.d.mts.map
|
package/dist/bridge.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.d.mts","sources":["../src/bridge/statsOverlay.ts","../src/bridge/createBridge.ts","../src/bridge/promptBox.ts","../src/bridge.ts"],"mappings":";;AAAA,KAAK,UAAU;AACf;AACA;AACA;AACA;AACA;AACA,KAAK,WAAW;AAChB;AACA;AACA;AACA,cAAc,oBAAoB,EAAE,WAAW;AAc/C,KAAK,YAAY;AACjB,kBAAkB,QAAQ,CAAC,MAAM,SAAS,UAAU;AACpD;AACA;AACA;AACA,cAAc,iBAAiB,QAAQ,MAAM;AAC7C;AACA;AACA,aAAa,OAAO,CAAC,WAAW;AAChC,MAAM,YAAY;;AC5BlB,KAAK,YAAY;AACjB;AACA,eAAe,KAAK;AACpB;AACA;AACA,WAAW,MAAM;AACjB,eAAe,MAAM;AACrB,YAAY,WAAW;AACvB;AACA,KAAK,WAAW,SAAS,YAAY;AACrC,KAAK,cAAc,WAAW,WAAW,cAAc,YAAY;AACnE,KAAK,WAAW;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ,CAAC,MAAM,SAAS,UAAU;AAC7C;AACA;AACA,KAAK,YAAY;AACjB;AACA;AACA,KAAK,gBAAgB;AACrB;AACA;AACA;AACA;AACA;AACA,KAAK,eAAe;AACpB;AACA,WAAW,MAAM;AACjB;AACA,KAAK,WAAW;AAChB;AACA;AACA;AACA;AACA,KAAK,UAAU;AACf;AACA;AACA,KAAK,QAAQ;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,aAAa;AAClB;AACA;AACA;AACA;AACA,iBAAiB,WAAW,sBAAsB,cAAc;AAChE,gBAAgB,WAAW;AAC3B;AACA;AACA,QAAQ,OAAO,CAAC,YAAY;AAC5B,8CAA8C,OAAO,CAAC,gBAAgB;AACtE;AACA;AACA,QAAQ,OAAO,CAAC,MAAM;AACtB,uBAAuB,MAAM;AAC7B;AACA,QAAQ,OAAO,CAAC,eAAe;AAC/B,wBAAwB,WAAW,YAAY,WAAW,GAAG,UAAU;AACvE,aAAa,OAAO,CAAC,QAAQ;AAC7B,mBAAmB,QAAQ;AAC3B;AACA,YAAY,OAAO;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AAEA,cAAc,aAAa,EAAE,WAAW;;
|
|
1
|
+
{"version":3,"file":"bridge.d.mts","sources":["../src/bridge/statsOverlay.ts","../src/bridge/createBridge.ts","../src/bridge/promptBox.ts","../src/bridge.ts"],"mappings":";;AAAA,KAAK,UAAU;AACf;AACA;AACA;AACA;AACA;AACA,KAAK,WAAW;AAChB;AACA;AACA;AACA,cAAc,oBAAoB,EAAE,WAAW;AAc/C,KAAK,YAAY;AACjB,kBAAkB,QAAQ,CAAC,MAAM,SAAS,UAAU;AACpD;AACA;AACA;AACA,cAAc,iBAAiB,QAAQ,MAAM;AAC7C;AACA;AACA,aAAa,OAAO,CAAC,WAAW;AAChC,MAAM,YAAY;;AC5BlB,KAAK,YAAY;AACjB;AACA,eAAe,KAAK;AACpB;AACA;AACA,WAAW,MAAM;AACjB,eAAe,MAAM;AACrB,YAAY,WAAW;AACvB;AACA,KAAK,WAAW,SAAS,YAAY;AACrC,KAAK,cAAc,WAAW,WAAW,cAAc,YAAY;AACnE,KAAK,WAAW;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ,CAAC,MAAM,SAAS,UAAU;AAC7C;AACA;AACA,KAAK,YAAY;AACjB;AACA;AACA,KAAK,gBAAgB;AACrB;AACA;AACA;AACA;AACA;AACA,KAAK,uBAAuB;AAC5B;AACA;AACA;AACA;AACA,KAAK,eAAe;AACpB;AACA,WAAW,MAAM;AACjB;AACA,KAAK,WAAW;AAChB;AACA;AACA;AACA;AACA,KAAK,UAAU;AACf;AACA;AACA,KAAK,QAAQ;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,WAAW;AACxB;AACA,KAAK,aAAa;AAClB;AACA;AACA;AACA;AACA,sBAAsB,WAAW;AACjC,iBAAiB,WAAW,sBAAsB,cAAc;AAChE,gBAAgB,WAAW;AAC3B;AACA;AACA,QAAQ,OAAO,CAAC,YAAY;AAC5B,8CAA8C,OAAO,CAAC,gBAAgB;AACtE,gCAAgC,WAAW,GAAG,OAAO,CAAC,uBAAuB;AAC7E;AACA;AACA,QAAQ,OAAO,CAAC,MAAM;AACtB,uBAAuB,MAAM;AAC7B;AACA,QAAQ,OAAO,CAAC,eAAe;AAC/B,wBAAwB,WAAW,YAAY,WAAW,GAAG,UAAU;AACvE,aAAa,OAAO,CAAC,QAAQ;AAC7B,mBAAmB,QAAQ;AAC3B;AACA,YAAY,OAAO;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AAEA,cAAc,aAAa,EAAE,WAAW;;AC7FxC,KAAK,YAAY;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,qBAAqB,EAAE,YAAY;AACjD,KAAK,gBAAgB;AACrB,aAAa,OAAO,CAAC,YAAY;AACjC;AACA,cAAc,cAAc,QAAQ,QAAQ,UAAU,aAAa,YAAY,gBAAgB;;AC3C/F,KAAK,aAAa;AAClB;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA,cAAc,iBAAiB,QAAQ,aAAa;AACpD,cAAc,gBAAgB,6CAA6C,aAAa,KAAK,aAAa","names":[]}
|
package/dist/bridge.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Entry } from './index.js';
|
|
1
|
+
import { Entry, ShopifyItem } from './index.js';
|
|
2
2
|
|
|
3
3
|
type BlockStats = {
|
|
4
4
|
clicks: number;
|
|
@@ -54,6 +54,11 @@ type CreatePageResult = {
|
|
|
54
54
|
path: string;
|
|
55
55
|
url: string;
|
|
56
56
|
};
|
|
57
|
+
type CreateProductPageResult = {
|
|
58
|
+
entryId: string;
|
|
59
|
+
path: string;
|
|
60
|
+
created: boolean;
|
|
61
|
+
};
|
|
57
62
|
type ApplyJsonResult = {
|
|
58
63
|
changed: string[];
|
|
59
64
|
view?: Record<string, unknown> | undefined;
|
|
@@ -73,18 +78,21 @@ type SitePage = {
|
|
|
73
78
|
status: 'draft' | 'published' | 'changed';
|
|
74
79
|
path: string;
|
|
75
80
|
url: string;
|
|
81
|
+
product: ShopifyItem | null;
|
|
76
82
|
};
|
|
77
83
|
type ContentBridge = {
|
|
78
84
|
readonly isEditing: boolean;
|
|
79
85
|
readonly mode: 'editor' | 'site' | null;
|
|
80
86
|
readonly entryId: string | null;
|
|
81
87
|
readonly environment: string | null;
|
|
88
|
+
readonly product: ShopifyItem | null;
|
|
82
89
|
on<E extends BridgeEvent>(event: E, listener: BridgeListener<E>): () => void;
|
|
83
90
|
getState(): BridgeState;
|
|
84
91
|
prompt(prompt: string, options?: {
|
|
85
92
|
uid?: string | null;
|
|
86
93
|
}): Promise<PromptResult>;
|
|
87
94
|
createPage(path: string, prompt: string): Promise<CreatePageResult>;
|
|
95
|
+
createProductPage(product?: ShopifyItem): Promise<CreateProductPageResult>;
|
|
88
96
|
view(options?: {
|
|
89
97
|
uid?: string | null | undefined;
|
|
90
98
|
}): Promise<Record<string, unknown>>;
|
|
@@ -145,6 +153,10 @@ type PromptLabels = {
|
|
|
145
153
|
pageCurrent: string;
|
|
146
154
|
pageDraft: string;
|
|
147
155
|
pageChanged: string;
|
|
156
|
+
addProductPage: string;
|
|
157
|
+
addingProductPage: string;
|
|
158
|
+
addedProductPage: string;
|
|
159
|
+
productPageHint: string;
|
|
148
160
|
};
|
|
149
161
|
declare const DEFAULT_PROMPT_LABELS: PromptLabels;
|
|
150
162
|
type PromptBoxOptions = {
|
|
@@ -156,10 +168,11 @@ type BridgeOptions = {
|
|
|
156
168
|
url?: string | undefined;
|
|
157
169
|
prompt?: boolean | PromptBoxOptions | undefined;
|
|
158
170
|
pagePath?: ((path: string, locale: string) => string) | undefined;
|
|
171
|
+
productPath?: ((handle: string, locale: string) => string) | undefined;
|
|
159
172
|
};
|
|
160
173
|
declare const peekContentBridge: () => ContentBridge | null;
|
|
161
|
-
declare const getContentBridge: ({ url, prompt, pagePath, }?: BridgeOptions) => ContentBridge;
|
|
174
|
+
declare const getContentBridge: ({ url, prompt, pagePath, productPath, }?: BridgeOptions) => ContentBridge;
|
|
162
175
|
|
|
163
176
|
export { DEFAULT_PROMPT_LABELS, DEFAULT_STATS_LABELS, INITIAL_STATE, getContentBridge, mountPromptBox, mountStatsOverlay, peekContentBridge };
|
|
164
|
-
export type { ApplyJsonResult, BlockStats, BridgeEvent, BridgeEvents, BridgeListener, BridgeOptions, BridgeState, ContentBridge, CreatePageResult, FormHandle, FormOptions, PromptBoxOptions, PromptLabels, PromptResult, SitePage, StatsLabels, StatsOverlay };
|
|
177
|
+
export type { ApplyJsonResult, BlockStats, BridgeEvent, BridgeEvents, BridgeListener, BridgeOptions, BridgeState, ContentBridge, CreatePageResult, CreateProductPageResult, FormHandle, FormOptions, PromptBoxOptions, PromptLabels, PromptResult, SitePage, StatsLabels, StatsOverlay };
|
|
165
178
|
//# sourceMappingURL=bridge.d.ts.map
|
package/dist/bridge.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.d.ts","sources":["../src/bridge/statsOverlay.ts","../src/bridge/createBridge.ts","../src/bridge/promptBox.ts","../src/bridge.ts"],"mappings":";;AAAA,KAAK,UAAU;AACf;AACA;AACA;AACA;AACA;AACA,KAAK,WAAW;AAChB;AACA;AACA;AACA,cAAc,oBAAoB,EAAE,WAAW;AAc/C,KAAK,YAAY;AACjB,kBAAkB,QAAQ,CAAC,MAAM,SAAS,UAAU;AACpD;AACA;AACA;AACA,cAAc,iBAAiB,QAAQ,MAAM;AAC7C;AACA;AACA,aAAa,OAAO,CAAC,WAAW;AAChC,MAAM,YAAY;;AC5BlB,KAAK,YAAY;AACjB;AACA,eAAe,KAAK;AACpB;AACA;AACA,WAAW,MAAM;AACjB,eAAe,MAAM;AACrB,YAAY,WAAW;AACvB;AACA,KAAK,WAAW,SAAS,YAAY;AACrC,KAAK,cAAc,WAAW,WAAW,cAAc,YAAY;AACnE,KAAK,WAAW;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ,CAAC,MAAM,SAAS,UAAU;AAC7C;AACA;AACA,KAAK,YAAY;AACjB;AACA;AACA,KAAK,gBAAgB;AACrB;AACA;AACA;AACA;AACA;AACA,KAAK,eAAe;AACpB;AACA,WAAW,MAAM;AACjB;AACA,KAAK,WAAW;AAChB;AACA;AACA;AACA;AACA,KAAK,UAAU;AACf;AACA;AACA,KAAK,QAAQ;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,aAAa;AAClB;AACA;AACA;AACA;AACA,iBAAiB,WAAW,sBAAsB,cAAc;AAChE,gBAAgB,WAAW;AAC3B;AACA;AACA,QAAQ,OAAO,CAAC,YAAY;AAC5B,8CAA8C,OAAO,CAAC,gBAAgB;AACtE;AACA;AACA,QAAQ,OAAO,CAAC,MAAM;AACtB,uBAAuB,MAAM;AAC7B;AACA,QAAQ,OAAO,CAAC,eAAe;AAC/B,wBAAwB,WAAW,YAAY,WAAW,GAAG,UAAU;AACvE,aAAa,OAAO,CAAC,QAAQ;AAC7B,mBAAmB,QAAQ;AAC3B;AACA,YAAY,OAAO;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AAEA,cAAc,aAAa,EAAE,WAAW;;
|
|
1
|
+
{"version":3,"file":"bridge.d.ts","sources":["../src/bridge/statsOverlay.ts","../src/bridge/createBridge.ts","../src/bridge/promptBox.ts","../src/bridge.ts"],"mappings":";;AAAA,KAAK,UAAU;AACf;AACA;AACA;AACA;AACA;AACA,KAAK,WAAW;AAChB;AACA;AACA;AACA,cAAc,oBAAoB,EAAE,WAAW;AAc/C,KAAK,YAAY;AACjB,kBAAkB,QAAQ,CAAC,MAAM,SAAS,UAAU;AACpD;AACA;AACA;AACA,cAAc,iBAAiB,QAAQ,MAAM;AAC7C;AACA;AACA,aAAa,OAAO,CAAC,WAAW;AAChC,MAAM,YAAY;;AC5BlB,KAAK,YAAY;AACjB;AACA,eAAe,KAAK;AACpB;AACA;AACA,WAAW,MAAM;AACjB,eAAe,MAAM;AACrB,YAAY,WAAW;AACvB;AACA,KAAK,WAAW,SAAS,YAAY;AACrC,KAAK,cAAc,WAAW,WAAW,cAAc,YAAY;AACnE,KAAK,WAAW;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ,CAAC,MAAM,SAAS,UAAU;AAC7C;AACA;AACA,KAAK,YAAY;AACjB;AACA;AACA,KAAK,gBAAgB;AACrB;AACA;AACA;AACA;AACA;AACA,KAAK,uBAAuB;AAC5B;AACA;AACA;AACA;AACA,KAAK,eAAe;AACpB;AACA,WAAW,MAAM;AACjB;AACA,KAAK,WAAW;AAChB;AACA;AACA;AACA;AACA,KAAK,UAAU;AACf;AACA;AACA,KAAK,QAAQ;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,WAAW;AACxB;AACA,KAAK,aAAa;AAClB;AACA;AACA;AACA;AACA,sBAAsB,WAAW;AACjC,iBAAiB,WAAW,sBAAsB,cAAc;AAChE,gBAAgB,WAAW;AAC3B;AACA;AACA,QAAQ,OAAO,CAAC,YAAY;AAC5B,8CAA8C,OAAO,CAAC,gBAAgB;AACtE,gCAAgC,WAAW,GAAG,OAAO,CAAC,uBAAuB;AAC7E;AACA;AACA,QAAQ,OAAO,CAAC,MAAM;AACtB,uBAAuB,MAAM;AAC7B;AACA,QAAQ,OAAO,CAAC,eAAe;AAC/B,wBAAwB,WAAW,YAAY,WAAW,GAAG,UAAU;AACvE,aAAa,OAAO,CAAC,QAAQ;AAC7B,mBAAmB,QAAQ;AAC3B;AACA,YAAY,OAAO;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AAEA,cAAc,aAAa,EAAE,WAAW;;AC7FxC,KAAK,YAAY;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,qBAAqB,EAAE,YAAY;AACjD,KAAK,gBAAgB;AACrB,aAAa,OAAO,CAAC,YAAY;AACjC;AACA,cAAc,cAAc,QAAQ,QAAQ,UAAU,aAAa,YAAY,gBAAgB;;AC3C/F,KAAK,aAAa;AAClB;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA,cAAc,iBAAiB,QAAQ,aAAa;AACpD,cAAc,gBAAgB,6CAA6C,aAAa,KAAK,aAAa","names":[]}
|
package/dist/bridge.global.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
!/*! Obelism Content bridge (@obelism/content), MIT. https://content.obelism.studio/docs/guides/visual-editor */function(){"use strict";var e;let t="data-cms-uid",r="data-cms-entry",n="
|
|
1
|
+
!/*! Obelism Content bridge (@obelism/content), MIT. https://content.obelism.studio/docs/guides/visual-editor */function(){"use strict";var e;let t="data-cms-uid",r="data-cms-entry",n="data-cms-product",o="cms_environment",a={clicked:"{rate}% clicked",title:"{clickers} of {viewers} visitors of its page clicked it in the last 30 days ({clicks} clicks)"},i=(e,t)=>e.replace(/\{(\w+)\}/g,(e,r)=>r in t?String(t[r]):e),l=`
|
|
2
2
|
:host { all: initial; }
|
|
3
3
|
.layer {
|
|
4
4
|
position: fixed; inset: 0; pointer-events: none;
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
.badge[data-place='beside'] { transform: translateY(-50%); }
|
|
23
23
|
.badge[data-place='above'] { transform: translate(-100%, -100%); }
|
|
24
24
|
.badge:focus-visible { outline: 2px solid rgb(212 130 30); outline-offset: 2px; }
|
|
25
|
-
`,s=(e,t)=>e.height>=64?{place:"inside",top:Math.max(e.top,0)+8,left:e.right-8}:e.right+8+140<=t?{place:"beside",top:e.top+e.height/2,left:e.right+8}:{place:"above",top:e.top-4,left:e.right},
|
|
25
|
+
`,s=(e,t)=>e.height>=64?{place:"inside",top:Math.max(e.top,0)+8,left:e.right-8}:e.right+8+140<=t?{place:"beside",top:e.top+e.height/2,left:e.right+8}:{place:"above",top:e.top-4,left:e.right},d="obelism-content-bridge",c="#d58a1f",p=(e="")=>`${e}[${t}]{cursor:pointer;transition:outline-color .15s}${e}[${t}]:hover{outline:2px dashed ${c};outline-offset:2px}${e}[${t}][data-cms-selected]{outline:2px solid ${c};outline-offset:2px}`,g={features:[],selectedUid:null,prompting:!1,canUndo:!1,unsaved:!1,saving:!1,publishing:!1,selecting:!1,stats:{},statsVisible:!1},u=()=>{let e={update:new Set,saved:new Set,published:new Set,change:new Set};return{listeners:e,on:(t,r)=>(e[t].add(r),()=>{e[t].delete(r)}),emit(t,r){for(let n of e[t])try{n(r)}catch(e){console.error("[@obelism/content bridge]",e)}}}},h=()=>Promise.reject(Error("Save and publish in the visual editor itself")),m=()=>Promise.reject(Error("Only while signed in to edit on the site")),b={prompt:()=>Promise.reject(Error("Prompts only work inside the visual editor")),createPage:()=>Promise.reject(Error("New pages are made on the site itself")),createProductPage:()=>Promise.reject(Error("Product pages are made on the site itself")),view:m,applyJson:m,openForm:(e,t={})=>(queueMicrotask(()=>t.onError?.("Only while signed in to edit on the site")),{close:()=>{}}),pages:m,openPage:()=>{},undo:()=>{},save:h,publish:h,signOut:()=>{},select:()=>{},setSelecting:()=>{}},f=e=>"number"==typeof e&&Number.isFinite(e)&&e>=0,v=e=>`[${t}="${e.replace(/["\\]/g,"\\$&")}"]`,y=(e,t)=>{let r=u();e.on("saved",()=>r.emit("saved",{})),e.on("published",()=>r.emit("published",{}));let n=!1;return{isEditing:e.isEditing,mode:e.isEditing?"editor":null,entryId:e.entryId,environment:t.get(o),product:null,on:(t,o)=>("update"!==t||n||(n=!0,e.on("update",e=>{let t=e?.entry;t&&r.emit("update",{entry:t,selectedUid:null})})),r.on(t,o)),getState:()=>g,...b,destroy:()=>{}}},x={open:"Edit with a prompt",placeholder:"Describe a change, e.g. “make the heading shorter”",send:"Apply",undo:"Undo",close:"Close",minimize:"Minimize, to see the page",expand:"Expand",scopeEntry:"Whole page",scopeBlock:"Selected block",clearBlock:"Edit the whole page instead",working:"Working on it…",save:"Save",publish:"Publish",saving:"Saving…",publishing:"Publishing…",saved:"Saved as a draft",published:"Published",unsaved:"Unsaved changes",signOut:"Exit editing",viewingDrafts:"Viewing drafts",selectHint:"Click a block to change only that block",newPage:"New page",newPageCancel:"Edit this page instead",newPagePlaceholder:"Describe the new page, e.g. “a pricing page for agencies”",path:"Path",pathPlaceholder:"/pricing",creating:"Writing the page…",created:"Opening the new page…",modes:"Edit with",modePrompt:"Prompt",form:"Form",formTitle:"The content form",formLoading:"Opening the form…",pages:"Pages",pagesSearch:"Find a page",pagesLoading:"Loading pages…",pagesEmpty:"No pages match",pageCurrent:"This page",pageDraft:"Draft",pageChanged:"Changed",addProductPage:"Add a product page",addingProductPage:"Making the product page…",addedProductPage:"Opening the product page…",productPageHint:"This product has no page yet. Add one for what the store doesn’t say."},w="obelism-content-prompt-side",k={page:'<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"/><path d="M14 2v4a2 2 0 0 0 2 2h4"/>',newPage:'<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"/><path d="M14 2v4a2 2 0 0 0 2 2h4"/><path d="M9 15h6"/><path d="M12 18v-6"/>',block:'<rect width="18" height="18" x="3" y="3" rx="2"/><path d="M7 8h10"/><path d="M7 12h6"/>',undo:'<path d="M9 14 4 9l5-5"/><path d="M4 9h10.5a5.5 5.5 0 0 1 0 11H11"/>',close:'<path d="M18 6 6 18"/><path d="m6 6 12 12"/>',minimize:'<path d="m6 9 6 6 6-6"/>',expand:'<path d="m18 15-6-6-6 6"/>',chevrons:'<path d="m7 15 5 5 5-5"/><path d="m7 9 5-5 5 5"/>',search:'<circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/>',check:'<path d="M20 6 9 17l-5-5"/>',mark:'<path d="M12 3v18M3 12h18"/><g fill="currentColor" stroke="none"><circle cx="7" cy="7" r="1.75"/><circle cx="17" cy="7" r="1.75"/><circle cx="7" cy="17" r="1.75"/><circle cx="17" cy="17" r="1.75"/></g>',send:'<path d="M3.714 3.048a.498.498 0 0 0-.683.627l2.843 7.627a2 2 0 0 1 0 1.396l-2.842 7.627a.498.498 0 0 0 .682.627l18-8.5a.5.5 0 0 0 0-.904z"/><path d="M6 12h16"/>'},E=`
|
|
26
26
|
:host { all: initial; }
|
|
27
27
|
* { box-sizing: border-box; font: inherit; color: inherit; margin: 0; }
|
|
28
28
|
.root {
|
|
@@ -43,10 +43,20 @@
|
|
|
43
43
|
--font-inter: 'InterVariable', 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
|
|
44
44
|
Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif;
|
|
45
45
|
position: fixed; left: 50%; bottom: 20px; transform: translateX(-50%);
|
|
46
|
+
transition: translate .45s cubic-bezier(0.34, 1.3, 0.64, 1);
|
|
46
47
|
z-index: 2147483647; width: min(640px, calc(100vw - 32px)); color-scheme: light dark;
|
|
47
48
|
font: 400 14px/1.4 var(--font-inter); color: rgb(var(--theme-foreground-rgb));
|
|
48
49
|
-webkit-font-smoothing: antialiased;
|
|
49
50
|
}
|
|
51
|
+
/* Dragged to a side of the screen, it stays there, springing into place. */
|
|
52
|
+
.root[data-side='left'] { left: 16px; transform: none; }
|
|
53
|
+
.root[data-side='right'] { left: auto; right: 16px; transform: none; }
|
|
54
|
+
.root[data-side='left'] .bar { justify-content: flex-start; }
|
|
55
|
+
.root[data-side='right'] .bar { justify-content: flex-end; }
|
|
56
|
+
.root.dragging { transition: none; user-select: none; -webkit-user-select: none; }
|
|
57
|
+
.root.dragging, .root.dragging * { cursor: grabbing !important; }
|
|
58
|
+
.toolbar, .footer, .status { cursor: grab; touch-action: none; }
|
|
59
|
+
.pill { touch-action: none; }
|
|
50
60
|
@media (prefers-color-scheme: dark) {
|
|
51
61
|
.root {
|
|
52
62
|
--theme-foreground-rgb: var(--color-white-rgb);
|
|
@@ -82,7 +92,8 @@ button:focus-visible { outline: 2px solid rgb(var(--theme-accent-rgb)); outline-
|
|
|
82
92
|
}
|
|
83
93
|
button.pill:hover { color: rgb(var(--theme-foreground-rgb)); transform: translateY(-2px); }
|
|
84
94
|
.pill > span:first-child { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
85
|
-
.mark { color: rgb(var(--theme-accent-rgb));
|
|
95
|
+
.mark { color: rgb(var(--theme-accent-rgb)); }
|
|
96
|
+
.mark svg { width: 20px; height: 20px; }
|
|
86
97
|
.pill.compact { width: auto; height: 40px; padding: 0 18px; font-size: 14px; gap: 4px; }
|
|
87
98
|
|
|
88
99
|
/* Open: a floating card, the text on top and a row of pill buttons below. */
|
|
@@ -100,7 +111,7 @@ button.pill:hover { color: rgb(var(--theme-foreground-rgb)); transform: translat
|
|
|
100
111
|
@keyframes rise { from { opacity: 0; transform: translateY(8px) scale(.98); } }
|
|
101
112
|
@keyframes spin { to { transform: rotate(1turn); } }
|
|
102
113
|
@media (prefers-reduced-motion: reduce) {
|
|
103
|
-
.panel { animation: none; }
|
|
114
|
+
.root, .panel { animation: none; transition: none; }
|
|
104
115
|
.pill { transition: none; }
|
|
105
116
|
}
|
|
106
117
|
.status {
|
|
@@ -233,4 +244,4 @@ button.chip:disabled { opacity: .5; }
|
|
|
233
244
|
.empty { padding: 8px 12px; color: rgb(var(--theme-foreground-muted-rgb)); }
|
|
234
245
|
.empty.error { color: var(--theme-error); }
|
|
235
246
|
[hidden] { display: none !important; }
|
|
236
|
-
`,k=(e,t,r={},...n)=>{let o=e.createElement(t);for(let t of(Object.assign(o,r),n))o.appendChild("string"==typeof t?e.createTextNode(t):t);return o},E=(e,t)=>{let r=k(e,"span",{className:"icon"});return r.setAttribute("aria-hidden","true"),r.innerHTML=`<svg viewBox="0 0 24 24">${x[t]}</svg>`,r},C=(e,t,r={})=>{let n={...y,...r.labels},o=k(e,"div");o.setAttribute("data-obelism-content-prompt","");let a=o.attachShadow({mode:"open"}),i="site"===t.mode,s=k(e,"span",{textContent:n.open}),l=k(e,"button",{className:"pill",type:"button"},s,k(e,"span",{className:"mark",textContent:"⁜"})),d=k(e,"span",{className:"pill compact"},`${n.viewingDrafts} \xb7 `),c=k(e,"button",{className:"link",type:"button",textContent:n.signOut});d.appendChild(c);let p=k(e,"p",{className:"status"});p.setAttribute("role","status");let g=k(e,"textarea",{placeholder:n.placeholder,rows:1});g.setAttribute("aria-label",n.open);let u=k(e,"div",{className:"form"}),h=E(e,"page"),b=E(e,"block"),m=k(e,"span"),f=k(e,"button",{type:"button",title:n.clearBlock});f.setAttribute("aria-label",n.clearBlock),f.appendChild(E(e,"close"));let v=k(e,"span",{className:"chip scope"},h,b,m,f),x=k(e,"button",{className:"action chip",type:"button"},E(e,"undo"),n.undo),C=t=>{let r=k(e,"button",{type:"button",textContent:t});return r.setAttribute("aria-pressed","false"),r},A=C(n.modePrompt),S=C(n.form),L=k(e,"span",{className:"modes"},A,S);L.setAttribute("role","group"),L.setAttribute("aria-label",n.modes);let N=k(e,"button",{className:"action chip",type:"button"},E(e,"newPage"),n.newPage),U=k(e,"button",{type:"button",title:n.newPageCancel});U.setAttribute("aria-label",n.newPageCancel),U.appendChild(E(e,"close"));let P=k(e,"span",{className:"chip scope"},E(e,"newPage"),k(e,"span",{textContent:n.newPage}),U),I=k(e,"input",{type:"text",placeholder:n.pathPlaceholder,autocomplete:"off",spellcheck:!1}),$=k(e,"label",{className:"path"},k(e,"span",{textContent:n.path}),I),M=k(e,"button",{className:"close icon-button",type:"button",title:n.close},E(e,"close"));M.setAttribute("aria-label",n.close);let O=E(e,"minimize"),T=E(e,"expand"),z=k(e,"button",{className:"icon-button",type:"button"},O,T),j=k(e,"button",{className:"action primary icon-button",type:"submit"},k(e,"span",{className:"visually-hidden",textContent:n.send}),E(e,"send"));j.title=n.send;let R=k(e,"span",{className:"divider"}),D=k(e,"div",{className:"toolbar"},v,P,L,x,N,k(e,"span",{className:"spacer"}),z,M,R,j),F=k(e,"span",{textContent:n.pages}),q=k(e,"button",{className:"chip page-chip",type:"button",title:n.pages},E(e,"page"),F,E(e,"chevrons"));q.setAttribute("aria-haspopup","listbox"),q.setAttribute("aria-expanded","false"),q.setAttribute("aria-controls","obelism-pages");let B=k(e,"input",{type:"text",placeholder:n.pagesSearch,autocomplete:"off",spellcheck:!1});B.setAttribute("role","combobox"),B.setAttribute("aria-label",n.pagesSearch),B.setAttribute("aria-autocomplete","list"),B.setAttribute("aria-expanded","true"),B.setAttribute("aria-controls","obelism-pages");let V=k(e,"ul",{className:"options",id:"obelism-pages"});V.setAttribute("role","listbox"),V.setAttribute("aria-label",n.pages);let Y=k(e,"p",{className:"empty"}),H=k(e,"div",{className:"pages"},k(e,"label",{className:"search"},E(e,"search"),B),V,Y),W=k(e,"span",{className:"unsaved"});W.appendChild(k(e,"span",{className:"dot"})),W.appendChild(e.createTextNode(n.unsaved));let _=k(e,"button",{className:"link",type:"button",textContent:n.signOut}),J=k(e,"button",{className:"action chip",type:"button",textContent:n.save}),X=k(e,"button",{className:"action chip",type:"button",textContent:n.publish}),Z=k(e,"div",{className:"footer"},q,W,k(e,"span",{className:"spacer"}),_,J,X),K=k(e,"form",{className:"panel"},p,$,g,u,D,H,Z),G=k(e,"div",{className:"root"},k(e,"div",{className:"bar"},l,d),K);a.append(k(e,"style",{textContent:w}),G);let Q=!1,ee=!1,et=!1,er=null,en=!1,eo=null,ea=!1,ei=!1,es=null,el=null,ed=null,ec=0,ep=e=>({text:e instanceof Error?e.message:String(e),error:!0}),eg=e=>{let r=e.features.includes("prompt"),o=e.saving||e.publishing,a=e.prompting||o;G.hidden=!r&&!i,l.hidden=Q||!r,d.hidden=r||!i,K.hidden=!Q||!r;let c=i&&e.features.includes("create"),y=i&&null===t.entryId,w=y&&c;c||(et=!1),w&&(et=!0),(et||y||!i)&&(en=!1);let k=Q&&r&&en;k&&!eo?eb():!k&&eo&&em(),s.textContent=w?n.newPage:n.open,U.hidden=w,v.hidden=et,P.hidden=!et,N.hidden=et||en||!c,N.disabled=a,ee&&(ei=!1),$.hidden=!et||ei||ee,I.disabled=a,g.hidden=en||ei||ee,u.hidden=!en||ei||ee,u.classList.toggle("loading",ea),D.hidden=ei,H.hidden=!ei,g.placeholder=et?n.newPagePlaceholder:n.placeholder,m.textContent=e.selectedUid?n.scopeBlock:n.scopeEntry,f.hidden=!e.selectedUid,h.hidden=!!e.selectedUid,b.hidden=!e.selectedUid,L.hidden=!i||et||y||!e.features.includes("form"),A.setAttribute("aria-pressed",String(!en)),S.setAttribute("aria-pressed",String(en)),L.querySelectorAll("button").forEach(e=>{e.disabled=a}),x.hidden=et||!e.canUndo,x.disabled=a,j.hidden=en||ee,R.hidden=en||ee;let E=ee?n.expand:n.minimize;z.title=E,z.setAttribute("aria-label",E),z.setAttribute("aria-expanded",String(!ee)),O.hidden=ee,T.hidden=!ee,j.disabled=a||""===g.value.trim()||et&&""===I.value.trim(),g.disabled=a,J.hidden=!e.features.includes("save")||y,J.disabled=a||!e.unsaved,J.textContent=e.saving?n.saving:n.save,X.hidden=!e.features.includes("publish")||y,X.disabled=a,X.textContent=e.publishing?n.publishing:n.publish,_.hidden=!i,Z.hidden=!i,W.hidden=!e.unsaved,q.hidden=!i,q.setAttribute("aria-expanded",String(ei)),F.textContent=es?.find(({entryId:e})=>e===t.entryId)?.name??n.pages;let C=en&&ea&&!ei,M=e.prompting||C,B=e.prompting?et?n.creating:n.working:C?n.formLoading:er?.text??(!i||et||ei||e.selectedUid?"":n.selectHint);p.textContent=B,p.hidden=!B||ee,p.className=`status${M?" working":""}${!a&&!C&&er?.error?" error":""}`},eu=()=>eg(t.getState()),eh=()=>{g.style.height="auto",g.style.height=`${g.scrollHeight}px`},eb=()=>{ea=!0,u.classList.add("loading");let e=t.openForm(u,{title:n.formTitle,onReady:()=>{eo===e&&(ea=!1,er=null,eu())},onError:t=>{eo===e&&(ea=!1,er={text:t,error:!0},eu())}});eo=e},em=()=>{eo?.close(),eo=null,ea=!1},ef=e=>{en!==e&&(en=e,er=null,eu(),en||g.focus())},ev=async()=>{if(en)return;let e=g.value.trim();if(e&&!t.getState().prompting){er=null;try{if(et){let r=I.value.trim();if(!r)return I.focus();await t.createPage(r,e),es=null,el=null,er={text:n.created,error:!1}}else{let{summary:r}=await t.prompt(e);er={text:r,error:!1}}g.value="",eh()}catch(e){er=ep(e)}eu(),g.focus()}},ey=()=>(el??(el=t.pages().then(e=>{es=e,ed=null,ew(),eu()},e=>{el=null,ed=ep(e).text,ew()})),el),ex=()=>{let e=B.value.trim().toLowerCase();return(es??[]).filter(t=>!e||t.name.toLowerCase().includes(e)||t.url.toLowerCase().includes(e)||`/${t.path}`.toLowerCase().includes(e))},ew=()=>{let r=ex();ec=Math.max(0,Math.min(ec,r.length-1)),V.textContent="",r.forEach((r,o)=>{let a=r.entryId===t.entryId,i=k(e,"li",{className:`option${o===ec?" active":""}`,id:`obelism-page-${o}`},k(e,"span",{className:"option-text"},k(e,"span",{textContent:r.name}),k(e,"span",{className:"option-path",textContent:r.url})));if(i.setAttribute("role","option"),i.setAttribute("aria-selected",String(o===ec)),"published"!==r.status&&i.appendChild(k(e,"span",{className:"badge",textContent:"draft"===r.status?n.pageDraft:n.pageChanged})),a){i.setAttribute("aria-current","page");let t=E(e,"check");t.removeAttribute("aria-hidden"),t.setAttribute("role","img"),t.setAttribute("aria-label",n.pageCurrent),i.appendChild(t)}i.addEventListener("click",()=>eE(r)),V.appendChild(i)});let o=V.children[ec];o?(B.setAttribute("aria-activedescendant",o.id),o.scrollIntoView?.({block:"nearest"})):B.removeAttribute("aria-activedescendant"),Y.textContent=(ed??(es?"":n.pagesLoading))||(0===r.length?n.pagesEmpty:""),Y.hidden=!Y.textContent,Y.className=`empty${ed?" error":""}`},ek=e=>{er=null,(ei=e)&&(B.value="",ec=Math.max(0,(es??[]).findIndex(({entryId:e})=>e===t.entryId)),ey(),ew()),eu(),(ei?B:q).focus()},eE=e=>{if(e.entryId===t.entryId)return ek(!1);t.openPage(e)},eC=e=>{(Q=e)||(ei=!1,ee=!1),eu(),i&&t.setSelecting(Q&&!et),Q&&i&&ey()},eA=e=>{et=e,er=null,t.setSelecting(Q&&!et),et&&t.select(null),eu(),(et?I:g).focus()},eS=async e=>{er=null;try{await t[e](),er={text:"save"===e?n.saved:n.published,error:!1}}catch(e){er=ep(e)}eu()};l.addEventListener("click",()=>{eC(!0),en||(et?I:g).focus()}),M.addEventListener("click",()=>eC(!1)),z.addEventListener("click",()=>{ee=!ee,eu(),ee||(en?z:g).focus()}),J.addEventListener("click",()=>void eS("save")),X.addEventListener("click",()=>void eS("publish")),_.addEventListener("click",()=>t.signOut()),c.addEventListener("click",()=>t.signOut()),f.addEventListener("click",()=>t.select(null)),N.addEventListener("click",()=>eA(!0)),U.addEventListener("click",()=>eA(!1)),A.addEventListener("click",()=>ef(!1)),S.addEventListener("click",()=>ef(!0)),q.addEventListener("click",()=>ek(!ei)),I.addEventListener("input",eu),I.addEventListener("keydown",e=>{"Enter"!==e.key||e.isComposing?"Escape"===e.key&&eC(!1):(e.preventDefault(),g.focus())}),B.addEventListener("input",()=>{ec=0,ew()}),B.addEventListener("keydown",e=>{let t=V.children.length;if("ArrowDown"===e.key||"ArrowUp"===e.key){if(e.preventDefault(),0===t)return;ec=(ec+("ArrowDown"===e.key?1:-1)+t)%t,ew()}else if("Enter"!==e.key||e.isComposing)"Escape"===e.key&&(e.preventDefault(),ek(!1));else{e.preventDefault();let t=ex()[ec];t&&eE(t)}}),x.addEventListener("click",()=>{er=null,t.undo()}),K.addEventListener("submit",e=>{e.preventDefault(),ev()}),g.addEventListener("input",()=>{eh(),eu()}),g.addEventListener("keydown",e=>{"Enter"!==e.key||e.shiftKey||e.isComposing?"Escape"===e.key&&eC(!1):(e.preventDefault(),ev())});let eL=t.on("change",eg);return eu(),e.body.appendChild(o),()=>{eL(),em(),o.remove()}},A="https://content.obelism.studio",S=(e,t)=>JSON.stringify(e)===JSON.stringify(t),L=Symbol.for("@obelism/content/bridge"),N=v({isEditing:!1,entryId:null,on:()=>{}},new URLSearchParams),U=({url:e,prompt:d=!0,pagePath:u}={})=>{let h;if("u"<typeof window)return N;let y=window;if(y[L])return y[L];if(y.ObelismBridge)h=v(y.ObelismBridge,new URLSearchParams(y.location.search));else{let v=(h=((e,r)=>{let d=new URLSearchParams(e.location.search),u=e.parent!==e&&d.has("cms_preview"),h=g(),v=[],y={...p,selecting:!0},x=e=>{y={...y,...e},h.emit("change",y)},w={isEditing:u,mode:u?"editor":null,entryId:d.get("cms_entry"),environment:d.get(n),on:h.on,getState:()=>y,...b,destroy:()=>{v.splice(0).forEach(e=>e())}};if(!u)return w;let k=e.document,E=(t,n={})=>{e.parent.postMessage({source:l,type:t,...n},r)},C=k.createElement("style");C.textContent=c(),k.head.appendChild(C),v.push(()=>C.remove());let A=(e,t)=>{if(k.querySelectorAll("[data-cms-selected]").forEach(e=>{e.removeAttribute("data-cms-selected")}),y.selectedUid!==(e??null)&&x({selectedUid:e??null}),!e)return;let r=k.querySelector(f(e));r&&(r.setAttribute("data-cms-selected",""),t&&r.scrollIntoView({behavior:"smooth",block:"center"}))},S=e=>{let r=e.target,n=r?.closest?.(`[${t}]`);if(!n)return;e.preventDefault(),e.stopPropagation();let o=n.getAttribute(t);A(o,!1),E("select",{uid:o})};k.addEventListener("click",S,!0),v.push(()=>k.removeEventListener("click",S,!0));let L=()=>E("ready",{url:e.location.href}),N=new Map,U=0,P=e=>{let t=N.get(e);return t?(clearTimeout(t.timer),N.delete(e),0===N.size&&x({prompting:!1}),t):null};w.prompt=(e,t={})=>{let r=e.trim();if(!r)return Promise.reject(Error("Say what to change"));if(!y.features.includes("prompt"))return Promise.reject(Error("The editor does not offer prompts here"));let n=`prompt_${++U}`,o=void 0===t.uid?y.selectedUid:t.uid;return new Promise((e,t)=>{let a=setTimeout(()=>{P(n)?.reject(Error("The editor did not answer in time"))},12e4);N.set(n,{resolve:e,reject:t,timer:a}),x({prompting:!0}),E("prompt",{id:n,prompt:r,uid:o})})},w.undo=()=>E("undo"),w.select=e=>{A(e,!1),E("select",{uid:e})};let I=null;v.push(()=>I?.destroy()),v.push(()=>{for(let e of N.keys())P(e)?.reject(Error("The bridge was destroyed"))});let $=t=>{if(t.origin!==r||t.source!==e.parent)return;let n=t.data;if(n&&"obelism-content-editor"===n.source){if("connect"===n.type)L();else if("update"===n.type&&n.entry)h.emit("update",{entry:n.entry,selectedUid:n.selectedUid??null}),e.requestAnimationFrame(()=>A(n.selectedUid,!1)),I?.refresh();else if("select"===n.type)A(n.uid,!0);else if("saved"===n.type||"published"===n.type)h.emit(n.type,{}),0===h.listeners.update.size&&e.location.reload();else if("features"===n.type&&Array.isArray(n.features))x({features:n.features.filter(e=>"string"==typeof e)});else if("stats"===n.type)x({stats:(e=>{if(!e||"object"!=typeof e||Array.isArray(e))return{};let t={};for(let[r,n]of Object.entries(e)){let{clicks:e,clickers:o,viewers:a,rate:i}=n??{};m(e)&&m(o)&&m(a)&&m(i)&&(t[r]={clicks:e,clickers:o,viewers:a,rate:i})}return t})(n.stats),statsVisible:!1!==n.visible}),(I||Object.keys(y.stats).length)&&(I??(I=((e,{selector:t,onSelect:r,labels:n})=>{let l=e.document,d={...o,...n},c=l.createElement("div");c.setAttribute("data-obelism-stats","");let p=c.attachShadow({mode:"open"}),g=l.createElement("style");g.textContent=i;let u=l.createElement("div");u.className="layer",p.append(g,u),l.body.appendChild(c);let h={},b=!1,m=null,f=()=>{if(m=null,u.replaceChildren(),u.hidden=!b,!b)return;let n=e.innerHeight;for(let[o,i]of Object.entries(h)){let c=l.querySelector(t(o));if(!c)continue;let p=c.getBoundingClientRect();if(!p.width&&!p.height||p.bottom<0||p.top>n)continue;let g=l.createElement("button");g.type="button",g.className="badge",g.dataset.uid=o,g.textContent=a(d.clicked,{rate:Math.round(100*i.rate)}),g.title=a(d.title,{clickers:i.clickers,viewers:i.viewers,clicks:i.clicks});let{place:h,top:b,left:m}=s(p,e.innerWidth);g.dataset.place=h,g.style.top=`${b}px`,g.style.left=`${m}px`,g.addEventListener("click",()=>r(o)),u.appendChild(g)}},v=()=>{null===m&&b&&(m=e.requestAnimationFrame(f))};e.addEventListener("scroll",v,{capture:!0,passive:!0}),e.addEventListener("resize",v);let y=e.MutationObserver,x="function"==typeof y?new y(v):null;return x?.observe(l.body,{childList:!0,subtree:!0}),{update(t,r){h=t,b=r,null!==m&&(e.cancelAnimationFrame?.(m),m=null),f()},refresh:v,destroy(){null!==m&&e.cancelAnimationFrame?.(m),e.removeEventListener("scroll",v,{capture:!0}),e.removeEventListener("resize",v),x?.disconnect(),c.remove()}}})(e,{selector:f,onSelect:e=>w.select(e)})),I.update(y.stats,y.statsVisible));else if("promptState"===n.type)x({canUndo:!0===n.canUndo});else if("promptResult"===n.type&&"string"==typeof n.id){let e=P(n.id);if(!e)return;!0===n.ok?e.resolve({summary:"string"==typeof n.summary?n.summary:""}):e.reject(Error("string"==typeof n.error?n.error:"The prompt failed"))}}};return e.addEventListener("message",$),v.push(()=>e.removeEventListener("message",$)),"loading"===k.readyState?(k.addEventListener("DOMContentLoaded",L,{once:!0}),v.push(()=>k.removeEventListener("DOMContentLoaded",L))):L(),w})(y,new URL(e||A).origin)).isEditing||y.parent!==y?null:(e=>{for(let t of e.cookie.split(";")){let[e,...r]=t.trim().split("=");if("obelism_content_editing"===e)try{let e=decodeURIComponent(r.join("="));return e.startsWith("/")&&!e.startsWith("//")?e:null}catch{break}}return null})(y.document);if(v&&(h=((e,n,{pagePath:o=e=>`/${e}`}={})=>{let a=e.document,i=g(),s=[],d=new Map,u=[],h=new Set,b=null,m=null,v=-1/0,y=new Map,x=p,w=e=>{x={...x,...e},i.emit("change",x)},k=()=>w({unsaved:[...d.values()].some(({content:e,saved:t})=>!S(e,t)),canUndo:u.length>0}),E=async(t,r)=>{let o=await e.fetch(`${n}/api/${t}`,void 0===r?{credentials:"same-origin"}:{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","x-obelism-content":"1"},body:JSON.stringify(r)}),a=await o.json().catch(()=>({}));if(401===o.status)throw w({features:[]}),Error("You were signed out. Sign in again to edit.");if(!o.ok)throw Error("string"==typeof a.error?a.error:`Obelism Content answered ${o.status}`);return a},C=()=>a.querySelector(`[${r}]`)?.getAttribute(r)??null,A=e=>{let t=e?a.querySelector(f(e)):null;return t?.closest(`[${r}]`)?.getAttribute(r)??C()},L=()=>{if(!b)return;let e=b.space.locales.map(({code:e})=>e),t=a.documentElement.lang;if(e.includes(t))return t;let r=t.split("-")[0]??"";return e.includes(r)?r:b.space.defaultLocale},N=new Map,U=async e=>{let t=d.get(e);if(t)return t;let r=N.get(e);return r||(r=E(`entries/${encodeURIComponent(e)}`).then(t=>{let r=d.get(e)??{content:t.content,saved:t.content,revision:t.draftRevision};return d.set(e,r),r}).finally(()=>N.delete(e)),N.set(e,r)),r},P=e=>{let t=void 0===e?x.selectedUid:e,r=A(t);if(!r)throw Error("Nothing on this page is marked as an entry: add editable(entry)");return{uid:t,entryId:r}},I=e=>{a.querySelectorAll("[data-cms-selected]").forEach(e=>{e.removeAttribute("data-cms-selected")}),x.selectedUid!==e&&w({selectedUid:e}),e&&a.querySelector(f(e))?.setAttribute("data-cms-selected","")},$=async t=>{if(0===i.listeners.update.size)return;let r=d.get(t)?.content,{entry:n}=await E(`entries/${encodeURIComponent(t)}/preview`,{content:r,locale:L()});i.emit("update",{entry:n,selectedUid:x.selectedUid}),e.requestAnimationFrame(()=>I(x.selectedUid))},M=e=>console.error("[@obelism/content bridge]",e),O=t=>{i.emit(t,{}),0===i.listeners.update.size&&e.location.reload()},T=async()=>{for(let[e,t]of d){if(S(t.content,t.saved))continue;let{draftRevision:r}=await E(`entries/${encodeURIComponent(e)}/save`,{content:t.content,baseRevision:t.revision});t.saved=t.content,t.revision=r,h.add(e)}u.length=0,v=-1/0,k()},z={isEditing:!0,mode:"site",get entryId(){return C()},environment:null,on:i.on,getState:()=>x,async prompt(e,t={}){let r=e.trim();if(!r)throw Error("Say what to change");if(!x.features.includes("prompt"))throw Error("You may not edit content here");let{uid:n,entryId:o}=P(t.uid);w({prompting:!0});try{let e=await U(o),t=await E(`entries/${encodeURIComponent(o)}/prompt`,{prompt:r,content:e.content,locale:L(),uid:n});return u.push({entryId:o,content:e.content}),v=-1/0,e.content=t.content,k(),await $(o),{summary:t.summary}}finally{w({prompting:!1})}},async createPage(t,r){let n=r.trim();if(!n)throw Error("Say what the page is for");if(!t.trim())throw Error("Say where the page goes, like /pricing");if(!x.features.includes("create"))throw Error("You may not add pages here");if(x.unsaved)throw Error("Save or undo your changes before adding a page");w({prompting:!0});try{let r=await E("entries",{path:t,prompt:n,locale:L(),from:C()}),a=o(r.path,L()??"");return e.location.assign(a),{summary:r.summary,entryId:r.entryId,path:r.path,url:a}}finally{w({prompting:!1})}},async view(e={}){let{uid:t,entryId:r}=P(e.uid),n=await U(r),{view:o}=await E(`entries/${encodeURIComponent(r)}/view`,{content:n.content,locale:L(),uid:t});return o},async applyJson(e,t={}){if(!x.features.includes("prompt"))throw Error("You may not edit content here");if(!e||"object"!=typeof e||Array.isArray(e))throw Error("Send the fields to change as an object");let{uid:r,entryId:n}=P(t.uid);w({prompting:!0});try{let t=await U(n),o=await E(`entries/${encodeURIComponent(n)}/apply`,{changes:e,content:t.content,locale:L(),uid:r});return S(o.content,t.content)||(u.push({entryId:n,content:t.content}),v=-1/0,t.content=o.content,k(),await $(n)),{changed:o.changed??[],...o.view&&{view:o.view}}}finally{w({prompting:!1})}},openForm(t,r={}){let{title:n="Content form",onReady:o,onError:a}=r;m?.();let s=!1,c=null,p=null,g=()=>{},h=e=>{s||a?.(e instanceof Error?e.message:String(e))},b=()=>{s||(s=!0,g(),c?.destroy(),m===b&&(m=null))};m=b;let f=()=>{if(s||!c)return;let e=A(x.selectedUid);if(!e)return;let t=d.get(e);if(!t)return void U(e).then(f,h);let r={entryId:e,content:t.content,locale:L(),selectedUid:x.selectedUid};p&&p.entryId===r.entryId&&p.content===r.content&&p.locale===r.locale&&p.selectedUid===r.selectedUid||(p=r,c.show(r))},w=(e,t)=>{let r=t??p?.entryId,n=void 0===r?void 0:d.get(r);if(s||void 0===r||!n||S(e,n.content))return;let o=Date.now();o-v>=1e3&&u.push({entryId:r,content:n.content}),v=o,n.content=e,p?.entryId===r&&(p={...p,content:e}),k(),clearTimeout(y.get(r)),y.set(r,setTimeout(()=>{y.delete(r),$(r).catch(M)},300))};return(async()=>{if(!x.features.includes("form"))throw Error("You may not edit content here");await U(P(void 0).entryId);let{url:r}=await E("form",{});s||(c=((e,t,r,n,o)=>{let a=null;try{a=new URL(r)}catch{}if(!a||!/^https?:$/.test(a.protocol))throw Error("Obelism Content sent no form to open");let i=a.origin,s=t.ownerDocument.createElement("iframe");s.title=n,s.src=r;let d=!1,c=null,p=()=>{d&&c&&s.contentWindow?.postMessage({source:l,type:"content",...c},i)},g=setTimeout(()=>{d||o.onError("The form did not open")},3e4),u=e=>{if(e.origin!==i||!s.contentWindow||e.source!==s.contentWindow)return;let t=e.data;if(t&&"obelism-content-form"===t.source)if("ready"===t.type)d=!0,clearTimeout(g),o.onReady(),p();else{let e;if("change"!==t.type||!(e=t.content)||"object"!=typeof e||Array.isArray(e))if("height"===t.type){let e=t.height;if("number"==typeof e&&Number.isFinite(e)){let t=Math.round(Math.min(Math.max(e,80),4e3));s.style.height=`min(${t}px, 60vh)`}}else"error"===t.type&&o.onError("string"==typeof t.message&&t.message?t.message:"The form failed");else o.onChange(t.content,"string"==typeof t.entryId?t.entryId:void 0)}};return e.addEventListener("message",u),t.appendChild(s),{show(e){c=e,p()},destroy(){clearTimeout(g),e.removeEventListener("message",u),s.remove()}}})(e,t,"string"==typeof r?r:"",n,{onReady:()=>o?.(),onChange:w,onError:e=>a?.(e)}),g=i.on("change",f),f())})().catch(h),{close:b}},async pages(){let{pages:e}=await E("pages"),t=[L(),b?.space.defaultLocale];return e.flatMap(e=>{let r=t.find(t=>void 0!==t&&void 0!==e.paths[t])??Object.keys(e.paths)[0],n=void 0===r?void 0:e.paths[r];return void 0===r||void 0===n?[]:[{entryId:e.entryId,name:e.name,contentType:e.contentType,status:e.status,path:n,url:o(n,r)}]})},openPage(t){(!x.unsaved||e.confirm("Leave this page and lose the changes you have not saved?"))&&(d.clear(),u.length=0,k(),e.location.assign(t.url))},undo(){let e=u.pop(),t=e&&d.get(e.entryId);e&&t&&(v=-1/0,t.content=e.content,k(),$(e.entryId).catch(M))},async save(){if(!x.features.includes("save"))throw Error("You may not edit content here");w({saving:!0});try{await T()}finally{w({saving:!1})}O("saved")},async publish(){if(!x.features.includes("publish"))throw Error("You may not publish here");w({publishing:!0});try{await T();let e=C(),t=h.size>0?[...h]:e?[e]:[];if(0===t.length)throw Error("Nothing on this page is marked as an entry: add editable(entry)");for(let e of t)await E(`entries/${encodeURIComponent(e)}/publish`,{}),h.delete(e)}finally{w({publishing:!1})}O("published")},signOut(){if(x.unsaved&&!e.confirm("Sign out and lose the changes you have not saved?"))return;d.clear(),k();let t=e.location.pathname+e.location.search;e.location.href=`${n}/logout?return_to=${encodeURIComponent(t)}`},select(e){I(e)},setSelecting(e){e?a.documentElement.setAttribute("data-cms-selecting",""):a.documentElement.removeAttribute("data-cms-selecting"),w({selecting:e})},destroy(){m?.(),y.forEach(e=>clearTimeout(e)),y.clear(),s.splice(0).forEach(e=>e())}},j=a.createElement("style");j.textContent=c("html[data-cms-selecting] "),a.head.appendChild(j),s.push(()=>j.remove()),s.push(()=>a.documentElement.removeAttribute("data-cms-selecting"));let R=e=>{if(!x.selecting)return;let r=e.target,n=r?.closest?.(`[${t}]`);n&&(e.preventDefault(),e.stopPropagation(),I(n.getAttribute(t)))};a.addEventListener("click",R,!0),s.push(()=>a.removeEventListener("click",R,!0));let D=e=>{x.unsaved&&(e.preventDefault(),e.returnValue="")};return e.addEventListener("beforeunload",D),s.push(()=>e.removeEventListener("beforeunload",D)),E("session").then(e=>{b=e,w({features:e.features})}).catch(e=>console.error("[@obelism/content bridge]",e)),z})(y,v,{pagePath:u})),h.isEditing&&d){let e=C(y.document,h,!0===d?{}:d),t=h.destroy;h.destroy=()=>{e(),t()}}}return y[L]=h,h};(e=window).ObelismBridge=U((e=>{let t=e?.dataset.url,r=t||A;if(!t&&e?.src){let t=new URL(e.src);"/bridge.js"===t.pathname&&(r=t.origin)}return{url:r,prompt:e?.dataset.prompt!=="false"}})(document.currentScript)),e.ObelismContent={getContentBridge:U,mountPromptBox:C}}();
|
|
247
|
+
`,C=(e,t,r={},...n)=>{let o=e.createElement(t);for(let t of(Object.assign(o,r),n))o.appendChild("string"==typeof t?e.createTextNode(t):t);return o},P=(e,t)=>{let r=C(e,"span",{className:"icon"});return r.setAttribute("aria-hidden","true"),r.innerHTML=`<svg viewBox="0 0 24 24">${k[t]}</svg>`,r},S=(e,t,r={})=>{let n,o={...x,...r.labels},a=C(e,"div");a.setAttribute("data-obelism-content-prompt","");let i=a.attachShadow({mode:"open"}),l="site"===t.mode,s=C(e,"span",{textContent:o.open}),d=C(e,"button",{className:"pill",type:"button"},s,((n=P(e,"mark")).classList.add("mark"),n)),c=C(e,"span",{className:"pill compact"},`${o.viewingDrafts} \xb7 `),p=C(e,"button",{className:"link",type:"button",textContent:o.signOut});c.appendChild(p);let g=C(e,"p",{className:"status"});g.setAttribute("role","status");let u=C(e,"textarea",{placeholder:o.placeholder,rows:1});u.setAttribute("aria-label",o.open);let h=C(e,"div",{className:"form"}),m=P(e,"page"),b=P(e,"block"),f=C(e,"span"),v=C(e,"button",{type:"button",title:o.clearBlock});v.setAttribute("aria-label",o.clearBlock),v.appendChild(P(e,"close"));let y=C(e,"span",{className:"chip scope"},m,b,f,v),k=C(e,"button",{className:"action chip",type:"button"},P(e,"undo"),o.undo),S=t=>{let r=C(e,"button",{type:"button",textContent:t});return r.setAttribute("aria-pressed","false"),r},L=S(o.modePrompt),A=S(o.form),N=C(e,"span",{className:"modes"},L,A);N.setAttribute("role","group"),N.setAttribute("aria-label",o.modes);let I=C(e,"button",{className:"action chip",type:"button"},P(e,"newPage"),o.newPage),U=C(e,"button",{className:"action chip product",type:"button"},P(e,"newPage"),o.addProductPage),M=C(e,"button",{type:"button",title:o.newPageCancel});M.setAttribute("aria-label",o.newPageCancel),M.appendChild(P(e,"close"));let $=C(e,"span",{className:"chip scope"},P(e,"newPage"),C(e,"span",{textContent:o.newPage}),M),O=C(e,"input",{type:"text",placeholder:o.pathPlaceholder,autocomplete:"off",spellcheck:!1}),j=C(e,"label",{className:"path"},C(e,"span",{textContent:o.path}),O),R=C(e,"button",{className:"close icon-button",type:"button",title:o.close},P(e,"close"));R.setAttribute("aria-label",o.close);let T=P(e,"minimize"),z=P(e,"expand"),D=C(e,"button",{className:"icon-button",type:"button"},T,z),F=C(e,"button",{className:"action primary icon-button",type:"submit"},C(e,"span",{className:"visually-hidden",textContent:o.send}),P(e,"send"));F.title=o.send;let B=C(e,"span",{className:"divider"}),q=C(e,"div",{className:"toolbar"},y,$,N,k,U,I,C(e,"span",{className:"spacer"}),D,R,B,F),V=C(e,"span",{textContent:o.pages}),W=C(e,"button",{className:"chip page-chip",type:"button",title:o.pages},P(e,"page"),V,P(e,"chevrons"));W.setAttribute("aria-haspopup","listbox"),W.setAttribute("aria-expanded","false"),W.setAttribute("aria-controls","obelism-pages");let H=C(e,"input",{type:"text",placeholder:o.pagesSearch,autocomplete:"off",spellcheck:!1});H.setAttribute("role","combobox"),H.setAttribute("aria-label",o.pagesSearch),H.setAttribute("aria-autocomplete","list"),H.setAttribute("aria-expanded","true"),H.setAttribute("aria-controls","obelism-pages");let Y=C(e,"ul",{className:"options",id:"obelism-pages"});Y.setAttribute("role","listbox"),Y.setAttribute("aria-label",o.pages);let X=C(e,"p",{className:"empty"}),_=C(e,"div",{className:"pages"},C(e,"label",{className:"search"},P(e,"search"),H),Y,X),J=C(e,"span",{className:"unsaved"});J.appendChild(C(e,"span",{className:"dot"})),J.appendChild(e.createTextNode(o.unsaved));let Z=C(e,"button",{className:"link",type:"button",textContent:o.signOut}),K=C(e,"button",{className:"action chip",type:"button",textContent:o.save}),G=C(e,"button",{className:"action chip",type:"button",textContent:o.publish}),Q=C(e,"div",{className:"footer"},W,J,C(e,"span",{className:"spacer"}),Z,K,G),ee=C(e,"form",{className:"panel"},g,j,u,h,q,_,Q),et=C(e,"div",{className:"root"},C(e,"div",{className:"bar"},d,c),ee);i.append(C(e,"style",{textContent:E}),et);let er=e.defaultView,en=e=>{"center"===e?delete et.dataset.side:et.dataset.side=e};en((()=>{try{let e=er?.localStorage.getItem(w);return"left"===e||"right"===e?e:"center"}catch{return"center"}})());let eo=null,ea=!1;et.addEventListener("pointerdown",e=>{if(ea=!1,0!==e.button||!e.isPrimary)return;let t=e.target.closest("button, input, textarea, iframe, a, label, .pages, .form");if(t&&t!==d)return;let{left:r,right:n}=et.getBoundingClientRect();eo={id:e.pointerId,startX:e.clientX,x:e.clientX,velocity:0,time:e.timeStamp,moved:!1,min:Math.min(0,16-r),max:Math.max(0,(er?.innerWidth??0)-16-n)}}),et.addEventListener("pointermove",e=>{if(!eo||e.pointerId!==eo.id)return;let t=e.clientX-eo.startX;if(!eo.moved){if(6>Math.abs(t))return;eo.moved=!0,et.classList.add("dragging");try{et.setPointerCapture(e.pointerId)}catch{}}let r=e.timeStamp-eo.time;r>0&&(eo.velocity=(e.clientX-eo.x)/r),eo.x=e.clientX,eo.time=e.timeStamp;let n=Math.min(Math.max(t,eo.min),eo.max);et.style.translate=`${n+(t-n)/3}px 0`});let ei=e=>{if(!eo||e.pointerId!==eo.id)return;let{moved:t,x:r,velocity:n,time:o}=eo;if(eo=null,!t)return;ea=!0;let a=et.getBoundingClientRect().left,i=er?.innerWidth??0,l=r+(e.timeStamp-o>80?0:Math.min(Math.max(150*n,-120),120)),s=l<i/3?"left":l>2*i/3?"right":"center";en(s),et.style.translate="";let d=et.getBoundingClientRect().left;et.style.translate=`${a-d}px 0`,et.offsetWidth,et.classList.remove("dragging"),et.style.translate="";try{er?.localStorage.setItem(w,s)}catch{}};et.addEventListener("pointerup",ei),et.addEventListener("pointercancel",ei),et.addEventListener("click",e=>{ea&&(ea=!1,e.preventDefault(),e.stopPropagation())},!0);let el=!1,es=!1,ed=!1,ec=null,ep=!1,eg=null,eu=!1,eh=!1,em=null,eb=null,ef=null,ev=0,ey=e=>({text:e instanceof Error?e.message:String(e),error:!0}),ex=e=>{let r=e.features.includes("prompt"),n=e.saving||e.publishing,a=e.prompting||n;et.hidden=!r&&!l,d.hidden=el||!r,c.hidden=r||!l,ee.hidden=!el||!r;let i=l&&e.features.includes("create"),p=l&&null===t.entryId,x=p&&i&&null!==t.product,w=p&&i&&!x;i||(ed=!1),w&&(ed=!0),(ed||p||!l)&&(ep=!1);let E=el&&r&&ep;E&&!eg?eE():!E&&eg&&eC();let C=x&&!ed;s.textContent=C?o.addProductPage:w?o.newPage:o.open,M.hidden=w,y.hidden=ed||C,$.hidden=!ed,U.hidden=!C,U.disabled=a,I.hidden=ed||ep||!i,I.disabled=a,es&&(eh=!1),j.hidden=!ed||eh||es,O.disabled=a,u.hidden=ep||eh||es||C,h.hidden=!ep||eh||es,h.classList.toggle("loading",eu),q.hidden=eh,_.hidden=!eh,u.placeholder=ed?o.newPagePlaceholder:o.placeholder,f.textContent=e.selectedUid?o.scopeBlock:o.scopeEntry,v.hidden=!e.selectedUid,m.hidden=!!e.selectedUid,b.hidden=!e.selectedUid,N.hidden=!l||ed||p||!e.features.includes("form"),L.setAttribute("aria-pressed",String(!ep)),A.setAttribute("aria-pressed",String(ep)),N.querySelectorAll("button").forEach(e=>{e.disabled=a}),k.hidden=ed||!e.canUndo,k.disabled=a,F.hidden=ep||es||C,B.hidden=ep||es||C;let P=es?o.expand:o.minimize;D.title=P,D.setAttribute("aria-label",P),D.setAttribute("aria-expanded",String(!es)),T.hidden=es,z.hidden=!es,F.disabled=a||""===u.value.trim()||ed&&""===O.value.trim(),u.disabled=a,K.hidden=!e.features.includes("save")||p,K.disabled=a||!e.unsaved,K.textContent=e.saving?o.saving:o.save,G.hidden=!e.features.includes("publish")||p,G.disabled=a,G.textContent=e.publishing?o.publishing:o.publish,Z.hidden=!l,Q.hidden=!l,J.hidden=!e.unsaved,W.hidden=!l,W.setAttribute("aria-expanded",String(eh)),V.textContent=em?.find(({entryId:e})=>e===t.entryId)?.name??o.pages;let S=ep&&eu&&!eh,R=e.prompting||S,H=e.prompting?ed?o.creating:C?o.addingProductPage:o.working:S?o.formLoading:ec?.text??(C?o.productPageHint:!l||ed||eh||e.selectedUid?"":o.selectHint);g.textContent=H,g.hidden=!H||es,g.className=`status${R?" working":""}${!a&&!S&&ec?.error?" error":""}`},ew=()=>ex(t.getState()),ek=()=>{u.style.height="auto",u.style.height=`${u.scrollHeight}px`},eE=()=>{eu=!0,h.classList.add("loading");let e=t.openForm(h,{title:o.formTitle,onReady:()=>{eg===e&&(eu=!1,ec=null,ew())},onError:t=>{eg===e&&(eu=!1,ec={text:t,error:!0},ew())}});eg=e},eC=()=>{eg?.close(),eg=null,eu=!1},eP=e=>{ep!==e&&(ep=e,ec=null,ew(),ep||u.focus())},eS=async()=>{if(ep)return;let e=u.value.trim();if(e&&!t.getState().prompting){ec=null;try{if(ed){let r=O.value.trim();if(!r)return O.focus();await t.createPage(r,e),em=null,eb=null,ec={text:o.created,error:!1}}else{let{summary:r}=await t.prompt(e);ec={text:r,error:!1}}u.value="",ek()}catch(e){ec=ey(e)}ew(),u.focus()}},eL=()=>(eb??(eb=t.pages().then(e=>{em=e,ef=null,eN(),ew()},e=>{eb=null,ef=ey(e).text,eN()})),eb),eA=()=>{let e=H.value.trim().toLowerCase();return(em??[]).filter(t=>!e||t.name.toLowerCase().includes(e)||t.url.toLowerCase().includes(e)||`/${t.path}`.toLowerCase().includes(e))},eN=()=>{let r=eA();ev=Math.max(0,Math.min(ev,r.length-1)),Y.textContent="",r.forEach((r,n)=>{let a=r.entryId===t.entryId,i=C(e,"li",{className:`option${n===ev?" active":""}`,id:`obelism-page-${n}`},C(e,"span",{className:"option-text"},C(e,"span",{textContent:r.name}),C(e,"span",{className:"option-path",textContent:r.url})));if(i.setAttribute("role","option"),i.setAttribute("aria-selected",String(n===ev)),"published"!==r.status&&i.appendChild(C(e,"span",{className:"badge",textContent:"draft"===r.status?o.pageDraft:o.pageChanged})),a){i.setAttribute("aria-current","page");let t=P(e,"check");t.removeAttribute("aria-hidden"),t.setAttribute("role","img"),t.setAttribute("aria-label",o.pageCurrent),i.appendChild(t)}i.addEventListener("click",()=>eU(r)),Y.appendChild(i)});let n=Y.children[ev];n?(H.setAttribute("aria-activedescendant",n.id),n.scrollIntoView?.({block:"nearest"})):H.removeAttribute("aria-activedescendant"),X.textContent=(ef??(em?"":o.pagesLoading))||(0===r.length?o.pagesEmpty:""),X.hidden=!X.textContent,X.className=`empty${ef?" error":""}`},eI=e=>{ec=null,(eh=e)&&(H.value="",ev=Math.max(0,(em??[]).findIndex(({entryId:e})=>e===t.entryId)),eL(),eN()),ew(),(eh?H:W).focus()},eU=e=>{if(e.entryId===t.entryId)return eI(!1);t.openPage(e)},eM=e=>{(el=e)||(eh=!1,es=!1),ew(),l&&t.setSelecting(el&&!ed),el&&l&&eL()},e$=e=>{ed=e,ec=null,t.setSelecting(el&&!ed),ed&&t.select(null),ew(),(ed?O:u).focus()},eO=async e=>{ec=null;try{await t[e](),ec={text:"save"===e?o.saved:o.published,error:!1}}catch(e){ec=ey(e)}ew()};d.addEventListener("click",()=>{eM(!0),ep||(ed?O:u).focus()}),R.addEventListener("click",()=>eM(!1)),D.addEventListener("click",()=>{es=!es,ew(),es||(ep?D:u).focus()}),ee.addEventListener("click",e=>{if(!es)return;let t=e.target.closest("button");t&&t!==D&&t!==R&&(es=!1,ew())},!0),K.addEventListener("click",()=>void eO("save")),G.addEventListener("click",()=>void eO("publish")),Z.addEventListener("click",()=>t.signOut()),p.addEventListener("click",()=>t.signOut()),v.addEventListener("click",()=>t.select(null)),I.addEventListener("click",()=>e$(!0)),U.addEventListener("click",async()=>{ec=null;try{await t.createProductPage(),ec={text:o.addedProductPage,error:!1}}catch(e){ec=ey(e)}ew()}),M.addEventListener("click",()=>e$(!1)),L.addEventListener("click",()=>eP(!1)),A.addEventListener("click",()=>eP(!0)),W.addEventListener("click",()=>eI(!eh)),O.addEventListener("input",ew),O.addEventListener("keydown",e=>{"Enter"!==e.key||e.isComposing?"Escape"===e.key&&eM(!1):(e.preventDefault(),u.focus())}),H.addEventListener("input",()=>{ev=0,eN()}),H.addEventListener("keydown",e=>{let t=Y.children.length;if("ArrowDown"===e.key||"ArrowUp"===e.key){if(e.preventDefault(),0===t)return;ev=(ev+("ArrowDown"===e.key?1:-1)+t)%t,eN()}else if("Enter"!==e.key||e.isComposing)"Escape"===e.key&&(e.preventDefault(),eI(!1));else{e.preventDefault();let t=eA()[ev];t&&eU(t)}}),k.addEventListener("click",()=>{ec=null,t.undo()}),ee.addEventListener("submit",e=>{e.preventDefault(),eS()}),u.addEventListener("input",()=>{ek(),ew()}),u.addEventListener("keydown",e=>{"Enter"!==e.key||e.shiftKey||e.isComposing?"Escape"===e.key&&eM(!1):(e.preventDefault(),eS())});let ej=t.on("change",ex);return ew(),e.body.appendChild(a),()=>{ej(),eC(),a.remove()}},L="https://content.obelism.studio",A=(e,t)=>JSON.stringify(e)===JSON.stringify(t),N=Symbol.for("@obelism/content/bridge"),I=y({isEditing:!1,entryId:null,on:()=>{}},new URLSearchParams),U=({url:e,prompt:c=!0,pagePath:h,productPath:m}={})=>{let x;if("u"<typeof window)return I;let w=window;if(w[N])return w[N];if(w.ObelismBridge)x=y(w.ObelismBridge,new URLSearchParams(w.location.search));else{let y=(x=((e,r)=>{let n=new URLSearchParams(e.location.search),c=e.parent!==e&&n.has("cms_preview"),h=u(),m=[],y={...g,selecting:!0},x=e=>{y={...y,...e},h.emit("change",y)},w={isEditing:c,mode:c?"editor":null,entryId:n.get("cms_entry"),environment:n.get(o),product:null,on:h.on,getState:()=>y,...b,destroy:()=>{m.splice(0).forEach(e=>e())}};if(!c)return w;let k=e.document,E=(t,n={})=>{e.parent.postMessage({source:d,type:t,...n},r)},C=k.createElement("style");C.textContent=p(),k.head.appendChild(C),m.push(()=>C.remove());let P=(e,t)=>{if(k.querySelectorAll("[data-cms-selected]").forEach(e=>{e.removeAttribute("data-cms-selected")}),y.selectedUid!==(e??null)&&x({selectedUid:e??null}),!e)return;let r=k.querySelector(v(e));r&&(r.setAttribute("data-cms-selected",""),t&&r.scrollIntoView({behavior:"smooth",block:"center"}))},S=e=>{let r=e.target,n=r?.closest?.(`[${t}]`);if(!n)return;e.preventDefault(),e.stopPropagation();let o=n.getAttribute(t);P(o,!1),E("select",{uid:o})};k.addEventListener("click",S,!0),m.push(()=>k.removeEventListener("click",S,!0));let L=()=>E("ready",{url:e.location.href}),A=new Map,N=0,I=e=>{let t=A.get(e);return t?(clearTimeout(t.timer),A.delete(e),0===A.size&&x({prompting:!1}),t):null};w.prompt=(e,t={})=>{let r=e.trim();if(!r)return Promise.reject(Error("Say what to change"));if(!y.features.includes("prompt"))return Promise.reject(Error("The editor does not offer prompts here"));let n=`prompt_${++N}`,o=void 0===t.uid?y.selectedUid:t.uid;return new Promise((e,t)=>{let a=setTimeout(()=>{I(n)?.reject(Error("The editor did not answer in time"))},12e4);A.set(n,{resolve:e,reject:t,timer:a}),x({prompting:!0}),E("prompt",{id:n,prompt:r,uid:o})})},w.undo=()=>E("undo"),w.select=e=>{P(e,!1),E("select",{uid:e})};let U=null;m.push(()=>U?.destroy()),m.push(()=>{for(let e of A.keys())I(e)?.reject(Error("The bridge was destroyed"))});let M=t=>{if(t.origin!==r||t.source!==e.parent)return;let n=t.data;if(n&&"obelism-content-editor"===n.source){if("connect"===n.type)L();else if("update"===n.type&&n.entry)h.emit("update",{entry:n.entry,selectedUid:n.selectedUid??null}),e.requestAnimationFrame(()=>P(n.selectedUid,!1)),U?.refresh();else if("select"===n.type)P(n.uid,!0);else if("saved"===n.type||"published"===n.type)h.emit(n.type,{}),0===h.listeners.update.size&&e.location.reload();else if("features"===n.type&&Array.isArray(n.features))x({features:n.features.filter(e=>"string"==typeof e)});else if("stats"===n.type)x({stats:(e=>{if(!e||"object"!=typeof e||Array.isArray(e))return{};let t={};for(let[r,n]of Object.entries(e)){let{clicks:e,clickers:o,viewers:a,rate:i}=n??{};f(e)&&f(o)&&f(a)&&f(i)&&(t[r]={clicks:e,clickers:o,viewers:a,rate:i})}return t})(n.stats),statsVisible:!1!==n.visible}),(U||Object.keys(y.stats).length)&&(U??(U=((e,{selector:t,onSelect:r,labels:n})=>{let o=e.document,d={...a,...n},c=o.createElement("div");c.setAttribute("data-obelism-stats","");let p=c.attachShadow({mode:"open"}),g=o.createElement("style");g.textContent=l;let u=o.createElement("div");u.className="layer",p.append(g,u),o.body.appendChild(c);let h={},m=!1,b=null,f=()=>{if(b=null,u.replaceChildren(),u.hidden=!m,!m)return;let n=e.innerHeight;for(let[a,l]of Object.entries(h)){let c=o.querySelector(t(a));if(!c)continue;let p=c.getBoundingClientRect();if(!p.width&&!p.height||p.bottom<0||p.top>n)continue;let g=o.createElement("button");g.type="button",g.className="badge",g.dataset.uid=a,g.textContent=i(d.clicked,{rate:Math.round(100*l.rate)}),g.title=i(d.title,{clickers:l.clickers,viewers:l.viewers,clicks:l.clicks});let{place:h,top:m,left:b}=s(p,e.innerWidth);g.dataset.place=h,g.style.top=`${m}px`,g.style.left=`${b}px`,g.addEventListener("click",()=>r(a)),u.appendChild(g)}},v=()=>{null===b&&m&&(b=e.requestAnimationFrame(f))};e.addEventListener("scroll",v,{capture:!0,passive:!0}),e.addEventListener("resize",v);let y=e.MutationObserver,x="function"==typeof y?new y(v):null;return x?.observe(o.body,{childList:!0,subtree:!0}),{update(t,r){h=t,m=r,null!==b&&(e.cancelAnimationFrame?.(b),b=null),f()},refresh:v,destroy(){null!==b&&e.cancelAnimationFrame?.(b),e.removeEventListener("scroll",v,{capture:!0}),e.removeEventListener("resize",v),x?.disconnect(),c.remove()}}})(e,{selector:v,onSelect:e=>w.select(e)})),U.update(y.stats,y.statsVisible));else if("promptState"===n.type)x({canUndo:!0===n.canUndo});else if("promptResult"===n.type&&"string"==typeof n.id){let e=I(n.id);if(!e)return;!0===n.ok?e.resolve({summary:"string"==typeof n.summary?n.summary:""}):e.reject(Error("string"==typeof n.error?n.error:"The prompt failed"))}}};return e.addEventListener("message",M),m.push(()=>e.removeEventListener("message",M)),"loading"===k.readyState?(k.addEventListener("DOMContentLoaded",L,{once:!0}),m.push(()=>k.removeEventListener("DOMContentLoaded",L))):L(),w})(w,new URL(e||L).origin)).isEditing||w.parent!==w?null:(e=>{for(let t of e.cookie.split(";")){let[e,...r]=t.trim().split("=");if("obelism_content_editing"===e)try{let e=decodeURIComponent(r.join("="));return e.startsWith("/")&&!e.startsWith("//")?e:null}catch{break}}return null})(w.document);if(y&&(x=((e,o,{pagePath:a=e=>`/${e}`,productPath:i}={})=>{let l=e.document,s=u(),c=[],h=new Map,m=[],b=new Set,f=null,y=null,x=-1/0,w=new Map,k=g,E=e=>{k={...k,...e},s.emit("change",k)},C=()=>E({unsaved:[...h.values()].some(({content:e,saved:t})=>!A(e,t)),canUndo:m.length>0}),P=async(t,r)=>{let n=await e.fetch(`${o}/api/${t}`,void 0===r?{credentials:"same-origin"}:{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","x-obelism-content":"1"},body:JSON.stringify(r)}),a=await n.json().catch(()=>({}));if(401===n.status)throw E({features:[]}),Error("You were signed out. Sign in again to edit.");if(!n.ok)throw Error("string"==typeof a.error?a.error:`Obelism Content answered ${n.status}`);return a},S=()=>l.querySelector(`[${r}]`)?.getAttribute(r)??null,L=()=>{let e=l.querySelector(`[${n}]`),t=e?.getAttribute(n),r=e?.getAttribute("data-cms-product-handle");return t&&r?{id:t,handle:r}:null},N=e=>{let t=e?l.querySelector(v(e)):null;return t?.closest(`[${r}]`)?.getAttribute(r)??S()},I=()=>{if(!f)return;let e=f.space.locales.map(({code:e})=>e),t=l.documentElement.lang;if(e.includes(t))return t;let r=t.split("-")[0]??"";return e.includes(r)?r:f.space.defaultLocale},U=new Map,M=async e=>{let t=h.get(e);if(t)return t;let r=U.get(e);return r||(r=P(`entries/${encodeURIComponent(e)}`).then(t=>{let r=h.get(e)??{content:t.content,saved:t.content,revision:t.draftRevision};return h.set(e,r),r}).finally(()=>U.delete(e)),U.set(e,r)),r},$=e=>{let t=void 0===e?k.selectedUid:e,r=N(t);if(!r)throw Error("Nothing on this page is marked as an entry: add editable(entry)");return{uid:t,entryId:r}},O=e=>{l.querySelectorAll("[data-cms-selected]").forEach(e=>{e.removeAttribute("data-cms-selected")}),k.selectedUid!==e&&E({selectedUid:e}),e&&l.querySelector(v(e))?.setAttribute("data-cms-selected","")},j=async t=>{if(0===s.listeners.update.size)return;let r=h.get(t)?.content,{entry:n}=await P(`entries/${encodeURIComponent(t)}/preview`,{content:r,locale:I()});s.emit("update",{entry:n,selectedUid:k.selectedUid}),e.requestAnimationFrame(()=>O(k.selectedUid))},R=e=>console.error("[@obelism/content bridge]",e),T=t=>{s.emit(t,{}),0===s.listeners.update.size&&e.location.reload()},z=async()=>{for(let[e,t]of h){if(A(t.content,t.saved))continue;let{draftRevision:r}=await P(`entries/${encodeURIComponent(e)}/save`,{content:t.content,baseRevision:t.revision});t.saved=t.content,t.revision=r,b.add(e)}m.length=0,x=-1/0,C()},D={isEditing:!0,mode:"site",get entryId(){return S()},get product(){return L()},environment:null,on:s.on,getState:()=>k,async prompt(e,t={}){let r=e.trim();if(!r)throw Error("Say what to change");if(!k.features.includes("prompt"))throw Error("You may not edit content here");let{uid:n,entryId:o}=$(t.uid);E({prompting:!0});try{let e=await M(o),t=await P(`entries/${encodeURIComponent(o)}/prompt`,{prompt:r,content:e.content,locale:I(),uid:n});return m.push({entryId:o,content:e.content}),x=-1/0,e.content=t.content,C(),await j(o),{summary:t.summary}}finally{E({prompting:!1})}},async createPage(t,r){let n=r.trim();if(!n)throw Error("Say what the page is for");if(!t.trim())throw Error("Say where the page goes, like /pricing");if(!k.features.includes("create"))throw Error("You may not add pages here");if(k.unsaved)throw Error("Save or undo your changes before adding a page");E({prompting:!0});try{let r=await P("entries",{path:t,prompt:n,locale:I(),from:S()}),o=a(r.path,I()??"");return e.location.assign(o),{summary:r.summary,entryId:r.entryId,path:r.path,url:o}}finally{E({prompting:!1})}},async createProductPage(t=L()??void 0){if(!t)throw Error("Nothing on this page is marked as a product: add editableProduct(product)");if(!k.features.includes("create"))throw Error("You may not add pages here");if(k.unsaved)throw Error("Save or undo your changes before adding a page");E({prompting:!0});try{let r=await P("product-pages",{product:{id:t.id,handle:t.handle}});return e.location.reload(),r}finally{E({prompting:!1})}},async view(e={}){let{uid:t,entryId:r}=$(e.uid),n=await M(r),{view:o}=await P(`entries/${encodeURIComponent(r)}/view`,{content:n.content,locale:I(),uid:t});return o},async applyJson(e,t={}){if(!k.features.includes("prompt"))throw Error("You may not edit content here");if(!e||"object"!=typeof e||Array.isArray(e))throw Error("Send the fields to change as an object");let{uid:r,entryId:n}=$(t.uid);E({prompting:!0});try{let t=await M(n),o=await P(`entries/${encodeURIComponent(n)}/apply`,{changes:e,content:t.content,locale:I(),uid:r});return A(o.content,t.content)||(m.push({entryId:n,content:t.content}),x=-1/0,t.content=o.content,C(),await j(n)),{changed:o.changed??[],...o.view&&{view:o.view}}}finally{E({prompting:!1})}},openForm(t,r={}){let{title:n="Content form",onReady:o,onError:a}=r;y?.();let i=!1,l=null,c=null,p=()=>{},g=e=>{i||a?.(e instanceof Error?e.message:String(e))},u=()=>{i||(i=!0,p(),l?.destroy(),y===u&&(y=null))};y=u;let b=()=>{if(i||!l)return;let e=N(k.selectedUid);if(!e)return;let t=h.get(e);if(!t)return void M(e).then(b,g);let r={entryId:e,content:t.content,locale:I(),selectedUid:k.selectedUid};c&&c.entryId===r.entryId&&c.content===r.content&&c.locale===r.locale&&c.selectedUid===r.selectedUid||(c=r,l.show(r))},f=(e,t)=>{let r=t??c?.entryId,n=void 0===r?void 0:h.get(r);if(i||void 0===r||!n||A(e,n.content))return;let o=Date.now();o-x>=1e3&&m.push({entryId:r,content:n.content}),x=o,n.content=e,c?.entryId===r&&(c={...c,content:e}),C(),clearTimeout(w.get(r)),w.set(r,setTimeout(()=>{w.delete(r),j(r).catch(R)},300))};return(async()=>{if(!k.features.includes("form"))throw Error("You may not edit content here");await M($(void 0).entryId);let{url:r}=await P("form",{});i||(l=((e,t,r,n,o)=>{let a=null;try{a=new URL(r)}catch{}if(!a||!/^https?:$/.test(a.protocol))throw Error("Obelism Content sent no form to open");let i=a.origin,l=t.ownerDocument.createElement("iframe");l.title=n,l.src=r;let s=!1,c=!1,p=null,g=()=>{s&&p&&l.contentWindow?.postMessage({source:d,type:"content",...p},i)},u=setTimeout(()=>{c||o.onError("The form did not open")},3e4),h=()=>{c=!0,clearTimeout(u),o.onReady()},m=e=>{if(e.origin!==i||!l.contentWindow||e.source!==l.contentWindow)return;let t=e.data;if(t&&"obelism-content-form"===t.source)if("ready"===t.type)s=!0,g(),!0!==t.loading&&h();else if("loaded"===t.type)s&&h();else{let e;if("change"!==t.type||!(e=t.content)||"object"!=typeof e||Array.isArray(e))if("height"===t.type){let e=t.height;if("number"==typeof e&&Number.isFinite(e)){let t=Math.round(Math.min(Math.max(e,80),4e3));l.style.height=`min(${t}px, 60vh)`}}else"error"===t.type&&o.onError("string"==typeof t.message&&t.message?t.message:"The form failed");else o.onChange(t.content,"string"==typeof t.entryId?t.entryId:void 0)}};return e.addEventListener("message",m),t.appendChild(l),{show(e){p=e,g()},destroy(){clearTimeout(u),e.removeEventListener("message",m),l.remove()}}})(e,t,"string"==typeof r?r:"",n,{onReady:()=>o?.(),onChange:f,onError:e=>a?.(e)}),p=s.on("change",b),b())})().catch(g),{close:u}},async pages(){let{pages:e}=await P("pages"),t=[I(),f?.space.defaultLocale];return e.flatMap(e=>{let r,n=t.find(t=>void 0!==t&&void 0!==e.paths[t])??Object.keys(e.paths)[0],o=void 0===n?void 0:e.paths[n];return void 0===n||void 0===o?[]:[{entryId:e.entryId,name:e.name,contentType:e.contentType,status:e.status,path:o,url:e.product?(r=e.product.handle,i?i(r,n):(f?.productPath??"/products/{handle}").replaceAll("{handle}",encodeURIComponent(r))):a(o,n),product:e.product??null}]})},openPage(t){(!k.unsaved||e.confirm("Leave this page and lose the changes you have not saved?"))&&(h.clear(),m.length=0,C(),e.location.assign(t.url))},undo(){let e=m.pop(),t=e&&h.get(e.entryId);e&&t&&(x=-1/0,t.content=e.content,C(),j(e.entryId).catch(R))},async save(){if(!k.features.includes("save"))throw Error("You may not edit content here");E({saving:!0});try{await z()}finally{E({saving:!1})}T("saved")},async publish(){if(!k.features.includes("publish"))throw Error("You may not publish here");E({publishing:!0});try{await z();let e=S(),t=b.size>0?[...b]:e?[e]:[];if(0===t.length)throw Error("Nothing on this page is marked as an entry: add editable(entry)");for(let e of t)await P(`entries/${encodeURIComponent(e)}/publish`,{}),b.delete(e)}finally{E({publishing:!1})}T("published")},signOut(){if(k.unsaved&&!e.confirm("Sign out and lose the changes you have not saved?"))return;h.clear(),C();let t=e.location.pathname+e.location.search;e.location.href=`${o}/logout?return_to=${encodeURIComponent(t)}`},select(e){O(e)},setSelecting(e){e?l.documentElement.setAttribute("data-cms-selecting",""):l.documentElement.removeAttribute("data-cms-selecting"),E({selecting:e})},destroy(){y?.(),w.forEach(e=>clearTimeout(e)),w.clear(),c.splice(0).forEach(e=>e())}},F=l.createElement("style");F.textContent=p("html[data-cms-selecting] "),l.head.appendChild(F),c.push(()=>F.remove()),c.push(()=>l.documentElement.removeAttribute("data-cms-selecting"));let B=e=>{if(!k.selecting)return;let r=e.target,n=r?.closest?.(`[${t}]`);n&&(e.preventDefault(),e.stopPropagation(),O(n.getAttribute(t)))};l.addEventListener("click",B,!0),c.push(()=>l.removeEventListener("click",B,!0));let q=e=>{k.unsaved&&(e.preventDefault(),e.returnValue="")};return e.addEventListener("beforeunload",q),c.push(()=>e.removeEventListener("beforeunload",q)),P("session").then(e=>{f=e,E({features:e.features})}).catch(e=>console.error("[@obelism/content bridge]",e)),D})(w,y,{pagePath:h,productPath:m})),x.isEditing&&c){let e=S(w.document,x,!0===c?{}:c),t=x.destroy;x.destroy=()=>{e(),t()}}}return w[N]=x,x};(e=window).ObelismBridge=U((e=>{let t=e?.dataset.url,r=t||L;if(!t&&e?.src){let t=new URL(e.src);"/bridge.js"===t.pathname&&(r=t.origin)}return{url:r,prompt:e?.dataset.prompt!=="false"}})(document.currentScript)),e.ObelismContent={getContentBridge:U,mountPromptBox:S}}();
|