@depup/svelte 5.53.3-depup.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 (386) hide show
  1. package/LICENSE.md +7 -0
  2. package/README.md +41 -0
  3. package/action.d.ts +1 -0
  4. package/animate.d.ts +1 -0
  5. package/compiler/index.js +1 -0
  6. package/compiler/package.json +3 -0
  7. package/compiler.d.ts +1 -0
  8. package/easing.d.ts +1 -0
  9. package/elements.d.ts +2078 -0
  10. package/index.d.ts +1 -0
  11. package/legacy.d.ts +1 -0
  12. package/motion.d.ts +1 -0
  13. package/package.json +185 -0
  14. package/src/animate/index.js +78 -0
  15. package/src/attachments/index.js +113 -0
  16. package/src/compiler/errors.js +1719 -0
  17. package/src/compiler/index.js +198 -0
  18. package/src/compiler/legacy.js +637 -0
  19. package/src/compiler/migrate/index.js +1996 -0
  20. package/src/compiler/phases/1-parse/acorn.js +198 -0
  21. package/src/compiler/phases/1-parse/index.js +326 -0
  22. package/src/compiler/phases/1-parse/read/context.js +116 -0
  23. package/src/compiler/phases/1-parse/read/expression.js +93 -0
  24. package/src/compiler/phases/1-parse/read/options.js +263 -0
  25. package/src/compiler/phases/1-parse/read/script.js +97 -0
  26. package/src/compiler/phases/1-parse/read/style.js +637 -0
  27. package/src/compiler/phases/1-parse/remove_typescript_nodes.js +180 -0
  28. package/src/compiler/phases/1-parse/state/element.js +937 -0
  29. package/src/compiler/phases/1-parse/state/fragment.js +17 -0
  30. package/src/compiler/phases/1-parse/state/tag.js +751 -0
  31. package/src/compiler/phases/1-parse/state/text.js +23 -0
  32. package/src/compiler/phases/1-parse/utils/bracket.js +213 -0
  33. package/src/compiler/phases/1-parse/utils/create.js +16 -0
  34. package/src/compiler/phases/1-parse/utils/entities.js +2234 -0
  35. package/src/compiler/phases/1-parse/utils/fuzzymatch.js +281 -0
  36. package/src/compiler/phases/1-parse/utils/html.js +127 -0
  37. package/src/compiler/phases/2-analyze/css/css-analyze.js +331 -0
  38. package/src/compiler/phases/2-analyze/css/css-prune.js +1206 -0
  39. package/src/compiler/phases/2-analyze/css/css-warn.js +47 -0
  40. package/src/compiler/phases/2-analyze/css/utils.js +177 -0
  41. package/src/compiler/phases/2-analyze/index.js +1300 -0
  42. package/src/compiler/phases/2-analyze/utils/check_graph_for_cycles.js +47 -0
  43. package/src/compiler/phases/2-analyze/visitors/AnimateDirective.js +15 -0
  44. package/src/compiler/phases/2-analyze/visitors/ArrowFunctionExpression.js +11 -0
  45. package/src/compiler/phases/2-analyze/visitors/AssignmentExpression.js +31 -0
  46. package/src/compiler/phases/2-analyze/visitors/AttachTag.js +17 -0
  47. package/src/compiler/phases/2-analyze/visitors/Attribute.js +66 -0
  48. package/src/compiler/phases/2-analyze/visitors/AwaitBlock.js +48 -0
  49. package/src/compiler/phases/2-analyze/visitors/AwaitExpression.js +150 -0
  50. package/src/compiler/phases/2-analyze/visitors/BindDirective.js +280 -0
  51. package/src/compiler/phases/2-analyze/visitors/CallExpression.js +339 -0
  52. package/src/compiler/phases/2-analyze/visitors/ClassBody.js +156 -0
  53. package/src/compiler/phases/2-analyze/visitors/ClassDeclaration.js +25 -0
  54. package/src/compiler/phases/2-analyze/visitors/ClassDirective.js +13 -0
  55. package/src/compiler/phases/2-analyze/visitors/Component.js +26 -0
  56. package/src/compiler/phases/2-analyze/visitors/ConstTag.js +45 -0
  57. package/src/compiler/phases/2-analyze/visitors/DebugTag.js +15 -0
  58. package/src/compiler/phases/2-analyze/visitors/EachBlock.js +97 -0
  59. package/src/compiler/phases/2-analyze/visitors/ExportDefaultDeclaration.js +20 -0
  60. package/src/compiler/phases/2-analyze/visitors/ExportNamedDeclaration.js +70 -0
  61. package/src/compiler/phases/2-analyze/visitors/ExportSpecifier.js +30 -0
  62. package/src/compiler/phases/2-analyze/visitors/ExpressionStatement.js +38 -0
  63. package/src/compiler/phases/2-analyze/visitors/ExpressionTag.js +26 -0
  64. package/src/compiler/phases/2-analyze/visitors/Fragment.js +10 -0
  65. package/src/compiler/phases/2-analyze/visitors/FunctionDeclaration.js +16 -0
  66. package/src/compiler/phases/2-analyze/visitors/FunctionExpression.js +11 -0
  67. package/src/compiler/phases/2-analyze/visitors/HtmlTag.js +19 -0
  68. package/src/compiler/phases/2-analyze/visitors/Identifier.js +194 -0
  69. package/src/compiler/phases/2-analyze/visitors/IfBlock.js +46 -0
  70. package/src/compiler/phases/2-analyze/visitors/ImportDeclaration.js +31 -0
  71. package/src/compiler/phases/2-analyze/visitors/KeyBlock.js +21 -0
  72. package/src/compiler/phases/2-analyze/visitors/LabeledStatement.js +95 -0
  73. package/src/compiler/phases/2-analyze/visitors/LetDirective.js +24 -0
  74. package/src/compiler/phases/2-analyze/visitors/Literal.js +14 -0
  75. package/src/compiler/phases/2-analyze/visitors/MemberExpression.js +28 -0
  76. package/src/compiler/phases/2-analyze/visitors/NewExpression.js +17 -0
  77. package/src/compiler/phases/2-analyze/visitors/OnDirective.js +28 -0
  78. package/src/compiler/phases/2-analyze/visitors/PropertyDefinition.js +21 -0
  79. package/src/compiler/phases/2-analyze/visitors/RegularElement.js +240 -0
  80. package/src/compiler/phases/2-analyze/visitors/RenderTag.js +68 -0
  81. package/src/compiler/phases/2-analyze/visitors/SlotElement.js +42 -0
  82. package/src/compiler/phases/2-analyze/visitors/SnippetBlock.js +113 -0
  83. package/src/compiler/phases/2-analyze/visitors/SpreadAttribute.js +13 -0
  84. package/src/compiler/phases/2-analyze/visitors/SpreadElement.js +16 -0
  85. package/src/compiler/phases/2-analyze/visitors/StyleDirective.js +39 -0
  86. package/src/compiler/phases/2-analyze/visitors/SvelteBody.js +22 -0
  87. package/src/compiler/phases/2-analyze/visitors/SvelteBoundary.js +30 -0
  88. package/src/compiler/phases/2-analyze/visitors/SvelteComponent.js +18 -0
  89. package/src/compiler/phases/2-analyze/visitors/SvelteDocument.js +24 -0
  90. package/src/compiler/phases/2-analyze/visitors/SvelteElement.js +78 -0
  91. package/src/compiler/phases/2-analyze/visitors/SvelteFragment.js +27 -0
  92. package/src/compiler/phases/2-analyze/visitors/SvelteHead.js +18 -0
  93. package/src/compiler/phases/2-analyze/visitors/SvelteSelf.js +36 -0
  94. package/src/compiler/phases/2-analyze/visitors/SvelteWindow.js +24 -0
  95. package/src/compiler/phases/2-analyze/visitors/TaggedTemplateExpression.js +16 -0
  96. package/src/compiler/phases/2-analyze/visitors/TemplateElement.js +12 -0
  97. package/src/compiler/phases/2-analyze/visitors/Text.js +52 -0
  98. package/src/compiler/phases/2-analyze/visitors/TitleElement.js +21 -0
  99. package/src/compiler/phases/2-analyze/visitors/TransitionDirective.js +19 -0
  100. package/src/compiler/phases/2-analyze/visitors/UpdateExpression.js +29 -0
  101. package/src/compiler/phases/2-analyze/visitors/UseDirective.js +18 -0
  102. package/src/compiler/phases/2-analyze/visitors/VariableDeclarator.js +160 -0
  103. package/src/compiler/phases/2-analyze/visitors/shared/a11y/constants.js +334 -0
  104. package/src/compiler/phases/2-analyze/visitors/shared/a11y/index.js +981 -0
  105. package/src/compiler/phases/2-analyze/visitors/shared/attribute.js +125 -0
  106. package/src/compiler/phases/2-analyze/visitors/shared/component.js +177 -0
  107. package/src/compiler/phases/2-analyze/visitors/shared/element.js +160 -0
  108. package/src/compiler/phases/2-analyze/visitors/shared/fragment.js +15 -0
  109. package/src/compiler/phases/2-analyze/visitors/shared/function.js +24 -0
  110. package/src/compiler/phases/2-analyze/visitors/shared/snippets.js +17 -0
  111. package/src/compiler/phases/2-analyze/visitors/shared/special-element.js +16 -0
  112. package/src/compiler/phases/2-analyze/visitors/shared/utils.js +301 -0
  113. package/src/compiler/phases/3-transform/client/transform-client.js +719 -0
  114. package/src/compiler/phases/3-transform/client/transform-template/fix-attribute-casing.js +18 -0
  115. package/src/compiler/phases/3-transform/client/transform-template/index.js +67 -0
  116. package/src/compiler/phases/3-transform/client/transform-template/template.js +164 -0
  117. package/src/compiler/phases/3-transform/client/utils.js +181 -0
  118. package/src/compiler/phases/3-transform/client/visitors/AnimateDirective.js +38 -0
  119. package/src/compiler/phases/3-transform/client/visitors/ArrowFunctionExpression.js +11 -0
  120. package/src/compiler/phases/3-transform/client/visitors/AssignmentExpression.js +247 -0
  121. package/src/compiler/phases/3-transform/client/visitors/AttachTag.js +26 -0
  122. package/src/compiler/phases/3-transform/client/visitors/Attribute.js +14 -0
  123. package/src/compiler/phases/3-transform/client/visitors/AwaitBlock.js +124 -0
  124. package/src/compiler/phases/3-transform/client/visitors/AwaitExpression.js +25 -0
  125. package/src/compiler/phases/3-transform/client/visitors/BinaryExpression.js +34 -0
  126. package/src/compiler/phases/3-transform/client/visitors/BindDirective.js +290 -0
  127. package/src/compiler/phases/3-transform/client/visitors/BlockStatement.js +32 -0
  128. package/src/compiler/phases/3-transform/client/visitors/BreakStatement.js +20 -0
  129. package/src/compiler/phases/3-transform/client/visitors/CallExpression.js +136 -0
  130. package/src/compiler/phases/3-transform/client/visitors/ClassBody.js +111 -0
  131. package/src/compiler/phases/3-transform/client/visitors/Comment.js +11 -0
  132. package/src/compiler/phases/3-transform/client/visitors/Component.js +12 -0
  133. package/src/compiler/phases/3-transform/client/visitors/ConstTag.js +134 -0
  134. package/src/compiler/phases/3-transform/client/visitors/DebugTag.js +28 -0
  135. package/src/compiler/phases/3-transform/client/visitors/EachBlock.js +362 -0
  136. package/src/compiler/phases/3-transform/client/visitors/ExportNamedDeclaration.js +19 -0
  137. package/src/compiler/phases/3-transform/client/visitors/ExpressionStatement.js +20 -0
  138. package/src/compiler/phases/3-transform/client/visitors/ForOfStatement.js +25 -0
  139. package/src/compiler/phases/3-transform/client/visitors/Fragment.js +186 -0
  140. package/src/compiler/phases/3-transform/client/visitors/FunctionDeclaration.js +12 -0
  141. package/src/compiler/phases/3-transform/client/visitors/FunctionExpression.js +11 -0
  142. package/src/compiler/phases/3-transform/client/visitors/HtmlTag.js +53 -0
  143. package/src/compiler/phases/3-transform/client/visitors/Identifier.js +45 -0
  144. package/src/compiler/phases/3-transform/client/visitors/IfBlock.js +131 -0
  145. package/src/compiler/phases/3-transform/client/visitors/KeyBlock.js +45 -0
  146. package/src/compiler/phases/3-transform/client/visitors/LabeledStatement.js +64 -0
  147. package/src/compiler/phases/3-transform/client/visitors/LetDirective.js +55 -0
  148. package/src/compiler/phases/3-transform/client/visitors/MemberExpression.js +23 -0
  149. package/src/compiler/phases/3-transform/client/visitors/OnDirective.js +38 -0
  150. package/src/compiler/phases/3-transform/client/visitors/Program.js +153 -0
  151. package/src/compiler/phases/3-transform/client/visitors/RegularElement.js +725 -0
  152. package/src/compiler/phases/3-transform/client/visitors/RenderTag.js +95 -0
  153. package/src/compiler/phases/3-transform/client/visitors/SlotElement.js +94 -0
  154. package/src/compiler/phases/3-transform/client/visitors/SnippetBlock.js +94 -0
  155. package/src/compiler/phases/3-transform/client/visitors/SpreadAttribute.js +10 -0
  156. package/src/compiler/phases/3-transform/client/visitors/SvelteBody.js +11 -0
  157. package/src/compiler/phases/3-transform/client/visitors/SvelteBoundary.js +126 -0
  158. package/src/compiler/phases/3-transform/client/visitors/SvelteComponent.js +13 -0
  159. package/src/compiler/phases/3-transform/client/visitors/SvelteDocument.js +11 -0
  160. package/src/compiler/phases/3-transform/client/visitors/SvelteElement.js +161 -0
  161. package/src/compiler/phases/3-transform/client/visitors/SvelteFragment.js +17 -0
  162. package/src/compiler/phases/3-transform/client/visitors/SvelteHead.js +23 -0
  163. package/src/compiler/phases/3-transform/client/visitors/SvelteSelf.js +13 -0
  164. package/src/compiler/phases/3-transform/client/visitors/SvelteWindow.js +11 -0
  165. package/src/compiler/phases/3-transform/client/visitors/TitleElement.js +48 -0
  166. package/src/compiler/phases/3-transform/client/visitors/TransitionDirective.js +41 -0
  167. package/src/compiler/phases/3-transform/client/visitors/UpdateExpression.js +55 -0
  168. package/src/compiler/phases/3-transform/client/visitors/UseDirective.js +49 -0
  169. package/src/compiler/phases/3-transform/client/visitors/VariableDeclaration.js +422 -0
  170. package/src/compiler/phases/3-transform/client/visitors/shared/component.js +536 -0
  171. package/src/compiler/phases/3-transform/client/visitors/shared/declarations.js +53 -0
  172. package/src/compiler/phases/3-transform/client/visitors/shared/element.js +263 -0
  173. package/src/compiler/phases/3-transform/client/visitors/shared/events.js +180 -0
  174. package/src/compiler/phases/3-transform/client/visitors/shared/fragment.js +185 -0
  175. package/src/compiler/phases/3-transform/client/visitors/shared/function.js +17 -0
  176. package/src/compiler/phases/3-transform/client/visitors/shared/special_element.js +22 -0
  177. package/src/compiler/phases/3-transform/client/visitors/shared/utils.js +513 -0
  178. package/src/compiler/phases/3-transform/css/index.js +479 -0
  179. package/src/compiler/phases/3-transform/index.js +118 -0
  180. package/src/compiler/phases/3-transform/server/transform-server.js +428 -0
  181. package/src/compiler/phases/3-transform/server/visitors/AssignmentExpression.js +124 -0
  182. package/src/compiler/phases/3-transform/server/visitors/AwaitBlock.js +36 -0
  183. package/src/compiler/phases/3-transform/server/visitors/AwaitExpression.js +40 -0
  184. package/src/compiler/phases/3-transform/server/visitors/CallExpression.js +71 -0
  185. package/src/compiler/phases/3-transform/server/visitors/ClassBody.js +81 -0
  186. package/src/compiler/phases/3-transform/server/visitors/Component.js +13 -0
  187. package/src/compiler/phases/3-transform/server/visitors/ConstTag.js +49 -0
  188. package/src/compiler/phases/3-transform/server/visitors/DebugTag.js +24 -0
  189. package/src/compiler/phases/3-transform/server/visitors/EachBlock.js +76 -0
  190. package/src/compiler/phases/3-transform/server/visitors/ExpressionStatement.js +23 -0
  191. package/src/compiler/phases/3-transform/server/visitors/Fragment.js +53 -0
  192. package/src/compiler/phases/3-transform/server/visitors/HtmlTag.js +25 -0
  193. package/src/compiler/phases/3-transform/server/visitors/Identifier.js +24 -0
  194. package/src/compiler/phases/3-transform/server/visitors/IfBlock.js +48 -0
  195. package/src/compiler/phases/3-transform/server/visitors/KeyBlock.js +22 -0
  196. package/src/compiler/phases/3-transform/server/visitors/LabeledStatement.js +24 -0
  197. package/src/compiler/phases/3-transform/server/visitors/MemberExpression.js +19 -0
  198. package/src/compiler/phases/3-transform/server/visitors/Program.js +25 -0
  199. package/src/compiler/phases/3-transform/server/visitors/PropertyDefinition.js +37 -0
  200. package/src/compiler/phases/3-transform/server/visitors/RegularElement.js +216 -0
  201. package/src/compiler/phases/3-transform/server/visitors/RenderTag.js +45 -0
  202. package/src/compiler/phases/3-transform/server/visitors/SlotElement.js +68 -0
  203. package/src/compiler/phases/3-transform/server/visitors/SnippetBlock.js +29 -0
  204. package/src/compiler/phases/3-transform/server/visitors/SpreadAttribute.js +10 -0
  205. package/src/compiler/phases/3-transform/server/visitors/SvelteBoundary.js +139 -0
  206. package/src/compiler/phases/3-transform/server/visitors/SvelteComponent.js +12 -0
  207. package/src/compiler/phases/3-transform/server/visitors/SvelteElement.js +89 -0
  208. package/src/compiler/phases/3-transform/server/visitors/SvelteFragment.js +11 -0
  209. package/src/compiler/phases/3-transform/server/visitors/SvelteHead.js +25 -0
  210. package/src/compiler/phases/3-transform/server/visitors/SvelteSelf.js +12 -0
  211. package/src/compiler/phases/3-transform/server/visitors/TitleElement.js +21 -0
  212. package/src/compiler/phases/3-transform/server/visitors/UpdateExpression.js +35 -0
  213. package/src/compiler/phases/3-transform/server/visitors/VariableDeclaration.js +247 -0
  214. package/src/compiler/phases/3-transform/server/visitors/shared/component.js +359 -0
  215. package/src/compiler/phases/3-transform/server/visitors/shared/element.js +557 -0
  216. package/src/compiler/phases/3-transform/server/visitors/shared/utils.js +408 -0
  217. package/src/compiler/phases/3-transform/shared/assignments.js +92 -0
  218. package/src/compiler/phases/3-transform/shared/transform-async.js +114 -0
  219. package/src/compiler/phases/3-transform/utils.js +451 -0
  220. package/src/compiler/phases/bindings.js +227 -0
  221. package/src/compiler/phases/css.js +14 -0
  222. package/src/compiler/phases/nodes.js +258 -0
  223. package/src/compiler/phases/patterns.js +27 -0
  224. package/src/compiler/phases/scope.js +1432 -0
  225. package/src/compiler/preprocess/decode_sourcemap.js +96 -0
  226. package/src/compiler/preprocess/index.js +368 -0
  227. package/src/compiler/preprocess/replace_in_code.js +72 -0
  228. package/src/compiler/print/index.js +911 -0
  229. package/src/compiler/state.js +144 -0
  230. package/src/compiler/utils/assert.js +9 -0
  231. package/src/compiler/utils/ast.js +639 -0
  232. package/src/compiler/utils/builders.js +698 -0
  233. package/src/compiler/utils/compile_diagnostic.js +107 -0
  234. package/src/compiler/utils/extract_svelte_ignore.js +104 -0
  235. package/src/compiler/utils/mapped_code.js +454 -0
  236. package/src/compiler/utils/push_array.js +13 -0
  237. package/src/compiler/utils/sanitize_template_string.js +7 -0
  238. package/src/compiler/utils/slot.js +20 -0
  239. package/src/compiler/utils/string.js +9 -0
  240. package/src/compiler/validate-options.js +324 -0
  241. package/src/compiler/warnings.js +845 -0
  242. package/src/constants.js +66 -0
  243. package/src/easing/index.js +286 -0
  244. package/src/escaping.js +26 -0
  245. package/src/events/index.js +1 -0
  246. package/src/html-tree-validation.js +238 -0
  247. package/src/index-client.js +255 -0
  248. package/src/index-server.js +56 -0
  249. package/src/internal/client/constants.js +77 -0
  250. package/src/internal/client/context.js +258 -0
  251. package/src/internal/client/dev/assign.js +79 -0
  252. package/src/internal/client/dev/console-log.js +37 -0
  253. package/src/internal/client/dev/css.js +31 -0
  254. package/src/internal/client/dev/debug.js +500 -0
  255. package/src/internal/client/dev/elements.js +63 -0
  256. package/src/internal/client/dev/equality.js +101 -0
  257. package/src/internal/client/dev/hmr.js +89 -0
  258. package/src/internal/client/dev/inspect.js +72 -0
  259. package/src/internal/client/dev/legacy.js +25 -0
  260. package/src/internal/client/dev/ownership.js +81 -0
  261. package/src/internal/client/dev/tracing.js +162 -0
  262. package/src/internal/client/dev/validation.js +16 -0
  263. package/src/internal/client/dom/blocks/async.js +71 -0
  264. package/src/internal/client/dom/blocks/await.js +142 -0
  265. package/src/internal/client/dom/blocks/boundary.js +534 -0
  266. package/src/internal/client/dom/blocks/branches.js +227 -0
  267. package/src/internal/client/dom/blocks/css-props.js +28 -0
  268. package/src/internal/client/dom/blocks/each.js +723 -0
  269. package/src/internal/client/dom/blocks/html.js +128 -0
  270. package/src/internal/client/dom/blocks/if.js +82 -0
  271. package/src/internal/client/dom/blocks/key.js +40 -0
  272. package/src/internal/client/dom/blocks/slot.js +44 -0
  273. package/src/internal/client/dom/blocks/snippet.js +103 -0
  274. package/src/internal/client/dom/blocks/svelte-component.js +61 -0
  275. package/src/internal/client/dom/blocks/svelte-element.js +152 -0
  276. package/src/internal/client/dom/blocks/svelte-head.js +61 -0
  277. package/src/internal/client/dom/css.js +33 -0
  278. package/src/internal/client/dom/elements/actions.js +43 -0
  279. package/src/internal/client/dom/elements/attachments.js +33 -0
  280. package/src/internal/client/dom/elements/attributes.js +657 -0
  281. package/src/internal/client/dom/elements/bindings/document.js +17 -0
  282. package/src/internal/client/dom/elements/bindings/input.js +312 -0
  283. package/src/internal/client/dom/elements/bindings/media.js +233 -0
  284. package/src/internal/client/dom/elements/bindings/navigator.js +11 -0
  285. package/src/internal/client/dom/elements/bindings/props.js +22 -0
  286. package/src/internal/client/dom/elements/bindings/select.js +159 -0
  287. package/src/internal/client/dom/elements/bindings/shared.js +76 -0
  288. package/src/internal/client/dom/elements/bindings/size.js +107 -0
  289. package/src/internal/client/dom/elements/bindings/this.js +61 -0
  290. package/src/internal/client/dom/elements/bindings/universal.js +75 -0
  291. package/src/internal/client/dom/elements/bindings/window.js +66 -0
  292. package/src/internal/client/dom/elements/class.js +51 -0
  293. package/src/internal/client/dom/elements/custom-element.js +344 -0
  294. package/src/internal/client/dom/elements/customizable-select.js +99 -0
  295. package/src/internal/client/dom/elements/events.js +355 -0
  296. package/src/internal/client/dom/elements/misc.js +58 -0
  297. package/src/internal/client/dom/elements/style.js +57 -0
  298. package/src/internal/client/dom/elements/transitions.js +471 -0
  299. package/src/internal/client/dom/hydration.js +125 -0
  300. package/src/internal/client/dom/legacy/event-modifiers.js +127 -0
  301. package/src/internal/client/dom/legacy/lifecycle.js +82 -0
  302. package/src/internal/client/dom/legacy/misc.js +68 -0
  303. package/src/internal/client/dom/operations.js +293 -0
  304. package/src/internal/client/dom/reconciler.js +25 -0
  305. package/src/internal/client/dom/task.js +42 -0
  306. package/src/internal/client/dom/template.js +401 -0
  307. package/src/internal/client/error-handling.js +118 -0
  308. package/src/internal/client/errors.js +510 -0
  309. package/src/internal/client/hydratable.js +33 -0
  310. package/src/internal/client/index.js +183 -0
  311. package/src/internal/client/legacy.js +46 -0
  312. package/src/internal/client/loop.js +48 -0
  313. package/src/internal/client/proxy.js +432 -0
  314. package/src/internal/client/reactivity/async.js +306 -0
  315. package/src/internal/client/reactivity/batch.js +1057 -0
  316. package/src/internal/client/reactivity/deriveds.js +426 -0
  317. package/src/internal/client/reactivity/effects.js +718 -0
  318. package/src/internal/client/reactivity/equality.js +31 -0
  319. package/src/internal/client/reactivity/props.js +430 -0
  320. package/src/internal/client/reactivity/sources.js +370 -0
  321. package/src/internal/client/reactivity/status.js +25 -0
  322. package/src/internal/client/reactivity/store.js +203 -0
  323. package/src/internal/client/reactivity/utils.js +40 -0
  324. package/src/internal/client/render.js +335 -0
  325. package/src/internal/client/runtime.js +827 -0
  326. package/src/internal/client/timing.js +16 -0
  327. package/src/internal/client/validate.js +54 -0
  328. package/src/internal/client/warnings.js +271 -0
  329. package/src/internal/disclose-version.js +6 -0
  330. package/src/internal/flags/async.js +3 -0
  331. package/src/internal/flags/index.js +23 -0
  332. package/src/internal/flags/legacy.js +3 -0
  333. package/src/internal/flags/tracing.js +3 -0
  334. package/src/internal/index.js +5 -0
  335. package/src/internal/server/abort-signal.js +13 -0
  336. package/src/internal/server/blocks/html.js +11 -0
  337. package/src/internal/server/blocks/snippet.js +24 -0
  338. package/src/internal/server/context.js +132 -0
  339. package/src/internal/server/crypto.js +45 -0
  340. package/src/internal/server/dev.js +115 -0
  341. package/src/internal/server/errors.js +131 -0
  342. package/src/internal/server/hydratable.js +142 -0
  343. package/src/internal/server/hydration.js +6 -0
  344. package/src/internal/server/index.js +544 -0
  345. package/src/internal/server/render-context.js +86 -0
  346. package/src/internal/server/renderer.js +923 -0
  347. package/src/internal/server/warnings.js +29 -0
  348. package/src/internal/shared/attributes.js +225 -0
  349. package/src/internal/shared/clone.js +137 -0
  350. package/src/internal/shared/dev.js +65 -0
  351. package/src/internal/shared/errors.js +134 -0
  352. package/src/internal/shared/utils.js +144 -0
  353. package/src/internal/shared/validate.js +47 -0
  354. package/src/internal/shared/warnings.js +40 -0
  355. package/src/legacy/legacy-client.js +281 -0
  356. package/src/legacy/legacy-server.js +112 -0
  357. package/src/motion/index.js +32 -0
  358. package/src/motion/spring.js +369 -0
  359. package/src/motion/tweened.js +306 -0
  360. package/src/motion/utils.js +7 -0
  361. package/src/reactivity/create-subscriber.js +95 -0
  362. package/src/reactivity/date.js +118 -0
  363. package/src/reactivity/index-client.js +7 -0
  364. package/src/reactivity/index-server.js +23 -0
  365. package/src/reactivity/map.js +273 -0
  366. package/src/reactivity/media-query.js +55 -0
  367. package/src/reactivity/reactive-value.js +24 -0
  368. package/src/reactivity/set.js +213 -0
  369. package/src/reactivity/url-search-params.js +174 -0
  370. package/src/reactivity/url.js +205 -0
  371. package/src/reactivity/window/index.js +161 -0
  372. package/src/server/index.js +1 -0
  373. package/src/store/index-client.js +169 -0
  374. package/src/store/index-server.js +101 -0
  375. package/src/store/shared/index.js +209 -0
  376. package/src/store/utils.js +36 -0
  377. package/src/transition/index.js +300 -0
  378. package/src/utils.js +504 -0
  379. package/src/version.js +8 -0
  380. package/store.d.ts +1 -0
  381. package/svelte-html.d.ts +245 -0
  382. package/transition.d.ts +1 -0
  383. package/types/compiler/interfaces.d.ts +1 -0
  384. package/types/compiler/preprocess.d.ts +1 -0
  385. package/types/index.d.ts +3744 -0
  386. package/types/index.d.ts.map +280 -0
@@ -0,0 +1,159 @@
1
+ import { effect, teardown } from '../../../reactivity/effects.js';
2
+ import { listen_to_event_and_reset_event } from './shared.js';
3
+ import { is } from '../../../proxy.js';
4
+ import { is_array } from '../../../../shared/utils.js';
5
+ import * as w from '../../../warnings.js';
6
+ import { Batch, current_batch, previous_batch } from '../../../reactivity/batch.js';
7
+
8
+ /**
9
+ * Selects the correct option(s) (depending on whether this is a multiple select)
10
+ * @template V
11
+ * @param {HTMLSelectElement} select
12
+ * @param {V} value
13
+ * @param {boolean} mounting
14
+ */
15
+ export function select_option(select, value, mounting = false) {
16
+ if (select.multiple) {
17
+ // If value is null or undefined, keep the selection as is
18
+ if (value == undefined) {
19
+ return;
20
+ }
21
+
22
+ // If not an array, warn and keep the selection as is
23
+ if (!is_array(value)) {
24
+ return w.select_multiple_invalid_value();
25
+ }
26
+
27
+ // Otherwise, update the selection
28
+ for (var option of select.options) {
29
+ option.selected = value.includes(get_option_value(option));
30
+ }
31
+
32
+ return;
33
+ }
34
+
35
+ for (option of select.options) {
36
+ var option_value = get_option_value(option);
37
+ if (is(option_value, value)) {
38
+ option.selected = true;
39
+ return;
40
+ }
41
+ }
42
+
43
+ if (!mounting || value !== undefined) {
44
+ select.selectedIndex = -1; // no option should be selected
45
+ }
46
+ }
47
+
48
+ /**
49
+ * Selects the correct option(s) if `value` is given,
50
+ * and then sets up a mutation observer to sync the
51
+ * current selection to the dom when it changes. Such
52
+ * changes could for example occur when options are
53
+ * inside an `#each` block.
54
+ * @param {HTMLSelectElement} select
55
+ */
56
+ export function init_select(select) {
57
+ var observer = new MutationObserver(() => {
58
+ // @ts-ignore
59
+ select_option(select, select.__value);
60
+ // Deliberately don't update the potential binding value,
61
+ // the model should be preserved unless explicitly changed
62
+ });
63
+
64
+ observer.observe(select, {
65
+ // Listen to option element changes
66
+ childList: true,
67
+ subtree: true, // because of <optgroup>
68
+ // Listen to option element value attribute changes
69
+ // (doesn't get notified of select value changes,
70
+ // because that property is not reflected as an attribute)
71
+ attributes: true,
72
+ attributeFilter: ['value']
73
+ });
74
+
75
+ teardown(() => {
76
+ observer.disconnect();
77
+ });
78
+ }
79
+
80
+ /**
81
+ * @param {HTMLSelectElement} select
82
+ * @param {() => unknown} get
83
+ * @param {(value: unknown) => void} set
84
+ * @returns {void}
85
+ */
86
+ export function bind_select_value(select, get, set = get) {
87
+ var batches = new WeakSet();
88
+ var mounting = true;
89
+
90
+ listen_to_event_and_reset_event(select, 'change', (is_reset) => {
91
+ var query = is_reset ? '[selected]' : ':checked';
92
+ /** @type {unknown} */
93
+ var value;
94
+
95
+ if (select.multiple) {
96
+ value = [].map.call(select.querySelectorAll(query), get_option_value);
97
+ } else {
98
+ /** @type {HTMLOptionElement | null} */
99
+ var selected_option =
100
+ select.querySelector(query) ??
101
+ // will fall back to first non-disabled option if no option is selected
102
+ select.querySelector('option:not([disabled])');
103
+ value = selected_option && get_option_value(selected_option);
104
+ }
105
+
106
+ set(value);
107
+
108
+ if (current_batch !== null) {
109
+ batches.add(current_batch);
110
+ }
111
+ });
112
+
113
+ // Needs to be an effect, not a render_effect, so that in case of each loops the logic runs after the each block has updated
114
+ effect(() => {
115
+ var value = get();
116
+
117
+ if (select === document.activeElement) {
118
+ // we need both, because in non-async mode, render effects run before previous_batch is set
119
+ var batch = /** @type {Batch} */ (previous_batch ?? current_batch);
120
+
121
+ // Don't update the <select> if it is focused. We can get here if, for example,
122
+ // an update is deferred because of async work depending on the select:
123
+ //
124
+ // <select bind:value={selected}>...</select>
125
+ // <p>{await find(selected)}</p>
126
+ if (batches.has(batch)) {
127
+ return;
128
+ }
129
+ }
130
+
131
+ select_option(select, value, mounting);
132
+
133
+ // Mounting and value undefined -> take selection from dom
134
+ if (mounting && value === undefined) {
135
+ /** @type {HTMLOptionElement | null} */
136
+ var selected_option = select.querySelector(':checked');
137
+ if (selected_option !== null) {
138
+ value = get_option_value(selected_option);
139
+ set(value);
140
+ }
141
+ }
142
+
143
+ // @ts-ignore
144
+ select.__value = value;
145
+ mounting = false;
146
+ });
147
+
148
+ init_select(select);
149
+ }
150
+
151
+ /** @param {HTMLOptionElement} option */
152
+ function get_option_value(option) {
153
+ // __value only exists if the <option> has a value attribute
154
+ if ('__value' in option) {
155
+ return option.__value;
156
+ } else {
157
+ return option.value;
158
+ }
159
+ }
@@ -0,0 +1,76 @@
1
+ import { teardown } from '../../../reactivity/effects.js';
2
+ import {
3
+ active_effect,
4
+ active_reaction,
5
+ set_active_effect,
6
+ set_active_reaction
7
+ } from '../../../runtime.js';
8
+ import { add_form_reset_listener } from '../misc.js';
9
+
10
+ /**
11
+ * Fires the handler once immediately (unless corresponding arg is set to `false`),
12
+ * then listens to the given events until the render effect context is destroyed
13
+ * @param {EventTarget} target
14
+ * @param {Array<string>} events
15
+ * @param {(event?: Event) => void} handler
16
+ * @param {any} call_handler_immediately
17
+ */
18
+ export function listen(target, events, handler, call_handler_immediately = true) {
19
+ if (call_handler_immediately) {
20
+ handler();
21
+ }
22
+
23
+ for (var name of events) {
24
+ target.addEventListener(name, handler);
25
+ }
26
+
27
+ teardown(() => {
28
+ for (var name of events) {
29
+ target.removeEventListener(name, handler);
30
+ }
31
+ });
32
+ }
33
+
34
+ /**
35
+ * @template T
36
+ * @param {() => T} fn
37
+ */
38
+ export function without_reactive_context(fn) {
39
+ var previous_reaction = active_reaction;
40
+ var previous_effect = active_effect;
41
+ set_active_reaction(null);
42
+ set_active_effect(null);
43
+ try {
44
+ return fn();
45
+ } finally {
46
+ set_active_reaction(previous_reaction);
47
+ set_active_effect(previous_effect);
48
+ }
49
+ }
50
+
51
+ /**
52
+ * Listen to the given event, and then instantiate a global form reset listener if not already done,
53
+ * to notify all bindings when the form is reset
54
+ * @param {HTMLElement} element
55
+ * @param {string} event
56
+ * @param {(is_reset?: true) => void} handler
57
+ * @param {(is_reset?: true) => void} [on_reset]
58
+ */
59
+ export function listen_to_event_and_reset_event(element, event, handler, on_reset = handler) {
60
+ element.addEventListener(event, () => without_reactive_context(handler));
61
+ // @ts-expect-error
62
+ const prev = element.__on_r;
63
+ if (prev) {
64
+ // special case for checkbox that can have multiple binds (group & checked)
65
+ // @ts-expect-error
66
+ element.__on_r = () => {
67
+ prev();
68
+ on_reset(true);
69
+ };
70
+ } else {
71
+ // @ts-expect-error
72
+ element.__on_r = () => on_reset(true);
73
+ }
74
+
75
+ add_form_reset_listener();
76
+ }
@@ -0,0 +1,107 @@
1
+ import { effect, teardown } from '../../../reactivity/effects.js';
2
+ import { untrack } from '../../../runtime.js';
3
+
4
+ /**
5
+ * We create one listener for all elements
6
+ * @see {@link https://groups.google.com/a/chromium.org/g/blink-dev/c/z6ienONUb5A/m/F5-VcUZtBAAJ Explanation}
7
+ */
8
+ class ResizeObserverSingleton {
9
+ /** */
10
+ #listeners = new WeakMap();
11
+
12
+ /** @type {ResizeObserver | undefined} */
13
+ #observer;
14
+
15
+ /** @type {ResizeObserverOptions} */
16
+ #options;
17
+
18
+ /** @static */
19
+ static entries = new WeakMap();
20
+
21
+ /** @param {ResizeObserverOptions} options */
22
+ constructor(options) {
23
+ this.#options = options;
24
+ }
25
+
26
+ /**
27
+ * @param {Element} element
28
+ * @param {(entry: ResizeObserverEntry) => any} listener
29
+ */
30
+ observe(element, listener) {
31
+ var listeners = this.#listeners.get(element) || new Set();
32
+ listeners.add(listener);
33
+
34
+ this.#listeners.set(element, listeners);
35
+ this.#getObserver().observe(element, this.#options);
36
+
37
+ return () => {
38
+ var listeners = this.#listeners.get(element);
39
+ listeners.delete(listener);
40
+
41
+ if (listeners.size === 0) {
42
+ this.#listeners.delete(element);
43
+ /** @type {ResizeObserver} */ (this.#observer).unobserve(element);
44
+ }
45
+ };
46
+ }
47
+
48
+ #getObserver() {
49
+ return (
50
+ this.#observer ??
51
+ (this.#observer = new ResizeObserver(
52
+ /** @param {any} entries */ (entries) => {
53
+ for (var entry of entries) {
54
+ ResizeObserverSingleton.entries.set(entry.target, entry);
55
+ for (var listener of this.#listeners.get(entry.target) || []) {
56
+ listener(entry);
57
+ }
58
+ }
59
+ }
60
+ ))
61
+ );
62
+ }
63
+ }
64
+
65
+ var resize_observer_content_box = /* @__PURE__ */ new ResizeObserverSingleton({
66
+ box: 'content-box'
67
+ });
68
+
69
+ var resize_observer_border_box = /* @__PURE__ */ new ResizeObserverSingleton({
70
+ box: 'border-box'
71
+ });
72
+
73
+ var resize_observer_device_pixel_content_box = /* @__PURE__ */ new ResizeObserverSingleton({
74
+ box: 'device-pixel-content-box'
75
+ });
76
+
77
+ /**
78
+ * @param {Element} element
79
+ * @param {'contentRect' | 'contentBoxSize' | 'borderBoxSize' | 'devicePixelContentBoxSize'} type
80
+ * @param {(entry: keyof ResizeObserverEntry) => void} set
81
+ */
82
+ export function bind_resize_observer(element, type, set) {
83
+ var observer =
84
+ type === 'contentRect' || type === 'contentBoxSize'
85
+ ? resize_observer_content_box
86
+ : type === 'borderBoxSize'
87
+ ? resize_observer_border_box
88
+ : resize_observer_device_pixel_content_box;
89
+
90
+ var unsub = observer.observe(element, /** @param {any} entry */ (entry) => set(entry[type]));
91
+ teardown(unsub);
92
+ }
93
+
94
+ /**
95
+ * @param {HTMLElement} element
96
+ * @param {'clientWidth' | 'clientHeight' | 'offsetWidth' | 'offsetHeight'} type
97
+ * @param {(size: number) => void} set
98
+ */
99
+ export function bind_element_size(element, type, set) {
100
+ var unsub = resize_observer_border_box.observe(element, () => set(element[type]));
101
+
102
+ effect(() => {
103
+ // The update could contain reads which should be ignored
104
+ untrack(() => set(element[type]));
105
+ return unsub;
106
+ });
107
+ }
@@ -0,0 +1,61 @@
1
+ import { STATE_SYMBOL } from '#client/constants';
2
+ import { effect, render_effect } from '../../../reactivity/effects.js';
3
+ import { untrack } from '../../../runtime.js';
4
+ import { queue_micro_task } from '../../task.js';
5
+
6
+ /**
7
+ * @param {any} bound_value
8
+ * @param {Element} element_or_component
9
+ * @returns {boolean}
10
+ */
11
+ function is_bound_this(bound_value, element_or_component) {
12
+ return (
13
+ bound_value === element_or_component || bound_value?.[STATE_SYMBOL] === element_or_component
14
+ );
15
+ }
16
+
17
+ /**
18
+ * @param {any} element_or_component
19
+ * @param {(value: unknown, ...parts: unknown[]) => void} update
20
+ * @param {(...parts: unknown[]) => unknown} get_value
21
+ * @param {() => unknown[]} [get_parts] Set if the this binding is used inside an each block,
22
+ * returns all the parts of the each block context that are used in the expression
23
+ * @returns {void}
24
+ */
25
+ export function bind_this(element_or_component = {}, update, get_value, get_parts) {
26
+ effect(() => {
27
+ /** @type {unknown[]} */
28
+ var old_parts;
29
+
30
+ /** @type {unknown[]} */
31
+ var parts;
32
+
33
+ render_effect(() => {
34
+ old_parts = parts;
35
+ // We only track changes to the parts, not the value itself to avoid unnecessary reruns.
36
+ parts = get_parts?.() || [];
37
+
38
+ untrack(() => {
39
+ if (element_or_component !== get_value(...parts)) {
40
+ update(element_or_component, ...parts);
41
+ // If this is an effect rerun (cause: each block context changes), then nullify the binding at
42
+ // the previous position if it isn't already taken over by a different effect.
43
+ if (old_parts && is_bound_this(get_value(...old_parts), element_or_component)) {
44
+ update(null, ...old_parts);
45
+ }
46
+ }
47
+ });
48
+ });
49
+
50
+ return () => {
51
+ // We cannot use effects in the teardown phase, we we use a microtask instead.
52
+ queue_micro_task(() => {
53
+ if (parts && is_bound_this(get_value(...parts), element_or_component)) {
54
+ update(null, ...parts);
55
+ }
56
+ });
57
+ };
58
+ });
59
+
60
+ return element_or_component;
61
+ }
@@ -0,0 +1,75 @@
1
+ import { render_effect, teardown } from '../../../reactivity/effects.js';
2
+ import { listen } from './shared.js';
3
+
4
+ /**
5
+ * @param {'innerHTML' | 'textContent' | 'innerText'} property
6
+ * @param {HTMLElement} element
7
+ * @param {() => unknown} get
8
+ * @param {(value: unknown) => void} set
9
+ * @returns {void}
10
+ */
11
+ export function bind_content_editable(property, element, get, set = get) {
12
+ element.addEventListener('input', () => {
13
+ // @ts-ignore
14
+ set(element[property]);
15
+ });
16
+
17
+ render_effect(() => {
18
+ var value = get();
19
+
20
+ if (element[property] !== value) {
21
+ if (value == null) {
22
+ // @ts-ignore
23
+ var non_null_value = element[property];
24
+ set(non_null_value);
25
+ } else {
26
+ // @ts-ignore
27
+ element[property] = value + '';
28
+ }
29
+ }
30
+ });
31
+ }
32
+
33
+ /**
34
+ * @param {string} property
35
+ * @param {string} event_name
36
+ * @param {Element} element
37
+ * @param {(value: unknown) => void} set
38
+ * @param {() => unknown} [get]
39
+ * @returns {void}
40
+ */
41
+ export function bind_property(property, event_name, element, set, get) {
42
+ var handler = () => {
43
+ // @ts-ignore
44
+ set(element[property]);
45
+ };
46
+
47
+ element.addEventListener(event_name, handler);
48
+
49
+ if (get) {
50
+ render_effect(() => {
51
+ // @ts-ignore
52
+ element[property] = get();
53
+ });
54
+ } else {
55
+ handler();
56
+ }
57
+
58
+ // @ts-ignore
59
+ if (element === document.body || element === window || element === document) {
60
+ teardown(() => {
61
+ element.removeEventListener(event_name, handler);
62
+ });
63
+ }
64
+ }
65
+
66
+ /**
67
+ * @param {HTMLElement} element
68
+ * @param {(value: unknown) => void} set
69
+ * @returns {void}
70
+ */
71
+ export function bind_focused(element, set) {
72
+ listen(element, ['focus', 'blur'], () => {
73
+ set(element === document.activeElement);
74
+ });
75
+ }
@@ -0,0 +1,66 @@
1
+ import { effect, render_effect, teardown } from '../../../reactivity/effects.js';
2
+ import { listen, without_reactive_context } from './shared.js';
3
+
4
+ /**
5
+ * @param {'x' | 'y'} type
6
+ * @param {() => number} get
7
+ * @param {(value: number) => void} set
8
+ * @returns {void}
9
+ */
10
+ export function bind_window_scroll(type, get, set = get) {
11
+ var is_scrolling_x = type === 'x';
12
+
13
+ var target_handler = () =>
14
+ without_reactive_context(() => {
15
+ scrolling = true;
16
+ clearTimeout(timeout);
17
+ timeout = setTimeout(clear, 100); // TODO use scrollend event if supported (or when supported everywhere?)
18
+
19
+ set(window[is_scrolling_x ? 'scrollX' : 'scrollY']);
20
+ });
21
+
22
+ addEventListener('scroll', target_handler, {
23
+ passive: true
24
+ });
25
+
26
+ var scrolling = false;
27
+
28
+ /** @type {ReturnType<typeof setTimeout>} */
29
+ var timeout;
30
+ var clear = () => {
31
+ scrolling = false;
32
+ };
33
+ var first = true;
34
+
35
+ render_effect(() => {
36
+ var latest_value = get();
37
+ // Don't scroll to the initial value for accessibility reasons
38
+ if (first) {
39
+ first = false;
40
+ } else if (!scrolling && latest_value != null) {
41
+ scrolling = true;
42
+ clearTimeout(timeout);
43
+ if (is_scrolling_x) {
44
+ scrollTo(latest_value, window.scrollY);
45
+ } else {
46
+ scrollTo(window.scrollX, latest_value);
47
+ }
48
+ timeout = setTimeout(clear, 100);
49
+ }
50
+ });
51
+
52
+ // Browsers don't fire the scroll event for the initial scroll position when scroll style isn't set to smooth
53
+ effect(target_handler);
54
+
55
+ teardown(() => {
56
+ removeEventListener('scroll', target_handler);
57
+ });
58
+ }
59
+
60
+ /**
61
+ * @param {'innerWidth' | 'innerHeight' | 'outerWidth' | 'outerHeight'} type
62
+ * @param {(size: number) => void} set
63
+ */
64
+ export function bind_window_size(type, set) {
65
+ listen(window, ['resize'], () => without_reactive_context(() => set(window[type])));
66
+ }
@@ -0,0 +1,51 @@
1
+ import { to_class } from '../../../shared/attributes.js';
2
+ import { hydrating } from '../hydration.js';
3
+
4
+ /**
5
+ * @param {Element} dom
6
+ * @param {boolean | number} is_html
7
+ * @param {string | null} value
8
+ * @param {string} [hash]
9
+ * @param {Record<string, any>} [prev_classes]
10
+ * @param {Record<string, any>} [next_classes]
11
+ * @returns {Record<string, boolean> | undefined}
12
+ */
13
+ export function set_class(dom, is_html, value, hash, prev_classes, next_classes) {
14
+ // @ts-expect-error need to add __className to patched prototype
15
+ var prev = dom.__className;
16
+
17
+ if (
18
+ hydrating ||
19
+ prev !== value ||
20
+ prev === undefined // for edge case of `class={undefined}`
21
+ ) {
22
+ var next_class_name = to_class(value, hash, next_classes);
23
+
24
+ if (!hydrating || next_class_name !== dom.getAttribute('class')) {
25
+ // Removing the attribute when the value is only an empty string causes
26
+ // performance issues vs simply making the className an empty string. So
27
+ // we should only remove the class if the value is nullish
28
+ // and there no hash/directives :
29
+ if (next_class_name == null) {
30
+ dom.removeAttribute('class');
31
+ } else if (is_html) {
32
+ dom.className = next_class_name;
33
+ } else {
34
+ dom.setAttribute('class', next_class_name);
35
+ }
36
+ }
37
+
38
+ // @ts-expect-error need to add __className to patched prototype
39
+ dom.__className = value;
40
+ } else if (next_classes && prev_classes !== next_classes) {
41
+ for (var key in next_classes) {
42
+ var is_present = !!next_classes[key];
43
+
44
+ if (prev_classes == null || is_present !== !!prev_classes[key]) {
45
+ dom.classList.toggle(key, is_present);
46
+ }
47
+ }
48
+ }
49
+
50
+ return next_classes;
51
+ }