@obelism/content 0.19.2 → 0.20.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 +26 -0
- package/dist/bridge.d.mts +11 -2
- package/dist/bridge.d.mts.map +1 -1
- package/dist/bridge.d.ts +11 -2
- package/dist/bridge.d.ts.map +1 -1
- package/dist/bridge.global.js +3 -3
- package/dist/bridge.js +223 -24
- package/dist/bridge.mjs +223 -24
- package/dist/index.d.mts +9 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.mjs +1 -1
- package/dist/{preview-jcmxxj92.mjs → preview-fu3qtgfx.mjs} +15 -1
- package/dist/{preview-ijk3ixwb.js → preview-ooq8w3jv.js} +17 -0
- package/dist/site.js +6 -1
- package/dist/site.mjs +6 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -175,6 +175,22 @@ getContentBridge({ productPath: (handle, locale) => `/${locale}/p/${handle}` })
|
|
|
175
175
|
await bridge.createProductPage() // or your own UI; bridge.product says which
|
|
176
176
|
```
|
|
177
177
|
|
|
178
|
+
A collection route works the same with `editableCollection(collection)`:
|
|
179
|
+
**Add a collection page** makes a draft of the space's collection page type
|
|
180
|
+
(in the `collections` folder), and the page list opens collection pages at
|
|
181
|
+
the environment's collection path (`/collections/{handle}` by default), or
|
|
182
|
+
at your own `collectionPath`:
|
|
183
|
+
|
|
184
|
+
```tsx
|
|
185
|
+
import { editable, editableCollection } from '@obelism/content'
|
|
186
|
+
|
|
187
|
+
;<main {...editableCollection(collection)} {...editable(collectionPage)}>
|
|
188
|
+
…
|
|
189
|
+
</main>
|
|
190
|
+
|
|
191
|
+
await bridge.createCollectionPage() // bridge.collection says which
|
|
192
|
+
```
|
|
193
|
+
|
|
178
194
|
There the box also switches between **Prompt** and **Form**. Form shows the
|
|
179
195
|
CMS's own form for the page — or for the entry around the selected block —
|
|
180
196
|
right in the box: the fields, and blocks as cards to open and add,
|
|
@@ -405,6 +421,16 @@ const productPage = await content.getFirstEntry({
|
|
|
405
421
|
})
|
|
406
422
|
```
|
|
407
423
|
|
|
424
|
+
A page type with a unique collection field is a collection page type, found
|
|
425
|
+
the same way on your collection route:
|
|
426
|
+
|
|
427
|
+
```ts
|
|
428
|
+
const collectionPage = await content.getFirstEntry({
|
|
429
|
+
contentType: 'collectionPage',
|
|
430
|
+
fields: { collection: collection.id }, // gid://shopify/Collection/…
|
|
431
|
+
})
|
|
432
|
+
```
|
|
433
|
+
|
|
408
434
|
`fetchShopifyProducts(items, options)` does the same for a product field
|
|
409
435
|
(one item or a list), in the field's order. Both leave out what the store no
|
|
410
436
|
longer has. A Hydrogen or Liquid site can use the `id` with its own
|
package/dist/bridge.d.mts
CHANGED
|
@@ -59,6 +59,7 @@ type CreateProductPageResult = {
|
|
|
59
59
|
path: string;
|
|
60
60
|
created: boolean;
|
|
61
61
|
};
|
|
62
|
+
type CreateCollectionPageResult = CreateProductPageResult;
|
|
62
63
|
type ApplyJsonResult = {
|
|
63
64
|
changed: string[];
|
|
64
65
|
view?: Record<string, unknown> | undefined;
|
|
@@ -79,6 +80,7 @@ type SitePage = {
|
|
|
79
80
|
path: string;
|
|
80
81
|
url: string;
|
|
81
82
|
product: ShopifyItem | null;
|
|
83
|
+
collection: ShopifyItem | null;
|
|
82
84
|
};
|
|
83
85
|
type ContentBridge = {
|
|
84
86
|
readonly isEditing: boolean;
|
|
@@ -86,6 +88,7 @@ type ContentBridge = {
|
|
|
86
88
|
readonly entryId: string | null;
|
|
87
89
|
readonly environment: string | null;
|
|
88
90
|
readonly product: ShopifyItem | null;
|
|
91
|
+
readonly collection: ShopifyItem | null;
|
|
89
92
|
on<E extends BridgeEvent>(event: E, listener: BridgeListener<E>): () => void;
|
|
90
93
|
getState(): BridgeState;
|
|
91
94
|
prompt(prompt: string, options?: {
|
|
@@ -93,6 +96,7 @@ type ContentBridge = {
|
|
|
93
96
|
}): Promise<PromptResult>;
|
|
94
97
|
createPage(path: string, prompt: string): Promise<CreatePageResult>;
|
|
95
98
|
createProductPage(product?: ShopifyItem): Promise<CreateProductPageResult>;
|
|
99
|
+
createCollectionPage(collection?: ShopifyItem): Promise<CreateCollectionPageResult>;
|
|
96
100
|
view(options?: {
|
|
97
101
|
uid?: string | null | undefined;
|
|
98
102
|
}): Promise<Record<string, unknown>>;
|
|
@@ -157,6 +161,10 @@ type PromptLabels = {
|
|
|
157
161
|
addingProductPage: string;
|
|
158
162
|
addedProductPage: string;
|
|
159
163
|
productPageHint: string;
|
|
164
|
+
addCollectionPage: string;
|
|
165
|
+
addingCollectionPage: string;
|
|
166
|
+
addedCollectionPage: string;
|
|
167
|
+
collectionPageHint: string;
|
|
160
168
|
};
|
|
161
169
|
declare const DEFAULT_PROMPT_LABELS: PromptLabels;
|
|
162
170
|
type PromptBoxOptions = {
|
|
@@ -169,10 +177,11 @@ type BridgeOptions = {
|
|
|
169
177
|
prompt?: boolean | PromptBoxOptions | undefined;
|
|
170
178
|
pagePath?: ((path: string, locale: string) => string) | undefined;
|
|
171
179
|
productPath?: ((handle: string, locale: string) => string) | undefined;
|
|
180
|
+
collectionPath?: ((handle: string, locale: string) => string) | undefined;
|
|
172
181
|
};
|
|
173
182
|
declare const peekContentBridge: () => ContentBridge | null;
|
|
174
|
-
declare const getContentBridge: ({ url, prompt, pagePath, productPath, }?: BridgeOptions) => ContentBridge;
|
|
183
|
+
declare const getContentBridge: ({ url, prompt, pagePath, productPath, collectionPath, }?: BridgeOptions) => ContentBridge;
|
|
175
184
|
|
|
176
185
|
export { DEFAULT_PROMPT_LABELS, DEFAULT_STATS_LABELS, INITIAL_STATE, getContentBridge, mountPromptBox, mountStatsOverlay, peekContentBridge };
|
|
177
|
-
export type { ApplyJsonResult, BlockStats, BridgeEvent, BridgeEvents, BridgeListener, BridgeOptions, BridgeState, ContentBridge, CreatePageResult, CreateProductPageResult, FormHandle, FormOptions, PromptBoxOptions, PromptLabels, PromptResult, SitePage, StatsLabels, StatsOverlay };
|
|
186
|
+
export type { ApplyJsonResult, BlockStats, BridgeEvent, BridgeEvents, BridgeListener, BridgeOptions, BridgeState, ContentBridge, CreateCollectionPageResult, CreatePageResult, CreateProductPageResult, FormHandle, FormOptions, PromptBoxOptions, PromptLabels, PromptResult, SitePage, StatsLabels, StatsOverlay };
|
|
178
187
|
//# 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,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;;
|
|
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,0BAA0B,GAAG,uBAAuB;AACzD,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,gBAAgB,WAAW;AAC3B;AACA,KAAK,aAAa;AAClB;AACA;AACA;AACA;AACA,sBAAsB,WAAW;AACjC,yBAAyB,WAAW;AACpC,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,sCAAsC,WAAW,GAAG,OAAO,CAAC,0BAA0B;AACtF;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;;ACjGxC,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;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;;AC/C/F,KAAK,aAAa;AAClB;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA,cAAc,iBAAiB,QAAQ,aAAa;AACpD,cAAc,gBAAgB,6DAA6D,aAAa,KAAK,aAAa","names":[]}
|
package/dist/bridge.d.ts
CHANGED
|
@@ -59,6 +59,7 @@ type CreateProductPageResult = {
|
|
|
59
59
|
path: string;
|
|
60
60
|
created: boolean;
|
|
61
61
|
};
|
|
62
|
+
type CreateCollectionPageResult = CreateProductPageResult;
|
|
62
63
|
type ApplyJsonResult = {
|
|
63
64
|
changed: string[];
|
|
64
65
|
view?: Record<string, unknown> | undefined;
|
|
@@ -79,6 +80,7 @@ type SitePage = {
|
|
|
79
80
|
path: string;
|
|
80
81
|
url: string;
|
|
81
82
|
product: ShopifyItem | null;
|
|
83
|
+
collection: ShopifyItem | null;
|
|
82
84
|
};
|
|
83
85
|
type ContentBridge = {
|
|
84
86
|
readonly isEditing: boolean;
|
|
@@ -86,6 +88,7 @@ type ContentBridge = {
|
|
|
86
88
|
readonly entryId: string | null;
|
|
87
89
|
readonly environment: string | null;
|
|
88
90
|
readonly product: ShopifyItem | null;
|
|
91
|
+
readonly collection: ShopifyItem | null;
|
|
89
92
|
on<E extends BridgeEvent>(event: E, listener: BridgeListener<E>): () => void;
|
|
90
93
|
getState(): BridgeState;
|
|
91
94
|
prompt(prompt: string, options?: {
|
|
@@ -93,6 +96,7 @@ type ContentBridge = {
|
|
|
93
96
|
}): Promise<PromptResult>;
|
|
94
97
|
createPage(path: string, prompt: string): Promise<CreatePageResult>;
|
|
95
98
|
createProductPage(product?: ShopifyItem): Promise<CreateProductPageResult>;
|
|
99
|
+
createCollectionPage(collection?: ShopifyItem): Promise<CreateCollectionPageResult>;
|
|
96
100
|
view(options?: {
|
|
97
101
|
uid?: string | null | undefined;
|
|
98
102
|
}): Promise<Record<string, unknown>>;
|
|
@@ -157,6 +161,10 @@ type PromptLabels = {
|
|
|
157
161
|
addingProductPage: string;
|
|
158
162
|
addedProductPage: string;
|
|
159
163
|
productPageHint: string;
|
|
164
|
+
addCollectionPage: string;
|
|
165
|
+
addingCollectionPage: string;
|
|
166
|
+
addedCollectionPage: string;
|
|
167
|
+
collectionPageHint: string;
|
|
160
168
|
};
|
|
161
169
|
declare const DEFAULT_PROMPT_LABELS: PromptLabels;
|
|
162
170
|
type PromptBoxOptions = {
|
|
@@ -169,10 +177,11 @@ type BridgeOptions = {
|
|
|
169
177
|
prompt?: boolean | PromptBoxOptions | undefined;
|
|
170
178
|
pagePath?: ((path: string, locale: string) => string) | undefined;
|
|
171
179
|
productPath?: ((handle: string, locale: string) => string) | undefined;
|
|
180
|
+
collectionPath?: ((handle: string, locale: string) => string) | undefined;
|
|
172
181
|
};
|
|
173
182
|
declare const peekContentBridge: () => ContentBridge | null;
|
|
174
|
-
declare const getContentBridge: ({ url, prompt, pagePath, productPath, }?: BridgeOptions) => ContentBridge;
|
|
183
|
+
declare const getContentBridge: ({ url, prompt, pagePath, productPath, collectionPath, }?: BridgeOptions) => ContentBridge;
|
|
175
184
|
|
|
176
185
|
export { DEFAULT_PROMPT_LABELS, DEFAULT_STATS_LABELS, INITIAL_STATE, getContentBridge, mountPromptBox, mountStatsOverlay, peekContentBridge };
|
|
177
|
-
export type { ApplyJsonResult, BlockStats, BridgeEvent, BridgeEvents, BridgeListener, BridgeOptions, BridgeState, ContentBridge, CreatePageResult, CreateProductPageResult, FormHandle, FormOptions, PromptBoxOptions, PromptLabels, PromptResult, SitePage, StatsLabels, StatsOverlay };
|
|
186
|
+
export type { ApplyJsonResult, BlockStats, BridgeEvent, BridgeEvents, BridgeListener, BridgeOptions, BridgeState, ContentBridge, CreateCollectionPageResult, CreatePageResult, CreateProductPageResult, FormHandle, FormOptions, PromptBoxOptions, PromptLabels, PromptResult, SitePage, StatsLabels, StatsOverlay };
|
|
178
187
|
//# 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,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;;
|
|
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,0BAA0B,GAAG,uBAAuB;AACzD,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,gBAAgB,WAAW;AAC3B;AACA,KAAK,aAAa;AAClB;AACA;AACA;AACA;AACA,sBAAsB,WAAW;AACjC,yBAAyB,WAAW;AACpC,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,sCAAsC,WAAW,GAAG,OAAO,CAAC,0BAA0B;AACtF;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;;ACjGxC,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;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;;AC/C/F,KAAK,aAAa;AAClB;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA,cAAc,iBAAiB,QAAQ,aAAa;AACpD,cAAc,gBAAgB,6DAA6D,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/
|
|
1
|
+
!/*! Obelism Content bridge (@obelism/content), MIT. https://content.obelism.studio/docs/guides/canvas */function(){"use strict";var e;let t="data-cms-uid",r="data-cms-entry",o="data-cms-product",n="data-cms-collection",a="cms_environment",i={clicked:"{rate}% clicked",title:"{clickers} of {viewers} visitors of its page clicked it in the last 30 days ({clicks} clicks)"},l=(e,t)=>e.replace(/\{(\w+)\}/g,(e,r)=>r in t?String(t[r]):e),s=`
|
|
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
|
-
`,
|
|
25
|
+
`,d=(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},c=/(-?\d*\.?\d+)(?:s|l|d)?vh\b/g,p=(e,t)=>(c.lastIndex=0,c.test(e))?e.replace(c,(e,r)=>`${Math.round(Number(r)*t/100*100)/100}px`):null,g=(e,t)=>{for(let r=0;r<e.length;r++){let o=e.item(r),n=p(e.getPropertyValue(o),t);null!==n&&e.setProperty(o,n,e.getPropertyPriority(o))}},u=(e,t)=>{for(let r of Array.from(e)){let{style:e,cssRules:o}=r;e&&g(e,t),o&&u(o,t)}},h="obelism-content-bridge",m="#d58a1f",b=(e="")=>`${e}[${t}]{cursor:pointer;transition:outline-color .15s}${e}[${t}]:hover{outline:2px dashed ${m};outline-offset:2px}${e}[${t}][data-cms-selected]{outline:2px solid ${m};outline-offset:2px}`,f={features:[],selectedUid:null,prompting:!1,canUndo:!1,unsaved:!1,saving:!1,publishing:!1,selecting:!1,stats:{},statsVisible:!1},v=()=>{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 o of e[t])try{o(r)}catch(e){console.error("[@obelism/content bridge]",e)}}}},y=()=>Promise.reject(Error("Save and publish in the visual editor itself")),x=()=>Promise.reject(Error("Only while signed in to edit on the site")),w={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")),createCollectionPage:()=>Promise.reject(Error("Collection pages are made on the site itself")),view:x,applyJson:x,openForm:(e,t={})=>(queueMicrotask(()=>t.onError?.("Only while signed in to edit on the site")),{close:()=>{}}),pages:x,openPage:()=>{},undo:()=>{},save:y,publish:y,signOut:()=>{},select:()=>{},setSelecting:()=>{}},k=e=>"number"==typeof e&&Number.isFinite(e)&&e>=0,E=e=>`[${t}="${e.replace(/["\\]/g,"\\$&")}"]`,C=(e,t)=>{let r=v();e.on("saved",()=>r.emit("saved",{})),e.on("published",()=>r.emit("published",{}));let o=!1;return{isEditing:e.isEditing,mode:e.isEditing?"editor":null,entryId:e.entryId,environment:t.get(a),product:null,collection:null,on:(t,n)=>("update"!==t||o||(o=!0,e.on("update",e=>{let t=e?.entry;t&&r.emit("update",{entry:t,selectedUid:null})})),r.on(t,n)),getState:()=>f,...w,destroy:()=>{}}},P={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.",addCollectionPage:"Add a collection page",addingCollectionPage:"Making the collection page…",addedCollectionPage:"Opening the collection page…",collectionPageHint:"This collection has no page yet. Add one for what goes around its products."},A="obelism-content-prompt-side",L={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"/>'},S=`
|
|
26
26
|
:host { all: initial; }
|
|
27
27
|
* { box-sizing: border-box; font: inherit; color: inherit; margin: 0; }
|
|
28
28
|
.root {
|
|
@@ -257,4 +257,4 @@ button.chip:disabled { opacity: .5; }
|
|
|
257
257
|
.empty { padding: 8px 12px; color: rgb(var(--theme-foreground-muted-rgb)); }
|
|
258
258
|
.empty.error { color: var(--theme-error); }
|
|
259
259
|
[hidden] { display: none !important; }
|
|
260
|
-
`,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},L=(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"}),s="site"===t.mode,l=C(e,"span",{textContent:o.open}),d=C(e,"button",{className:"pill",type:"button"},l,((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-loader",textContent:o.formLoading});h.setAttribute("role","status");let m=C(e,"div",{className:"form"},h),b=P(e,"page"),f=P(e,"block"),v=C(e,"span"),y=C(e,"button",{type:"button",title:o.clearBlock});y.setAttribute("aria-label",o.clearBlock),y.appendChild(P(e,"close"));let k=C(e,"span",{className:"chip scope"},b,f,v,y),L=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},A=S(o.modePrompt),N=S(o.form),I=C(e,"span",{className:"modes"},A,N);I.setAttribute("role","group"),I.setAttribute("aria-label",o.modes);let U=C(e,"button",{className:"action chip",type:"button"},P(e,"newPage"),o.newPage),M=C(e,"button",{className:"action chip product",type:"button"},P(e,"newPage"),o.addProductPage),$=C(e,"button",{type:"button",title:o.newPageCancel});$.setAttribute("aria-label",o.newPageCancel),$.appendChild(P(e,"close"));let O=C(e,"span",{className:"chip scope"},P(e,"newPage"),C(e,"span",{textContent:o.newPage}),$),j=C(e,"input",{type:"text",placeholder:o.pathPlaceholder,autocomplete:"off",spellcheck:!1}),R=C(e,"label",{className:"path"},C(e,"span",{textContent:o.path}),j),T=C(e,"button",{className:"close icon-button",type:"button",title:o.close},P(e,"close"));T.setAttribute("aria-label",o.close);let z=P(e,"minimize"),D=P(e,"expand"),F=C(e,"button",{className:"icon-button",type:"button"},z,D),B=C(e,"button",{className:"action primary icon-button",type:"submit"},C(e,"span",{className:"visually-hidden",textContent:o.send}),P(e,"send"));B.title=o.send;let q=C(e,"span",{className:"divider"}),V=C(e,"div",{className:"toolbar"},k,O,I,L,M,U,C(e,"span",{className:"spacer"}),F,T,q,B),W=C(e,"span",{textContent:o.pages}),H=C(e,"button",{className:"chip page-chip",type:"button",title:o.pages},P(e,"page"),W,P(e,"chevrons"));H.setAttribute("aria-haspopup","listbox"),H.setAttribute("aria-expanded","false"),H.setAttribute("aria-controls","obelism-pages");let Y=C(e,"input",{type:"text",placeholder:o.pagesSearch,autocomplete:"off",spellcheck:!1});Y.setAttribute("role","combobox"),Y.setAttribute("aria-label",o.pagesSearch),Y.setAttribute("aria-autocomplete","list"),Y.setAttribute("aria-expanded","true"),Y.setAttribute("aria-controls","obelism-pages");let X=C(e,"ul",{className:"options",id:"obelism-pages"});X.setAttribute("role","listbox"),X.setAttribute("aria-label",o.pages);let _=C(e,"p",{className:"empty"}),J=C(e,"div",{className:"pages"},C(e,"label",{className:"search"},P(e,"search"),Y),X,_),Z=C(e,"span",{className:"unsaved"});Z.appendChild(C(e,"span",{className:"dot"})),Z.appendChild(e.createTextNode(o.unsaved));let K=C(e,"button",{className:"link",type:"button",textContent:o.signOut}),G=C(e,"button",{className:"action chip",type:"button",textContent:o.save}),Q=C(e,"button",{className:"action chip",type:"button",textContent:o.publish}),ee=C(e,"div",{className:"footer"},H,Z,C(e,"span",{className:"spacer"}),K,G,Q),et=C(e,"form",{className:"panel"},g,R,u,m,V,J,ee),er=C(e,"div",{className:"root"},C(e,"div",{className:"bar"},d,c),et);i.append(C(e,"style",{textContent:E}),er);let en=e.defaultView,eo=e=>{"center"===e?delete er.dataset.side:er.dataset.side=e};eo((()=>{try{let e=en?.localStorage.getItem(w);return"left"===e||"right"===e?e:"center"}catch{return"center"}})());let ea=null,ei=!1;er.addEventListener("pointerdown",e=>{if(ei=!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}=er.getBoundingClientRect();ea={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,(en?.innerWidth??0)-16-n)}}),er.addEventListener("pointermove",e=>{if(!ea||e.pointerId!==ea.id)return;let t=e.clientX-ea.startX;if(!ea.moved){if(6>Math.abs(t))return;ea.moved=!0,er.classList.add("dragging");try{er.setPointerCapture(e.pointerId)}catch{}}let r=e.timeStamp-ea.time;r>0&&(ea.velocity=(e.clientX-ea.x)/r),ea.x=e.clientX,ea.time=e.timeStamp;let n=Math.min(Math.max(t,ea.min),ea.max);er.style.translate=`${n+(t-n)/3}px 0`});let es=e=>{if(!ea||e.pointerId!==ea.id)return;let{moved:t,x:r,velocity:n,time:o}=ea;if(ea=null,!t)return;ei=!0;let a=er.getBoundingClientRect().left,i=en?.innerWidth??0,s=r+(e.timeStamp-o>80?0:Math.min(Math.max(150*n,-120),120)),l=s<i/3?"left":s>2*i/3?"right":"center";eo(l),er.style.translate="";let d=er.getBoundingClientRect().left;er.style.translate=`${a-d}px 0`,er.offsetWidth,er.classList.remove("dragging"),er.style.translate="";try{en?.localStorage.setItem(w,l)}catch{}};er.addEventListener("pointerup",es),er.addEventListener("pointercancel",es),er.addEventListener("click",e=>{ei&&(ei=!1,e.preventDefault(),e.stopPropagation())},!0);let el=!1,ed=!1,ec=!1,ep=null,eg=!1,eu=null,eh=!1,em=!1,eb=null,ef=null,ev=null,ey=0,ex=e=>({text:e instanceof Error?e.message:String(e),error:!0}),ew=e=>{let r=e.features.includes("prompt"),n=e.saving||e.publishing,a=e.prompting||n;er.hidden=!r&&!s,d.hidden=el||!r,c.hidden=r||!s,et.hidden=!el||!r;let i=s&&e.features.includes("create"),p=s&&null===t.entryId,x=p&&i&&null!==t.product,w=p&&i&&!x;i||(ec=!1),w&&(ec=!0),(ec||p||!s)&&(eg=!1);let E=el&&r&⪚E&&!eu?eC():!E&&eu&&eP();let C=x&&!ec;l.textContent=C?o.addProductPage:w?o.newPage:o.open,$.hidden=w,k.hidden=ec||C,O.hidden=!ec,M.hidden=!C,M.disabled=a,U.hidden=ec||eg||!i,U.disabled=a,ed&&(em=!1),R.hidden=!ec||em||ed,j.disabled=a,u.hidden=eg||em||ed||C,m.hidden=!eg||em||ed,m.classList.toggle("loading",eh),h.hidden=!eh,V.hidden=em,J.hidden=!em,u.placeholder=ec?o.newPagePlaceholder:o.placeholder,v.textContent=e.selectedUid?o.scopeBlock:o.scopeEntry,y.hidden=!e.selectedUid,b.hidden=!!e.selectedUid,f.hidden=!e.selectedUid,I.hidden=!s||ec||p||!e.features.includes("form"),A.setAttribute("aria-pressed",String(!eg)),N.setAttribute("aria-pressed",String(eg)),I.querySelectorAll("button").forEach(e=>{e.disabled=a}),L.hidden=ec||!e.canUndo,L.disabled=a,B.hidden=eg||ed||C,q.hidden=eg||ed||C;let P=ed?o.expand:o.minimize;F.title=P,F.setAttribute("aria-label",P),F.setAttribute("aria-expanded",String(!ed)),z.hidden=ed,D.hidden=!ed,B.disabled=a||""===u.value.trim()||ec&&""===j.value.trim(),u.disabled=a,G.hidden=!e.features.includes("save")||p,G.disabled=a||!e.unsaved,G.textContent=e.saving?o.saving:o.save,Q.hidden=!e.features.includes("publish")||p,Q.disabled=a,Q.textContent=e.publishing?o.publishing:o.publish,K.hidden=!s,ee.hidden=!s,Z.hidden=!e.unsaved,H.hidden=!s,H.setAttribute("aria-expanded",String(em)),W.textContent=eb?.find(({entryId:e})=>e===t.entryId)?.name??o.pages;let S=eg&&eh&&!em,T=e.prompting,Y=e.prompting?ec?o.creating:C?o.addingProductPage:o.working:S?"":ep?.text??(C?o.productPageHint:!s||ec||em||e.selectedUid?"":o.selectHint);g.textContent=Y,g.hidden=!Y||ed,g.className=`status${T?" working":""}${!a&&!S&&ep?.error?" error":""}`},ek=()=>ew(t.getState()),eE=()=>{u.style.height="auto",u.style.height=`${u.scrollHeight}px`},eC=()=>{eh=!0,m.classList.add("loading");let e=t.openForm(m,{title:o.formTitle,onReady:()=>{eu===e&&(eh=!1,ep=null,ek())},onError:t=>{eu===e&&(eh=!1,ep={text:t,error:!0},ek())}});eu=e},eP=()=>{eu?.close(),eu=null,eh=!1},eL=e=>{eg!==e&&(eg=e,ep=null,ek(),eg||u.focus())},eS=async()=>{if(eg)return;let e=u.value.trim();if(e&&!t.getState().prompting){ep=null;try{if(ec){let r=j.value.trim();if(!r)return j.focus();await t.createPage(r,e),eb=null,ef=null,ep={text:o.created,error:!1}}else{let{summary:r}=await t.prompt(e);ep={text:r,error:!1}}u.value="",eE()}catch(e){ep=ex(e)}ek(),u.focus()}},eA=()=>(ef??(ef=t.pages().then(e=>{eb=e,ev=null,eI(),ek()},e=>{ef=null,ev=ex(e).text,eI()})),ef),eN=()=>{let e=Y.value.trim().toLowerCase();return(eb??[]).filter(t=>!e||t.name.toLowerCase().includes(e)||t.url.toLowerCase().includes(e)||`/${t.path}`.toLowerCase().includes(e))},eI=()=>{let r=eN();ey=Math.max(0,Math.min(ey,r.length-1)),X.textContent="",r.forEach((r,n)=>{let a=r.entryId===t.entryId,i=C(e,"li",{className:`option${n===ey?" 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===ey)),"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",()=>eM(r)),X.appendChild(i)});let n=X.children[ey];n?(Y.setAttribute("aria-activedescendant",n.id),n.scrollIntoView?.({block:"nearest"})):Y.removeAttribute("aria-activedescendant"),_.textContent=(ev??(eb?"":o.pagesLoading))||(0===r.length?o.pagesEmpty:""),_.hidden=!_.textContent,_.className=`empty${ev?" error":""}`},eU=e=>{ep=null,(em=e)&&(Y.value="",ey=Math.max(0,(eb??[]).findIndex(({entryId:e})=>e===t.entryId)),eA(),eI()),ek(),(em?Y:H).focus()},eM=e=>{if(e.entryId===t.entryId)return eU(!1);t.openPage(e)},e$=e=>{(el=e)||(em=!1,ed=!1),ek(),s&&t.setSelecting(el&&!ec),el&&s&&eA()},eO=e=>{ec=e,ep=null,t.setSelecting(el&&!ec),ec&&t.select(null),ek(),(ec?j:u).focus()},ej=async e=>{ep=null;try{await t[e](),ep={text:"save"===e?o.saved:o.published,error:!1}}catch(e){ep=ex(e)}ek()};d.addEventListener("click",()=>{e$(!0),eg||(ec?j:u).focus()}),T.addEventListener("click",()=>e$(!1)),F.addEventListener("click",()=>{ed=!ed,ek(),ed||(eg?F:u).focus()}),et.addEventListener("click",e=>{if(!ed)return;let t=e.target.closest("button");t&&t!==F&&t!==T&&(ed=!1,ek())},!0),G.addEventListener("click",()=>void ej("save")),Q.addEventListener("click",()=>void ej("publish")),K.addEventListener("click",()=>t.signOut()),p.addEventListener("click",()=>t.signOut()),y.addEventListener("click",()=>t.select(null)),U.addEventListener("click",()=>eO(!0)),M.addEventListener("click",async()=>{ep=null;try{await t.createProductPage(),ep={text:o.addedProductPage,error:!1}}catch(e){ep=ex(e)}ek()}),$.addEventListener("click",()=>eO(!1)),A.addEventListener("click",()=>eL(!1)),N.addEventListener("click",()=>eL(!0)),H.addEventListener("click",()=>eU(!em)),j.addEventListener("input",ek),j.addEventListener("keydown",e=>{"Enter"!==e.key||e.isComposing?"Escape"===e.key&&e$(!1):(e.preventDefault(),u.focus())}),Y.addEventListener("input",()=>{ey=0,eI()}),Y.addEventListener("keydown",e=>{let t=X.children.length;if("ArrowDown"===e.key||"ArrowUp"===e.key){if(e.preventDefault(),0===t)return;ey=(ey+("ArrowDown"===e.key?1:-1)+t)%t,eI()}else if("Enter"!==e.key||e.isComposing)"Escape"===e.key&&(e.preventDefault(),eU(!1));else{e.preventDefault();let t=eN()[ey];t&&eM(t)}}),L.addEventListener("click",()=>{ep=null,t.undo()}),et.addEventListener("submit",e=>{e.preventDefault(),eS()}),u.addEventListener("input",()=>{eE(),ek()}),u.addEventListener("keydown",e=>{"Enter"!==e.key||e.shiftKey||e.isComposing?"Escape"===e.key&&e$(!1):(e.preventDefault(),eS())});let eR=t.on("change",ew);return ek(),e.body.appendChild(a),()=>{eR(),eP(),a.remove()}},S="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"}))},L=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",L,!0),m.push(()=>k.removeEventListener("click",L,!0));let S=()=>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)S();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=s;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,s]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*s.rate)}),g.title=i(d.title,{clickers:s.clickers,viewers:s.viewers,clicks:s.clicks});let{place:h,top:m,left:b}=l(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",S,{once:!0}),m.push(()=>k.removeEventListener("DOMContentLoaded",S))):S(),w})(w,new URL(e||S).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 s=e.document,l=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},l.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},L=()=>s.querySelector(`[${r}]`)?.getAttribute(r)??null,S=()=>{let e=s.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?s.querySelector(v(e)):null;return t?.closest(`[${r}]`)?.getAttribute(r)??L()},I=()=>{if(!f)return;let e=f.space.locales.map(({code:e})=>e),t=s.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=>{s.querySelectorAll("[data-cms-selected]").forEach(e=>{e.removeAttribute("data-cms-selected")}),k.selectedUid!==e&&E({selectedUid:e}),e&&s.querySelector(v(e))?.setAttribute("data-cms-selected","")},j=async t=>{if(0===l.listeners.update.size)return;let r=h.get(t)?.content,{entry:n}=await P(`entries/${encodeURIComponent(t)}/preview`,{content:r,locale:I()});l.emit("update",{entry:n,selectedUid:k.selectedUid}),e.requestAnimationFrame(()=>O(k.selectedUid))},R=e=>console.error("[@obelism/content bridge]",e),T=t=>{l.emit(t,{}),0===l.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 L()},get product(){return S()},environment:null,on:l.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:L()}),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=S()??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,s=null,c=null,p=()=>{},g=e=>{i||a?.(e instanceof Error?e.message:String(e))},u=()=>{i||(i=!0,p(),s?.destroy(),y===u&&(y=null))};y=u;let b=()=>{if(i||!s)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,s.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||(s=((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 l=!1,c=!1,p=null,g=()=>{l&&p&&s.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||!s.contentWindow||e.source!==s.contentWindow)return;let t=e.data;if(t&&"obelism-content-form"===t.source)if("ready"===t.type)l=!0,g(),!0!==t.loading&&h();else if("loaded"===t.type)l&&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));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",m),t.appendChild(s),{show(e){p=e,g()},destroy(){clearTimeout(u),e.removeEventListener("message",m),s.remove()}}})(e,t,"string"==typeof r?r:"",n,{onReady:()=>o?.(),onChange:f,onError:e=>a?.(e)}),p=l.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=L(),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?s.documentElement.setAttribute("data-cms-selecting",""):s.documentElement.removeAttribute("data-cms-selecting"),E({selecting:e})},destroy(){y?.(),w.forEach(e=>clearTimeout(e)),w.clear(),c.splice(0).forEach(e=>e())}},F=s.createElement("style");F.textContent=p("html[data-cms-selecting] "),s.head.appendChild(F),c.push(()=>F.remove()),c.push(()=>s.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)))};s.addEventListener("click",B,!0),c.push(()=>s.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=L(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||S;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:L}}();
|
|
260
|
+
`,N=(e,t,r={},...o)=>{let n=e.createElement(t);for(let t of(Object.assign(n,r),o))n.appendChild("string"==typeof t?e.createTextNode(t):t);return n},M=(e,t)=>{let r=N(e,"span",{className:"icon"});return r.setAttribute("aria-hidden","true"),r.innerHTML=`<svg viewBox="0 0 24 24">${L[t]}</svg>`,r},I=(e,t,r={})=>{let o,n={...P,...r.labels},a=N(e,"div");a.setAttribute("data-obelism-content-prompt","");let i=a.attachShadow({mode:"open"}),l="site"===t.mode,s=N(e,"span",{textContent:n.open}),d=N(e,"button",{className:"pill",type:"button"},s,((o=M(e,"mark")).classList.add("mark"),o)),c=N(e,"span",{className:"pill compact"},`${n.viewingDrafts} \xb7 `),p=N(e,"button",{className:"link",type:"button",textContent:n.signOut});c.appendChild(p);let g=N(e,"p",{className:"status"});g.setAttribute("role","status");let u=N(e,"textarea",{placeholder:n.placeholder,rows:1});u.setAttribute("aria-label",n.open);let h=N(e,"div",{className:"form-loader",textContent:n.formLoading});h.setAttribute("role","status");let m=N(e,"div",{className:"form"},h),b=M(e,"page"),f=M(e,"block"),v=N(e,"span"),y=N(e,"button",{type:"button",title:n.clearBlock});y.setAttribute("aria-label",n.clearBlock),y.appendChild(M(e,"close"));let x=N(e,"span",{className:"chip scope"},b,f,v,y),w=N(e,"button",{className:"action chip",type:"button"},M(e,"undo"),n.undo),k=t=>{let r=N(e,"button",{type:"button",textContent:t});return r.setAttribute("aria-pressed","false"),r},E=k(n.modePrompt),C=k(n.form),L=N(e,"span",{className:"modes"},E,C);L.setAttribute("role","group"),L.setAttribute("aria-label",n.modes);let I=N(e,"button",{className:"action chip",type:"button"},M(e,"newPage"),n.newPage),U=N(e,"button",{className:"action chip product",type:"button"},M(e,"newPage"),n.addProductPage),$=N(e,"button",{type:"button",title:n.newPageCancel});$.setAttribute("aria-label",n.newPageCancel),$.appendChild(M(e,"close"));let O=N(e,"span",{className:"chip scope"},M(e,"newPage"),N(e,"span",{textContent:n.newPage}),$),R=N(e,"input",{type:"text",placeholder:n.pathPlaceholder,autocomplete:"off",spellcheck:!1}),j=N(e,"label",{className:"path"},N(e,"span",{textContent:n.path}),R),z=N(e,"button",{className:"close icon-button",type:"button",title:n.close},M(e,"close"));z.setAttribute("aria-label",n.close);let T=M(e,"minimize"),D=M(e,"expand"),F=N(e,"button",{className:"icon-button",type:"button"},T,D),q=N(e,"button",{className:"action primary icon-button",type:"submit"},N(e,"span",{className:"visually-hidden",textContent:n.send}),M(e,"send"));q.title=n.send;let V=N(e,"span",{className:"divider"}),B=N(e,"div",{className:"toolbar"},x,O,L,w,U,I,N(e,"span",{className:"spacer"}),F,z,V,q),H=N(e,"span",{textContent:n.pages}),W=N(e,"button",{className:"chip page-chip",type:"button",title:n.pages},M(e,"page"),H,M(e,"chevrons"));W.setAttribute("aria-haspopup","listbox"),W.setAttribute("aria-expanded","false"),W.setAttribute("aria-controls","obelism-pages");let Y=N(e,"input",{type:"text",placeholder:n.pagesSearch,autocomplete:"off",spellcheck:!1});Y.setAttribute("role","combobox"),Y.setAttribute("aria-label",n.pagesSearch),Y.setAttribute("aria-autocomplete","list"),Y.setAttribute("aria-expanded","true"),Y.setAttribute("aria-controls","obelism-pages");let X=N(e,"ul",{className:"options",id:"obelism-pages"});X.setAttribute("role","listbox"),X.setAttribute("aria-label",n.pages);let _=N(e,"p",{className:"empty"}),J=N(e,"div",{className:"pages"},N(e,"label",{className:"search"},M(e,"search"),Y),X,_),Z=N(e,"span",{className:"unsaved"});Z.appendChild(N(e,"span",{className:"dot"})),Z.appendChild(e.createTextNode(n.unsaved));let K=N(e,"button",{className:"link",type:"button",textContent:n.signOut}),G=N(e,"button",{className:"action chip",type:"button",textContent:n.save}),Q=N(e,"button",{className:"action chip",type:"button",textContent:n.publish}),ee=N(e,"div",{className:"footer"},W,Z,N(e,"span",{className:"spacer"}),K,G,Q),et=N(e,"form",{className:"panel"},g,j,u,m,B,J,ee),er=N(e,"div",{className:"root"},N(e,"div",{className:"bar"},d,c),et);i.append(N(e,"style",{textContent:S}),er);let eo=e.defaultView,en=e=>{"center"===e?delete er.dataset.side:er.dataset.side=e};en((()=>{try{let e=eo?.localStorage.getItem(A);return"left"===e||"right"===e?e:"center"}catch{return"center"}})());let ea=null,ei=!1;er.addEventListener("pointerdown",e=>{if(ei=!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:o}=er.getBoundingClientRect();ea={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,(eo?.innerWidth??0)-16-o)}}),er.addEventListener("pointermove",e=>{if(!ea||e.pointerId!==ea.id)return;let t=e.clientX-ea.startX;if(!ea.moved){if(6>Math.abs(t))return;ea.moved=!0,er.classList.add("dragging");try{er.setPointerCapture(e.pointerId)}catch{}}let r=e.timeStamp-ea.time;r>0&&(ea.velocity=(e.clientX-ea.x)/r),ea.x=e.clientX,ea.time=e.timeStamp;let o=Math.min(Math.max(t,ea.min),ea.max);er.style.translate=`${o+(t-o)/3}px 0`});let el=e=>{if(!ea||e.pointerId!==ea.id)return;let{moved:t,x:r,velocity:o,time:n}=ea;if(ea=null,!t)return;ei=!0;let a=er.getBoundingClientRect().left,i=eo?.innerWidth??0,l=r+(e.timeStamp-n>80?0:Math.min(Math.max(150*o,-120),120)),s=l<i/3?"left":l>2*i/3?"right":"center";en(s),er.style.translate="";let d=er.getBoundingClientRect().left;er.style.translate=`${a-d}px 0`,er.offsetWidth,er.classList.remove("dragging"),er.style.translate="";try{eo?.localStorage.setItem(A,s)}catch{}};er.addEventListener("pointerup",el),er.addEventListener("pointercancel",el),er.addEventListener("click",e=>{ei&&(ei=!1,e.preventDefault(),e.stopPropagation())},!0);let es=!1,ed=!1,ec=!1,ep=null,eg=!1,eu=null,eh=!1,em=!1,eb=null,ef=null,ev=null,ey=0,ex=e=>({text:e instanceof Error?e.message:String(e),error:!0}),ew=e=>{let r=e.features.includes("prompt"),o=e.saving||e.publishing,a=e.prompting||o;er.hidden=!r&&!l,d.hidden=es||!r,c.hidden=r||!l,et.hidden=!es||!r;let i=l&&e.features.includes("create"),p=l&&null===t.entryId,k=p&&i?t.product?"product":t.collection?"collection":null:null,P=null!==k,A="collection"===k?{add:n.addCollectionPage,adding:n.addingCollectionPage,hint:n.collectionPageHint}:{add:n.addProductPage,adding:n.addingProductPage,hint:n.productPageHint};U.lastChild.textContent=A.add;let S=p&&i&&!P;i||(ec=!1),S&&(ec=!0),(ec||p||!l)&&(eg=!1);let N=es&&r&⪚N&&!eu?eC():!N&&eu&&eP();let M=P&&!ec;s.textContent=M?A.add:S?n.newPage:n.open,$.hidden=S,x.hidden=ec||M,O.hidden=!ec,U.hidden=!M,U.disabled=a,I.hidden=ec||eg||!i,I.disabled=a,ed&&(em=!1),j.hidden=!ec||em||ed,R.disabled=a,u.hidden=eg||em||ed||M,m.hidden=!eg||em||ed,m.classList.toggle("loading",eh),h.hidden=!eh,B.hidden=em,J.hidden=!em,u.placeholder=ec?n.newPagePlaceholder:n.placeholder,v.textContent=e.selectedUid?n.scopeBlock:n.scopeEntry,y.hidden=!e.selectedUid,b.hidden=!!e.selectedUid,f.hidden=!e.selectedUid,L.hidden=!l||ec||p||!e.features.includes("form"),E.setAttribute("aria-pressed",String(!eg)),C.setAttribute("aria-pressed",String(eg)),L.querySelectorAll("button").forEach(e=>{e.disabled=a}),w.hidden=ec||!e.canUndo,w.disabled=a,q.hidden=eg||ed||M,V.hidden=eg||ed||M;let z=ed?n.expand:n.minimize;F.title=z,F.setAttribute("aria-label",z),F.setAttribute("aria-expanded",String(!ed)),T.hidden=ed,D.hidden=!ed,q.disabled=a||""===u.value.trim()||ec&&""===R.value.trim(),u.disabled=a,G.hidden=!e.features.includes("save")||p,G.disabled=a||!e.unsaved,G.textContent=e.saving?n.saving:n.save,Q.hidden=!e.features.includes("publish")||p,Q.disabled=a,Q.textContent=e.publishing?n.publishing:n.publish,K.hidden=!l,ee.hidden=!l,Z.hidden=!e.unsaved,W.hidden=!l,W.setAttribute("aria-expanded",String(em)),H.textContent=eb?.find(({entryId:e})=>e===t.entryId)?.name??n.pages;let Y=eg&&eh&&!em,X=e.prompting,_=e.prompting?ec?n.creating:M?A.adding:n.working:Y?"":ep?.text??(M?A.hint:!l||ec||em||e.selectedUid?"":n.selectHint);g.textContent=_,g.hidden=!_||ed,g.className=`status${X?" working":""}${!a&&!Y&&ep?.error?" error":""}`},ek=()=>ew(t.getState()),eE=()=>{u.style.height="auto",u.style.height=`${u.scrollHeight}px`},eC=()=>{eh=!0,m.classList.add("loading");let e=t.openForm(m,{title:n.formTitle,onReady:()=>{eu===e&&(eh=!1,ep=null,ek())},onError:t=>{eu===e&&(eh=!1,ep={text:t,error:!0},ek())}});eu=e},eP=()=>{eu?.close(),eu=null,eh=!1},eA=e=>{eg!==e&&(eg=e,ep=null,ek(),eg||u.focus())},eL=async()=>{if(eg)return;let e=u.value.trim();if(e&&!t.getState().prompting){ep=null;try{if(ec){let r=R.value.trim();if(!r)return R.focus();await t.createPage(r,e),eb=null,ef=null,ep={text:n.created,error:!1}}else{let{summary:r}=await t.prompt(e);ep={text:r,error:!1}}u.value="",eE()}catch(e){ep=ex(e)}ek(),u.focus()}},eS=()=>(ef??(ef=t.pages().then(e=>{eb=e,ev=null,eM(),ek()},e=>{ef=null,ev=ex(e).text,eM()})),ef),eN=()=>{let e=Y.value.trim().toLowerCase();return(eb??[]).filter(t=>!e||t.name.toLowerCase().includes(e)||t.url.toLowerCase().includes(e)||`/${t.path}`.toLowerCase().includes(e))},eM=()=>{let r=eN();ey=Math.max(0,Math.min(ey,r.length-1)),X.textContent="",r.forEach((r,o)=>{let a=r.entryId===t.entryId,i=N(e,"li",{className:`option${o===ey?" active":""}`,id:`obelism-page-${o}`},N(e,"span",{className:"option-text"},N(e,"span",{textContent:r.name}),N(e,"span",{className:"option-path",textContent:r.url})));if(i.setAttribute("role","option"),i.setAttribute("aria-selected",String(o===ey)),"published"!==r.status&&i.appendChild(N(e,"span",{className:"badge",textContent:"draft"===r.status?n.pageDraft:n.pageChanged})),a){i.setAttribute("aria-current","page");let t=M(e,"check");t.removeAttribute("aria-hidden"),t.setAttribute("role","img"),t.setAttribute("aria-label",n.pageCurrent),i.appendChild(t)}i.addEventListener("click",()=>eU(r)),X.appendChild(i)});let o=X.children[ey];o?(Y.setAttribute("aria-activedescendant",o.id),o.scrollIntoView?.({block:"nearest"})):Y.removeAttribute("aria-activedescendant"),_.textContent=(ev??(eb?"":n.pagesLoading))||(0===r.length?n.pagesEmpty:""),_.hidden=!_.textContent,_.className=`empty${ev?" error":""}`},eI=e=>{ep=null,(em=e)&&(Y.value="",ey=Math.max(0,(eb??[]).findIndex(({entryId:e})=>e===t.entryId)),eS(),eM()),ek(),(em?Y:W).focus()},eU=e=>{if(e.entryId===t.entryId)return eI(!1);t.openPage(e)},e$=e=>{(es=e)||(em=!1,ed=!1),ek(),l&&t.setSelecting(es&&!ec),es&&l&&eS()},eO=e=>{ec=e,ep=null,t.setSelecting(es&&!ec),ec&&t.select(null),ek(),(ec?R:u).focus()},eR=async e=>{ep=null;try{await t[e](),ep={text:"save"===e?n.saved:n.published,error:!1}}catch(e){ep=ex(e)}ek()};d.addEventListener("click",()=>{e$(!0),eg||(ec?R:u).focus()}),z.addEventListener("click",()=>e$(!1)),F.addEventListener("click",()=>{ed=!ed,ek(),ed||(eg?F:u).focus()}),et.addEventListener("click",e=>{if(!ed)return;let t=e.target.closest("button");t&&t!==F&&t!==z&&(ed=!1,ek())},!0),G.addEventListener("click",()=>void eR("save")),Q.addEventListener("click",()=>void eR("publish")),K.addEventListener("click",()=>t.signOut()),p.addEventListener("click",()=>t.signOut()),y.addEventListener("click",()=>t.select(null)),I.addEventListener("click",()=>eO(!0)),U.addEventListener("click",async()=>{ep=null;try{t.product?(await t.createProductPage(),ep={text:n.addedProductPage,error:!1}):(await t.createCollectionPage(),ep={text:n.addedCollectionPage,error:!1})}catch(e){ep=ex(e)}ek()}),$.addEventListener("click",()=>eO(!1)),E.addEventListener("click",()=>eA(!1)),C.addEventListener("click",()=>eA(!0)),W.addEventListener("click",()=>eI(!em)),R.addEventListener("input",ek),R.addEventListener("keydown",e=>{"Enter"!==e.key||e.isComposing?"Escape"===e.key&&e$(!1):(e.preventDefault(),u.focus())}),Y.addEventListener("input",()=>{ey=0,eM()}),Y.addEventListener("keydown",e=>{let t=X.children.length;if("ArrowDown"===e.key||"ArrowUp"===e.key){if(e.preventDefault(),0===t)return;ey=(ey+("ArrowDown"===e.key?1:-1)+t)%t,eM()}else if("Enter"!==e.key||e.isComposing)"Escape"===e.key&&(e.preventDefault(),eI(!1));else{e.preventDefault();let t=eN()[ey];t&&eU(t)}}),w.addEventListener("click",()=>{ep=null,t.undo()}),et.addEventListener("submit",e=>{e.preventDefault(),eL()}),u.addEventListener("input",()=>{eE(),ek()}),u.addEventListener("keydown",e=>{"Enter"!==e.key||e.shiftKey||e.isComposing?"Escape"===e.key&&e$(!1):(e.preventDefault(),eL())});let ej=t.on("change",ew);return ek(),e.body.appendChild(a),()=>{ej(),eP(),a.remove()}},U="https://content.obelism.studio",$=(e,t)=>JSON.stringify(e)===JSON.stringify(t),O=Symbol.for("@obelism/content/bridge"),R=C({isEditing:!1,entryId:null,on:()=>{}},new URLSearchParams),j=({url:e,prompt:c=!0,pagePath:p,productPath:m,collectionPath:y}={})=>{let x;if("u"<typeof window)return R;let P=window;if(P[O])return P[O];if(P.ObelismBridge)x=C(P.ObelismBridge,new URLSearchParams(P.location.search));else{let C=(x=((e,r)=>{let o,n,c,p,m,y=new URLSearchParams(e.location.search),x=e.parent!==e&&y.has("cms_preview"),C=v(),P=[],A={...f,selecting:!0},L=e=>{A={...A,...e},C.emit("change",A)},S={isEditing:x,mode:x?"editor":null,entryId:y.get("cms_entry"),environment:y.get(a),product:null,collection:null,on:C.on,getState:()=>A,...w,destroy:()=>{P.splice(0).forEach(e=>e())}};if(!x)return S;let N=e.document,M=(t,o={})=>{e.parent.postMessage({source:h,type:t,...o},r)},I=N.createElement("style");I.textContent=b(),N.head.appendChild(I),P.push(()=>I.remove());let U=(e,t)=>{if(N.querySelectorAll("[data-cms-selected]").forEach(e=>{e.removeAttribute("data-cms-selected")}),A.selectedUid!==(e??null)&&L({selectedUid:e??null}),!e)return;let r=N.querySelector(E(e));r&&(r.setAttribute("data-cms-selected",""),t&&r.scrollIntoView({behavior:"smooth",block:"center"}))},$=e=>{let r=e.target,o=r?.closest?.(`[${t}]`);if(!o)return;e.preventDefault(),e.stopPropagation();let n=o.getAttribute(t);U(n,!1),M("select",{uid:n})};N.addEventListener("click",$,!0),P.push(()=>N.removeEventListener("click",$,!0));let O=()=>Math.ceil(Math.max(N.documentElement.scrollHeight,N.body?.scrollHeight??0)),R=0,j=()=>{R=O(),M("ready",{url:e.location.href,height:R})},z=e.ResizeObserver;if("function"==typeof z){let e=new z(()=>{let e=O();e!==R&&(R=e,M("size",{height:e}))});e.observe(N.documentElement),N.body&&e.observe(N.body),P.push(()=>e.disconnect())}let T=new Map,D=0,F=e=>{let t=T.get(e);return t?(clearTimeout(t.timer),T.delete(e),0===T.size&&L({prompting:!1}),t):null};S.prompt=(e,t={})=>{let r=e.trim();if(!r)return Promise.reject(Error("Say what to change"));if(!A.features.includes("prompt"))return Promise.reject(Error("The editor does not offer prompts here"));let o=`prompt_${++D}`,n=void 0===t.uid?A.selectedUid:t.uid;return new Promise((e,t)=>{let a=setTimeout(()=>{F(o)?.reject(Error("The editor did not answer in time"))},12e4);T.set(o,{resolve:e,reject:t,timer:a}),L({prompting:!0}),M("prompt",{id:o,prompt:r,uid:n})})},S.undo=()=>M("undo"),S.select=e=>{U(e,!1),M("select",{uid:e})};let q=null;P.push(()=>q?.destroy()),P.push(()=>{for(let e of T.keys())F(e)?.reject(Error("The bridge was destroyed"))});let V=(o=new WeakSet,n=null,c=null,p=!1,m=()=>{if(null!==n){for(let e of Array.from(N.styleSheets)){let t;if(!o.has(e)){try{t=e.cssRules}catch{continue}o.add(e),u(t,n)}}N.querySelectorAll('[style*="vh"]').forEach(e=>{g(e.style,n)})}},{freeze(e){if(null!==n||!(e>0))return;n=e,m();let t=N.defaultView?.MutationObserver;t&&(c=new t(()=>{if(p)return;p=!0;let e=()=>{p=!1,m()};N.defaultView?.requestAnimationFrame?N.defaultView.requestAnimationFrame(e):e()})).observe(N.documentElement,{childList:!0,subtree:!0})},destroy(){c?.disconnect()}});P.push(()=>V.destroy());let B=t=>{if(t.origin!==r||t.source!==e.parent)return;let o=t.data;if(o&&"obelism-content-editor"===o.source){if("connect"===o.type)j();else if("update"===o.type&&o.entry)C.emit("update",{entry:o.entry,selectedUid:o.selectedUid??null}),e.requestAnimationFrame(()=>U(o.selectedUid,!1)),q?.refresh();else if("select"===o.type)U(o.uid,!0);else if("saved"===o.type||"published"===o.type)C.emit(o.type,{}),0===C.listeners.update.size&&e.location.reload();else if("features"===o.type&&Array.isArray(o.features))L({features:o.features.filter(e=>"string"==typeof e)});else if("stats"===o.type)L({stats:(e=>{if(!e||"object"!=typeof e||Array.isArray(e))return{};let t={};for(let[r,o]of Object.entries(e)){let{clicks:e,clickers:n,viewers:a,rate:i}=o??{};k(e)&&k(n)&&k(a)&&k(i)&&(t[r]={clicks:e,clickers:n,viewers:a,rate:i})}return t})(o.stats),statsVisible:!1!==o.visible}),(q||Object.keys(A.stats).length)&&(q??(q=((e,{selector:t,onSelect:r,labels:o})=>{let n=e.document,a={...i,...o},c=n.createElement("div");c.setAttribute("data-obelism-stats","");let p=c.attachShadow({mode:"open"}),g=n.createElement("style");g.textContent=s;let u=n.createElement("div");u.className="layer",p.append(g,u),n.body.appendChild(c);let h={},m=!1,b=null,f=()=>{if(b=null,u.replaceChildren(),u.hidden=!m,!m)return;let o=e.innerHeight;for(let[i,s]of Object.entries(h)){let c=n.querySelector(t(i));if(!c)continue;let p=c.getBoundingClientRect();if(!p.width&&!p.height||p.bottom<0||p.top>o)continue;let g=n.createElement("button");g.type="button",g.className="badge",g.dataset.uid=i,g.textContent=l(a.clicked,{rate:Math.round(100*s.rate)}),g.title=l(a.title,{clickers:s.clickers,viewers:s.viewers,clicks:s.clicks});let{place:h,top:m,left:b}=d(p,e.innerWidth);g.dataset.place=h,g.style.top=`${m}px`,g.style.left=`${b}px`,g.addEventListener("click",()=>r(i)),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(n.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:E,onSelect:e=>S.select(e)})),q.update(A.stats,A.statsVisible));else if("viewport"===o.type&&"number"==typeof o.height)V.freeze(o.height);else if("promptState"===o.type)L({canUndo:!0===o.canUndo});else if("promptResult"===o.type&&"string"==typeof o.id){let e=F(o.id);if(!e)return;!0===o.ok?e.resolve({summary:"string"==typeof o.summary?o.summary:""}):e.reject(Error("string"==typeof o.error?o.error:"The prompt failed"))}}};return e.addEventListener("message",B),P.push(()=>e.removeEventListener("message",B)),"loading"===N.readyState?(N.addEventListener("DOMContentLoaded",j,{once:!0}),P.push(()=>N.removeEventListener("DOMContentLoaded",j))):j(),S})(P,new URL(e||U).origin)).isEditing||P.parent!==P?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})(P.document);if(C&&(x=((e,a,{pagePath:i=e=>`/${e}`,productPath:l,collectionPath:s}={})=>{let d=e.document,c=v(),p=[],g=new Map,u=[],m=new Set,y=null,x=null,w=-1/0,k=new Map,C=f,P=e=>{C={...C,...e},c.emit("change",C)},A=()=>P({unsaved:[...g.values()].some(({content:e,saved:t})=>!$(e,t)),canUndo:u.length>0}),L=async(t,r)=>{let o=await e.fetch(`${a}/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)}),n=await o.json().catch(()=>({}));if(401===o.status)throw P({features:[]}),Error("You were signed out. Sign in again to edit.");if(!o.ok)throw Error("string"==typeof n.error?n.error:`Obelism Content answered ${o.status}`);return n},S=()=>d.querySelector(`[${r}]`)?.getAttribute(r)??null,N=()=>{let e=d.querySelector(`[${o}]`),t=e?.getAttribute(o),r=e?.getAttribute("data-cms-product-handle");return t&&r?{id:t,handle:r}:null},M=()=>{let e=d.querySelector(`[${n}]`),t=e?.getAttribute(n),r=e?.getAttribute("data-cms-collection-handle");return t&&r?{id:t,handle:r}:null},I=e=>{let t=e?d.querySelector(E(e)):null;return t?.closest(`[${r}]`)?.getAttribute(r)??S()},U=()=>{if(!y)return;let e=y.space.locales.map(({code:e})=>e),t=d.documentElement.lang;if(e.includes(t))return t;let r=t.split("-")[0]??"";return e.includes(r)?r:y.space.defaultLocale},O=new Map,R=async e=>{let t=g.get(e);if(t)return t;let r=O.get(e);return r||(r=L(`entries/${encodeURIComponent(e)}`).then(t=>{let r=g.get(e)??{content:t.content,saved:t.content,revision:t.draftRevision};return g.set(e,r),r}).finally(()=>O.delete(e)),O.set(e,r)),r},j=e=>{let t=void 0===e?C.selectedUid:e,r=I(t);if(!r)throw Error("Nothing on this page is marked as an entry: add editable(entry)");return{uid:t,entryId:r}},z=e=>{d.querySelectorAll("[data-cms-selected]").forEach(e=>{e.removeAttribute("data-cms-selected")}),C.selectedUid!==e&&P({selectedUid:e}),e&&d.querySelector(E(e))?.setAttribute("data-cms-selected","")},T=async t=>{if(0===c.listeners.update.size)return;let r=g.get(t)?.content,{entry:o}=await L(`entries/${encodeURIComponent(t)}/preview`,{content:r,locale:U()});c.emit("update",{entry:o,selectedUid:C.selectedUid}),e.requestAnimationFrame(()=>z(C.selectedUid))},D=e=>console.error("[@obelism/content bridge]",e),F=t=>{c.emit(t,{}),0===c.listeners.update.size&&e.location.reload()},q=async()=>{for(let[e,t]of g){if($(t.content,t.saved))continue;let{draftRevision:r}=await L(`entries/${encodeURIComponent(e)}/save`,{content:t.content,baseRevision:t.revision});t.saved=t.content,t.revision=r,m.add(e)}u.length=0,w=-1/0,A()},V={isEditing:!0,mode:"site",get entryId(){return S()},get product(){return N()},get collection(){return M()},environment:null,on:c.on,getState:()=>C,async prompt(e,t={}){let r=e.trim();if(!r)throw Error("Say what to change");if(!C.features.includes("prompt"))throw Error("You may not edit content here");let{uid:o,entryId:n}=j(t.uid);P({prompting:!0});try{let e=await R(n),t=await L(`entries/${encodeURIComponent(n)}/prompt`,{prompt:r,content:e.content,locale:U(),uid:o});return u.push({entryId:n,content:e.content}),w=-1/0,e.content=t.content,A(),await T(n),{summary:t.summary}}finally{P({prompting:!1})}},async createPage(t,r){let o=r.trim();if(!o)throw Error("Say what the page is for");if(!t.trim())throw Error("Say where the page goes, like /pricing");if(!C.features.includes("create"))throw Error("You may not add pages here");if(C.unsaved)throw Error("Save or undo your changes before adding a page");P({prompting:!0});try{let r=await L("entries",{path:t,prompt:o,locale:U(),from:S()}),n=i(r.path,U()??"");return e.location.assign(n),{summary:r.summary,entryId:r.entryId,path:r.path,url:n}}finally{P({prompting:!1})}},async createProductPage(t=N()??void 0){if(!t)throw Error("Nothing on this page is marked as a product: add editableProduct(product)");if(!C.features.includes("create"))throw Error("You may not add pages here");if(C.unsaved)throw Error("Save or undo your changes before adding a page");P({prompting:!0});try{let r=await L("product-pages",{product:{id:t.id,handle:t.handle}});return e.location.reload(),r}finally{P({prompting:!1})}},async createCollectionPage(t=M()??void 0){if(!t)throw Error("Nothing on this page is marked as a collection: add editableCollection(collection)");if(!C.features.includes("create"))throw Error("You may not add pages here");if(C.unsaved)throw Error("Save or undo your changes before adding a page");P({prompting:!0});try{let r=await L("collection-pages",{collection:{id:t.id,handle:t.handle}});return e.location.reload(),r}finally{P({prompting:!1})}},async view(e={}){let{uid:t,entryId:r}=j(e.uid),o=await R(r),{view:n}=await L(`entries/${encodeURIComponent(r)}/view`,{content:o.content,locale:U(),uid:t});return n},async applyJson(e,t={}){if(!C.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:o}=j(t.uid);P({prompting:!0});try{let t=await R(o),n=await L(`entries/${encodeURIComponent(o)}/apply`,{changes:e,content:t.content,locale:U(),uid:r});return $(n.content,t.content)||(u.push({entryId:o,content:t.content}),w=-1/0,t.content=n.content,A(),await T(o)),{changed:n.changed??[],...n.view&&{view:n.view}}}finally{P({prompting:!1})}},openForm(t,r={}){let{title:o="Content form",onReady:n,onError:a}=r;x?.();let i=!1,l=null,s=null,d=()=>{},p=e=>{i||a?.(e instanceof Error?e.message:String(e))},m=()=>{i||(i=!0,d(),l?.destroy(),x===m&&(x=null))};x=m;let b=()=>{if(i||!l)return;let e=I(C.selectedUid);if(!e)return;let t=g.get(e);if(!t)return void R(e).then(b,p);let r={entryId:e,content:t.content,locale:U(),selectedUid:C.selectedUid};s&&s.entryId===r.entryId&&s.content===r.content&&s.locale===r.locale&&s.selectedUid===r.selectedUid||(s=r,l.show(r))},f=(e,t)=>{let r=t??s?.entryId,o=void 0===r?void 0:g.get(r);if(i||void 0===r||!o||$(e,o.content))return;let n=Date.now();n-w>=1e3&&u.push({entryId:r,content:o.content}),w=n,o.content=e,s?.entryId===r&&(s={...s,content:e}),A(),clearTimeout(k.get(r)),k.set(r,setTimeout(()=>{k.delete(r),T(r).catch(D)},300))};return(async()=>{if(!C.features.includes("form"))throw Error("You may not edit content here");await R(j(void 0).entryId);let{url:r}=await L("form",{});i||(l=((e,t,r,o,n)=>{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=o,l.src=r;let s=!1,d=!1,c=null,p=()=>{s&&c&&l.contentWindow?.postMessage({source:h,type:"content",...c},i)},g=setTimeout(()=>{d||n.onError("The form did not open")},3e4),u=()=>{d=!0,clearTimeout(g),n.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,p(),!0!==t.loading&&u();else if("loaded"===t.type)s&&u();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&&n.onError("string"==typeof t.message&&t.message?t.message:"The form failed");else n.onChange(t.content,"string"==typeof t.entryId?t.entryId:void 0)}};return e.addEventListener("message",m),t.appendChild(l),{show(e){c=e,p()},destroy(){clearTimeout(g),e.removeEventListener("message",m),l.remove()}}})(e,t,"string"==typeof r?r:"",o,{onReady:()=>n?.(),onChange:f,onError:e=>a?.(e)}),d=c.on("change",b),b())})().catch(p),{close:m}},async pages(){let{pages:e}=await L("pages"),t=[U(),y?.space.defaultLocale];return e.flatMap(e=>{let r,o,n=t.find(t=>void 0!==t&&void 0!==e.paths[t])??Object.keys(e.paths)[0],a=void 0===n?void 0:e.paths[n];return void 0===n||void 0===a?[]:[{entryId:e.entryId,name:e.name,contentType:e.contentType,status:e.status,path:a,url:e.product?(r=e.product.handle,l?l(r,n):(y?.productPath??"/products/{handle}").replaceAll("{handle}",encodeURIComponent(r))):e.collection?(o=e.collection.handle,s?s(o,n):(y?.collectionPath??"/collections/{handle}").replaceAll("{handle}",encodeURIComponent(o))):i(a,n),product:e.product??null,collection:e.collection??null}]})},openPage(t){(!C.unsaved||e.confirm("Leave this page and lose the changes you have not saved?"))&&(g.clear(),u.length=0,A(),e.location.assign(t.url))},undo(){let e=u.pop(),t=e&&g.get(e.entryId);e&&t&&(w=-1/0,t.content=e.content,A(),T(e.entryId).catch(D))},async save(){if(!C.features.includes("save"))throw Error("You may not edit content here");P({saving:!0});try{await q()}finally{P({saving:!1})}F("saved")},async publish(){if(!C.features.includes("publish"))throw Error("You may not publish here");P({publishing:!0});try{await q();let e=S(),t=m.size>0?[...m]: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 L(`entries/${encodeURIComponent(e)}/publish`,{}),m.delete(e)}finally{P({publishing:!1})}F("published")},signOut(){if(C.unsaved&&!e.confirm("Sign out and lose the changes you have not saved?"))return;g.clear(),A();let t=e.location.pathname+e.location.search;e.location.href=`${a}/logout?return_to=${encodeURIComponent(t)}`},select(e){z(e)},setSelecting(e){e?d.documentElement.setAttribute("data-cms-selecting",""):d.documentElement.removeAttribute("data-cms-selecting"),P({selecting:e})},destroy(){x?.(),k.forEach(e=>clearTimeout(e)),k.clear(),p.splice(0).forEach(e=>e())}},B=d.createElement("style");B.textContent=b("html[data-cms-selecting] "),d.head.appendChild(B),p.push(()=>B.remove()),p.push(()=>d.documentElement.removeAttribute("data-cms-selecting"));let H=e=>{if(!C.selecting)return;let r=e.target,o=r?.closest?.(`[${t}]`);o&&(e.preventDefault(),e.stopPropagation(),z(o.getAttribute(t)))};d.addEventListener("click",H,!0),p.push(()=>d.removeEventListener("click",H,!0));let W=e=>{C.unsaved&&(e.preventDefault(),e.returnValue="")};return e.addEventListener("beforeunload",W),p.push(()=>e.removeEventListener("beforeunload",W)),L("session").then(e=>{y=e,P({features:e.features})}).catch(e=>console.error("[@obelism/content bridge]",e)),V})(P,C,{pagePath:p,productPath:m,collectionPath:y})),x.isEditing&&c){let e=P.document,t=()=>{},r=!1,o=()=>{r||(t=I(e,x,!0===c?{}:c))};e.body?o():e.addEventListener("DOMContentLoaded",o,{once:!0});let n=x.destroy;x.destroy=()=>{r=!0,e.removeEventListener("DOMContentLoaded",o),t(),n()}}}return P[O]=x,x};(e=window).ObelismBridge=j((e=>{let t=e?.dataset.url,r=t||U;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:j,mountPromptBox:I}}();
|