@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.
Files changed (72) 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 +29 -1
  14. package/dist/index.d.cts +4 -3
  15. package/dist/index.d.ts +4 -3
  16. package/dist/index.js +4 -3
  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
@@ -0,0 +1,251 @@
1
+ import { PET_UUID, petReferences, PET_SLUG } from './chunk-MBBPEFDA.js';
2
+ import { buildClientContextHeaders } from '@scalemule/sdk';
3
+
4
+ var PetRequestError = class extends Error {
5
+ constructor(status, message) {
6
+ super(message);
7
+ this.status = status;
8
+ }
9
+ status;
10
+ };
11
+ var petPrivateHeaders = {
12
+ "cache-control": "private, no-store",
13
+ "x-robots-tag": "noindex, nofollow",
14
+ "referrer-policy": "no-referrer",
15
+ "x-content-type-options": "nosniff"
16
+ };
17
+ async function bounded(request, max) {
18
+ if (Number(request.headers.get("content-length")) > max)
19
+ throw new PetRequestError(413, "The submission is too large.");
20
+ const reader = request.body?.getReader();
21
+ if (!reader) return new Uint8Array();
22
+ const parts = [];
23
+ let size = 0;
24
+ try {
25
+ for (; ; ) {
26
+ const { done, value } = await reader.read();
27
+ if (done) break;
28
+ size += value.length;
29
+ if (size > max) {
30
+ await reader.cancel();
31
+ throw new PetRequestError(413, "The submission is too large.");
32
+ }
33
+ parts.push(value);
34
+ }
35
+ } finally {
36
+ reader.releaseLock();
37
+ }
38
+ return Buffer.concat(parts);
39
+ }
40
+ function config(scope) {
41
+ const url = new URL(scope.gatewayUrl);
42
+ if (!scope.apiKey || !PET_SLUG.test(scope.collectionSlug) || url.username || url.password || url.protocol !== "https:" && !(url.protocol === "http:" && ["localhost", "127.0.0.1"].includes(url.hostname)))
43
+ throw new PetRequestError(503, "The pet community is not available yet.");
44
+ return url.origin;
45
+ }
46
+ async function petRequest(scope, path, init = {}, fetcher = fetch) {
47
+ const gateway = config(scope);
48
+ if (!path.startsWith("/v1/") || path.includes("..") || /[\\\r\n]/.test(path))
49
+ throw new Error("Invalid platform path");
50
+ const response = await fetcher(gateway + path, {
51
+ method: init.method || "GET",
52
+ headers: {
53
+ ...buildClientContextHeaders(scope.clientContext),
54
+ "x-api-key": scope.apiKey,
55
+ "content-type": "application/json",
56
+ ...scope.accessToken ? { authorization: `Bearer ${scope.accessToken}` } : {}
57
+ },
58
+ body: init.body === void 0 ? void 0 : JSON.stringify(init.body),
59
+ cache: "no-store",
60
+ redirect: "error",
61
+ signal: AbortSignal.timeout(15e3)
62
+ });
63
+ if (!response.ok)
64
+ throw new PetRequestError(
65
+ response.status,
66
+ response.status === 401 ? "Please sign in to continue." : response.status === 404 ? "This pet resource is not available." : response.status === 409 ? "This contribution changed. Reload before saving." : response.status === 429 ? "Please wait before trying again." : "We couldn\u2019t complete that request. Please try again."
67
+ );
68
+ const json = await response.json();
69
+ return json?.data ?? json;
70
+ }
71
+ function createPublicationPetsHandler(options) {
72
+ const fetcher = options.fetch || fetch;
73
+ return async function handler(request, path) {
74
+ const json = (data, status = 200) => Response.json(data, { status, headers: petPrivateHeaders });
75
+ try {
76
+ const scope = await options.resolve(request), gateway = config(scope), method = request.method;
77
+ const root = `/v1/knowledge/community-maps/collections/${scope.collectionSlug}`;
78
+ const id = path[0] && PET_UUID.test(path[0]);
79
+ const isMedia = id && path.length === 3 && path[1] === "media" && PET_UUID.test(path[2]);
80
+ const upload = path.length === 3 && path[0] === "submissions" && PET_UUID.test(path[1]) && path[2] === "media";
81
+ const ownMedia = path.length === 4 && path[0] === "submissions" && PET_UUID.test(path[1]) && path[2] === "media" && PET_UUID.test(path[3]);
82
+ const own = path[0] === "mine" && (path.length === 1 || path.length === 2 && PET_UUID.test(path[1]));
83
+ const preferences = path.length === 1 && path[0] === "preferences";
84
+ const reaction = id && path.length === 2 && path[1] === "reaction";
85
+ const report = id && path.length === 2 && path[1] === "reports";
86
+ const publicRead = method === "GET" && (!path.length || id && path.length === 1 || isMedia || path.length === 1 && path[0] === "community");
87
+ const read = publicRead || method === "GET" && (own || ownMedia || preferences || reaction);
88
+ const write = method === "POST" && (!path.length || upload || report || id && path.length === 2 && path[1] === "reunited") || method === "PUT" && (preferences || reaction) || ["PUT", "DELETE"].includes(method) && id && path.length === 1;
89
+ if (!read && !write) return json({ error: "Route not found" }, 404);
90
+ if (write && (!scope.writesEnabled || request.headers.get("origin") !== new URL(scope.origin).origin))
91
+ return json(
92
+ { error: "Continue from the pet community\u2019s official website." },
93
+ 403
94
+ );
95
+ if ((write || own || ownMedia || preferences || reaction) && !scope.accessToken)
96
+ return json({ error: "Sign in to continue." }, 401);
97
+ let endpoint = root + (path[0] === "community" ? "" : upload || ownMedia ? "/" + path.join("/") : "/pets" + (path.length ? "/" + path.join("/") : ""));
98
+ const query = new URLSearchParams();
99
+ if (method === "GET" && !path.length)
100
+ for (const key of [
101
+ "area_id",
102
+ "kind",
103
+ "after",
104
+ "week",
105
+ "limit",
106
+ "category",
107
+ "species",
108
+ "event_type",
109
+ "cost",
110
+ "starts_after",
111
+ "starts_before"
112
+ ]) {
113
+ const value = new URL(request.url).searchParams.get(key);
114
+ if (value) query.set(key, value);
115
+ }
116
+ if (own) {
117
+ const after = new URL(request.url).searchParams.get("after");
118
+ if (after && PET_UUID.test(after)) query.set("after", after);
119
+ }
120
+ if (query.size) endpoint += "?" + query;
121
+ if (isMedia) {
122
+ const imageQuery = new URLSearchParams();
123
+ const sourceQuery = new URL(request.url).searchParams;
124
+ if (["640", "1280"].includes(sourceQuery.get("width") || ""))
125
+ imageQuery.set("width", sourceQuery.get("width"));
126
+ if (["jpeg", "webp"].includes(sourceQuery.get("format") || ""))
127
+ imageQuery.set("format", sourceQuery.get("format"));
128
+ if (imageQuery.size) endpoint += "?" + imageQuery;
129
+ }
130
+ if (isMedia || upload || ownMedia) {
131
+ let body2;
132
+ const type = request.headers.get("content-type") || "";
133
+ if (upload) {
134
+ if (!type.startsWith("multipart/form-data;"))
135
+ throw new PetRequestError(415, "Choose a photograph.");
136
+ body2 = await bounded(request, 9 * 1024 * 1024);
137
+ }
138
+ const response = await fetcher(gateway + endpoint, {
139
+ method,
140
+ headers: {
141
+ ...buildClientContextHeaders(scope.clientContext),
142
+ "x-api-key": scope.apiKey,
143
+ ...scope.accessToken ? { authorization: `Bearer ${scope.accessToken}` } : {},
144
+ ...upload ? { "content-type": type } : {}
145
+ },
146
+ body: body2,
147
+ cache: "no-store",
148
+ redirect: "error",
149
+ signal: AbortSignal.timeout(45e3)
150
+ });
151
+ if (!response.ok) {
152
+ await response.body?.cancel();
153
+ return json(
154
+ {
155
+ error: "The photograph is unavailable. Check its size and try again."
156
+ },
157
+ response.status >= 500 ? 503 : response.status
158
+ );
159
+ }
160
+ if (upload) return json(await response.json());
161
+ const imageType = response.headers.get("content-type")?.split(";")[0] || "";
162
+ if (!["image/png", "image/jpeg", "image/webp"].includes(imageType)) {
163
+ await response.body?.cancel();
164
+ return json({ error: "Photograph unavailable" }, 404);
165
+ }
166
+ return new Response(response.body, {
167
+ headers: { ...petPrivateHeaders, "content-type": imageType }
168
+ });
169
+ }
170
+ let body;
171
+ if (write) {
172
+ if (!request.headers.get("content-type")?.startsWith("application/json"))
173
+ throw new PetRequestError(415, "Use the pet contribution form.");
174
+ try {
175
+ body = JSON.parse(
176
+ new TextDecoder().decode(await bounded(request, 32768))
177
+ );
178
+ } catch (error) {
179
+ if (error instanceof PetRequestError) throw error;
180
+ throw new PetRequestError(400, "Check the contribution fields.");
181
+ }
182
+ }
183
+ return json({
184
+ data: await petRequest(scope, endpoint, { method, body }, fetcher)
185
+ });
186
+ } catch (error) {
187
+ return json(
188
+ {
189
+ error: error instanceof PetRequestError ? error.message : "The pet community is temporarily unavailable."
190
+ },
191
+ error instanceof PetRequestError ? error.status : 503
192
+ );
193
+ }
194
+ };
195
+ }
196
+ async function resolvePetReferences(scope, metadata, fetcher = fetch) {
197
+ const references = petReferences(metadata).filter(
198
+ (ref) => ref.collection_slug === scope.collectionSlug
199
+ );
200
+ const results = await Promise.all(
201
+ references.map(async (ref) => {
202
+ try {
203
+ const resource = await petRequest(
204
+ { ...scope, accessToken: void 0 },
205
+ `/v1/knowledge/community-maps/collections/${ref.collection_slug}/pets/${ref.id}`,
206
+ {},
207
+ fetcher
208
+ );
209
+ return resource.kind === ref.kind ? resource : null;
210
+ } catch (error) {
211
+ if (error instanceof PetRequestError && [403, 404].includes(error.status))
212
+ return null;
213
+ throw error;
214
+ }
215
+ })
216
+ );
217
+ return results.filter(
218
+ (resource) => resource !== null
219
+ );
220
+ }
221
+ async function petAcknowledgments(scope, community, productPath = "/pets", fetcher = fetch) {
222
+ if (!scope.publicationId || !PET_UUID.test(scope.publicationId)) return [];
223
+ try {
224
+ const groups = await Promise.all(
225
+ ["community_partner", "community_guide"].map(
226
+ async (placement) => {
227
+ const query = new URLSearchParams({
228
+ placement_type: placement,
229
+ product_path: productPath
230
+ });
231
+ if (community) query.set("community", community);
232
+ const response = await petRequest(
233
+ { ...scope, accessToken: void 0 },
234
+ `/v1/blog/publications/${scope.publicationId}/sponsorships/delivery?${query}`,
235
+ {},
236
+ fetcher
237
+ );
238
+ return response.items.filter(
239
+ (item) => item.publication_id === scope.publicationId && item.placement_type === placement
240
+ );
241
+ }
242
+ )
243
+ );
244
+ return groups.flat().slice(0, 2);
245
+ } catch {
246
+ console.warn("paw.sponsorship_delivery_unavailable");
247
+ return [];
248
+ }
249
+ }
250
+
251
+ export { PetRequestError, createPublicationPetsHandler, petAcknowledgments, petPrivateHeaders, petRequest, resolvePetReferences };
@@ -1,4 +1,4 @@
1
- import * as react from 'react';
1
+ import * as React from 'react';
2
2
  import { CommunityMapCollection, CommunityMapFeature, CommunityCityAtlasConfig } from '@scalemule/react/community-maps';
3
3
  export { c as communityMapEmbeds } from './community-maps-DKcYhQYN.cjs';
4
4
 
@@ -13,11 +13,11 @@ interface PublicationCommunityMapPageProps {
13
13
  atlas?: CommunityCityAtlasConfig;
14
14
  }
15
15
  /** The newspaper supplies its chrome and inherited type. The platform owns map behavior. */
16
- declare function PublicationCommunityMapPage({ collection, feature, mode, areaId, correctionFor, basePath, apiPath, atlas, }: PublicationCommunityMapPageProps): react.JSX.Element;
16
+ declare function PublicationCommunityMapPage({ collection, feature, mode, areaId, correctionFor, basePath, apiPath, atlas, }: PublicationCommunityMapPageProps): React.JSX.Element;
17
17
 
18
18
  declare function CommunityMapArticleEmbeds({ metadata, apiPath, }: {
19
19
  metadata: unknown;
20
20
  apiPath?: string;
21
- }): react.JSX.Element;
21
+ }): React.JSX.Element;
22
22
 
23
23
  export { CommunityMapArticleEmbeds, PublicationCommunityMapPage, type PublicationCommunityMapPageProps };
@@ -1,4 +1,4 @@
1
- import * as react from 'react';
1
+ import * as React from 'react';
2
2
  import { CommunityMapCollection, CommunityMapFeature, CommunityCityAtlasConfig } from '@scalemule/react/community-maps';
3
3
  export { c as communityMapEmbeds } from './community-maps-DKcYhQYN.js';
4
4
 
@@ -13,11 +13,11 @@ interface PublicationCommunityMapPageProps {
13
13
  atlas?: CommunityCityAtlasConfig;
14
14
  }
15
15
  /** The newspaper supplies its chrome and inherited type. The platform owns map behavior. */
16
- declare function PublicationCommunityMapPage({ collection, feature, mode, areaId, correctionFor, basePath, apiPath, atlas, }: PublicationCommunityMapPageProps): react.JSX.Element;
16
+ declare function PublicationCommunityMapPage({ collection, feature, mode, areaId, correctionFor, basePath, apiPath, atlas, }: PublicationCommunityMapPageProps): React.JSX.Element;
17
17
 
18
18
  declare function CommunityMapArticleEmbeds({ metadata, apiPath, }: {
19
19
  metadata: unknown;
20
20
  apiPath?: string;
21
- }): react.JSX.Element;
21
+ }): React.JSX.Element;
22
22
 
23
23
  export { CommunityMapArticleEmbeds, PublicationCommunityMapPage, type PublicationCommunityMapPageProps };
@@ -1,4 +1,4 @@
1
- import react__default from 'react';
1
+ import React__default from 'react';
2
2
 
3
3
  interface CookieConsentBannerProps {
4
4
  /** Title displayed in banner. Default: "Help Us Improve Our Website with Cookies" */
@@ -20,6 +20,6 @@ interface CookieConsentBannerProps {
20
20
  /** URL of the central network consent iframe bridge. Default: "https://bayareachronicle.com/consent-bridge.html" */
21
21
  consentHubUrl?: string;
22
22
  }
23
- declare function CookieConsentBanner({ title, text, settingsUrl, className, publicationSlug, complianceEndpoint, countryCode, forceShow, consentHubUrl, }: CookieConsentBannerProps): react__default.JSX.Element | null;
23
+ declare function CookieConsentBanner({ title, text, settingsUrl, className, publicationSlug, complianceEndpoint, countryCode, forceShow, consentHubUrl, }: CookieConsentBannerProps): React__default.JSX.Element | null;
24
24
 
25
25
  export { CookieConsentBanner, type CookieConsentBannerProps };
@@ -1,4 +1,4 @@
1
- import react__default from 'react';
1
+ import React__default from 'react';
2
2
 
3
3
  interface CookieConsentBannerProps {
4
4
  /** Title displayed in banner. Default: "Help Us Improve Our Website with Cookies" */
@@ -20,6 +20,6 @@ interface CookieConsentBannerProps {
20
20
  /** URL of the central network consent iframe bridge. Default: "https://bayareachronicle.com/consent-bridge.html" */
21
21
  consentHubUrl?: string;
22
22
  }
23
- declare function CookieConsentBanner({ title, text, settingsUrl, className, publicationSlug, complianceEndpoint, countryCode, forceShow, consentHubUrl, }: CookieConsentBannerProps): react__default.JSX.Element | null;
23
+ declare function CookieConsentBanner({ title, text, settingsUrl, className, publicationSlug, complianceEndpoint, countryCode, forceShow, consentHubUrl, }: CookieConsentBannerProps): React__default.JSX.Element | null;
24
24
 
25
25
  export { CookieConsentBanner, type CookieConsentBannerProps };
@@ -1,4 +1,4 @@
1
- import react__default from 'react';
1
+ import React__default from 'react';
2
2
 
3
3
  interface CookieSettingsViewProps {
4
4
  /** The publication display name (e.g., "San Ramon Times") */
@@ -10,6 +10,6 @@ interface CookieSettingsViewProps {
10
10
  /** Optional publication slug for metadata */
11
11
  publicationSlug?: string;
12
12
  }
13
- declare function CookieSettingsView({ publicationName, region, complianceEndpoint, publicationSlug, }: CookieSettingsViewProps): react__default.JSX.Element;
13
+ declare function CookieSettingsView({ publicationName, region, complianceEndpoint, publicationSlug, }: CookieSettingsViewProps): React__default.JSX.Element;
14
14
 
15
15
  export { CookieSettingsView, type CookieSettingsViewProps };
@@ -1,4 +1,4 @@
1
- import react__default from 'react';
1
+ import React__default from 'react';
2
2
 
3
3
  interface CookieSettingsViewProps {
4
4
  /** The publication display name (e.g., "San Ramon Times") */
@@ -10,6 +10,6 @@ interface CookieSettingsViewProps {
10
10
  /** Optional publication slug for metadata */
11
11
  publicationSlug?: string;
12
12
  }
13
- declare function CookieSettingsView({ publicationName, region, complianceEndpoint, publicationSlug, }: CookieSettingsViewProps): react__default.JSX.Element;
13
+ declare function CookieSettingsView({ publicationName, region, complianceEndpoint, publicationSlug, }: CookieSettingsViewProps): React__default.JSX.Element;
14
14
 
15
15
  export { CookieSettingsView, type CookieSettingsViewProps };
package/dist/index.cjs CHANGED
@@ -752,6 +752,26 @@ function referralCode(publication, url) {
752
752
  }
753
753
  }
754
754
 
755
+ // src/pets.ts
756
+ function preparePawWalk(value) {
757
+ if (!Number.isInteger(value.duration_minutes) || value.duration_minutes < 10 || value.duration_minutes > 240)
758
+ throw new Error("Choose a walk duration from 10 to 240 minutes.");
759
+ if (value.distance_km !== void 0 && (!Number.isFinite(value.distance_km) || value.distance_km < 0 || value.distance_km > 30))
760
+ throw new Error("Choose a walking distance from 0 to 30 km.");
761
+ if (value.leash !== "required" && value.leash !== "venue_rules")
762
+ throw new Error("Choose the leash requirements.");
763
+ for (const field of [value.size_guidance, value.accessibility])
764
+ if (typeof field !== "string" || Array.from(field).length > 500)
765
+ throw new Error("Keep walk guidance within 500 characters.");
766
+ return {
767
+ duration_minutes: value.duration_minutes,
768
+ distance_km: value.distance_km,
769
+ leash: value.leash,
770
+ size_guidance: value.size_guidance,
771
+ accessibility: value.accessibility
772
+ };
773
+ }
774
+
755
775
  // src/meet.ts
756
776
  var MEET_ACTIVITIES = [
757
777
  { value: "coffee", label: "Coffee" },
@@ -811,6 +831,13 @@ function prepareMeetup(input, places, now = /* @__PURE__ */ new Date()) {
811
831
  if (!notes.ok) throw new Error(notes.reason);
812
832
  const capacity = Number(input.capacity ?? 6);
813
833
  if (!Number.isInteger(capacity) || capacity < 2 || capacity > 12) throw new Error("Choose a group size from 2 to 12.");
834
+ const walk = activity === "dogs" && input.walk ? preparePawWalk(input.walk) : void 0;
835
+ if (walk) for (const guidance of [walk.size_guidance, walk.accessibility]) {
836
+ if (guidance.trim()) {
837
+ const screened = screenMessage(guidance);
838
+ if (!screened.ok) throw new Error(screened.reason);
839
+ }
840
+ }
814
841
  return {
815
842
  activity,
816
843
  activityLabel: label,
@@ -819,7 +846,8 @@ function prepareMeetup(input, places, now = /* @__PURE__ */ new Date()) {
819
846
  placeDetail: place.detail,
820
847
  startsAt: new Date(starts).toISOString(),
821
848
  notes: notes.text,
822
- capacity
849
+ capacity,
850
+ ...walk ? { walk } : {}
823
851
  };
824
852
  }
825
853
 
package/dist/index.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { a as PublicationTheme, P as PublicationInput, N as NewsPublication, F as FeatureName, b as NewsItem, H as HomepageSelection, c as NearbyUpdate, E as EditorialSection, d as NewsArticle, C as CouponOffer } from './types-BJFCWWi0.cjs';
2
2
  export { A as ArticleCitation, e as CardType, f as CategoryRef, g as CouponSettings, h as CoverImageMetadata, i as FEATURE_NAMES, j as FeatureFlags, k as NewsFeed, l as NewsLayoutId, m as PublicationModules, R as ReferralSettings, S as StoryDisplay, T as TagRef, V as VerifiedCard, n as VerifiedCardAction, o as VerifiedCardFact, p as VerifiedCardImage } from './types-BJFCWWi0.cjs';
3
- export { M as MEET_ACTIVITIES, b as MeetActivity, c as MeetupInput, a as PreparedMeetup, P as PublicPlace, d as activityLabel, e as canHostMeetup, i as isAdult, p as prepareMeetup, s as screenMessage } from './meet-RWmfj3I3.cjs';
3
+ export { M as MEET_ACTIVITIES, b as MeetActivity, c as MeetupInput, a as PreparedMeetup, P as PublicPlace, d as activityLabel, e as canHostMeetup, i as isAdult, p as prepareMeetup, s as screenMessage } from './meet-CO9Unz5M.cjs';
4
4
  export { b as CLASSIFIED_CATEGORIES, c as ClassifiedCategory, C as ClassifiedListing, E as EmploymentType, J as JOB_EMPLOYMENT_TYPES, d as PreparedClassified, e as PreparedJob, P as PublicDeal, f as PublicDealOffer, a as PublicJob, g as categoryLabel, h as classifiedPath, i as classifiedSearchPath, j as clipChars, k as dealDollars, l as dealGoPath, m as dealsFeedPath, n as employmentLabel, o as isClassifiedCategory, p as isEmploymentType, q as jobEmployerBody, r as jobOpeningBody, s as jobPostingBody, t as prepareClassified, u as prepareJobPost, v as publicJobPath, w as publicJobsPath } from './marketplace-29i5w4LS.cjs';
5
5
  export { b as PublicationRecord, P as PublicationSnapshot, S as SnapshotHooks, c as SyncSource, a as SyncedPublication, d as acceptRemoteRecord, e as acceptSnapshot, p as parseSnapshot, f as publicationFromSnapshot, g as publicationRecord, s as snapshotFromRecord, h as syncPublication } from './snapshot-Dx4Lv-lB.cjs';
6
6
  import { CookieCategoryDefinition, CookieConsentRecord } from '@scalemule/compliance';
@@ -11,12 +11,13 @@ export { ThemeToggle, ThemeToggleProps } from './theme-toggle.cjs';
11
11
  export { EDITORIAL_PRINCIPLES, EditorialPrinciple, NETWORK_PARENT, NetworkParent, PublicationNetworkItem, communityPublications, findPublicationByHost, findPublicationBySlug, getNetworkPublicationUrl, listedPublications, localPublications } from './network.cjs';
12
12
  export { LocalNetworkBar, LocalNetworkBarProps } from './network-bar.cjs';
13
13
  export { NetworkCopyrightNotice, NetworkCopyrightNoticeProps } from './network-copyright.cjs';
14
- import * as react from 'react';
14
+ import * as React from 'react';
15
15
  export { VerifiedCardComponent, VerifiedCardSection, getArticleCards, isSafeActionUrl } from './verified-card.cjs';
16
16
  export { C as CommunityMapArticleEmbed, c as communityMapEmbeds } from './community-maps-DKcYhQYN.cjs';
17
17
  export { C as ContentBlock, S as StructuredDocument, a as StructuredMedia, f as formatArtworkCaption, p as parseDocumentBlocks, r as renderArticleBlocksToHtml, s as sanitizeInlineMarkdown } from './article-blocks-DsabIDmH.cjs';
18
18
  import { M as Measurement } from './sponsorships-CtnBe3S8.cjs';
19
19
  export { a as Campaign, b as CampaignStatus, c as CampaignTarget, C as Creative, d as Placement, e as PlacementType, P as PublicAcknowledgment, S as SPONSORSHIP_OFFERINGS, f as SPONSORSHIP_POLICY, g as SponsorParty, p as placementAvailable, s as safeSponsorUrl } from './sponsorships-CtnBe3S8.cjs';
20
+ import './pets.cjs';
20
21
 
21
22
  /** Walnut Creek Times broadsheet colors. A paper overrides only what it changes. */
22
23
  declare const BROADSHEET_THEME: PublicationTheme;
@@ -424,7 +425,7 @@ declare function subscribeTheme(listener: () => void): () => void;
424
425
  declare function themeInitScript(): string;
425
426
 
426
427
  /** A reader projection, never an internal reporting package. */
427
- declare function ArticleProvenance({ metadata }: Pick<NewsArticle, 'metadata'>): react.JSX.Element | null;
428
+ declare function ArticleProvenance({ metadata }: Pick<NewsArticle, 'metadata'>): React.JSX.Element | null;
428
429
  declare function readerSources(input: unknown): {
429
430
  url: string;
430
431
  title?: string;
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { a as PublicationTheme, P as PublicationInput, N as NewsPublication, F as FeatureName, b as NewsItem, H as HomepageSelection, c as NearbyUpdate, E as EditorialSection, d as NewsArticle, C as CouponOffer } from './types-BJFCWWi0.js';
2
2
  export { A as ArticleCitation, e as CardType, f as CategoryRef, g as CouponSettings, h as CoverImageMetadata, i as FEATURE_NAMES, j as FeatureFlags, k as NewsFeed, l as NewsLayoutId, m as PublicationModules, R as ReferralSettings, S as StoryDisplay, T as TagRef, V as VerifiedCard, n as VerifiedCardAction, o as VerifiedCardFact, p as VerifiedCardImage } from './types-BJFCWWi0.js';
3
- export { M as MEET_ACTIVITIES, b as MeetActivity, c as MeetupInput, a as PreparedMeetup, P as PublicPlace, d as activityLabel, e as canHostMeetup, i as isAdult, p as prepareMeetup, s as screenMessage } from './meet-RWmfj3I3.js';
3
+ export { M as MEET_ACTIVITIES, b as MeetActivity, c as MeetupInput, a as PreparedMeetup, P as PublicPlace, d as activityLabel, e as canHostMeetup, i as isAdult, p as prepareMeetup, s as screenMessage } from './meet-BWpxY20X.js';
4
4
  export { b as CLASSIFIED_CATEGORIES, c as ClassifiedCategory, C as ClassifiedListing, E as EmploymentType, J as JOB_EMPLOYMENT_TYPES, d as PreparedClassified, e as PreparedJob, P as PublicDeal, f as PublicDealOffer, a as PublicJob, g as categoryLabel, h as classifiedPath, i as classifiedSearchPath, j as clipChars, k as dealDollars, l as dealGoPath, m as dealsFeedPath, n as employmentLabel, o as isClassifiedCategory, p as isEmploymentType, q as jobEmployerBody, r as jobOpeningBody, s as jobPostingBody, t as prepareClassified, u as prepareJobPost, v as publicJobPath, w as publicJobsPath } from './marketplace-29i5w4LS.js';
5
5
  export { b as PublicationRecord, P as PublicationSnapshot, S as SnapshotHooks, c as SyncSource, a as SyncedPublication, d as acceptRemoteRecord, e as acceptSnapshot, p as parseSnapshot, f as publicationFromSnapshot, g as publicationRecord, s as snapshotFromRecord, h as syncPublication } from './snapshot-DmRw8G_B.js';
6
6
  import { CookieCategoryDefinition, CookieConsentRecord } from '@scalemule/compliance';
@@ -11,12 +11,13 @@ export { ThemeToggle, ThemeToggleProps } from './theme-toggle.js';
11
11
  export { EDITORIAL_PRINCIPLES, EditorialPrinciple, NETWORK_PARENT, NetworkParent, PublicationNetworkItem, communityPublications, findPublicationByHost, findPublicationBySlug, getNetworkPublicationUrl, listedPublications, localPublications } from './network.js';
12
12
  export { LocalNetworkBar, LocalNetworkBarProps } from './network-bar.js';
13
13
  export { NetworkCopyrightNotice, NetworkCopyrightNoticeProps } from './network-copyright.js';
14
- import * as react from 'react';
14
+ import * as React from 'react';
15
15
  export { VerifiedCardComponent, VerifiedCardSection, getArticleCards, isSafeActionUrl } from './verified-card.js';
16
16
  export { C as CommunityMapArticleEmbed, c as communityMapEmbeds } from './community-maps-DKcYhQYN.js';
17
17
  export { C as ContentBlock, S as StructuredDocument, a as StructuredMedia, f as formatArtworkCaption, p as parseDocumentBlocks, r as renderArticleBlocksToHtml, s as sanitizeInlineMarkdown } from './article-blocks-DsabIDmH.js';
18
18
  import { M as Measurement } from './sponsorships-CtnBe3S8.js';
19
19
  export { a as Campaign, b as CampaignStatus, c as CampaignTarget, C as Creative, d as Placement, e as PlacementType, P as PublicAcknowledgment, S as SPONSORSHIP_OFFERINGS, f as SPONSORSHIP_POLICY, g as SponsorParty, p as placementAvailable, s as safeSponsorUrl } from './sponsorships-CtnBe3S8.js';
20
+ import './pets.js';
20
21
 
21
22
  /** Walnut Creek Times broadsheet colors. A paper overrides only what it changes. */
22
23
  declare const BROADSHEET_THEME: PublicationTheme;
@@ -424,7 +425,7 @@ declare function subscribeTheme(listener: () => void): () => void;
424
425
  declare function themeInitScript(): string;
425
426
 
426
427
  /** A reader projection, never an internal reporting package. */
427
- declare function ArticleProvenance({ metadata }: Pick<NewsArticle, 'metadata'>): react.JSX.Element | null;
428
+ declare function ArticleProvenance({ metadata }: Pick<NewsArticle, 'metadata'>): React.JSX.Element | null;
428
429
  declare function readerSources(input: unknown): {
429
430
  url: string;
430
431
  title?: string;
package/dist/index.js CHANGED
@@ -1,18 +1,19 @@
1
- export { NetworkCopyrightNotice } from './chunk-WAC6ATNP.js';
2
1
  export { CURATED_COMMUNITY_CARDS, VerifiedCardComponent, VerifiedCardSection, getArticleCards, isSafeActionUrl } from './chunk-FMCHQI7K.js';
3
- export { MEET_ACTIVITIES, activityLabel, canHostMeetup, isAdult, prepareMeetup, screenMessage } from './chunk-GB36YM56.js';
4
2
  export { CookieConsentBanner } from './chunk-GOWOYMSG.js';
5
3
  export { CookieSettingsView } from './chunk-UL2Q3N26.js';
6
4
  export { THEME_COOKIE, THEME_EVENT, THEME_MAX_AGE_SECONDS, THEME_STORAGE_KEY, ThemeToggle, applyTheme, clearTheme, getStoredTheme, getSystemTheme, resolveEffectiveTheme, setTheme, subscribeTheme, themeInitScript } from './chunk-NQD3M7ZY.js';
7
5
  export { LocalNetworkBar } from './chunk-2XSW7JZS.js';
6
+ export { NetworkCopyrightNotice } from './chunk-WAC6ATNP.js';
8
7
  import { localPublications } from './chunk-JV76ZEIA.js';
9
8
  export { COOKIE_CATEGORIES, COOKIE_CONSENT_BACKUP_KEY, COOKIE_CONSENT_EVENT, COOKIE_CONSENT_KEY, COOKIE_CONSENT_MAX_AGE_SECONDS, DEFAULT_CONSENT_HUB_URL, DEFAULT_PREFERENCES_ACCEPTED, DEFAULT_PREFERENCES_REJECTED, EDITORIAL_PRINCIPLES, EU_EEA_UK_COUNTRIES, NETWORK_CONSENT_STORAGE_KEY, NETWORK_PARENT, acceptAllCookies, checkUrlConsentBridge, clearCookieConsent, communityPublications, decorateNetworkUrl, findPublicationByHost, findPublicationBySlug, getCookieConsent, getNetworkPublicationUrl, hasConsented, isCategoryAllowed, isGeoConsentRequired, listedPublications, localPublications, queryNetworkConsentHub, recordConsentToCompliance, rejectOptionalCookies, setCookieConsent, setNetworkConsentHub } from './chunk-JV76ZEIA.js';
10
- export { SPONSORSHIP_OFFERINGS, SPONSORSHIP_POLICY, placementAvailable, safeSponsorUrl } from './chunk-66GI2IX6.js';
11
9
  export { communityMapEmbeds } from './chunk-IMYBSG7J.js';
12
10
  export { formatArtworkCaption, parseDocumentBlocks, renderArticleBlocksToHtml, sanitizeInlineMarkdown } from './chunk-OISLCYER.js';
13
11
  import { definePublication } from './chunk-57YVL6BD.js';
14
12
  export { BROADSHEET_THEME, FEATURE_NAMES, LAYOUT_COOKIE, acceptRemoteRecord, acceptSnapshot, definePublication, featureEnabled, parseSnapshot, publicationFromSnapshot, publicationRecord, resolveLayout, snapshotFromRecord, syncPublication } from './chunk-57YVL6BD.js';
15
13
  export { CLASSIFIED_CATEGORIES, JOB_EMPLOYMENT_TYPES, categoryLabel, classifiedPath, classifiedSearchPath, clipChars, dealDollars, dealGoPath, dealsFeedPath, employmentLabel, isClassifiedCategory, isEmploymentType, jobEmployerBody, jobOpeningBody, jobPostingBody, prepareClassified, prepareJobPost, publicJobPath, publicJobsPath } from './chunk-C7ZPLH2K.js';
14
+ export { MEET_ACTIVITIES, activityLabel, canHostMeetup, isAdult, prepareMeetup, screenMessage } from './chunk-2MEYHM7M.js';
15
+ export { SPONSORSHIP_OFFERINGS, SPONSORSHIP_POLICY, placementAvailable, safeSponsorUrl } from './chunk-66GI2IX6.js';
16
+ import './chunk-MBBPEFDA.js';
16
17
  import { jsxs, jsx } from 'react/jsx-runtime';
17
18
 
18
19
  // src/editorial.ts
@@ -1,10 +1,10 @@
1
- import * as react from 'react';
1
+ import * as React from 'react';
2
2
 
3
3
  declare function JobPostForm({ towns }: {
4
4
  towns: string[];
5
- }): react.JSX.Element;
5
+ }): React.JSX.Element;
6
6
  declare function ClassifiedPostForm({ towns }: {
7
7
  towns: string[];
8
- }): react.JSX.Element;
8
+ }): React.JSX.Element;
9
9
 
10
10
  export { ClassifiedPostForm, JobPostForm };
@@ -1,10 +1,10 @@
1
- import * as react from 'react';
1
+ import * as React from 'react';
2
2
 
3
3
  declare function JobPostForm({ towns }: {
4
4
  towns: string[];
5
- }): react.JSX.Element;
5
+ }): React.JSX.Element;
6
6
  declare function ClassifiedPostForm({ towns }: {
7
7
  towns: string[];
8
- }): react.JSX.Element;
8
+ }): React.JSX.Element;
9
9
 
10
10
  export { ClassifiedPostForm, JobPostForm };
@@ -1,22 +1,22 @@
1
- import * as react from 'react';
1
+ import * as React from 'react';
2
2
  import { C as ClassifiedListing, P as PublicDeal, a as PublicJob } from './marketplace-29i5w4LS.cjs';
3
3
 
4
4
  declare function JobsBoard({ region, jobs, query }: {
5
5
  region: string;
6
6
  jobs: PublicJob[];
7
7
  query: string;
8
- }): react.JSX.Element;
8
+ }): React.JSX.Element;
9
9
  declare function JobArticle({ job }: {
10
10
  job: PublicJob;
11
- }): react.JSX.Element;
11
+ }): React.JSX.Element;
12
12
  declare function ClassifiedsBoard({ region, listings, category, deals, }: {
13
13
  region: string;
14
14
  listings: ClassifiedListing[];
15
15
  category: string;
16
16
  deals?: PublicDeal[];
17
- }): react.JSX.Element;
17
+ }): React.JSX.Element;
18
18
  declare function ClassifiedArticle({ listing }: {
19
19
  listing: ClassifiedListing;
20
- }): react.JSX.Element;
20
+ }): React.JSX.Element;
21
21
 
22
22
  export { ClassifiedArticle, ClassifiedsBoard, JobArticle, JobsBoard };
@@ -1,22 +1,22 @@
1
- import * as react from 'react';
1
+ import * as React from 'react';
2
2
  import { C as ClassifiedListing, P as PublicDeal, a as PublicJob } from './marketplace-29i5w4LS.js';
3
3
 
4
4
  declare function JobsBoard({ region, jobs, query }: {
5
5
  region: string;
6
6
  jobs: PublicJob[];
7
7
  query: string;
8
- }): react.JSX.Element;
8
+ }): React.JSX.Element;
9
9
  declare function JobArticle({ job }: {
10
10
  job: PublicJob;
11
- }): react.JSX.Element;
11
+ }): React.JSX.Element;
12
12
  declare function ClassifiedsBoard({ region, listings, category, deals, }: {
13
13
  region: string;
14
14
  listings: ClassifiedListing[];
15
15
  category: string;
16
16
  deals?: PublicDeal[];
17
- }): react.JSX.Element;
17
+ }): React.JSX.Element;
18
18
  declare function ClassifiedArticle({ listing }: {
19
19
  listing: ClassifiedListing;
20
- }): react.JSX.Element;
20
+ }): React.JSX.Element;
21
21
 
22
22
  export { ClassifiedArticle, ClassifiedsBoard, JobArticle, JobsBoard };
@@ -1,4 +1,7 @@
1
+ import { PawWalkDetails } from './pets.js';
2
+
1
3
  /** Rules for in-person meetups and the paper's chat. */
4
+
2
5
  declare const MEET_ACTIVITIES: readonly [{
3
6
  readonly value: "coffee";
4
7
  readonly label: "Coffee";
@@ -52,6 +55,7 @@ type MeetupInput = {
52
55
  startsAt?: unknown;
53
56
  notes?: unknown;
54
57
  capacity?: unknown;
58
+ walk?: Partial<PawWalkDetails>;
55
59
  };
56
60
  type PreparedMeetup = {
57
61
  activity: MeetActivity;
@@ -62,6 +66,7 @@ type PreparedMeetup = {
62
66
  startsAt: string;
63
67
  notes: string;
64
68
  capacity: number;
69
+ walk?: PawWalkDetails;
65
70
  };
66
71
  declare function isAdult(bornOn: string, now?: Date): boolean;
67
72
  declare function canHostMeetup(accountCreatedAt: string, now?: Date): boolean;
@@ -1,4 +1,7 @@
1
+ import { PawWalkDetails } from './pets.cjs';
2
+
1
3
  /** Rules for in-person meetups and the paper's chat. */
4
+
2
5
  declare const MEET_ACTIVITIES: readonly [{
3
6
  readonly value: "coffee";
4
7
  readonly label: "Coffee";
@@ -52,6 +55,7 @@ type MeetupInput = {
52
55
  startsAt?: unknown;
53
56
  notes?: unknown;
54
57
  capacity?: unknown;
58
+ walk?: Partial<PawWalkDetails>;
55
59
  };
56
60
  type PreparedMeetup = {
57
61
  activity: MeetActivity;
@@ -62,6 +66,7 @@ type PreparedMeetup = {
62
66
  startsAt: string;
63
67
  notes: string;
64
68
  capacity: number;
69
+ walk?: PawWalkDetails;
65
70
  };
66
71
  declare function isAdult(bornOn: string, now?: Date): boolean;
67
72
  declare function canHostMeetup(accountCreatedAt: string, now?: Date): boolean;