@turnipxenon/pineapple 4.5.1 → 5.0.0-alpha.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.
Files changed (464) hide show
  1. package/dist/api/GetLatestBlogs.d.ts +1 -0
  2. package/dist/api/GetLatestBlogs.d.ts.map +1 -0
  3. package/dist/api/index.d.ts +1 -0
  4. package/dist/api/index.d.ts.map +1 -0
  5. package/dist/assets/icons/icon-visibility.svg +1 -0
  6. package/dist/components/dialog_manager/DialogManager.d.ts +2 -0
  7. package/dist/components/dialog_manager/DialogManager.d.ts.map +1 -0
  8. package/dist/components/dialog_manager/DialogManager.js +15 -9
  9. package/dist/components/dialog_manager/DialogManagerStore.d.ts +5 -1
  10. package/dist/components/dialog_manager/DialogManagerStore.d.ts.map +1 -0
  11. package/dist/components/dialog_manager/DialogManagerStore.js +5 -1
  12. package/dist/components/dialog_manager/DialogProcessor.d.ts +1 -0
  13. package/dist/components/dialog_manager/DialogProcessor.d.ts.map +1 -0
  14. package/dist/components/dialog_manager/DialogUtils.d.ts +1 -0
  15. package/dist/components/dialog_manager/DialogUtils.d.ts.map +1 -0
  16. package/dist/components/dialog_manager/IDialogManager.d.ts +1 -0
  17. package/dist/components/dialog_manager/IDialogManager.d.ts.map +1 -0
  18. package/dist/components/dialog_manager/behavior_tree/core/BTreeUtils.d.ts +1 -0
  19. package/dist/components/dialog_manager/behavior_tree/core/BTreeUtils.d.ts.map +1 -0
  20. package/dist/components/dialog_manager/behavior_tree/core/BaseBehaviorResult.d.ts +1 -0
  21. package/dist/components/dialog_manager/behavior_tree/core/BaseBehaviorResult.d.ts.map +1 -0
  22. package/dist/components/dialog_manager/behavior_tree/core/BehaviorNode.d.ts +1 -0
  23. package/dist/components/dialog_manager/behavior_tree/core/BehaviorNode.d.ts.map +1 -0
  24. package/dist/components/dialog_manager/behavior_tree/core/BehaviorStatus.d.ts +1 -0
  25. package/dist/components/dialog_manager/behavior_tree/core/BehaviorStatus.d.ts.map +1 -0
  26. package/dist/components/dialog_manager/behavior_tree/core/SelectorNode.d.ts +1 -0
  27. package/dist/components/dialog_manager/behavior_tree/core/SelectorNode.d.ts.map +1 -0
  28. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionArguments.d.ts +1 -0
  29. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionArguments.d.ts.map +1 -0
  30. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionBehaviorNode.d.ts +1 -0
  31. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionBehaviorNode.d.ts.map +1 -0
  32. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionEvaluator.d.ts +1 -0
  33. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionEvaluator.d.ts.map +1 -0
  34. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionResult.d.ts +1 -0
  35. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionResult.d.ts.map +1 -0
  36. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionSelectorNode.d.ts +1 -0
  37. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionSelectorNode.d.ts.map +1 -0
  38. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionState.d.ts +1 -0
  39. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionState.d.ts.map +1 -0
  40. package/dist/components/dialog_manager/behavior_tree/expression/OperandNode.d.ts +1 -0
  41. package/dist/components/dialog_manager/behavior_tree/expression/OperandNode.d.ts.map +1 -0
  42. package/dist/components/dialog_manager/behavior_tree/expression/OperatorNode.d.ts +1 -0
  43. package/dist/components/dialog_manager/behavior_tree/expression/OperatorNode.d.ts.map +1 -0
  44. package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandExpressionNode.d.ts +1 -0
  45. package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandExpressionNode.d.ts.map +1 -0
  46. package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandLogicNode.d.ts +1 -0
  47. package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandLogicNode.d.ts.map +1 -0
  48. package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandMap.d.ts +1 -0
  49. package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandMap.d.ts.map +1 -0
  50. package/dist/components/dialog_manager/behavior_tree/expression/commands/RandomRangeCommand.d.ts +1 -0
  51. package/dist/components/dialog_manager/behavior_tree/expression/commands/RandomRangeCommand.d.ts.map +1 -0
  52. package/dist/components/dialog_manager/behavior_tree/expression/commands/VisitedCommand.d.ts +1 -0
  53. package/dist/components/dialog_manager/behavior_tree/expression/commands/VisitedCommand.d.ts.map +1 -0
  54. package/dist/components/dialog_manager/behavior_tree/expression/commands/VisitedCountCommand.d.ts +1 -0
  55. package/dist/components/dialog_manager/behavior_tree/expression/commands/VisitedCountCommand.d.ts.map +1 -0
  56. package/dist/components/dialog_manager/behavior_tree/expression/operators/AndOperator.d.ts +1 -0
  57. package/dist/components/dialog_manager/behavior_tree/expression/operators/AndOperator.d.ts.map +1 -0
  58. package/dist/components/dialog_manager/behavior_tree/expression/operators/EqualityOperator.d.ts +1 -0
  59. package/dist/components/dialog_manager/behavior_tree/expression/operators/EqualityOperator.d.ts.map +1 -0
  60. package/dist/components/dialog_manager/behavior_tree/expression/operators/GreaterThanEqualOperator.d.ts +1 -0
  61. package/dist/components/dialog_manager/behavior_tree/expression/operators/GreaterThanEqualOperator.d.ts.map +1 -0
  62. package/dist/components/dialog_manager/behavior_tree/expression/operators/GreaterThanOperator.d.ts +1 -0
  63. package/dist/components/dialog_manager/behavior_tree/expression/operators/GreaterThanOperator.d.ts.map +1 -0
  64. package/dist/components/dialog_manager/behavior_tree/expression/operators/InequalityOperator.d.ts +1 -0
  65. package/dist/components/dialog_manager/behavior_tree/expression/operators/InequalityOperator.d.ts.map +1 -0
  66. package/dist/components/dialog_manager/behavior_tree/expression/operators/LessThanEqualOperator.d.ts +1 -0
  67. package/dist/components/dialog_manager/behavior_tree/expression/operators/LessThanEqualOperator.d.ts.map +1 -0
  68. package/dist/components/dialog_manager/behavior_tree/expression/operators/LessThanOperator.d.ts +1 -0
  69. package/dist/components/dialog_manager/behavior_tree/expression/operators/LessThanOperator.d.ts.map +1 -0
  70. package/dist/components/dialog_manager/behavior_tree/expression/operators/NegationOperator.d.ts +1 -0
  71. package/dist/components/dialog_manager/behavior_tree/expression/operators/NegationOperator.d.ts.map +1 -0
  72. package/dist/components/dialog_manager/behavior_tree/expression/operators/OperatorLogicNode.d.ts +1 -0
  73. package/dist/components/dialog_manager/behavior_tree/expression/operators/OperatorLogicNode.d.ts.map +1 -0
  74. package/dist/components/dialog_manager/behavior_tree/expression/operators/OperatorMap.d.ts +1 -0
  75. package/dist/components/dialog_manager/behavior_tree/expression/operators/OperatorMap.d.ts.map +1 -0
  76. package/dist/components/dialog_manager/behavior_tree/expression/operators/OrOperator.d.ts +1 -0
  77. package/dist/components/dialog_manager/behavior_tree/expression/operators/OrOperator.d.ts.map +1 -0
  78. package/dist/components/dialog_manager/behavior_tree/expression/operators/XorOperator.d.ts +1 -0
  79. package/dist/components/dialog_manager/behavior_tree/expression/operators/XorOperator.d.ts.map +1 -0
  80. package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/DivisionOperator.d.ts +1 -0
  81. package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/DivisionOperator.d.ts.map +1 -0
  82. package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/MinusOperator.d.ts +1 -0
  83. package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/MinusOperator.d.ts.map +1 -0
  84. package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/MultiplicationOperator.d.ts +1 -0
  85. package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/MultiplicationOperator.d.ts.map +1 -0
  86. package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/PlusOperator.d.ts +1 -0
  87. package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/PlusOperator.d.ts.map +1 -0
  88. package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/RemainderDivisionOperator.d.ts +1 -0
  89. package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/RemainderDivisionOperator.d.ts.map +1 -0
  90. package/dist/components/dialog_manager/behavior_tree/line_core/LineBehaviorNode.d.ts +1 -0
  91. package/dist/components/dialog_manager/behavior_tree/line_core/LineBehaviorNode.d.ts.map +1 -0
  92. package/dist/components/dialog_manager/behavior_tree/line_core/LineBehaviorResult.d.ts +1 -0
  93. package/dist/components/dialog_manager/behavior_tree/line_core/LineBehaviorResult.d.ts.map +1 -0
  94. package/dist/components/dialog_manager/behavior_tree/line_core/LineNodeArguments.d.ts +1 -0
  95. package/dist/components/dialog_manager/behavior_tree/line_core/LineNodeArguments.d.ts.map +1 -0
  96. package/dist/components/dialog_manager/behavior_tree/line_core/LineSelectorNode.d.ts +1 -0
  97. package/dist/components/dialog_manager/behavior_tree/line_core/LineSelectorNode.d.ts.map +1 -0
  98. package/dist/components/dialog_manager/behavior_tree/line_processors/BehaviorState.d.ts +1 -0
  99. package/dist/components/dialog_manager/behavior_tree/line_processors/BehaviorState.d.ts.map +1 -0
  100. package/dist/components/dialog_manager/behavior_tree/line_processors/ElseIfNode.d.ts +1 -0
  101. package/dist/components/dialog_manager/behavior_tree/line_processors/ElseIfNode.d.ts.map +1 -0
  102. package/dist/components/dialog_manager/behavior_tree/line_processors/ElseNode.d.ts +1 -0
  103. package/dist/components/dialog_manager/behavior_tree/line_processors/ElseNode.d.ts.map +1 -0
  104. package/dist/components/dialog_manager/behavior_tree/line_processors/EndIfNode.d.ts +1 -0
  105. package/dist/components/dialog_manager/behavior_tree/line_processors/EndIfNode.d.ts.map +1 -0
  106. package/dist/components/dialog_manager/behavior_tree/line_processors/IfMode.d.ts +1 -0
  107. package/dist/components/dialog_manager/behavior_tree/line_processors/IfMode.d.ts.map +1 -0
  108. package/dist/components/dialog_manager/behavior_tree/line_processors/IfNode.d.ts +1 -0
  109. package/dist/components/dialog_manager/behavior_tree/line_processors/IfNode.d.ts.map +1 -0
  110. package/dist/components/dialog_manager/behavior_tree/line_processors/IgnoreGuardNode.d.ts +1 -0
  111. package/dist/components/dialog_manager/behavior_tree/line_processors/IgnoreGuardNode.d.ts.map +1 -0
  112. package/dist/components/dialog_manager/behavior_tree/line_processors/IgnoreJumpNode.d.ts +1 -0
  113. package/dist/components/dialog_manager/behavior_tree/line_processors/IgnoreJumpNode.d.ts.map +1 -0
  114. package/dist/components/dialog_manager/behavior_tree/line_processors/LineCommentNode.d.ts +1 -0
  115. package/dist/components/dialog_manager/behavior_tree/line_processors/LineCommentNode.d.ts.map +1 -0
  116. package/dist/components/dialog_manager/behavior_tree/line_processors/NormalLineProcessorNode.d.ts +1 -0
  117. package/dist/components/dialog_manager/behavior_tree/line_processors/NormalLineProcessorNode.d.ts.map +1 -0
  118. package/dist/components/dialog_manager/behavior_tree/line_processors/SetVariableNode.d.ts +1 -0
  119. package/dist/components/dialog_manager/behavior_tree/line_processors/SetVariableNode.d.ts.map +1 -0
  120. package/dist/components/dialog_manager/behavior_tree/line_processors/commands/DeclareCommand.d.ts +1 -0
  121. package/dist/components/dialog_manager/behavior_tree/line_processors/commands/DeclareCommand.d.ts.map +1 -0
  122. package/dist/components/dialog_manager/behavior_tree/line_processors/commands/JumpCommand.d.ts +1 -0
  123. package/dist/components/dialog_manager/behavior_tree/line_processors/commands/JumpCommand.d.ts.map +1 -0
  124. package/dist/components/dialog_manager/behavior_tree/line_processors/commands/UnvisitCommand.d.ts +1 -0
  125. package/dist/components/dialog_manager/behavior_tree/line_processors/commands/UnvisitCommand.d.ts.map +1 -0
  126. package/dist/components/reveal-info/RevealInfo.svelte +86 -0
  127. package/dist/components/reveal-info/RevealInfo.svelte.d.ts +15 -0
  128. package/dist/components/reveal-info/RevealInfo.svelte.d.ts.map +1 -0
  129. package/dist/components/reveal-info/RevealInfoCollection.d.ts +6 -0
  130. package/dist/components/reveal-info/RevealInfoCollection.d.ts.map +1 -0
  131. package/dist/components/reveal-info/RevealInfoRemoteQuery.d.ts +10 -0
  132. package/dist/components/reveal-info/RevealInfoRemoteQuery.d.ts.map +1 -0
  133. package/dist/components/reveal-info/RevealInfoRemoteQuery.js +1 -0
  134. package/dist/components/reveal-info/RevealInfoRune.svelte.d.ts +6 -0
  135. package/dist/components/reveal-info/RevealInfoRune.svelte.d.ts.map +1 -0
  136. package/dist/components/reveal-info/RevealInfoRune.svelte.js +13 -0
  137. package/dist/consts.d.ts +1 -0
  138. package/dist/consts.d.ts.map +1 -0
  139. package/dist/external/paraglide/messages/_index.d.ts +1 -0
  140. package/dist/external/paraglide/messages/_index.d.ts.map +1 -0
  141. package/dist/external/paraglide/messages/_index.js +3 -5
  142. package/dist/external/paraglide/messages/en.d.ts +1 -0
  143. package/dist/external/paraglide/messages/en.d.ts.map +1 -0
  144. package/dist/external/paraglide/messages/en.js +1 -1
  145. package/dist/external/paraglide/messages/fr.d.ts +1 -0
  146. package/dist/external/paraglide/messages/fr.d.ts.map +1 -0
  147. package/dist/external/paraglide/messages/fr.js +1 -1
  148. package/dist/external/paraglide/messages/tl.d.ts +1 -0
  149. package/dist/external/paraglide/messages/tl.d.ts.map +1 -0
  150. package/dist/external/paraglide/messages/tl.js +1 -1
  151. package/dist/external/paraglide/messages.d.ts +1 -0
  152. package/dist/external/paraglide/messages.d.ts.map +1 -0
  153. package/dist/external/paraglide/messages.js +1 -1
  154. package/dist/external/paraglide/registry.d.ts +1 -0
  155. package/dist/external/paraglide/registry.d.ts.map +1 -0
  156. package/dist/external/paraglide/registry.js +1 -1
  157. package/dist/external/paraglide/runtime.d.ts +190 -8
  158. package/dist/external/paraglide/runtime.d.ts.map +1 -0
  159. package/dist/external/paraglide/runtime.js +426 -90
  160. package/dist/external/paraglide/server.d.ts +5 -2
  161. package/dist/external/paraglide/server.d.ts.map +1 -0
  162. package/dist/external/paraglide/server.js +21 -20
  163. package/dist/index.d.ts +2 -1
  164. package/dist/index.d.ts.map +1 -0
  165. package/dist/index.js +1 -1
  166. package/dist/modules/overrideable_meta/OverridableMeta.svelte +1 -2
  167. package/dist/modules/overrideable_meta/OverridableMeta.svelte.d.ts +15 -10
  168. package/dist/modules/overrideable_meta/OverridableMeta.svelte.d.ts.map +1 -0
  169. package/dist/modules/overrideable_meta/OverridableMetaProps.d.ts +1 -0
  170. package/dist/modules/overrideable_meta/OverridableMetaProps.d.ts.map +1 -0
  171. package/dist/modules/overrideable_meta/index.d.ts +1 -0
  172. package/dist/modules/overrideable_meta/index.d.ts.map +1 -0
  173. package/dist/modules/parsnip/ParsnipBlockChildren.svelte.d.ts +14 -7
  174. package/dist/modules/parsnip/ParsnipBlockChildren.svelte.d.ts.map +1 -0
  175. package/dist/modules/parsnip/ParsnipEmbedWikilink.svelte.d.ts +13 -13
  176. package/dist/modules/parsnip/ParsnipEmbedWikilink.svelte.d.ts.map +1 -0
  177. package/dist/modules/parsnip/ParsnipEntry.d.ts +1 -0
  178. package/dist/modules/parsnip/ParsnipEntry.d.ts.map +1 -0
  179. package/dist/modules/parsnip/ParsnipHeading.svelte.d.ts +14 -6
  180. package/dist/modules/parsnip/ParsnipHeading.svelte.d.ts.map +1 -0
  181. package/dist/modules/parsnip/ParsnipList.svelte.d.ts +14 -6
  182. package/dist/modules/parsnip/ParsnipList.svelte.d.ts.map +1 -0
  183. package/dist/modules/parsnip/ParsnipOverall.d.ts +1 -0
  184. package/dist/modules/parsnip/ParsnipOverall.d.ts.map +1 -0
  185. package/dist/modules/parsnip/ParsnipParagraph.svelte +10 -10
  186. package/dist/modules/parsnip/ParsnipParagraph.svelte.d.ts +14 -6
  187. package/dist/modules/parsnip/ParsnipParagraph.svelte.d.ts.map +1 -0
  188. package/dist/modules/parsnip/ParsnipPhrasingChildren.svelte +30 -30
  189. package/dist/modules/parsnip/ParsnipPhrasingChildren.svelte.d.ts +14 -6
  190. package/dist/modules/parsnip/ParsnipPhrasingChildren.svelte.d.ts.map +1 -0
  191. package/dist/modules/parsnip/ParsnipWikilink.svelte.d.ts +13 -14
  192. package/dist/modules/parsnip/ParsnipWikilink.svelte.d.ts.map +1 -0
  193. package/dist/modules/parsnip/index.d.ts +1 -0
  194. package/dist/modules/parsnip/index.d.ts.map +1 -0
  195. package/dist/modules/parsnip/route-util/ParsnipBlog.svelte.d.ts +14 -6
  196. package/dist/modules/parsnip/route-util/ParsnipBlog.svelte.d.ts.map +1 -0
  197. package/dist/modules/parsnip/route-util/getSlugEntries.d.ts +1 -0
  198. package/dist/modules/parsnip/route-util/getSlugEntries.d.ts.map +1 -0
  199. package/dist/modules/parsnip/route-util/menuPageServerLoad.d.ts +7 -0
  200. package/dist/modules/parsnip/route-util/menuPageServerLoad.d.ts.map +1 -0
  201. package/dist/modules/parsnip/route-util/menuPageServerLoad.js +28 -1
  202. package/dist/modules/parsnip/route-util/slugPageServerLoad.d.ts +2 -1
  203. package/dist/modules/parsnip/route-util/slugPageServerLoad.d.ts.map +1 -0
  204. package/dist/scripts/pineapple_fiber/PineappleFiberParser.d.ts +1 -0
  205. package/dist/scripts/pineapple_fiber/PineappleFiberParser.d.ts.map +1 -0
  206. package/dist/scripts/pineapple_fiber/PineappleWeaver.d.ts +1 -0
  207. package/dist/scripts/pineapple_fiber/PineappleWeaver.d.ts.map +1 -0
  208. package/dist/scripts/util/FileManagement.d.ts +1 -0
  209. package/dist/scripts/util/FileManagement.d.ts.map +1 -0
  210. package/dist/scripts/util/ManualCheck.d.ts +1 -0
  211. package/dist/scripts/util/ManualCheck.d.ts.map +1 -0
  212. package/dist/scripts/util/ManualCheckRun.d.ts +1 -0
  213. package/dist/scripts/util/ManualCheckRun.d.ts.map +1 -0
  214. package/dist/store.d.ts +1 -0
  215. package/dist/store.d.ts.map +1 -0
  216. package/dist/styles/app.css +61 -21
  217. package/dist/styles/color-tokens.css +23 -0
  218. package/dist/styles/surface-colors.scss +38 -0
  219. package/dist/styles/tailwind.css +3349 -0
  220. package/dist/styles/turnip-theme.css +59 -52
  221. package/dist/types/BlogBlurbMeta.d.ts +1 -0
  222. package/dist/types/BlogBlurbMeta.d.ts.map +1 -0
  223. package/dist/types/BreadcrumbData.d.ts +1 -0
  224. package/dist/types/BreadcrumbData.d.ts.map +1 -0
  225. package/dist/types/api/CreateUrl.d.ts +1 -0
  226. package/dist/types/api/CreateUrl.d.ts.map +1 -0
  227. package/dist/types/api/index.d.ts +1 -0
  228. package/dist/types/api/index.d.ts.map +1 -0
  229. package/dist/types/pineapple_fiber/DialogDetail.d.ts +1 -0
  230. package/dist/types/pineapple_fiber/DialogDetail.d.ts.map +1 -0
  231. package/dist/types/pineapple_fiber/DialogState.d.ts +1 -0
  232. package/dist/types/pineapple_fiber/DialogState.d.ts.map +1 -0
  233. package/dist/types/pineapple_fiber/DialogVariableStore.d.ts +1 -0
  234. package/dist/types/pineapple_fiber/DialogVariableStore.d.ts.map +1 -0
  235. package/dist/types/pineapple_fiber/PortraitType.d.ts +1 -0
  236. package/dist/types/pineapple_fiber/PortraitType.d.ts.map +1 -0
  237. package/dist/ui/components/FourPartCard.svelte +12 -5
  238. package/dist/ui/components/FourPartCard.svelte.d.ts +14 -9
  239. package/dist/ui/components/FourPartCard.svelte.d.ts.map +1 -0
  240. package/dist/ui/components/MeltToaster/MeltToaster.svelte +101 -0
  241. package/dist/ui/components/MeltToaster/MeltToaster.svelte.d.ts +65 -0
  242. package/dist/ui/components/MeltToaster/MeltToaster.svelte.d.ts.map +1 -0
  243. package/dist/ui/{templates/SeaweedLayout → components/MeltToaster}/ToastSettings.d.ts +1 -1
  244. package/dist/ui/components/MeltToaster/ToastSettings.d.ts.map +1 -0
  245. package/dist/ui/components/MeltToaster/ToastSettings.js +1 -0
  246. package/dist/ui/components/ModalBase.svelte.d.ts +14 -7
  247. package/dist/ui/components/ModalBase.svelte.d.ts.map +1 -0
  248. package/dist/ui/components/SocialSection.svelte +58 -27
  249. package/dist/ui/components/SocialSection.svelte.d.ts +15 -9
  250. package/dist/ui/components/SocialSection.svelte.d.ts.map +1 -0
  251. package/dist/ui/components/accordion/PinyaAccordion.svelte +54 -12
  252. package/dist/ui/components/accordion/PinyaAccordion.svelte.d.ts +14 -7
  253. package/dist/ui/components/accordion/PinyaAccordion.svelte.d.ts.map +1 -0
  254. package/dist/ui/components/accordion/PinyaAccordionItem.svelte +117 -18
  255. package/dist/ui/components/accordion/PinyaAccordionItem.svelte.d.ts +14 -8
  256. package/dist/ui/components/accordion/PinyaAccordionItem.svelte.d.ts.map +1 -0
  257. package/dist/ui/components/accordion/accordionContext.d.ts +5 -0
  258. package/dist/ui/components/accordion/accordionContext.d.ts.map +1 -0
  259. package/dist/ui/components/accordion/accordionContext.js +2 -0
  260. package/dist/ui/components/accordion/index.d.ts +1 -0
  261. package/dist/ui/components/accordion/index.d.ts.map +1 -0
  262. package/dist/ui/components/index.d.ts +1 -0
  263. package/dist/ui/components/index.d.ts.map +1 -0
  264. package/dist/ui/components/randomized-background/RandomizedBackground.svelte +3 -1
  265. package/dist/ui/components/randomized-background/RandomizedBackground.svelte.d.ts +14 -5
  266. package/dist/ui/components/randomized-background/RandomizedBackground.svelte.d.ts.map +1 -0
  267. package/dist/ui/components/randomized-background/RandomizedImage.svelte +3 -2
  268. package/dist/ui/components/randomized-background/RandomizedImage.svelte.d.ts +14 -6
  269. package/dist/ui/components/randomized-background/RandomizedImage.svelte.d.ts.map +1 -0
  270. package/dist/ui/components/randomized-background/getSocialSection.remote.d.ts +3 -0
  271. package/dist/ui/components/randomized-background/getSocialSection.remote.d.ts.map +1 -0
  272. package/dist/ui/components/randomized-background/getSocialSection.remote.js +7 -0
  273. package/dist/ui/components/socialSectionRemote.remote.d.ts +3 -0
  274. package/dist/ui/components/socialSectionRemote.remote.d.ts.map +1 -0
  275. package/dist/ui/components/socialSectionRemote.remote.js +3 -0
  276. package/dist/ui/elements/CodeBlock/CodeBlock.svelte +1 -1
  277. package/dist/ui/elements/CodeBlock/CodeBlock.svelte.d.ts +15 -4
  278. package/dist/ui/elements/CodeBlock/CodeBlock.svelte.d.ts.map +1 -0
  279. package/dist/ui/elements/CodeBlock/CodeBlockProps.d.ts +1 -0
  280. package/dist/ui/elements/CodeBlock/CodeBlockProps.d.ts.map +1 -0
  281. package/dist/ui/elements/CodeBlock/index.d.ts +1 -0
  282. package/dist/ui/elements/CodeBlock/index.d.ts.map +1 -0
  283. package/dist/ui/elements/ColorScheme.d.ts +9 -8
  284. package/dist/ui/elements/ColorScheme.d.ts.map +1 -0
  285. package/dist/ui/elements/ColorScheme.js +8 -8
  286. package/dist/ui/elements/ElementVisibilityDetector.svelte +24 -19
  287. package/dist/ui/elements/ElementVisibilityDetector.svelte.d.ts +14 -7
  288. package/dist/ui/elements/ElementVisibilityDetector.svelte.d.ts.map +1 -0
  289. package/dist/ui/elements/GeneralUIProps.d.ts +1 -0
  290. package/dist/ui/elements/GeneralUIProps.d.ts.map +1 -0
  291. package/dist/ui/elements/ImageIcon.svelte +5 -1
  292. package/dist/ui/elements/ImageIcon.svelte.d.ts +19 -6
  293. package/dist/ui/elements/ImageIcon.svelte.d.ts.map +1 -0
  294. package/dist/ui/elements/OnBackground.d.ts +1 -0
  295. package/dist/ui/elements/OnBackground.d.ts.map +1 -0
  296. package/dist/ui/elements/PineappleSwitch.svelte +76 -11
  297. package/dist/ui/elements/PineappleSwitch.svelte.d.ts +14 -9
  298. package/dist/ui/elements/PineappleSwitch.svelte.d.ts.map +1 -0
  299. package/dist/ui/elements/PinyaAnchorButton/PinyaAnchorButton.svelte +6 -2
  300. package/dist/ui/elements/PinyaAnchorButton/PinyaAnchorButton.svelte.d.ts +19 -4
  301. package/dist/ui/elements/PinyaAnchorButton/PinyaAnchorButton.svelte.d.ts.map +1 -0
  302. package/dist/ui/elements/PinyaAnchorButton/PinyaAnchorButtonProps.d.ts +1 -0
  303. package/dist/ui/elements/PinyaAnchorButton/PinyaAnchorButtonProps.d.ts.map +1 -0
  304. package/dist/ui/elements/PinyaAnchorButton/index.d.ts +1 -0
  305. package/dist/ui/elements/PinyaAnchorButton/index.d.ts.map +1 -0
  306. package/dist/ui/elements/PinyaButton/PinyaButton.svelte +2 -2
  307. package/dist/ui/elements/PinyaButton/PinyaButton.svelte.d.ts +15 -4
  308. package/dist/ui/elements/PinyaButton/PinyaButton.svelte.d.ts.map +1 -0
  309. package/dist/ui/elements/PinyaButton/PinyaButtonProps.d.ts +1 -0
  310. package/dist/ui/elements/PinyaButton/PinyaButtonProps.d.ts.map +1 -0
  311. package/dist/ui/elements/PinyaButton/index.d.ts +1 -0
  312. package/dist/ui/elements/PinyaButton/index.d.ts.map +1 -0
  313. package/dist/ui/elements/PinyaButtonCommon/ButtonVariant.d.ts +4 -3
  314. package/dist/ui/elements/PinyaButtonCommon/ButtonVariant.d.ts.map +1 -0
  315. package/dist/ui/elements/PinyaButtonCommon/ButtonVariant.js +3 -3
  316. package/dist/ui/elements/PinyaButtonCommon/PinyaButtonCommonProps.d.ts +4 -0
  317. package/dist/ui/elements/PinyaButtonCommon/PinyaButtonCommonProps.d.ts.map +1 -0
  318. package/dist/ui/elements/PinyaButtonCommon/createButtonClass.d.ts +1 -0
  319. package/dist/ui/elements/PinyaButtonCommon/createButtonClass.d.ts.map +1 -0
  320. package/dist/ui/elements/PinyaButtonCommon/createButtonClass.js +4 -22
  321. package/dist/ui/elements/PinyaButtonCommon/index.d.ts +1 -0
  322. package/dist/ui/elements/PinyaButtonCommon/index.d.ts.map +1 -0
  323. package/dist/ui/elements/PinyaCard/PinyaCard.svelte +66 -24
  324. package/dist/ui/elements/PinyaCard/PinyaCard.svelte.d.ts +16 -4
  325. package/dist/ui/elements/PinyaCard/PinyaCard.svelte.d.ts.map +1 -0
  326. package/dist/ui/elements/PinyaCard/PinyaCardProps.d.ts +12 -3
  327. package/dist/ui/elements/PinyaCard/PinyaCardProps.d.ts.map +1 -0
  328. package/dist/ui/elements/PinyaCard/index.d.ts +1 -0
  329. package/dist/ui/elements/PinyaCard/index.d.ts.map +1 -0
  330. package/dist/ui/elements/Placeholder.svelte +4 -0
  331. package/dist/ui/elements/Placeholder.svelte.d.ts +18 -6
  332. package/dist/ui/elements/Placeholder.svelte.d.ts.map +1 -0
  333. package/dist/ui/elements/TextChip/TextChip.svelte +5 -1
  334. package/dist/ui/elements/TextChip/TextChip.svelte.d.ts +19 -4
  335. package/dist/ui/elements/TextChip/TextChip.svelte.d.ts.map +1 -0
  336. package/dist/ui/elements/TextChip/TextChipProps.d.ts +1 -0
  337. package/dist/ui/elements/TextChip/TextChipProps.d.ts.map +1 -0
  338. package/dist/ui/elements/TextChip/index.d.ts +1 -0
  339. package/dist/ui/elements/TextChip/index.d.ts.map +1 -0
  340. package/dist/ui/elements/TextLink.svelte +10 -5
  341. package/dist/ui/elements/TextLink.svelte.d.ts +18 -7
  342. package/dist/ui/elements/TextLink.svelte.d.ts.map +1 -0
  343. package/dist/ui/elements/WrapperProps.d.ts +1 -0
  344. package/dist/ui/elements/WrapperProps.d.ts.map +1 -0
  345. package/dist/ui/elements/index.d.ts +1 -0
  346. package/dist/ui/elements/index.d.ts.map +1 -0
  347. package/dist/ui/elements/pinya-combobox/PinyaCombobox.svelte +117 -22
  348. package/dist/ui/elements/pinya-combobox/PinyaCombobox.svelte.d.ts +17 -22
  349. package/dist/ui/elements/pinya-combobox/PinyaCombobox.svelte.d.ts.map +1 -0
  350. package/dist/ui/elements/pinya-combobox/PinyaComboboxProps.d.ts +9 -7
  351. package/dist/ui/elements/pinya-combobox/PinyaComboboxProps.d.ts.map +1 -0
  352. package/dist/ui/modules/NavigationMenu/NavigationControl.svelte.d.ts +14 -7
  353. package/dist/ui/modules/NavigationMenu/NavigationControl.svelte.d.ts.map +1 -0
  354. package/dist/ui/modules/NavigationMenu/NavigationMenu.svelte +4 -4
  355. package/dist/ui/modules/NavigationMenu/NavigationMenu.svelte.d.ts +14 -21
  356. package/dist/ui/modules/NavigationMenu/NavigationMenu.svelte.d.ts.map +1 -0
  357. package/dist/ui/modules/NavigationMenu/PageMeta.d.ts +1 -0
  358. package/dist/ui/modules/NavigationMenu/PageMeta.d.ts.map +1 -0
  359. package/dist/ui/modules/NavigationMenu/index.d.ts +1 -0
  360. package/dist/ui/modules/NavigationMenu/index.d.ts.map +1 -0
  361. package/dist/ui/modules/index.d.ts +2 -1
  362. package/dist/ui/modules/index.d.ts.map +1 -0
  363. package/dist/ui/modules/index.js +1 -1
  364. package/dist/ui/modules/modals/general-settings/GeneralSettingsModal.svelte +18 -40
  365. package/dist/ui/modules/modals/general-settings/GeneralSettingsModal.svelte.d.ts +15 -4
  366. package/dist/ui/modules/modals/general-settings/GeneralSettingsModal.svelte.d.ts.map +1 -0
  367. package/dist/ui/modules/modals/general-settings/LanguagePicker.svelte +6 -8
  368. package/dist/ui/modules/modals/general-settings/LanguagePicker.svelte.d.ts +15 -3
  369. package/dist/ui/modules/modals/general-settings/LanguagePicker.svelte.d.ts.map +1 -0
  370. package/dist/ui/modules/projects/Hepcat.svelte +1 -1
  371. package/dist/ui/modules/projects/Hepcat.svelte.d.ts +12 -16
  372. package/dist/ui/modules/projects/Hepcat.svelte.d.ts.map +1 -0
  373. package/dist/ui/modules/projects/Pengi.svelte +1 -1
  374. package/dist/ui/modules/projects/Pengi.svelte.d.ts +12 -16
  375. package/dist/ui/modules/projects/Pengi.svelte.d.ts.map +1 -0
  376. package/dist/ui/modules/projects/Soulwork.svelte.d.ts +12 -16
  377. package/dist/ui/modules/projects/Soulwork.svelte.d.ts.map +1 -0
  378. package/dist/ui/modules/projects/ThisWebpage.svelte.d.ts +12 -16
  379. package/dist/ui/modules/projects/ThisWebpage.svelte.d.ts.map +1 -0
  380. package/dist/ui/modules/projects/index.d.ts +1 -0
  381. package/dist/ui/modules/projects/index.d.ts.map +1 -0
  382. package/dist/ui/modules/universal-overlay/DialogPanel.svelte +37 -0
  383. package/dist/ui/modules/universal-overlay/DialogPanel.svelte.d.ts +16 -0
  384. package/dist/ui/modules/universal-overlay/DialogPanel.svelte.d.ts.map +1 -0
  385. package/dist/ui/modules/universal-overlay/SettingsPanel.svelte +152 -0
  386. package/dist/ui/modules/universal-overlay/SettingsPanel.svelte.d.ts +20 -0
  387. package/dist/ui/modules/universal-overlay/SettingsPanel.svelte.d.ts.map +1 -0
  388. package/dist/ui/modules/universal-overlay/UniversalOverlay.svelte +302 -0
  389. package/dist/ui/modules/universal-overlay/UniversalOverlay.svelte.d.ts +23 -0
  390. package/dist/ui/modules/universal-overlay/UniversalOverlay.svelte.d.ts.map +1 -0
  391. package/dist/ui/templates/PinyaPageLayout/PinyaPageLayout.svelte +3 -3
  392. package/dist/ui/templates/PinyaPageLayout/PinyaPageLayout.svelte.d.ts +14 -8
  393. package/dist/ui/templates/PinyaPageLayout/PinyaPageLayout.svelte.d.ts.map +1 -0
  394. package/dist/ui/templates/PinyaPageLayout/index.d.ts +2 -1
  395. package/dist/ui/templates/PinyaPageLayout/index.d.ts.map +1 -0
  396. package/dist/ui/templates/PinyaPageLayout/index.js +1 -1
  397. package/dist/ui/templates/PinyaPageLayout/{runes.svelte.d.ts → pinyaPageLayoutRunes.svelte.d.ts} +1 -0
  398. package/dist/ui/templates/PinyaPageLayout/pinyaPageLayoutRunes.svelte.d.ts.map +1 -0
  399. package/dist/ui/templates/SeaweedLayout/ChumBucket.svelte +1 -1
  400. package/dist/ui/templates/SeaweedLayout/ChumBucket.svelte.d.ts +15 -3
  401. package/dist/ui/templates/SeaweedLayout/ChumBucket.svelte.d.ts.map +1 -0
  402. package/dist/ui/templates/SeaweedLayout/CreateUrlForm.svelte +10 -12
  403. package/dist/ui/templates/SeaweedLayout/CreateUrlForm.svelte.d.ts +14 -8
  404. package/dist/ui/templates/SeaweedLayout/CreateUrlForm.svelte.d.ts.map +1 -0
  405. package/dist/ui/templates/SeaweedLayout/EntryGroup.svelte +9 -8
  406. package/dist/ui/templates/SeaweedLayout/EntryGroup.svelte.d.ts +15 -4
  407. package/dist/ui/templates/SeaweedLayout/EntryGroup.svelte.d.ts.map +1 -0
  408. package/dist/ui/templates/SeaweedLayout/EntryOrderConfig.svelte.d.ts +14 -8
  409. package/dist/ui/templates/SeaweedLayout/EntryOrderConfig.svelte.d.ts.map +1 -0
  410. package/dist/ui/templates/SeaweedLayout/ProjectComponentProps.d.ts +1 -0
  411. package/dist/ui/templates/SeaweedLayout/ProjectComponentProps.d.ts.map +1 -0
  412. package/dist/ui/templates/SeaweedLayout/ProjectGroupConfig.svelte +22 -12
  413. package/dist/ui/templates/SeaweedLayout/ProjectGroupConfig.svelte.d.ts +14 -13
  414. package/dist/ui/templates/SeaweedLayout/ProjectGroupConfig.svelte.d.ts.map +1 -0
  415. package/dist/ui/templates/SeaweedLayout/SeaweedLayout.svelte +5 -0
  416. package/dist/ui/templates/SeaweedLayout/SeaweedLayout.svelte.d.ts +15 -4
  417. package/dist/ui/templates/SeaweedLayout/SeaweedLayout.svelte.d.ts.map +1 -0
  418. package/dist/ui/templates/SeaweedLayout/index.d.ts +1 -0
  419. package/dist/ui/templates/SeaweedLayout/index.d.ts.map +1 -0
  420. package/dist/ui/templates/SeaweedLayout/props.d.ts +1 -0
  421. package/dist/ui/templates/SeaweedLayout/props.d.ts.map +1 -0
  422. package/dist/ui/templates/blog_template/BlogTemplate.svelte +9 -6
  423. package/dist/ui/templates/blog_template/BlogTemplate.svelte.d.ts +14 -11
  424. package/dist/ui/templates/blog_template/BlogTemplate.svelte.d.ts.map +1 -0
  425. package/dist/ui/templates/blog_template/BlogTemplateInner.svelte +2 -2
  426. package/dist/ui/templates/blog_template/BlogTemplateInner.svelte.d.ts +14 -7
  427. package/dist/ui/templates/blog_template/BlogTemplateInner.svelte.d.ts.map +1 -0
  428. package/dist/ui/templates/confirmation-modal/component.svelte +1 -1
  429. package/dist/ui/templates/confirmation-modal/component.svelte.d.ts +15 -4
  430. package/dist/ui/templates/confirmation-modal/component.svelte.d.ts.map +1 -0
  431. package/dist/ui/templates/confirmation-modal/index.d.ts +1 -0
  432. package/dist/ui/templates/confirmation-modal/index.d.ts.map +1 -0
  433. package/dist/ui/templates/confirmation-modal/props.d.ts +1 -0
  434. package/dist/ui/templates/confirmation-modal/props.d.ts.map +1 -0
  435. package/dist/ui/templates/index.d.ts +2 -1
  436. package/dist/ui/templates/index.d.ts.map +1 -0
  437. package/dist/ui/templates/index.js +1 -1
  438. package/dist/ui/templates/{PinyaBase.svelte → pinya-base/PinyaBase.svelte} +42 -31
  439. package/dist/ui/templates/pinya-base/PinyaBase.svelte.d.ts +17 -0
  440. package/dist/ui/templates/pinya-base/PinyaBase.svelte.d.ts.map +1 -0
  441. package/dist/ui/templates/{runes.svelte.d.ts → pinya-base/pinyaBaseRunes.svelte.d.ts} +1 -0
  442. package/dist/ui/templates/pinya-base/pinyaBaseRunes.svelte.d.ts.map +1 -0
  443. package/dist/ui/templates/{runes.svelte.js → pinya-base/pinyaBaseRunes.svelte.js} +1 -1
  444. package/dist/util/context/PineappleBaseContext.svelte +52 -0
  445. package/dist/util/context/PineappleBaseContext.svelte.d.ts +15 -0
  446. package/dist/util/context/PineappleBaseContext.svelte.d.ts.map +1 -0
  447. package/dist/util/context/pineappleBaseContextDefinitions.d.ts +7 -0
  448. package/dist/util/context/pineappleBaseContextDefinitions.d.ts.map +1 -0
  449. package/dist/util/context/pineappleBaseContextDefinitions.js +6 -0
  450. package/dist/util/env-getter.d.ts +1 -0
  451. package/dist/util/env-getter.d.ts.map +1 -0
  452. package/dist/util/env-getter.js +5 -2
  453. package/dist/util/localStore.svelte.d.ts +17 -0
  454. package/dist/util/localStore.svelte.d.ts.map +1 -0
  455. package/dist/util/localStore.svelte.js +76 -0
  456. package/dist/util/util.d.ts +1 -0
  457. package/dist/util/util.d.ts.map +1 -0
  458. package/package.json +42 -41
  459. package/src/lib/styles/app.css +61 -21
  460. package/dist/ui/modules/dialog_overlay/DialogOverlay.svelte +0 -239
  461. package/dist/ui/modules/dialog_overlay/DialogOverlay.svelte.d.ts +0 -3
  462. package/dist/ui/templates/PinyaBase.svelte.d.ts +0 -7
  463. /package/dist/{ui/templates/SeaweedLayout/ToastSettings.js → components/reveal-info/RevealInfoCollection.js} +0 -0
  464. /package/dist/ui/templates/PinyaPageLayout/{runes.svelte.js → pinyaPageLayoutRunes.svelte.js} +0 -0
@@ -1,4 +1,4 @@
1
- // eslint-disable
1
+ /* eslint-disable */
2
2
 
3
3
  /** @type {any} */
4
4
  const URLPattern = {}
@@ -26,9 +26,11 @@ export const cookieName = "PARAGLIDE_LOCALE";
26
26
  /** @type {number} */
27
27
  export const cookieMaxAge = 34560000;
28
28
  /** @type {string} */
29
+ export const cookieDomain = "";
30
+ /** @type {string} */
29
31
  export const localStorageKey = "PARAGLIDE_LOCALE";
30
32
  /**
31
- * @type {Array<"cookie" | "baseLocale" | "globalVariable" | "url" | "preferredLanguage" | "localStorage">}
33
+ * @type {Array<"cookie" | "baseLocale" | "globalVariable" | "url" | "preferredLanguage" | "localStorage" | `custom-${string}`>}
32
34
  */
33
35
  export const strategy = [
34
36
  "url",
@@ -159,13 +161,25 @@ export let getLocale = () => {
159
161
  else if (TREE_SHAKE_PREFERRED_LANGUAGE_STRATEGY_USED &&
160
162
  strat === "preferredLanguage" &&
161
163
  !isServer) {
162
- locale = negotiatePreferredLanguageFromNavigator();
164
+ locale = extractLocaleFromNavigator();
163
165
  }
164
166
  else if (TREE_SHAKE_LOCAL_STORAGE_STRATEGY_USED &&
165
167
  strat === "localStorage" &&
166
168
  !isServer) {
167
169
  locale = localStorage.getItem(localStorageKey) ?? undefined;
168
170
  }
171
+ else if (isCustomStrategy(strat) && customClientStrategies.has(strat)) {
172
+ const handler = customClientStrategies.get(strat);
173
+ if (handler) {
174
+ const result = handler.getLocale();
175
+ // Handle both sync and async results - skip async in sync getLocale
176
+ if (result instanceof Promise) {
177
+ // Can't await in sync function, skip async strategies
178
+ continue;
179
+ }
180
+ locale = result;
181
+ }
182
+ }
169
183
  // check if match, else continue loop
170
184
  if (locale !== undefined) {
171
185
  const asserted = assertIsLocale(locale);
@@ -180,29 +194,6 @@ export let getLocale = () => {
180
194
  }
181
195
  throw new Error("No locale found. Read the docs https://inlang.com/m/gerre34r/library-inlang-paraglideJs/errors#no-locale-found");
182
196
  };
183
- /**
184
- * Negotiates a preferred language from navigator.languages.
185
- *
186
- * @returns {string|undefined} The negotiated preferred language.
187
- */
188
- function negotiatePreferredLanguageFromNavigator() {
189
- if (!navigator?.languages?.length) {
190
- return undefined;
191
- }
192
- const languages = navigator.languages.map((lang) => ({
193
- fullTag: lang.toLowerCase(),
194
- baseTag: lang.split("-")[0]?.toLowerCase(),
195
- }));
196
- for (const lang of languages) {
197
- if (isLocale(lang.fullTag)) {
198
- return lang.fullTag;
199
- }
200
- else if (isLocale(lang.baseTag)) {
201
- return lang.baseTag;
202
- }
203
- }
204
- return undefined;
205
- }
206
197
  /**
207
198
  * Overwrite the \`getLocale()\` function.
208
199
  *
@@ -222,6 +213,25 @@ export const overwriteGetLocale = (fn) => {
222
213
  getLocale = fn;
223
214
  };
224
215
 
216
+ /**
217
+ * Navigates to the localized URL, or reloads the current page
218
+ *
219
+ * @param {string} [newLocation] The new location
220
+ * @return {undefined}
221
+ */
222
+ const navigateOrReload = (newLocation) => {
223
+ if (newLocation) {
224
+ // reload the page by navigating to the new url
225
+ window.location.href = newLocation;
226
+ }
227
+ else {
228
+ // reload the page to reflect the new locale
229
+ window.location.reload();
230
+ }
231
+ };
232
+ /**
233
+ * @typedef {(newLocale: Locale, options?: { reload?: boolean }) => void | Promise<void>} SetLocaleFn
234
+ */
225
235
  /**
226
236
  * Set the locale.
227
237
  *
@@ -230,13 +240,16 @@ export const overwriteGetLocale = (fn) => {
230
240
  * reloading is disabled, you need to ensure that the UI is updated
231
241
  * to reflect the new locale.
232
242
  *
243
+ * If any custom strategy's \`setLocale\` function is async, then this
244
+ * function will become async as well.
245
+ *
233
246
  * @example
234
247
  * setLocale('en');
235
248
  *
236
249
  * @example
237
250
  * setLocale('en', { reload: false });
238
251
  *
239
- * @type {(newLocale: Locale, options?: { reload?: boolean }) => void}
252
+ * @type {SetLocaleFn}
240
253
  */
241
254
  export let setLocale = (newLocale, options) => {
242
255
  const optionsWithDefaults = {
@@ -245,6 +258,7 @@ export let setLocale = (newLocale, options) => {
245
258
  };
246
259
  // locale is already set
247
260
  // https://github.com/opral/inlang-paraglide-js/issues/430
261
+ /** @type {Locale | undefined} */
248
262
  let currentLocale;
249
263
  try {
250
264
  currentLocale = getLocale();
@@ -252,6 +266,8 @@ export let setLocale = (newLocale, options) => {
252
266
  catch {
253
267
  // do nothing, no locale has been set yet.
254
268
  }
269
+ /** @type {Array<Promise<any>>} */
270
+ const customSetLocalePromises = [];
255
271
  /** @type {string | undefined} */
256
272
  let newLocation = undefined;
257
273
  for (const strat of strategy) {
@@ -262,11 +278,16 @@ export let setLocale = (newLocale, options) => {
262
278
  _locale = newLocale;
263
279
  }
264
280
  else if (TREE_SHAKE_COOKIE_STRATEGY_USED && strat === "cookie") {
265
- if (isServer || typeof document === "undefined") {
281
+ if (isServer ||
282
+ typeof document === "undefined" ||
283
+ typeof window === "undefined") {
266
284
  continue;
267
285
  }
268
286
  // set the cookie
269
- document.cookie = `${cookieName}=${newLocale}; path=/; max-age=${cookieMaxAge}`;
287
+ const cookieString = `${cookieName}=${newLocale}; path=/; max-age=${cookieMaxAge}`;
288
+ document.cookie = cookieDomain
289
+ ? `${cookieString}; domain=${cookieDomain}`
290
+ : cookieString;
270
291
  }
271
292
  else if (strat === "baseLocale") {
272
293
  // nothing to be set here. baseLocale is only a fallback
@@ -293,20 +314,36 @@ export let setLocale = (newLocale, options) => {
293
314
  // set the localStorage
294
315
  localStorage.setItem(localStorageKey, newLocale);
295
316
  }
296
- }
297
- if (!isServer &&
298
- optionsWithDefaults.reload &&
299
- window.location &&
300
- newLocale !== currentLocale) {
301
- if (newLocation) {
302
- // reload the page by navigating to the new url
303
- window.location.href = newLocation;
317
+ else if (isCustomStrategy(strat) && customClientStrategies.has(strat)) {
318
+ const handler = customClientStrategies.get(strat);
319
+ if (handler) {
320
+ let result = handler.setLocale(newLocale);
321
+ // Handle async setLocale
322
+ if (result instanceof Promise) {
323
+ result = result.catch((error) => {
324
+ throw new Error(`Custom strategy "${strat}" setLocale failed.`, {
325
+ cause: error,
326
+ });
327
+ });
328
+ customSetLocalePromises.push(result);
329
+ }
330
+ }
304
331
  }
305
- else {
306
- // reload the page to reflect the new locale
307
- window.location.reload();
332
+ }
333
+ const runReload = () => {
334
+ if (!isServer &&
335
+ optionsWithDefaults.reload &&
336
+ window.location &&
337
+ newLocale !== currentLocale) {
338
+ navigateOrReload(newLocation);
308
339
  }
340
+ };
341
+ if (customSetLocalePromises.length) {
342
+ return Promise.all(customSetLocalePromises).then(() => {
343
+ runReload();
344
+ });
309
345
  }
346
+ runReload();
310
347
  return;
311
348
  };
312
349
  /**
@@ -321,10 +358,10 @@ export let setLocale = (newLocale, options) => {
321
358
  * return Cookies.set('locale', newLocale)
322
359
  * });
323
360
  *
324
- * @param {(newLocale: Locale) => void} fn
361
+ * @param {SetLocaleFn} fn
325
362
  */
326
363
  export const overwriteSetLocale = (fn) => {
327
- setLocale = fn;
364
+ setLocale = /** @type {SetLocaleFn} */ (fn);
328
365
  };
329
366
 
330
367
  /**
@@ -398,6 +435,9 @@ export function assertIsLocale(input) {
398
435
  * they are defined. If a strategy returns an invalid locale,
399
436
  * it will fall back to the next strategy.
400
437
  *
438
+ * Note: Custom server strategies are not supported in this synchronous version.
439
+ * Use `extractLocaleFromRequestAsync` if you need custom server strategies with async getLocale methods.
440
+ *
401
441
  * @example
402
442
  * const locale = extractLocaleFromRequest(request);
403
443
  *
@@ -419,10 +459,7 @@ export const extractLocaleFromRequest = (request) => {
419
459
  }
420
460
  else if (TREE_SHAKE_PREFERRED_LANGUAGE_STRATEGY_USED &&
421
461
  strat === "preferredLanguage") {
422
- const acceptLanguageHeader = request.headers.get("accept-language");
423
- if (acceptLanguageHeader) {
424
- locale = negotiatePreferredLanguageFromHeader(acceptLanguageHeader);
425
- }
462
+ locale = extractLocaleFromHeader(request);
426
463
  }
427
464
  else if (strat === "globalVariable") {
428
465
  locale = _locale;
@@ -433,6 +470,11 @@ export const extractLocaleFromRequest = (request) => {
433
470
  else if (strat === "localStorage") {
434
471
  continue;
435
472
  }
473
+ else if (isCustomStrategy(strat)) {
474
+ // Custom strategies are not supported in sync version
475
+ // Use extractLocaleFromRequestAsync for custom server strategies
476
+ continue;
477
+ }
436
478
  if (locale !== undefined) {
437
479
  if (!isLocale(locale)) {
438
480
  locale = undefined;
@@ -444,42 +486,62 @@ export const extractLocaleFromRequest = (request) => {
444
486
  }
445
487
  throw new Error("No locale found. There is an error in your strategy. Try adding 'baseLocale' as the very last strategy. Read more here https://inlang.com/m/gerre34r/library-inlang-paraglideJs/errors#no-locale-found");
446
488
  };
489
+
447
490
  /**
448
- * Negotiates a preferred language from a header.
491
+ * Asynchronously extracts a locale from a request.
449
492
  *
450
- * @param {string} header - The header to negotiate from.
451
- * @returns {string|undefined} The negotiated preferred language.
493
+ * This function supports async custom server strategies, unlike the synchronous
494
+ * `extractLocaleFromRequest`. Use this function when you have custom server strategies
495
+ * that need to perform asynchronous operations (like database calls) in their getLocale method.
496
+ *
497
+ * The function first processes any custom server strategies asynchronously, then falls back
498
+ * to the synchronous `extractLocaleFromRequest` for all other strategies.
499
+ *
500
+ * @see {@link https://github.com/opral/inlang-paraglide-js/issues/527#issuecomment-2978151022}
501
+ *
502
+ * @example
503
+ * // Basic usage
504
+ * const locale = await extractLocaleFromRequestAsync(request);
505
+ *
506
+ * @example
507
+ * // With custom async server strategy
508
+ * defineCustomServerStrategy("custom-database", {
509
+ * getLocale: async (request) => {
510
+ * const userId = extractUserIdFromRequest(request);
511
+ * return await getUserLocaleFromDatabase(userId);
512
+ * }
513
+ * });
514
+ *
515
+ * const locale = await extractLocaleFromRequestAsync(request);
516
+ *
517
+ * @type {(request: Request) => Promise<Locale>}
452
518
  */
453
- function negotiatePreferredLanguageFromHeader(header) {
454
- // Parse language preferences with their q-values and base language codes
455
- const languages = header
456
- .split(",")
457
- .map((lang) => {
458
- const [tag, q = "1"] = lang.trim().split(";q=");
459
- // Get both the full tag and base language code
460
- const baseTag = tag?.split("-")[0]?.toLowerCase();
461
- return {
462
- fullTag: tag?.toLowerCase(),
463
- baseTag,
464
- q: Number(q),
465
- };
466
- })
467
- .sort((a, b) => b.q - a.q);
468
- for (const lang of languages) {
469
- if (isLocale(lang.fullTag)) {
470
- return lang.fullTag;
471
- }
472
- else if (isLocale(lang.baseTag)) {
473
- return lang.baseTag;
519
+ export const extractLocaleFromRequestAsync = async (request) => {
520
+ /** @type {string|undefined} */
521
+ let locale;
522
+ // Process custom strategies first, in order
523
+ for (const strat of strategy) {
524
+ if (isCustomStrategy(strat) && customServerStrategies.has(strat)) {
525
+ const handler = customServerStrategies.get(strat);
526
+ if (handler) {
527
+ /** @type {string|undefined} */
528
+ locale = await handler.getLocale(request);
529
+ }
530
+ // If we got a valid locale from this custom strategy, use it
531
+ if (locale !== undefined && isLocale(locale)) {
532
+ return assertIsLocale(locale);
533
+ }
474
534
  }
475
535
  }
476
- return undefined;
477
- }
536
+ // If no custom strategy provided a valid locale, fall back to sync version
537
+ locale = extractLocaleFromRequest(request);
538
+ return assertIsLocale(locale);
539
+ };
478
540
 
479
541
  /**
480
542
  * Extracts a cookie from the document.
481
543
  *
482
- * Will return undefined if the docuement is not available or if the cookie is not set.
544
+ * Will return undefined if the document is not available or if the cookie is not set.
483
545
  * The `document` object is not available in server-side rendering, so this function should not be called in that context.
484
546
  *
485
547
  * @returns {string | undefined}
@@ -496,6 +558,90 @@ export function extractLocaleFromCookie() {
496
558
  return undefined;
497
559
  }
498
560
 
561
+ /**
562
+ * Extracts a locale from the accept-language header.
563
+ *
564
+ * Use the function on the server to extract the locale
565
+ * from the accept-language header that is sent by the client.
566
+ *
567
+ * @example
568
+ * const locale = extractLocaleFromHeader(request);
569
+ *
570
+ * @type {(request: Request) => Locale}
571
+ * @param {Request} request - The request object to extract the locale from.
572
+ * @returns {string|undefined} The negotiated preferred language.
573
+ */
574
+ export function extractLocaleFromHeader(request) {
575
+ const acceptLanguageHeader = request.headers.get("accept-language");
576
+ if (acceptLanguageHeader) {
577
+ // Parse language preferences with their q-values and base language codes
578
+ const languages = acceptLanguageHeader
579
+ .split(",")
580
+ .map((lang) => {
581
+ const [tag, q = "1"] = lang.trim().split(";q=");
582
+ // Get both the full tag and base language code
583
+ const baseTag = tag?.split("-")[0]?.toLowerCase();
584
+ return {
585
+ fullTag: tag?.toLowerCase(),
586
+ baseTag,
587
+ q: Number(q),
588
+ };
589
+ })
590
+ .sort((a, b) => b.q - a.q);
591
+ for (const lang of languages) {
592
+ if (isLocale(lang.fullTag)) {
593
+ return lang.fullTag;
594
+ }
595
+ else if (isLocale(lang.baseTag)) {
596
+ return lang.baseTag;
597
+ }
598
+ }
599
+ return undefined;
600
+ }
601
+ return undefined;
602
+ }
603
+
604
+ /**
605
+ * Negotiates a preferred language from navigator.languages.
606
+ *
607
+ * Use the function on the client to extract the locale
608
+ * from the navigator.languages array.
609
+ *
610
+ * @example
611
+ * const locale = extractLocaleFromNavigator();
612
+ *
613
+ * @type {() => Locale | undefined}
614
+ * @returns {string | undefined}
615
+ */
616
+ export function extractLocaleFromNavigator() {
617
+ if (!navigator?.languages?.length) {
618
+ return undefined;
619
+ }
620
+ const languages = navigator.languages.map((lang) => ({
621
+ fullTag: lang.toLowerCase(),
622
+ baseTag: lang.split("-")[0]?.toLowerCase(),
623
+ }));
624
+ for (const lang of languages) {
625
+ if (isLocale(lang.fullTag)) {
626
+ return lang.fullTag;
627
+ }
628
+ else if (isLocale(lang.baseTag)) {
629
+ return lang.baseTag;
630
+ }
631
+ }
632
+ return undefined;
633
+ }
634
+
635
+ /**
636
+ * If extractLocaleFromUrl is called many times on the same page and the URL
637
+ * hasn't changed, we don't need to recompute it every time which can get expensive.
638
+ * We might use a LRU cache if needed, but for now storing only the last result is enough.
639
+ * https://github.com/opral/monorepo/pull/3575#discussion_r2066731243
640
+ */
641
+ /** @type {string|undefined} */
642
+ let cachedUrl;
643
+ /** @type {Locale|undefined} */
644
+ let cachedLocale;
499
645
  /**
500
646
  * Extracts the locale from a given URL using native URLPattern.
501
647
  *
@@ -503,24 +649,36 @@ export function extractLocaleFromCookie() {
503
649
  * @returns {Locale|undefined} The extracted locale, or undefined if no locale is found.
504
650
  */
505
651
  export function extractLocaleFromUrl(url) {
652
+ const urlString = typeof url === "string" ? url : url.href;
653
+ if (cachedUrl === urlString) {
654
+ return cachedLocale;
655
+ }
656
+ let result;
506
657
  if (TREE_SHAKE_DEFAULT_URL_PATTERN_USED) {
507
- return defaultUrlPatternExtractLocale(url);
658
+ result = defaultUrlPatternExtractLocale(url);
508
659
  }
509
- const urlObj = typeof url === "string" ? new URL(url) : url;
510
- // Iterate over URL patterns
511
- for (const element of urlPatterns) {
512
- for (const [locale, localizedPattern] of element.localized) {
513
- const match = new URLPattern(localizedPattern, urlObj.href).exec(urlObj.href);
514
- if (!match) {
515
- continue;
516
- }
517
- // Check if the locale is valid
518
- if (assertIsLocale(locale)) {
519
- return locale;
660
+ else {
661
+ const urlObj = typeof url === "string" ? new URL(url) : url;
662
+ // Iterate over URL patterns
663
+ for (const element of urlPatterns) {
664
+ for (const [locale, localizedPattern] of element.localized) {
665
+ const match = new URLPattern(localizedPattern, urlObj.href).exec(urlObj.href);
666
+ if (!match) {
667
+ continue;
668
+ }
669
+ // Check if the locale is valid
670
+ if (assertIsLocale(locale)) {
671
+ result = locale;
672
+ break;
673
+ }
520
674
  }
675
+ if (result)
676
+ break;
521
677
  }
522
678
  }
523
- return undefined;
679
+ cachedUrl = urlString;
680
+ cachedLocale = result;
681
+ return result;
524
682
  }
525
683
  /**
526
684
  * https://github.com/opral/inlang-paraglide-js/issues/381
@@ -848,6 +1006,120 @@ export function aggregateGroups(match) {
848
1006
  };
849
1007
  }
850
1008
 
1009
+ /**
1010
+ * @typedef {object} ShouldRedirectServerInput
1011
+ * @property {Request} request
1012
+ * @property {string | URL} [url]
1013
+ * @property {ReturnType<typeof assertIsLocale>} [locale]
1014
+ *
1015
+ * @typedef {object} ShouldRedirectClientInput
1016
+ * @property {undefined} [request]
1017
+ * @property {string | URL} [url]
1018
+ * @property {ReturnType<typeof assertIsLocale>} [locale]
1019
+ *
1020
+ * @typedef {ShouldRedirectServerInput | ShouldRedirectClientInput} ShouldRedirectInput
1021
+ *
1022
+ * @typedef {object} ShouldRedirectResult
1023
+ * @property {boolean} shouldRedirect - Indicates whether the consumer should perform a redirect.
1024
+ * @property {ReturnType<typeof assertIsLocale>} locale - Locale resolved using the configured strategies.
1025
+ * @property {URL | undefined} redirectUrl - Destination URL when a redirect is required.
1026
+ */
1027
+ /**
1028
+ * Determines whether a redirect is required to align the current URL with the active locale.
1029
+ *
1030
+ * This helper mirrors the logic that powers `paraglideMiddleware`, but works in both server
1031
+ * and client environments. It evaluates the configured strategies in order, computes the
1032
+ * canonical localized URL, and reports when the current URL does not match.
1033
+ *
1034
+ * When called in the browser without arguments, the current `window.location.href` is used.
1035
+ *
1036
+ * @example
1037
+ * // Client side usage (e.g. TanStack Router beforeLoad hook)
1038
+ * async function beforeLoad({ location }) {
1039
+ * const decision = await shouldRedirect({ url: location.href });
1040
+ *
1041
+ * if (decision.shouldRedirect) {
1042
+ * throw redirect({ to: decision.redirectUrl.href });
1043
+ * }
1044
+ * }
1045
+ *
1046
+ * @example
1047
+ * // Server side usage with a Request
1048
+ * export async function handle(request) {
1049
+ * const decision = await shouldRedirect({ request });
1050
+ *
1051
+ * if (decision.shouldRedirect) {
1052
+ * return Response.redirect(decision.redirectUrl, 307);
1053
+ * }
1054
+ *
1055
+ * return render(request, decision.locale);
1056
+ * }
1057
+ *
1058
+ * @param {ShouldRedirectInput} [input]
1059
+ * @returns {Promise<ShouldRedirectResult>}
1060
+ */
1061
+ export async function shouldRedirect(input = {}) {
1062
+ const locale = /** @type {ReturnType<typeof assertIsLocale>} */ (await resolveLocale(input));
1063
+ if (!strategy.includes("url")) {
1064
+ return { shouldRedirect: false, locale, redirectUrl: undefined };
1065
+ }
1066
+ const currentUrl = resolveUrl(input);
1067
+ const localizedUrl = localizeUrl(currentUrl.href, { locale });
1068
+ const shouldRedirectToLocalizedUrl = normalizeUrl(localizedUrl.href) !== normalizeUrl(currentUrl.href);
1069
+ return {
1070
+ shouldRedirect: shouldRedirectToLocalizedUrl,
1071
+ locale,
1072
+ redirectUrl: shouldRedirectToLocalizedUrl ? localizedUrl : undefined,
1073
+ };
1074
+ }
1075
+ /**
1076
+ * Resolves the locale either from the provided input or by using the configured strategies.
1077
+ *
1078
+ * @param {ShouldRedirectInput} input
1079
+ * @returns {Promise<ReturnType<typeof assertIsLocale>>}
1080
+ */
1081
+ async function resolveLocale(input) {
1082
+ if (input.locale) {
1083
+ return assertIsLocale(input.locale);
1084
+ }
1085
+ if (input.request) {
1086
+ return extractLocaleFromRequestAsync(input.request);
1087
+ }
1088
+ return getLocale();
1089
+ }
1090
+ /**
1091
+ * Resolves the current URL from the provided input or runtime context.
1092
+ *
1093
+ * @param {ShouldRedirectInput} input
1094
+ * @returns {URL}
1095
+ */
1096
+ function resolveUrl(input) {
1097
+ if (input.request) {
1098
+ return new URL(input.request.url);
1099
+ }
1100
+ if (input.url instanceof URL) {
1101
+ return new URL(input.url.href);
1102
+ }
1103
+ if (typeof input.url === "string") {
1104
+ return new URL(input.url, getUrlOrigin());
1105
+ }
1106
+ if (typeof window !== "undefined" && window?.location?.href) {
1107
+ return new URL(window.location.href);
1108
+ }
1109
+ throw new Error("shouldRedirect() requires either a request, an absolute URL, or must run in a browser environment.");
1110
+ }
1111
+ /**
1112
+ * Normalize url for comparison by stripping the trailing slash.
1113
+ *
1114
+ * @param {string} url
1115
+ * @returns {string}
1116
+ */
1117
+ function normalizeUrl(url) {
1118
+ const urlObj = new URL(url);
1119
+ urlObj.pathname = urlObj.pathname.replace(/\/$/, "");
1120
+ return urlObj.href;
1121
+ }
1122
+
851
1123
  /**
852
1124
  * High-level URL localization function optimized for client-side UI usage.
853
1125
  *
@@ -887,15 +1159,18 @@ export function aggregateGroups(match) {
887
1159
  * @returns {string} The localized href, relative if input was relative
888
1160
  */
889
1161
  export function localizeHref(href, options) {
890
- const locale = options?.locale ?? getLocale();
1162
+ const currentLocale = getLocale();
1163
+ const locale = options?.locale ?? currentLocale;
891
1164
  const url = new URL(href, getUrlOrigin());
892
- const localized = localizeUrl(url, options);
1165
+ const localized = localizeUrl(url, { locale });
893
1166
  // if the origin is identical and the href is relative,
894
1167
  // return the relative path
895
1168
  if (href.startsWith("/") && url.origin === localized.origin) {
896
1169
  // check for cross origin localization in which case an absolute URL must be returned.
897
- if (locale !== getLocale()) {
898
- const localizedCurrentLocale = localizeUrl(url, { locale: getLocale() });
1170
+ if (locale !== currentLocale) {
1171
+ const localizedCurrentLocale = localizeUrl(url, {
1172
+ locale: currentLocale,
1173
+ });
899
1174
  if (localizedCurrentLocale.origin !== localized.origin) {
900
1175
  return localized.href;
901
1176
  }
@@ -1057,6 +1332,67 @@ export function generateStaticLocalizedUrls(urls) {
1057
1332
  return Array.from(localizedUrls);
1058
1333
  }
1059
1334
 
1335
+ /**
1336
+ * @typedef {"cookie" | "baseLocale" | "globalVariable" | "url" | "preferredLanguage" | "localStorage"} BuiltInStrategy
1337
+ */
1338
+ /**
1339
+ * @typedef {`custom_${string}`} CustomStrategy
1340
+ */
1341
+ /**
1342
+ * @typedef {BuiltInStrategy | CustomStrategy} Strategy
1343
+ */
1344
+ /**
1345
+ * @typedef {Array<Strategy>} Strategies
1346
+ */
1347
+ /**
1348
+ * @typedef {{ getLocale: (request?: Request) => Promise<string | undefined> | (string | undefined) }} CustomServerStrategyHandler
1349
+ */
1350
+ /**
1351
+ * @typedef {{ getLocale: () => Promise<string|undefined> | (string | undefined), setLocale: (locale: string) => Promise<void> | void }} CustomClientStrategyHandler
1352
+ */
1353
+ /** @type {Map<string, CustomServerStrategyHandler>} */
1354
+ export const customServerStrategies = new Map();
1355
+ /** @type {Map<string, CustomClientStrategyHandler>} */
1356
+ export const customClientStrategies = new Map();
1357
+ /**
1358
+ * Checks if the given strategy is a custom strategy.
1359
+ *
1360
+ * @param {any} strategy The name of the custom strategy to validate.
1361
+ * Must be a string that starts with "custom-" followed by alphanumeric characters, hyphens, or underscores.
1362
+ * @returns {boolean} Returns true if it is a custom strategy, false otherwise.
1363
+ */
1364
+ export function isCustomStrategy(strategy) {
1365
+ return (typeof strategy === "string" && /^custom-[A-Za-z0-9_-]+$/.test(strategy));
1366
+ }
1367
+ /**
1368
+ * Defines a custom strategy that is executed on the server.
1369
+ *
1370
+ * @param {any} strategy The name of the custom strategy to define. Must follow the pattern custom-name with alphanumeric characters, hyphens, or underscores.
1371
+ * @param {CustomServerStrategyHandler} handler The handler for the custom strategy, which should implement
1372
+ * the method getLocale.
1373
+ * @returns {void}
1374
+ */
1375
+ export function defineCustomServerStrategy(strategy, handler) {
1376
+ if (!isCustomStrategy(strategy)) {
1377
+ throw new Error(`Invalid custom strategy: "${strategy}". Must be a custom strategy following the pattern custom-name.`);
1378
+ }
1379
+ customServerStrategies.set(strategy, handler);
1380
+ }
1381
+ /**
1382
+ * Defines a custom strategy that is executed on the client.
1383
+ *
1384
+ * @param {any} strategy The name of the custom strategy to define. Must follow the pattern custom-name with alphanumeric characters, hyphens, or underscores.
1385
+ * @param {CustomClientStrategyHandler} handler The handler for the custom strategy, which should implement the
1386
+ * methods getLocale and setLocale.
1387
+ * @returns {void}
1388
+ */
1389
+ export function defineCustomClientStrategy(strategy, handler) {
1390
+ if (!isCustomStrategy(strategy)) {
1391
+ throw new Error(`Invalid custom strategy: "${strategy}". Must be a custom strategy following the pattern custom-name.`);
1392
+ }
1393
+ customClientStrategies.set(strategy, handler);
1394
+ }
1395
+
1060
1396
  // ------ TYPES ------
1061
1397
 
1062
1398
  /**