@obelism/content 0.27.2 → 0.28.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 +21 -15
- package/dist/bridge.d.mts +6 -1
- package/dist/bridge.d.mts.map +1 -1
- package/dist/bridge.d.ts +6 -1
- package/dist/bridge.d.ts.map +1 -1
- package/dist/bridge.global.js +23 -7
- package/dist/bridge.js +213 -81
- package/dist/bridge.mjs +214 -82
- package/dist/index.d.mts +4 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.mjs +2 -2
- package/dist/site.js +5 -0
- package/dist/site.mjs +5 -0
- package/dist/{types-c7464prw.d.ts → types-b6jbj3g6.d.ts} +8 -1
- package/dist/types-b6jbj3g6.d.ts.map +1 -0
- package/package.json +4 -4
- package/dist/types-c7464prw.d.ts.map +0 -1
package/dist/bridge.mjs
CHANGED
|
@@ -1,19 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { U as UID_ATTRIBUTE, P as PREVIEW_PARAMS, E as ENTRY_ATTRIBUTE, C as COLLECTION_ATTRIBUTE, a as COLLECTION_HANDLE_ATTRIBUTE, b as PRODUCT_ATTRIBUTE, c as PRODUCT_HANDLE_ATTRIBUTE } from './preview-el7sfk3h.mjs';
|
|
2
2
|
import { SITE_EDITING_COOKIE, SITE_REQUEST_HEADER } from './site.mjs';
|
|
3
3
|
import { n as normalizeUrl, D as DEFAULT_URL } from './config-c6qktlz6.mjs';
|
|
4
4
|
|
|
5
|
-
// Click rates on the page: in the visual editor, a small label on each block
|
|
6
|
-
// that numbers has clicks for ("24% clicked"), from the editor's `stats`
|
|
7
|
-
// message. The editor's "Show click rates" switch turns it on and off. Plain
|
|
8
|
-
// DOM in a shadow root, like the prompt box, in a fixed layer that follows
|
|
9
|
-
// the blocks as the page scrolls, resizes and re-renders.
|
|
10
|
-
//
|
|
11
|
-
// Sites tag a block's clickable element with `data-numbers-id={block._uid}`
|
|
12
|
-
// and load Obelism numbers' script; the CMS reads the rates from numbers
|
|
13
|
-
// (the CMS's content/docs/guides/canvas.mdx, "Click rates").
|
|
14
5
|
const DEFAULT_STATS_LABELS = {
|
|
15
6
|
clicked: '{rate}% clicked',
|
|
16
|
-
|
|
7
|
+
clickedShort: '{rate}%',
|
|
8
|
+
title: '{clickers} of {viewers} visitors of its page clicked it in the last 30 days ({clicks} clicks)',
|
|
9
|
+
noClicks: 'No clicks yet in the last 30 days',
|
|
10
|
+
counting: '{clicks} clicks so far: a click rate once {needed} visitors saw its page ({viewers} yet)'
|
|
11
|
+
};
|
|
12
|
+
// Fewer visitors than this make a rate noise.
|
|
13
|
+
const MIN_VIEWERS = 20;
|
|
14
|
+
const TAG_ATTRIBUTE = 'data-numbers-id';
|
|
15
|
+
const statsStatus = (block)=>!block || block.clicks === 0 ? 'none' : block.viewers < MIN_VIEWERS ? 'counting' : 'rate';
|
|
16
|
+
// Lucide's x and hourglass.
|
|
17
|
+
const ICONS$1 = {
|
|
18
|
+
none: '<path d="M18 6 6 18"/><path d="m6 6 12 12"/>',
|
|
19
|
+
counting: '<path d="M5 22h14"/><path d="M5 2h14"/><path d="M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22"/><path d="M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2"/>'
|
|
17
20
|
};
|
|
18
21
|
const fill$1 = (template, values)=>template.replace(/\{(\w+)\}/g, (match, key)=>key in values ? String(values[key]) : match);
|
|
19
22
|
// The same tokens as the prompt box: an ink pill, paper text, the orange
|
|
@@ -39,37 +42,42 @@ const CSS$2 = `
|
|
|
39
42
|
content: ''; width: 8px; height: 8px; border-radius: 50%;
|
|
40
43
|
background: rgb(212 130 30);
|
|
41
44
|
}
|
|
42
|
-
.badge
|
|
43
|
-
.
|
|
44
|
-
|
|
45
|
+
.badge:focus-visible, .tag:focus-visible { outline: 2px solid rgb(212 130 30); outline-offset: 2px; }
|
|
46
|
+
.tag {
|
|
47
|
+
position: absolute; transform: translate(-50%, -50%);
|
|
48
|
+
display: grid; place-items: center; width: 20px; height: 20px; padding: 0;
|
|
49
|
+
cursor: pointer; pointer-events: auto; border: 0; border-radius: 50%;
|
|
50
|
+
color: rgb(242 240 236); background: rgb(23 22 20 / .88);
|
|
51
|
+
box-shadow: 0 4px 10px -6px rgb(23 22 20 / .5);
|
|
52
|
+
}
|
|
53
|
+
.tag::after { content: ''; position: absolute; inset: -6px; }
|
|
54
|
+
.tag[data-status='counting'] { color: rgb(212 130 30); }
|
|
55
|
+
.tag[data-status='rate'] {
|
|
56
|
+
width: auto; height: 20px; padding: 0 7px; border-radius: 5em;
|
|
57
|
+
font-size: 11px; transform: translate(-70%, -50%);
|
|
58
|
+
}
|
|
59
|
+
.tag svg {
|
|
60
|
+
width: 12px; height: 12px; fill: none; stroke: currentColor;
|
|
61
|
+
stroke-width: 2.5; stroke-linecap: round; stroke-linejoin: round;
|
|
62
|
+
}
|
|
45
63
|
`;
|
|
46
|
-
// Inset from a block's top-right corner, or gap beside a small element.
|
|
47
64
|
const INSET = 8;
|
|
48
|
-
// Below this an element is a button or a link, not a section:
|
|
49
|
-
//
|
|
65
|
+
// Below this an element is a button or a link, not a section: a tag on its
|
|
66
|
+
// corner rather than a label over it.
|
|
50
67
|
const SMALL_HEIGHT = 64;
|
|
51
|
-
//
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
// block, beside a small element, or above one at the right edge.
|
|
55
|
-
const placeLabel = (rect, viewportWidth)=>{
|
|
56
|
-
if (rect.height >= SMALL_HEIGHT) return {
|
|
57
|
-
place: 'inside',
|
|
68
|
+
// A block's label: inside its top-right corner, in view when it starts above
|
|
69
|
+
// the screen.
|
|
70
|
+
const placeLabel = (rect)=>({
|
|
58
71
|
top: Math.max(rect.top, 0) + INSET,
|
|
59
72
|
left: rect.right - INSET
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
top: rect.top - INSET / 2,
|
|
69
|
-
left: rect.right
|
|
70
|
-
};
|
|
71
|
-
};
|
|
72
|
-
const mountStatsOverlay = (win, { selector, onSelect, labels: labelOverrides })=>{
|
|
73
|
+
});
|
|
74
|
+
// A tag's: on the element's top-right corner, like a notification badge,
|
|
75
|
+
// kept on screen.
|
|
76
|
+
const placeTag = (rect, viewport)=>({
|
|
77
|
+
top: Math.min(Math.max(rect.top, 10), viewport.height - 10),
|
|
78
|
+
left: Math.min(rect.right, viewport.width - 10)
|
|
79
|
+
});
|
|
80
|
+
const mountStatsOverlay = (win, { selector, onSelect, checked, labels: labelOverrides })=>{
|
|
73
81
|
const doc = win.document;
|
|
74
82
|
const labels = {
|
|
75
83
|
...DEFAULT_STATS_LABELS,
|
|
@@ -89,37 +97,71 @@ const mountStatsOverlay = (win, { selector, onSelect, labels: labelOverrides })=
|
|
|
89
97
|
let stats = {};
|
|
90
98
|
let visible = false;
|
|
91
99
|
let frame = null;
|
|
100
|
+
const draw = (id, element, blocks)=>{
|
|
101
|
+
const rect = element.getBoundingClientRect();
|
|
102
|
+
// Not rendered, or off screen.
|
|
103
|
+
if (!rect.width && !rect.height) return;
|
|
104
|
+
if (rect.bottom < 0 || rect.top > win.innerHeight) return;
|
|
105
|
+
const block = stats[id];
|
|
106
|
+
const status = statsStatus(block);
|
|
107
|
+
const label = doc.createElement('button');
|
|
108
|
+
label.type = 'button';
|
|
109
|
+
label.dataset.uid = id;
|
|
110
|
+
label.dataset.status = status;
|
|
111
|
+
const rate = block ? Math.round(block.rate * 100) : 0;
|
|
112
|
+
label.title = status === 'rate' ? fill$1(labels.title, {
|
|
113
|
+
clickers: block.clickers,
|
|
114
|
+
viewers: block.viewers,
|
|
115
|
+
clicks: block.clicks
|
|
116
|
+
}) : status === 'none' ? labels.noClicks : fill$1(labels.counting, {
|
|
117
|
+
clicks: block.clicks,
|
|
118
|
+
viewers: block.viewers,
|
|
119
|
+
needed: MIN_VIEWERS
|
|
120
|
+
});
|
|
121
|
+
const { top, left } = status === 'rate' && rect.height >= SMALL_HEIGHT ? placeLabel(rect) : placeTag(rect, {
|
|
122
|
+
width: win.innerWidth,
|
|
123
|
+
height: win.innerHeight
|
|
124
|
+
});
|
|
125
|
+
if (status === 'rate' && rect.height >= SMALL_HEIGHT) {
|
|
126
|
+
label.className = 'badge';
|
|
127
|
+
label.textContent = fill$1(labels.clicked, {
|
|
128
|
+
rate
|
|
129
|
+
});
|
|
130
|
+
} else {
|
|
131
|
+
label.className = 'tag';
|
|
132
|
+
if (status === 'rate') label.textContent = fill$1(labels.clickedShort, {
|
|
133
|
+
rate
|
|
134
|
+
});
|
|
135
|
+
else label.innerHTML = `<svg viewBox="0 0 24 24" aria-hidden="true">${ICONS$1[status]}</svg>`;
|
|
136
|
+
label.setAttribute('aria-label', label.title);
|
|
137
|
+
}
|
|
138
|
+
label.style.top = `${top}px`;
|
|
139
|
+
label.style.left = `${left}px`;
|
|
140
|
+
// Its id names a block by convention; else the block around it.
|
|
141
|
+
const uid = blocks.has(id) ? id : element.closest(`[${UID_ATTRIBUTE}]`)?.getAttribute(UID_ATTRIBUTE);
|
|
142
|
+
if (uid) label.addEventListener('click', ()=>onSelect(uid));
|
|
143
|
+
layer.appendChild(label);
|
|
144
|
+
};
|
|
92
145
|
const render = ()=>{
|
|
93
146
|
frame = null;
|
|
94
147
|
layer.replaceChildren();
|
|
95
148
|
layer.hidden = !visible;
|
|
96
149
|
if (!visible) return;
|
|
97
|
-
const
|
|
98
|
-
for (const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
if (!
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
badge.title = fill$1(labels.title, {
|
|
113
|
-
clickers: block.clickers,
|
|
114
|
-
viewers: block.viewers,
|
|
115
|
-
clicks: block.clicks
|
|
116
|
-
});
|
|
117
|
-
const { place, top, left } = placeLabel(rect, win.innerWidth);
|
|
118
|
-
badge.dataset.place = place;
|
|
119
|
-
badge.style.top = `${top}px`;
|
|
120
|
-
badge.style.left = `${left}px`;
|
|
121
|
-
badge.addEventListener('click', ()=>onSelect(uid));
|
|
122
|
-
layer.appendChild(badge);
|
|
150
|
+
const blocks = new Set();
|
|
151
|
+
for (const element of doc.querySelectorAll(`[${UID_ATTRIBUTE}]`))blocks.add(element.getAttribute(UID_ATTRIBUTE) ?? '');
|
|
152
|
+
const isChecked = checked ?? ((id)=>blocks.has(id));
|
|
153
|
+
const tagged = new Set();
|
|
154
|
+
for (const element of doc.querySelectorAll(`[${TAG_ATTRIBUTE}]`)){
|
|
155
|
+
const id = element.getAttribute(TAG_ATTRIBUTE);
|
|
156
|
+
if (!id || !stats[id] && !isChecked(id)) continue;
|
|
157
|
+
tagged.add(id);
|
|
158
|
+
draw(id, element, blocks);
|
|
159
|
+
}
|
|
160
|
+
// Rates of blocks the site doesn't tag an element of.
|
|
161
|
+
for (const id of Object.keys(stats)){
|
|
162
|
+
if (tagged.has(id) || !blocks.has(id)) continue;
|
|
163
|
+
const element = doc.querySelector(selector(id));
|
|
164
|
+
if (element) draw(id, element, blocks);
|
|
123
165
|
}
|
|
124
166
|
};
|
|
125
167
|
// At most once a frame, however many scroll and mutation events come in.
|
|
@@ -784,6 +826,7 @@ const DEFAULT_SITE_EDITOR_LABELS = {
|
|
|
784
826
|
envProduction: 'live',
|
|
785
827
|
scopeNoteBlock: 'Working on {name}. Click another block to switch.',
|
|
786
828
|
scopeNotePage: 'Working on the whole page. Click a block to change only that block.',
|
|
829
|
+
scopeUp: 'Up to {name}',
|
|
787
830
|
block: 'Block',
|
|
788
831
|
previewChip: '{name} · preview',
|
|
789
832
|
askIntro: 'Describe a change and Obelism shows it on the page. Nothing is stored until you keep it and save.',
|
|
@@ -1948,6 +1991,10 @@ const mountFormFrame = (win, container, url, title, handlers)=>{
|
|
|
1948
1991
|
// kept in step with the content here, see formFrame.ts), edits JSON (`view`,
|
|
1949
1992
|
// then `applyJson`: the raw alternative), and lists the space's pages to go
|
|
1950
1993
|
// to one.
|
|
1994
|
+
// The CMS's limit on ids in one stats request.
|
|
1995
|
+
const MAX_STATS_IDS = 500;
|
|
1996
|
+
// After the page changes, before asking for the ids it newly tags.
|
|
1997
|
+
const STATS_DELAY_MS = 1000;
|
|
1951
1998
|
// Plain path segments only: the URL parser drops tabs and newlines and reads
|
|
1952
1999
|
// \ as /, so anything looser can resolve to another origin.
|
|
1953
2000
|
const BASE_PATH = /^(?:\/[\w.~-]+)+$/;
|
|
@@ -2534,8 +2581,10 @@ const createSiteBridge = (win, basePath, { pagePath = (path)=>`/${path.replace(/
|
|
|
2534
2581
|
if (selecting) doc.documentElement.setAttribute('data-cms-selecting', '');
|
|
2535
2582
|
else doc.documentElement.removeAttribute('data-cms-selecting');
|
|
2536
2583
|
setState({
|
|
2537
|
-
selecting
|
|
2584
|
+
selecting,
|
|
2585
|
+
statsVisible: selecting
|
|
2538
2586
|
});
|
|
2587
|
+
showStats();
|
|
2539
2588
|
},
|
|
2540
2589
|
destroy () {
|
|
2541
2590
|
closeForm?.();
|
|
@@ -2569,11 +2618,72 @@ const createSiteBridge = (win, basePath, { pagePath = (path)=>`/${path.replace(/
|
|
|
2569
2618
|
};
|
|
2570
2619
|
win.addEventListener('beforeunload', onBeforeUnload);
|
|
2571
2620
|
cleanup.push(()=>win.removeEventListener('beforeunload', onBeforeUnload));
|
|
2621
|
+
// The tags on the page's links (statsOverlay.ts) while blocks are
|
|
2622
|
+
// outlined: the rates of the ids the page tags, asked for as they appear.
|
|
2623
|
+
const asked = new Set();
|
|
2624
|
+
const answered = new Set();
|
|
2625
|
+
let statsOff = false;
|
|
2626
|
+
let overlay = null;
|
|
2627
|
+
let statsTimer = null;
|
|
2628
|
+
const showStats = ()=>overlay?.update(state.stats, state.statsVisible);
|
|
2629
|
+
const loadStats = async ()=>{
|
|
2630
|
+
if (statsOff) return;
|
|
2631
|
+
const ids = [
|
|
2632
|
+
...new Set([
|
|
2633
|
+
...doc.querySelectorAll(`[${TAG_ATTRIBUTE}]`)
|
|
2634
|
+
].map((element)=>element.getAttribute(TAG_ATTRIBUTE) ?? ''))
|
|
2635
|
+
].filter((id)=>id && !asked.has(id));
|
|
2636
|
+
const batch = ids.slice(0, MAX_STATS_IDS);
|
|
2637
|
+
if (!batch.length) return;
|
|
2638
|
+
batch.forEach((id)=>asked.add(id));
|
|
2639
|
+
try {
|
|
2640
|
+
const { stats } = await api('stats', {
|
|
2641
|
+
uids: batch
|
|
2642
|
+
});
|
|
2643
|
+
batch.forEach((id)=>answered.add(id));
|
|
2644
|
+
setState({
|
|
2645
|
+
stats: {
|
|
2646
|
+
...state.stats,
|
|
2647
|
+
...readStats(stats)
|
|
2648
|
+
}
|
|
2649
|
+
});
|
|
2650
|
+
} catch {
|
|
2651
|
+
// No tags rather than wrong ones, and no asking again.
|
|
2652
|
+
statsOff = true;
|
|
2653
|
+
return;
|
|
2654
|
+
}
|
|
2655
|
+
overlay ??= mountStatsOverlay(win, {
|
|
2656
|
+
selector: blockSelector,
|
|
2657
|
+
onSelect: (uid)=>highlight(uid),
|
|
2658
|
+
checked: (id)=>answered.has(id)
|
|
2659
|
+
});
|
|
2660
|
+
showStats();
|
|
2661
|
+
if (ids.length > batch.length) scheduleStats();
|
|
2662
|
+
};
|
|
2663
|
+
const scheduleStats = ()=>{
|
|
2664
|
+
if (statsTimer !== null || statsOff) return;
|
|
2665
|
+
statsTimer = setTimeout(()=>{
|
|
2666
|
+
statsTimer = null;
|
|
2667
|
+
void loadStats();
|
|
2668
|
+
}, STATS_DELAY_MS);
|
|
2669
|
+
};
|
|
2670
|
+
const Observer = win.MutationObserver;
|
|
2671
|
+
const statsObserver = typeof Observer === 'function' ? new Observer(scheduleStats) : null;
|
|
2672
|
+
cleanup.push(()=>{
|
|
2673
|
+
statsObserver?.disconnect();
|
|
2674
|
+
if (statsTimer !== null) clearTimeout(statsTimer);
|
|
2675
|
+
overlay?.destroy();
|
|
2676
|
+
});
|
|
2572
2677
|
api('session').then((info)=>{
|
|
2573
2678
|
session = info;
|
|
2574
2679
|
setState({
|
|
2575
2680
|
features: info.features
|
|
2576
2681
|
});
|
|
2682
|
+
void loadStats();
|
|
2683
|
+
statsObserver?.observe(doc.body, {
|
|
2684
|
+
childList: true,
|
|
2685
|
+
subtree: true
|
|
2686
|
+
});
|
|
2577
2687
|
}).catch((error)=>console.error('[@obelism/content bridge]', error));
|
|
2578
2688
|
return bridge;
|
|
2579
2689
|
};
|
|
@@ -2757,6 +2867,7 @@ button:disabled { cursor: not-allowed; }
|
|
|
2757
2867
|
flex: none; font-size: 12px; font-weight: 500; text-decoration: underline; text-underline-offset: 2px;
|
|
2758
2868
|
}
|
|
2759
2869
|
.note button::after { content: ''; position: absolute; inset: -13px -6px; }
|
|
2870
|
+
.scroll > .note { position: sticky; top: 0; z-index: 1; }
|
|
2760
2871
|
.intro { color: rgb(var(--muted)); font-size: 13px; }
|
|
2761
2872
|
.gate {
|
|
2762
2873
|
display: grid; gap: 8px; margin: 10px 14px 0; padding: 10px 12px; border-radius: 12px;
|
|
@@ -3065,11 +3176,11 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
|
|
|
3065
3176
|
}, gateKeep, gateUndo));
|
|
3066
3177
|
gate.setAttribute('role', 'alert');
|
|
3067
3178
|
const noteText = element(doc, 'span');
|
|
3068
|
-
const
|
|
3179
|
+
const up = button('', labels.scopeEntry);
|
|
3069
3180
|
const cancelNew = button('', labels.newPageCancel);
|
|
3070
3181
|
const note = element(doc, 'div', {
|
|
3071
3182
|
className: 'note'
|
|
3072
|
-
}, icon('scope'), noteText,
|
|
3183
|
+
}, icon('scope'), noteText, up, cancelNew);
|
|
3073
3184
|
const intro = element(doc, 'p', {
|
|
3074
3185
|
className: 'intro',
|
|
3075
3186
|
textContent: labels.askIntro
|
|
@@ -3135,10 +3246,10 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
|
|
|
3135
3246
|
}, formNote);
|
|
3136
3247
|
// The same way back as the ask view's note, above the form it changes.
|
|
3137
3248
|
const fieldsNoteText = element(doc, 'span');
|
|
3138
|
-
const
|
|
3249
|
+
const upFields = button('', labels.scopeEntry);
|
|
3139
3250
|
const fieldsNote = element(doc, 'div', {
|
|
3140
3251
|
className: 'note'
|
|
3141
|
-
}, icon('scope'), fieldsNoteText,
|
|
3252
|
+
}, icon('scope'), fieldsNoteText, upFields);
|
|
3142
3253
|
const fields = element(doc, 'div', {
|
|
3143
3254
|
className: 'fields',
|
|
3144
3255
|
id: 'obelism-fields'
|
|
@@ -3218,6 +3329,7 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
|
|
|
3218
3329
|
let hoverUid = null;
|
|
3219
3330
|
// Block names by uid, from the views; null when it couldn't be read.
|
|
3220
3331
|
const names = new Map();
|
|
3332
|
+
const parents = new Map();
|
|
3221
3333
|
let pageNames = 'idle';
|
|
3222
3334
|
let destroyed = false;
|
|
3223
3335
|
const formSlot = createFormSlot(bridge, formBox, labels.formTitle, {
|
|
@@ -3253,13 +3365,21 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
|
|
|
3253
3365
|
}
|
|
3254
3366
|
return names.get(uid) ?? labels.block;
|
|
3255
3367
|
};
|
|
3256
|
-
const readNames = (value)=>{
|
|
3257
|
-
if (Array.isArray(value)) value.forEach(readNames);
|
|
3368
|
+
const readNames = (value, parent = null)=>{
|
|
3369
|
+
if (Array.isArray(value)) value.forEach((item)=>readNames(item, parent));
|
|
3258
3370
|
else if (isRecord(value)) {
|
|
3259
|
-
|
|
3260
|
-
|
|
3371
|
+
let uid = parent;
|
|
3372
|
+
if (typeof value._uid === 'string' && typeof value._type === 'string') {
|
|
3373
|
+
uid = value._uid;
|
|
3374
|
+
parents.set(uid, parent);
|
|
3375
|
+
names.set(uid, humanize(value._type));
|
|
3376
|
+
}
|
|
3377
|
+
Object.values(value).forEach((item)=>readNames(item, uid));
|
|
3261
3378
|
}
|
|
3262
3379
|
};
|
|
3380
|
+
// The block around `uid`, null at the top of the page: by the page as it
|
|
3381
|
+
// is now, else by its view, for a block whose wrapper the site doesn't mark.
|
|
3382
|
+
const parentOf = (uid)=>doc.querySelector(blockSelector(uid))?.parentElement?.closest(`[${UID_ATTRIBUTE}]`)?.getAttribute(UID_ATTRIBUTE) ?? parents.get(uid) ?? null;
|
|
3263
3383
|
const readPageNames = ()=>{
|
|
3264
3384
|
if (pageNames !== 'idle' || bridge.entryId === null) return;
|
|
3265
3385
|
pageNames = 'loading';
|
|
@@ -3553,9 +3673,17 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
|
|
|
3553
3673
|
} else {
|
|
3554
3674
|
noteText.textContent = labels.scopeNotePage;
|
|
3555
3675
|
}
|
|
3676
|
+
const parent = state.selectedUid ? parentOf(state.selectedUid) : null;
|
|
3677
|
+
const upText = parent ? fill(labels.scopeUp, {
|
|
3678
|
+
name: nameOf(parent)
|
|
3679
|
+
}) : labels.scopeEntry;
|
|
3680
|
+
for (const link of [
|
|
3681
|
+
up,
|
|
3682
|
+
upFields
|
|
3683
|
+
])if (link.textContent !== upText) link.textContent = upText;
|
|
3556
3684
|
fieldsNote.hidden = creating || !state.selectedUid;
|
|
3557
3685
|
note.hidden = offerShop || pageless && !creating && !options.promptWithoutPage;
|
|
3558
|
-
|
|
3686
|
+
up.hidden = creating || !state.selectedUid;
|
|
3559
3687
|
cancelNew.hidden = !creating || onlyNew;
|
|
3560
3688
|
intro.hidden = answers.length > 0 || offerShop || creating;
|
|
3561
3689
|
shop.hidden = !offerShop;
|
|
@@ -3665,13 +3793,19 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
|
|
|
3665
3793
|
refresh();
|
|
3666
3794
|
(picking ? picker.search : pageButton).focus();
|
|
3667
3795
|
};
|
|
3668
|
-
//
|
|
3669
|
-
|
|
3796
|
+
// True once back at the page.
|
|
3797
|
+
const stepUp = ()=>{
|
|
3798
|
+
const { selectedUid } = bridge.getState();
|
|
3799
|
+
if (selectedUid) bridge.select(parentOf(selectedUid));
|
|
3800
|
+
return !bridge.getState().selectedUid;
|
|
3801
|
+
};
|
|
3802
|
+
// Escape, on the page or in the form: from the pages, from a block a level
|
|
3803
|
+
// up. True when it did something.
|
|
3670
3804
|
const stepBack = ()=>{
|
|
3671
3805
|
const state = bridge.getState();
|
|
3672
3806
|
if (!panelShown(state)) return false;
|
|
3673
3807
|
if (picking) setPicking(false);
|
|
3674
|
-
else if (state.selectedUid)
|
|
3808
|
+
else if (state.selectedUid) stepUp();
|
|
3675
3809
|
else return false;
|
|
3676
3810
|
return true;
|
|
3677
3811
|
};
|
|
@@ -3785,13 +3919,11 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
|
|
|
3785
3919
|
pageButton.addEventListener('click', ()=>setPicking(!picking));
|
|
3786
3920
|
newPage.addEventListener('click', ()=>setCreating(true));
|
|
3787
3921
|
cancelNew.addEventListener('click', ()=>setCreating(false));
|
|
3788
|
-
|
|
3789
|
-
|
|
3790
|
-
input.focus();
|
|
3922
|
+
up.addEventListener('click', ()=>{
|
|
3923
|
+
if (stepUp()) input.focus();
|
|
3791
3924
|
});
|
|
3792
|
-
|
|
3793
|
-
|
|
3794
|
-
focusForm();
|
|
3925
|
+
upFields.addEventListener('click', ()=>{
|
|
3926
|
+
if (stepUp()) focusForm();
|
|
3795
3927
|
});
|
|
3796
3928
|
shopButton.addEventListener('click', async ()=>{
|
|
3797
3929
|
shopMessage = null;
|
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TokenSource } from './oidc.mjs';
|
|
2
|
-
import { R as RichTextFormat, E as Entry, a as RedirectList, b as Redirect, c as EntryList, M as ModelFile, A as Asset, B as Block, I as ImproveBlock, S as ShopifyItem, L as LinkTarget, d as Link, e as EntryStub, f as RichTextNode } from './types-
|
|
3
|
-
export { g as AssetProduct, C as ContentTypeAccent, h as ContentTypeDefinition, i as ContentTypeKind, j as Environment, F as FieldCondition, k as FieldDefinition, l as FieldGroup, m as FieldType, n as RichTextDocument, o as RichTextMark } from './types-
|
|
2
|
+
import { R as RichTextFormat, E as Entry, a as RedirectList, b as Redirect, c as EntryList, M as ModelFile, A as Asset, B as Block, I as ImproveBlock, S as ShopifyItem, L as LinkTarget, d as Link, e as EntryStub, f as RichTextNode } from './types-b6jbj3g6.js';
|
|
3
|
+
export { g as AssetProduct, C as ContentTypeAccent, h as ContentTypeDefinition, i as ContentTypeKind, j as Environment, F as FieldCondition, k as FieldDefinition, l as FieldGroup, m as FieldType, n as RichTextDocument, o as RichTextMark } from './types-b6jbj3g6.js';
|
|
4
4
|
|
|
5
5
|
type ContentClientOptions = {
|
|
6
6
|
token: TokenSource;
|
|
@@ -122,8 +122,9 @@ declare const pickImproveVariant: <TBlock extends Block>(block: ImproveBlock<TBl
|
|
|
122
122
|
type LinkHrefOptions = {
|
|
123
123
|
url?: ((path: string) => string) | undefined;
|
|
124
124
|
product?: ((product: ShopifyItem, page: LinkTarget | null) => string) | undefined;
|
|
125
|
+
collection?: ((collection: ShopifyItem, page: LinkTarget | null) => string) | undefined;
|
|
125
126
|
};
|
|
126
|
-
declare const linkHref: (link: Link | null | undefined, { url, product, }?: LinkHrefOptions) => string | null;
|
|
127
|
+
declare const linkHref: (link: Link | null | undefined, { url, product, collection, }?: LinkHrefOptions) => string | null;
|
|
127
128
|
|
|
128
129
|
declare const PREVIEW_PARAMS: {
|
|
129
130
|
readonly preview: "cms_preview";
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sources":["../src/client.ts","../src/config.ts","../src/editable.ts","../src/errors.ts","../src/images.ts","../src/improve.ts","../src/links.ts","../src/preview.ts","../src/shopify.ts","../src/richText.ts","../src/sitemap.ts"],"mappings":";;;;AAEA,KAAK,oBAAoB;AACzB,WAAW,WAAW;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B;AACA,WAAW,WAAW;AACtB,mBAAmB,KAAK;AACxB;AACA,KAAK,cAAc;AACnB;AACA;AACA,eAAe,cAAc;AAC7B;AACA,WAAW,WAAW;AACtB;AACA,KAAK,gBAAgB;AACrB,KAAK,YAAY,GAAG,cAAc;AAClC;AACA;AACA,aAAa,MAAM,SAAS,gBAAgB,YAAY,gBAAgB;AACxE;AACA;AACA;AACA;AACA,KAAK,cAAc;AACnB;AACA;AACA;AACA,WAAW,WAAW;AACtB;AACA,KAAK,UAAU,gBAAgB,KAAK,GAAG,KAAK;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,aAAa;AAC3B;AACA;AACA,uHAAuH,oBAAoB;AAC3I,6BAA6B,KAAK,GAAG,KAAK,0BAA0B,cAAc,KAAK,OAAO;AAC9F,8BAA8B,KAAK,GAAG,KAAK,0BAA0B,cAAc,KAAK,OAAO,CAAC,UAAU;AAC1G,oDAAoD,cAAc,KAAK,OAAO,CAAC,YAAY;AAC3F,4BAA4B,IAAI,CAAC,cAAc,YAAY,cAAc,CAAC,QAAQ;AAClF,8BAA8B,KAAK,GAAG,KAAK,wBAAwB,cAAc,KAAK,OAAO;AAC7F,gCAAgC,KAAK,GAAG,KAAK,wEAAwE,YAAY,KAAK,OAAO,CAAC,SAAS;AACvJ,mCAAmC,KAAK,GAAG,KAAK,UAAU,IAAI,CAAC,YAAY,wBAAwB,OAAO;AAC1G,iCAAiC,KAAK,GAAG,KAAK,UAAU,IAAI,CAAC,YAAY,YAAY,cAAc;AACnG,gCAAgC,IAAI,CAAC,cAAc,cAAc,OAAO,CAAC,SAAS;AAClF;;AC3DA,cAAc,WAAW;;ACAzB,cAAc,aAAa;AAC3B,cAAc,eAAe;AAC7B,cAAc,iBAAiB;AAC/B,cAAc,wBAAwB;AAGtC,KAAK,QAAQ;AACb;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA,yBAAyB,QAAQ;AACjC,KAAK,eAAe;AACpB;AACA;AACA;AACA,cAAc,eAAe;AAC7B;AACA;AACA,yBAAyB,eAAe;AACxC,KAAK,kBAAkB;AACvB;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA;AACA,yBAAyB,kBAAkB;;AC/B3C,cAAc,eAAe,SAAS,KAAK;AAC3C;AACA;AACA;AACA;AACA;;ACJA,KAAK,cAAc;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ,WAAW,IAAI,CAAC,KAAK,WAAW,OAAO,CAAC,IAAI,CAAC,KAAK,wCAAwC,cAAc;AAC9H,cAAc,WAAW,WAAW,IAAI,CAAC,KAAK,WAAW,OAAO,CAAC,IAAI,CAAC,KAAK,0DAA0D,IAAI,CAAC,cAAc;;ACZxJ,cAAc,aAAa;AAC3B,cAAc,cAAc,UAAU,KAAK,cAAc,YAAY;AACrE,cAAc,kBAAkB,kBAAkB,KAAK,SAAS,YAAY;;ACF5E,KAAK,eAAe;AACpB;AACA,yBAAyB,WAAW,QAAQ,UAAU;AACtD;AACA,cAAc,QAAQ,SAAS,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.mts","sources":["../src/client.ts","../src/config.ts","../src/editable.ts","../src/errors.ts","../src/images.ts","../src/improve.ts","../src/links.ts","../src/preview.ts","../src/shopify.ts","../src/richText.ts","../src/sitemap.ts"],"mappings":"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","names":[]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TokenSource } from './oidc.js';
|
|
2
|
-
import { R as RichTextFormat, E as Entry, a as RedirectList, b as Redirect, c as EntryList, M as ModelFile, A as Asset, B as Block, I as ImproveBlock, S as ShopifyItem, L as LinkTarget, d as Link, e as EntryStub, f as RichTextNode } from './types-
|
|
3
|
-
export { g as AssetProduct, C as ContentTypeAccent, h as ContentTypeDefinition, i as ContentTypeKind, j as Environment, F as FieldCondition, k as FieldDefinition, l as FieldGroup, m as FieldType, n as RichTextDocument, o as RichTextMark } from './types-
|
|
2
|
+
import { R as RichTextFormat, E as Entry, a as RedirectList, b as Redirect, c as EntryList, M as ModelFile, A as Asset, B as Block, I as ImproveBlock, S as ShopifyItem, L as LinkTarget, d as Link, e as EntryStub, f as RichTextNode } from './types-b6jbj3g6.js';
|
|
3
|
+
export { g as AssetProduct, C as ContentTypeAccent, h as ContentTypeDefinition, i as ContentTypeKind, j as Environment, F as FieldCondition, k as FieldDefinition, l as FieldGroup, m as FieldType, n as RichTextDocument, o as RichTextMark } from './types-b6jbj3g6.js';
|
|
4
4
|
|
|
5
5
|
type ContentClientOptions = {
|
|
6
6
|
token: TokenSource;
|
|
@@ -122,8 +122,9 @@ declare const pickImproveVariant: <TBlock extends Block>(block: ImproveBlock<TBl
|
|
|
122
122
|
type LinkHrefOptions = {
|
|
123
123
|
url?: ((path: string) => string) | undefined;
|
|
124
124
|
product?: ((product: ShopifyItem, page: LinkTarget | null) => string) | undefined;
|
|
125
|
+
collection?: ((collection: ShopifyItem, page: LinkTarget | null) => string) | undefined;
|
|
125
126
|
};
|
|
126
|
-
declare const linkHref: (link: Link | null | undefined, { url, product, }?: LinkHrefOptions) => string | null;
|
|
127
|
+
declare const linkHref: (link: Link | null | undefined, { url, product, collection, }?: LinkHrefOptions) => string | null;
|
|
127
128
|
|
|
128
129
|
declare const PREVIEW_PARAMS: {
|
|
129
130
|
readonly preview: "cms_preview";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sources":["../src/client.ts","../src/config.ts","../src/editable.ts","../src/errors.ts","../src/images.ts","../src/improve.ts","../src/links.ts","../src/preview.ts","../src/shopify.ts","../src/richText.ts","../src/sitemap.ts"],"mappings":";;;;AAEA,KAAK,oBAAoB;AACzB,WAAW,WAAW;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B;AACA,WAAW,WAAW;AACtB,mBAAmB,KAAK;AACxB;AACA,KAAK,cAAc;AACnB;AACA;AACA,eAAe,cAAc;AAC7B;AACA,WAAW,WAAW;AACtB;AACA,KAAK,gBAAgB;AACrB,KAAK,YAAY,GAAG,cAAc;AAClC;AACA;AACA,aAAa,MAAM,SAAS,gBAAgB,YAAY,gBAAgB;AACxE;AACA;AACA;AACA;AACA,KAAK,cAAc;AACnB;AACA;AACA;AACA,WAAW,WAAW;AACtB;AACA,KAAK,UAAU,gBAAgB,KAAK,GAAG,KAAK;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,aAAa;AAC3B;AACA;AACA,uHAAuH,oBAAoB;AAC3I,6BAA6B,KAAK,GAAG,KAAK,0BAA0B,cAAc,KAAK,OAAO;AAC9F,8BAA8B,KAAK,GAAG,KAAK,0BAA0B,cAAc,KAAK,OAAO,CAAC,UAAU;AAC1G,oDAAoD,cAAc,KAAK,OAAO,CAAC,YAAY;AAC3F,4BAA4B,IAAI,CAAC,cAAc,YAAY,cAAc,CAAC,QAAQ;AAClF,8BAA8B,KAAK,GAAG,KAAK,wBAAwB,cAAc,KAAK,OAAO;AAC7F,gCAAgC,KAAK,GAAG,KAAK,wEAAwE,YAAY,KAAK,OAAO,CAAC,SAAS;AACvJ,mCAAmC,KAAK,GAAG,KAAK,UAAU,IAAI,CAAC,YAAY,wBAAwB,OAAO;AAC1G,iCAAiC,KAAK,GAAG,KAAK,UAAU,IAAI,CAAC,YAAY,YAAY,cAAc;AACnG,gCAAgC,IAAI,CAAC,cAAc,cAAc,OAAO,CAAC,SAAS;AAClF;;AC3DA,cAAc,WAAW;;ACAzB,cAAc,aAAa;AAC3B,cAAc,eAAe;AAC7B,cAAc,iBAAiB;AAC/B,cAAc,wBAAwB;AAGtC,KAAK,QAAQ;AACb;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA,yBAAyB,QAAQ;AACjC,KAAK,eAAe;AACpB;AACA;AACA;AACA,cAAc,eAAe;AAC7B;AACA;AACA,yBAAyB,eAAe;AACxC,KAAK,kBAAkB;AACvB;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA;AACA,yBAAyB,kBAAkB;;AC/B3C,cAAc,eAAe,SAAS,KAAK;AAC3C;AACA;AACA;AACA;AACA;;ACJA,KAAK,cAAc;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ,WAAW,IAAI,CAAC,KAAK,WAAW,OAAO,CAAC,IAAI,CAAC,KAAK,wCAAwC,cAAc;AAC9H,cAAc,WAAW,WAAW,IAAI,CAAC,KAAK,WAAW,OAAO,CAAC,IAAI,CAAC,KAAK,0DAA0D,IAAI,CAAC,cAAc;;ACZxJ,cAAc,aAAa;AAC3B,cAAc,cAAc,UAAU,KAAK,cAAc,YAAY;AACrE,cAAc,kBAAkB,kBAAkB,KAAK,SAAS,YAAY;;ACF5E,KAAK,eAAe;AACpB;AACA,yBAAyB,WAAW,QAAQ,UAAU;AACtD;AACA,cAAc,QAAQ,SAAS,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sources":["../src/client.ts","../src/config.ts","../src/editable.ts","../src/errors.ts","../src/images.ts","../src/improve.ts","../src/links.ts","../src/preview.ts","../src/shopify.ts","../src/richText.ts","../src/sitemap.ts"],"mappings":"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","names":[]}
|
package/dist/index.js
CHANGED
|
@@ -285,10 +285,10 @@ const pickImproveVariant = (block, option, fallback)=>{
|
|
|
285
285
|
return Object.values(variants)[0] ?? [];
|
|
286
286
|
};
|
|
287
287
|
|
|
288
|
-
const linkHref = (link, { url = (path)=>`/${path}`, product = ({ handle })=>`/products/${handle}` } = {})=>{
|
|
288
|
+
const linkHref = (link, { url = (path)=>`/${path}`, product = ({ handle })=>`/products/${handle}`, collection = ({ handle })=>`/collections/${handle}` } = {})=>{
|
|
289
289
|
if (!link) return null;
|
|
290
290
|
if (link.type === 'entry' && link.entry.path === null) return null;
|
|
291
|
-
const base = link.type === 'url' ? link.url : link.type === 'product' ? product(link.product, link.entry) : url(link.entry.path);
|
|
291
|
+
const base = link.type === 'url' ? link.url : link.type === 'product' ? product(link.product, link.entry) : link.type === 'collection' ? collection(link.collection, link.entry) : url(link.entry.path);
|
|
292
292
|
const hashAt = base.indexOf('#');
|
|
293
293
|
const address = hashAt === -1 ? base : base.slice(0, hashAt);
|
|
294
294
|
const ownHash = hashAt === -1 ? null : base.slice(hashAt + 1);
|
package/dist/index.mjs
CHANGED
|
@@ -283,10 +283,10 @@ const pickImproveVariant = (block, option, fallback)=>{
|
|
|
283
283
|
return Object.values(variants)[0] ?? [];
|
|
284
284
|
};
|
|
285
285
|
|
|
286
|
-
const linkHref = (link, { url = (path)=>`/${path}`, product = ({ handle })=>`/products/${handle}` } = {})=>{
|
|
286
|
+
const linkHref = (link, { url = (path)=>`/${path}`, product = ({ handle })=>`/products/${handle}`, collection = ({ handle })=>`/collections/${handle}` } = {})=>{
|
|
287
287
|
if (!link) return null;
|
|
288
288
|
if (link.type === 'entry' && link.entry.path === null) return null;
|
|
289
|
-
const base = link.type === 'url' ? link.url : link.type === 'product' ? product(link.product, link.entry) : url(link.entry.path);
|
|
289
|
+
const base = link.type === 'url' ? link.url : link.type === 'product' ? product(link.product, link.entry) : link.type === 'collection' ? collection(link.collection, link.entry) : url(link.entry.path);
|
|
290
290
|
const hashAt = base.indexOf('#');
|
|
291
291
|
const address = hashAt === -1 ? base : base.slice(0, hashAt);
|
|
292
292
|
const ownHash = hashAt === -1 ? null : base.slice(hashAt + 1);
|
package/dist/site.js
CHANGED
|
@@ -115,6 +115,11 @@ const PROXY_ROUTES = [
|
|
|
115
115
|
method: 'POST',
|
|
116
116
|
pattern: /^form$/
|
|
117
117
|
},
|
|
118
|
+
// Clicks on the links the page tags, from Numbers.
|
|
119
|
+
{
|
|
120
|
+
method: 'POST',
|
|
121
|
+
pattern: /^stats$/
|
|
122
|
+
},
|
|
118
123
|
{
|
|
119
124
|
method: 'POST',
|
|
120
125
|
pattern: /^entries\/[\w-]+\/(preview|prompt|view|apply|save|publish)$/
|
package/dist/site.mjs
CHANGED
|
@@ -113,6 +113,11 @@ const PROXY_ROUTES = [
|
|
|
113
113
|
method: 'POST',
|
|
114
114
|
pattern: /^form$/
|
|
115
115
|
},
|
|
116
|
+
// Clicks on the links the page tags, from Numbers.
|
|
117
|
+
{
|
|
118
|
+
method: 'POST',
|
|
119
|
+
pattern: /^stats$/
|
|
120
|
+
},
|
|
116
121
|
{
|
|
117
122
|
method: 'POST',
|
|
118
123
|
pattern: /^entries\/[\w-]+\/(preview|prompt|view|apply|save|publish)$/
|
|
@@ -62,6 +62,12 @@ type Link = {
|
|
|
62
62
|
entry: LinkTarget | null;
|
|
63
63
|
query: string | null;
|
|
64
64
|
hash: string | null;
|
|
65
|
+
} | {
|
|
66
|
+
type: 'collection';
|
|
67
|
+
collection: ShopifyItem;
|
|
68
|
+
entry: LinkTarget | null;
|
|
69
|
+
query: string | null;
|
|
70
|
+
hash: string | null;
|
|
65
71
|
};
|
|
66
72
|
type Block<TFields extends Record<string, unknown> = Record<string, unknown>, TType extends string = string> = {
|
|
67
73
|
_uid: string;
|
|
@@ -185,6 +191,7 @@ type FieldDefinition = BaseField & ({
|
|
|
185
191
|
type: 'link';
|
|
186
192
|
contentTypes?: string[];
|
|
187
193
|
products?: boolean;
|
|
194
|
+
collections?: boolean;
|
|
188
195
|
} | {
|
|
189
196
|
type: 'blocks';
|
|
190
197
|
allowedBlocks?: string[];
|
|
@@ -219,4 +226,4 @@ type ModelFile = {
|
|
|
219
226
|
};
|
|
220
227
|
|
|
221
228
|
export type { Asset as A, Block as B, ContentTypeAccent as C, Entry as E, FieldCondition as F, ImproveBlock as I, LinkTarget as L, ModelFile as M, RichTextFormat as R, ShopifyItem as S, RedirectList as a, Redirect as b, EntryList as c, Link as d, EntryStub as e, RichTextNode as f, AssetProduct as g, ContentTypeDefinition as h, ContentTypeKind as i, Environment as j, FieldDefinition as k, FieldGroup as l, FieldType as m, RichTextDocument as n, RichTextMark as o };
|
|
222
|
-
//# sourceMappingURL=types-
|
|
229
|
+
//# sourceMappingURL=types-b6jbj3g6.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types-b6jbj3g6.d.ts","sources":["../src/types.ts"],"mappings":"AAAA,KAAK,WAAW;AAChB,KAAK,cAAc;AACnB,KAAK,KAAK;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,MAAM;AAC1B,kBAAkB,MAAM;AACxB;AACA;AACA;AACA;AACA,eAAe,YAAY;AAC3B;AACA,KAAK,YAAY;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,KAAK,iBAAiB,MAAM,oBAAoB,MAAM;AAC3D;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB;AACA;AACA;AACA;AACA;AACA,KAAK,SAAS;AACd;AACA;AACA;AACA,KAAK,UAAU;AACf;AACA,oBAAoB,MAAM;AAC1B;AACA;AACA;AACA,KAAK,IAAI;AACT;AACA,WAAW,UAAU;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,WAAW;AACxB,WAAW,UAAU;AACrB;AACA;AACA;AACA;AACA,gBAAgB,WAAW;AAC3B,WAAW,UAAU;AACrB;AACA;AACA;AACA,KAAK,KAAK,iBAAiB,MAAM,oBAAoB,MAAM;AAC3D;AACA;AACA;AACA,KAAK,YAAY,gBAAgB,KAAK,GAAG,KAAK,IAAI,KAAK;AACvD;AACA;AACA,cAAc,MAAM;AACpB;AACA,KAAK,YAAY;AACjB;AACA,YAAY,MAAM;AAClB;AACA,KAAK,YAAY;AACjB;AACA,YAAY,MAAM;AAClB,cAAc,YAAY;AAC1B;AACA,YAAY,YAAY;AACxB;AACA,KAAK,gBAAgB,GAAG,YAAY;AACpC;AACA;AACA,KAAK,SAAS,gBAAgB,KAAK,GAAG,KAAK;AAC3C;AACA;AACA;AACA;AACA;AACA,KAAK,QAAQ;AACb;AACA;AACA;AACA;AACA,KAAK,YAAY;AACjB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA,KAAK,WAAW;AAChB;AACA;AACA;AACA,KAAK,eAAe;AACpB,KAAK,SAAS;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,MAAM;AACvB;AACA,WAAW,cAAc;AACzB;AACA,KAAK,cAAc;AACnB;AACA;AACA;AACA;AACA;AACA,KAAK,UAAU;AACf;AACA;AACA;AACA;AACA,KAAK,iBAAiB;AACtB,KAAK,eAAe,GAAG,SAAS;AAChC;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,SAAS,GAAG,eAAe;AAChC,KAAK,qBAAqB;AAC1B;AACA;AACA,UAAU,eAAe;AACzB;AACA;AACA,aAAa,iBAAiB;AAC9B;AACA,aAAa,UAAU;AACvB,YAAY,eAAe;AAC3B;AACA,KAAK,SAAS;AACd;AACA;AACA,kBAAkB,qBAAqB;AACvC;;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@obelism/content",
|
|
3
3
|
"description": "Obelism Content SDK: the delivery API client, the visual editor bridge with prompt editing, editing on your own site, webhook verification, and the content model CLI",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.28.1",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cms",
|
|
7
7
|
"headless-cms",
|
|
@@ -101,12 +101,12 @@
|
|
|
101
101
|
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
102
102
|
"@types/node": "^26.6.5",
|
|
103
103
|
"@typescript/typescript6": "^6.0.2",
|
|
104
|
-
"@vercel/oidc": "4.0.
|
|
104
|
+
"@vercel/oidc": "4.0.4",
|
|
105
105
|
"bunchee": "^7.0.2",
|
|
106
106
|
"jsdom": "^30.1.3",
|
|
107
107
|
"npm-run-all2": "^9.0.4",
|
|
108
|
-
"oxlint": "^1.
|
|
109
|
-
"rollup": "^4.65.
|
|
108
|
+
"oxlint": "^1.90.0",
|
|
109
|
+
"rollup": "^4.65.1",
|
|
110
110
|
"rollup-plugin-swc3": "^0.12.1",
|
|
111
111
|
"typescript": "^7.0.2",
|
|
112
112
|
"vitest": "^5.0.5"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types-c7464prw.d.ts","sources":["../src/types.ts"],"mappings":"AAAA,KAAK,WAAW;AAChB,KAAK,cAAc;AACnB,KAAK,KAAK;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,MAAM;AAC1B,kBAAkB,MAAM;AACxB;AACA;AACA;AACA;AACA,eAAe,YAAY;AAC3B;AACA,KAAK,YAAY;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,KAAK,iBAAiB,MAAM,oBAAoB,MAAM;AAC3D;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB;AACA;AACA;AACA;AACA;AACA,KAAK,SAAS;AACd;AACA;AACA;AACA,KAAK,UAAU;AACf;AACA,oBAAoB,MAAM;AAC1B;AACA;AACA;AACA,KAAK,IAAI;AACT;AACA,WAAW,UAAU;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,WAAW;AACxB,WAAW,UAAU;AACrB;AACA;AACA;AACA,KAAK,KAAK,iBAAiB,MAAM,oBAAoB,MAAM;AAC3D;AACA;AACA;AACA,KAAK,YAAY,gBAAgB,KAAK,GAAG,KAAK,IAAI,KAAK;AACvD;AACA;AACA,cAAc,MAAM;AACpB;AACA,KAAK,YAAY;AACjB;AACA,YAAY,MAAM;AAClB;AACA,KAAK,YAAY;AACjB;AACA,YAAY,MAAM;AAClB,cAAc,YAAY;AAC1B;AACA,YAAY,YAAY;AACxB;AACA,KAAK,gBAAgB,GAAG,YAAY;AACpC;AACA;AACA,KAAK,SAAS,gBAAgB,KAAK,GAAG,KAAK;AAC3C;AACA;AACA;AACA;AACA;AACA,KAAK,QAAQ;AACb;AACA;AACA;AACA;AACA,KAAK,YAAY;AACjB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA,KAAK,WAAW;AAChB;AACA;AACA;AACA,KAAK,eAAe;AACpB,KAAK,SAAS;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,MAAM;AACvB;AACA,WAAW,cAAc;AACzB;AACA,KAAK,cAAc;AACnB;AACA;AACA;AACA;AACA;AACA,KAAK,UAAU;AACf;AACA;AACA;AACA;AACA,KAAK,iBAAiB;AACtB,KAAK,eAAe,GAAG,SAAS;AAChC;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,SAAS,GAAG,eAAe;AAChC,KAAK,qBAAqB;AAC1B;AACA;AACA,UAAU,eAAe;AACzB;AACA;AACA,aAAa,iBAAiB;AAC9B;AACA,aAAa,UAAU;AACvB,YAAY,eAAe;AAC3B;AACA,KAAK,SAAS;AACd;AACA;AACA,kBAAkB,qBAAqB;AACvC;;","names":[]}
|