@bagelink/blox 1.15.170 → 1.15.174

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.
Files changed (33) hide show
  1. package/dist/{PreviewApp-CwB2kJi3.js → PreviewApp-CsC6qej1.js} +1 -1
  2. package/dist/{PreviewApp-DqRHk5sz.cjs → PreviewApp-Dz003khp.cjs} +1 -1
  3. package/dist/PreviewApp.vue.d.ts.map +1 -1
  4. package/dist/{PreviewApp.vue_vue_type_style_index_0_lang-B1SNJnOd.cjs → PreviewApp.vue_vue_type_style_index_0_lang-BNKK7Vhs.cjs} +5 -2
  5. package/dist/{PreviewApp.vue_vue_type_style_index_0_lang-BVTlfTLk.js → PreviewApp.vue_vue_type_style_index_0_lang-C1SwhjdY.js} +5 -2
  6. package/dist/bridge.d.ts +4 -1
  7. package/dist/bridge.d.ts.map +1 -1
  8. package/dist/components/LocaleRouterLink.vue.d.ts +2 -0
  9. package/dist/components/LocaleRouterLink.vue.d.ts.map +1 -1
  10. package/dist/composables/useLocaleNav.d.ts.map +1 -1
  11. package/dist/{core-D8O506WZ.js → core-CbOrSpOU.js} +141 -21
  12. package/dist/{core-jis2RkPA.cjs → core-fPjj9xyJ.cjs} +132 -12
  13. package/dist/core.d.ts.map +1 -1
  14. package/dist/createBloxApp.d.ts.map +1 -1
  15. package/dist/defineBlock.d.ts +25 -2
  16. package/dist/defineBlock.d.ts.map +1 -1
  17. package/dist/index.cjs +15 -5
  18. package/dist/index.d.ts +3 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.mjs +28 -18
  21. package/dist/localeStrategy.d.ts.map +1 -1
  22. package/dist/manifest.d.ts +2 -0
  23. package/dist/manifest.d.ts.map +1 -1
  24. package/dist/schema.d.ts +5 -3
  25. package/dist/schema.d.ts.map +1 -1
  26. package/dist/smartLinks.d.ts +31 -0
  27. package/dist/smartLinks.d.ts.map +1 -0
  28. package/dist/ssg/index.cjs +1 -1
  29. package/dist/ssg/index.mjs +1 -1
  30. package/dist/vite-plugin.cjs +12 -2
  31. package/dist/vite-plugin.d.ts.map +1 -1
  32. package/dist/vite-plugin.mjs +12 -2
  33. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "./PreviewApp.vue_vue_type_style_index_0_lang-BVTlfTLk.js";
1
+ import { _ as _sfc_main } from "./PreviewApp.vue_vue_type_style_index_0_lang-C1SwhjdY.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const PreviewApp_vue_vue_type_style_index_0_lang = require("./PreviewApp.vue_vue_type_style_index_0_lang-B1SNJnOd.cjs");
3
+ const PreviewApp_vue_vue_type_style_index_0_lang = require("./PreviewApp.vue_vue_type_style_index_0_lang-BNKK7Vhs.cjs");
4
4
  exports.default = PreviewApp_vue_vue_type_style_index_0_lang._sfc_main;
@@ -1 +1 @@
1
- {"version":3,"file":"PreviewApp.vue.d.ts","sourceRoot":"","sources":["../src/PreviewApp.vue"],"names":[],"mappings":";AA6RA,wBAMG"}
1
+ {"version":3,"file":"PreviewApp.vue.d.ts","sourceRoot":"","sources":["../src/PreviewApp.vue"],"names":[],"mappings":";AAqSA,wBAMG"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  const vue = require("vue");
3
- const core = require("./core-jis2RkPA.cjs");
3
+ const core = require("./core-fPjj9xyJ.cjs");
4
4
  function sendToEditor(msg) {
5
5
  window.parent.postMessage(msg, "*");
6
6
  }
@@ -173,7 +173,10 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
173
173
  if (msg.index !== null) {
174
174
  vue.nextTick(() => {
175
175
  const el = document.querySelector(`[data-blox-index="${msg.index}"]`);
176
- el == null ? void 0 : el.scrollIntoView({ behavior: "smooth", block: "center" });
176
+ if (!el) return;
177
+ const OFFSET = 72;
178
+ const top = el.getBoundingClientRect().top + window.scrollY - OFFSET;
179
+ window.scrollTo({ top: Math.max(0, top), behavior: "smooth" });
177
180
  });
178
181
  }
179
182
  break;
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, inject, ref, h, provide, onMounted, onUnmounted, openBlock, createElementBlock, createVNode, unref, nextTick } from "vue";
2
- import { B as BLOX_REGISTRY_KEY, g as globalRefOf, G as GlobalBlockHost, u as useLocale } from "./core-D8O506WZ.js";
2
+ import { B as BLOX_REGISTRY_KEY, g as globalRefOf, G as GlobalBlockHost, u as useLocale } from "./core-CbOrSpOU.js";
3
3
  function sendToEditor(msg) {
4
4
  window.parent.postMessage(msg, "*");
5
5
  }
@@ -172,7 +172,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
172
172
  if (msg.index !== null) {
173
173
  nextTick(() => {
174
174
  const el = document.querySelector(`[data-blox-index="${msg.index}"]`);
175
- el == null ? void 0 : el.scrollIntoView({ behavior: "smooth", block: "center" });
175
+ if (!el) return;
176
+ const OFFSET = 72;
177
+ const top = el.getBoundingClientRect().top + window.scrollY - OFFSET;
178
+ window.scrollTo({ top: Math.max(0, top), behavior: "smooth" });
176
179
  });
177
180
  }
178
181
  break;
package/dist/bridge.d.ts CHANGED
@@ -1,12 +1,15 @@
1
1
  import { SchemaDefinition } from '@bagelink/vue';
2
2
  import { Block, PageResolveRead } from './api/types';
3
+ import { BlockDataSourceConfig } from './defineBlock';
3
4
  export interface BlockSchemaInfo {
4
5
  label: string;
5
6
  description?: string;
6
7
  icon?: string;
7
8
  fields?: SchemaDefinition;
8
9
  defaults?: Record<string, unknown>;
9
- dataSource?: boolean;
10
+ dataSource?: BlockDataSourceConfig;
11
+ /** Group key for the editor block picker. See {@link BlockMeta.category}. */
12
+ category?: string;
10
13
  thumbnail?: string;
11
14
  order?: number;
12
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAEzD,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,gBAAgB,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAMD,MAAM,MAAM,aAAa,GACpB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,KAAK,EAAE,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,iBAAiB,CAAA;CAAE;AAC7B;;;;GAIG;GACD;IAAE,IAAI,EAAE,wBAAwB,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE;AACrD;;;;;GAKG;GACD;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAMnD,MAAM,MAAM,cAAc,GACrB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AACpD;;;;;GAKG;GACD;IAAE,IAAI,EAAE,wBAAwB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAM3C,wBAAgB,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAEtD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAEjF"}
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAE1D,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,gBAAgB,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,UAAU,CAAC,EAAE,qBAAqB,CAAA;IAClC,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAMD,MAAM,MAAM,aAAa,GACpB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,KAAK,EAAE,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,iBAAiB,CAAA;CAAE;AAC7B;;;;GAIG;GACD;IAAE,IAAI,EAAE,wBAAwB,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE;AACrD;;;;;GAKG;GACD;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAMnD,MAAM,MAAM,cAAc,GACrB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AACpD;;;;;GAKG;GACD;IAAE,IAAI,EAAE,wBAAwB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAM3C,wBAAgB,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAEtD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAEjF"}
@@ -10,6 +10,8 @@ declare function __VLS_template(): {
10
10
  attrs: Partial<{}>;
11
11
  slots: {
12
12
  default?(_: {}): any;
13
+ default?(_: {}): any;
14
+ default?(_: {}): any;
13
15
  };
14
16
  refs: {};
15
17
  rootEl: any;
@@ -1 +1 @@
1
- {"version":3,"file":"LocaleRouterLink.vue.d.ts","sourceRoot":"","sources":["../../src/components/LocaleRouterLink.vue"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAMlD,KAAK,WAAW,GAAG;IAClB,EAAE,EAAE,gBAAgB,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAA;CACpF,CAAC;AAgBF,iBAAS,cAAc;WAgCT,OAAO,IAA6B;;yBAVrB,GAAG;;;;EAe/B;AAUD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe,kSAOnB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAQpG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"LocaleRouterLink.vue.d.ts","sourceRoot":"","sources":["../../src/components/LocaleRouterLink.vue"],"names":[],"mappings":"AAuEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AASlD,KAAK,WAAW,GAAG;IAClB,EAAE,EAAE,gBAAgB,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAA;CACpF,CAAC;AA+BF,iBAAS,cAAc;WAqDT,OAAO,IAA6B;;yBAZrB,GAAG;yBACH,GAAG;yBACH,GAAG;;;;EAe/B;AAWD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe,kSAMnB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAQpG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useLocaleNav.d.ts","sourceRoot":"","sources":["../../src/composables/useLocaleNav.ts"],"names":[],"mappings":"AAKA;;;;;;;GAOG;AACH,wBAAgB,YAAY;iCAKS,MAAM;mBAkBpB,MAAM,KAAG,MAAM;;EAOrC"}
1
+ {"version":3,"file":"useLocaleNav.d.ts","sourceRoot":"","sources":["../../src/composables/useLocaleNav.ts"],"names":[],"mappings":"AAMA;;;;;;;GAOG;AACH,wBAAgB,YAAY;iCAKS,MAAM;mBAkBpB,MAAM,KAAG,MAAM;;EAQrC"}
@@ -2,7 +2,7 @@ var __defProp = Object.defineProperty;
2
2
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
3
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
4
  import { BLOX_WEBSITE_ID_WINDOW_KEY, BLOX_STATE_WINDOW_KEY } from "./ssg/client.mjs";
5
- import { inject, computed, ref, defineComponent, onMounted, unref, openBlock, createBlock, Teleport, createElementBlock, createElementVNode, createCommentVNode, onUnmounted, watch, h, provide, resolveComponent, createVNode, toDisplayString, withCtx, createTextVNode, Fragment, normalizeProps, guardReactiveProps, renderSlot } from "vue";
5
+ import { inject, computed, ref, defineComponent, onMounted, unref, openBlock, createBlock, Teleport, createElementBlock, createElementVNode, createCommentVNode, onUnmounted, watch, h, provide, resolveComponent, createVNode, toDisplayString, withCtx, createTextVNode, Fragment, useAttrs, mergeProps, renderSlot, normalizeProps } from "vue";
6
6
  import { useRoute, useRouter, RouterLink } from "vue-router";
7
7
  import { getI18n, Loading } from "@bagelink/vue";
8
8
  const BASE = "/api";
@@ -115,7 +115,7 @@ function useBloxEdit(configOverride) {
115
115
  }
116
116
  return { config, enabled, showEdit, studioBaseUrl, editUrl, enable, dismiss, init };
117
117
  }
118
- const _hoisted_1$1 = {
118
+ const _hoisted_1$2 = {
119
119
  key: 0,
120
120
  class: "blox-admin-bar"
121
121
  };
@@ -138,7 +138,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
138
138
  key: 0,
139
139
  to: "body"
140
140
  }, [
141
- unref(showEdit) && __props.websiteId && __props.pageId ? (openBlock(), createElementBlock("div", _hoisted_1$1, [
141
+ unref(showEdit) && __props.websiteId && __props.pageId ? (openBlock(), createElementBlock("div", _hoisted_1$2, [
142
142
  createElementVNode("button", {
143
143
  type: "button",
144
144
  class: "blox-admin-btn",
@@ -283,11 +283,11 @@ const PageRenderer = defineComponent({
283
283
  );
284
284
  }
285
285
  });
286
- const _hoisted_1 = {
286
+ const _hoisted_1$1 = {
287
287
  key: 0,
288
288
  class: "blox-loading flex column h-100vh justify-content-center"
289
289
  };
290
- const _hoisted_2 = {
290
+ const _hoisted_2$1 = {
291
291
  key: 1,
292
292
  class: "blox-not-found"
293
293
  };
@@ -399,9 +399,9 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
399
399
  return (_ctx, _cache) => {
400
400
  const _component_RouterLink = resolveComponent("RouterLink");
401
401
  return openBlock(), createElementBlock("div", null, [
402
- initialLoading.value && blocks.value.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_1, [
402
+ initialLoading.value && blocks.value.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_1$1, [
403
403
  createVNode(unref(Loading))
404
- ])) : notFound.value ? (openBlock(), createElementBlock("div", _hoisted_2, [
404
+ ])) : notFound.value ? (openBlock(), createElementBlock("div", _hoisted_2$1, [
405
405
  _cache[0] || (_cache[0] = createElementVNode("h2", null, "404", -1)),
406
406
  createElementVNode("p", null, toDisplayString(unref(locale2) === "he" ? "הדף לא נמצא" : "Page not found"), 1),
407
407
  createVNode(_component_RouterLink, { to: "/" }, {
@@ -423,7 +423,96 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
423
423
  };
424
424
  }
425
425
  });
426
+ function normalizeLink(href) {
427
+ const v = href == null ? void 0 : href.trim();
428
+ if (!v) return void 0;
429
+ if (/^(https?:|mailto:|tel:|sms:|whatsapp:|geo:|#|\/\/|\/|\.)/i.test(v)) return v;
430
+ return `/${v}`;
431
+ }
432
+ const normalizeTo = normalizeLink;
433
+ function isAbsoluteExternal(href) {
434
+ return /^(https?:)?\/\//i.test(href);
435
+ }
436
+ function isSpecialScheme(href) {
437
+ return /^(mailto:|tel:|sms:|whatsapp:|geo:|#)/i.test(href);
438
+ }
439
+ function classifyLink(href, origin = typeof window !== "undefined" ? window.location.origin : "") {
440
+ if (isSpecialScheme(href)) return "special";
441
+ if (isAbsoluteExternal(href)) {
442
+ if (origin) {
443
+ try {
444
+ if (new URL(href, origin).origin === origin) return "internal";
445
+ } catch {
446
+ }
447
+ }
448
+ return "external";
449
+ }
450
+ return "internal";
451
+ }
452
+ function toInternalPath(href) {
453
+ const normalized = normalizeLink(href) ?? href.trim();
454
+ if (isAbsoluteExternal(normalized)) {
455
+ try {
456
+ const base = typeof window !== "undefined" ? window.location.href : "http://localhost";
457
+ const url = new URL(normalized, base);
458
+ return `${url.pathname}${url.search}${url.hash}` || "/";
459
+ } catch {
460
+ return normalized;
461
+ }
462
+ }
463
+ return normalized || "/";
464
+ }
465
+ function shouldIgnore(e, anchor) {
466
+ if (e.defaultPrevented) return true;
467
+ if (e.button !== 0) return true;
468
+ if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return true;
469
+ if (anchor.hasAttribute("download")) return true;
470
+ const target = anchor.getAttribute("target");
471
+ if (target && target !== "_self") return true;
472
+ return false;
473
+ }
474
+ function installSmartLinks(router) {
475
+ if (typeof document === "undefined") return () => {
476
+ };
477
+ function onClick(e) {
478
+ var _a, _b, _c;
479
+ const path = ((_a = e.composedPath) == null ? void 0 : _a.call(e)) ?? [];
480
+ const anchor = path.find((el) => el instanceof HTMLAnchorElement) ?? ((_c = (_b = e.target) == null ? void 0 : _b.closest) == null ? void 0 : _c.call(_b, "a"));
481
+ if (!anchor) return;
482
+ const rawHref = anchor.getAttribute("href");
483
+ if (!rawHref) return;
484
+ const href = normalizeLink(rawHref) ?? rawHref.trim();
485
+ if (!href) return;
486
+ if (isSpecialScheme(href)) return;
487
+ if (isAbsoluteExternal(href)) {
488
+ let sameOrigin = false;
489
+ try {
490
+ sameOrigin = new URL(href, window.location.href).origin === window.location.origin;
491
+ } catch {
492
+ sameOrigin = false;
493
+ }
494
+ if (!sameOrigin) {
495
+ if (anchor.getAttribute("target")) return;
496
+ e.preventDefault();
497
+ window.open(href, "_blank", "noopener,noreferrer");
498
+ return;
499
+ }
500
+ if (shouldIgnore(e, anchor)) return;
501
+ e.preventDefault();
502
+ void router.push(toInternalPath(href));
503
+ return;
504
+ }
505
+ if (shouldIgnore(e, anchor)) return;
506
+ e.preventDefault();
507
+ void router.push(href.startsWith("/") ? href : `/${href}`);
508
+ }
509
+ document.addEventListener("click", onClick);
510
+ return () => document.removeEventListener("click", onClick);
511
+ }
512
+ const _hoisted_1 = ["href"];
513
+ const _hoisted_2 = ["href"];
426
514
  const _sfc_main = /* @__PURE__ */ defineComponent({
515
+ ...{ inheritAttrs: false },
427
516
  __name: "LocaleRouterLink",
428
517
  props: {
429
518
  to: {},
@@ -434,20 +523,39 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
434
523
  },
435
524
  setup(__props) {
436
525
  const props = __props;
526
+ const attrs = useAttrs();
437
527
  const strategy = inject(BLOX_LOCALE_STRATEGY_KEY, null);
438
528
  const { locale: locale2 } = useLocale();
439
- const localizedTo = computed(() => {
440
- if (!strategy || typeof props.to !== "string") return props.to;
529
+ const resolved = computed(() => {
530
+ if (typeof props.to !== "string") {
531
+ return { kind: "route", to: props.to };
532
+ }
533
+ const href = normalizeLink(props.to) ?? props.to.trim();
534
+ const kind = classifyLink(href);
535
+ if (kind === "external") return { kind: "external", href };
536
+ if (kind === "special") return { kind: "special", href };
537
+ const path = toInternalPath(href);
441
538
  const loc = String(locale2.value || "").slice(0, 2).toLowerCase();
442
- return strategy.toPath(props.to, loc || void 0);
539
+ const to = strategy ? strategy.toPath(path, loc || void 0) : path;
540
+ return { kind: "route", to };
443
541
  });
444
542
  return (_ctx, _cache) => {
445
- return openBlock(), createBlock(unref(RouterLink), normalizeProps(guardReactiveProps({ ...props, to: localizedTo.value })), {
543
+ return resolved.value.kind === "external" ? (openBlock(), createElementBlock("a", mergeProps({ key: 0 }, unref(attrs), {
544
+ href: resolved.value.href,
545
+ target: "_blank",
546
+ rel: "noopener noreferrer"
547
+ }), [
548
+ renderSlot(_ctx.$slots, "default")
549
+ ], 16, _hoisted_1)) : resolved.value.kind === "special" ? (openBlock(), createElementBlock("a", mergeProps({ key: 1 }, unref(attrs), {
550
+ href: resolved.value.href
551
+ }), [
552
+ renderSlot(_ctx.$slots, "default")
553
+ ], 16, _hoisted_2)) : (openBlock(), createBlock(unref(RouterLink), normalizeProps(mergeProps({ key: 2 }, { ...props, ...unref(attrs), to: resolved.value.to })), {
446
554
  default: withCtx(() => [
447
555
  renderSlot(_ctx.$slots, "default")
448
556
  ]),
449
557
  _: 3
450
- }, 16);
558
+ }, 16));
451
559
  };
452
560
  }
453
561
  });
@@ -481,6 +589,9 @@ function createPathStrategy(options) {
481
589
  toPath(slug, locale2) {
482
590
  const loc = locale2 || _currentLocale;
483
591
  let s = slug || "/";
592
+ if (s && !s.startsWith("/") && !/^(https?:|mailto:|tel:|sms:|whatsapp:|geo:|#|\/\/)/i.test(s)) {
593
+ s = `/${s}`;
594
+ }
484
595
  const segments = s.replace(/^\//, "").split("/").filter(Boolean);
485
596
  if (segments[0] && supportedLocales.includes(segments[0])) {
486
597
  const rest = segments.slice(1).join("/");
@@ -590,6 +701,7 @@ class BloxInstance {
590
701
  fields: meta.schema,
591
702
  defaults: meta.defaults,
592
703
  dataSource: meta.dataSource,
704
+ category: meta.category,
593
705
  thumbnail: meta.thumbnail,
594
706
  order: meta.order
595
707
  }
@@ -617,6 +729,7 @@ class BloxInstance {
617
729
  fields: meta.schema,
618
730
  defaults: meta.defaults,
619
731
  dataSource: meta.dataSource,
732
+ category: meta.category,
620
733
  thumbnail: meta.thumbnail,
621
734
  order: meta.order
622
735
  }
@@ -643,7 +756,7 @@ class BloxInstance {
643
756
  }
644
757
  router.addRoute({
645
758
  path: "/_blox_preview",
646
- component: () => import("./PreviewApp-CwB2kJi3.js"),
759
+ component: () => import("./PreviewApp-CsC6qej1.js"),
647
760
  beforeEnter: () => window.parent !== window ? true : "/"
648
761
  });
649
762
  router.addRoute({ path: "/:pathMatch(.*)*", component: _sfc_main$1 });
@@ -706,12 +819,19 @@ export {
706
819
  BloxInstance as f,
707
820
  globalRefOf as g,
708
821
  _sfc_main$1 as h,
709
- GLOBAL_REF_KEY as i,
710
- configureApi as j,
711
- getWebsiteId as k,
712
- getWebsiteIdSync as l,
713
- listItems as m,
714
- useBloxEdit as n,
715
- resolvePath as r,
716
- useLocale as u
822
+ installSmartLinks as i,
823
+ GLOBAL_REF_KEY as j,
824
+ classifyLink as k,
825
+ configureApi as l,
826
+ getWebsiteId as m,
827
+ normalizeLink as n,
828
+ getWebsiteIdSync as o,
829
+ isAbsoluteExternal as p,
830
+ isSpecialScheme as q,
831
+ listItems as r,
832
+ normalizeTo as s,
833
+ resolvePath as t,
834
+ useLocale as u,
835
+ toInternalPath as v,
836
+ useBloxEdit as w
717
837
  };
@@ -116,7 +116,7 @@ function useBloxEdit(configOverride) {
116
116
  }
117
117
  return { config, enabled, showEdit, studioBaseUrl, editUrl, enable, dismiss, init };
118
118
  }
119
- const _hoisted_1$1 = {
119
+ const _hoisted_1$2 = {
120
120
  key: 0,
121
121
  class: "blox-admin-bar"
122
122
  };
@@ -139,7 +139,7 @@ const _sfc_main$2 = /* @__PURE__ */ vue.defineComponent({
139
139
  key: 0,
140
140
  to: "body"
141
141
  }, [
142
- vue.unref(showEdit) && __props.websiteId && __props.pageId ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$1, [
142
+ vue.unref(showEdit) && __props.websiteId && __props.pageId ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$2, [
143
143
  vue.createElementVNode("button", {
144
144
  type: "button",
145
145
  class: "blox-admin-btn",
@@ -284,11 +284,11 @@ const PageRenderer = vue.defineComponent({
284
284
  );
285
285
  }
286
286
  });
287
- const _hoisted_1 = {
287
+ const _hoisted_1$1 = {
288
288
  key: 0,
289
289
  class: "blox-loading flex column h-100vh justify-content-center"
290
290
  };
291
- const _hoisted_2 = {
291
+ const _hoisted_2$1 = {
292
292
  key: 1,
293
293
  class: "blox-not-found"
294
294
  };
@@ -400,9 +400,9 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
400
400
  return (_ctx, _cache) => {
401
401
  const _component_RouterLink = vue.resolveComponent("RouterLink");
402
402
  return vue.openBlock(), vue.createElementBlock("div", null, [
403
- initialLoading.value && blocks.value.length === 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
403
+ initialLoading.value && blocks.value.length === 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$1, [
404
404
  vue.createVNode(vue.unref(vue$1.Loading))
405
- ])) : notFound.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2, [
405
+ ])) : notFound.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$1, [
406
406
  _cache[0] || (_cache[0] = vue.createElementVNode("h2", null, "404", -1)),
407
407
  vue.createElementVNode("p", null, vue.toDisplayString(vue.unref(locale2) === "he" ? "הדף לא נמצא" : "Page not found"), 1),
408
408
  vue.createVNode(_component_RouterLink, { to: "/" }, {
@@ -424,7 +424,96 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
424
424
  };
425
425
  }
426
426
  });
427
+ function normalizeLink(href) {
428
+ const v = href == null ? void 0 : href.trim();
429
+ if (!v) return void 0;
430
+ if (/^(https?:|mailto:|tel:|sms:|whatsapp:|geo:|#|\/\/|\/|\.)/i.test(v)) return v;
431
+ return `/${v}`;
432
+ }
433
+ const normalizeTo = normalizeLink;
434
+ function isAbsoluteExternal(href) {
435
+ return /^(https?:)?\/\//i.test(href);
436
+ }
437
+ function isSpecialScheme(href) {
438
+ return /^(mailto:|tel:|sms:|whatsapp:|geo:|#)/i.test(href);
439
+ }
440
+ function classifyLink(href, origin = typeof window !== "undefined" ? window.location.origin : "") {
441
+ if (isSpecialScheme(href)) return "special";
442
+ if (isAbsoluteExternal(href)) {
443
+ if (origin) {
444
+ try {
445
+ if (new URL(href, origin).origin === origin) return "internal";
446
+ } catch {
447
+ }
448
+ }
449
+ return "external";
450
+ }
451
+ return "internal";
452
+ }
453
+ function toInternalPath(href) {
454
+ const normalized = normalizeLink(href) ?? href.trim();
455
+ if (isAbsoluteExternal(normalized)) {
456
+ try {
457
+ const base = typeof window !== "undefined" ? window.location.href : "http://localhost";
458
+ const url = new URL(normalized, base);
459
+ return `${url.pathname}${url.search}${url.hash}` || "/";
460
+ } catch {
461
+ return normalized;
462
+ }
463
+ }
464
+ return normalized || "/";
465
+ }
466
+ function shouldIgnore(e, anchor) {
467
+ if (e.defaultPrevented) return true;
468
+ if (e.button !== 0) return true;
469
+ if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return true;
470
+ if (anchor.hasAttribute("download")) return true;
471
+ const target = anchor.getAttribute("target");
472
+ if (target && target !== "_self") return true;
473
+ return false;
474
+ }
475
+ function installSmartLinks(router) {
476
+ if (typeof document === "undefined") return () => {
477
+ };
478
+ function onClick(e) {
479
+ var _a, _b, _c;
480
+ const path = ((_a = e.composedPath) == null ? void 0 : _a.call(e)) ?? [];
481
+ const anchor = path.find((el) => el instanceof HTMLAnchorElement) ?? ((_c = (_b = e.target) == null ? void 0 : _b.closest) == null ? void 0 : _c.call(_b, "a"));
482
+ if (!anchor) return;
483
+ const rawHref = anchor.getAttribute("href");
484
+ if (!rawHref) return;
485
+ const href = normalizeLink(rawHref) ?? rawHref.trim();
486
+ if (!href) return;
487
+ if (isSpecialScheme(href)) return;
488
+ if (isAbsoluteExternal(href)) {
489
+ let sameOrigin = false;
490
+ try {
491
+ sameOrigin = new URL(href, window.location.href).origin === window.location.origin;
492
+ } catch {
493
+ sameOrigin = false;
494
+ }
495
+ if (!sameOrigin) {
496
+ if (anchor.getAttribute("target")) return;
497
+ e.preventDefault();
498
+ window.open(href, "_blank", "noopener,noreferrer");
499
+ return;
500
+ }
501
+ if (shouldIgnore(e, anchor)) return;
502
+ e.preventDefault();
503
+ void router.push(toInternalPath(href));
504
+ return;
505
+ }
506
+ if (shouldIgnore(e, anchor)) return;
507
+ e.preventDefault();
508
+ void router.push(href.startsWith("/") ? href : `/${href}`);
509
+ }
510
+ document.addEventListener("click", onClick);
511
+ return () => document.removeEventListener("click", onClick);
512
+ }
513
+ const _hoisted_1 = ["href"];
514
+ const _hoisted_2 = ["href"];
427
515
  const _sfc_main = /* @__PURE__ */ vue.defineComponent({
516
+ ...{ inheritAttrs: false },
428
517
  __name: "LocaleRouterLink",
429
518
  props: {
430
519
  to: {},
@@ -435,20 +524,39 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
435
524
  },
436
525
  setup(__props) {
437
526
  const props = __props;
527
+ const attrs = vue.useAttrs();
438
528
  const strategy = vue.inject(BLOX_LOCALE_STRATEGY_KEY, null);
439
529
  const { locale: locale2 } = useLocale();
440
- const localizedTo = vue.computed(() => {
441
- if (!strategy || typeof props.to !== "string") return props.to;
530
+ const resolved = vue.computed(() => {
531
+ if (typeof props.to !== "string") {
532
+ return { kind: "route", to: props.to };
533
+ }
534
+ const href = normalizeLink(props.to) ?? props.to.trim();
535
+ const kind = classifyLink(href);
536
+ if (kind === "external") return { kind: "external", href };
537
+ if (kind === "special") return { kind: "special", href };
538
+ const path = toInternalPath(href);
442
539
  const loc = String(locale2.value || "").slice(0, 2).toLowerCase();
443
- return strategy.toPath(props.to, loc || void 0);
540
+ const to = strategy ? strategy.toPath(path, loc || void 0) : path;
541
+ return { kind: "route", to };
444
542
  });
445
543
  return (_ctx, _cache) => {
446
- return vue.openBlock(), vue.createBlock(vue.unref(vueRouter.RouterLink), vue.normalizeProps(vue.guardReactiveProps({ ...props, to: localizedTo.value })), {
544
+ return resolved.value.kind === "external" ? (vue.openBlock(), vue.createElementBlock("a", vue.mergeProps({ key: 0 }, vue.unref(attrs), {
545
+ href: resolved.value.href,
546
+ target: "_blank",
547
+ rel: "noopener noreferrer"
548
+ }), [
549
+ vue.renderSlot(_ctx.$slots, "default")
550
+ ], 16, _hoisted_1)) : resolved.value.kind === "special" ? (vue.openBlock(), vue.createElementBlock("a", vue.mergeProps({ key: 1 }, vue.unref(attrs), {
551
+ href: resolved.value.href
552
+ }), [
553
+ vue.renderSlot(_ctx.$slots, "default")
554
+ ], 16, _hoisted_2)) : (vue.openBlock(), vue.createBlock(vue.unref(vueRouter.RouterLink), vue.normalizeProps(vue.mergeProps({ key: 2 }, { ...props, ...vue.unref(attrs), to: resolved.value.to })), {
447
555
  default: vue.withCtx(() => [
448
556
  vue.renderSlot(_ctx.$slots, "default")
449
557
  ]),
450
558
  _: 3
451
- }, 16);
559
+ }, 16));
452
560
  };
453
561
  }
454
562
  });
@@ -482,6 +590,9 @@ function createPathStrategy(options) {
482
590
  toPath(slug, locale2) {
483
591
  const loc = locale2 || _currentLocale;
484
592
  let s = slug || "/";
593
+ if (s && !s.startsWith("/") && !/^(https?:|mailto:|tel:|sms:|whatsapp:|geo:|#|\/\/)/i.test(s)) {
594
+ s = `/${s}`;
595
+ }
485
596
  const segments = s.replace(/^\//, "").split("/").filter(Boolean);
486
597
  if (segments[0] && supportedLocales.includes(segments[0])) {
487
598
  const rest = segments.slice(1).join("/");
@@ -591,6 +702,7 @@ class BloxInstance {
591
702
  fields: meta.schema,
592
703
  defaults: meta.defaults,
593
704
  dataSource: meta.dataSource,
705
+ category: meta.category,
594
706
  thumbnail: meta.thumbnail,
595
707
  order: meta.order
596
708
  }
@@ -618,6 +730,7 @@ class BloxInstance {
618
730
  fields: meta.schema,
619
731
  defaults: meta.defaults,
620
732
  dataSource: meta.dataSource,
733
+ category: meta.category,
621
734
  thumbnail: meta.thumbnail,
622
735
  order: meta.order
623
736
  }
@@ -644,7 +757,7 @@ class BloxInstance {
644
757
  }
645
758
  router.addRoute({
646
759
  path: "/_blox_preview",
647
- component: () => Promise.resolve().then(() => require("./PreviewApp-DqRHk5sz.cjs")),
760
+ component: () => Promise.resolve().then(() => require("./PreviewApp-Dz003khp.cjs")),
648
761
  beforeEnter: () => window.parent !== window ? true : "/"
649
762
  });
650
763
  router.addRoute({ path: "/:pathMatch(.*)*", component: _sfc_main$1 });
@@ -705,12 +818,19 @@ exports.GlobalBlockHost = GlobalBlockHost;
705
818
  exports.PageRenderer = PageRenderer;
706
819
  exports._sfc_main = _sfc_main$2;
707
820
  exports._sfc_main$1 = _sfc_main$1;
821
+ exports.classifyLink = classifyLink;
708
822
  exports.configureApi = configureApi;
709
823
  exports.createBlox = createBlox;
710
824
  exports.getWebsiteId = getWebsiteId;
711
825
  exports.getWebsiteIdSync = getWebsiteIdSync;
712
826
  exports.globalRefOf = globalRefOf;
827
+ exports.installSmartLinks = installSmartLinks;
828
+ exports.isAbsoluteExternal = isAbsoluteExternal;
829
+ exports.isSpecialScheme = isSpecialScheme;
713
830
  exports.listItems = listItems;
831
+ exports.normalizeLink = normalizeLink;
832
+ exports.normalizeTo = normalizeTo;
714
833
  exports.resolvePath = resolvePath;
834
+ exports.toInternalPath = toInternalPath;
715
835
  exports.useBloxEdit = useBloxEdit;
716
836
  exports.useLocale = useLocale;
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAa,MAAM,KAAK,CAAA;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3D,OAAO,KAAK,EAAkB,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAc,MAAM,WAAW,CAAA;AAmB5D,4GAA4G;AAC5G,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,cAAc,CAAA;AAE5D,MAAM,WAAW,WAAY,SAAQ,eAAe;IACnD,qIAAqI;IACrI,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAC1C;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACrD,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,gFAAgF;IAChF,SAAS,CAAC,EAAE,eAAe,CAAA;CAC3B;AAED,qBAAa,YAAY;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsC;IAChE,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,UAAU,CAAC,CAAiB;gBAExB,OAAO,CAAC,EAAE,WAAW;IASjC,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,IAAI;IA8B3E,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,IAAI;IA2BnE,+EAA+E;IAC/E,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;IAI9C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAyBpC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI;CAqC9C;AAMD,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,YAAY,CAS9D"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAa,MAAM,KAAK,CAAA;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3D,OAAO,KAAK,EAAkB,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAc,MAAM,WAAW,CAAA;AAmB5D,4GAA4G;AAC5G,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,cAAc,CAAA;AAE5D,MAAM,WAAW,WAAY,SAAQ,eAAe;IACnD,qIAAqI;IACrI,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAC1C;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACrD,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,gFAAgF;IAChF,SAAS,CAAC,EAAE,eAAe,CAAA;CAC3B;AAED,qBAAa,YAAY;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsC;IAChE,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,UAAU,CAAC,CAAiB;gBAExB,OAAO,CAAC,EAAE,WAAW;IASjC,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,IAAI;IA+B3E,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,IAAI;IA4BnE,+EAA+E;IAC/E,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;IAI9C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAyBpC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI;CAqC9C;AAMD,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,YAAY,CAS9D"}
@@ -1 +1 @@
1
- {"version":3,"file":"createBloxApp.d.ts","sourceRoot":"","sources":["../src/createBloxApp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,KAAK,CAAA;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,QAAQ,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAOhD,MAAM,WAAW,oBAAoB;IACpC,oCAAoC;IACpC,aAAa,EAAE,SAAS,CAAA;IACxB,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd;;;;;OAKG;IACH,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACpD,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAA;IACnB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACxB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK;QAAE,KAAK,CAAC,EAAE,SAAS,CAAA;KAAE,CAAA;IAChE;;;OAGG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAA;IAChD;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC5C;;;OAGG;IACH,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAA;IAC1B;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAA;CACrC;AAED,6CAA6C;AAC7C,MAAM,WAAW,gBAAgB;IAChC,gGAAgG;IAChG,MAAM,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAA;CAChB;AAID;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAoBvE;AAED,wDAAwD;AACxD,UAAU,SAAS;IAClB,YAAY,EAAE;QACb,OAAO,EAAE;YAER,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,GAAG,KAAK,IAAI,CAAA;SACvC,CAAA;KACD,CAAA;CACD;AAED,MAAM,WAAW,aAAa;IAC7B,GAAG,EAAE,GAAG,CAAA;IACR,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,YAAY,CAAA;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAkF1E"}
1
+ {"version":3,"file":"createBloxApp.d.ts","sourceRoot":"","sources":["../src/createBloxApp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,KAAK,CAAA;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,QAAQ,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAQhD,MAAM,WAAW,oBAAoB;IACpC,oCAAoC;IACpC,aAAa,EAAE,SAAS,CAAA;IACxB,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd;;;;;OAKG;IACH,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACpD,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAA;IACnB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACxB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK;QAAE,KAAK,CAAC,EAAE,SAAS,CAAA;KAAE,CAAA;IAChE;;;OAGG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAA;IAChD;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC5C;;;OAGG;IACH,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAA;IAC1B;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAA;CACrC;AAED,6CAA6C;AAC7C,MAAM,WAAW,gBAAgB;IAChC,gGAAgG;IAChG,MAAM,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAA;CAChB;AAID;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAoBvE;AAED,wDAAwD;AACxD,UAAU,SAAS;IAClB,YAAY,EAAE;QACb,OAAO,EAAE;YAER,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,GAAG,KAAK,IAAI,CAAA;SACvC,CAAA;KACD,CAAA;CACD;AAED,MAAM,WAAW,aAAa;IAC7B,GAAG,EAAE,GAAG,CAAA;IACR,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,YAAY,CAAA;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAmF1E"}
@@ -1,4 +1,18 @@
1
1
  import { SchemaDefinition } from '@bagelink/vue';
2
+ /** Datastore collection this block reads from (shown as a deep-link in the designer). */
3
+ export interface BlockDataSource {
4
+ /** Datastore collection name (e.g. `'why-sell'`). */
5
+ collection: string;
6
+ /** Datastore store id. When omitted, the admin default store is used. */
7
+ store?: string;
8
+ /** Label in the designer (defaults to `collection`). */
9
+ label?: string;
10
+ }
11
+ /**
12
+ * `true` — show a "data" badge with no deep-link.
13
+ * One ref / list of refs — badge + clickable link(s) to the collection editor.
14
+ */
15
+ export type BlockDataSourceConfig = boolean | BlockDataSource | BlockDataSource[];
2
16
  export interface BlockMeta {
3
17
  /** Block type key — must be unique across the app. Used as the export name by the Vite plugin. */
4
18
  name: string;
@@ -11,8 +25,17 @@ export interface BlockMeta {
11
25
  /** Default prop values. Merged with block props at render time so blocks show content before editing. */
12
26
  defaults?: Record<string, unknown>;
13
27
  description?: string;
14
- /** Set to true when this block fetches its own data from a datastore collection. Used by the editor to show a hint when both schema fields and data source are present. */
15
- dataSource?: boolean;
28
+ /**
29
+ * When set, the page designer shows that this block also pulls content from
30
+ * a datastore collection — and links to that collection when refs are provided.
31
+ */
32
+ dataSource?: BlockDataSourceConfig;
33
+ /**
34
+ * Group key for the editor block picker (e.g. `'hero'`, `'content'`, `'layout'`).
35
+ * The admin UI translates known keys via `pageDesigner.blockCategories.<key>`;
36
+ * unknown keys are shown as-is. Blocks without a category land in `"other"`.
37
+ */
38
+ category?: string;
16
39
  /** Static thumbnail image URL for the editor block picker. Overrides the default icon. */
17
40
  thumbnail?: string;
18
41
  /** Sort order in the editor block picker. Lower values appear first. Defaults to 100. */
@@ -1 +1 @@
1
- {"version":3,"file":"defineBlock.d.ts","sourceRoot":"","sources":["../src/defineBlock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAErD,MAAM,WAAW,SAAS;IACzB,kGAAkG;IAClG,IAAI,EAAE,MAAM,CAAA;IACZ,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAA;IACb,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,sFAAsF;IACtF,MAAM,CAAC,EAAE,gBAAgB,CAAA;IACzB,yGAAyG;IACzG,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,2KAA2K;IAC3K,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,yFAAyF;IACzF,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED,kGAAkG;AAClG,MAAM,WAAW,WAAW;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;CACjC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAmBtD"}
1
+ {"version":3,"file":"defineBlock.d.ts","sourceRoot":"","sources":["../src/defineBlock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAErD,yFAAyF;AACzF,MAAM,WAAW,eAAe;IAC/B,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAA;IAClB,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,eAAe,GAAG,eAAe,EAAE,CAAA;AAEjF,MAAM,WAAW,SAAS;IACzB,kGAAkG;IAClG,IAAI,EAAE,MAAM,CAAA;IACZ,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAA;IACb,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,sFAAsF;IACtF,MAAM,CAAC,EAAE,gBAAgB,CAAA;IACzB,yGAAyG;IACzG,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,qBAAqB,CAAA;IAClC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,yFAAyF;IACzF,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED,kGAAkG;AAClG,MAAM,WAAW,WAAW;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;CACjC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAmBtD"}
package/dist/index.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const core = require("./core-jis2RkPA.cjs");
4
- const PreviewApp_vue_vue_type_style_index_0_lang = require("./PreviewApp.vue_vue_type_style_index_0_lang-B1SNJnOd.cjs");
3
+ const core = require("./core-fPjj9xyJ.cjs");
4
+ const PreviewApp_vue_vue_type_style_index_0_lang = require("./PreviewApp.vue_vue_type_style_index_0_lang-BNKK7Vhs.cjs");
5
5
  const vue = require("vue");
6
6
  const vueRouter = require("vue-router");
7
7
  const pinia = require("pinia");
@@ -51,9 +51,10 @@ function useLocaleNav() {
51
51
  strategy.switchTo(targetLocale, alternateSlug, router);
52
52
  }
53
53
  function toPath(slug) {
54
- if (!strategy) return slug;
54
+ const normalized = core.normalizeLink(slug) ?? slug;
55
+ if (!strategy) return normalized;
55
56
  const loc = String(locale.value || "").slice(0, 2).toLowerCase();
56
- return strategy.toPath(slug, loc || void 0);
57
+ return strategy.toPath(normalized, loc || void 0);
57
58
  }
58
59
  return { switchLocale, toPath, locale };
59
60
  }
@@ -138,6 +139,7 @@ function createBloxApp(options) {
138
139
  }
139
140
  if (userSetup) userSetup(app);
140
141
  router.isReady().then(() => {
142
+ core.installSmartLinks(router);
141
143
  app.mount(mountTarget);
142
144
  });
143
145
  return { app, router, blox };
@@ -180,7 +182,8 @@ function definitionToEntry(type, def) {
180
182
  label: schema.label,
181
183
  icon: schema.icon,
182
184
  description: schema.description,
183
- dataSource: schema.dataSource,
185
+ dataSource: !!schema.dataSource,
186
+ category: schema.category,
184
187
  order: schema.order,
185
188
  propsSchema,
186
189
  defaults: schema.defaults
@@ -203,13 +206,20 @@ exports.CmsPageView = core._sfc_main$1;
203
206
  exports.GLOBAL_REF_KEY = core.GLOBAL_REF_KEY;
204
207
  exports.GlobalBlockHost = core.GlobalBlockHost;
205
208
  exports.PageRenderer = core.PageRenderer;
209
+ exports.classifyLink = core.classifyLink;
206
210
  exports.configureApi = core.configureApi;
207
211
  exports.createBlox = core.createBlox;
208
212
  exports.getWebsiteId = core.getWebsiteId;
209
213
  exports.getWebsiteIdSync = core.getWebsiteIdSync;
210
214
  exports.globalRefOf = core.globalRefOf;
215
+ exports.installSmartLinks = core.installSmartLinks;
216
+ exports.isAbsoluteExternal = core.isAbsoluteExternal;
217
+ exports.isSpecialScheme = core.isSpecialScheme;
211
218
  exports.listItems = core.listItems;
219
+ exports.normalizeLink = core.normalizeLink;
220
+ exports.normalizeTo = core.normalizeTo;
212
221
  exports.resolvePath = core.resolvePath;
222
+ exports.toInternalPath = core.toInternalPath;
213
223
  exports.useBloxEdit = core.useBloxEdit;
214
224
  exports.useLocale = core.useLocale;
215
225
  exports.PreviewApp = PreviewApp_vue_vue_type_style_index_0_lang._sfc_main;
package/dist/index.d.ts CHANGED
@@ -12,12 +12,14 @@ export { useLocale } from './composables/useLocale';
12
12
  export type { Locale } from './composables/useLocale';
13
13
  export { useLocaleNav } from './composables/useLocaleNav';
14
14
  export { usePageContext } from './composables/usePageContext';
15
+ export { classifyLink, installSmartLinks, isAbsoluteExternal, isSpecialScheme, normalizeLink, normalizeTo, toInternalPath, } from './smartLinks';
16
+ export type { LinkKind } from './smartLinks';
15
17
  export { BloxInstance, createBlox } from './core';
16
18
  export type { BloxComponent, BloxOptions } from './core';
17
19
  export { createBloxApp, injectPlausible } from './createBloxApp';
18
20
  export type { BloxAppResult, CreateBloxAppOptions, PlausibleOptions } from './createBloxApp';
19
21
  export { defineBlock } from './defineBlock';
20
- export type { BlockMeta, BlockModule } from './defineBlock';
22
+ export type { BlockMeta, BlockModule, BlockDataSource, BlockDataSourceConfig } from './defineBlock';
21
23
  export type { LocaleStrategy } from './localeStrategy';
22
24
  export { default as PageRenderer } from './PageRenderer';
23
25
  export { default as PreviewApp } from './PreviewApp.vue';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAClG,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAKnD,YAAY,EACX,cAAc,EACd,KAAK,EAEL,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,cAAc,EACd,QAAQ,EACR,eAAe,EACf,cAAc,EACd,WAAW,GACX,MAAM,aAAa,CAAA;AAIpB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACtD,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAI9E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAK1D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAKjD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAC3F,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,YAAY,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAK7D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACjD,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAKxD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAChE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAK5F,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3D,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEtD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAA;AACxD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAK9D,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACjE,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAKlE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAI5E,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAA;AAEtH,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAEjF,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAClG,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAKnD,YAAY,EACX,cAAc,EACd,KAAK,EAEL,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,cAAc,EACd,QAAQ,EACR,eAAe,EACf,cAAc,EACd,WAAW,GACX,MAAM,aAAa,CAAA;AAIpB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACtD,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAI9E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAK1D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAKjD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAC3F,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,YAAY,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAK7D,OAAO,EACN,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,WAAW,EACX,cAAc,GACd,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAK5C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACjD,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAKxD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAChE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAK5F,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAEnG,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEtD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAA;AACxD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAK9D,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACjE,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAKlE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAI5E,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAA;AAEtH,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAEjF,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAA"}
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
- import { a as BLOX_LOCALE_STRATEGY_KEY, u as useLocale, c as createBlox } from "./core-D8O506WZ.js";
2
- import { _, b, d, e, f, h, i, G, P, j, k, l, g, m, r, n } from "./core-D8O506WZ.js";
3
- import { _ as _2, P as P2, s, a } from "./PreviewApp.vue_vue_type_style_index_0_lang-BVTlfTLk.js";
1
+ import { a as BLOX_LOCALE_STRATEGY_KEY, u as useLocale, n as normalizeLink, c as createBlox, i as installSmartLinks } from "./core-CbOrSpOU.js";
2
+ import { _, b, d, e, f, h, j, G, P, k, l, m, o, g, p, q, r, s, t, v, w } from "./core-CbOrSpOU.js";
3
+ import { _ as _2, P as P2, s as s2, a } from "./PreviewApp.vue_vue_type_style_index_0_lang-C1SwhjdY.js";
4
4
  import { ref, onMounted, onUnmounted, inject, computed, createApp, markRaw } from "vue";
5
5
  import { useRouter } from "vue-router";
6
6
  import { createPinia } from "pinia";
@@ -50,9 +50,10 @@ function useLocaleNav() {
50
50
  strategy.switchTo(targetLocale, alternateSlug, router);
51
51
  }
52
52
  function toPath(slug) {
53
- if (!strategy) return slug;
53
+ const normalized = normalizeLink(slug) ?? slug;
54
+ if (!strategy) return normalized;
54
55
  const loc = String(locale.value || "").slice(0, 2).toLowerCase();
55
- return strategy.toPath(slug, loc || void 0);
56
+ return strategy.toPath(normalized, loc || void 0);
56
57
  }
57
58
  return { switchLocale, toPath, locale };
58
59
  }
@@ -118,16 +119,16 @@ function createBloxApp(options) {
118
119
  };
119
120
  const blox = createBlox(bloxOpts);
120
121
  const pinia = createPinia();
121
- pinia.use(({ store: s2 }) => {
122
- s2.router = markRaw(router);
122
+ pinia.use(({ store: s3 }) => {
123
+ s3.router = markRaw(router);
123
124
  });
124
125
  blox.install(app, {});
125
126
  app.use(pinia);
126
127
  app.use(router);
127
128
  for (const plugin of plugins) {
128
129
  if (Array.isArray(plugin)) {
129
- const [p, ...args] = plugin;
130
- app.use(p, ...args);
130
+ const [p2, ...args] = plugin;
131
+ app.use(p2, ...args);
131
132
  } else {
132
133
  app.use(plugin);
133
134
  }
@@ -137,6 +138,7 @@ function createBloxApp(options) {
137
138
  }
138
139
  if (userSetup) userSetup(app);
139
140
  router.isReady().then(() => {
141
+ installSmartLinks(router);
140
142
  app.mount(mountTarget);
141
143
  });
142
144
  return { app, router, blox };
@@ -179,7 +181,8 @@ function definitionToEntry(type, def) {
179
181
  label: schema.label,
180
182
  icon: schema.icon,
181
183
  description: schema.description,
182
- dataSource: schema.dataSource,
184
+ dataSource: !!schema.dataSource,
185
+ category: schema.category,
183
186
  order: schema.order,
184
187
  propsSchema,
185
188
  defaults: schema.defaults
@@ -200,26 +203,33 @@ export {
200
203
  BLOX_LOCALE_STRATEGY_KEY,
201
204
  f as BloxInstance,
202
205
  h as CmsPageView,
203
- i as GLOBAL_REF_KEY,
206
+ j as GLOBAL_REF_KEY,
204
207
  G as GlobalBlockHost,
205
208
  P as PageRenderer,
206
209
  _2 as PreviewApp,
207
210
  P2 as PreviewRenderer,
208
211
  buildBloxManifest,
209
- j as configureApi,
212
+ k as classifyLink,
213
+ l as configureApi,
210
214
  createBlox,
211
215
  createBloxApp,
212
216
  defineBlock,
213
- k as getWebsiteId,
214
- l as getWebsiteIdSync,
217
+ m as getWebsiteId,
218
+ o as getWebsiteIdSync,
215
219
  g as globalRefOf,
216
220
  injectPlausible,
217
- m as listItems,
218
- r as resolvePath,
219
- s as sendToEditor,
221
+ installSmartLinks,
222
+ p as isAbsoluteExternal,
223
+ q as isSpecialScheme,
224
+ r as listItems,
225
+ normalizeLink,
226
+ s as normalizeTo,
227
+ t as resolvePath,
228
+ s2 as sendToEditor,
220
229
  a as sendToPreview,
221
230
  serializeRegistry,
222
- n as useBloxEdit,
231
+ v as toInternalPath,
232
+ w as useBloxEdit,
223
233
  useGlobalBlock,
224
234
  useLocale,
225
235
  useLocaleNav,
@@ -1 +1 @@
1
- {"version":3,"file":"localeStrategy.d.ts","sourceRoot":"","sources":["../src/localeStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAExC,MAAM,WAAW,cAAc;IAC9B,gEAAgE;IAChE,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5E;;;;;OAKG;IACH,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IACjD;;;OAGG;IACH,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IAChE,yBAAyB;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAA;IAC1B,wEAAwE;IACxE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,gDAAgD;IAChD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAC9B;AAMD,MAAM,WAAW,mBAAmB;IACnC,aAAa,EAAE,MAAM,CAAA;IACrB,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAC1B;AAgED,MAAM,WAAW,qBAAqB;IACrC,+EAA+E;IAC/E,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACrC;AAgDD,MAAM,WAAW,eAAe;IAC/B,cAAc,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;IAClC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACtC;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CAQ7E"}
1
+ {"version":3,"file":"localeStrategy.d.ts","sourceRoot":"","sources":["../src/localeStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAExC,MAAM,WAAW,cAAc;IAC9B,gEAAgE;IAChE,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5E;;;;;OAKG;IACH,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IACjD;;;OAGG;IACH,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IAChE,yBAAyB;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAA;IAC1B,wEAAwE;IACxE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,gDAAgD;IAChD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAC9B;AAMD,MAAM,WAAW,mBAAmB;IACnC,aAAa,EAAE,MAAM,CAAA;IACrB,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAC1B;AAoED,MAAM,WAAW,qBAAqB;IACrC,+EAA+E;IAC/E,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACrC;AAgDD,MAAM,WAAW,eAAe;IAC/B,cAAc,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;IAClC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACtC;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CAQ7E"}
@@ -19,6 +19,8 @@ export interface BlockManifestEntry {
19
19
  description?: string;
20
20
  /** True when the block fetches its own data from a datastore collection. */
21
21
  dataSource?: boolean;
22
+ /** Group key for the editor block picker. */
23
+ category?: string;
22
24
  /** Sort order in the editor block picker (lower first). */
23
25
  order?: number;
24
26
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE/C;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IAClC,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAA;IACZ,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAA;IACb,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IAC3C,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,YAAY;IAC5B,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAA;IACf,6DAA6D;IAC7D,MAAM,EAAE,kBAAkB,EAAE,CAAA;CAC5B;AAkCD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAChC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GACvC,YAAY,CAKd;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,CAElE"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE/C;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IAClC,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAA;IACZ,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAA;IACb,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IAC3C,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,YAAY;IAC5B,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAA;IACf,6DAA6D;IAC7D,MAAM,EAAE,kBAAkB,EAAE,CAAA;CAC5B;AAmCD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAChC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GACvC,YAAY,CAKd;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,CAElE"}
package/dist/schema.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { SchemaDefinition } from '@bagelink/vue';
2
2
  import { Component } from 'vue';
3
- import { BlockMeta } from './defineBlock';
3
+ import { BlockDataSourceConfig, BlockMeta } from './defineBlock';
4
4
  export interface BlockSchema {
5
5
  /** Human-readable name shown in the editor. */
6
6
  label: string;
@@ -14,8 +14,10 @@ export interface BlockSchema {
14
14
  fields?: SchemaDefinition;
15
15
  /** Default prop values. Merged with block props at render time. */
16
16
  defaults?: Record<string, unknown>;
17
- /** True when this block fetches its own data from a datastore collection. */
18
- dataSource?: boolean;
17
+ /** Datastore linkage see {@link BlockDataSourceConfig}. */
18
+ dataSource?: BlockDataSourceConfig;
19
+ /** Group key for the editor block picker. See {@link BlockMeta.category}. */
20
+ category?: string;
19
21
  /** Static thumbnail image URL for the editor block picker. Overrides the default icon. */
20
22
  thumbnail?: string;
21
23
  /** Sort order in the editor block picker. Lower values appear first. Defaults to 100. */
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAE9C,MAAM,WAAW,WAAW;IAC3B,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;OAGG;IACH,MAAM,CAAC,EAAE,gBAAgB,CAAA;IACzB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,6EAA6E;IAC7E,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,yFAAyF;IACzF,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,eAAe;IAC/B,SAAS,EAAE,SAAS,CAAA;IACpB,MAAM,EAAE,WAAW,CAAA;CACnB;AAED,+EAA+E;AAC/E,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAAA"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AACpC,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAErE,MAAM,WAAW,WAAW;IAC3B,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;OAGG;IACH,MAAM,CAAC,EAAE,gBAAgB,CAAA;IACzB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,6DAA6D;IAC7D,UAAU,CAAC,EAAE,qBAAqB,CAAA;IAClC,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,yFAAyF;IACzF,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,eAAe;IAC/B,SAAS,EAAE,SAAS,CAAA;IACpB,MAAM,EAAE,WAAW,CAAA;CACnB;AAED,+EAA+E;AAC/E,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAAA"}
@@ -0,0 +1,31 @@
1
+ import { Router } from 'vue-router';
2
+ /**
3
+ * Normalise a link so editors can omit the leading slash on internal paths:
4
+ * `about` → `/about`. Leaves empty values and anything already absolute /
5
+ * special (http, mailto, tel, #, //, /…) untouched.
6
+ */
7
+ export declare function normalizeLink(href?: string | null): string | undefined;
8
+ /** @deprecated use normalizeLink — kept as alias for existing call sites */
9
+ export declare const normalizeTo: typeof normalizeLink;
10
+ /** Absolute http(s) or protocol-relative (`//example.com`) URL. */
11
+ export declare function isAbsoluteExternal(href: string): boolean;
12
+ /** Browser-handled schemes / in-page anchors. */
13
+ export declare function isSpecialScheme(href: string): boolean;
14
+ export type LinkKind = 'external' | 'special' | 'internal';
15
+ /**
16
+ * Classify a (preferably already-normalised) href.
17
+ * Same-origin absolute URLs count as internal.
18
+ */
19
+ export declare function classifyLink(href: string, origin?: string): LinkKind;
20
+ /**
21
+ * Resolve an internal href to a path (+ search + hash) suitable for the router.
22
+ * Same-origin absolute URLs are reduced to path/search/hash.
23
+ */
24
+ export declare function toInternalPath(href: string): string;
25
+ /**
26
+ * Document-level click delegation so raw `<a href>` (and Btn `:href`) get the
27
+ * same internal/external behaviour without per-block wiring.
28
+ * Returns an uninstall function.
29
+ */
30
+ export declare function installSmartLinks(router: Router): () => void;
31
+ //# sourceMappingURL=smartLinks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smartLinks.d.ts","sourceRoot":"","sources":["../src/smartLinks.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAExC;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAKtE;AAED,4EAA4E;AAC5E,eAAO,MAAM,WAAW,sBAAgB,CAAA;AAExC,mEAAmE;AACnE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,iDAAiD;AACjD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAA;AAE1D;;;GAGG;AACH,wBAAgB,YAAY,CAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,SAA8D,GAClE,QAAQ,CAWV;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYnD;AAYD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,CA0C5D"}
@@ -26,7 +26,7 @@ const prerender = require("../prerender-BLECK5o5.cjs");
26
26
  const ssg_client = require("./client.cjs");
27
27
  const pinia = require("pinia");
28
28
  const vue = require("vue");
29
- const core = require("../core-jis2RkPA.cjs");
29
+ const core = require("../core-fPjj9xyJ.cjs");
30
30
  async function renderBloxSsgPage(options) {
31
31
  const {
32
32
  url,
@@ -4,7 +4,7 @@ import { BLOX_STATE_WINDOW_KEY, BLOX_COLLECTIONS_WINDOW_KEY, BLOX_WEBSITE_ID_WIN
4
4
  import { getCollectionCache, getEmbeddedWebsiteId, installBloxStateCache, installCollectionCache } from "./client.mjs";
5
5
  import { createPinia } from "pinia";
6
6
  import { createSSRApp, markRaw } from "vue";
7
- import { c as createBlox } from "../core-D8O506WZ.js";
7
+ import { c as createBlox } from "../core-CbOrSpOU.js";
8
8
  async function renderBloxSsgPage(options) {
9
9
  const {
10
10
  url,
@@ -266,10 +266,20 @@ function bloxPlugin(options = {}) {
266
266
  const identifiers = /* @__PURE__ */ new Set();
267
267
  const identRe = /\b([a-z_$][\w$]*)\b/gi;
268
268
  let identMatch;
269
- while ((identMatch = identRe.exec(callExpr)) !== null) {
270
- identifiers.add(identMatch[1]);
269
+ const strippedCall = callExpr.replace(/(['"`])(?:\\.|(?!\1).)*\1/g, '""').replace(/\b([a-z_$][\w$]*)\s*:/gi, ":");
270
+ const SKIP_IDENTS = /* @__PURE__ */ new Set([
271
+ "true",
272
+ "false",
273
+ "null",
274
+ "undefined",
275
+ "NaN",
276
+ "Infinity"
277
+ ]);
278
+ while ((identMatch = identRe.exec(strippedCall)) !== null) {
279
+ if (!SKIP_IDENTS.has(identMatch[1])) identifiers.add(identMatch[1]);
271
280
  }
272
281
  for (const ident of identifiers) {
282
+ if (ident === "defineBlock") continue;
273
283
  const declRe = new RegExp(`^([ \\t]*const\\s+${ident}\\s*=\\s*)`, "m");
274
284
  const declMatch = declRe.exec(remaining);
275
285
  if (!declMatch) continue;
@@ -1 +1 @@
1
- {"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,MAAM,CAAA;AAM9C,MAAM,WAAW,iBAAiB;IACjC;;;;;OAKG;IACH,GAAG,CAAC,EAAE,OAAO,CAAA;IACb;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB;;;;;;;;;;;;;OAaG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,MAAM,EAAE,CAwZpE"}
1
+ {"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,MAAM,CAAA;AAM9C,MAAM,WAAW,iBAAiB;IACjC;;;;;OAKG;IACH,GAAG,CAAC,EAAE,OAAO,CAAA;IACb;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB;;;;;;;;;;;;;OAaG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,MAAM,EAAE,CAqapE"}
@@ -242,10 +242,20 @@ function bloxPlugin(options = {}) {
242
242
  const identifiers = /* @__PURE__ */ new Set();
243
243
  const identRe = /\b([a-z_$][\w$]*)\b/gi;
244
244
  let identMatch;
245
- while ((identMatch = identRe.exec(callExpr)) !== null) {
246
- identifiers.add(identMatch[1]);
245
+ const strippedCall = callExpr.replace(/(['"`])(?:\\.|(?!\1).)*\1/g, '""').replace(/\b([a-z_$][\w$]*)\s*:/gi, ":");
246
+ const SKIP_IDENTS = /* @__PURE__ */ new Set([
247
+ "true",
248
+ "false",
249
+ "null",
250
+ "undefined",
251
+ "NaN",
252
+ "Infinity"
253
+ ]);
254
+ while ((identMatch = identRe.exec(strippedCall)) !== null) {
255
+ if (!SKIP_IDENTS.has(identMatch[1])) identifiers.add(identMatch[1]);
247
256
  }
248
257
  for (const ident of identifiers) {
258
+ if (ident === "defineBlock") continue;
249
259
  const declRe = new RegExp(`^([ \\t]*const\\s+${ident}\\s*=\\s*)`, "m");
250
260
  const declMatch = declRe.exec(remaining);
251
261
  if (!declMatch) continue;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bagelink/blox",
3
3
  "type": "module",
4
- "version": "1.15.170",
4
+ "version": "1.15.174",
5
5
  "description": "Blox page builder library for drag-and-drop page building and static data management",
6
6
  "author": {
7
7
  "name": "Bagel Studio",