@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/dist/bridge.mjs CHANGED
@@ -1,19 +1,22 @@
1
- import { P as PREVIEW_PARAMS, U as UID_ATTRIBUTE, 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';
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
- title: '{clickers} of {viewers} visitors of its page clicked it in the last 30 days ({clicks} clicks)'
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[data-place='beside'] { transform: translateY(-50%); }
43
- .badge[data-place='above'] { transform: translate(-100%, -100%); }
44
- .badge:focus-visible { outline: 2px solid rgb(212 130 30); outline-offset: 2px; }
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: its label goes
49
- // beside it (or above, without room on the right) so it doesn't cover it.
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
- // Room a label needs beside an element.
52
- const LABEL_WIDTH = 140;
53
- // Where a label goes for an element's box: inside the top-right corner of a
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
- if (rect.right + INSET + LABEL_WIDTH <= viewportWidth) return {
62
- place: 'beside',
63
- top: rect.top + rect.height / 2,
64
- left: rect.right + INSET
65
- };
66
- return {
67
- place: 'above',
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 height = win.innerHeight;
98
- for (const [uid, block] of Object.entries(stats)){
99
- const element = doc.querySelector(selector(uid));
100
- if (!element) continue;
101
- const rect = element.getBoundingClientRect();
102
- // Not rendered, or off screen.
103
- if (!rect.width && !rect.height) continue;
104
- if (rect.bottom < 0 || rect.top > height) continue;
105
- const badge = doc.createElement('button');
106
- badge.type = 'button';
107
- badge.className = 'badge';
108
- badge.dataset.uid = uid;
109
- badge.textContent = fill$1(labels.clicked, {
110
- rate: Math.round(block.rate * 100)
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 wholePage = button('', labels.scopeEntry);
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, wholePage, cancelNew);
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 wholePageFields = button('', labels.scopeEntry);
3249
+ const upFields = button('', labels.scopeEntry);
3139
3250
  const fieldsNote = element(doc, 'div', {
3140
3251
  className: 'note'
3141
- }, icon('scope'), fieldsNoteText, wholePageFields);
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
- if (typeof value._uid === 'string' && typeof value._type === 'string') names.set(value._uid, humanize(value._type));
3260
- Object.values(value).forEach(readNames);
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
- wholePage.hidden = creating || !state.selectedUid;
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
- // Escape, on the page or in the form: from the pages, from a block to the
3669
- // whole page. True when it did something.
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) bridge.select(null);
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
- wholePage.addEventListener('click', ()=>{
3789
- bridge.select(null);
3790
- input.focus();
3922
+ up.addEventListener('click', ()=>{
3923
+ if (stepUp()) input.focus();
3791
3924
  });
3792
- wholePageFields.addEventListener('click', ()=>{
3793
- bridge.select(null);
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-c7464prw.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-c7464prw.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-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";
@@ -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":"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","names":[]}
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-c7464prw.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-c7464prw.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-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";
@@ -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":"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","names":[]}
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-c7464prw.d.ts.map
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.27.2",
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.3",
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.89.0",
109
- "rollup": "^4.65.0",
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":[]}