@ohhwells/bridge 0.1.96 → 0.1.98

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/index.js CHANGED
@@ -418,6 +418,10 @@ function styleSheetCss() {
418
418
  `[data-ohw-style-spacing="${spacing}"] { padding-top: ${px}px !important; padding-bottom: ${px}px !important; }`
419
419
  );
420
420
  }
421
+ rules.push(
422
+ `[data-ohw-style-corners="sharp"] :is(.card, [data-ohw-card], img, picture, figure, [data-ohw-editable="bg-image"]) { border-radius: 0 !important; }`,
423
+ `[data-ohw-style-corners="sharp"] :has(> img) { border-radius: 0 !important; }`
424
+ );
421
425
  for (const align of ["left", "center", "right"]) {
422
426
  rules.push(`[data-ohw-style-align="${align}"] { text-align: ${align} !important; }`);
423
427
  }
@@ -448,6 +452,7 @@ var SECTION_ATTRS = {
448
452
  headlineScale: "data-ohw-style-headline",
449
453
  imageAspect: "data-ohw-style-aspect",
450
454
  spacing: "data-ohw-style-spacing",
455
+ cornerStyle: "data-ohw-style-corners",
451
456
  align: "data-ohw-style-align"
452
457
  };
453
458
  var NODE_WROTE_ATTR = "data-ohw-style-node";
@@ -521,9 +526,9 @@ function applyStylesToDom(store) {
521
526
  );
522
527
  if (!store) return;
523
528
  for (const [sectionId, override] of Object.entries(store.sections)) {
524
- const sections = document.querySelectorAll(
525
- `[data-ohw-section="${CSS.escape(sectionId)}"]`
526
- );
529
+ const escaped = CSS.escape(sectionId);
530
+ const byInstance = document.querySelectorAll(`[data-ohw-instance="${escaped}"]`);
531
+ const sections = byInstance.length ? byInstance : document.querySelectorAll(`[data-ohw-section="${escaped}"]`);
527
532
  for (const marker of Array.from(sections)) {
528
533
  const section = marker.querySelector(":scope > [data-ai-section]") ?? marker;
529
534
  for (const [prop, attr] of Object.entries(SECTION_ATTRS)) {
@@ -601,8 +606,9 @@ function parseSectionsFromRoot(root) {
601
606
  const seen = /* @__PURE__ */ new Set();
602
607
  const sections = [];
603
608
  for (const el of root.querySelectorAll("[data-ohw-section]")) {
604
- const id = el.getAttribute("data-ohw-section") ?? "";
605
- if (!id || seen.has(id) || LINK_PICKER_EXCLUDED_IDS.has(id)) continue;
609
+ const id = el.getAttribute("data-ohw-instance") || el.getAttribute("data-ohw-section") || "";
610
+ const type = el.getAttribute("data-ohw-section") ?? "";
611
+ if (!id || seen.has(id) || LINK_PICKER_EXCLUDED_IDS.has(type)) continue;
606
612
  if (el.parentElement?.closest("[data-ohw-section]")) continue;
607
613
  if (el.hasAttribute("data-ohw-ai-template-hidden") || el.hasAttribute("data-ohw-ai-removed") || el.hasAttribute("data-ohw-ai-replaced-by"))
608
614
  continue;
@@ -840,6 +846,284 @@ function initSectionInstancesFromContent(content, currentPath) {
840
846
  // src/ui/ai-tree/AiTreeRenderer.tsx
841
847
  import React from "react";
842
848
  import { ArrowLeft, ArrowRight, ChevronDown, icons as lucideIcons } from "lucide-react";
849
+
850
+ // src/lib/placeholder-imagery.ts
851
+ var U = (id) => `https://images.unsplash.com/photo-${id}?auto=format&fit=crop&w=1600&q=80`;
852
+ var GENERIC = [
853
+ U("1441986300917-64674bd600d8"),
854
+ U("1486406146926-c627a92ad1ab"),
855
+ U("1497032628192-86f99bcd76bc"),
856
+ U("1521737604893-d14cc237f11d"),
857
+ U("1522071820081-009f0129c71c"),
858
+ U("1519389950473-47ba0277781c"),
859
+ U("1460925895917-afdab827c52f"),
860
+ U("1504384308090-c894fdcc538d")
861
+ ];
862
+ var PEOPLE = [
863
+ U("1500648767791-00dcc994a43e"),
864
+ U("1494790108377-be9c29b29330"),
865
+ U("1507003211169-0a1dd7228f2d"),
866
+ U("1438761681033-6461ffad8d80"),
867
+ U("1544005313-94ddf0286df2"),
868
+ U("1472099645785-5658abf4ff4e"),
869
+ U("1519085360753-af0119f7cbe7"),
870
+ U("1534528741775-53994a69daeb")
871
+ ];
872
+ var THEMED = [
873
+ {
874
+ keywords: ["portrait", "headshot", "person", "people", "team", "staff", "avatar", "founder", "face"],
875
+ pool: PEOPLE
876
+ },
877
+ {
878
+ keywords: ["pet", "dog", "cat", "puppy", "kitten", "vet", "animal"],
879
+ pool: [
880
+ U("1548199973-03cce0bbc87b"),
881
+ U("1450778869180-41d0601e046e"),
882
+ U("1583511655857-d19b40a7a54e"),
883
+ U("1587300003388-59208cc962cb"),
884
+ U("1517849845537-4d257902454a"),
885
+ U("1601758228041-f3b2795255f1")
886
+ ]
887
+ },
888
+ {
889
+ keywords: [
890
+ "baker",
891
+ "bakery",
892
+ "cafe",
893
+ "coffee",
894
+ "latte",
895
+ "restaurant",
896
+ "pastr",
897
+ "bread",
898
+ "cake",
899
+ "cater",
900
+ "chef",
901
+ "kitchen",
902
+ "food",
903
+ "pizza",
904
+ "dessert",
905
+ "brunch",
906
+ "bistro",
907
+ "deli",
908
+ "dish",
909
+ "menu"
910
+ ],
911
+ pool: [
912
+ U("1509440159596-0249088772ff"),
913
+ U("1555507036-ab1f4038808a"),
914
+ U("1517433670267-08bbd4be890f"),
915
+ U("1486427944299-d1955d23e34d"),
916
+ U("1504754524776-8f4f37790ca0"),
917
+ U("1495474472287-4d71bcdd2085"),
918
+ U("1521017432531-fbd92d768814"),
919
+ U("1556909114-f6e7ad7d3136")
920
+ ]
921
+ },
922
+ {
923
+ keywords: [
924
+ "shop",
925
+ "store",
926
+ "boutique",
927
+ "retail",
928
+ "clothing",
929
+ "fashion",
930
+ "jewel",
931
+ "gift",
932
+ "florist",
933
+ "market",
934
+ "grocer",
935
+ "product",
936
+ "storefront"
937
+ ],
938
+ pool: [
939
+ U("1441984904996-e0b6ba687e04"),
940
+ U("1472851294608-062f824d29cc"),
941
+ U("1523381210434-271e8be1f52b"),
942
+ U("1534452203293-494d7ddbf7e0"),
943
+ U("1445205170230-053b83016050"),
944
+ U("1560243563-062bfc001d68")
945
+ ]
946
+ },
947
+ {
948
+ keywords: [
949
+ "yoga",
950
+ "pilates",
951
+ "fitness",
952
+ "gym",
953
+ "workout",
954
+ "trainer",
955
+ "wellness",
956
+ "meditat",
957
+ "massage",
958
+ "therap",
959
+ "physio",
960
+ "chiro",
961
+ "nutrition",
962
+ "spa",
963
+ "studio"
964
+ ],
965
+ pool: [
966
+ U("1544367567-0f2fcb009e0b"),
967
+ U("1506126613408-eca07ce68773"),
968
+ U("1545205597-3d9d02c29597"),
969
+ U("1552196563-55cd4e45efb3"),
970
+ U("1518611012118-696072aa579a"),
971
+ U("1571019613454-1cb2f99b2d8b"),
972
+ U("1540555700478-4be289fbecef"),
973
+ U("1519824145371-296894a0daa9")
974
+ ]
975
+ },
976
+ {
977
+ keywords: [
978
+ "salon",
979
+ "hairdress",
980
+ "haircut",
981
+ "barber",
982
+ "manicure",
983
+ "pedicure",
984
+ "nails",
985
+ "beauty",
986
+ "makeup",
987
+ "cosmetic",
988
+ "eyelash",
989
+ "eyebrow",
990
+ "skincare",
991
+ "esthetic",
992
+ "waxing",
993
+ "hair"
994
+ ],
995
+ pool: [
996
+ U("1560066984-138dadb4c035"),
997
+ U("1522337660859-02fbefca4702"),
998
+ U("1562322140-8baeececf3df"),
999
+ U("1521590832167-7bcbfaa6381f"),
1000
+ U("1487412947147-5cebf100ffc2"),
1001
+ U("1526045478516-99145907023c")
1002
+ ]
1003
+ },
1004
+ {
1005
+ keywords: [
1006
+ "cleaning",
1007
+ "plumb",
1008
+ "electric",
1009
+ "landscap",
1010
+ "contractor",
1011
+ "handyman",
1012
+ "renov",
1013
+ "hvac",
1014
+ "roofing",
1015
+ "painting",
1016
+ "carpentry",
1017
+ "flooring",
1018
+ "movers",
1019
+ "construction",
1020
+ "tools"
1021
+ ],
1022
+ pool: [
1023
+ U("1581578731548-c64695cc6952"),
1024
+ U("1504307651254-35680f356dfd"),
1025
+ U("1581092160562-40aa08e78837"),
1026
+ U("1621905251189-08b45d6a269e"),
1027
+ U("1558618666-fcd25c85cd64"),
1028
+ U("1585128792020-803d29415281")
1029
+ ]
1030
+ },
1031
+ {
1032
+ keywords: [
1033
+ "legal",
1034
+ "attorney",
1035
+ "lawyer",
1036
+ "account",
1037
+ "bookkeep",
1038
+ "consult",
1039
+ "coaching",
1040
+ "financ",
1041
+ "insurance",
1042
+ "realtor",
1043
+ "estate",
1044
+ "marketing",
1045
+ "agency",
1046
+ "office",
1047
+ "business",
1048
+ "desk"
1049
+ ],
1050
+ pool: [
1051
+ U("1497366216548-37526070297c"),
1052
+ U("1497366811353-6870744d04b2"),
1053
+ U("1454165804606-c3d57bc86b40"),
1054
+ U("1521791136064-7986c2920216"),
1055
+ U("1556761175-b413da4baf72"),
1056
+ U("1542744173-8e7e53415bb0")
1057
+ ]
1058
+ },
1059
+ {
1060
+ keywords: [
1061
+ "wedding",
1062
+ "event",
1063
+ "party",
1064
+ "celebrat",
1065
+ "venue",
1066
+ "community",
1067
+ "nonprofit",
1068
+ "charity",
1069
+ "workshop",
1070
+ "photograph",
1071
+ "concert"
1072
+ ],
1073
+ pool: [
1074
+ U("1511578314322-379afb476865"),
1075
+ U("1501281668745-f7f57925c3b4"),
1076
+ U("1523580494863-6f3031224c94"),
1077
+ U("1540575467063-178a50c2df87"),
1078
+ U("1505236858219-8359eb29e329"),
1079
+ U("1528605248644-14dd04022da1")
1080
+ ]
1081
+ }
1082
+ ];
1083
+ function poolForSubject(subject) {
1084
+ for (const theme of THEMED) {
1085
+ if (theme.keywords.some((k) => subject.includes(k))) {
1086
+ return theme.pool;
1087
+ }
1088
+ }
1089
+ return GENERIC;
1090
+ }
1091
+ function mixedHash(text) {
1092
+ let hash = 2166136261;
1093
+ for (let i = 0; i < text.length; i++) {
1094
+ hash ^= text.charCodeAt(i);
1095
+ hash = Math.imul(hash, 16777619);
1096
+ }
1097
+ return hash >>> 16 & 65535;
1098
+ }
1099
+ function resolvePlaceholderRef(ref) {
1100
+ const match = /^placeholder:([a-z0-9-]+)$/.exec(ref);
1101
+ if (!match) return null;
1102
+ const subject = match[1];
1103
+ const pool = poolForSubject(subject.replace(/-\d+$/, ""));
1104
+ return pool[mixedHash(ref) % pool.length];
1105
+ }
1106
+ function collectPlaceholderRefs(tree) {
1107
+ const seen = /* @__PURE__ */ new Set();
1108
+ for (const match of JSON.stringify(tree ?? null).matchAll(/"(placeholder:[a-z0-9-]+)"/gu)) {
1109
+ seen.add(match[1]);
1110
+ }
1111
+ return [...seen];
1112
+ }
1113
+ function buildPlaceholderMap(tree) {
1114
+ const map = {};
1115
+ const cursor = /* @__PURE__ */ new Map();
1116
+ for (const ref of collectPlaceholderRefs(tree)) {
1117
+ const subject = ref.slice("placeholder:".length).replace(/-\d+$/, "");
1118
+ const pool = poolForSubject(subject);
1119
+ const start = cursor.get(pool) ?? mixedHash(ref) % pool.length;
1120
+ map[ref] = pool[start % pool.length];
1121
+ cursor.set(pool, start + 1);
1122
+ }
1123
+ return map;
1124
+ }
1125
+
1126
+ // src/ui/ai-tree/AiTreeRenderer.tsx
843
1127
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
844
1128
  function lucideByName(name) {
845
1129
  const pascal = name.split("-").filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
@@ -853,6 +1137,7 @@ var typeStyle = (spec, font) => ({
853
1137
  fontWeight: spec.weight
854
1138
  });
855
1139
  var str = (value) => typeof value === "string" ? value : "";
1140
+ var cardRadius = (slots) => slots.cornerStyle === "sharp" ? 0 : AI_TREE_TOKENS.radiusCard;
856
1141
  var featureLines = (value) => value.split(/\n|<br\s*\/?>/i).map((line) => line.trim()).filter(Boolean);
857
1142
  var CHECK_MASK = `data:image/svg+xml,${encodeURIComponent(
858
1143
  '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>'
@@ -1198,10 +1483,11 @@ function PricingCard({ node, ctx, path }) {
1198
1483
  return /* @__PURE__ */ jsxs(
1199
1484
  "div",
1200
1485
  {
1486
+ "data-ohw-card": "",
1201
1487
  style: {
1202
1488
  background: hasBg ? ctx.brand.palette.light : "transparent",
1203
1489
  border: `1px solid ${dark}`,
1204
- borderRadius: AI_TREE_TOKENS.radiusCard,
1490
+ borderRadius: cardRadius(slots),
1205
1491
  padding: AI_TREE_TOKENS.paddingBlock,
1206
1492
  display: "flex",
1207
1493
  flexDirection: "column",
@@ -1306,10 +1592,11 @@ function TestimonialCard({ node, ctx, path }) {
1306
1592
  return /* @__PURE__ */ jsx(
1307
1593
  "div",
1308
1594
  {
1595
+ "data-ohw-card": "",
1309
1596
  "data-ai-avatar-pos": avatarPos ?? void 0,
1310
1597
  style: {
1311
1598
  background: hasBg ? ctx.cardSurface : "transparent",
1312
- borderRadius: hasBg ? AI_TREE_TOKENS.radiusCard : 0,
1599
+ borderRadius: hasBg ? cardRadius(slots) : 0,
1313
1600
  overflow: "hidden",
1314
1601
  outline: slots.featured === true ? `2px solid ${ctx.brand.palette.primary}` : void 0,
1315
1602
  minWidth: 0
@@ -1344,10 +1631,11 @@ function TeamCard({ node, ctx, path }) {
1344
1631
  return /* @__PURE__ */ jsxs(
1345
1632
  "div",
1346
1633
  {
1634
+ "data-ohw-card": "",
1347
1635
  "data-ai-avatar-pos": avatarPos ?? void 0,
1348
1636
  style: {
1349
1637
  background: hasBg ? ctx.cardSurface : "transparent",
1350
- borderRadius: hasBg ? AI_TREE_TOKENS.radiusCard : 0,
1638
+ borderRadius: hasBg ? cardRadius(slots) : 0,
1351
1639
  overflow: "hidden",
1352
1640
  outline: slots.featured === true ? `2px solid ${ctx.brand.palette.primary}` : void 0,
1353
1641
  minWidth: 0,
@@ -1518,9 +1806,10 @@ function CardBlock({ node, ctx, path }) {
1518
1806
  return /* @__PURE__ */ jsxs(
1519
1807
  "div",
1520
1808
  {
1809
+ "data-ohw-card": "",
1521
1810
  style: {
1522
1811
  background: hasBg ? ctx.cardSurface : "transparent",
1523
- borderRadius: hasBg ? AI_TREE_TOKENS.radiusCard : 0,
1812
+ borderRadius: hasBg ? cardRadius(slots) : 0,
1524
1813
  overflow: "hidden",
1525
1814
  outline: slots.featured === true ? `2px solid ${ctx.brand.palette.primary}` : void 0,
1526
1815
  display: horizontal ? "flex" : "block",
@@ -1548,7 +1837,7 @@ function CardBlock({ node, ctx, path }) {
1548
1837
  ) : /* @__PURE__ */ jsx(
1549
1838
  "div",
1550
1839
  {
1551
- style: /^(lucide|simple):/.test(mediaRef) ? { padding: `${AI_TREE_TOKENS.paddingBlock}px ${AI_TREE_TOKENS.paddingBlock}px 0` } : hasBg ? void 0 : { borderRadius: AI_TREE_TOKENS.radiusCard, overflow: "hidden" },
1840
+ style: /^(lucide|simple):/.test(mediaRef) ? { padding: `${AI_TREE_TOKENS.paddingBlock}px ${AI_TREE_TOKENS.paddingBlock}px 0` } : hasBg ? void 0 : { borderRadius: cardRadius(slots), overflow: "hidden" },
1552
1841
  children: media
1553
1842
  }
1554
1843
  )),
@@ -1959,6 +2248,32 @@ function renderNode(node, ctx, path) {
1959
2248
  if (child) {
1960
2249
  return renderNode(child, ctx, `${path}.c0`);
1961
2250
  }
2251
+ if (str(slots.provider) === "map" && str(slots.query)) {
2252
+ const query = str(slots.query);
2253
+ const mapAttrs = ctx.keyFor ? {
2254
+ "data-ohw-key": ctx.keyFor(`${path}.query`),
2255
+ "data-ohw-editable": "map",
2256
+ "data-ohw-map-query": query
2257
+ } : {};
2258
+ return /* @__PURE__ */ jsx(
2259
+ "iframe",
2260
+ {
2261
+ ...mapAttrs,
2262
+ "data-ai-embed": "map",
2263
+ title: str(slots.title) || "Map",
2264
+ src: `https://www.google.com/maps?q=${encodeURIComponent(query)}&output=embed`,
2265
+ loading: "lazy",
2266
+ referrerPolicy: "no-referrer-when-downgrade",
2267
+ style: {
2268
+ width: "100%",
2269
+ minHeight: 320,
2270
+ border: 0,
2271
+ borderRadius: AI_TREE_TOKENS.radiusCard,
2272
+ display: "block"
2273
+ }
2274
+ }
2275
+ );
2276
+ }
1962
2277
  return /* @__PURE__ */ jsx(
1963
2278
  "div",
1964
2279
  {
@@ -2112,9 +2427,14 @@ function AiTreeRenderer({
2112
2427
  const resolvedBrand = brand ?? AI_DEFAULT_BRAND;
2113
2428
  const band = (tree.settings ?? {}).sectionBackground === "accent" ? accentBandContext(resolvedBrand) : null;
2114
2429
  const blockBrand = band?.brand ?? resolvedBrand;
2430
+ const placeholderMap = buildPlaceholderMap(tree);
2115
2431
  const ctx = {
2116
2432
  brand: blockBrand,
2117
- resolveMedia: resolveMedia ?? (() => null),
2433
+ // An owner/library ref resolves through the host resolver; a `placeholder:<subject>` ref the
2434
+ // host cannot resolve falls back to real stock photography (the per-section map first, then a
2435
+ // standalone resolve), so generated galleries, image rows, and overlay backgrounds arrive with
2436
+ // photos instead of grey boxes.
2437
+ resolveMedia: (ref) => resolveMedia?.(ref) ?? placeholderMap[ref] ?? resolvePlaceholderRef(ref),
2118
2438
  cardSurface: blockBrand.palette.light.toUpperCase() === AI_DEFAULT_BRAND.palette.light.toUpperCase() ? "#ECECEB" : `color-mix(in srgb, ${blockBrand.palette.light} 90%, ${blockBrand.palette.dark})`,
2119
2439
  keyFor: editKeyPrefix ? (path) => `${editKeyPrefix}.${path}` : null,
2120
2440
  sectionAlignment: (tree.settings ?? {}).alignment === "center" ? "center" : "left",
@@ -14598,6 +14918,9 @@ function collectEditableNodes(extraContent, root = document) {
14598
14918
  if (el.dataset.ohwEditable === "link") {
14599
14919
  return { key: el.dataset.ohwKey ?? "", type: "link", text: getLinkHref3(el) };
14600
14920
  }
14921
+ if (el.dataset.ohwEditable === "map") {
14922
+ return { key: el.dataset.ohwKey ?? "", type: "map", text: el.dataset.ohwMapQuery ?? "" };
14923
+ }
14601
14924
  return {
14602
14925
  key: el.dataset.ohwKey ?? "",
14603
14926
  type: el.dataset.ohwEditable ?? "text",
@@ -15381,7 +15704,7 @@ var EDITOR_CHROME_SELECTOR = '[data-ohw-toolbar], [data-ohw-form-toolbar], [data
15381
15704
  function isOverEditorChrome(x, y) {
15382
15705
  return document.elementsFromPoint(x, y).some((el) => el instanceof HTMLElement && el.matches(EDITOR_CHROME_SELECTOR));
15383
15706
  }
15384
- var NON_MEDIA_SELECTOR = '[data-ohw-editable]:not([data-ohw-editable="image"]):not([data-ohw-editable="bg-image"]):not([data-ohw-editable="video"]):not([data-ohw-editable="icon"]):not([data-ohw-editable="form"])';
15707
+ var NON_MEDIA_SELECTOR = '[data-ohw-editable]:not([data-ohw-editable="image"]):not([data-ohw-editable="bg-image"]):not([data-ohw-editable="video"]):not([data-ohw-editable="icon"]):not([data-ohw-editable="form"]):not([data-ohw-editable="map"])';
15385
15708
  function getVideoEl2(el) {
15386
15709
  return el instanceof HTMLVideoElement ? el : el.querySelector("video");
15387
15710
  }
@@ -15437,6 +15760,12 @@ function applyVideoSettingNode(key, val) {
15437
15760
  });
15438
15761
  return true;
15439
15762
  }
15763
+ function applyMapQuery(el, val) {
15764
+ if (!(el instanceof HTMLIFrameElement)) return;
15765
+ const nextSrc = `https://www.google.com/maps?q=${encodeURIComponent(val)}&output=embed`;
15766
+ if (el.src !== nextSrc) el.src = nextSrc;
15767
+ el.setAttribute("data-ohw-map-query", val);
15768
+ }
15440
15769
  function applyLinkByKey(key, val) {
15441
15770
  document.querySelectorAll(`[data-ohw-key="${key}"]`).forEach((el) => {
15442
15771
  if (el.dataset.ohwEditable === "link") applyLinkHref(el, val);
@@ -18237,6 +18566,8 @@ function OhhwellsBridge() {
18237
18566
  }
18238
18567
  } else if (el.dataset.ohwEditable === "link") {
18239
18568
  applyLinkHref(el, val);
18569
+ } else if (el.dataset.ohwEditable === "map") {
18570
+ applyMapQuery(el, val);
18240
18571
  } else if (el.dataset.ohwEditable === "icon") {
18241
18572
  applyIconMarkup(el, val);
18242
18573
  } else if (el.dataset.ohwEditable === "form") {
@@ -18433,6 +18764,8 @@ function OhhwellsBridge() {
18433
18764
  if (video && video.src !== val) applyVideoSrc(video, val);
18434
18765
  } else if (el.dataset.ohwEditable === "link") {
18435
18766
  applyLinkHref(el, val);
18767
+ } else if (el.dataset.ohwEditable === "map") {
18768
+ applyMapQuery(el, val);
18436
18769
  } else if (el.dataset.ohwEditable === "form") {
18437
18770
  } else if (isIconMarkupValue(val)) {
18438
18771
  } else if (el.innerHTML !== val) {
@@ -20406,6 +20739,8 @@ function OhhwellsBridge() {
20406
20739
  if (video && video.src !== val) applyVideoSrc(video, val);
20407
20740
  } else if (el.dataset.ohwEditable === "link") {
20408
20741
  applyLinkHref(el, val);
20742
+ } else if (el.dataset.ohwEditable === "map") {
20743
+ applyMapQuery(el, val);
20409
20744
  } else if (el.dataset.ohwEditable === "icon") {
20410
20745
  applyIconMarkup(el, val);
20411
20746
  } else if (isIconMarkupValue(val)) {
@@ -21642,7 +21977,7 @@ function OhhwellsBridge() {
21642
21977
  postToParent2({
21643
21978
  type: "ow:ready",
21644
21979
  version: "1",
21645
- bridgeVersion: "0.1.95",
21980
+ bridgeVersion: "0.1.97",
21646
21981
  path: pathname,
21647
21982
  nodes: collectEditableNodes(editContentRef.current),
21648
21983
  sections