@scalemule/news-publication 0.0.47 → 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.
Files changed (73) hide show
  1. package/README.md +28 -0
  2. package/dist/{chunk-GB36YM56.js → chunk-2MEYHM7M.js} +11 -1
  3. package/dist/chunk-4JRWZXAP.js +62 -0
  4. package/dist/chunk-MBBPEFDA.js +124 -0
  5. package/dist/chunk-TTLM7YOH.js +444 -0
  6. package/dist/chunk-ZXH3O537.js +251 -0
  7. package/dist/community-maps-view.d.cts +3 -3
  8. package/dist/community-maps-view.d.ts +3 -3
  9. package/dist/cookie-consent-banner.d.cts +2 -2
  10. package/dist/cookie-consent-banner.d.ts +2 -2
  11. package/dist/cookie-settings-view.d.cts +2 -2
  12. package/dist/cookie-settings-view.d.ts +2 -2
  13. package/dist/index.cjs +74 -3
  14. package/dist/index.d.cts +12 -4
  15. package/dist/index.d.ts +12 -4
  16. package/dist/index.js +49 -6
  17. package/dist/marketplace-forms.d.cts +3 -3
  18. package/dist/marketplace-forms.d.ts +3 -3
  19. package/dist/marketplace-view.d.cts +5 -5
  20. package/dist/marketplace-view.d.ts +5 -5
  21. package/dist/{meet-RWmfj3I3.d.cts → meet-BWpxY20X.d.ts} +5 -0
  22. package/dist/{meet-RWmfj3I3.d.ts → meet-CO9Unz5M.d.cts} +5 -0
  23. package/dist/meet-forms.d.cts +7 -6
  24. package/dist/meet-forms.d.ts +7 -6
  25. package/dist/meet-forms.js +2 -1
  26. package/dist/meet-view.cjs +22 -2
  27. package/dist/meet-view.d.cts +7 -5
  28. package/dist/meet-view.d.ts +7 -5
  29. package/dist/meet-view.js +21 -4
  30. package/dist/network-bar.d.cts +2 -2
  31. package/dist/network-bar.d.ts +2 -2
  32. package/dist/network-copyright.d.cts +2 -2
  33. package/dist/network-copyright.d.ts +2 -2
  34. package/dist/pets-auth-server.cjs +212 -0
  35. package/dist/pets-auth-server.d.cts +17 -0
  36. package/dist/pets-auth-server.d.ts +17 -0
  37. package/dist/pets-auth-server.js +155 -0
  38. package/dist/pets-forms.cjs +762 -0
  39. package/dist/pets-forms.d.cts +26 -0
  40. package/dist/pets-forms.d.ts +26 -0
  41. package/dist/pets-forms.js +712 -0
  42. package/dist/pets-interactions.cjs +332 -0
  43. package/dist/pets-interactions.d.cts +20 -0
  44. package/dist/pets-interactions.d.ts +20 -0
  45. package/dist/pets-interactions.js +319 -0
  46. package/dist/pets-publication.cjs +818 -0
  47. package/dist/pets-publication.d.cts +36 -0
  48. package/dist/pets-publication.d.ts +36 -0
  49. package/dist/pets-publication.js +177 -0
  50. package/dist/pets-server.cjs +289 -0
  51. package/dist/pets-server.d.cts +42 -0
  52. package/dist/pets-server.d.ts +42 -0
  53. package/dist/pets-server.js +2 -0
  54. package/dist/pets-view.cjs +541 -0
  55. package/dist/pets-view.d.cts +56 -0
  56. package/dist/pets-view.d.ts +56 -0
  57. package/dist/pets-view.js +4 -0
  58. package/dist/pets.cjs +138 -0
  59. package/dist/pets.d.cts +127 -0
  60. package/dist/pets.d.ts +127 -0
  61. package/dist/pets.js +1 -0
  62. package/dist/sponsorship-view.d.cts +2 -2
  63. package/dist/sponsorship-view.d.ts +2 -2
  64. package/dist/sponsorship-view.js +2 -62
  65. package/dist/story-review.d.cts +6 -6
  66. package/dist/story-review.d.ts +6 -6
  67. package/dist/theme-toggle.d.cts +2 -2
  68. package/dist/theme-toggle.d.ts +2 -2
  69. package/dist/verified-card.d.cts +3 -3
  70. package/dist/verified-card.d.ts +3 -3
  71. package/package.json +40 -3
  72. package/pets.css +538 -0
  73. package/tokens/broadsheet.css +46 -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 };