@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.cjs +348 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +348 -13
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
|
525
|
-
|
|
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
|
-
|
|
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:
|
|
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 ?
|
|
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 ?
|
|
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 ?
|
|
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:
|
|
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
|
-
|
|
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.
|
|
21980
|
+
bridgeVersion: "0.1.97",
|
|
21646
21981
|
path: pathname,
|
|
21647
21982
|
nodes: collectEditableNodes(editContentRef.current),
|
|
21648
21983
|
sections
|