@edrlab/thorium-web 1.0.9 → 1.1.0

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 (66) hide show
  1. package/README.md +2 -0
  2. package/dist/{StatefulReader-DdQrrgZY.d.mts → StatefulReader-BjH7bkU1.d.mts} +1 -25
  3. package/dist/chunk-7CGMWOZN.mjs +20 -0
  4. package/dist/chunk-7CGMWOZN.mjs.map +1 -0
  5. package/dist/{chunk-PVGIY5SC.mjs → chunk-D24O64OP.mjs} +375 -278
  6. package/dist/chunk-D24O64OP.mjs.map +1 -0
  7. package/dist/{chunk-G2SKPGPO.mjs → chunk-FG6BJGVE.mjs} +5 -25
  8. package/dist/chunk-FG6BJGVE.mjs.map +1 -0
  9. package/dist/{chunk-SQHOOSST.mjs → chunk-HE3WFPGE.mjs} +84 -85
  10. package/dist/chunk-HE3WFPGE.mjs.map +1 -0
  11. package/dist/chunk-KKJA56IZ.mjs +27 -0
  12. package/dist/chunk-KKJA56IZ.mjs.map +1 -0
  13. package/dist/{chunk-OXZU5FTD.mjs → chunk-SPAC7T57.mjs} +32 -21
  14. package/dist/chunk-SPAC7T57.mjs.map +1 -0
  15. package/dist/components/Epub/index.css +1282 -0
  16. package/dist/components/Epub/index.css.map +1 -0
  17. package/dist/components/Epub/index.d.mts +1 -1
  18. package/dist/components/Epub/index.mjs +47 -44
  19. package/dist/components/Epub/index.mjs.map +1 -1
  20. package/dist/components/Misc/index.css +102 -0
  21. package/dist/components/Misc/index.css.map +1 -0
  22. package/dist/components/Misc/index.d.mts +28 -0
  23. package/dist/components/Misc/index.mjs +110 -0
  24. package/dist/components/Misc/index.mjs.map +1 -0
  25. package/dist/components/WebPub/index.css +1214 -0
  26. package/dist/components/WebPub/index.css.map +1 -0
  27. package/dist/components/WebPub/index.d.mts +2 -2
  28. package/dist/components/WebPub/index.mjs +28 -25
  29. package/dist/components/WebPub/index.mjs.map +1 -1
  30. package/dist/core/Components/index.mjs +0 -1
  31. package/dist/core/Helpers/index.d.mts +12 -2
  32. package/dist/core/Helpers/index.mjs +1 -2
  33. package/dist/core/Hooks/index.mjs +0 -1
  34. package/dist/i18n/index.mjs +5 -5
  35. package/dist/lib/index.mjs +2 -3
  36. package/dist/locales/et/thorium-web.json +1 -0
  37. package/dist/locales/it/thorium-web.json +1 -0
  38. package/dist/locales/pl/thorium-web.json +26 -13
  39. package/dist/locales/sv/thorium-web.json +37 -37
  40. package/dist/next-lib/index.mjs +0 -2
  41. package/dist/next-lib/index.mjs.map +1 -1
  42. package/dist/preferences/index.mjs +3 -4
  43. package/package.json +38 -34
  44. package/dist/backLink.module-QFOMD4RA.module.css +0 -36
  45. package/dist/chunk-3QS3WKRC.mjs +0 -29
  46. package/dist/chunk-3QS3WKRC.mjs.map +0 -1
  47. package/dist/chunk-G2SKPGPO.mjs.map +0 -1
  48. package/dist/chunk-OXZU5FTD.mjs.map +0 -1
  49. package/dist/chunk-PVGIY5SC.mjs.map +0 -1
  50. package/dist/chunk-SQHOOSST.mjs.map +0 -1
  51. package/dist/chunk-TTGURRX3.mjs +0 -19
  52. package/dist/chunk-TTGURRX3.mjs.map +0 -1
  53. package/dist/docking.module-TDNYZX4H.module.css +0 -40
  54. package/dist/jumpToPosition.module-4C47UYPE.module.css +0 -41
  55. package/dist/overflowMenu.module-QL32ISXF.module.css +0 -68
  56. package/dist/publicationGrid.module-T6ISNRGM.module.css +0 -70
  57. package/dist/reader-NGCQJKLX.css +0 -261
  58. package/dist/readerArrowButton.module-EFLOIADG.module.css +0 -77
  59. package/dist/readerHeader.module-RNGQFLVS.module.css +0 -35
  60. package/dist/readerLoader.module-KDBPCQZJ.module.css +0 -40
  61. package/dist/readerPagination.module-DYBZAQ7H.module.css +0 -76
  62. package/dist/readerProgression.module-7PU7L74S.module.css +0 -5
  63. package/dist/readerSharedUI.module-Y2VDWFS5.module.css +0 -98
  64. package/dist/settings.module-H5MUDFJO.module.css +0 -437
  65. package/dist/sheets.module-LJOLY4MK.module.css +0 -195
  66. package/dist/toc.module-F47C5CDS.module.css +0 -153
@@ -8,16 +8,16 @@
8
8
  "auto": "Auto"
9
9
  },
10
10
  "tooltip": "Inställningar",
11
- "trigger": "Menyn Inställningar",
12
- "close": "Stäng menyn Inställningar",
11
+ "trigger": "Inställningsmeny",
12
+ "close": "Stäng inställningsmenyn",
13
13
  "heading": "Visningsinställningar",
14
14
  "themes": {
15
15
  "title": "Teman",
16
16
  "auto": "Auto",
17
- "light": "Ljus",
17
+ "light": "Ljust",
18
18
  "sepia": "Sepia",
19
19
  "paper": "Papper",
20
- "dark": "Mörk",
20
+ "dark": "Mörkt",
21
21
  "contrast1": "Kontrast 1",
22
22
  "contrast2": "Kontrast 2",
23
23
  "contrast3": "Kontrast 3"
@@ -44,18 +44,18 @@
44
44
  }
45
45
  },
46
46
  "fontWeight": {
47
- "title": "Teckentjocklek",
48
- "increase": "Öka teckentjocklek",
49
- "decrease": "Minska teckentjocklek",
47
+ "title": "Teckenvikt",
48
+ "increase": "Öka teckenvikt",
49
+ "decrease": "Minska teckenvikt",
50
50
  "default": "Normal",
51
51
  "bolder": "Fetare"
52
52
  },
53
53
  "normalizeText": {
54
- "title": "Textnormalisering",
54
+ "title": "Textformatering",
55
55
  "label": "Ta bort all textformatering"
56
56
  },
57
57
  "align": {
58
- "title": "Textjustering",
58
+ "title": "Justering",
59
59
  "publisher": "Standard",
60
60
  "left": "Vänster",
61
61
  "justify": "Justera",
@@ -63,7 +63,7 @@
63
63
  },
64
64
  "hyphens": {
65
65
  "title": "Avstavning",
66
- "label": "Aktivera bindestreck"
66
+ "label": "Aktivera avstavning"
67
67
  },
68
68
  "text": {
69
69
  "title": "Text",
@@ -95,12 +95,12 @@
95
95
  "decrease": "Minska ordavstånd"
96
96
  },
97
97
  "letterSpacing": {
98
- "title": "Bokstavsavstånd",
99
- "increase": "Öka bokstavsavstånd",
100
- "decrease": "Minska bokstavsavstånd"
98
+ "title": "Teckenavstånd",
99
+ "increase": "Öka teckenavstånd",
100
+ "decrease": "Minska teckenavstånd"
101
101
  },
102
102
  "publisherStyles": {
103
- "label": "Använd ursprunglig formatering"
103
+ "label": "Använd originalformat"
104
104
  },
105
105
  "spacing": {
106
106
  "title": "Avstånd",
@@ -120,18 +120,18 @@
120
120
  },
121
121
  "layout": {
122
122
  "title": "Layout",
123
- "scrolled": "Bläddringsbar",
124
- "paginated": "Sidnumrerad"
123
+ "scrolled": "Rullningsbar",
124
+ "paginated": "Sidindelad"
125
125
  },
126
126
  "reset": "Återställ"
127
127
  },
128
128
  "app": {
129
- "loading": "Läser in",
130
- "publicationWrapper": "Du befinner dig nu i publikationen.",
129
+ "loading": "Laddar",
130
+ "publicationWrapper": "Du är nu i boken.",
131
131
  "docking": {
132
132
  "dockingLeft": "Dockad panel till vänster",
133
133
  "dockingRight": "Dockad panel till höger",
134
- "dockingEmpty": "För närvarande tom",
134
+ "dockingEmpty": "Inget innehåll",
135
135
  "dockingClosed": "Är stängd, innehåller {{ action }}",
136
136
  "dockingCollapsed": "Är minimerad, innehåller {{ action }}"
137
137
  },
@@ -140,18 +140,18 @@
140
140
  "trigger": "Tillbaka till biblioteket",
141
141
  "tooltip": "Bibliotek"
142
142
  },
143
- "label": "Övre fält",
144
- "runningHead": "Löpande rubrikfält",
143
+ "label": "Sidhuvud",
144
+ "runningHead": "Sidtitel",
145
145
  "actions": "Åtgärder"
146
146
  },
147
147
  "footer": {
148
- "label": "Nedre fält"
148
+ "label": "Sidfot"
149
149
  },
150
150
  "progression": {
151
- "wrapper": "Aktuellt förlopp",
151
+ "wrapper": "Läsposition",
152
152
  "of": "{{ current }} av {{ reference }}",
153
- "referenceFallback": "aktuellt kapitel",
154
- "pubFallback": "publikationen",
153
+ "referenceFallback": "nuvarande kapitel",
154
+ "pubFallback": "boken",
155
155
  "positionsLeft": "{{ count }} kvar i {{ reference }}"
156
156
  },
157
157
  "docker": {
@@ -165,12 +165,12 @@
165
165
  "tooltip": "Docka höger"
166
166
  },
167
167
  "popover": {
168
- "trigger": "Visa i ett fönster",
168
+ "trigger": "Visa som fönster",
169
169
  "tooltip": "Visa ovanpå"
170
170
  },
171
171
  "fullscreen": {
172
172
  "trigger": "Visa ovanpå innehåll",
173
- "tooltip": "Överlagra"
173
+ "tooltip": "Helskärm"
174
174
  },
175
175
  "close": {
176
176
  "trigger": "Stäng",
@@ -185,25 +185,25 @@
185
185
  "goForward": "Gå framåt",
186
186
  "goBackward": "Gå bakåt",
187
187
  "scroll": {
188
- "wrapper": "Navigera i publikationen",
188
+ "wrapper": "Navigera i boken",
189
189
  "prevLabel": "Föregående",
190
190
  "nextLabel": "Nästa",
191
- "prevA11yLabel": "Gå till föregående resurs",
192
- "nextA11yLabel": "Gå till nästa resurs"
191
+ "prevA11yLabel": "Gå till föregående avsnitt",
192
+ "nextA11yLabel": "Gå till nästa avsnitt"
193
193
  }
194
194
  },
195
195
  "fullscreen": {
196
- "tooltip": "Helskärm",
197
- "trigger": "Växla helskärmsläge",
196
+ "tooltip": "Helskärmsläge",
197
+ "trigger": "Starta eller avsluta helskärmsläge",
198
198
  "close": "Avsluta helskärmsläge"
199
199
  },
200
200
  "toc": {
201
201
  "tooltip": "Innehållsförteckning",
202
202
  "trigger": "Innehållsförteckning",
203
- "close": "Stäng innehållsförteckning",
203
+ "close": "Stäng innehållsförteckningen",
204
204
  "heading": "Innehållsförteckning",
205
- "entries": "Poster i förteckningen",
206
- "empty": "Ingen innehållsförteckning har tillhandahållits för den här publikationen.",
205
+ "entries": "Poster i innehållsförteckningen",
206
+ "empty": "Den här boken saknar innehållsförteckning.",
207
207
  "search": {
208
208
  "label": "Sök",
209
209
  "placeholder": "Sök",
@@ -214,8 +214,8 @@
214
214
  "tooltip": "Hoppa till…",
215
215
  "trigger": "Hoppa till position",
216
216
  "heading": "Hoppa till position",
217
- "go": "Kör",
218
- "close": "Avsluta hoppa till position",
217
+ "go": "Hoppa",
218
+ "close": "Avbryt hoppa till position",
219
219
  "label": "Välj en position från {{ positionStart }} till {{ positionEnd }}:"
220
220
  },
221
221
  "overflowMenu": {
@@ -1,5 +1,3 @@
1
- import '../chunk-3QS3WKRC.mjs';
2
-
3
1
  // src/next-lib/helpers/verifyManifest.ts
4
2
  var verifyManifestUrl = (options) => {
5
3
  const { manifestUrl, allowedDomains = [], allowAllDomains = process.env.NODE_ENV !== "production" } = options;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/next-lib/helpers/verifyManifest.ts"],"names":[],"mappings":";;;AAyCO,IAAM,iBAAA,GAAoB,CAC/B,OAAA,KACyB;AACzB,EAAA,MAAM,EAAE,WAAA,EAAa,cAAA,GAAiB,EAAC,EAAG,kBAAkB,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,EAAa,GAAI,OAAA;AAEtG,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,GAAA,EAAK,EAAA;AAAA,MACL,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,WAAW,CAAA;AAG/B,IAAA,MAAM,SAAA,GAAY,eAAA,IAChB,cAAA,CAAe,MAAA,KAAW,CAAA,IAC1B,cAAA,CAAe,QAAA,CAAS,GAAG,CAAA,IAC3B,cAAA,CAAe,IAAA,CAAK,CAAA,MAAA,KAAU;AAC5B,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA,GACtC,IAAI,GAAA,CAAI,MAAM,CAAA,GACd,IAAI,GAAA,CAAI,CAAA,QAAA,EAAY,MAAO,CAAA,CAAE,CAAA;AACjC,QAAA,OAAO,GAAA,CAAI,aAAa,SAAA,CAAU,QAAA;AAAA,MACpC,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF,CAAC,CAAA;AAEH,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,GAAA,EAAK,WAAA;AAAA,QACL,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,GAAA,EAAK;AAAA,KACP;AAAA,EAEF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,GAAA,EAAK,WAAA;AAAA,MACL,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AACF;AAQO,IAAM,wBAAA,GAA2B,CAAC,WAAA,KAA8C;AACrF,EAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,GAAA,CAAI,wBAAA,EAA0B,MAAK,IAAK,EAAA;AAC1E,EAAA,MAAM,cAAA,GAAiB,iBAAA,CACpB,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA,CACjB,MAAA,CAAO,OAAO,CAAA;AAEjB,EAAA,OAAO,iBAAA,CAAkB;AAAA,IACvB,WAAA;AAAA,IACA,cAAA;AAAA,IACA,iBAAiB,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,IAAgB,eAAe,MAAA,KAAW;AAAA,GACrF,CAAA;AACH","file":"index.mjs","sourcesContent":["interface VerifyManifestOptions {\n /**\n * The URL of the manifest to verify\n */\n manifestUrl: string;\n \n /**\n * List of allowed domains (without protocol)\n * If empty or contains \"*\", all domains are allowed\n */\n allowedDomains?: string[];\n \n /**\n * Whether to allow all domains (overrides allowedDomains if true)\n * @default process.env.NODE_ENV !== \"production\"\n */\n allowAllDomains?: boolean;\n}\n\ninterface VerifyManifestResult {\n /**\n * Whether the manifest URL is allowed\n */\n allowed: boolean;\n \n /**\n * The normalized manifest URL\n */\n url: string;\n \n /**\n * Error message if verification failed\n */\n error?: string;\n}\n\n/**\n * Verifies if a manifest URL is allowed based on domain restrictions\n * @param options Verification options\n * @returns Verification result\n */\nexport const verifyManifestUrl = (\n options: VerifyManifestOptions\n): VerifyManifestResult => {\n const { manifestUrl, allowedDomains = [], allowAllDomains = process.env.NODE_ENV !== \"production\" } = options;\n \n if (!manifestUrl) {\n return {\n allowed: false,\n url: \"\",\n error: \"URL is required\"\n };\n }\n\n try {\n const url = new URL(manifestUrl);\n \n // In development or if no domains are specified, allow all\n const isAllowed = allowAllDomains || \n allowedDomains.length === 0 ||\n allowedDomains.includes(\"*\") ||\n allowedDomains.some(domain => {\n try {\n const domainUrl = domain.startsWith(\"http\") \n ? new URL(domain) \n : new URL(`https://${ domain }`);\n return url.hostname === domainUrl.hostname;\n } catch {\n return false;\n }\n });\n \n if (!isAllowed) {\n return {\n allowed: false,\n url: manifestUrl,\n error: \"Domain not allowed\"\n };\n }\n \n return {\n allowed: true,\n url: manifestUrl\n };\n \n } catch (error) {\n return {\n allowed: false,\n url: manifestUrl,\n error: \"Invalid URL\"\n };\n }\n}\n\n/**\n * Verifies a manifest URL from environment configuration\n * Uses MANIFEST_ALLOWED_DOMAINS environment variable for domain restrictions\n * @param manifestUrl The manifest URL to verify\n * @returns Verification result\n */\nexport const verifyManifestUrlFromEnv = (manifestUrl: string): VerifyManifestResult => {\n const allowedDomainsRaw = process.env.MANIFEST_ALLOWED_DOMAINS?.trim() || \"\";\n const allowedDomains = allowedDomainsRaw\n .split(\",\")\n .map(d => d.trim())\n .filter(Boolean);\n \n return verifyManifestUrl({\n manifestUrl,\n allowedDomains,\n allowAllDomains: process.env.NODE_ENV !== \"production\" || allowedDomains.length === 0\n });\n}\n"]}
1
+ {"version":3,"sources":["../../src/next-lib/helpers/verifyManifest.ts"],"names":[],"mappings":";AAyCO,IAAM,iBAAA,GAAoB,CAC/B,OAAA,KACyB;AACzB,EAAA,MAAM,EAAE,WAAA,EAAa,cAAA,GAAiB,EAAC,EAAG,kBAAkB,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,EAAa,GAAI,OAAA;AAEtG,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,GAAA,EAAK,EAAA;AAAA,MACL,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,WAAW,CAAA;AAG/B,IAAA,MAAM,SAAA,GAAY,eAAA,IAChB,cAAA,CAAe,MAAA,KAAW,CAAA,IAC1B,cAAA,CAAe,QAAA,CAAS,GAAG,CAAA,IAC3B,cAAA,CAAe,IAAA,CAAK,CAAA,MAAA,KAAU;AAC5B,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA,GACtC,IAAI,GAAA,CAAI,MAAM,CAAA,GACd,IAAI,GAAA,CAAI,CAAA,QAAA,EAAY,MAAO,CAAA,CAAE,CAAA;AACjC,QAAA,OAAO,GAAA,CAAI,aAAa,SAAA,CAAU,QAAA;AAAA,MACpC,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF,CAAC,CAAA;AAEH,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,GAAA,EAAK,WAAA;AAAA,QACL,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,GAAA,EAAK;AAAA,KACP;AAAA,EAEF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,GAAA,EAAK,WAAA;AAAA,MACL,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AACF;AAQO,IAAM,wBAAA,GAA2B,CAAC,WAAA,KAA8C;AACrF,EAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,GAAA,CAAI,wBAAA,EAA0B,MAAK,IAAK,EAAA;AAC1E,EAAA,MAAM,cAAA,GAAiB,iBAAA,CACpB,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA,CACjB,MAAA,CAAO,OAAO,CAAA;AAEjB,EAAA,OAAO,iBAAA,CAAkB;AAAA,IACvB,WAAA;AAAA,IACA,cAAA;AAAA,IACA,iBAAiB,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,IAAgB,eAAe,MAAA,KAAW;AAAA,GACrF,CAAA;AACH","file":"index.mjs","sourcesContent":["interface VerifyManifestOptions {\n /**\n * The URL of the manifest to verify\n */\n manifestUrl: string;\n \n /**\n * List of allowed domains (without protocol)\n * If empty or contains \"*\", all domains are allowed\n */\n allowedDomains?: string[];\n \n /**\n * Whether to allow all domains (overrides allowedDomains if true)\n * @default process.env.NODE_ENV !== \"production\"\n */\n allowAllDomains?: boolean;\n}\n\ninterface VerifyManifestResult {\n /**\n * Whether the manifest URL is allowed\n */\n allowed: boolean;\n \n /**\n * The normalized manifest URL\n */\n url: string;\n \n /**\n * Error message if verification failed\n */\n error?: string;\n}\n\n/**\n * Verifies if a manifest URL is allowed based on domain restrictions\n * @param options Verification options\n * @returns Verification result\n */\nexport const verifyManifestUrl = (\n options: VerifyManifestOptions\n): VerifyManifestResult => {\n const { manifestUrl, allowedDomains = [], allowAllDomains = process.env.NODE_ENV !== \"production\" } = options;\n \n if (!manifestUrl) {\n return {\n allowed: false,\n url: \"\",\n error: \"URL is required\"\n };\n }\n\n try {\n const url = new URL(manifestUrl);\n \n // In development or if no domains are specified, allow all\n const isAllowed = allowAllDomains || \n allowedDomains.length === 0 ||\n allowedDomains.includes(\"*\") ||\n allowedDomains.some(domain => {\n try {\n const domainUrl = domain.startsWith(\"http\") \n ? new URL(domain) \n : new URL(`https://${ domain }`);\n return url.hostname === domainUrl.hostname;\n } catch {\n return false;\n }\n });\n \n if (!isAllowed) {\n return {\n allowed: false,\n url: manifestUrl,\n error: \"Domain not allowed\"\n };\n }\n \n return {\n allowed: true,\n url: manifestUrl\n };\n \n } catch (error) {\n return {\n allowed: false,\n url: manifestUrl,\n error: \"Invalid URL\"\n };\n }\n}\n\n/**\n * Verifies a manifest URL from environment configuration\n * Uses MANIFEST_ALLOWED_DOMAINS environment variable for domain restrictions\n * @param manifestUrl The manifest URL to verify\n * @returns Verification result\n */\nexport const verifyManifestUrlFromEnv = (manifestUrl: string): VerifyManifestResult => {\n const allowedDomainsRaw = process.env.MANIFEST_ALLOWED_DOMAINS?.trim() || \"\";\n const allowedDomains = allowedDomainsRaw\n .split(\",\")\n .map(d => d.trim())\n .filter(Boolean);\n \n return verifyManifestUrl({\n manifestUrl,\n allowedDomains,\n allowAllDomains: process.env.NODE_ENV !== \"production\" || allowedDomains.length === 0\n });\n}\n"]}
@@ -1,10 +1,9 @@
1
- export { ThMemoryPreferencesAdapter, ThPreferencesContext, ThPreferencesProvider, buildThemeObject, createPreferences, defaultActionKeysObject, defaultFontFamilyOptions, defaultLetterSpacing, defaultLineHeights, defaultParagraphIndent, defaultParagraphSpacing, defaultPreferences, defaultPreferencesContextValue, defaultSpacingPresets, defaultSpacingPresetsOrder, defaultSpacingSettingsMain, defaultSpacingSettingsSubpanel, defaultTextSettingsMain, defaultTextSettingsSubpanel, defaultWordSpacing, defaultZoom, usePreferenceKeys, usePreferences, useTheming } from '../chunk-OXZU5FTD.mjs';
1
+ export { ThMemoryPreferencesAdapter, ThPreferencesContext, ThPreferencesProvider, buildThemeObject, createPreferences, defaultActionKeysObject, defaultFontFamilyOptions, defaultLetterSpacing, defaultLineHeights, defaultParagraphIndent, defaultParagraphSpacing, defaultPreferences, defaultPreferencesContextValue, defaultSpacingPresets, defaultSpacingPresetsOrder, defaultSpacingSettingsMain, defaultSpacingSettingsSubpanel, defaultTextSettingsMain, defaultTextSettingsSubpanel, defaultWordSpacing, defaultZoom, usePreferenceKeys, usePreferences, useTheming } from '../chunk-SPAC7T57.mjs';
2
+ import '../chunk-7CGMWOZN.mjs';
2
3
  import '../chunk-BNPR6V7V.mjs';
4
+ import '../chunk-5LUMM7FW.mjs';
3
5
  import '../chunk-NQ2ZSGCX.mjs';
4
6
  import '../chunk-MLEYTQGK.mjs';
5
- import '../chunk-TTGURRX3.mjs';
6
- import '../chunk-5LUMM7FW.mjs';
7
7
  export { ThActionsKeys, ThArrowVariant, ThBackLinkVariant, ThBreakpoints, ThDockingKeys, ThDockingTypes, ThDocumentTitleFormat, ThLayoutDirection, ThLayoutOptions, ThLayoutUI, ThLineHeightOptions, ThProgressionFormat, ThRunningHeadFormat, ThSettingsContainerKeys, ThSettingsKeys, ThSettingsRangePlaceholder, ThSettingsRangeVariant, ThSheetHeaderVariant, ThSheetTypes, ThSpacingPresetKeys, ThSpacingSettingsKeys, ThTextAlignOptions, ThTextSettingsKeys, ThThemeKeys } from '../chunk-CVM2ZAPL.mjs';
8
- import '../chunk-3QS3WKRC.mjs';
9
8
  //# sourceMappingURL=index.mjs.map
10
9
  //# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -20,7 +20,7 @@
20
20
  "bugs": {
21
21
  "url": "https://github.com/edrlab/thorium-web/issues"
22
22
  },
23
- "version": "1.0.9",
23
+ "version": "1.1.0",
24
24
  "private": false,
25
25
  "files": [
26
26
  "./dist"
@@ -36,14 +36,18 @@
36
36
  "./core/lib": "./dist/lib/index.mjs",
37
37
  "./core/preferences": "./dist/preferences/index.mjs",
38
38
  "./epub": "./dist/components/Epub/index.mjs",
39
+ "./epub/styles": "./dist/components/Epub/index.css",
40
+ "./misc": "./dist/components/Misc/index.mjs",
41
+ "./misc/styles": "./dist/components/Misc/index.css",
39
42
  "./next": "./dist/next-lib/index.mjs",
40
- "./webpub": "./dist/components/WebPub/index.mjs"
43
+ "./webpub": "./dist/components/WebPub/index.mjs",
44
+ "./webpub/styles": "./dist/components/WebPub/index.css"
41
45
  },
42
46
  "scripts": {
43
47
  "dev": "next dev",
44
48
  "build": "next build",
45
49
  "start": "next start",
46
- "lint": "next lint",
50
+ "lint": "eslint .",
47
51
  "deploy": "npx @cloudflare/next-on-pages && npx wrangler pages deploy",
48
52
  "preinstall": "npx only-allow pnpm",
49
53
  "copy-locales": "cpx \"public/locales/**/*\" dist/locales",
@@ -53,58 +57,58 @@
53
57
  "@readium/css": "2.0.0-beta.24",
54
58
  "@readium/navigator": "2.2.5",
55
59
  "@readium/navigator-html-injectables": "2.2.2",
56
- "@readium/shared": "2.1.1",
57
- "@reduxjs/toolkit": "^2.9.0",
58
- "i18next": "^25.6.0",
60
+ "@readium/shared": "2.1.2",
61
+ "@reduxjs/toolkit": "^2.11.2",
62
+ "i18next": "^25.7.4",
59
63
  "i18next-browser-languagedetector": "^8.2.0",
60
64
  "i18next-http-backend": "^3.0.2",
61
- "motion": "^12.23.24",
62
- "react": "^19.2.0",
63
- "react-aria": "^3.44.0",
64
- "react-aria-components": "^1.13.0",
65
- "react-dom": "^19.2.0",
66
- "react-i18next": "^16.0.1",
65
+ "motion": "^12.26.2",
66
+ "react": "^19.2.3",
67
+ "react-aria": "^3.45.0",
68
+ "react-aria-components": "^1.14.0",
69
+ "react-dom": "^19.2.3",
70
+ "react-i18next": "^16.5.3",
67
71
  "react-modal-sheet": "^5.2.1",
68
72
  "react-redux": "^9.2.0",
69
73
  "react-resizable-panels": "^3.0.6",
70
- "react-stately": "^3.42.0"
74
+ "react-stately": "^3.43.0"
71
75
  },
72
76
  "dependencies": {
73
77
  "@readium/css": "2.0.0-beta.24",
74
78
  "@readium/navigator": "2.2.5",
75
79
  "@readium/navigator-html-injectables": "2.2.2",
76
- "@readium/shared": "2.1.1",
77
- "@reduxjs/toolkit": "^2.9.0",
80
+ "@readium/shared": "2.1.2",
81
+ "@reduxjs/toolkit": "^2.11.2",
78
82
  "classnames": "^2.5.1",
79
- "debounce": "^2.2.0",
80
- "i18next": "^25.6.0",
83
+ "debounce": "^3.0.0",
84
+ "i18next": "^25.7.4",
81
85
  "i18next-browser-languagedetector": "^8.2.0",
82
86
  "i18next-http-backend": "^3.0.2",
83
- "motion": "^12.23.24",
84
- "next": "15.5.5",
85
- "react": "^19.2.0",
86
- "react-aria": "^3.44.0",
87
- "react-aria-components": "^1.13.0",
88
- "react-dom": "^19.2.0",
89
- "react-i18next": "^16.0.1",
87
+ "motion": "^12.26.2",
88
+ "next": "16.1.2",
89
+ "react": "^19.2.3",
90
+ "react-aria": "^3.45.0",
91
+ "react-aria-components": "^1.14.0",
92
+ "react-dom": "^19.2.3",
93
+ "react-i18next": "^16.5.3",
90
94
  "react-modal-sheet": "^5.2.1",
91
95
  "react-redux": "^9.2.0",
92
96
  "react-resizable-panels": "^3.0.6",
93
- "react-stately": "^3.42.0"
97
+ "react-stately": "^3.43.0"
94
98
  },
95
99
  "devDependencies": {
96
100
  "@svgr/webpack": "^8.1.0",
97
101
  "@types/css-modules": "^1.0.5",
98
- "@types/node": "^22.18.10",
99
- "@types/react": "^19.2.2",
100
- "@types/react-dom": "^19.2.2",
102
+ "@types/node": "^22.19.7",
103
+ "@types/react": "^19.2.8",
104
+ "@types/react-dom": "^19.2.3",
101
105
  "cpx2": "^8.0.0",
102
106
  "esbuild-plugin-svgr": "^3.1.1",
103
- "eslint": "^9.37.0",
104
- "eslint-config-next": "15.5.5",
105
- "glob": "^11.0.3",
106
- "immer": "^10.1.3",
107
- "tsup": "^8.5.0",
107
+ "eslint": "^9.39.2",
108
+ "eslint-config-next": "16.1.2",
109
+ "glob": "^13.0.0",
110
+ "immer": "11.1.2",
111
+ "tsup": "^8.5.1",
108
112
  "typescript": "^5.9.3"
109
113
  }
110
- }
114
+ }
@@ -1,36 +0,0 @@
1
- .backLink {
2
- display: block;
3
- box-sizing: content-box;
4
- padding: calc(var(--icon-size, 24px) * (1/4));
5
- text-align: start;
6
- border-radius: var(--layout-radius);
7
- max-width: 100%;
8
- height: var(--icon-size, 24px);
9
- }
10
-
11
- .backLink svg {
12
- fill: var(--theme-text);
13
- max-width: 100%;
14
- height: 100%;
15
- }
16
-
17
- .backLink img {
18
- max-width: 100%;
19
- height: 100%;
20
- }
21
-
22
- .backLink[data-hovered] {
23
- background-color: var(--theme-hover);
24
- }
25
-
26
- .backLink[data-focus-visible] {
27
- outline: 2px solid var(--theme-focus);
28
- }
29
-
30
- .backLink[data-disabled] {
31
- color: var(--theme-disable)
32
- }
33
-
34
- .backLink[data-disabled] svg {
35
- fill: var(--theme-disable);
36
- }
@@ -1,29 +0,0 @@
1
- var __create = Object.create;
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getProtoOf = Object.getPrototypeOf;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __commonJS = (cb, mod) => function __require() {
8
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
19
- // If the importer is in node compatibility mode or this is not an ESM
20
- // file that has been converted to a CommonJS file using a Babel-
21
- // compatible transform (i.e. "__esModule" has not been set), then set
22
- // "default" to the CommonJS "module.exports" for node compatibility.
23
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
24
- mod
25
- ));
26
-
27
- export { __commonJS, __toESM };
28
- //# sourceMappingURL=chunk-3QS3WKRC.mjs.map
29
- //# sourceMappingURL=chunk-3QS3WKRC.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-3QS3WKRC.mjs"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/i18n/config.ts","../src/i18n/ThI18nProvider.tsx","../src/i18n/useI18n.ts"],"names":["i18n"],"mappings":";;;;;;;;;;AAMO,IAAM,cAAA,GAA8B;AAAA,EACzC,WAAA,EAAa,IAAA;AAAA,EACb,IAAA,EAAM,KAAA;AAAA,EACN,wBAAA,EAA0B,IAAA;AAAA,EAC1B,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,CAAC,WAAW,CAAA;AAAA,IACnB,QAAQ;AAAC,GACX;AAAA,EACA,aAAA,EAAe;AAAA,IACb,WAAA,EAAa;AAAA,GACf;AAAA,EACA,OAAA,EAAS;AAAA,IACP,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,EAAA,EAAI,CAAC,aAAa,CAAA;AAAA,EAClB,SAAA,EAAW;AACb;AAEO,IAAM,QAAA,GAAW,OAAO,OAAA,GAAgC,EAAC,KAAM;AACpE,EAAA,IAAI,KAAK,aAAA,EAAe;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA,CACJ,GAAA,CAAI,OAAO,CAAA,CACX,GAAA,CAAI,gBAAgB,CAAA,CACpB,GAAA,CAAI,gBAAgB,CAAA,CACpB,IAAA,CAAK;AAAA,IACJ,GAAG,cAAA;AAAA,IACH,GAAG;AAAA,GACJ,CAAA;AACL;ACzBO,IAAM,iBAAiB,CAAC;AAAA,EAC7B,QAAA;AAAA,EACA,GAAG;AACL,CAAA,KAA2B;AACzB,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,KAAK,CAAA;AAExD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,QAAA,CAAS;AAAA,QACP,GAAG,OAAA;AAAA,QACH,GAAA,EAAK,WAAA,EAAa,MAAA,IAAU,OAAA,CAAQ;AAAA,OACrC,CAAA,CAAE,IAAA,CAAK,MAAM,gBAAA,CAAiB,IAAI,CAAC,CAAA;AAAA,IACtC;AAAA,EACF,CAAC,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,aAAA,IAAiB,aAAa,MAAA,EAAQ;AACxC,MAAA,IAAA,CAAK,cAAA,CAAe,YAAY,MAAM,CAAA;AAAA,IACxC;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,MAAA,EAAQ,aAAa,CAAC,CAAA;AAEvC,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBAAO,GAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAgB,QAAA,EAAU,CAAA;AACpD;AChCO,IAAM,OAAA,GAAU,CAAC,EAAA,GAAa,aAAA,KAAkB;AACrD,EAAA,MAAM,EAAE,CAAA,EAAG,IAAA,EAAAA,OAAM,KAAA,EAAM,GAAI,eAAe,EAAE,CAAA;AAG5C,EAAA,MAAM,cAAA,GAAiB,CAAC,GAAA,KAAgB;AACtC,IAAA,OAAOA,KAAAA,CAAK,eAAe,GAAG,CAAA;AAAA,EAChC,CAAA;AAEA,EAAA,OAAO;AAAA;AAAA,IAEL,CAAA;AAAA;AAAA,IAEA,IAAA,EAAAA,KAAAA;AAAA;AAAA,IAEA,KAAA;AAAA;AAAA,IAEA,iBAAiBA,KAAAA,CAAK,QAAA;AAAA;AAAA,IAEtB,WAAWA,KAAAA,CAAK,SAAA;AAAA;AAAA,IAEhB;AAAA,GACF;AACF","file":"chunk-G2SKPGPO.mjs","sourcesContent":["import i18n from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\nimport LanguageDetector from \"i18next-browser-languagedetector\";\nimport Backend from \"i18next-http-backend\";\nimport { InitOptions } from \"i18next\";\n\nexport const DEFAULT_CONFIG: InitOptions = {\n fallbackLng: \"en\",\n load: \"all\",\n nonExplicitSupportedLngs: true,\n detection: {\n order: [\"navigator\"],\n caches: []\n },\n interpolation: {\n escapeValue: false\n },\n backend: {\n loadPath: \"/locales/{{lng}}/{{ns}}.json\"\n },\n ns: [\"thorium-web\"],\n defaultNS: \"thorium-web\"\n};\n\nexport const initI18n = async (options: Partial<InitOptions> = {}) => {\n if (i18n.isInitialized) {\n return i18n;\n }\n\n return i18n\n .use(Backend)\n .use(LanguageDetector)\n .use(initReactI18next)\n .init({\n ...DEFAULT_CONFIG,\n ...options\n });\n};\n\nexport { i18n };","\"use client\";\n\nimport React, { ReactNode, useEffect, useState } from \"react\";\nimport { I18nextProvider } from \"react-i18next\";\nimport { i18n, initI18n } from \"./config\";\nimport { InitOptions } from \"i18next\";\nimport { usePreferences } from \"@/preferences\";\n\nexport type ThI18nProviderProps = {\n children: ReactNode;\n} & Partial<InitOptions>;\n\nexport const ThI18nProvider = ({\n children,\n ...options\n}: ThI18nProviderProps) => {\n const { preferences } = usePreferences();\n const [isInitialized, setIsInitialized] = useState(false);\n \n useEffect(() => {\n if (!i18n.isInitialized) { \n initI18n({\n ...options,\n lng: preferences?.locale || options.lng,\n }).then(() => setIsInitialized(true));\n }\n });\n\n useEffect(() => {\n if (isInitialized && preferences?.locale) {\n i18n.changeLanguage(preferences.locale);\n }\n }, [preferences?.locale, isInitialized]);\n\n if (!isInitialized) {\n return null;\n }\n\n return <I18nextProvider i18n={ i18n }>{ children }</I18nextProvider>;\n};\n\nexport default ThI18nProvider;\n","import { useTranslation } from \"react-i18next\";\n\n/**\n * Hook to access the i18n instance and translation functions\n * @param ns The namespace to use for translations (defaults to DEFAULT_NAMESPACE)\n * @returns Translation functions and i18n instance\n */\nexport const useI18n = (ns: string = \"thorium-web\") => {\n const { t, i18n, ready } = useTranslation(ns);\n \n // Helper function to change language\n const changeLanguage = (lng: string) => {\n return i18n.changeLanguage(lng);\n };\n\n return {\n // Translation function\n t,\n // i18n instance\n i18n,\n // Whether translations are loaded\n ready,\n // Current language\n currentLanguage: i18n.language,\n // List of available languages\n languages: i18n.languages,\n // Function to change language\n changeLanguage\n };\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/preferences/preferences.ts","../src/preferences/models/const.ts","../src/preferences/defaultPreferences.ts","../src/preferences/ThPreferencesContext.ts","../src/preferences/adapters/ThMemoryPreferencesAdapter.ts","../src/preferences/ThDirectionSetter.tsx","../src/preferences/ThPreferencesProvider.tsx","../src/preferences/helpers/buildThemeObject.ts","../src/preferences/hooks/usePreferences.ts","../src/preferences/hooks/usePreferenceKeys.ts","../src/preferences/hooks/useTheming.ts"],"names":["useEffect","useCallback"],"mappings":"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","file":"chunk-OXZU5FTD.mjs","sourcesContent":["import { UnstableShortcutRepresentation } from \"@/core/Helpers/keyboardUtilities\";\nimport { BreakpointsMap } from \"@/core/Hooks/useBreakpoints\";\nimport { ThemeTokens } from \"@/preferences/hooks/useTheming\";\nimport { \n ThActionsKeys,\n ThDockingKeys,\n ThDockingTypes,\n ThLineHeightOptions, \n ThSettingsKeys, \n ThSettingsRangeVariant, \n ThSheetHeaderVariant, \n ThSheetTypes, \n ThSpacingSettingsKeys, \n ThTextSettingsKeys, \n ThThemeKeys, \n ThLayoutDirection, \n ThLayoutUI,\n ThBackLinkVariant,\n ThProgressionFormat,\n ThRunningHeadFormat,\n ThBreakpoints,\n ThDocumentTitleFormat,\n ThSpacingPresetKeys,\n ThSettingsRangePlaceholder,\n ThArrowVariant\n} from \"./models/enums\";\nimport { ExperimentKey } from \"@readium/navigator\";\nimport { ThCollapsibility, ThCollapsibilityVisibility } from \"@/core/Components/Actions/hooks/useCollapsibility\";\n\nexport type I18nValue<T> = T | string | { key: string; fallback?: string };\n\nexport type ThBackLinkContent = \n | { \n type: \"img\";\n src: string;\n alt?: string;\n }\n | {\n type: \"svg\";\n content: string; // Raw SVG string\n };\n\nexport interface ThBackLinkPref {\n href: string;\n variant?: ThBackLinkVariant;\n visibility?: \"always\" | \"partially\";\n content?: ThBackLinkContent;\n}\n\nexport type ThBottomSheetDetent = \"content-height\" | \"full-height\";\n\nexport interface ThActionsSnappedPref {\n scrim?: boolean | string;\n maxWidth?: number | null;\n maxHeight?: number | ThBottomSheetDetent;\n peekHeight?: number | ThBottomSheetDetent;\n minHeight?: number | ThBottomSheetDetent;\n}\n\nexport interface ThActionsDockedPref {\n dockable: ThDockingTypes,\n dragIndicator?: boolean,\n width?: number,\n minWidth?: number,\n maxWidth?: number\n}\n\nexport interface ThActionsTokens {\n visibility: ThCollapsibilityVisibility;\n shortcut: string | null;\n sheet?: {\n defaultSheet: Exclude<ThSheetTypes, ThSheetTypes.dockedStart | ThSheetTypes.dockedEnd>;\n breakpoints: BreakpointsMap<ThSheetTypes>;\n };\n docked?: ThActionsDockedPref;\n snapped?: ThActionsSnappedPref;\n};\n\nexport interface ThSettingsSpacingPresets<K extends CustomizableKeys = DefaultKeys> {\n reflowOrder: Array<ThSpacingPresetKeys>;\n webPubOrder: Array<ThSpacingPresetKeys>;\n // Not customizable as the component is static radiogroup (icons), unlike themes\n // Publisher and custom are not included as they are special cases\n keys: {\n [key in Exclude<ThSpacingPresetKeys, \"publisher\" | \"custom\">]?: ThSpacingPreset<K>;\n };\n}\n\nexport type ThSpacingPreset<K extends CustomizableKeys = DefaultKeys> = {\n [ThSpacingSettingsKeys.letterSpacing]?: number;\n [ThSpacingSettingsKeys.lineHeight]?: ThLineHeightOptions;\n [ThSpacingSettingsKeys.paragraphIndent]?: number;\n [ThSpacingSettingsKeys.paragraphSpacing]?: number;\n [ThSpacingSettingsKeys.wordSpacing]?: number;\n} & (K extends { spacing: infer S } \n ? S extends string \n ? { [key in S]?: number | ThLineHeightOptions }\n : {}\n : {});\n\nexport type CustomizableKeys = {\n action?: string;\n theme?: string;\n settings?: string;\n text?: string;\n spacing?: string;\n};\n\n// Key types to better handle custom keys for external consumers\nexport type ActionKey<K extends CustomizableKeys> = \n K extends { action: infer A } \n ? A extends string \n ? ThActionsKeys | A \n : ThActionsKeys\n : ThActionsKeys;\n\nexport type ThemeKey<K extends CustomizableKeys> = \n K extends { theme: infer T } \n ? T extends string \n ? ThThemeKeys | T \n : ThThemeKeys\n : ThThemeKeys;\n\nexport type SettingsKey<K extends CustomizableKeys> = \n K extends { settings: infer S } \n ? S extends string \n ? ThSettingsKeys | S \n : ThSettingsKeys\n : ThSettingsKeys;\n\nexport type TextSettingsKey<K extends CustomizableKeys> = \n K extends { text: infer T } \n ? T extends string \n ? ThTextSettingsKeys | T \n : ThTextSettingsKeys\n : ThTextSettingsKeys;\n\nexport type SpacingSettingsKey<K extends CustomizableKeys> = \n K extends { spacing: infer S } \n ? S extends string \n ? ThSpacingSettingsKeys | S \n : ThSpacingSettingsKeys\n : ThSpacingSettingsKeys;\n\nexport interface ThActionsPref<K extends CustomizableKeys> {\n reflowOrder: Array<ActionKey<K>>;\n fxlOrder: Array<ActionKey<K>>;\n webPubOrder: Array<ActionKey<K>>;\n collapse: ThCollapsibility;\n keys: Record<ActionKey<K>, ThActionsTokens>;\n};\n\nexport interface ThDockingPref<T extends string> {\n displayOrder: T[];\n collapse: ThCollapsibility;\n dock: BreakpointsMap<ThDockingTypes> | boolean; \n keys: {\n [key in T]: Pick<ThActionsTokens, \"visibility\" | \"shortcut\">;\n }\n};\n\nexport interface ThSettingsGroupPref<T> {\n main?: T[];\n subPanel?: T[] | null;\n header?: ThSheetHeaderVariant;\n}\n\nexport interface ThSettingsRangePref {\n variant?: ThSettingsRangeVariant;\n placeholder?: I18nValue<ThSettingsRangePlaceholder>;\n range?: [number, number];\n step?: number;\n}\n\nexport interface ThSettingsRadioPref<T extends string> {\n allowUnset?: boolean;\n keys: {\n [key in T]: number;\n };\n}\n\nexport type ThSettingsKeyTypes<K extends CustomizableKeys = DefaultKeys> = {\n [ThSettingsKeys.letterSpacing]: ThSettingsRangePref;\n [ThSettingsKeys.lineHeight]: ThSettingsRadioPref<Exclude<ThLineHeightOptions, ThLineHeightOptions.publisher>>;\n [ThSettingsKeys.paragraphIndent]: ThSettingsRangePref;\n [ThSettingsKeys.paragraphSpacing]: ThSettingsRangePref;\n [ThSettingsKeys.wordSpacing]: ThSettingsRangePref;\n [ThSettingsKeys.zoom]: ThSettingsRangePref;\n} & (\n K extends { settings: infer S } \n ? S extends string \n ? { [key in S]: any }\n : {}\n : {}\n);\n\nexport type ThConstraintKeys = Extract<ThSheetTypes, ThSheetTypes.bottomSheet | ThSheetTypes.popover> | \"pagination\";\n\nexport interface ThFormatPrefValue<T extends string | Array<string>> {\n variants: T;\n displayInImmersive?: boolean;\n displayInFullscreen?: boolean;\n}\n\nexport interface ThFormatPref<T extends string | Array<string>> {\n default: ThFormatPrefValue<T>;\n breakpoints?: { \n [key in ThBreakpoints]?: ThFormatPrefValue<T>;\n };\n}\n\nexport interface ThPaginatedAffordancePrefValue {\n variant: ThArrowVariant;\n discard?: Array<\"navigation\" | \"immersive\" | \"fullscreen\"> | \"none\";\n hint?: Array<\"immersiveChange\" | \"fullscreenChange\" | \"layoutChange\"> | \"none\";\n}\n\nexport interface ThPaginatedAffordancePref {\n default: Required<ThPaginatedAffordancePrefValue>;\n breakpoints?: {\n [key in ThBreakpoints]?: ThPaginatedAffordancePrefValue;\n };\n}\n\n// Main preferences interface with simplified generics\nexport interface ThPreferences<K extends CustomizableKeys = {}> {\n direction?: ThLayoutDirection;\n locale?: string;\n experiments?: {\n reflow?: Array<ExperimentKey>;\n webPub?: Array<ExperimentKey>;\n };\n metadata?: {\n documentTitle?: {\n // TODO – Templating of custom\n format: I18nValue<ThDocumentTitleFormat>;\n };\n };\n typography: {\n minimalLineLength?: number | null;\n maximalLineLength?: number | null;\n optimalLineLength: number;\n pageGutter: number;\n };\n theming: {\n header?: {\n backLink?: ThBackLinkPref | null;\n runningHead?: {\n format?: {\n reflow?: ThFormatPref<ThRunningHeadFormat>;\n fxl?: ThFormatPref<ThRunningHeadFormat>;\n webPub?: ThFormatPref<ThRunningHeadFormat>;\n }\n }\n };\n progression?: {\n format?: {\n reflow?: ThFormatPref<ThProgressionFormat | Array<ThProgressionFormat>>;\n fxl?: ThFormatPref<ThProgressionFormat | Array<ThProgressionFormat>>;\n webPub?: ThFormatPref<ThProgressionFormat | Array<ThProgressionFormat>>;\n };\n };\n arrow: {\n size: number;\n offset: number;\n tooltipDelay?: number;\n };\n icon: {\n size: number;\n tooltipOffset: number;\n tooltipDelay?: number;\n };\n layout: {\n ui?: {\n reflow?: ThLayoutUI,\n fxl?: ThLayoutUI,\n webPub?: ThLayoutUI\n };\n radius: number;\n spacing: number;\n defaults: {\n dockingWidth: number;\n scrim: string;\n };\n constraints?: {\n [key in ThConstraintKeys]?: number | null\n }\n };\n breakpoints: BreakpointsMap<number | null>;\n themes: {\n reflowOrder: Array<ThemeKey<K> | \"auto\">;\n fxlOrder: Array<ThemeKey<K> | \"auto\">;\n systemThemes?: {\n light: ThemeKey<K>;\n dark: ThemeKey<K>;\n };\n // keys never includes \"auto\"\n keys: Record<Exclude<ThemeKey<K>, \"auto\"> & string, ThemeTokens>;\n };\n };\n affordances: {\n scroll: {\n hintInImmersive: boolean;\n toggleOnMiddlePointer: Array<\"tap\" | \"click\">;\n hideOnForwardScroll: boolean;\n showOnBackwardScroll: boolean;\n },\n paginated: {\n reflow: ThPaginatedAffordancePref;\n fxl: ThPaginatedAffordancePref;\n }\n };\n actions: ThActionsPref<K>;\n shortcuts: {\n representation: UnstableShortcutRepresentation;\n joiner?: string;\n };\n docking: ThDockingPref<ThDockingKeys>;\n settings: {\n reflowOrder: Array<SettingsKey<K>>;\n fxlOrder: Array<SettingsKey<K>>;\n webPubOrder: Array<SettingsKey<K>>;\n keys: ThSettingsKeyTypes<K>;\n text?: ThSettingsGroupPref<TextSettingsKey<K>>;\n spacing?: ThSettingsGroupPref<SpacingSettingsKey<K>> & { presets?: ThSettingsSpacingPresets<K> };\n };\n}\n\n/**\n * Creates a new preferences object with the provided parameters\n * @param params The preferences object to create\n * @returns A new preferences object\n */\nexport const createPreferences = <K extends CustomizableKeys = {}>(\n params: ThPreferences<K>\n): ThPreferences<K> => {\n // Helper function to validate keys against the provided order arrays\n const validateObjectKeys = <K extends string, V>(\n orderArrays: K[][],\n keysObj: Record<string, V>,\n context: string,\n specialCase?: string | string[],\n fallback?: V\n ): void => {\n // Combine all arrays and filter out special cases if needed\n const allOrders = new Set<K>(\n orderArrays.flatMap(arr => {\n if (!specialCase) return arr;\n return arr.filter(k => {\n if (Array.isArray(specialCase)) {\n return !specialCase.includes(k);\n } else {\n return k !== specialCase;\n }\n });\n })\n );\n \n // Get available keys\n const availableKeys = Object.keys(keysObj);\n \n // Check that all keys exist and add from fallback if available\n allOrders.forEach(key => {\n if (!availableKeys.includes(key)) {\n if (fallback) {\n // Add the missing key from fallback to the params object\n keysObj[key] = fallback;\n }\n console.warn(`Key \"${ key }\" in ${ context } order arrays not found in ${ context }.keys.${ fallback ? `\\nUsing fallback: ${ JSON.stringify(fallback) }` : \"\" }`);\n }\n });\n };\n \n // Validate actions\n if (params.actions) {\n validateObjectKeys<ActionKey<K>, ThActionsTokens>(\n [params.actions.reflowOrder as Array<ActionKey<K>>, params.actions.fxlOrder as Array<ActionKey<K>>, params.actions.webPubOrder as Array<ActionKey<K>>],\n params.actions.keys as Record<string, ThActionsTokens>,\n \"actions\"\n );\n }\n \n // Validate themes\n if (params.theming?.themes) {\n validateObjectKeys<ThemeKey<K> | \"auto\", ThemeTokens>(\n [params.theming.themes.reflowOrder as Array<ThemeKey<K> | \"auto\">, params.theming.themes.fxlOrder as Array<ThemeKey<K> | \"auto\">],\n params.theming.themes.keys as Record<string, ThemeTokens>,\n \"theming.themes\",\n \"auto\" // Special case for themes\n );\n }\n\n // Validate spacing presets\n if (params.settings.spacing?.presets) {\n validateObjectKeys<ThSpacingPresetKeys, ThSpacingPreset<K>>(\n [params.settings.spacing.presets.reflowOrder],\n params.settings.spacing.presets.keys as Record<string, ThSpacingPreset<K>>,\n \"settings.spacing.presets\",\n [\"publisher\", \"custom\"]\n );\n }\n\n // Validate spacing values in theming against settings\n if (params.settings?.spacing?.presets?.keys && params.settings?.keys) {\n const spacingSettings = params.settings.spacing.presets.keys;\n const spacingThemes = params.settings.spacing.presets.keys;\n \n // Helper function to adjust a value to the nearest valid step or range boundary\n const adjustSpacingValue = (key: string, value: number, context: string[]): number => {\n // Type-safe way to get the setting\n const settingKey = Object.values(ThSettingsKeys).find((k) => k === key);\n if (!settingKey) {\n return value; // Return as-is if no setting found\n }\n \n const setting = (spacingSettings as any)[settingKey];\n if (!setting) {\n return value; // Return as-is if no setting found\n }\n \n // Handle different setting types\n let range: [number, number] | undefined;\n let step: number | undefined;\n \n if (setting && typeof setting === \"object\" && \"range\" in setting) {\n range = setting.range;\n step = setting.step;\n } else if (setting && typeof setting === \"object\") {\n // Handle nested settings (like lineHeight and margin)\n // These will be validated when their parent key is validated\n return value;\n }\n \n let adjustedValue = value;\n \n // Adjust to range boundaries if needed\n if (range) {\n const [min, max] = range;\n if (adjustedValue < min) {\n console.warn(`Adjusting value ${ value } for ${ context.join(\".\") } to minimum allowed value ${ min }`);\n adjustedValue = min;\n } else if (adjustedValue > max) {\n console.warn(`Adjusting value ${ value } for ${ context.join(\".\") } to maximum allowed value ${ max }`);\n adjustedValue = max;\n }\n }\n \n // Adjust to nearest step if needed\n if (step && range) {\n const [min] = range;\n const steps = Math.round((adjustedValue - min) / step);\n const steppedValue = parseFloat((min + (steps * step)).toFixed(10));\n \n // Ensure the stepped value is within range (in case of floating point precision issues)\n const finalValue = Math.min(Math.max(steppedValue, range[0]), range[1]);\n \n if (Math.abs(finalValue - adjustedValue) > Number.EPSILON) {\n console.warn(`Adjusting value ${ value } for ${ context.join(\".\") } to nearest step value ${ finalValue }`);\n adjustedValue = finalValue;\n }\n }\n \n return adjustedValue;\n };\n \n // Process each spacing theme to adjust values to valid steps/ranges\n for (const [themeName, spacingTheme] of Object.entries(spacingThemes)) {\n if (spacingTheme && typeof spacingTheme === \"object\") {\n const adjustedTheme: Record<string, any> = {};\n let hasAdjustedValues = false;\n \n // Process each value in the theme\n for (const [key, value] of Object.entries(spacingTheme)) {\n if (typeof value === \"number\") {\n const context = [\"theming\", \"spacing\", \"keys\", themeName, key];\n const adjustedValue = adjustSpacingValue(key, value, context);\n adjustedTheme[key] = adjustedValue;\n \n if (adjustedValue !== value) {\n hasAdjustedValues = true;\n }\n } else {\n // Keep non-number values as-is\n adjustedTheme[key] = value;\n }\n }\n \n // Replace the theme with adjusted values if any changes were made\n if (hasAdjustedValues) {\n // @ts-ignore - We know spacingThemes[themeName] is mutable\n spacingThemes[themeName as keyof typeof spacingThemes] = adjustedTheme;\n }\n }\n }\n }\n \n return params;\n};\n\n// Default internal keys alias for convenience\nexport type DefaultKeys = {\n action: ThActionsKeys;\n theme: ThThemeKeys;\n settings: ThSettingsKeys;\n text: ThTextSettingsKeys;\n spacing: ThSpacingSettingsKeys;\n};\n\n// Type helpers that support both custom and default keys\nexport type ActionKeyType<K extends CustomizableKeys = DefaultKeys> = K[\"action\"] extends string ? K[\"action\"] : ThActionsKeys;\nexport type ThemeKeyType<K extends CustomizableKeys = DefaultKeys> = K[\"theme\"] extends string ? K[\"theme\"] : ThThemeKeys;\nexport type SettingsKeyType<K extends CustomizableKeys = DefaultKeys> = K[\"settings\"] extends string ? K[\"settings\"] : ThSettingsKeys;\nexport type TextSettingsKeyType<K extends CustomizableKeys = DefaultKeys> = K[\"text\"] extends string ? K[\"text\"] : ThTextSettingsKeys;\nexport type SpacingSettingsKeyType<K extends CustomizableKeys = DefaultKeys> = K[\"spacing\"] extends string ? K[\"spacing\"] : ThSpacingSettingsKeys;","\"use client\";\n\nimport fontStacks from \"@readium/css/css/vars/fontStacks.json\";\n\nimport { \n ThLineHeightOptions, \n ThSettingsRangePlaceholder, \n ThSettingsRangeVariant, \n ThSpacingPresetKeys, \n ThSpacingSettingsKeys, \n ThTextSettingsKeys \n} from \"./enums\";\nimport { ThActionsTokens, ThSettingsRangePref } from \"../preferences\";\nimport { ThCollapsibilityVisibility } from \"@/core/Components/Actions/hooks/useCollapsibility\";\n\nexport const defaultActionKeysObject: ThActionsTokens = {\n visibility: ThCollapsibilityVisibility.partially,\n shortcut: null\n};\n\nexport const defaultTextSettingsMain = [ThTextSettingsKeys.fontFamily];\n\nexport const defaultTextSettingsSubpanel = [\n ThTextSettingsKeys.fontFamily,\n ThTextSettingsKeys.textAlign,\n ThTextSettingsKeys.hyphens,\n ThTextSettingsKeys.fontWeight,\n ThTextSettingsKeys.textNormalize\n]\n\nexport const defaultSpacingSettingsMain = [\n ThSpacingSettingsKeys.spacingPresets\n];\n\nexport const defaultSpacingSettingsSubpanel = [\n ThSpacingSettingsKeys.spacingPresets,\n ThSpacingSettingsKeys.lineHeight,\n ThSpacingSettingsKeys.paragraphSpacing,\n ThSpacingSettingsKeys.paragraphIndent,\n ThSpacingSettingsKeys.wordSpacing,\n ThSpacingSettingsKeys.letterSpacing\n];\n\nexport const defaultSpacingPresetsOrder = [\n ThSpacingPresetKeys.publisher,\n ThSpacingPresetKeys.accessible,\n ThSpacingPresetKeys.custom,\n ThSpacingPresetKeys.tight,\n ThSpacingPresetKeys.balanced,\n ThSpacingPresetKeys.loose\n]\n\nexport const defaultFontFamilyOptions = {\n publisher: null,\n oldStyle: fontStacks.RS__oldStyleTf,\n modern: fontStacks.RS__modernTf,\n sans: fontStacks.RS__sansTf,\n humanist: fontStacks.RS__humanistTf,\n monospace: fontStacks.RS__monospaceTf\n}\n\nexport const defaultParagraphSpacing: Required<ThSettingsRangePref> = {\n variant: ThSettingsRangeVariant.numberField,\n placeholder: ThSettingsRangePlaceholder.range,\n range: [0, 3],\n step: 0.25\n}\n\nexport const defaultParagraphIndent: Required<ThSettingsRangePref> = {\n variant: ThSettingsRangeVariant.numberField,\n placeholder: ThSettingsRangePlaceholder.range,\n range: [0, 2],\n step: 0.25\n}\n\nexport const defaultWordSpacing: Required<ThSettingsRangePref> = {\n variant: ThSettingsRangeVariant.numberField,\n placeholder: ThSettingsRangePlaceholder.range,\n range: [0, 1],\n step: 0.1\n}\n\nexport const defaultLetterSpacing: Required<ThSettingsRangePref> = {\n variant: ThSettingsRangeVariant.numberField,\n placeholder: ThSettingsRangePlaceholder.range,\n range: [0, 0.5],\n step: 0.05\n}\n\nexport const defaultLineHeights = {\n [ThLineHeightOptions.small]: 1.3,\n [ThLineHeightOptions.medium]: 1.5,\n [ThLineHeightOptions.large]: 1.75\n}\n\nexport const defaultZoom: Required<ThSettingsRangePref> = {\n variant: ThSettingsRangeVariant.numberField,\n placeholder: ThSettingsRangePlaceholder.range,\n range: [0.7, 4],\n step: 0.05\n}\n\nexport const defaultSpacingPresets = {\n [ThSpacingPresetKeys.tight]: {\n [ThSpacingSettingsKeys.lineHeight]: ThLineHeightOptions.small,\n [ThSpacingSettingsKeys.paragraphSpacing]: 0,\n [ThSpacingSettingsKeys.paragraphIndent]: 1\n },\n [ThSpacingPresetKeys.balanced]: {\n [ThSpacingSettingsKeys.lineHeight]: ThLineHeightOptions.medium,\n [ThSpacingSettingsKeys.paragraphSpacing]: 0.75,\n [ThSpacingSettingsKeys.paragraphIndent]: 0\n },\n [ThSpacingPresetKeys.loose]: {\n [ThSpacingSettingsKeys.lineHeight]: ThLineHeightOptions.large,\n [ThSpacingSettingsKeys.paragraphSpacing]: 1.75,\n [ThSpacingSettingsKeys.paragraphIndent]: 0\n },\n [ThSpacingPresetKeys.accessible]: {\n [ThSpacingSettingsKeys.lineHeight]: ThLineHeightOptions.large,\n [ThSpacingSettingsKeys.paragraphSpacing]: 2.5,\n [ThSpacingSettingsKeys.paragraphIndent]: 0,\n [ThSpacingSettingsKeys.letterSpacing]: 0.1,\n [ThSpacingSettingsKeys.wordSpacing]: 0.3\n }\n}","\"use client\";\n\nimport { UnstableShortcutMetaKeywords, UnstableShortcutRepresentation } from \"@/core/Helpers/keyboardUtilities\";\nimport { ThCollapsibilityVisibility } from \"@/core/Components/Actions/hooks/useCollapsibility\";\nimport { \n ThActionsKeys, \n ThBreakpoints, \n ThDockingTypes, \n ThDockingKeys, \n ThSettingsKeys, \n ThSheetTypes, \n ThThemeKeys, \n ThLayoutDirection,\n ThTextSettingsKeys,\n ThSheetHeaderVariant,\n ThLayoutUI,\n ThBackLinkVariant,\n ThProgressionFormat,\n ThRunningHeadFormat,\n ThDocumentTitleFormat,\n ThArrowVariant,\n} from \"./models/enums\";\nimport { createPreferences, ThPreferences, DefaultKeys } from \"./preferences\";\n\nimport ReadiumCSSColors from \"@readium/css/css/vars/colors.json\";\nimport { \n defaultLetterSpacing, \n defaultLineHeights, \n defaultParagraphIndent, \n defaultParagraphSpacing, \n defaultSpacingPresets, \n defaultSpacingPresetsOrder, \n defaultWordSpacing, \n defaultZoom\n} from \"./models/const\";\n\nexport const defaultPreferences: ThPreferences<DefaultKeys> = createPreferences<DefaultKeys>({\n// direction: ThLayoutDirection.ltr,\n// locale: \"en\",\n experiments: {\n reflow: [\"experimentalHeaderFiltering\", \"experimentalZoom\"],\n webPub: [\"experimentalHeaderFiltering\", \"experimentalZoom\"]\n },\n metadata: {\n documentTitle: {\n format: ThDocumentTitleFormat.title\n }\n },\n typography: {\n minimalLineLength: 40, // undefined | null | number of characters. If 2 cols will switch to 1 based on this\n optimalLineLength: 55, // number of characters. If auto layout, picks colCount based on this\n maximalLineLength: 70, // undefined | null | number of characters.\n pageGutter: 20\n },\n theming: {\n header: {\n backLink: {\n variant: ThBackLinkVariant.arrow,\n visibility: \"partially\",\n href: \"/\"\n },\n runningHead: {\n format: {\n reflow: {\n default: {\n variants: ThRunningHeadFormat.chapter,\n displayInImmersive: true,\n displayInFullscreen: false\n },\n breakpoints: {\n [ThBreakpoints.compact]: {\n variants: ThRunningHeadFormat.chapter,\n displayInImmersive: false,\n displayInFullscreen: false\n }\n }\n },\n fxl: {\n default: {\n variants: ThRunningHeadFormat.title,\n displayInImmersive: true,\n displayInFullscreen: true\n },\n breakpoints: {\n [ThBreakpoints.compact]: {\n variants: ThRunningHeadFormat.title,\n displayInImmersive: false,\n displayInFullscreen: true\n }\n }\n },\n webPub: {\n default: {\n variants: ThRunningHeadFormat.chapter,\n displayInImmersive: true,\n displayInFullscreen: true\n }\n }\n }\n }\n },\n progression: {\n format: {\n reflow: {\n default: {\n variants: [\n ThProgressionFormat.positionsPercentOfTotal,\n ThProgressionFormat.progressionOfResource\n ],\n displayInImmersive: true,\n displayInFullscreen: false\n },\n breakpoints: {\n [ThBreakpoints.compact]: {\n variants: [\n ThProgressionFormat.positionsOfTotal, \n ThProgressionFormat.resourceProgression\n ],\n displayInImmersive: false,\n displayInFullscreen: false\n }\n }\n },\n fxl: {\n default: {\n variants: [\n ThProgressionFormat.positionsOfTotal, \n ThProgressionFormat.overallProgression,\n ThProgressionFormat.none\n ],\n displayInImmersive: true,\n displayInFullscreen: true\n },\n breakpoints: {\n [ThBreakpoints.compact]: {\n variants: [\n ThProgressionFormat.positions, \n ThProgressionFormat.overallProgression,\n ThProgressionFormat.none\n ],\n displayInImmersive: false,\n displayInFullscreen: true\n }\n }\n },\n webPub: {\n default: {\n variants: [\n ThProgressionFormat.readingOrderIndex, \n ThProgressionFormat.none\n ],\n displayInImmersive: true,\n displayInFullscreen: true\n }\n }\n }\n },\n arrow: {\n size: 40, // Size of the left and right arrows in px\n offset: 5 // offset of the arrows from the edges in px\n },\n icon: {\n size: 24, // Size of icons in px\n tooltipOffset: 10 // offset of tooltip in px\n },\n layout: {\n ui: {\n reflow: ThLayoutUI.layered,\n fxl: ThLayoutUI.layered,\n webPub: ThLayoutUI.stacked\n },\n radius: 5, // border-radius of containers\n spacing: 20, // padding of containers/sheets\n defaults: {\n dockingWidth: 340, // default width of resizable panels\n scrim: \"rgba(0, 0, 0, 0.2)\" // default scrim/underlay bg-color\n },\n constraints: {\n [ThSheetTypes.bottomSheet]: 600, // Max-width of all bottom sheets\n [ThSheetTypes.popover]: 600, // Max-width of all popover sheets\n pagination: 1024 // Max-width of pagination component\n }\n },\n breakpoints: {\n // See https://m3.material.io/foundations/layout/applying-layout/window-size-classes\n [ThBreakpoints.compact]: 600, // Phone in portrait\n [ThBreakpoints.medium]: 840, // Tablet in portrait, Foldable in portrait (unfolded)\n [ThBreakpoints.expanded]: 1200, // Phone in landscape, Tablet in landscape, Foldable in landscape (unfolded), Desktop\n [ThBreakpoints.large]: 1600, // Desktop\n [ThBreakpoints.xLarge]: null // Desktop Ultra-wide\n },\n themes: {\n reflowOrder: [\n \"auto\", \n ThThemeKeys.light, \n ThThemeKeys.sepia, \n ThThemeKeys.paper, \n ThThemeKeys.dark, \n ThThemeKeys.contrast1, \n ThThemeKeys.contrast2, \n ThThemeKeys.contrast3\n ],\n fxlOrder: [\n \"auto\",\n ThThemeKeys.light,\n ThThemeKeys.dark\n ],\n systemThemes: {\n light: ThThemeKeys.light,\n dark: ThThemeKeys.dark\n },\n keys: {\n [ThThemeKeys.light]: {\n background: ReadiumCSSColors.RS__backgroundColor, // Color of background\n text: ReadiumCSSColors.RS__textColor, // Color of text\n link: \"#0000ee\", // Color of links\n visited: \"#551a8b\", // Color of visited links\n subdue: \"#808080\", // Color of subdued elements\n disable: \"#808080\", // color for :disabled\n hover: \"#d9d9d9\", // color of background for :hover\n onHover: ReadiumCSSColors.RS__textColor, // color of text for :hover\n select: \"#b4d8fe\", // color of selected background\n onSelect: \"inherit\", // color of selected text\n focus: \"#0067f4\", // color of :focus-visible\n elevate: \"0px 0px 2px #808080\", // drop shadow of containers\n immerse: \"0.6\" // opacity of immersive mode\n },\n [ThThemeKeys.sepia]: {\n background: \"#faf4e8\",\n text: \"#121212\",\n link: \"#0000EE\",\n visited: \"#551A8B\",\n subdue: \"#8c8c8c\",\n disable: \"#8c8c8c\",\n hover: \"#edd7ab\",\n onHover: \"#121212\",\n select: \"#b4d8fe\",\n onSelect: \"inherit\",\n focus: \"#0067f4\",\n elevate: \"0px 0px 2px #8c8c8c\",\n immerse: \"0.5\"\n },\n [ThThemeKeys.dark]: {\n background: \"#000000\",\n text: \"#FEFEFE\",\n link: \"#63caff\",\n visited: \"#0099E5\",\n subdue: \"#808080\",\n disable: \"#808080\",\n hover: \"#404040\",\n onHover: \"#FEFEFE\",\n select: \"#b4d8fe\",\n onSelect: \"inherit\",\n focus: \"#0067f4\",\n elevate: \"0px 0px 2px #808080\",\n immerse: \"0.4\"\n },\n [ThThemeKeys.paper]: {\n background: \"#e9ddc8\",\n text: \"#000000\",\n link: \"#0000EE\",\n visited: \"#551A8B\",\n subdue: \"#8c8c8c\",\n disable: \"#8c8c8c\",\n hover: \"#ccb07f\",\n onHover: \"#000000\",\n select: \"#b4d8fe\",\n onSelect: \"inherit\",\n focus: \"#004099\",\n elevate: \"0px 0px 2px #8c8c8c\",\n immerse: \"0.45\"\n },\n [ThThemeKeys.contrast1]: {\n background: \"#000000\",\n text: \"#ffff00\",\n link: \"#63caff\",\n visited: \"#0099E5\",\n subdue: \"#808000\",\n disable: \"#808000\",\n hover: \"#404040\",\n onHover: \"#ffff00\",\n select: \"#b4d8fe\",\n onSelect: \"inherit\",\n focus: \"#0067f4\",\n elevate: \"0px 0px 2px #808000\",\n immerse: \"0.4\"\n },\n [ThThemeKeys.contrast2]: {\n background: \"#181842\",\n text: \"#ffffff\",\n link: \"#adcfff\",\n visited: \"#7ab2ff\",\n subdue: \"#808080\",\n disable: \"#808080\",\n hover: \"#4444bb\",\n onHover: \"#ffffff\",\n select: \"#b4d8fe\",\n onSelect: \"inherit\",\n focus: \"#6BA9FF\",\n elevate: \"0px 0px 2px #808080\",\n immerse: \"0.4\"\n },\n [ThThemeKeys.contrast3]: {\n background: \"#c5e7cd\",\n text: \"#000000\",\n link: \"#0000EE\",\n visited: \"#551A8B\",\n subdue: \"#8c8c8c\",\n disable: \"#8c8c8c\",\n hover: \"#6fc383\",\n onHover: \"#000000\",\n select: \"#b4d8fe\",\n onSelect: \"inherit\",\n focus: \"#004099\",\n elevate: \"0px 0px 2px #8c8c8c\",\n immerse: \"0.45\"\n }\n }\n },\n },\n affordances: { \n scroll: {\n hintInImmersive: true,\n toggleOnMiddlePointer: [\"tap\", \"click\"],\n hideOnForwardScroll: true,\n showOnBackwardScroll: true\n },\n paginated: {\n reflow: {\n default: {\n variant: ThArrowVariant.layered,\n discard: [\"navigation\"],\n hint: [\"layoutChange\"]\n },\n breakpoints: {\n [ThBreakpoints.large]: {\n variant: ThArrowVariant.stacked\n },\n [ThBreakpoints.xLarge]: {\n variant: ThArrowVariant.stacked\n }\n }\n },\n fxl: {\n // Note FXL arrows are always layered\n // FXL navigator is using the window width to calculate the layout\n // so we need to force the layered variant to prevent layout issues\n default: {\n variant: ThArrowVariant.layered,\n discard: [\"navigation\"],\n hint: \"none\"\n }\n }\n }\n },\n shortcuts: {\n representation: UnstableShortcutRepresentation.symbol,\n joiner: \"+\"\n },\n actions: {\n reflowOrder: [\n ThActionsKeys.settings,\n ThActionsKeys.toc,\n ThActionsKeys.fullscreen,\n ThActionsKeys.jumpToPosition\n ],\n fxlOrder: [\n ThActionsKeys.settings,\n ThActionsKeys.toc,\n ThActionsKeys.fullscreen,\n ThActionsKeys.jumpToPosition\n ],\n webPubOrder: [\n ThActionsKeys.settings,\n ThActionsKeys.toc,\n ThActionsKeys.fullscreen\n ],\n collapse: {\n // Number of partially icons to display\n // value \"all\" a keyword for the length of displayOrder above\n // Icons with visibility always are excluded from collapsing\n [ThBreakpoints.compact]: 2,\n [ThBreakpoints.medium]: 3\n }, \n keys: {\n [ThActionsKeys.settings]: {\n visibility: ThCollapsibilityVisibility.partially,\n shortcut: null, // `${ UnstableShortcutMetaKeywords.shift }+${ ShortcutMetaKeywords.alt }+P`,\n sheet: {\n defaultSheet: ThSheetTypes.popover,\n breakpoints: {\n [ThBreakpoints.compact]: ThSheetTypes.bottomSheet\n }\n },\n docked: {\n dockable: ThDockingTypes.none,\n width: 340\n },\n snapped: {\n scrim: true,\n peekHeight: 50,\n minHeight: 30,\n maxHeight: 100\n }\n },\n [ThActionsKeys.fullscreen]: {\n visibility: ThCollapsibilityVisibility.partially,\n shortcut: null\n },\n [ThActionsKeys.toc]: {\n visibility: ThCollapsibilityVisibility.partially,\n shortcut: null, // `${ UnstableShortcutMetaKeywords.shift }+${ ShortcutMetaKeywords.alt }+T`,\n sheet: {\n defaultSheet: ThSheetTypes.popover,\n breakpoints: {\n [ThBreakpoints.compact]: ThSheetTypes.fullscreen,\n [ThBreakpoints.medium]: ThSheetTypes.fullscreen\n }\n },\n docked: {\n dockable: ThDockingTypes.both,\n dragIndicator: false,\n width: 360,\n minWidth: 320,\n maxWidth: 450\n }\n },\n [ThActionsKeys.jumpToPosition]: {\n visibility: ThCollapsibilityVisibility.overflow,\n shortcut: null, // `${ UnstableShortcutMetaKeywords.shift }+${ ShortcutMetaKeywords.alt }+J`,\n sheet: {\n defaultSheet: ThSheetTypes.popover,\n breakpoints: {\n [ThBreakpoints.compact]: ThSheetTypes.bottomSheet\n }\n },\n docked: {\n dockable: ThDockingTypes.none\n },\n snapped: {\n scrim: true,\n minHeight: \"content-height\"\n }\n }\n }\n },\n docking: {\n displayOrder: [\n ThDockingKeys.transient,\n ThDockingKeys.start,\n ThDockingKeys.end\n ],\n dock: {\n [ThBreakpoints.compact]: ThDockingTypes.none,\n [ThBreakpoints.medium]: ThDockingTypes.none,\n [ThBreakpoints.expanded]: ThDockingTypes.start,\n [ThBreakpoints.large]: ThDockingTypes.both,\n [ThBreakpoints.xLarge]: ThDockingTypes.both\n },\n collapse: true,\n keys: {\n [ThDockingKeys.start]: {\n visibility: ThCollapsibilityVisibility.overflow,\n shortcut: null\n },\n [ThDockingKeys.end]: {\n visibility: ThCollapsibilityVisibility.overflow,\n shortcut: null\n },\n [ThDockingKeys.transient]: {\n visibility: ThCollapsibilityVisibility.overflow,\n shortcut: null\n }\n }\n },\n settings: {\n reflowOrder: [\n ThSettingsKeys.zoom,\n ThSettingsKeys.textGroup,\n ThSettingsKeys.theme,\n ThSettingsKeys.spacingGroup,\n ThSettingsKeys.layout,\n ThSettingsKeys.columns\n ],\n fxlOrder: [\n ThSettingsKeys.theme,\n ThSettingsKeys.columns\n ],\n webPubOrder: [\n ThSettingsKeys.zoom,\n ThSettingsKeys.textGroup,\n ThSettingsKeys.spacingGroup\n ],\n keys: {\n [ThSettingsKeys.letterSpacing]: defaultLetterSpacing,\n [ThSettingsKeys.lineHeight]: {\n allowUnset: false,\n keys: defaultLineHeights\n },\n [ThSettingsKeys.paragraphIndent]: defaultParagraphIndent,\n [ThSettingsKeys.paragraphSpacing]: defaultParagraphSpacing,\n [ThSettingsKeys.wordSpacing]: defaultWordSpacing,\n [ThSettingsKeys.zoom]: defaultZoom\n },\n text: {\n header: ThSheetHeaderVariant.previous\n },\n spacing: {\n header: ThSheetHeaderVariant.previous,\n presets: {\n reflowOrder: defaultSpacingPresetsOrder,\n webPubOrder: defaultSpacingPresetsOrder,\n keys: defaultSpacingPresets\n }\n }\n }\n})","\"use client\";\n\nimport { createContext } from \"react\";\nimport { defaultPreferences } from \"./defaultPreferences\";\nimport { ThPreferences, DefaultKeys, CustomizableKeys } from \"./preferences\";\n\nexport interface PreferencesContextValue<K extends CustomizableKeys = DefaultKeys> {\n preferences: ThPreferences<K>;\n updatePreferences: (prefs: ThPreferences<K>) => void;\n}\n\n// Create a context with a default value that will be overridden\nexport const ThPreferencesContext = createContext<PreferencesContextValue<any> | null>(null);\n\n// Keep the default export for backward compatibility\nexport const defaultPreferencesContextValue: PreferencesContextValue<DefaultKeys> = {\n preferences: defaultPreferences as ThPreferences<DefaultKeys>,\n updatePreferences: () => {\n throw new Error(\"updatePreferences must be used within a ThPreferencesProvider with an adapter\");\n },\n};","import { ThPreferences, CustomizableKeys } from \"../preferences\";\nimport { ThPreferencesAdapter } from \"./ThPreferencesAdapter\";\n\nexport class ThMemoryPreferencesAdapter<T extends CustomizableKeys = CustomizableKeys> implements ThPreferencesAdapter<T> {\n private currentPreferences: ThPreferences<T>;\n private listeners: Set<(prefs: ThPreferences<T>) => void> = new Set();\n\n constructor(initialPreferences: ThPreferences<T>) {\n this.currentPreferences = { ...initialPreferences };\n }\n\n public getPreferences(): ThPreferences<T> {\n return { ...this.currentPreferences };\n }\n\n public setPreferences(prefs: ThPreferences<T>): void {\n this.currentPreferences = { ...prefs };\n this.notifyListeners(this.currentPreferences);\n }\n\n public subscribe(listener: (prefs: ThPreferences<T>) => void): void {\n this.listeners.add(listener);\n }\n\n public unsubscribe(listener: (prefs: ThPreferences<T>) => void): void {\n this.listeners.delete(listener);\n }\n\n private notifyListeners(prefs: ThPreferences<T>): void {\n this.listeners.forEach(listener => listener({ ...prefs }));\n }\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\n\nimport { ThLayoutDirection } from \"./models/enums\";\n\nexport const ThDirectionSetter = ({ \n direction, \n children \n}: { \n direction?: ThLayoutDirection,\n children: React.ReactNode \n}) => {\n \n useEffect(() => {\n if (direction) document.documentElement.dir = direction;\n }, [direction]);\n\n return children;\n};","\"use client\";\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport { ThPreferences, CustomizableKeys, DefaultKeys } from \"./preferences\";\nimport { ThPreferencesContext, defaultPreferencesContextValue } from \"./ThPreferencesContext\";\n\nimport { ThPreferencesAdapter } from \"./adapters/ThPreferencesAdapter\";\nimport { ThMemoryPreferencesAdapter } from \"./adapters/ThMemoryPreferencesAdapter\";\nimport { ThDirectionSetter } from \"./ThDirectionSetter\";\n\ntype Props<K extends CustomizableKeys = DefaultKeys> = {\n adapter?: ThPreferencesAdapter<K>;\n initialPreferences?: ThPreferences<K>;\n children: React.ReactNode;\n};\n\nexport function ThPreferencesProvider<K extends CustomizableKeys = DefaultKeys>({ \n adapter,\n initialPreferences,\n children, \n}: Props<K>) {\n // Create a default in-memory adapter if none is provided\n const effectiveAdapter = useMemo(() => {\n return adapter || new ThMemoryPreferencesAdapter<K>(\n (initialPreferences as ThPreferences<K>) || (defaultPreferencesContextValue.preferences as ThPreferences<K>)\n );\n }, [adapter, initialPreferences]);\n \n const [preferences, setPreferences] = useState<ThPreferences<K>>(\n (initialPreferences || defaultPreferencesContextValue.preferences) as ThPreferences<K>\n );\n\n // Handle preference changes\n const handlePreferenceChange = useCallback((newPrefs: ThPreferences<K>) => {\n setPreferences(prev => {\n // Only update if preferences actually changed\n return JSON.stringify(prev) === JSON.stringify(newPrefs) ? prev : newPrefs;\n });\n }, []);\n\n // Set up and clean up subscription to preference changes\n useEffect(() => {\n // Set up the subscription\n effectiveAdapter.subscribe(handlePreferenceChange);\n \n // Clean up the subscription when the component unmounts or dependencies change\n return () => {\n effectiveAdapter.unsubscribe(handlePreferenceChange);\n };\n }, [effectiveAdapter, handlePreferenceChange]);\n\n // Provide current app context typing\n const contextValue = useMemo(() => ({\n preferences,\n updatePreferences: (newPrefs: ThPreferences<K>) => {\n effectiveAdapter.setPreferences(newPrefs);\n },\n }), [preferences, effectiveAdapter]);\n\n return (\n <ThPreferencesContext.Provider value={ contextValue }>\n <ThDirectionSetter direction={ preferences.direction }>\n { children }\n </ThDirectionSetter>\n </ThPreferencesContext.Provider>\n );\n}","\"use client\";\n\nimport { ThColorScheme } from \"@/core/Hooks/useColorScheme\";\nimport { ThemeTokens } from \"../hooks/useTheming\";\n\nexport interface buildThemeProps<T extends string> {\n theme?: string;\n themeKeys: { [key in T]?: ThemeTokens },\n systemThemes?: {\n light: T,\n dark: T\n },\n colorScheme?: ThColorScheme;\n}\n\nexport const buildThemeObject = <T extends string>({\n theme,\n themeKeys,\n systemThemes,\n colorScheme\n}: buildThemeProps<T>) => {\n if (!theme) {\n return {};\n }\n\n if (theme === \"auto\" && colorScheme && systemThemes) {\n theme = colorScheme === ThColorScheme.dark ? systemThemes.dark : systemThemes.light;\n }\n\n let themeProps = {};\n\n const themeToken = themeKeys[theme as T];\n if (themeToken) {\n themeProps = {\n backgroundColor: themeToken.background,\n textColor: themeToken.text,\n linkColor: themeToken.link,\n selectionBackgroundColor: themeToken.select,\n selectionTextColor: themeToken.onSelect,\n visitedColor: themeToken.visited\n };\n } else {\n // Fallback if theme doesn't exist\n console.warn(`Theme key \"${String(theme)}\" not found in themeKeys.`);\n themeProps = {\n backgroundColor: null,\n textColor: null,\n linkColor: null,\n selectionBackgroundColor: null,\n selectionTextColor: null,\n visitedColor: null\n };\n }\n\n return themeProps;\n};","\"use client\";\n\nimport { useContext } from \"react\";\nimport { ThPreferencesContext } from \"../ThPreferencesContext\";\nimport { CustomizableKeys, DefaultKeys, ThPreferences } from \"../preferences\";\n\nexport function usePreferences<K extends CustomizableKeys = DefaultKeys>() {\n const context = useContext(ThPreferencesContext);\n \n if (!context) {\n throw new Error(\"usePreferences must be used within a ThPreferencesProvider\");\n }\n \n return {\n preferences: context.preferences as ThPreferences<K>,\n updatePreferences: context.updatePreferences as (prefs: ThPreferences<K>) => void,\n };\n}","\"use client\";\n\nimport { ThSpacingPresetKeys } from \"@/preferences/models/enums\";\nimport { \n defaultSpacingSettingsSubpanel,\n defaultTextSettingsMain,\n defaultTextSettingsSubpanel,\n defaultSpacingSettingsMain,\n defaultSpacingPresetsOrder\n} from \"@/preferences/models/const\";\n\nimport { usePreferences } from \"./usePreferences\";\n\nexport const usePreferenceKeys = () => {\n const { preferences } = usePreferences();\n\n const reflowActionKeys = preferences.actions.reflowOrder;\n const fxlActionKeys = preferences.actions.fxlOrder;\n const webPubActionKeys = preferences.actions.webPubOrder;\n\n const reflowThemeKeys = preferences.theming.themes.reflowOrder;\n const fxlThemeKeys = preferences.theming.themes.fxlOrder;\n\n const reflowSettingsKeys = preferences.settings.reflowOrder;\n const fxlSettingsKeys = preferences.settings.fxlOrder;\n const webPubSettingsKeys = preferences.settings.webPubOrder;\n\n const mainTextSettingsKeys = preferences.settings.text?.main ?? defaultTextSettingsMain;\n const subPanelTextSettingsKeys = preferences.settings.text?.subPanel ?? defaultTextSettingsSubpanel;\n const mainSpacingSettingsKeys = preferences.settings.spacing?.main ?? defaultSpacingSettingsMain;\n const subPanelSpacingSettingsKeys = preferences.settings.spacing?.subPanel ?? defaultSpacingSettingsSubpanel;\n\n const reflowSpacingPresetKeys = preferences.settings.spacing?.presets?.reflowOrder ?? defaultSpacingPresetsOrder;\n const fxlSpacingPresetKeys: ThSpacingPresetKeys[] = [];\n const webPubSpacingPresetKeys = preferences.settings.spacing?.presets?.webPubOrder ?? defaultSpacingPresetsOrder;\n\n return {\n reflowActionKeys,\n fxlActionKeys,\n webPubActionKeys,\n reflowThemeKeys,\n fxlThemeKeys,\n reflowSettingsKeys,\n fxlSettingsKeys,\n webPubSettingsKeys,\n mainTextSettingsKeys,\n subPanelTextSettingsKeys,\n mainSpacingSettingsKeys,\n subPanelSpacingSettingsKeys,\n reflowSpacingPresetKeys,\n fxlSpacingPresetKeys,\n webPubSpacingPresetKeys\n };\n}","\"use client\";\n\nimport { useCallback, useEffect, useRef } from \"react\";\n\nimport { CSSColor } from \"../CSSValues\";\n\nimport { ThBreakpoints } from \"../models/enums\";\nimport { BreakpointsMap, useBreakpoints } from \"@/core/Hooks/useBreakpoints\";\nimport { useReducedMotion } from \"@/core/Hooks/useReducedMotion\";\nimport { useReducedTransparency } from \"@/core/Hooks/useReducedTransparency\";\nimport { ThColorScheme, useColorScheme } from \"@/core/Hooks/useColorScheme\";\nimport { ThContrast, useContrast } from \"@/core/Hooks/useContrast\";\nimport { useForcedColors } from \"@/core/Hooks/useForcedColors\";\nimport { useMonochrome } from \"@/core/Hooks/useMonochrome\";\n\nimport { propsToCSSVars } from \"@/core/Helpers/propsToCSSVars\";\n\nexport interface ThemeTokens {\n background: CSSColor;\n text: CSSColor;\n link: CSSColor;\n visited: CSSColor;\n subdue: CSSColor;\n disable: CSSColor;\n hover: CSSColor;\n onHover: CSSColor;\n select: CSSColor;\n onSelect: CSSColor;\n focus: CSSColor;\n elevate: string;\n immerse: string;\n};\n\nexport interface useThemingProps<T extends string> {\n theme?: string;\n themeKeys: { [key in T]?: ThemeTokens };\n systemKeys?: {\n light: T;\n dark: T;\n };\n breakpointsMap: BreakpointsMap<number | null>;\n initProps?: Record<string, any>;\n onBreakpointChange?: (breakpoint: ThBreakpoints | null) => void;\n onColorSchemeChange?: (colorScheme: ThColorScheme) => void;\n onContrastChange?: (contrast: ThContrast) => void;\n onForcedColorsChange?: (forcedColors: boolean) => void;\n onMonochromeChange?: (isMonochrome: boolean) => void;\n onReducedMotionChange?: (reducedMotion: boolean) => void;\n onReducedTransparencyChange?: (reducedTransparency: boolean) => void; \n}\n\n// Takes care of the init of theming and side effects on :root/html\n// Reader still has to handle the side effects on Navigator\nexport const useTheming = <T extends string>({\n theme,\n systemKeys,\n themeKeys,\n breakpointsMap,\n initProps,\n onBreakpointChange,\n onColorSchemeChange,\n onContrastChange,\n onForcedColorsChange,\n onMonochromeChange,\n onReducedMotionChange,\n onReducedTransparencyChange,\n}: useThemingProps<T>) => {\n const breakpoints = useBreakpoints(breakpointsMap, onBreakpointChange);\n const colorScheme = useColorScheme(onColorSchemeChange);\n const colorSchemeRef = useRef(colorScheme);\n const contrast = useContrast(onContrastChange);\n const forcedColors = useForcedColors(onForcedColorsChange);\n const monochrome = useMonochrome(onMonochromeChange);\n const reducedMotion = useReducedMotion(onReducedMotionChange);\n const reducedTransparency = useReducedTransparency(onReducedTransparencyChange);\n\n const updateThemeColorMetaTag = useCallback((color: string): void => {\n if (typeof document === \"undefined\") return;\n \n let metaTag = document.querySelector(\"meta[name='theme-color']\");\n if (!metaTag) {\n metaTag = document.createElement(\"meta\");\n metaTag.setAttribute(\"name\", \"theme-color\");\n document.head.appendChild(metaTag);\n }\n metaTag.setAttribute(\"content\", color);\n }, []);\n\n const inferThemeAuto = useCallback(() => {\n return colorSchemeRef.current === ThColorScheme.dark ? systemKeys?.dark : systemKeys?.light;\n }, [systemKeys]);\n\n const initThemingCustomProps = useCallback(() => {\n for (let p in initProps) {\n document.documentElement.style.setProperty(p, initProps[p])\n }\n }, [initProps]);\n\n const setThemeCustomProps = useCallback((t?: string) => {\n if (!t) {\n return;\n }\n\n if (t === \"auto\") {\n const autoTheme = inferThemeAuto();\n if (!autoTheme) {\n // We are not removing properties cos iframes won’t update\n // Removing here would consequently create a theme inconsistency\n // between the iframe and the main window\n return;\n }\n t = autoTheme;\n }\n \n const themeTokens = themeKeys[t as T];\n if (!themeTokens) {\n // We are not removing properties cos iframes won’t update\n // Removing here would consequently create a theme inconsistency\n // between the iframe and the main window\n return;\n }\n \n const props = propsToCSSVars(themeTokens, \"theme\");\n \n for (let p in props) {\n document.documentElement.style.setProperty(p, props[p])\n }\n\n updateThemeColorMetaTag(themeTokens.background);\n }, [inferThemeAuto, updateThemeColorMetaTag, themeKeys]);\n\n // On mount add custom props to :root/html\n useEffect(() => {\n initThemingCustomProps();\n }, [initThemingCustomProps]);\n\n // Update theme custom props\n useEffect(() => {\n colorSchemeRef.current = colorScheme;\n setThemeCustomProps(theme);\n }, [setThemeCustomProps, theme, colorScheme]);\n\n return {\n inferThemeAuto,\n theme, \n breakpoints,\n colorScheme,\n contrast, \n forcedColors, \n monochrome, \n reducedMotion, \n reducedTransparency\n }\n}"]}