@abcnews/components-storylab 0.0.1

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 ADDED
@@ -0,0 +1,23 @@
1
+ # 📖 🧪 components-storylab
2
+
3
+ A live repo containing reusable components and snippts by Story Lab. This repo is subject to change.
4
+
5
+ ## Components
6
+
7
+ ### initDarkModeIframe
8
+
9
+ Initializes dark mode inside an iframe, synchronizing with the parent site or system preferences.
10
+
11
+ ```ts
12
+ import { initDarkModeIframe } from "@abcnews/components-storylab";
13
+
14
+ // Initialise this as early as possible to prevent flashes
15
+ // of the wrong background colour.
16
+ initDarkModeIframe();
17
+ ```
18
+
19
+ ## Developing
20
+
21
+ See [DEVELOPMENT.md](DEVELOPMENT.md)
22
+
23
+ Note: I haven't been able to `npm link` svelte components into an Aunty project. If you work this out please let me know.
@@ -0,0 +1 @@
1
+ export { default as initDarkModeIframe } from "./utils/initDarkModeIframe/initDarkModeIframe.ts";
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ // Reexport your entry components here
2
+ export { default as initDarkModeIframe } from "./utils/initDarkModeIframe/initDarkModeIframe.js";
@@ -0,0 +1,18 @@
1
+ /* transparent iframes */
2
+ html {
3
+ color-scheme: light;
4
+ --dark-background: #0e0e0e;
5
+ &[data-scheme='dark'] {
6
+ color-scheme: dark;
7
+ }
8
+ }
9
+
10
+ /* hard-coded iframe colours for x-domain interactives */
11
+ html[data-background='force'] {
12
+ background: white;
13
+ color: black;
14
+ &[data-scheme='dark'] {
15
+ background: var(--background, var(--dark-background, black));
16
+ color: white;
17
+ }
18
+ }
@@ -0,0 +1,13 @@
1
+ import "./darkMode.css";
2
+ /**
3
+ * Initializes dark mode inside an iframe, synchronizing with the parent site or system preferences.
4
+ *
5
+ * The function follows this priority:
6
+ * 1. **URL Parameter**: Uses `?scheme=light|dark` if provided (required for Odysseys).
7
+ * 2. **Same-Domain**: Observes the parent's `data-scheme` attribute for instant synchronization.
8
+ * 3. **Cross-Domain/Fallback**: Defaults to the OS `prefers-color-scheme`.
9
+ * - Forces background styling (`data-background="force"`) to bypass app transparency limits.
10
+ * - Hard-codes black background for `newsapp.` referrers.
11
+ * - Listens for system-level prefers-color-scheme changes.
12
+ */
13
+ export default function initDarkModeIframe(): void;
@@ -0,0 +1,56 @@
1
+ import "./darkMode.css";
2
+ /** closest [data-scheme] element to our iframe */
3
+ function getParentBody() {
4
+ try {
5
+ const parentBod = parent.document.body;
6
+ return parentBod !== document.body ? parentBod : null;
7
+ }
8
+ catch (e) {
9
+ return null;
10
+ }
11
+ }
12
+ /**
13
+ * Initializes dark mode inside an iframe, synchronizing with the parent site or system preferences.
14
+ *
15
+ * The function follows this priority:
16
+ * 1. **URL Parameter**: Uses `?scheme=light|dark` if provided (required for Odysseys).
17
+ * 2. **Same-Domain**: Observes the parent's `data-scheme` attribute for instant synchronization.
18
+ * 3. **Cross-Domain/Fallback**: Defaults to the OS `prefers-color-scheme`.
19
+ * - Forces background styling (`data-background="force"`) to bypass app transparency limits.
20
+ * - Hard-codes black background for `newsapp.` referrers.
21
+ * - Listens for system-level prefers-color-scheme changes.
22
+ */
23
+ export default function initDarkModeIframe() {
24
+ const doc = document.documentElement;
25
+ const setScheme = (isDark) => (doc.dataset["scheme"] = isDark ? "dark" : "light");
26
+ const parentBody = getParentBody();
27
+ const params = new URLSearchParams(window.location.search);
28
+ if (params.get("scheme")) {
29
+ // if the iframe has a hard-coded "scheme" in the url, just use that
30
+ // these must be used in Odysseys, otherwise we'll get the site-wide theme.
31
+ setScheme(params.get("scheme") === "dark");
32
+ }
33
+ else if (parentBody) {
34
+ // if same-domain, observe colour scheme preference in the parent
35
+ const sync = () => setScheme(parentBody.getAttribute("data-scheme") === "dark");
36
+ sync();
37
+ const observer = new MutationObserver(sync);
38
+ observer.observe(parentBody, {
39
+ attributes: true,
40
+ attributeFilter: ["data-scheme"],
41
+ });
42
+ }
43
+ else {
44
+ // when x-domain, use prefers-colour-scheme & hard-code the background
45
+ // colour. Works in the app. May be wrong if preference was set in preview.
46
+ doc.dataset["background"] = "force";
47
+ // newsapp background is black
48
+ if (document.referrer.includes("newsapp.")) {
49
+ doc.style.setProperty("--background", "black");
50
+ }
51
+ setScheme(window.matchMedia("(prefers-color-scheme: dark)").matches);
52
+ window
53
+ .matchMedia("(prefers-color-scheme: dark)")
54
+ .addEventListener("change", (e) => setScheme(e.matches));
55
+ }
56
+ }
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@abcnews/components-storylab",
3
+ "version": "0.0.1",
4
+ "scripts": {
5
+ "dev": "vite dev",
6
+ "build": "vite build && npm run prepack",
7
+ "preview": "vite preview",
8
+ "prepare": "svelte-kit sync || echo ''",
9
+ "prepack": "svelte-kit sync && svelte-package && publint",
10
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
11
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch"
12
+ },
13
+ "files": [
14
+ "dist",
15
+ "!dist/**/*.test.*",
16
+ "!dist/**/*.spec.*"
17
+ ],
18
+ "sideEffects": [
19
+ "**/*.css"
20
+ ],
21
+ "svelte": "./dist/index.js",
22
+ "types": "./dist/index.d.ts",
23
+ "type": "module",
24
+ "exports": {
25
+ ".": {
26
+ "types": "./dist/index.d.ts",
27
+ "svelte": "./dist/index.js"
28
+ }
29
+ },
30
+ "peerDependencies": {
31
+ "svelte": "^5.0.0"
32
+ },
33
+ "devDependencies": {
34
+ "@sveltejs/adapter-auto": "^7.0.0",
35
+ "@sveltejs/kit": "^2.49.1",
36
+ "@sveltejs/package": "^2.5.7",
37
+ "@sveltejs/vite-plugin-svelte": "^6.2.1",
38
+ "publint": "^0.3.15",
39
+ "svelte": "^5.45.6",
40
+ "svelte-check": "^4.3.4",
41
+ "typescript": "^5.9.3",
42
+ "vite": "^7.2.6"
43
+ },
44
+ "keywords": [
45
+ "svelte"
46
+ ],
47
+ "license": "MIT",
48
+ "homepage": "https://github.com/abcnews/components-storylab",
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "git+https://github.com/abcnews/components-storylab.git"
52
+ },
53
+ "private": false
54
+ }