@scalemule/news-publication 0.0.48 → 0.0.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -0
- package/dist/{chunk-GB36YM56.js → chunk-2MEYHM7M.js} +11 -1
- package/dist/chunk-4JRWZXAP.js +62 -0
- package/dist/chunk-MBBPEFDA.js +124 -0
- package/dist/chunk-TTLM7YOH.js +444 -0
- package/dist/chunk-ZXH3O537.js +251 -0
- package/dist/community-maps-view.d.cts +3 -3
- package/dist/community-maps-view.d.ts +3 -3
- package/dist/cookie-consent-banner.d.cts +2 -2
- package/dist/cookie-consent-banner.d.ts +2 -2
- package/dist/cookie-settings-view.d.cts +2 -2
- package/dist/cookie-settings-view.d.ts +2 -2
- package/dist/index.cjs +29 -1
- package/dist/index.d.cts +4 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +4 -3
- package/dist/marketplace-forms.d.cts +3 -3
- package/dist/marketplace-forms.d.ts +3 -3
- package/dist/marketplace-view.d.cts +5 -5
- package/dist/marketplace-view.d.ts +5 -5
- package/dist/{meet-RWmfj3I3.d.cts → meet-BWpxY20X.d.ts} +5 -0
- package/dist/{meet-RWmfj3I3.d.ts → meet-CO9Unz5M.d.cts} +5 -0
- package/dist/meet-forms.d.cts +7 -6
- package/dist/meet-forms.d.ts +7 -6
- package/dist/meet-forms.js +2 -1
- package/dist/meet-view.cjs +22 -2
- package/dist/meet-view.d.cts +7 -5
- package/dist/meet-view.d.ts +7 -5
- package/dist/meet-view.js +21 -4
- package/dist/network-bar.d.cts +2 -2
- package/dist/network-bar.d.ts +2 -2
- package/dist/network-copyright.d.cts +2 -2
- package/dist/network-copyright.d.ts +2 -2
- package/dist/pets-auth-server.cjs +212 -0
- package/dist/pets-auth-server.d.cts +17 -0
- package/dist/pets-auth-server.d.ts +17 -0
- package/dist/pets-auth-server.js +155 -0
- package/dist/pets-forms.cjs +762 -0
- package/dist/pets-forms.d.cts +26 -0
- package/dist/pets-forms.d.ts +26 -0
- package/dist/pets-forms.js +712 -0
- package/dist/pets-interactions.cjs +332 -0
- package/dist/pets-interactions.d.cts +20 -0
- package/dist/pets-interactions.d.ts +20 -0
- package/dist/pets-interactions.js +319 -0
- package/dist/pets-publication.cjs +818 -0
- package/dist/pets-publication.d.cts +36 -0
- package/dist/pets-publication.d.ts +36 -0
- package/dist/pets-publication.js +177 -0
- package/dist/pets-server.cjs +289 -0
- package/dist/pets-server.d.cts +42 -0
- package/dist/pets-server.d.ts +42 -0
- package/dist/pets-server.js +2 -0
- package/dist/pets-view.cjs +541 -0
- package/dist/pets-view.d.cts +56 -0
- package/dist/pets-view.d.ts +56 -0
- package/dist/pets-view.js +4 -0
- package/dist/pets.cjs +138 -0
- package/dist/pets.d.cts +127 -0
- package/dist/pets.d.ts +127 -0
- package/dist/pets.js +1 -0
- package/dist/sponsorship-view.d.cts +2 -2
- package/dist/sponsorship-view.d.ts +2 -2
- package/dist/sponsorship-view.js +2 -62
- package/dist/story-review.d.cts +6 -6
- package/dist/story-review.d.ts +6 -6
- package/dist/theme-toggle.d.cts +2 -2
- package/dist/theme-toggle.d.ts +2 -2
- package/dist/verified-card.d.cts +3 -3
- package/dist/verified-card.d.ts +3 -3
- package/package.json +40 -3
- package/pets.css +538 -0
package/README.md
CHANGED
|
@@ -245,3 +245,31 @@ publication must validate that return path and preserve it through sign-in.
|
|
|
245
245
|
Inventory is unavailable until a verified operational placement is active. `placementAvailable` enforces verification freshness and keeps paid briefings disabled. Campaign approval, authorization, allocation capacity and manual commercial references remain server responsibilities. Report HTML distinguishes observed counts from unavailable data and can be printed or rendered to PDF. No invoice or payment is initiated by this SDK.
|
|
246
246
|
|
|
247
247
|
The consent banner now offers a choice in every geography where optional measurement requires one. `measurementConsent` is the server gate for current, explicitly allowed categories and GPC/DNT. Positive permission is local: unsigned URL parameters and a binary network hub cannot grant all categories. Rendering sponsorship recognition does not require tracking consent; measuring it requires both performance and advertising permission.
|
|
248
|
+
|
|
249
|
+
## Community pet sections
|
|
250
|
+
|
|
251
|
+
The `pets`, `pets-view`, `pets-forms`, `pets-interactions`, `pets-server`,
|
|
252
|
+
`pets-auth-server`, and `pets-publication` entry points add typed, moderated pet
|
|
253
|
+
resources to existing Community Maps collections. Import `pets.css` for the
|
|
254
|
+
scoped presentation. Server adapters require each application's own API key;
|
|
255
|
+
never pass credentials or a `PetScope` to a client component.
|
|
256
|
+
|
|
257
|
+
`PublicationPetsSection` resolves an accepted collection view and its coverage.
|
|
258
|
+
`PublicationPetReferences` resolves `metadata.pet_resources` at render time:
|
|
259
|
+
each reference has `collection_slug`, the API-returned `id`, and `kind`.
|
|
260
|
+
Removed/private resources are omitted; article records need no copied pet data.
|
|
261
|
+
`PublicationPetEvents` extends the existing publication calendar with reviewed
|
|
262
|
+
pet event references and official registration links. Meet's optional `walk`
|
|
263
|
+
field extends its existing dog-walk activity without creating another join system.
|
|
264
|
+
|
|
265
|
+
`createPawAuthHandler` delegates authentication to the platform's supported
|
|
266
|
+
Ledvery OIDC flow. Enable it only after configuring and testing the application
|
|
267
|
+
client and callback. `createPublicationPetsHandler` restricts routes, requires
|
|
268
|
+
same-origin authenticated writes, and proxies visibility-checked photographs.
|
|
269
|
+
Approved sponsorships come from existing Blog campaign delivery and reporting.
|
|
270
|
+
There is no fictional sponsor fallback and no public demonstration inventory.
|
|
271
|
+
|
|
272
|
+
Private recovery contact and broad community alert delivery are not implemented
|
|
273
|
+
by these components. Notification controls default to disabled. The canonical
|
|
274
|
+
application, collections, publication views and legitimate source content must
|
|
275
|
+
be provisioned separately before launch.
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { preparePawWalk } from './chunk-MBBPEFDA.js';
|
|
2
|
+
|
|
1
3
|
// src/meet.ts
|
|
2
4
|
var MEET_ACTIVITIES = [
|
|
3
5
|
{ value: "coffee", label: "Coffee" },
|
|
@@ -57,6 +59,13 @@ function prepareMeetup(input, places, now = /* @__PURE__ */ new Date()) {
|
|
|
57
59
|
if (!notes.ok) throw new Error(notes.reason);
|
|
58
60
|
const capacity = Number(input.capacity ?? 6);
|
|
59
61
|
if (!Number.isInteger(capacity) || capacity < 2 || capacity > 12) throw new Error("Choose a group size from 2 to 12.");
|
|
62
|
+
const walk = activity === "dogs" && input.walk ? preparePawWalk(input.walk) : void 0;
|
|
63
|
+
if (walk) for (const guidance of [walk.size_guidance, walk.accessibility]) {
|
|
64
|
+
if (guidance.trim()) {
|
|
65
|
+
const screened = screenMessage(guidance);
|
|
66
|
+
if (!screened.ok) throw new Error(screened.reason);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
60
69
|
return {
|
|
61
70
|
activity,
|
|
62
71
|
activityLabel: label,
|
|
@@ -65,7 +74,8 @@ function prepareMeetup(input, places, now = /* @__PURE__ */ new Date()) {
|
|
|
65
74
|
placeDetail: place.detail,
|
|
66
75
|
startsAt: new Date(starts).toISOString(),
|
|
67
76
|
notes: notes.text,
|
|
68
|
-
capacity
|
|
77
|
+
capacity,
|
|
78
|
+
...walk ? { walk } : {}
|
|
69
79
|
};
|
|
70
80
|
}
|
|
71
81
|
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { safeSponsorUrl } from './chunk-66GI2IX6.js';
|
|
2
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
function SponsorAcknowledgment({
|
|
5
|
+
creative,
|
|
6
|
+
label = "Community Partner",
|
|
7
|
+
preview = false,
|
|
8
|
+
acknowledgment
|
|
9
|
+
}) {
|
|
10
|
+
const logo = safeSponsorUrl(creative.logo_url);
|
|
11
|
+
const destination = safeSponsorUrl(creative.destination_url);
|
|
12
|
+
return /* @__PURE__ */ jsxs(
|
|
13
|
+
"aside",
|
|
14
|
+
{
|
|
15
|
+
className: "sm-sponsorship",
|
|
16
|
+
"aria-label": `${label}: ${creative.name}`,
|
|
17
|
+
"data-sponsorship": preview ? void 0 : acknowledgment?.campaign_id,
|
|
18
|
+
"data-placement-id": preview ? void 0 : acknowledgment?.placement_id,
|
|
19
|
+
"data-publication-id": preview ? void 0 : acknowledgment?.publication_id,
|
|
20
|
+
"data-sponsor-id": preview ? void 0 : acknowledgment?.sponsor_id,
|
|
21
|
+
children: [
|
|
22
|
+
/* @__PURE__ */ jsxs("div", { className: "sm-sponsorship-copy", children: [
|
|
23
|
+
/* @__PURE__ */ jsxs("p", { className: "sm-sponsorship-label", children: [
|
|
24
|
+
label,
|
|
25
|
+
preview ? " \xB7 Illustrative preview" : ""
|
|
26
|
+
] }),
|
|
27
|
+
/* @__PURE__ */ jsx("p", { className: "sm-sponsorship-name", children: creative.name }),
|
|
28
|
+
creative.description && /* @__PURE__ */ jsx("p", { className: "sm-sponsorship-description", children: creative.description }),
|
|
29
|
+
destination && /* @__PURE__ */ jsxs(
|
|
30
|
+
"a",
|
|
31
|
+
{
|
|
32
|
+
href: destination,
|
|
33
|
+
rel: "sponsored noopener noreferrer",
|
|
34
|
+
referrerPolicy: "no-referrer",
|
|
35
|
+
"data-analytics-skip": "true",
|
|
36
|
+
children: [
|
|
37
|
+
creative.link_label || "Learn more",
|
|
38
|
+
/* @__PURE__ */ jsxs("span", { className: "sm-sponsorship-sr", children: [
|
|
39
|
+
" about ",
|
|
40
|
+
creative.name
|
|
41
|
+
] })
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
)
|
|
45
|
+
] }),
|
|
46
|
+
logo && /* @__PURE__ */ jsx(
|
|
47
|
+
"img",
|
|
48
|
+
{
|
|
49
|
+
src: logo,
|
|
50
|
+
alt: `${creative.name} logo`,
|
|
51
|
+
loading: "lazy",
|
|
52
|
+
decoding: "async",
|
|
53
|
+
referrerPolicy: "no-referrer",
|
|
54
|
+
className: "sm-sponsorship-logo"
|
|
55
|
+
}
|
|
56
|
+
)
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export { SponsorAcknowledgment };
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
// src/pets.ts
|
|
2
|
+
var PET_KINDS = [
|
|
3
|
+
"profile",
|
|
4
|
+
"spotlight",
|
|
5
|
+
"photo",
|
|
6
|
+
"celebration",
|
|
7
|
+
"lost",
|
|
8
|
+
"found",
|
|
9
|
+
"adoption",
|
|
10
|
+
"event"
|
|
11
|
+
];
|
|
12
|
+
var PET_NOTIFICATION_CATEGORIES = [
|
|
13
|
+
["lost_found", "Lost & found"],
|
|
14
|
+
["walks", "Paw Walks"],
|
|
15
|
+
["adoption_events", "Adoption events"],
|
|
16
|
+
["celebrations", "Pet celebrations"],
|
|
17
|
+
["spotlight", "Paw of the Week"],
|
|
18
|
+
["community", "Community information"]
|
|
19
|
+
];
|
|
20
|
+
var PET_PHOTO_CATEGORIES = [
|
|
21
|
+
["cute", "Cute pets"],
|
|
22
|
+
["funny", "Funny moments"],
|
|
23
|
+
["adventures", "Adventures"],
|
|
24
|
+
["senior", "Senior pets"],
|
|
25
|
+
["rescue", "Rescue stories"],
|
|
26
|
+
["young", "Puppies & kittens"],
|
|
27
|
+
["unusual", "Unusual pets"],
|
|
28
|
+
["friends", "Best friends"],
|
|
29
|
+
["holiday", "Holiday pets"]
|
|
30
|
+
];
|
|
31
|
+
var PET_CELEBRATIONS = [
|
|
32
|
+
["birthday", "Pet birthday"],
|
|
33
|
+
["adoption_anniversary", "Adoption anniversary"],
|
|
34
|
+
["welcome_home", "Welcome home"],
|
|
35
|
+
["rescue_story", "Rescue story"],
|
|
36
|
+
["happy_reunion", "Happy reunion"],
|
|
37
|
+
["memorial", "Memorial tribute"]
|
|
38
|
+
];
|
|
39
|
+
var PET_SAFETY = {
|
|
40
|
+
recovery: "Bay Area Paw does not independently verify pet ownership. A report is a contributor\u2019s account. Never send money or verification codes to someone claiming to have found a pet. Keep microchip numbers and ownership evidence private.",
|
|
41
|
+
walks: "Walks are independently organized. Bay Area Paw does not supervise meetups or guarantee participants\u2019 safety. Meet in a public place, follow leash rules and respect other people and animals.",
|
|
42
|
+
adoption: "Contact the named shelter or rescue for current availability, eligibility and adoption arrangements. Bay Area Paw is not the adoption agency and does not collect adoption payments.",
|
|
43
|
+
wellness: "Wellness information is educational. Contact a veterinarian for advice about your pet."
|
|
44
|
+
};
|
|
45
|
+
var PET_UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
46
|
+
var PET_SLUG = /^[a-z0-9][a-z0-9-]{0,190}$/;
|
|
47
|
+
function petReferences(metadata) {
|
|
48
|
+
const entries = metadata && typeof metadata === "object" ? metadata.pet_resources : null;
|
|
49
|
+
if (!Array.isArray(entries)) return [];
|
|
50
|
+
return entries.slice(0, 12).flatMap((v) => {
|
|
51
|
+
if (!v || typeof v !== "object") return [];
|
|
52
|
+
const r = v;
|
|
53
|
+
return typeof r.collection_slug === "string" && PET_SLUG.test(r.collection_slug) && typeof r.id === "string" && PET_UUID.test(r.id) && PET_KINDS.includes(r.kind) ? [
|
|
54
|
+
{
|
|
55
|
+
collection_slug: r.collection_slug,
|
|
56
|
+
id: r.id,
|
|
57
|
+
kind: r.kind
|
|
58
|
+
}
|
|
59
|
+
] : [];
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function resolvePetCommunity(areas, selected, preference, publicationDefault) {
|
|
63
|
+
if (selected === "") return void 0;
|
|
64
|
+
for (const candidate of [selected, preference, publicationDefault]) {
|
|
65
|
+
const found = areas.find(
|
|
66
|
+
(area) => area.id === candidate || area.slug === candidate
|
|
67
|
+
);
|
|
68
|
+
if (found) return found;
|
|
69
|
+
}
|
|
70
|
+
return void 0;
|
|
71
|
+
}
|
|
72
|
+
function safePetLink(raw) {
|
|
73
|
+
if (raw.startsWith("/") && !raw.startsWith("//") && !/[\\\r\n]/.test(raw))
|
|
74
|
+
return raw;
|
|
75
|
+
try {
|
|
76
|
+
const url = new URL(raw);
|
|
77
|
+
return url.protocol === "https:" && !url.username && !url.password ? url.href : void 0;
|
|
78
|
+
} catch {
|
|
79
|
+
return void 0;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function adoptionAvailability(source, now = Date.now()) {
|
|
83
|
+
const at = source?.verified_at ? Date.parse(source.verified_at) : NaN;
|
|
84
|
+
return source?.availability_confirmed && Number.isFinite(at) && at <= now && now - at <= 864e5 ? "confirmed" : "check_with_organization";
|
|
85
|
+
}
|
|
86
|
+
function petProfileMetadata(resource, canonicalUrl, photoUrl) {
|
|
87
|
+
const canonical = safePetLink(canonicalUrl);
|
|
88
|
+
if (!resource || !canonical?.startsWith("https://"))
|
|
89
|
+
return {
|
|
90
|
+
title: "Pet profile unavailable",
|
|
91
|
+
robots: { index: false, follow: false }
|
|
92
|
+
};
|
|
93
|
+
return {
|
|
94
|
+
title: `Meet ${resource.content.name}`,
|
|
95
|
+
description: Array.from(resource.content.story).slice(0, 180).join(""),
|
|
96
|
+
alternates: { canonical },
|
|
97
|
+
openGraph: {
|
|
98
|
+
title: `Meet ${resource.content.name}`,
|
|
99
|
+
description: resource.content.story,
|
|
100
|
+
url: canonical,
|
|
101
|
+
...photoUrl && safePetLink(photoUrl) ? { images: [{ url: photoUrl, alt: resource.content.name }] } : {}
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function preparePawWalk(value) {
|
|
106
|
+
if (!Number.isInteger(value.duration_minutes) || value.duration_minutes < 10 || value.duration_minutes > 240)
|
|
107
|
+
throw new Error("Choose a walk duration from 10 to 240 minutes.");
|
|
108
|
+
if (value.distance_km !== void 0 && (!Number.isFinite(value.distance_km) || value.distance_km < 0 || value.distance_km > 30))
|
|
109
|
+
throw new Error("Choose a walking distance from 0 to 30 km.");
|
|
110
|
+
if (value.leash !== "required" && value.leash !== "venue_rules")
|
|
111
|
+
throw new Error("Choose the leash requirements.");
|
|
112
|
+
for (const field of [value.size_guidance, value.accessibility])
|
|
113
|
+
if (typeof field !== "string" || Array.from(field).length > 500)
|
|
114
|
+
throw new Error("Keep walk guidance within 500 characters.");
|
|
115
|
+
return {
|
|
116
|
+
duration_minutes: value.duration_minutes,
|
|
117
|
+
distance_km: value.distance_km,
|
|
118
|
+
leash: value.leash,
|
|
119
|
+
size_guidance: value.size_guidance,
|
|
120
|
+
accessibility: value.accessibility
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export { PET_CELEBRATIONS, PET_KINDS, PET_NOTIFICATION_CATEGORIES, PET_PHOTO_CATEGORIES, PET_SAFETY, PET_SLUG, PET_UUID, adoptionAvailability, petProfileMetadata, petReferences, preparePawWalk, resolvePetCommunity, safePetLink };
|