@scalemule/news-publication 0.0.24 → 0.0.25

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.
@@ -143,13 +143,19 @@ var COOKIE_CATEGORIES = [
143
143
  ];
144
144
 
145
145
  // src/network.ts
146
+ var NETWORK_PARENT = {
147
+ name: "Bay Area News Network",
148
+ url: "https://bayareanewsnetwork.com",
149
+ tagline: "Local stories. Stronger communities.",
150
+ description: "The institutional network of independent local publications covering the San Francisco Bay Area."
151
+ };
146
152
  var localPublications = [
147
153
  {
148
154
  slug: "bayareachronicle",
149
155
  name: "Bay Area Chronicle",
150
156
  url: "https://bayareachronicle.com",
151
157
  area: "San Francisco Bay Area",
152
- description: "The parent home for our local community publications."
158
+ description: "Regional reporting and in-depth investigations covering the nine-county San Francisco Bay Area."
153
159
  },
154
160
  {
155
161
  slug: "concordchronicle",
@@ -256,7 +262,7 @@ var NETWORK_HOSTNAMES = new Set(
256
262
  function isNetworkHostname(hostname) {
257
263
  if (!hostname) return false;
258
264
  const clean = hostname.replace(/^www\./, "").toLowerCase();
259
- return NETWORK_HOSTNAMES.has(clean) || clean.endsWith(".bayareachronicle.com") || clean.endsWith(".napsite.com") || clean.endsWith(".site.scalemule.com");
265
+ return clean === "bayareanewsnetwork.com" || clean.endsWith(".bayareanewsnetwork.com") || NETWORK_HOSTNAMES.has(clean) || clean.endsWith(".bayareachronicle.com") || clean.endsWith(".napsite.com") || clean.endsWith(".site.scalemule.com");
260
266
  }
261
267
 
262
- export { COOKIE_CATEGORIES, communityPublications, findPublicationByHost, findPublicationBySlug, getNetworkPublicationUrl, isNetworkHostname, listedPublications, localPublications, recordConsentToCompliance, setupNetworkConsentDelegation };
268
+ export { COOKIE_CATEGORIES, NETWORK_PARENT, communityPublications, findPublicationByHost, findPublicationBySlug, getNetworkPublicationUrl, isNetworkHostname, listedPublications, localPublications, recordConsentToCompliance, setupNetworkConsentDelegation };
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { setupNetworkConsentDelegation, checkUrlConsentBridge, hasConsented, isGeoConsentRequired, queryNetworkConsentHub, DEFAULT_CONSENT_HUB_URL, acceptAllCookies, rejectOptionalCookies, COOKIE_CONSENT_EVENT, recordConsentToCompliance, setNetworkConsentHub } from './chunk-2IYYEFLD.js';
2
+ import { setupNetworkConsentDelegation, checkUrlConsentBridge, hasConsented, isGeoConsentRequired, queryNetworkConsentHub, DEFAULT_CONSENT_HUB_URL, acceptAllCookies, rejectOptionalCookies, COOKIE_CONSENT_EVENT, recordConsentToCompliance, setNetworkConsentHub } from './chunk-56TU57OO.js';
3
3
  import { useState, useEffect } from 'react';
4
4
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
5
5
 
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { setupNetworkConsentDelegation, COOKIE_CONSENT_EVENT, listedPublications, decorateNetworkUrl } from './chunk-2IYYEFLD.js';
2
+ import { setupNetworkConsentDelegation, COOKIE_CONSENT_EVENT, listedPublications, decorateNetworkUrl } from './chunk-56TU57OO.js';
3
3
  import { useState, useId, useRef, useEffect } from 'react';
4
4
  import { jsx, jsxs } from 'react/jsx-runtime';
5
5
 
@@ -0,0 +1,51 @@
1
+ import { NETWORK_PARENT } from './chunk-56TU57OO.js';
2
+ import { jsxs, jsx } from 'react/jsx-runtime';
3
+
4
+ function NetworkCopyrightNotice({
5
+ className = "",
6
+ style,
7
+ publicationName,
8
+ showPublicationNotice = false,
9
+ targetBlank = true,
10
+ prefix = "\xA9",
11
+ showRightsReserved = true
12
+ }) {
13
+ const currentYear = (/* @__PURE__ */ new Date()).getFullYear();
14
+ return /* @__PURE__ */ jsxs("div", { className: `sm-network-copyright ${className}`.trim(), style, children: [
15
+ showPublicationNotice && publicationName && /* @__PURE__ */ jsxs("p", { className: "sm-network-publication-attribution", children: [
16
+ publicationName,
17
+ " is a member publication of the",
18
+ " ",
19
+ /* @__PURE__ */ jsx(
20
+ "a",
21
+ {
22
+ href: NETWORK_PARENT.url,
23
+ target: targetBlank ? "_blank" : void 0,
24
+ rel: targetBlank ? "noopener noreferrer" : void 0,
25
+ className: "sm-network-parent-link",
26
+ children: NETWORK_PARENT.name
27
+ }
28
+ ),
29
+ "."
30
+ ] }),
31
+ /* @__PURE__ */ jsxs("p", { className: "sm-network-legal", children: [
32
+ prefix,
33
+ " ",
34
+ currentYear,
35
+ " ",
36
+ /* @__PURE__ */ jsx(
37
+ "a",
38
+ {
39
+ href: NETWORK_PARENT.url,
40
+ target: targetBlank ? "_blank" : void 0,
41
+ rel: targetBlank ? "noopener noreferrer" : void 0,
42
+ className: "sm-network-parent-link",
43
+ children: NETWORK_PARENT.name
44
+ }
45
+ ),
46
+ showRightsReserved ? ". All rights reserved." : ""
47
+ ] })
48
+ ] });
49
+ }
50
+
51
+ export { NetworkCopyrightNotice };
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { getCookieConsent, DEFAULT_PREFERENCES_ACCEPTED, COOKIE_CATEGORIES, setCookieConsent, recordConsentToCompliance, DEFAULT_PREFERENCES_REJECTED } from './chunk-2IYYEFLD.js';
2
+ import { getCookieConsent, DEFAULT_PREFERENCES_ACCEPTED, COOKIE_CATEGORIES, setCookieConsent, recordConsentToCompliance, DEFAULT_PREFERENCES_REJECTED } from './chunk-56TU57OO.js';
3
3
  import { useState, useEffect } from 'react';
4
4
  import { jsxs, jsx } from 'react/jsx-runtime';
5
5
 
@@ -12,7 +12,7 @@ var localPublications = [
12
12
  name: "Bay Area Chronicle",
13
13
  url: "https://bayareachronicle.com",
14
14
  area: "San Francisco Bay Area",
15
- description: "The parent home for our local community publications."
15
+ description: "Regional reporting and in-depth investigations covering the nine-county San Francisco Bay Area."
16
16
  },
17
17
  {
18
18
  slug: "concordchronicle",
@@ -104,7 +104,7 @@ var NETWORK_HOSTNAMES = new Set(
104
104
  function isNetworkHostname(hostname) {
105
105
  if (!hostname) return false;
106
106
  const clean = hostname.replace(/^www\./, "").toLowerCase();
107
- return NETWORK_HOSTNAMES.has(clean) || clean.endsWith(".bayareachronicle.com") || clean.endsWith(".napsite.com") || clean.endsWith(".site.scalemule.com");
107
+ return clean === "bayareanewsnetwork.com" || clean.endsWith(".bayareanewsnetwork.com") || NETWORK_HOSTNAMES.has(clean) || clean.endsWith(".bayareachronicle.com") || clean.endsWith(".napsite.com") || clean.endsWith(".site.scalemule.com");
108
108
  }
109
109
 
110
110
  // src/cookies.ts
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- export { CookieConsentBanner } from './chunk-HTMIFWNA.js';
3
- import './chunk-2IYYEFLD.js';
2
+ export { CookieConsentBanner } from './chunk-DC6RMIYL.js';
3
+ import './chunk-56TU57OO.js';
@@ -12,7 +12,7 @@ var localPublications = [
12
12
  name: "Bay Area Chronicle",
13
13
  url: "https://bayareachronicle.com",
14
14
  area: "San Francisco Bay Area",
15
- description: "The parent home for our local community publications."
15
+ description: "Regional reporting and in-depth investigations covering the nine-county San Francisco Bay Area."
16
16
  },
17
17
  {
18
18
  slug: "concordchronicle",
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- export { CookieSettingsView } from './chunk-3MFKPHO3.js';
3
- import './chunk-2IYYEFLD.js';
2
+ export { CookieSettingsView } from './chunk-XDGBMMLD.js';
3
+ import './chunk-56TU57OO.js';
package/dist/index.cjs CHANGED
@@ -811,13 +811,19 @@ async function syncPublication(input) {
811
811
  }
812
812
 
813
813
  // src/network.ts
814
+ var NETWORK_PARENT = {
815
+ name: "Bay Area News Network",
816
+ url: "https://bayareanewsnetwork.com",
817
+ tagline: "Local stories. Stronger communities.",
818
+ description: "The institutional network of independent local publications covering the San Francisco Bay Area."
819
+ };
814
820
  var localPublications = [
815
821
  {
816
822
  slug: "bayareachronicle",
817
823
  name: "Bay Area Chronicle",
818
824
  url: "https://bayareachronicle.com",
819
825
  area: "San Francisco Bay Area",
820
- description: "The parent home for our local community publications."
826
+ description: "Regional reporting and in-depth investigations covering the nine-county San Francisco Bay Area."
821
827
  },
822
828
  {
823
829
  slug: "concordchronicle",
@@ -924,7 +930,7 @@ var NETWORK_HOSTNAMES = new Set(
924
930
  function isNetworkHostname(hostname) {
925
931
  if (!hostname) return false;
926
932
  const clean = hostname.replace(/^www\./, "").toLowerCase();
927
- return NETWORK_HOSTNAMES.has(clean) || clean.endsWith(".bayareachronicle.com") || clean.endsWith(".napsite.com") || clean.endsWith(".site.scalemule.com");
933
+ return clean === "bayareanewsnetwork.com" || clean.endsWith(".bayareanewsnetwork.com") || NETWORK_HOSTNAMES.has(clean) || clean.endsWith(".bayareachronicle.com") || clean.endsWith(".napsite.com") || clean.endsWith(".site.scalemule.com");
928
934
  }
929
935
 
930
936
  // src/cookies.ts
@@ -1785,6 +1791,52 @@ function LocalNetworkBar({ currentSlug, className = "", style }) {
1785
1791
  }
1786
1792
  );
1787
1793
  }
1794
+ function NetworkCopyrightNotice({
1795
+ className = "",
1796
+ style,
1797
+ publicationName,
1798
+ showPublicationNotice = false,
1799
+ targetBlank = true,
1800
+ prefix = "\xA9",
1801
+ showRightsReserved = true
1802
+ }) {
1803
+ const currentYear = (/* @__PURE__ */ new Date()).getFullYear();
1804
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `sm-network-copyright ${className}`.trim(), style, children: [
1805
+ showPublicationNotice && publicationName && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "sm-network-publication-attribution", children: [
1806
+ publicationName,
1807
+ " is a member publication of the",
1808
+ " ",
1809
+ /* @__PURE__ */ jsxRuntime.jsx(
1810
+ "a",
1811
+ {
1812
+ href: NETWORK_PARENT.url,
1813
+ target: targetBlank ? "_blank" : void 0,
1814
+ rel: targetBlank ? "noopener noreferrer" : void 0,
1815
+ className: "sm-network-parent-link",
1816
+ children: NETWORK_PARENT.name
1817
+ }
1818
+ ),
1819
+ "."
1820
+ ] }),
1821
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "sm-network-legal", children: [
1822
+ prefix,
1823
+ " ",
1824
+ currentYear,
1825
+ " ",
1826
+ /* @__PURE__ */ jsxRuntime.jsx(
1827
+ "a",
1828
+ {
1829
+ href: NETWORK_PARENT.url,
1830
+ target: targetBlank ? "_blank" : void 0,
1831
+ rel: targetBlank ? "noopener noreferrer" : void 0,
1832
+ className: "sm-network-parent-link",
1833
+ children: NETWORK_PARENT.name
1834
+ }
1835
+ ),
1836
+ showRightsReserved ? ". All rights reserved." : ""
1837
+ ] })
1838
+ ] });
1839
+ }
1788
1840
  function ArticleProvenance({ metadata }) {
1789
1841
  const origin = metadata?.reporting?.canonical_origin || metadata?.editorial_origin;
1790
1842
  const reporting = metadata?.reporting;
@@ -2726,7 +2778,9 @@ exports.JOB_EMPLOYMENT_TYPES = JOB_EMPLOYMENT_TYPES;
2726
2778
  exports.LAYOUT_COOKIE = LAYOUT_COOKIE;
2727
2779
  exports.LocalNetworkBar = LocalNetworkBar;
2728
2780
  exports.MEET_ACTIVITIES = MEET_ACTIVITIES;
2781
+ exports.NETWORK_PARENT = NETWORK_PARENT;
2729
2782
  exports.NEWS_CACHE = NEWS_CACHE;
2783
+ exports.NetworkCopyrightNotice = NetworkCopyrightNotice;
2730
2784
  exports.NewsError = NewsError;
2731
2785
  exports.SESSION_IDLE_MS = SESSION_IDLE_MS;
2732
2786
  exports.THEME_COOKIE = THEME_COOKIE;
package/dist/index.d.cts CHANGED
@@ -8,8 +8,9 @@ export { COOKIE_CONSENT_BACKUP_KEY, COOKIE_CONSENT_EVENT, COOKIE_CONSENT_KEY, CO
8
8
  export { CookieConsentBanner, CookieConsentBannerProps } from './cookie-consent-banner.cjs';
9
9
  export { CookieSettingsView, CookieSettingsViewProps } from './cookie-settings-view.cjs';
10
10
  export { ThemeToggle, ThemeToggleProps } from './theme-toggle.cjs';
11
- export { PublicationNetworkItem, communityPublications, findPublicationByHost, findPublicationBySlug, getNetworkPublicationUrl, listedPublications, localPublications } from './network.cjs';
11
+ export { NETWORK_PARENT, NetworkParent, PublicationNetworkItem, communityPublications, findPublicationByHost, findPublicationBySlug, getNetworkPublicationUrl, listedPublications, localPublications } from './network.cjs';
12
12
  export { LocalNetworkBar, LocalNetworkBarProps } from './network-bar.cjs';
13
+ export { NetworkCopyrightNotice, NetworkCopyrightNoticeProps } from './network-copyright.cjs';
13
14
  import * as react from 'react';
14
15
  export { VerifiedCardComponent, VerifiedCardSection, getArticleCards, isSafeActionUrl } from './verified-card.cjs';
15
16
 
package/dist/index.d.ts CHANGED
@@ -8,8 +8,9 @@ export { COOKIE_CONSENT_BACKUP_KEY, COOKIE_CONSENT_EVENT, COOKIE_CONSENT_KEY, CO
8
8
  export { CookieConsentBanner, CookieConsentBannerProps } from './cookie-consent-banner.js';
9
9
  export { CookieSettingsView, CookieSettingsViewProps } from './cookie-settings-view.js';
10
10
  export { ThemeToggle, ThemeToggleProps } from './theme-toggle.js';
11
- export { PublicationNetworkItem, communityPublications, findPublicationByHost, findPublicationBySlug, getNetworkPublicationUrl, listedPublications, localPublications } from './network.js';
11
+ export { NETWORK_PARENT, NetworkParent, PublicationNetworkItem, communityPublications, findPublicationByHost, findPublicationBySlug, getNetworkPublicationUrl, listedPublications, localPublications } from './network.js';
12
12
  export { LocalNetworkBar, LocalNetworkBarProps } from './network-bar.js';
13
+ export { NetworkCopyrightNotice, NetworkCopyrightNoticeProps } from './network-copyright.js';
13
14
  import * as react from 'react';
14
15
  export { VerifiedCardComponent, VerifiedCardSection, getArticleCards, isSafeActionUrl } from './verified-card.js';
15
16
 
package/dist/index.js CHANGED
@@ -1,14 +1,15 @@
1
1
  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';
2
- export { LocalNetworkBar } from './chunk-QBT66OVE.js';
2
+ export { LocalNetworkBar } from './chunk-EVAGI7C5.js';
3
+ export { NetworkCopyrightNotice } from './chunk-VRDUSIVG.js';
3
4
  export { CURATED_COMMUNITY_CARDS, VerifiedCardComponent, VerifiedCardSection, getArticleCards, isSafeActionUrl } from './chunk-FMCHQI7K.js';
4
5
  import { definePublication } from './chunk-C7JTEHTH.js';
5
6
  export { BROADSHEET_THEME, FEATURE_NAMES, LAYOUT_COOKIE, acceptRemoteRecord, acceptSnapshot, definePublication, featureEnabled, parseSnapshot, publicationFromSnapshot, publicationRecord, resolveLayout, snapshotFromRecord, syncPublication } from './chunk-C7JTEHTH.js';
6
7
  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';
7
8
  export { MEET_ACTIVITIES, activityLabel, canHostMeetup, isAdult, prepareMeetup, screenMessage } from './chunk-GB36YM56.js';
8
- export { CookieConsentBanner } from './chunk-HTMIFWNA.js';
9
- export { CookieSettingsView } from './chunk-3MFKPHO3.js';
10
- import { localPublications } from './chunk-2IYYEFLD.js';
11
- 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, EU_EEA_UK_COUNTRIES, NETWORK_CONSENT_STORAGE_KEY, acceptAllCookies, checkUrlConsentBridge, clearCookieConsent, communityPublications, decorateNetworkUrl, findPublicationByHost, findPublicationBySlug, getCookieConsent, getNetworkPublicationUrl, hasConsented, isCategoryAllowed, isGeoConsentRequired, listedPublications, localPublications, queryNetworkConsentHub, recordConsentToCompliance, rejectOptionalCookies, setCookieConsent, setNetworkConsentHub } from './chunk-2IYYEFLD.js';
9
+ export { CookieConsentBanner } from './chunk-DC6RMIYL.js';
10
+ export { CookieSettingsView } from './chunk-XDGBMMLD.js';
11
+ import { localPublications } from './chunk-56TU57OO.js';
12
+ 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, 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-56TU57OO.js';
12
13
  import { jsxs, jsx } from 'react/jsx-runtime';
13
14
 
14
15
  // src/preset.ts
@@ -41,7 +41,7 @@ var localPublications = [
41
41
  name: "Bay Area Chronicle",
42
42
  url: "https://bayareachronicle.com",
43
43
  area: "San Francisco Bay Area",
44
- description: "The parent home for our local community publications."
44
+ description: "Regional reporting and in-depth investigations covering the nine-county San Francisco Bay Area."
45
45
  },
46
46
  {
47
47
  slug: "concordchronicle",
@@ -133,7 +133,7 @@ var NETWORK_HOSTNAMES = new Set(
133
133
  function isNetworkHostname(hostname) {
134
134
  if (!hostname) return false;
135
135
  const clean = hostname.replace(/^www\./, "").toLowerCase();
136
- return NETWORK_HOSTNAMES.has(clean) || clean.endsWith(".bayareachronicle.com") || clean.endsWith(".napsite.com") || clean.endsWith(".site.scalemule.com");
136
+ return clean === "bayareanewsnetwork.com" || clean.endsWith(".bayareanewsnetwork.com") || NETWORK_HOSTNAMES.has(clean) || clean.endsWith(".bayareachronicle.com") || clean.endsWith(".napsite.com") || clean.endsWith(".site.scalemule.com");
137
137
  }
138
138
  function LocalNetworkBar({ currentSlug, className = "", style }) {
139
139
  const [open, setOpen] = react.useState(false);
@@ -1,2 +1,2 @@
1
- export { LocalNetworkBar } from './chunk-QBT66OVE.js';
2
- import './chunk-2IYYEFLD.js';
1
+ export { LocalNetworkBar } from './chunk-EVAGI7C5.js';
2
+ import './chunk-56TU57OO.js';
@@ -0,0 +1,154 @@
1
+ 'use strict';
2
+
3
+ require('@scalemule/compliance');
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+
6
+ // src/cookies.ts
7
+
8
+ // src/network.ts
9
+ var NETWORK_PARENT = {
10
+ name: "Bay Area News Network",
11
+ url: "https://bayareanewsnetwork.com"};
12
+ var localPublications = [
13
+ {
14
+ slug: "bayareachronicle",
15
+ name: "Bay Area Chronicle",
16
+ url: "https://bayareachronicle.com",
17
+ area: "San Francisco Bay Area",
18
+ description: "Regional reporting and in-depth investigations covering the nine-county San Francisco Bay Area."
19
+ },
20
+ {
21
+ slug: "concordchronicle",
22
+ name: "Concord Chronicle",
23
+ url: "https://concordchronicle.com",
24
+ area: "Concord",
25
+ description: "A new place for Concord\u2019s local stories, independent businesses and community voices."
26
+ },
27
+ {
28
+ slug: "walnutcreektimes",
29
+ name: "Walnut Creek Times",
30
+ url: "https://walnutcreektimes.com",
31
+ area: "Walnut Creek \xB7 Rossmoor \xB7 Saranap \xB7 Pleasant Hill",
32
+ description: "A new place for Walnut Creek\u2019s local stories, independent businesses and community voices."
33
+ },
34
+ {
35
+ slug: "lamorindapost",
36
+ name: "Lamorinda Post",
37
+ url: "https://lamorindapost.com",
38
+ area: "Orinda \xB7 Lafayette \xB7 Moraga",
39
+ description: "A new home for the neighbors, businesses and community stories of Lamorinda."
40
+ },
41
+ {
42
+ slug: "alamoweekly",
43
+ name: "Alamo Weekly",
44
+ url: "https://alamoweekly.com",
45
+ area: "Alamo",
46
+ description: "A new place for Alamo\u2019s local stories, independent businesses and community voices."
47
+ },
48
+ {
49
+ slug: "danvilletimes",
50
+ name: "Danville Times",
51
+ url: "https://danvilletimes.com",
52
+ area: "Danville",
53
+ description: "A new place for Danville\u2019s local stories, independent businesses and community voices."
54
+ },
55
+ {
56
+ slug: "sanramontimes",
57
+ name: "San Ramon Times",
58
+ url: "https://sanramontimes.com",
59
+ area: "San Ramon",
60
+ description: "A new place for San Ramon\u2019s local stories, independent businesses and community voices."
61
+ },
62
+ {
63
+ slug: "diablovalleynews",
64
+ name: "Diablo Valley News",
65
+ url: "https://diablovalleynews.com",
66
+ area: "Concord \xB7 Walnut Creek \xB7 Pleasant Hill \xB7 Alamo \xB7 Danville \xB7 San Ramon",
67
+ description: "Local stories about the people, businesses and community life of the Diablo Valley."
68
+ },
69
+ {
70
+ slug: "trivalleyweekly",
71
+ name: "Tri-Valley Weekly",
72
+ url: "https://trivalleyweekly.com",
73
+ area: "Alamo \xB7 Danville \xB7 San Ramon \xB7 Dublin \xB7 Pleasanton \xB7 Livermore",
74
+ description: "Local stories about the businesses, people and community life of the Tri-Valley."
75
+ },
76
+ {
77
+ slug: "eastbaypost",
78
+ name: "East Bay Post",
79
+ url: "https://eastbaypost.com",
80
+ area: "The East Bay",
81
+ description: "A new publication connecting the people and neighborhoods of the East Bay."
82
+ },
83
+ {
84
+ slug: "napagate",
85
+ name: "Napa Gate",
86
+ url: "https://napagate.com",
87
+ area: "Napa Valley",
88
+ description: "A new local publication for the people, places and everyday life of Napa Valley.",
89
+ listed: false
90
+ }
91
+ ];
92
+ var listedPublications = localPublications.filter(
93
+ (publication) => !("listed" in publication) || publication.listed
94
+ );
95
+ listedPublications.filter(
96
+ (publication) => publication.slug !== "bayareachronicle"
97
+ );
98
+ new Set(
99
+ localPublications.map((p) => {
100
+ try {
101
+ return new URL(p.url).hostname.replace(/^www\./, "").toLowerCase();
102
+ } catch {
103
+ return `${p.slug}.com`;
104
+ }
105
+ })
106
+ );
107
+ function NetworkCopyrightNotice({
108
+ className = "",
109
+ style,
110
+ publicationName,
111
+ showPublicationNotice = false,
112
+ targetBlank = true,
113
+ prefix = "\xA9",
114
+ showRightsReserved = true
115
+ }) {
116
+ const currentYear = (/* @__PURE__ */ new Date()).getFullYear();
117
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `sm-network-copyright ${className}`.trim(), style, children: [
118
+ showPublicationNotice && publicationName && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "sm-network-publication-attribution", children: [
119
+ publicationName,
120
+ " is a member publication of the",
121
+ " ",
122
+ /* @__PURE__ */ jsxRuntime.jsx(
123
+ "a",
124
+ {
125
+ href: NETWORK_PARENT.url,
126
+ target: targetBlank ? "_blank" : void 0,
127
+ rel: targetBlank ? "noopener noreferrer" : void 0,
128
+ className: "sm-network-parent-link",
129
+ children: NETWORK_PARENT.name
130
+ }
131
+ ),
132
+ "."
133
+ ] }),
134
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "sm-network-legal", children: [
135
+ prefix,
136
+ " ",
137
+ currentYear,
138
+ " ",
139
+ /* @__PURE__ */ jsxRuntime.jsx(
140
+ "a",
141
+ {
142
+ href: NETWORK_PARENT.url,
143
+ target: targetBlank ? "_blank" : void 0,
144
+ rel: targetBlank ? "noopener noreferrer" : void 0,
145
+ className: "sm-network-parent-link",
146
+ children: NETWORK_PARENT.name
147
+ }
148
+ ),
149
+ showRightsReserved ? ". All rights reserved." : ""
150
+ ] })
151
+ ] });
152
+ }
153
+
154
+ exports.NetworkCopyrightNotice = NetworkCopyrightNotice;
@@ -0,0 +1,18 @@
1
+ import react__default, { CSSProperties } from 'react';
2
+
3
+ interface NetworkCopyrightNoticeProps {
4
+ className?: string;
5
+ style?: CSSProperties;
6
+ publicationName?: string;
7
+ showPublicationNotice?: boolean;
8
+ targetBlank?: boolean;
9
+ prefix?: string;
10
+ showRightsReserved?: boolean;
11
+ }
12
+ /**
13
+ * Reusable copyright and institutional network parent attribution notice for all ScaleMule news publications.
14
+ * Links to the official Bay Area News Network institutional website.
15
+ */
16
+ declare function NetworkCopyrightNotice({ className, style, publicationName, showPublicationNotice, targetBlank, prefix, showRightsReserved, }: NetworkCopyrightNoticeProps): react__default.JSX.Element;
17
+
18
+ export { NetworkCopyrightNotice, type NetworkCopyrightNoticeProps };
@@ -0,0 +1,18 @@
1
+ import react__default, { CSSProperties } from 'react';
2
+
3
+ interface NetworkCopyrightNoticeProps {
4
+ className?: string;
5
+ style?: CSSProperties;
6
+ publicationName?: string;
7
+ showPublicationNotice?: boolean;
8
+ targetBlank?: boolean;
9
+ prefix?: string;
10
+ showRightsReserved?: boolean;
11
+ }
12
+ /**
13
+ * Reusable copyright and institutional network parent attribution notice for all ScaleMule news publications.
14
+ * Links to the official Bay Area News Network institutional website.
15
+ */
16
+ declare function NetworkCopyrightNotice({ className, style, publicationName, showPublicationNotice, targetBlank, prefix, showRightsReserved, }: NetworkCopyrightNoticeProps): react__default.JSX.Element;
17
+
18
+ export { NetworkCopyrightNotice, type NetworkCopyrightNoticeProps };
@@ -0,0 +1,2 @@
1
+ export { NetworkCopyrightNotice } from './chunk-VRDUSIVG.js';
2
+ import './chunk-56TU57OO.js';
package/dist/network.cjs CHANGED
@@ -5,13 +5,19 @@ var compliance = require('@scalemule/compliance');
5
5
  // src/cookies.ts
6
6
 
7
7
  // src/network.ts
8
+ var NETWORK_PARENT = {
9
+ name: "Bay Area News Network",
10
+ url: "https://bayareanewsnetwork.com",
11
+ tagline: "Local stories. Stronger communities.",
12
+ description: "The institutional network of independent local publications covering the San Francisco Bay Area."
13
+ };
8
14
  var localPublications = [
9
15
  {
10
16
  slug: "bayareachronicle",
11
17
  name: "Bay Area Chronicle",
12
18
  url: "https://bayareachronicle.com",
13
19
  area: "San Francisco Bay Area",
14
- description: "The parent home for our local community publications."
20
+ description: "Regional reporting and in-depth investigations covering the nine-county San Francisco Bay Area."
15
21
  },
16
22
  {
17
23
  slug: "concordchronicle",
@@ -118,9 +124,10 @@ var NETWORK_HOSTNAMES = new Set(
118
124
  function isNetworkHostname(hostname) {
119
125
  if (!hostname) return false;
120
126
  const clean = hostname.replace(/^www\./, "").toLowerCase();
121
- return NETWORK_HOSTNAMES.has(clean) || clean.endsWith(".bayareachronicle.com") || clean.endsWith(".napsite.com") || clean.endsWith(".site.scalemule.com");
127
+ return clean === "bayareanewsnetwork.com" || clean.endsWith(".bayareanewsnetwork.com") || NETWORK_HOSTNAMES.has(clean) || clean.endsWith(".bayareachronicle.com") || clean.endsWith(".napsite.com") || clean.endsWith(".site.scalemule.com");
122
128
  }
123
129
 
130
+ exports.NETWORK_PARENT = NETWORK_PARENT;
124
131
  exports.communityPublications = communityPublications;
125
132
  exports.findPublicationByHost = findPublicationByHost;
126
133
  exports.findPublicationBySlug = findPublicationBySlug;
@@ -1,3 +1,13 @@
1
+ interface NetworkParent {
2
+ name: string;
3
+ url: string;
4
+ tagline: string;
5
+ description: string;
6
+ }
7
+ /**
8
+ * The institutional parent news organization behind all member publications.
9
+ */
10
+ declare const NETWORK_PARENT: NetworkParent;
1
11
  interface PublicationNetworkItem {
2
12
  slug: string;
3
13
  name: string;
@@ -22,4 +32,4 @@ declare function getNetworkPublicationUrl(slug: string): string | null;
22
32
  /** Check whether a given hostname belongs to any publication in the ScaleMule news network. */
23
33
  declare function isNetworkHostname(hostname: string): boolean;
24
34
 
25
- export { type PublicationNetworkItem, communityPublications, findPublicationByHost, findPublicationBySlug, getNetworkPublicationUrl, isNetworkHostname, listedPublications, localPublications };
35
+ export { NETWORK_PARENT, type NetworkParent, type PublicationNetworkItem, communityPublications, findPublicationByHost, findPublicationBySlug, getNetworkPublicationUrl, isNetworkHostname, listedPublications, localPublications };
package/dist/network.d.ts CHANGED
@@ -1,3 +1,13 @@
1
+ interface NetworkParent {
2
+ name: string;
3
+ url: string;
4
+ tagline: string;
5
+ description: string;
6
+ }
7
+ /**
8
+ * The institutional parent news organization behind all member publications.
9
+ */
10
+ declare const NETWORK_PARENT: NetworkParent;
1
11
  interface PublicationNetworkItem {
2
12
  slug: string;
3
13
  name: string;
@@ -22,4 +32,4 @@ declare function getNetworkPublicationUrl(slug: string): string | null;
22
32
  /** Check whether a given hostname belongs to any publication in the ScaleMule news network. */
23
33
  declare function isNetworkHostname(hostname: string): boolean;
24
34
 
25
- export { type PublicationNetworkItem, communityPublications, findPublicationByHost, findPublicationBySlug, getNetworkPublicationUrl, isNetworkHostname, listedPublications, localPublications };
35
+ export { NETWORK_PARENT, type NetworkParent, type PublicationNetworkItem, communityPublications, findPublicationByHost, findPublicationBySlug, getNetworkPublicationUrl, isNetworkHostname, listedPublications, localPublications };
package/dist/network.js CHANGED
@@ -1 +1 @@
1
- export { communityPublications, findPublicationByHost, findPublicationBySlug, getNetworkPublicationUrl, isNetworkHostname, listedPublications, localPublications } from './chunk-2IYYEFLD.js';
1
+ export { NETWORK_PARENT, communityPublications, findPublicationByHost, findPublicationBySlug, getNetworkPublicationUrl, isNetworkHostname, listedPublications, localPublications } from './chunk-56TU57OO.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scalemule/news-publication",
3
- "version": "0.0.24",
3
+ "version": "0.0.25",
4
4
  "description": "Shared server framework for ScaleMule local news publications. Walnut Creek Times is the broadsheet default; each paper supplies its own identity and feature flags.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -70,6 +70,11 @@
70
70
  "import": "./dist/network-bar.js",
71
71
  "require": "./dist/network-bar.cjs"
72
72
  },
73
+ "./network-copyright": {
74
+ "types": "./dist/network-copyright.d.ts",
75
+ "import": "./dist/network-copyright.js",
76
+ "require": "./dist/network-copyright.cjs"
77
+ },
73
78
  "./verified-card": {
74
79
  "types": "./dist/verified-card.d.ts",
75
80
  "import": "./dist/verified-card.js",