fundus 0.10.0 → 0.11.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 (238) hide show
  1. package/README.md +62 -3
  2. package/build/client/_app/immutable/assets/3.BuCXJbRG.css +1 -0
  3. package/build/client/_app/immutable/assets/3.BuCXJbRG.css.br +0 -0
  4. package/build/client/_app/immutable/assets/3.BuCXJbRG.css.gz +0 -0
  5. package/build/client/_app/immutable/assets/4.C0QkCMQ4.css +1 -0
  6. package/build/client/_app/immutable/assets/4.C0QkCMQ4.css.br +0 -0
  7. package/build/client/_app/immutable/assets/4.C0QkCMQ4.css.gz +0 -0
  8. package/build/client/_app/immutable/assets/LibraryContextMenu.B6By2-yb.css +1 -0
  9. package/build/client/_app/immutable/assets/LibraryContextMenu.B6By2-yb.css.br +0 -0
  10. package/build/client/_app/immutable/assets/LibraryContextMenu.B6By2-yb.css.gz +0 -0
  11. package/build/client/_app/immutable/assets/Popover.Et4sBRbI.css +1 -0
  12. package/build/client/_app/immutable/assets/Popover.Et4sBRbI.css.br +0 -0
  13. package/build/client/_app/immutable/assets/Popover.Et4sBRbI.css.gz +0 -0
  14. package/build/client/_app/immutable/chunks/B9HdDE5n.js +1 -0
  15. package/build/client/_app/immutable/chunks/B9HdDE5n.js.br +0 -0
  16. package/build/client/_app/immutable/chunks/B9HdDE5n.js.gz +0 -0
  17. package/build/client/_app/immutable/chunks/CAQ5okPf.js +2 -0
  18. package/build/client/_app/immutable/chunks/CAQ5okPf.js.br +0 -0
  19. package/build/client/_app/immutable/chunks/CAQ5okPf.js.gz +0 -0
  20. package/build/client/_app/immutable/chunks/Ccz62-Hi.js +1 -0
  21. package/build/client/_app/immutable/chunks/Ccz62-Hi.js.br +0 -0
  22. package/build/client/_app/immutable/chunks/Ccz62-Hi.js.gz +0 -0
  23. package/build/client/_app/immutable/chunks/ChVOZl2x.js +1 -0
  24. package/build/client/_app/immutable/chunks/ChVOZl2x.js.br +0 -0
  25. package/build/client/_app/immutable/chunks/ChVOZl2x.js.gz +0 -0
  26. package/build/client/_app/immutable/chunks/CiBv7EZv.js +108 -0
  27. package/build/client/_app/immutable/chunks/CiBv7EZv.js.br +0 -0
  28. package/build/client/_app/immutable/chunks/CiBv7EZv.js.gz +0 -0
  29. package/build/client/_app/immutable/chunks/UFAWUL-4.js +1 -0
  30. package/build/client/_app/immutable/chunks/UFAWUL-4.js.br +0 -0
  31. package/build/client/_app/immutable/chunks/UFAWUL-4.js.gz +0 -0
  32. package/build/client/_app/immutable/chunks/YWIvyYJl.js +1 -0
  33. package/build/client/_app/immutable/chunks/YWIvyYJl.js.br +0 -0
  34. package/build/client/_app/immutable/chunks/YWIvyYJl.js.gz +0 -0
  35. package/build/client/_app/immutable/chunks/YpiA5Xry.js +3 -0
  36. package/build/client/_app/immutable/chunks/YpiA5Xry.js.br +0 -0
  37. package/build/client/_app/immutable/chunks/YpiA5Xry.js.gz +0 -0
  38. package/build/client/_app/immutable/chunks/{CliRE4wo.js → jjXOSnwf.js} +1 -1
  39. package/build/client/_app/immutable/chunks/jjXOSnwf.js.br +0 -0
  40. package/build/client/_app/immutable/chunks/jjXOSnwf.js.gz +0 -0
  41. package/build/client/_app/immutable/entry/app.Rv8f5zSo.js +2 -0
  42. package/build/client/_app/immutable/entry/app.Rv8f5zSo.js.br +0 -0
  43. package/build/client/_app/immutable/entry/app.Rv8f5zSo.js.gz +0 -0
  44. package/build/client/_app/immutable/entry/start.C5jRg_CF.js +1 -0
  45. package/build/client/_app/immutable/entry/start.C5jRg_CF.js.br +1 -0
  46. package/build/client/_app/immutable/entry/start.C5jRg_CF.js.gz +0 -0
  47. package/build/client/_app/immutable/nodes/0.Gv5d6CcW.js +1 -0
  48. package/build/client/_app/immutable/nodes/0.Gv5d6CcW.js.br +0 -0
  49. package/build/client/_app/immutable/nodes/0.Gv5d6CcW.js.gz +0 -0
  50. package/build/client/_app/immutable/nodes/1.8J9y5zyF.js +1 -0
  51. package/build/client/_app/immutable/nodes/1.8J9y5zyF.js.br +0 -0
  52. package/build/client/_app/immutable/nodes/1.8J9y5zyF.js.gz +0 -0
  53. package/build/client/_app/immutable/nodes/2.BNvTqsKZ.js +3 -0
  54. package/build/client/_app/immutable/nodes/2.BNvTqsKZ.js.br +0 -0
  55. package/build/client/_app/immutable/nodes/2.BNvTqsKZ.js.gz +0 -0
  56. package/build/client/_app/immutable/nodes/3.CmlRI2XA.js +1 -0
  57. package/build/client/_app/immutable/nodes/3.CmlRI2XA.js.br +0 -0
  58. package/build/client/_app/immutable/nodes/3.CmlRI2XA.js.gz +0 -0
  59. package/build/client/_app/immutable/nodes/4.CHTKk5QR.js +2 -0
  60. package/build/client/_app/immutable/nodes/4.CHTKk5QR.js.br +0 -0
  61. package/build/client/_app/immutable/nodes/4.CHTKk5QR.js.gz +0 -0
  62. package/build/client/_app/version.json +1 -1
  63. package/build/client/_app/version.json.br +0 -0
  64. package/build/client/_app/version.json.gz +0 -0
  65. package/build/handler.js +7 -7
  66. package/build/index.js +7 -7
  67. package/build/server/chunks/chunks/{context.js-Cg-Pih8x.js → context.js-BJfk3ZiR.js} +440 -6
  68. package/build/server/chunks/chunks/context.js-BJfk3ZiR.js.map +1 -0
  69. package/build/server/chunks/chunks/{contract.js-C6yL03Hj.js → contract.js-DRcxzb4o.js} +17 -3
  70. package/build/server/chunks/chunks/contract.js-DRcxzb4o.js.map +1 -0
  71. package/build/server/chunks/chunks/{exports.js-CKLcHEPO.js → exports.js-BcB5q0h5.js} +2 -2
  72. package/build/server/chunks/chunks/{exports.js-CKLcHEPO.js.map → exports.js-BcB5q0h5.js.map} +1 -1
  73. package/build/server/chunks/chunks/{http.js-B2joT3YT.js → http.js-DMkgmpI5.js} +2 -2
  74. package/build/server/chunks/chunks/{http.js-B2joT3YT.js.map → http.js-DMkgmpI5.js.map} +1 -1
  75. package/build/server/chunks/chunks/{internal.js-ByCfjWgU.js → internal.js-B6eePlP4.js} +3 -3
  76. package/build/server/chunks/chunks/{internal.js-ByCfjWgU.js.map → internal.js-B6eePlP4.js.map} +1 -1
  77. package/build/server/chunks/chunks/internal2.js-BlXt2rfE.js.map +1 -1
  78. package/build/server/chunks/chunks/{shared.js-BDdrmPL3.js → shared.js-BO7vJlPc.js} +2 -2
  79. package/build/server/chunks/chunks/{shared.js-BDdrmPL3.js.map → shared.js-BO7vJlPc.js.map} +1 -1
  80. package/build/server/chunks/chunks/{utils.js-CD_wf0ka.js → utils.js-BTV5xnNv.js} +3 -3
  81. package/build/server/chunks/chunks/{utils.js-CD_wf0ka.js.map → utils.js-BTV5xnNv.js.map} +1 -1
  82. package/build/server/chunks/entries/endpoints/api/_...path_/{_server.ts.js-Cn8Ztaiw.js → _server.ts.js-m2QGyBiV.js} +3 -3
  83. package/build/server/chunks/entries/endpoints/api/_...path_/{_server.ts.js-Cn8Ztaiw.js.map → _server.ts.js-m2QGyBiV.js.map} +1 -1
  84. package/build/server/chunks/entries/endpoints/api/assets/_id_/{_server.ts.js-CrOiDQG8.js → _server.ts.js-eMNgdaf4.js} +4 -4
  85. package/build/server/chunks/entries/endpoints/api/assets/_id_/{_server.ts.js-CrOiDQG8.js.map → _server.ts.js-eMNgdaf4.js.map} +1 -1
  86. package/build/server/chunks/entries/endpoints/api/assets/_id_/raw/{_server.ts.js-CpJ_OzDV.js → _server.ts.js-CEQd4Wxn.js} +4 -4
  87. package/build/server/chunks/entries/endpoints/api/assets/_id_/raw/{_server.ts.js-CpJ_OzDV.js.map → _server.ts.js-CEQd4Wxn.js.map} +1 -1
  88. package/build/server/chunks/entries/endpoints/api/assets/_id_/reimport/{_server.ts.js-BCZRAtqn.js → _server.ts.js-B2JoGCzy.js} +4 -4
  89. package/build/server/chunks/entries/endpoints/api/assets/_id_/reimport/{_server.ts.js-BCZRAtqn.js.map → _server.ts.js-B2JoGCzy.js.map} +1 -1
  90. package/build/server/chunks/entries/endpoints/api/assets/{_server.ts.js-CwyV_AMP.js → _server.ts.js-DTpkVywC.js} +4 -4
  91. package/build/server/chunks/entries/endpoints/api/assets/{_server.ts.js-CwyV_AMP.js.map → _server.ts.js-DTpkVywC.js.map} +1 -1
  92. package/build/server/chunks/entries/endpoints/api/assets/delete/{_server.ts.js-BZAM3HSB.js → _server.ts.js-D6Z_pGEZ.js} +4 -4
  93. package/build/server/chunks/entries/endpoints/api/assets/delete/{_server.ts.js-BZAM3HSB.js.map → _server.ts.js-D6Z_pGEZ.js.map} +1 -1
  94. package/build/server/chunks/entries/endpoints/api/assets/move/{_server.ts.js-CPNISyB1.js → _server.ts.js-CnDi9p0a.js} +4 -4
  95. package/build/server/chunks/entries/endpoints/api/assets/move/{_server.ts.js-CPNISyB1.js.map → _server.ts.js-CnDi9p0a.js.map} +1 -1
  96. package/build/server/chunks/entries/endpoints/api/folders/_path_/{_server.ts.js-5R7ywd4H.js → _server.ts.js-BCzuPX5Z.js} +4 -4
  97. package/build/server/chunks/entries/endpoints/api/folders/_path_/{_server.ts.js-5R7ywd4H.js.map → _server.ts.js-BCzuPX5Z.js.map} +1 -1
  98. package/build/server/chunks/entries/endpoints/api/folders/{_server.ts.js-ZQiaSMNA.js → _server.ts.js-CGbYyJ6S.js} +4 -4
  99. package/build/server/chunks/entries/endpoints/api/folders/{_server.ts.js-ZQiaSMNA.js.map → _server.ts.js-CGbYyJ6S.js.map} +1 -1
  100. package/build/server/chunks/entries/endpoints/api/imports/{_server.ts.js-CE29dwBF.js → _server.ts.js-CL_89klb.js} +4 -4
  101. package/build/server/chunks/entries/endpoints/api/imports/{_server.ts.js-CE29dwBF.js.map → _server.ts.js-CL_89klb.js.map} +1 -1
  102. package/build/server/chunks/entries/endpoints/api/manifests/_name_/{_server.ts.js-CU3gpNeg.js → _server.ts.js-DZUKtjz9.js} +4 -4
  103. package/build/server/chunks/entries/endpoints/api/manifests/_name_/{_server.ts.js-CU3gpNeg.js.map → _server.ts.js-DZUKtjz9.js.map} +1 -1
  104. package/build/server/chunks/entries/endpoints/api/manifests/{_server.ts.js-BhJDoTAq.js → _server.ts.js-Dz25LG_P.js} +4 -4
  105. package/build/server/chunks/entries/endpoints/api/manifests/{_server.ts.js-BhJDoTAq.js.map → _server.ts.js-Dz25LG_P.js.map} +1 -1
  106. package/build/server/chunks/entries/endpoints/api/raw/adopt/{_server.ts.js-B72NkhD1.js → _server.ts.js-C-NuN3JJ.js} +4 -4
  107. package/build/server/chunks/entries/endpoints/api/raw/adopt/{_server.ts.js-B72NkhD1.js.map → _server.ts.js-C-NuN3JJ.js.map} +1 -1
  108. package/build/server/chunks/entries/endpoints/api/raw/edited/accept/{_server.ts.js-CWK5em43.js → _server.ts.js-CwL9UPh3.js} +4 -4
  109. package/build/server/chunks/entries/endpoints/api/raw/edited/accept/{_server.ts.js-CWK5em43.js.map → _server.ts.js-CwL9UPh3.js.map} +1 -1
  110. package/build/server/chunks/entries/endpoints/api/raw/edited/dismiss/{_server.ts.js-BBxmYiE6.js → _server.ts.js-DanXYrj1.js} +4 -4
  111. package/build/server/chunks/entries/endpoints/api/raw/edited/dismiss/{_server.ts.js-BBxmYiE6.js.map → _server.ts.js-DanXYrj1.js.map} +1 -1
  112. package/build/server/chunks/entries/endpoints/api/reconcile/{_server.ts.js-DR4xHt0w.js → _server.ts.js-BZrun0up.js} +4 -4
  113. package/build/server/chunks/entries/endpoints/api/reconcile/{_server.ts.js-DR4xHt0w.js.map → _server.ts.js-BZrun0up.js.map} +1 -1
  114. package/build/server/chunks/entries/endpoints/api/reveal/{_server.ts.js-CfiypExu.js → _server.ts.js-DQOabHbS.js} +4 -4
  115. package/build/server/chunks/entries/endpoints/api/reveal/{_server.ts.js-CfiypExu.js.map → _server.ts.js-DQOabHbS.js.map} +1 -1
  116. package/build/server/chunks/entries/endpoints/api/state/{_server.ts.js-DjmTUX8d.js → _server.ts.js-k8Ueydx1.js} +4 -4
  117. package/build/server/chunks/entries/endpoints/api/state/{_server.ts.js-DjmTUX8d.js.map → _server.ts.js-k8Ueydx1.js.map} +1 -1
  118. package/build/server/chunks/entries/endpoints/api/usage/_server.ts.js-DmMmiFiu.js +82 -0
  119. package/build/server/chunks/entries/endpoints/api/usage/_server.ts.js-DmMmiFiu.js.map +1 -0
  120. package/build/server/chunks/entries/endpoints/files/_...path_/{_server.ts.js-qfzdfNHQ.js → _server.ts.js-CT7yOdDS.js} +3 -3
  121. package/build/server/chunks/entries/endpoints/files/_...path_/{_server.ts.js-qfzdfNHQ.js.map → _server.ts.js-CT7yOdDS.js.map} +1 -1
  122. package/build/server/chunks/entries/endpoints/files/proxy/_...path_/{_server.ts.js-CS_5SEL-.js → _server.ts.js-BQTC0OSC.js} +4 -4
  123. package/build/server/chunks/entries/endpoints/files/proxy/_...path_/{_server.ts.js-CS_5SEL-.js.map → _server.ts.js-BQTC0OSC.js.map} +1 -1
  124. package/build/server/chunks/entries/endpoints/files/raw/_...path_/{_server.ts.js-Cv-y3Nqu.js → _server.ts.js-mv9cqSuS.js} +4 -4
  125. package/build/server/chunks/entries/endpoints/files/raw/_...path_/{_server.ts.js-Cv-y3Nqu.js.map → _server.ts.js-mv9cqSuS.js.map} +1 -1
  126. package/build/server/chunks/entries/{hooks.server.js-WOShZElI.js → hooks.server.js-BNQO3cZr.js} +3 -3
  127. package/build/server/chunks/entries/{hooks.server.js-WOShZElI.js.map → hooks.server.js-BNQO3cZr.js.map} +1 -1
  128. package/build/server/chunks/{handler-CIOnH690.js → handler-DQdjBhko.js} +5 -5
  129. package/build/server/chunks/{handler-CIOnH690.js.map → handler-DQdjBhko.js.map} +1 -1
  130. package/build/server/chunks/{index.js-nSuivP3M.js → index.js-DtKY5QD2.js} +5 -5
  131. package/build/server/chunks/{index.js-nSuivP3M.js.map → index.js-DtKY5QD2.js.map} +1 -1
  132. package/build/server/chunks/{manifest.js-CIFnCWGv.js → manifest.js-CJMiboeI.js} +35 -28
  133. package/build/server/chunks/manifest.js-CJMiboeI.js.map +1 -0
  134. package/build/server/chunks/nodes/{0.js-BSbmgTIm.js → 0.js-Ce__dNtc.js} +2 -2
  135. package/build/server/chunks/nodes/{0.js-BSbmgTIm.js.map → 0.js-Ce__dNtc.js.map} +1 -1
  136. package/build/server/chunks/nodes/1.js-BIwe5V8L.js +7 -0
  137. package/build/server/chunks/nodes/{1.js-kvz4iUXK.js.map → 1.js-BIwe5V8L.js.map} +1 -1
  138. package/build/server/chunks/nodes/2.js-Bj7c0eH1.js +7 -0
  139. package/build/server/chunks/nodes/{2.js-B9ILHJtB.js.map → 2.js-Bj7c0eH1.js.map} +1 -1
  140. package/build/server/chunks/nodes/3.js-BMOf9FTK.js +7 -0
  141. package/build/server/chunks/nodes/3.js-BMOf9FTK.js.map +1 -0
  142. package/build/server/chunks/nodes/4.js-CNLb7Xc5.js +7 -0
  143. package/build/server/chunks/nodes/4.js-CNLb7Xc5.js.map +1 -0
  144. package/dist/cli.js +6 -1
  145. package/dist/config.d.ts +1 -1
  146. package/dist/core/api-types.d.ts +36 -1
  147. package/dist/core/config.d.ts +35 -0
  148. package/dist/core/index.d.ts +2 -2
  149. package/dist/runtime/chroma-key-video-lifecycle.d.ts +2 -2
  150. package/dist/runtime/chroma-key-video-lifecycle.js +221 -124
  151. package/dist/runtime/components/ChromaKeyVideo.svelte +13 -2
  152. package/dist/runtime/components/Slice.svelte +22 -12
  153. package/dist/runtime/components/Slice.svelte.d.ts +3 -6
  154. package/dist/runtime/components/SliceCanvas.svelte +51 -40
  155. package/dist/runtime/components/SliceCanvas.svelte.d.ts +2 -2
  156. package/dist/runtime/components/SliceDom.svelte +96 -42
  157. package/dist/runtime/components/SliceDom.svelte.d.ts +2 -2
  158. package/dist/runtime/slice-source-lifecycle.d.ts +14 -0
  159. package/dist/runtime/slice-source-lifecycle.js +70 -0
  160. package/dist/server/check.d.ts +6 -0
  161. package/dist/server/check.js +4 -1
  162. package/dist/server/cli-commands.d.ts +3 -1
  163. package/dist/server/cli-commands.js +117 -2
  164. package/dist/server/codegen.d.ts +3 -0
  165. package/dist/server/codegen.js +19 -2
  166. package/dist/server/config-loader.d.ts +3 -1
  167. package/dist/server/config-loader.js +13 -1
  168. package/dist/server/index.d.ts +2 -2
  169. package/dist/server/index.js +1 -1
  170. package/dist/server/operations.d.ts +7 -1
  171. package/dist/server/operations.js +85 -2
  172. package/dist/server/start.d.ts +8 -0
  173. package/dist/server/start.js +24 -0
  174. package/dist/server/usage.d.ts +24 -0
  175. package/dist/server/usage.js +441 -0
  176. package/package.json +4 -1
  177. package/build/client/_app/immutable/assets/3.CmXD8k9d.css +0 -1
  178. package/build/client/_app/immutable/assets/3.CmXD8k9d.css.br +0 -0
  179. package/build/client/_app/immutable/assets/3.CmXD8k9d.css.gz +0 -0
  180. package/build/client/_app/immutable/assets/4.p004hmEN.css +0 -1
  181. package/build/client/_app/immutable/assets/4.p004hmEN.css.br +0 -0
  182. package/build/client/_app/immutable/assets/4.p004hmEN.css.gz +0 -0
  183. package/build/client/_app/immutable/assets/LibraryContextMenu.BSnKt_Is.css +0 -1
  184. package/build/client/_app/immutable/assets/LibraryContextMenu.BSnKt_Is.css.br +0 -0
  185. package/build/client/_app/immutable/assets/LibraryContextMenu.BSnKt_Is.css.gz +0 -0
  186. package/build/client/_app/immutable/chunks/BD3hQKzV.js +0 -1
  187. package/build/client/_app/immutable/chunks/BD3hQKzV.js.br +0 -0
  188. package/build/client/_app/immutable/chunks/BD3hQKzV.js.gz +0 -0
  189. package/build/client/_app/immutable/chunks/C3HGm51f.js +0 -1
  190. package/build/client/_app/immutable/chunks/C3HGm51f.js.br +0 -0
  191. package/build/client/_app/immutable/chunks/C3HGm51f.js.gz +0 -0
  192. package/build/client/_app/immutable/chunks/C7OUKWnm.js +0 -1
  193. package/build/client/_app/immutable/chunks/C7OUKWnm.js.br +0 -0
  194. package/build/client/_app/immutable/chunks/C7OUKWnm.js.gz +0 -0
  195. package/build/client/_app/immutable/chunks/CaKQ_luf.js +0 -1
  196. package/build/client/_app/immutable/chunks/CaKQ_luf.js.br +0 -0
  197. package/build/client/_app/immutable/chunks/CaKQ_luf.js.gz +0 -0
  198. package/build/client/_app/immutable/chunks/CliRE4wo.js.br +0 -1
  199. package/build/client/_app/immutable/chunks/CliRE4wo.js.gz +0 -0
  200. package/build/client/_app/immutable/chunks/DPZDGjcn.js +0 -1
  201. package/build/client/_app/immutable/chunks/DPZDGjcn.js.br +0 -0
  202. package/build/client/_app/immutable/chunks/DPZDGjcn.js.gz +0 -0
  203. package/build/client/_app/immutable/chunks/JSnjcoVL.js +0 -108
  204. package/build/client/_app/immutable/chunks/JSnjcoVL.js.br +0 -0
  205. package/build/client/_app/immutable/chunks/JSnjcoVL.js.gz +0 -0
  206. package/build/client/_app/immutable/chunks/NblqapDQ.js +0 -3
  207. package/build/client/_app/immutable/chunks/NblqapDQ.js.br +0 -0
  208. package/build/client/_app/immutable/chunks/NblqapDQ.js.gz +0 -0
  209. package/build/client/_app/immutable/entry/app.p0Th9Q3c.js +0 -2
  210. package/build/client/_app/immutable/entry/app.p0Th9Q3c.js.br +0 -0
  211. package/build/client/_app/immutable/entry/app.p0Th9Q3c.js.gz +0 -0
  212. package/build/client/_app/immutable/entry/start.p06L3A6u.js +0 -1
  213. package/build/client/_app/immutable/entry/start.p06L3A6u.js.br +0 -0
  214. package/build/client/_app/immutable/entry/start.p06L3A6u.js.gz +0 -0
  215. package/build/client/_app/immutable/nodes/0.D2yDRY2E.js +0 -2
  216. package/build/client/_app/immutable/nodes/0.D2yDRY2E.js.br +0 -0
  217. package/build/client/_app/immutable/nodes/0.D2yDRY2E.js.gz +0 -0
  218. package/build/client/_app/immutable/nodes/1.nLMgahSZ.js +0 -1
  219. package/build/client/_app/immutable/nodes/1.nLMgahSZ.js.br +0 -3
  220. package/build/client/_app/immutable/nodes/1.nLMgahSZ.js.gz +0 -0
  221. package/build/client/_app/immutable/nodes/2.Cr-DsqQM.js +0 -3
  222. package/build/client/_app/immutable/nodes/2.Cr-DsqQM.js.br +0 -0
  223. package/build/client/_app/immutable/nodes/2.Cr-DsqQM.js.gz +0 -0
  224. package/build/client/_app/immutable/nodes/3.CmsMY1VJ.js +0 -1
  225. package/build/client/_app/immutable/nodes/3.CmsMY1VJ.js.br +0 -0
  226. package/build/client/_app/immutable/nodes/3.CmsMY1VJ.js.gz +0 -0
  227. package/build/client/_app/immutable/nodes/4.CeeDVfsm.js +0 -2
  228. package/build/client/_app/immutable/nodes/4.CeeDVfsm.js.br +0 -0
  229. package/build/client/_app/immutable/nodes/4.CeeDVfsm.js.gz +0 -0
  230. package/build/server/chunks/chunks/context.js-Cg-Pih8x.js.map +0 -1
  231. package/build/server/chunks/chunks/contract.js-C6yL03Hj.js.map +0 -1
  232. package/build/server/chunks/manifest.js-CIFnCWGv.js.map +0 -1
  233. package/build/server/chunks/nodes/1.js-kvz4iUXK.js +0 -7
  234. package/build/server/chunks/nodes/2.js-B9ILHJtB.js +0 -7
  235. package/build/server/chunks/nodes/3.js-YAjQeV5C.js +0 -7
  236. package/build/server/chunks/nodes/3.js-YAjQeV5C.js.map +0 -1
  237. package/build/server/chunks/nodes/4.js-7My4KJNM.js +0 -7
  238. package/build/server/chunks/nodes/4.js-7My4KJNM.js.map +0 -1
@@ -0,0 +1,441 @@
1
+ import { createHash, createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
2
+ import { isAbsolute } from 'node:path';
3
+ import { compareCodeUnits } from '../core/index.js';
4
+ const MAX_PATHS = 20;
5
+ const TOKEN_TTL_MS = 10 * 60 * 1000;
6
+ function locationKey(location) {
7
+ return `${location.file}\u0000${location.line}\u0000${location.column}`;
8
+ }
9
+ function compareLocations(left, right) {
10
+ return (compareCodeUnits(left.file, right.file) ||
11
+ left.line - right.line ||
12
+ left.column - right.column ||
13
+ compareCodeUnits(left.label ?? '', right.label ?? ''));
14
+ }
15
+ function validateLocation(value, context, allowLabel) {
16
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
17
+ throw new Error(`${context} must be an object.`);
18
+ }
19
+ const record = value;
20
+ if (typeof record.file !== 'string' || record.file.length === 0 || !isAbsolute(record.file)) {
21
+ throw new Error(`${context}.file must be an absolute path.`);
22
+ }
23
+ for (const key of ['line', 'column']) {
24
+ if (!Number.isSafeInteger(record[key]) || record[key] <= 0) {
25
+ throw new Error(`${context}.${key} must be a positive safe integer.`);
26
+ }
27
+ }
28
+ if (allowLabel && record.label !== undefined && typeof record.label !== 'string') {
29
+ throw new Error(`${context}.label must be a string.`);
30
+ }
31
+ return {
32
+ file: record.file,
33
+ line: record.line,
34
+ column: record.column,
35
+ ...(allowLabel && typeof record.label === 'string' ? { label: record.label } : {})
36
+ };
37
+ }
38
+ function normalizeResult(value, target) {
39
+ const context = `fundus.config: usage.referenceProvider for ${target.manifest}.${target.assetId}`;
40
+ try {
41
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
42
+ throw new Error(`${context} must return an object.`);
43
+ }
44
+ const result = value;
45
+ if (result.status === 'unknown') {
46
+ if (result.reason !== undefined && typeof result.reason !== 'string') {
47
+ throw new Error(`${context} unknown reason must be a string.`);
48
+ }
49
+ return {
50
+ status: 'unknown',
51
+ ...(typeof result.reason === 'string' ? { reason: result.reason } : {})
52
+ };
53
+ }
54
+ if (result.status !== 'resolved' || !Array.isArray(result.references)) {
55
+ throw new Error(`${context} must return resolved references or unknown.`);
56
+ }
57
+ const declarationKey = locationKey(target.declaration);
58
+ const references = result.references
59
+ .map((reference, index) => validateLocation(reference, `${context} references[${index}]`, true))
60
+ .filter((reference) => locationKey(reference) !== declarationKey)
61
+ .sort(compareLocations);
62
+ const deduplicated = [];
63
+ const seen = new Set();
64
+ for (const reference of references) {
65
+ const key = locationKey(reference);
66
+ if (seen.has(key))
67
+ continue;
68
+ seen.add(key);
69
+ deduplicated.push(reference);
70
+ }
71
+ return { status: 'resolved', references: deduplicated };
72
+ }
73
+ catch (cause) {
74
+ return { status: 'unknown', reason: cause instanceof Error ? cause.message : String(cause) };
75
+ }
76
+ }
77
+ class FifoLimiter {
78
+ #active = 0;
79
+ #queue = [];
80
+ async run(operation) {
81
+ if (this.#active >= 4)
82
+ await new Promise((resolve) => this.#queue.push(resolve));
83
+ this.#active++;
84
+ try {
85
+ return await operation();
86
+ }
87
+ finally {
88
+ this.#active--;
89
+ this.#queue.shift()?.();
90
+ }
91
+ }
92
+ }
93
+ export class FundusUsageAnalyzer {
94
+ #usage;
95
+ #secret = randomBytes(32);
96
+ #limiter = new FifoLimiter();
97
+ #inflight = new Map();
98
+ #freshGeneration = 0;
99
+ constructor(usage) {
100
+ this.#usage = usage;
101
+ }
102
+ async analyze(snapshot, options = {}) {
103
+ if (options.assetId && !Object.hasOwn(snapshot.library.assets, options.assetId)) {
104
+ throw new Error(`Unknown asset "${options.assetId}".`);
105
+ }
106
+ const rootsToAnalyze = options.assetId
107
+ ? relevantRootsForAsset(snapshot, options.assetId)
108
+ : snapshot.roots;
109
+ const freshKey = options.forceFresh ? `fresh:${++this.#freshGeneration}` : 'normal';
110
+ const rootResults = new Map();
111
+ await Promise.all(rootsToAnalyze.map(async (root) => {
112
+ const key = rootKey(root);
113
+ if (!root.declaration) {
114
+ rootResults.set(key, {
115
+ status: 'unknown',
116
+ reason: root.declarationError ??
117
+ `Cannot locate generated declaration for ${root.manifest}.${root.assetId}.`
118
+ });
119
+ return;
120
+ }
121
+ const target = {
122
+ assetId: root.assetId,
123
+ manifest: root.manifest,
124
+ declaration: root.declaration
125
+ };
126
+ const inflightKey = `${snapshot.revision}|${locationKey(root.declaration)}|${freshKey}`;
127
+ let run = !options.forceFresh ? this.#inflight.get(inflightKey) : undefined;
128
+ if (!run) {
129
+ run = this.#limiter.run(async () => {
130
+ try {
131
+ return normalizeResult(await this.#usage.referenceProvider(target), target);
132
+ }
133
+ catch (cause) {
134
+ return {
135
+ status: 'unknown',
136
+ reason: `usage.referenceProvider failed for ${root.manifest}.${root.assetId}: ${cause instanceof Error ? cause.message : String(cause)}`
137
+ };
138
+ }
139
+ });
140
+ if (!options.forceFresh) {
141
+ this.#inflight.set(inflightKey, run);
142
+ void run.finally(() => this.#inflight.delete(inflightKey));
143
+ }
144
+ }
145
+ rootResults.set(key, await run);
146
+ }));
147
+ return this.#assemble(snapshot, rootResults, options.assetId);
148
+ }
149
+ stale(snapshot, assetId) {
150
+ const results = new Map();
151
+ for (const root of assetId ? relevantRootsForAsset(snapshot, assetId) : snapshot.roots) {
152
+ results.set(rootKey(root), {
153
+ status: 'unknown',
154
+ reason: 'The Fundus project changed repeatedly during usage analysis; refresh to retry.'
155
+ });
156
+ }
157
+ return this.#assemble(snapshot, results, assetId);
158
+ }
159
+ async open(token) {
160
+ if (typeof token !== 'string' || token.length === 0) {
161
+ throw new Error('Usage location token must be a non-empty string.');
162
+ }
163
+ const [encoded, signature, extra] = token.split('.');
164
+ if (!encoded || !signature || extra !== undefined)
165
+ throw new Error('Invalid usage location token.');
166
+ const expected = createHmac('sha256', this.#secret).update(encoded).digest();
167
+ let received;
168
+ try {
169
+ received = Buffer.from(signature, 'base64url');
170
+ }
171
+ catch {
172
+ throw new Error('Invalid usage location token.');
173
+ }
174
+ if (received.length !== expected.length || !timingSafeEqual(received, expected)) {
175
+ throw new Error('Invalid usage location token; refresh usage and try again.');
176
+ }
177
+ let payload;
178
+ try {
179
+ payload = JSON.parse(Buffer.from(encoded, 'base64url').toString('utf8'));
180
+ }
181
+ catch {
182
+ throw new Error('Invalid usage location token.');
183
+ }
184
+ if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) {
185
+ throw new Error('Invalid usage location token.');
186
+ }
187
+ const record = payload;
188
+ if (record.v !== 1 || typeof record.expiresAt !== 'number' || Date.now() > record.expiresAt) {
189
+ throw new Error('Usage location token expired; refresh usage and try again.');
190
+ }
191
+ const location = validateLocation(record.location, 'Usage location token', false);
192
+ const normalized = { file: location.file, line: location.line, column: location.column };
193
+ try {
194
+ await this.#usage.openLocation(normalized);
195
+ }
196
+ catch (cause) {
197
+ throw new Error(`Could not open ${normalized.file}:${normalized.line}:${normalized.column}: ${cause instanceof Error ? cause.message : String(cause)}`);
198
+ }
199
+ }
200
+ #token(location) {
201
+ const encoded = Buffer.from(JSON.stringify({ v: 1, expiresAt: Date.now() + TOKEN_TTL_MS, location })).toString('base64url');
202
+ const signature = createHmac('sha256', this.#secret).update(encoded).digest('base64url');
203
+ return `${encoded}.${signature}`;
204
+ }
205
+ #assemble(snapshot, rootResults, requestedAssetId) {
206
+ const assetIds = requestedAssetId
207
+ ? [requestedAssetId]
208
+ : Object.keys(snapshot.library.assets).sort(compareCodeUnits);
209
+ const analyzedRoots = snapshot.roots.filter((root) => rootResults.has(rootKey(root)));
210
+ const cyclicNodes = referenceCycleNodes(snapshot.referencesByAsset);
211
+ const cycleAncestors = reverseClosure(cyclicNodes, snapshot.referencesByAsset);
212
+ const adjustedResults = new Map();
213
+ for (const root of analyzedRoots) {
214
+ const result = rootResults.get(rootKey(root));
215
+ adjustedResults.set(rootKey(root), cycleAncestors.has(root.assetId) &&
216
+ result.status === 'resolved' &&
217
+ result.references.length === 0
218
+ ? {
219
+ status: 'unknown',
220
+ reason: 'A reference cycle prevents complete usage analysis for this root.'
221
+ }
222
+ : result);
223
+ }
224
+ const usedAssets = referenceClosureFromSources(analyzedRoots
225
+ .filter((root) => {
226
+ const result = adjustedResults.get(rootKey(root));
227
+ return result?.status === 'resolved' && result.references.length > 0;
228
+ })
229
+ .map((root) => root.assetId), snapshot.referencesByAsset);
230
+ const unknownAssets = referenceClosureFromSources(analyzedRoots
231
+ .filter((root) => adjustedResults.get(rootKey(root))?.status === 'unknown')
232
+ .map((root) => root.assetId), snapshot.referencesByAsset);
233
+ const assets = assetIds.map((assetId) => {
234
+ const status = usedAssets.has(assetId)
235
+ ? 'used'
236
+ : unknownAssets.has(assetId)
237
+ ? 'unknown'
238
+ : 'unused';
239
+ if (!requestedAssetId) {
240
+ return { assetId, status, references: [], roots: [] };
241
+ }
242
+ const groups = [];
243
+ const pathCountMemo = new Map();
244
+ for (const root of analyzedRoots) {
245
+ const paths = pathsFromRoot(root.assetId, assetId, snapshot.referencesByAsset, pathCountMemo, cyclicNodes);
246
+ if (paths.count > 0n)
247
+ groups.push({ root, paths: paths.paths, count: paths.count });
248
+ }
249
+ const allReferences = [];
250
+ for (const group of groups) {
251
+ const result = adjustedResults.get(rootKey(group.root));
252
+ if (result?.status === 'resolved')
253
+ allReferences.push(...result.references);
254
+ }
255
+ allReferences.sort(compareLocations);
256
+ const uniqueReferences = [];
257
+ const referenceIdByKey = new Map();
258
+ for (const reference of allReferences) {
259
+ const key = locationKey(reference);
260
+ if (referenceIdByKey.has(key))
261
+ continue;
262
+ const id = `r${uniqueReferences.length}`;
263
+ referenceIdByKey.set(key, id);
264
+ uniqueReferences.push(reference);
265
+ }
266
+ const roots = groups.map(({ root, paths, count }) => {
267
+ const result = adjustedResults.get(rootKey(root)) ?? {
268
+ status: 'unknown',
269
+ reason: 'Usage analysis result is missing.'
270
+ };
271
+ const dtoResult = result.status === 'unknown'
272
+ ? result
273
+ : {
274
+ status: 'resolved',
275
+ referenceIds: result.references
276
+ .map((reference) => referenceIdByKey.get(locationKey(reference)))
277
+ .filter((id) => id !== undefined)
278
+ };
279
+ return {
280
+ manifest: root.manifest,
281
+ rootAssetId: root.assetId,
282
+ paths,
283
+ pathsTruncated: count > BigInt(paths.length),
284
+ ...(count > BigInt(paths.length)
285
+ ? { additionalPathCount: (count - BigInt(paths.length)).toString() }
286
+ : {}),
287
+ declaration: root.declaration,
288
+ result: dtoResult
289
+ };
290
+ });
291
+ return {
292
+ assetId,
293
+ status,
294
+ references: uniqueReferences.map((reference, index) => ({
295
+ ...reference,
296
+ id: `r${index}`,
297
+ openToken: this.#token(reference)
298
+ })),
299
+ roots
300
+ };
301
+ });
302
+ return { assets };
303
+ }
304
+ }
305
+ function rootKey(root) {
306
+ return `${root.manifest}\u0000${root.assetId}`;
307
+ }
308
+ function relevantRootsForAsset(snapshot, assetId) {
309
+ const ancestors = reverseClosure(new Set([assetId]), snapshot.referencesByAsset);
310
+ return snapshot.roots.filter((root) => ancestors.has(root.assetId));
311
+ }
312
+ function reverseClosure(sources, referencesByAsset) {
313
+ const incoming = new Map();
314
+ for (const [source, references] of Object.entries(referencesByAsset)) {
315
+ for (const target of new Set(references.map((reference) => reference.assetId))) {
316
+ const sources = incoming.get(target);
317
+ if (sources)
318
+ sources.push(source);
319
+ else
320
+ incoming.set(target, [source]);
321
+ }
322
+ }
323
+ const closure = new Set();
324
+ const pending = [...sources];
325
+ while (pending.length > 0) {
326
+ const current = pending.pop();
327
+ if (closure.has(current))
328
+ continue;
329
+ closure.add(current);
330
+ pending.push(...(incoming.get(current) ?? []));
331
+ }
332
+ return closure;
333
+ }
334
+ function referenceClosureFromSources(sources, referencesByAsset) {
335
+ const closure = new Set();
336
+ const pending = [...sources];
337
+ while (pending.length > 0) {
338
+ const current = pending.pop();
339
+ if (closure.has(current) || !Object.hasOwn(referencesByAsset, current))
340
+ continue;
341
+ closure.add(current);
342
+ for (const reference of referencesByAsset[current])
343
+ pending.push(reference.assetId);
344
+ }
345
+ return closure;
346
+ }
347
+ /** Tarjan SCC detection; singleton components count only when they self-reference. */
348
+ function referenceCycleNodes(referencesByAsset) {
349
+ let nextIndex = 0;
350
+ const indexByNode = new Map();
351
+ const lowLink = new Map();
352
+ const stack = [];
353
+ const onStack = new Set();
354
+ const cyclic = new Set();
355
+ const visit = (node) => {
356
+ indexByNode.set(node, nextIndex);
357
+ lowLink.set(node, nextIndex++);
358
+ stack.push(node);
359
+ onStack.add(node);
360
+ for (const target of new Set((referencesByAsset[node] ?? []).map((ref) => ref.assetId))) {
361
+ if (!Object.hasOwn(referencesByAsset, target))
362
+ continue;
363
+ if (!indexByNode.has(target)) {
364
+ visit(target);
365
+ lowLink.set(node, Math.min(lowLink.get(node), lowLink.get(target)));
366
+ }
367
+ else if (onStack.has(target)) {
368
+ lowLink.set(node, Math.min(lowLink.get(node), indexByNode.get(target)));
369
+ }
370
+ }
371
+ if (lowLink.get(node) !== indexByNode.get(node))
372
+ return;
373
+ const component = [];
374
+ for (;;) {
375
+ const member = stack.pop();
376
+ onStack.delete(member);
377
+ component.push(member);
378
+ if (member === node)
379
+ break;
380
+ }
381
+ if (component.length > 1 ||
382
+ (referencesByAsset[node] ?? []).some((reference) => reference.assetId === node)) {
383
+ for (const member of component)
384
+ cyclic.add(member);
385
+ }
386
+ };
387
+ for (const node of Object.keys(referencesByAsset)) {
388
+ if (!indexByNode.has(node))
389
+ visit(node);
390
+ }
391
+ return cyclic;
392
+ }
393
+ function pathsFromRoot(root, target, referencesByAsset, countMemo = new Map(), cyclicNodes = referenceCycleNodes(referencesByAsset)) {
394
+ const count = (assetId, visiting) => {
395
+ if (assetId === target)
396
+ return 1n;
397
+ const visitedCyclicNodes = [...visiting]
398
+ .filter((id) => cyclicNodes.has(id))
399
+ .sort(compareCodeUnits);
400
+ const memoKey = JSON.stringify([assetId, visitedCyclicNodes]);
401
+ const cached = countMemo.get(memoKey);
402
+ if (cached !== undefined)
403
+ return cached;
404
+ if (visiting.has(assetId)) {
405
+ return 0n;
406
+ }
407
+ const nextVisiting = new Set(visiting).add(assetId);
408
+ let total = 0n;
409
+ const nextIds = [...new Set((referencesByAsset[assetId] ?? []).map((ref) => ref.assetId))].sort(compareCodeUnits);
410
+ for (const next of nextIds)
411
+ total += count(next, nextVisiting);
412
+ countMemo.set(memoKey, total);
413
+ return total;
414
+ };
415
+ const total = count(root, new Set());
416
+ const paths = [];
417
+ const collect = (assetId, path, visiting) => {
418
+ if (paths.length >= MAX_PATHS)
419
+ return;
420
+ if (assetId === target) {
421
+ paths.push(path);
422
+ return;
423
+ }
424
+ if (visiting.has(assetId))
425
+ return;
426
+ const nextVisiting = new Set(visiting).add(assetId);
427
+ const nextIds = [...new Set((referencesByAsset[assetId] ?? []).map((ref) => ref.assetId))].sort(compareCodeUnits);
428
+ for (const next of nextIds) {
429
+ if (count(next, nextVisiting) > 0n)
430
+ collect(next, [...path, next], nextVisiting);
431
+ if (paths.length >= MAX_PATHS)
432
+ break;
433
+ }
434
+ };
435
+ if (total > 0n)
436
+ collect(root, [root], new Set());
437
+ return { paths, count: total };
438
+ }
439
+ export function usageSnapshotRevision(parts) {
440
+ return createHash('sha256').update(parts.join('\u0000')).digest('hex');
441
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fundus",
3
- "version": "0.10.0",
3
+ "version": "0.11.1",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -67,7 +67,10 @@
67
67
  "@sveltejs/vite-plugin-svelte": "^7.1.2",
68
68
  "@types/ffprobe-static": "^2.0.3",
69
69
  "@types/node": "^24.13.3",
70
+ "@vitest/browser": "^3.2.7",
70
71
  "fuse.js": "^7.4.2",
72
+ "happy-dom": "^20.11.0",
73
+ "playwright": "^1.61.1",
71
74
  "prettier": "^3.8.3",
72
75
  "prettier-plugin-svelte": "^4.1.0",
73
76
  "publint": "^0.3.21",
@@ -1 +0,0 @@
1
- .detail.svelte-xy8zsr{flex:1;grid-template-columns:224px 1fr 280px;min-height:0;display:grid}.center.svelte-xy8zsr{flex-direction:column;min-width:0;min-height:0;padding:12px 16px;display:flex}.center.empty.svelte-xy8zsr,.empty.svelte-xy8zsr{color:var(--text-dim);flex:1;justify-content:center;align-items:center;display:flex}.inspector.svelte-xy8zsr{background:var(--panel);border-left:1px solid var(--border);overflow-y:auto}.inspector.svelte-xy8zsr section:where(.svelte-xy8zsr){border-bottom:1px solid var(--border-soft);padding:12px}.inspector.svelte-xy8zsr h2:where(.svelte-xy8zsr){word-break:break-all;margin:0;font-size:13px}.raw.svelte-xy8zsr{color:var(--text-dim);word-break:break-all;margin:4px 0 0}.warning.svelte-xy8zsr{color:var(--warning);margin:8px 0 0;font-size:11px}.hint.svelte-xy8zsr{color:var(--text-faint);margin:0;font-size:11px}.inspector.svelte-xy8zsr h4:where(.svelte-xy8zsr){text-transform:uppercase;letter-spacing:.06em;color:var(--text-faint);margin:8px 0 4px;font-size:10px}.reference-row.svelte-xy8zsr{border-radius:var(--radius);color:var(--text-dim);align-items:center;gap:6px;min-width:0;padding:3px 4px;display:flex}.reference-row.svelte-xy8zsr:hover{background:var(--panel-raised);color:var(--text)}.reference-field.svelte-xy8zsr{color:var(--text-faint);font-size:11px}.reference-arrow.svelte-xy8zsr{color:var(--text-faint);flex:none}.reference-asset.svelte-xy8zsr{color:var(--accent);text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.rename.svelte-xy8zsr{gap:8px;margin-bottom:8px;display:flex}.replace-raw.svelte-xy8zsr{width:100%;margin-bottom:8px}.source-label.svelte-xy8zsr{margin-bottom:8px}.source-field.svelte-xy8zsr{color:var(--text-dim);flex-direction:column;gap:4px;margin-bottom:8px;font-size:11px;display:flex}.source-field.svelte-xy8zsr .control:where(.svelte-xy8zsr){width:100%}.source-actions.svelte-xy8zsr{flex-direction:column;gap:6px;display:flex}.source-actions.svelte-xy8zsr .control:where(.svelte-xy8zsr){text-align:center;width:100%}.rename.svelte-xy8zsr input:where(.svelte-xy8zsr){flex:1;min-width:0}.danger.svelte-xy8zsr{width:100%}
@@ -1 +0,0 @@
1
- .popover-anchor.svelte-1rznwff{display:inline-flex;position:relative}.popover.svelte-1rznwff{z-index:10;background:var(--panel-raised);border:1px solid var(--border);border-radius:var(--radius);padding:8px;position:absolute;top:calc(100% + 6px);left:0;box-shadow:0 8px 24px #0006}.popover.right.svelte-1rznwff{left:auto;right:0}.controls.svelte-58t64l{align-items:center;gap:4px;display:inline-flex}.emoji-trigger.svelte-58t64l,.swatch-trigger.svelte-58t64l{border:1px solid var(--border);background:var(--panel-raised);cursor:pointer;justify-content:center;align-items:center;padding:0;display:inline-flex}.emoji-trigger.svelte-58t64l{border-radius:var(--radius-small);width:22px;height:22px;font-size:14px;line-height:1}.emoji-trigger.empty.svelte-58t64l{color:var(--text-faint)}.swatch-trigger.svelte-58t64l{background:var(--swatch);border-radius:50%;width:16px;height:16px}.swatch-trigger.empty.svelte-58t64l{background:0 0;position:relative}.swatch-trigger.empty.svelte-58t64l:after{content:"";background:var(--text-faint);height:1px;position:absolute;inset:50% 1px auto;transform:rotate(-45deg)}.emoji-trigger.active.svelte-58t64l,.swatch-trigger.active.svelte-58t64l{border-color:var(--accent)}.picker.svelte-58t64l{gap:4px;display:grid}.swatches.svelte-58t64l{grid-template-columns:repeat(7,18px)}.emojis.svelte-58t64l{grid-template-columns:repeat(8,24px)}.swatch.svelte-58t64l{border:1px solid var(--border);cursor:pointer;border-radius:50%;width:18px;height:18px;padding:0}.swatch.none.svelte-58t64l{background:0 0;position:relative}.swatch.none.svelte-58t64l:after{content:"";background:var(--text-faint);height:1px;position:absolute;inset:50% 1px auto;transform:rotate(-45deg)}.swatch.selected.svelte-58t64l{outline:2px solid var(--text);outline-offset:1px}.emoji.svelte-58t64l{border-radius:var(--radius-small);border:1px solid var(--border);background:var(--panel);cursor:pointer;width:24px;height:24px;padding:0;font-size:14px;line-height:1}.emoji.none.svelte-58t64l{color:var(--text-faint);font-size:12px}.emoji.selected.svelte-58t64l{border-color:var(--accent);background:var(--accent-soft)}.page.svelte-1k9wgg5{flex:1;min-height:0;padding:16px;overflow-y:auto}.create.svelte-1k9wgg5{align-items:center;gap:8px;margin-bottom:16px;display:flex}.create.svelte-1k9wgg5 input:where(.svelte-1k9wgg5){width:240px}.hint.svelte-1k9wgg5{color:var(--text-faint);font-size:11px}.empty.svelte-1k9wgg5{color:var(--text-dim);text-align:center;padding:48px}.list.svelte-1k9wgg5{flex-direction:column;gap:12px;max-width:640px;display:flex}.manifest.svelte-1k9wgg5{background:var(--panel);border:1px solid var(--manifest-color,var(--border-soft));border-radius:var(--radius-large);padding:12px}.manifest.svelte-1k9wgg5 header:where(.svelte-1k9wgg5){align-items:center;gap:12px;display:flex}.manifest.svelte-1k9wgg5 h2:where(.svelte-1k9wgg5){margin:0;font-size:13px}.size.svelte-1k9wgg5{color:var(--accent);font-variant-numeric:tabular-nums}.count.svelte-1k9wgg5{color:var(--text-dim);margin-left:auto}ul.svelte-1k9wgg5{margin:8px 0 0;padding:0;list-style:none}li.svelte-1k9wgg5 a:where(.svelte-1k9wgg5){border-radius:var(--radius);color:var(--text-dim);align-items:center;gap:12px;padding:4px 8px;display:flex}li.svelte-1k9wgg5 a:where(.svelte-1k9wgg5):hover{background:var(--panel-raised);color:var(--text)}.asset-id.svelte-1k9wgg5{color:var(--text);font-weight:600}.asset-type.svelte-1k9wgg5{border:1px solid var(--border);border-radius:4px;padding:0 5px;font-size:10px}.asset-size.svelte-1k9wgg5{font-variant-numeric:tabular-nums;margin-left:auto}.passive-member.svelte-1k9wgg5{margin-left:16px}.passive-member.svelte-1k9wgg5 a:where(.svelte-1k9wgg5),.passive-member.svelte-1k9wgg5 .asset-id:where(.svelte-1k9wgg5){color:var(--text-faint)}.passive-id.svelte-1k9wgg5{text-underline-offset:3px;font-weight:600;text-decoration-line:underline;text-decoration-style:dashed}.asset-via.svelte-1k9wgg5{color:var(--text-faint);font-size:11px}.dialog-text.svelte-1k9wgg5{color:var(--text-dim);margin:0 0 8px}.dialog-text.warn.svelte-1k9wgg5{color:var(--warning);font-size:11px}.dialog-row.svelte-1k9wgg5{align-items:center;gap:8px;margin-bottom:8px;display:flex}.dialog-label.svelte-1k9wgg5{color:var(--text-dim);flex:none}.dialog-row.svelte-1k9wgg5 input:where(.svelte-1k9wgg5){flex:1}
@@ -1 +0,0 @@
1
- .playback.svelte-nchstv{align-items:center;gap:6px;width:100%;display:flex}.btn.svelte-nchstv{background:var(--panel-raised);border-radius:var(--radius);width:28px;height:28px;color:var(--text);border:1px solid #0000;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.btn.svelte-nchstv:hover:not(:disabled){border-color:var(--border)}.btn.svelte-nchstv:focus-visible{border-color:var(--accent);outline:none}.btn.svelte-nchstv:disabled{opacity:.4;cursor:not-allowed}.btn.active.svelte-nchstv{background:var(--accent-soft);color:var(--accent)}.btn.svelte-nchstv svg:where(.svelte-nchstv){width:16px;height:16px;display:block}.time.svelte-nchstv{color:var(--text-dim);font-variant-numeric:tabular-nums;flex:none;font-size:11px}.volume-group.svelte-nchstv{align-items:center;gap:6px;margin-left:auto;display:inline-flex}.range.svelte-nchstv{appearance:none;background:var(--panel-raised);cursor:pointer;border-radius:999px;height:4px}.range.scrub.svelte-nchstv{flex:1;min-width:0;margin:0 2px}.range.volume.svelte-nchstv{flex:none;width:72px}.range.svelte-nchstv:disabled{opacity:.4;cursor:not-allowed}.range.svelte-nchstv::-webkit-slider-thumb{appearance:none;background:var(--accent);border:none;border-radius:50%;width:12px;height:12px}.range.svelte-nchstv::-moz-range-thumb{background:var(--accent);border:none;border-radius:50%;width:12px;height:12px}.range.svelte-nchstv:focus-visible{outline:none}.range.svelte-nchstv:focus-visible::-webkit-slider-thumb{box-shadow:0 0 0 3px var(--accent-soft)}.range.svelte-nchstv:focus-visible::-moz-range-thumb{box-shadow:0 0 0 3px var(--accent-soft)}.audio-waveform.svelte-1liihyn{flex-direction:column;gap:8px;width:100%;height:100%;min-height:0;display:flex}.wave.svelte-1liihyn{cursor:pointer;touch-action:none;flex:1;width:100%;min-height:0;display:block}.footer.svelte-1liihyn{flex:none;align-items:center;display:flex}.stage.svelte-1ww4cvx{border:1px solid var(--border);border-radius:8px;flex:1;justify-content:center;align-items:center;min-height:0;display:flex;overflow:auto}.audio-frame.svelte-1ww4cvx{width:min(90%,480px);height:128px}p.svelte-1ww4cvx{color:var(--text-dim)}.scrub-number.svelte-nhap92{flex:1;min-width:0;display:flex;position:relative}.input.svelte-nhap92{width:100%;min-width:0;color:var(--text);font-variant-numeric:tabular-nums;appearance:textfield;background:0 0;border:none;outline:none;flex:1;margin:0;padding:0;font-size:11px}.scrub-number.with-suffix.svelte-nhap92 .input:where(.svelte-nhap92){flex:none}.suffix.svelte-nhap92{color:var(--text-dim);font-variant-numeric:tabular-nums;-webkit-user-select:none;user-select:none;flex:none;margin-left:2px;font-size:11px}.scrub-number.right.svelte-nhap92 .input:where(.svelte-nhap92){text-align:right}.input.svelte-nhap92::-webkit-outer-spin-button{appearance:none;margin:0}.input.svelte-nhap92::-webkit-inner-spin-button{appearance:none;margin:0}.scrub-surface.svelte-nhap92{cursor:ew-resize;touch-action:none;position:absolute;inset:0}.number-field.svelte-368zap{flex-direction:column;gap:4px;min-width:0;display:flex}.caption.svelte-368zap{letter-spacing:.27px;color:#ffffffb2;-webkit-user-select:none;user-select:none;font-size:9px;font-weight:500;line-height:14px}.number-input.svelte-368zap{border-radius:4px;align-items:center;gap:4px;min-width:0;height:24px;padding:0 6px 0 0;display:flex;position:relative;overflow:hidden}.number-input.svelte-368zap:focus-within{border-color:var(--accent)}.fill.svelte-368zap{pointer-events:none;z-index:0;background:#4a4a4a;height:100%;position:absolute;top:0;left:0}.icon-slot.svelte-368zap{z-index:1;width:24px;height:24px;color:var(--text-dim);-webkit-user-select:none;user-select:none;flex:none;justify-content:center;align-items:center;font-size:11px;font-weight:500;display:flex;position:relative}.number-input.svelte-368zap .scrub-number{z-index:1}h3.svelte-1ol624f{letter-spacing:0;text-transform:none;color:#fff;margin:0 0 10px;font-size:11px;font-weight:400}.select-field.svelte-bczi6w{flex-direction:column;gap:4px;min-width:0;display:flex}.caption.svelte-bczi6w{letter-spacing:.27px;color:#ffffffb2;-webkit-user-select:none;user-select:none;font-size:9px;font-weight:500;line-height:14px}.select-input.svelte-bczi6w{border-radius:4px;align-items:center;gap:4px;min-width:0;height:24px;padding:0 6px 0 0;display:flex}.select-input.svelte-bczi6w:focus-within{border-color:var(--accent)}.icon-slot.svelte-bczi6w{width:24px;height:24px;color:var(--text-dim);-webkit-user-select:none;user-select:none;flex:none;justify-content:center;align-items:center;font-size:11px;font-weight:500;display:flex}select.svelte-bczi6w{width:100%;min-width:0;height:100%;color:var(--text);background:0 0;border:none;outline:none;flex:1;margin:0;padding:0;font-size:11px}section.svelte-m9vwwu{border-bottom:1px solid var(--border-soft);padding:12px}.hint.svelte-m9vwwu{color:var(--text-faint);margin:4px 0 0;font-size:11px}.info.svelte-m9vwwu{font-variant-numeric:tabular-nums;margin:0}.file.svelte-m9vwwu{color:var(--text-dim);word-break:break-all}section.svelte-1by8n8t{border-bottom:1px solid var(--border-soft);padding:12px}.field.svelte-1by8n8t{margin-bottom:8px}.fundus-slice.svelte-1820t2z{width:100%;height:100%;position:relative;overflow:hidden}.fundus-slice--overdraw.svelte-1820t2z{overflow:visible}.fundus-slice__cell.svelte-1820t2z{position:absolute;overflow:hidden}.fundus-slice__cell.svelte-1820t2z img:where(.svelte-1820t2z){pointer-events:none;-webkit-user-select:none;user-select:none;max-width:none;max-height:none;position:absolute}.fundus-slice-canvas.svelte-xdsbrz{width:100%;height:100%;position:relative}canvas.svelte-xdsbrz{pointer-events:none;display:block;position:absolute}.fundus-chroma-key-video.svelte-r30mxh{width:100%;height:100%;position:relative}canvas.svelte-r30mxh,img.svelte-r30mxh{width:100%;height:100%;display:block}video.svelte-r30mxh{visibility:hidden;pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.stage.svelte-10eps7e{border:1px solid var(--border);border-radius:8px;flex:1;justify-content:center;align-items:center;min-height:0;display:flex;overflow:auto}.stage.svelte-10eps7e img{object-fit:contain;max-width:90%;max-height:90%}img.svelte-gdduef{object-fit:contain;max-width:100%;max-height:100%}section.svelte-1yd7n22{border-bottom:1px solid var(--border-soft);padding:12px}.modes.svelte-1yd7n22{flex-direction:column;gap:4px;display:flex}.modes.svelte-1yd7n22 button:where(.svelte-1yd7n22){text-align:left;background:var(--panel-raised);color:var(--text);border-radius:var(--radius);border:1px solid #0000;padding:6px 10px}.modes.svelte-1yd7n22 button:where(.svelte-1yd7n22):hover{border-color:var(--border)}.modes.svelte-1yd7n22 button.on:where(.svelte-1yd7n22){background:var(--accent-soft);border-color:var(--accent);color:var(--accent);font-weight:600}.insets.svelte-1yd7n22{grid-template-columns:1fr 1fr;gap:8px;min-width:0;display:grid}.insets.single.svelte-1yd7n22{grid-template-columns:1fr}.preview-panel.svelte-1mjaycs{flex-direction:column;height:100%;min-height:0;display:flex}.bar.svelte-1mjaycs{flex:none;align-items:center;gap:10px;padding:8px 0;display:flex}.size.svelte-1mjaycs{color:var(--text-dim);font-variant-numeric:tabular-nums}.backends.svelte-1mjaycs{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);gap:2px;margin-left:auto;padding:2px;display:inline-flex}.backends.svelte-1mjaycs button:where(.svelte-1mjaycs){color:var(--text-dim);background:0 0;border:none;border-radius:4px;padding:2px 8px}.backends.svelte-1mjaycs button.on:where(.svelte-1mjaycs){background:var(--accent-soft);color:var(--accent);font-weight:600}.reset.svelte-1mjaycs{background:var(--panel-raised);border:1px solid var(--border);color:var(--text);border-radius:var(--radius);padding:4px 10px}.reset.svelte-1mjaycs:hover{border-color:var(--accent)}.stage.svelte-1mjaycs{border:1px solid var(--border);border-radius:var(--radius-large);flex:1;min-height:0;padding:24px;overflow:auto}.box.svelte-1mjaycs{position:relative;box-shadow:0 0 0 1px #ffffff1f}.box.svelte-1mjaycs .fill{position:absolute;inset:0}.handle.svelte-1mjaycs{touch-action:none;background:0 0;position:absolute}.handle.edge-right.svelte-1mjaycs{cursor:ew-resize;width:10px;height:100%;top:0;right:-4px}.handle.edge-bottom.svelte-1mjaycs{cursor:ns-resize;width:100%;height:10px;bottom:-4px;left:0}.handle.corner.svelte-1mjaycs{cursor:nwse-resize;background:var(--accent);width:16px;height:16px;box-shadow:0 0 0 2px var(--canvas);border-radius:3px;bottom:-6px;right:-6px}.canvas.svelte-1jfrg6d{flex-direction:column;height:100%;min-height:0;display:flex}.toolbar.svelte-1jfrg6d{flex:none;align-items:center;gap:8px;padding:8px 0;display:flex}.toolbar.svelte-1jfrg6d button:where(.svelte-1jfrg6d){background:var(--panel-raised);border:1px solid var(--border);color:var(--text);border-radius:var(--radius);padding:4px 10px}.toolbar.svelte-1jfrg6d button:where(.svelte-1jfrg6d):hover{border-color:var(--accent)}.toolbar.svelte-1jfrg6d button.active:where(.svelte-1jfrg6d){background:var(--accent-soft);border-color:var(--accent);color:var(--accent)}.zoom.svelte-1jfrg6d{text-align:center;min-width:44px;color:var(--text-dim);font-variant-numeric:tabular-nums}.dims.svelte-1jfrg6d{color:var(--text-dim);font-variant-numeric:tabular-nums;margin-left:auto}.viewport.svelte-1jfrg6d{touch-action:none;cursor:grab;border:1px solid var(--border);border-radius:var(--radius-large);flex:1;min-height:0;position:relative;overflow:hidden}.viewport.panning.svelte-1jfrg6d{cursor:grabbing}.image-wrap.svelte-1jfrg6d{transform-origin:0 0;position:absolute;top:0;left:0;box-shadow:0 0 0 1px #ffffff14}.image-wrap.svelte-1jfrg6d img:where(.svelte-1jfrg6d){width:100%;height:100%;image-rendering:pixelated;pointer-events:none;-webkit-user-select:none;user-select:none;display:block}.center-rect.svelte-1jfrg6d{pointer-events:none;position:absolute}.center-rect.side-edges.svelte-1jfrg6d{border-left:1px dashed #0d99ff99;border-right:1px dashed #0d99ff99}.center-rect.cap-edges.svelte-1jfrg6d{border-top:1px dashed #0d99ff99;border-bottom:1px dashed #0d99ff99}.overdraw-band.svelte-1jfrg6d{pointer-events:none;background:#38bdf829;position:absolute}.line.svelte-1jfrg6d{background:var(--accent);touch-action:none;position:absolute}.line.overdraw-line.svelte-1jfrg6d{background:#38bdf8 padding-box content-box}.line.overdraw-line.svelte-1jfrg6d .tag:where(.svelte-1jfrg6d){background:#38bdf8}.line.v.svelte-1jfrg6d{cursor:ew-resize;box-sizing:content-box;background-clip:content-box;width:1px;height:100%;margin-left:-.5px;padding:0 7px;top:0;transform:translate(-7px)}.line.h.svelte-1jfrg6d{cursor:ns-resize;box-sizing:content-box;background-clip:content-box;width:100%;height:1px;margin-top:-.5px;padding:7px 0;left:0;transform:translateY(-7px)}.line.active.svelte-1jfrg6d{background-color:var(--text);background-clip:content-box}.tag.svelte-1jfrg6d{background:var(--accent);color:var(--text);font-variant-numeric:tabular-nums;pointer-events:none;border-radius:4px;padding:1px 5px;font-size:11px;font-weight:600;position:absolute}.line.v.svelte-1jfrg6d .tag:where(.svelte-1jfrg6d){top:4px;left:50%;transform:translate(-50%)}.line.h.svelte-1jfrg6d .tag:where(.svelte-1jfrg6d){top:50%;left:4px;transform:translateY(-50%)}.line.v.overdraw-line.svelte-1jfrg6d .tag:where(.svelte-1jfrg6d){top:auto;bottom:4px}.line.h.overdraw-line.svelte-1jfrg6d .tag:where(.svelte-1jfrg6d){left:auto;right:4px}.editor.svelte-1ea2lvt{flex-direction:column;flex:1;min-height:0;display:flex}.tabs.svelte-1ea2lvt{flex:none;gap:4px;margin-bottom:4px;display:inline-flex}.tabs.svelte-1ea2lvt button:where(.svelte-1ea2lvt){border-radius:var(--radius);color:var(--text-dim);background:0 0;border:none;padding:4px 10px}.tabs.svelte-1ea2lvt button.on:where(.svelte-1ea2lvt){background:var(--accent-soft);color:var(--accent)}.pane.svelte-1ea2lvt{flex:1;min-height:0}.empty.svelte-1ea2lvt{color:var(--text-dim);flex:1;justify-content:center;align-items:center;display:flex}section.svelte-ij1927{border-bottom:1px solid var(--border-soft);padding:12px}.field.svelte-ij1927{margin-bottom:8px}.stage.svelte-qls820{border:1px solid var(--border);border-radius:8px;flex:1;justify-content:center;align-items:center;min-height:0;display:flex;overflow:auto}.preview-column.svelte-qls820{flex-direction:column;align-items:center;gap:8px;display:flex}.video-frame.svelte-qls820{width:min(90%,480px)}.video-frame.svelte-qls820 video{width:100%;height:100%}p.svelte-qls820{color:var(--text-dim)}video.svelte-ejgo9x{object-fit:contain;max-width:100%;max-height:100%}.picker.svelte-56kutb{flex-direction:column;gap:4px;min-width:0;margin-bottom:8px;display:flex}.caption.svelte-56kutb{letter-spacing:.27px;color:#ffffffb2;-webkit-user-select:none;user-select:none;font-size:9px;font-weight:500;line-height:14px}.reference-input.svelte-56kutb{border-radius:4px;align-items:center;min-width:0;height:24px;padding:0;display:flex;position:relative}.reference-input.svelte-56kutb:focus-within{border-color:var(--accent)}.current.svelte-56kutb{min-width:0;height:100%;color:var(--text);text-align:left;background:0 0;border:none;outline:none;flex:1;align-items:center;gap:4px;padding:0 6px 0 0;display:flex}.current.empty.svelte-56kutb{color:var(--text-faint)}.preview-slot.svelte-56kutb{box-sizing:border-box;background:#4a4a4a;border-radius:3px 0 0 3px;flex:none;justify-content:center;align-items:center;width:24px;height:24px;margin-left:-1px;padding:2px;display:flex;overflow:hidden}.preview.svelte-56kutb{object-fit:contain;width:100%;height:100%}.missing-preview.svelte-56kutb{color:var(--warning);font-weight:700}.clear.svelte-56kutb{border:none;border-left:1px solid var(--border-soft);width:24px;height:24px;color:var(--text-dim);background:0 0;border-radius:0 3px 3px 0;outline:none;flex:none;padding:0}.clear.svelte-56kutb:hover{color:var(--danger)}.id.svelte-56kutb,.placeholder.svelte-56kutb{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.dangling.svelte-56kutb{color:var(--warning)}.dropdown.svelte-56kutb{z-index:10;background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);max-height:240px;padding:4px;position:absolute;top:calc(100% + 4px);left:0;right:0;overflow-y:auto;box-shadow:0 8px 24px #00000080}.option.svelte-56kutb{border-radius:var(--radius);width:100%;color:var(--text);text-align:left;background:0 0;border:none;align-items:center;gap:6px;padding:4px 6px;display:flex}.option.svelte-56kutb .thumbnail:where(.svelte-56kutb){object-fit:contain;background:var(--canvas);border-radius:3px;flex:none;width:24px;height:24px}.option.svelte-56kutb:hover{background:var(--panel-raised)}.option.selected.svelte-56kutb{background:var(--accent-soft);color:var(--accent)}.hint.svelte-56kutb{color:var(--text-faint);margin:4px;font-size:11px}.color-field.svelte-gjs979{flex-direction:column;gap:4px;min-width:0;display:flex}.caption.svelte-gjs979{letter-spacing:.27px;color:#ffffffb2;-webkit-user-select:none;user-select:none;font-size:9px;font-weight:500;line-height:14px}.color-input.svelte-gjs979{border-radius:4px;align-items:center;gap:4px;min-width:0;height:24px;padding:0 6px 0 0;display:flex}.color-input.svelte-gjs979:focus-within{border-color:var(--accent)}.swatch-slot.svelte-gjs979{flex:none;justify-content:center;align-items:center;width:24px;height:24px;display:flex}.swatch.svelte-gjs979{cursor:pointer;background:0 0;border:1px solid #ffffff3d;border-radius:3px;width:16px;height:16px;margin:0;padding:0;overflow:hidden}.swatch.svelte-gjs979::-webkit-color-swatch-wrapper{padding:0}.swatch.svelte-gjs979::-webkit-color-swatch{border:none}.hex-input.svelte-gjs979{width:100%;min-width:0;color:var(--text);font-variant-numeric:tabular-nums;text-transform:uppercase;background:0 0;border:none;outline:none;flex:1;margin:0;padding:0;font-size:11px}section.svelte-rsjkek{border-bottom:1px solid var(--border-soft);padding:12px}.field.svelte-rsjkek{margin-bottom:8px}.stage.svelte-1y3xro5{border:1px solid var(--border);border-radius:8px;flex:1;justify-content:center;align-items:center;min-height:0;display:flex;overflow:auto}.preview-column.svelte-1y3xro5{flex-direction:column;align-items:center;gap:8px;display:flex}.compare-row.svelte-1y3xro5{justify-content:center;align-items:flex-start;gap:16px;width:100%;max-width:760px;display:flex}figure.svelte-1y3xro5{flex-direction:column;flex:1 1 0;align-items:center;gap:6px;min-width:0;margin:0;display:flex}figcaption.svelte-1y3xro5{text-transform:uppercase;letter-spacing:.06em;color:var(--text-faint);font-size:10px}.video-frame.svelte-1y3xro5{width:100%}.video-frame.svelte-1y3xro5 video{width:100%;height:100%}p.svelte-1y3xro5{color:var(--text-dim)}section.svelte-3jblpy{border-bottom:1px solid var(--border-soft);padding:12px}.field.svelte-3jblpy{margin-bottom:8px}.backdrop.svelte-1f5yh58{z-index:100;background:#0000008c;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.dialog.svelte-1f5yh58{background:var(--panel);border:1px solid var(--border);border-radius:8px;width:360px;padding:16px;box-shadow:0 12px 32px #00000080}h2.svelte-1f5yh58{margin:0 0 4px;font-size:12px}.file-name.svelte-1f5yh58{color:var(--text-dim);font-variant-numeric:tabular-nums;margin:0}.destination.svelte-1f5yh58{color:var(--text-faint);margin:2px 0 16px}.row.svelte-1f5yh58{align-items:center;gap:8px;margin-bottom:8px;display:flex}.label.svelte-1f5yh58{width:64px;color:var(--text-dim);flex:none}.row.svelte-1f5yh58 input:where(.svelte-1f5yh58){flex:1}.row.manifests.svelte-1f5yh58{align-items:flex-start}.row.manifests.svelte-1f5yh58>.label:where(.svelte-1f5yh58){line-height:28px}.manifest-list.svelte-1f5yh58{flex:1;max-height:132px;overflow-y:auto}.empty-manifests.svelte-1f5yh58{color:var(--text-faint);margin:0;font-size:11px}.segmented.svelte-1f5yh58{border:1px solid var(--border);border-radius:var(--radius);display:inline-flex;overflow:hidden}.segmented.svelte-1f5yh58 button:where(.svelte-1f5yh58){background:var(--panel-raised);color:var(--text-dim);border:none;padding:4px 12px}.segmented.svelte-1f5yh58 button.on:where(.svelte-1f5yh58){background:var(--accent);color:var(--text)}.hint.svelte-1f5yh58{color:var(--text-dim);margin:4px 0 0;font-size:11px}.hint.warn.svelte-1f5yh58,.error.svelte-1f5yh58{color:var(--warning)}.actions.svelte-1f5yh58{justify-content:flex-end;gap:8px;margin-top:16px;display:flex}.backdrop.svelte-n5o24b{z-index:100;background:#0000008c;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.dialog.svelte-n5o24b{border:1px solid var(--border);background:var(--panel);border-radius:8px;width:420px;padding:16px;box-shadow:0 12px 32px #00000080}h2.svelte-n5o24b{margin:0 0 4px;font-size:12px}.destination.svelte-n5o24b{color:var(--text-faint);margin:0 0 16px}.row.svelte-n5o24b{gap:12px;display:flex}.field.svelte-n5o24b{color:var(--text-dim);flex-direction:column;flex:1;gap:4px;margin-bottom:10px;display:flex}.field.wide.svelte-n5o24b{width:100%}.warning.svelte-n5o24b{color:var(--warning);margin:6px 0 0;font-size:11px}.actions.svelte-n5o24b{justify-content:flex-end;gap:8px;margin-top:16px;display:flex}.directory.svelte-ftwms1{background:var(--panel);border-right:1px solid var(--border);flex-direction:column;width:220px;min-width:180px;max-width:320px;min-height:0;display:flex}header.svelte-ftwms1{border-bottom:1px solid var(--border-soft);align-items:center;height:40px;padding:0 8px 0 12px;display:flex}header.svelte-ftwms1 strong:where(.svelte-ftwms1){font-size:11px}.actions.svelte-ftwms1{margin-left:auto;display:flex}.icon-button.svelte-ftwms1{width:24px;height:24px;color:var(--text-dim);border-radius:var(--radius-small);background:0 0;border:0}.icon-button.svelte-ftwms1:hover:not(:disabled){background:var(--panel-raised);color:var(--text)}.icon-button.danger.svelte-ftwms1:hover:not(:disabled){color:var(--danger)}.icon-button.svelte-ftwms1:disabled{opacity:.3;cursor:default}.tree.svelte-ftwms1{padding:6px 4px;overflow:auto}.folder-row.svelte-ftwms1,.asset-row.svelte-ftwms1{padding-left:calc((var(--depth) + 2) * 14px);display:flex}.row.svelte-ftwms1{color:var(--text-dim);border-radius:var(--radius-small);text-align:left;background:0 0;border:0;align-items:center;gap:6px;min-width:0;height:28px;display:flex}.row.special.svelte-ftwms1{width:100%;padding:0 8px}.row.folder.svelte-ftwms1{flex:1;padding:0 8px 0 2px}.row.asset.svelte-ftwms1{cursor:grab;flex:1;padding:0 8px 0 2px}.row.asset.svelte-ftwms1:active{cursor:grabbing}.row.svelte-ftwms1:hover,.row.selected.svelte-ftwms1{background:var(--panel-raised);color:var(--text)}.row.asset.current.svelte-ftwms1,.row.selected.svelte-ftwms1{background:var(--accent-soft);color:var(--accent)}.row.drop-target.svelte-ftwms1{outline:1px solid var(--accent);background:var(--accent-soft)}.glyph.svelte-ftwms1{width:14px;color:var(--text-faint);flex:none;justify-content:center;align-items:center;display:flex}.asset-glyph.svelte-ftwms1{font-size:7px}.asset-warning.svelte-ftwms1{color:var(--warning);flex:none;margin-left:auto}.label.svelte-ftwms1{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.count.svelte-ftwms1{color:var(--text-faint);margin-left:auto;font-size:10px}.dialog-row.svelte-ftwms1{align-items:center;gap:8px;display:flex}.dialog-row.svelte-ftwms1 span:where(.svelte-ftwms1){width:44px;color:var(--text-dim)}.dialog-row.svelte-ftwms1 input:where(.svelte-ftwms1){flex:1}.dialog-path.svelte-ftwms1,.dialog-text.svelte-ftwms1,.dialog-warning.svelte-ftwms1{margin:8px 0 0}.dialog-path.svelte-ftwms1{color:var(--text-faint)}.dialog-warning.svelte-ftwms1{color:var(--warning)}.context-menu.svelte-10jgqdh{z-index:200;background:var(--panel-raised);border:1px solid var(--border);border-radius:6px;width:168px;padding:4px;position:fixed;box-shadow:0 8px 24px #00000073}button.svelte-10jgqdh{width:100%;color:var(--text);font:inherit;text-align:left;background:0 0;border:0;border-radius:4px;padding:6px 8px}button.svelte-10jgqdh:hover,button.svelte-10jgqdh:focus-visible{background:var(--accent-soft);outline:none}button.danger.svelte-10jgqdh{color:var(--danger)}hr.svelte-10jgqdh{background:var(--border);border:0;height:1px;margin:4px 8px}
@@ -1 +0,0 @@
1
- import{A as e,D as t,F as n,G as r,J as i,K as a,N as o,O as s,P as c,V as l,_ as u,i as d,nt as f,ot as p,tt as m,u as h,x as g}from"./NblqapDQ.js";import"./xihTtKlq.js";function _(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} kB`:`${(e/(1024*1024)).toFixed(2)} MB`}function v(e){return`${(e/1e3).toFixed(2)} s`}function y(e,t){let{maxWidth:n,...r}=e;return t===null||!Number.isFinite(t)||t<=0?r:{...r,maxWidth:Math.round(t)}}function b(e,t){return e.defaultPrevented||e.isComposing||t.busy?null:e.key===`Escape`?`cancel`:e.key===`Enter`&&!t.confirmDisabled?`confirm`:null}function x(e){return e instanceof Element&&e.closest(`button, select, textarea, [contenteditable]:not([contenteditable="false"])`)!==null}function S(e,t){let n=b(e,t);n===null||n===`confirm`&&x(e.target)||(e.preventDefault(),e.stopPropagation(),n===`confirm`?t.onConfirm():t.onCancel())}var C=e(`<div class="backdrop svelte-oozc38" role="presentation"><div class="dialog svelte-oozc38" role="dialog" tabindex="-1"><h2 class="svelte-oozc38"> </h2> <!> <div class="actions svelte-oozc38"><button class="control">Cancel</button> <button> </button></div></div></div>`);function w(e,o){f(o,!0);let _=d(o,`danger`,3,!1),v=d(o,`confirmDisabled`,3,!1),y=d(o,`busy`,3,!1);var b=C();n(`keydown`,r,e=>S(e,{busy:y(),confirmDisabled:v(),onConfirm:o.onConfirm,onCancel:o.onCancel}));var x=a(b),w=a(x),T=a(w,!0);p(w);var E=i(w,2);g(E,()=>o.children);var D=i(E,2),O=a(D),k=i(O,2);let A;var j=a(k,!0);p(k),p(D),p(x),p(b),l(()=>{h(x,`aria-label`,o.title),t(T,o.title),O.disabled=y(),A=u(k,1,`control`,null,A,{primary:!_(),danger:_()}),k.disabled=v()||y(),t(j,o.confirmLabel)}),c(`click`,b,e=>{e.target===e.currentTarget&&!y()&&o.onCancel()}),c(`click`,O,function(...e){o.onCancel?.apply(this,e)}),c(`click`,k,function(...e){o.onConfirm?.apply(this,e)}),s(e,b),m()}o([`click`]);export{y as a,v as i,S as n,_ as r,w as t};
@@ -1 +0,0 @@
1
- import{A as e,C as t,D as n,E as r,I as i,J as a,K as o,M as s,N as c,O as l,P as u,Q as d,S as f,V as p,_ as m,d as h,g,i as _,j as v,l as y,nt as b,ot as x,tt as S,u as C}from"./NblqapDQ.js";import"./xihTtKlq.js";import{O as w,t as T}from"./C7OUKWnm.js";var E={"arrow-up":`<path d="M12 19V5"/><path d="M6 11l6-6 6 6"/>`,"arrow-right":`<path d="M5 12h14"/><path d="M13 6l6 6-6 6"/>`,"arrow-down":`<path d="M12 5v14"/><path d="M6 13l6 6 6-6"/>`,"arrow-left":`<path d="M19 12H5"/><path d="M11 6l-6 6 6 6"/>`,sort:`<path d="m3 16 4 4 4-4"/><path d="M7 20V4"/><path d="M11 4h10"/><path d="M11 8h7"/><path d="M11 12h4"/>`,"asset-type":`<path d="M8.3 10a.7.7 0 0 1-.626-1.079L11.4 3a.7.7 0 0 1 1.198-.043L16.3 8.9a.7.7 0 0 1-.572 1.1Z"/><rect x="3" y="14" width="7" height="7" rx="1"/><circle cx="17.5" cy="17.5" r="3.5"/>`,manifest:`<path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"/><path d="M14 2v5a1 1 0 0 0 1 1h5"/><path d="M10 9H8"/><path d="M16 13H8"/><path d="M16 17H8"/>`,"git-branch":`<path d="M15 6a9 9 0 0 0-9 9V3"/><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/>`,width:`<path d="M3 12h18"/><path d="M7 8l-4 4 4 4"/><path d="M17 8l4 4-4 4"/>`,ratio:`<rect x="4" y="4" width="7" height="7" rx="1"/><rect x="13" y="4" width="7" height="7" rx="1"/><rect x="4" y="13" width="7" height="7" rx="1"/><rect x="13" y="13" width="7" height="7" rx="1"/>`,preset:`<path d="M4 7h10"/><circle cx="17" cy="7" r="2"/><path d="M20 17H10"/><circle cx="7" cy="17" r="2"/>`,cutoff:`<circle cx="12" cy="12" r="8"/><path d="M12 4a8 8 0 0 1 0 16z" fill="currentColor" stroke="none"/>`,"color-feather":`<circle cx="12" cy="12" r="8" stroke-dasharray="1.5 3"/><circle cx="12" cy="12" r="3.5"/>`,"mask-feather":`<rect x="4" y="4" width="16" height="16" rx="3" stroke-dasharray="1.5 3"/><circle cx="12" cy="12" r="3.5"/>`,sharpen:`<path d="M4 18l8-12 8 12"/><path d="M4 18h16"/>`,despill:`<path d="M12 3s6 6 6 11a6 6 0 0 1-12 0c0-5 6-11 6-11z"/>`,"despill-lum":`<path d="M12 3s5.5 5.5 5.5 10a5.5 5.5 0 0 1-11 0c0-4.5 5.5-10 5.5-10z"/><path d="M12 10v5M9.5 12.5h5"/>`},D=v(`<svg class="icon svelte-jamecx" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"></svg>`);function O(e,t){let n=_(t,`size`,3,16);var r=D();f(r,()=>E[t.name],!0),x(r),p(()=>{C(r,`width`,n()),C(r,`height`,n())}),l(e,r)}function k(e){return e.length===0?[]:[e.includes(`main`)?`main`:e[0]]}function A(e,t){return w(e)??(t.has(e)?`An asset with id "${e}" already exists.`:null)}function j(e,t,n=[]){let r=e;for(let i of t)i.kind===`unsupported`||Object.hasOwn(e,i.token)||(r===e&&(r={...e}),r[i.token]={id:i.kind===`new`?i.proposedId:i.assetId,type:i.kind===`new`?i.compatibleTypes[0]??``:i.compatibleTypes.includes(i.currentType)?i.currentType:``,manifests:i.kind===`new`?k(n):[],error:null,busy:!1});return r}var M=e(`<span class="color-dot svelte-151zph4"></span>`),N=e(`<span class="via svelte-151zph4"> </span>`),P=e(`<label><input type="checkbox" class="svelte-151zph4"/> <span class="marker svelte-151zph4" aria-hidden="true"><!></span> <span class="name svelte-151zph4"> </span> <!></label>`),F=e(`<div class="manifest-selector svelte-151zph4" role="group" aria-label="Manifest assignments"></div>`);function I(e,c){b(c,!0);let f=_(c,`disabled`,3,!1);function v(e){return c.passive.find(t=>t.manifest===e)}function w(e,t,n){return t?`${e}: explicitly assigned`:n?`${e}: passive member via ${n.via.join(`, `)}`:`${e}: not assigned`}var E=F();t(E,20,()=>c.manifests,e=>e,(e,t)=>{let _=d(()=>T.manifestAppearance(t)),b=d(()=>c.selected.includes(t)),S=d(()=>v(t)),E=d(()=>i(_).color??`var(--accent)`);var D=P();let O,k;var A=o(D);y(A);var j=a(A,2),F=o(j),I=e=>{var t=s();p(()=>n(t,i(_).emoji)),l(e,t)},L=e=>{l(e,M())};r(F,e=>{i(_).emoji?e(I):e(L,-1)}),x(j);var R=a(j,2),z=o(R,!0);x(R);var B=a(R,2),V=e=>{var t=N(),r=o(t);x(t),p(e=>n(r,`passive · via ${e??``}`),[()=>i(S).via.join(`, `)]),l(e,t)};r(B,e=>{i(S)&&!i(b)&&e(V)}),x(D),p((e,r)=>{O=m(D,1,`manifest-option control svelte-151zph4`,null,O,{selected:i(b),passive:i(S)!==void 0&&!i(b),disabled:f()}),C(D,`title`,e),k=g(D,``,k,{"--manifest-color":i(E)}),h(A,i(b)),A.disabled=f(),C(A,`aria-label`,r),n(z,t)},[()=>w(t,i(b),i(S)),()=>w(t,i(b),i(S))]),u(`change`,A,()=>c.onToggle(t)),l(e,D)}),x(E),l(e,E),S()}c([`change`]);export{O as a,A as i,k as n,j as r,I as t};
@@ -1 +0,0 @@
1
- import{I as e,X as t,Z as n}from"./NblqapDQ.js";var r=class extends Error{status;constructor(e,t){super(t),this.name=`ApiResponseError`,this.status=e}};async function i(e){if(!e.ok){let t=`${e.status} ${e.statusText}`;try{let n=await e.json();n.error?.message&&(t=n.error.message)}catch{}throw new r(e.status,t)}return await e.json()}async function a(e){if(!e.ok){let t=`${e.status} ${e.statusText}`;try{let n=await e.json();n.error?.message&&(t=n.error.message)}catch{}throw new r(e.status,t)}}async function o(){return i(await fetch(`/api/state`,{cache:`no-store`}))}async function s(){return i(await fetch(`/api/reconcile`,{method:`POST`,cache:`no-store`,headers:{"Content-Type":`application/json`},body:JSON.stringify({})}))}async function c(e,t,n,r=[]){return i(await fetch(`/api/raw/adopt`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({token:e,id:t,type:n,manifests:r})}))}async function l(e,t){return i(await fetch(`/api/raw/edited/accept`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({token:e,type:t})}))}async function u(e){return i(await fetch(`/api/raw/edited/dismiss`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({token:e})}))}async function d(e,t,n,r,a=[]){let o=new FormData;o.set(`file`,e),o.set(`type`,t),o.set(`id`,n),o.set(`folder`,r);for(let e of a)o.append(`manifests`,e);return i(await fetch(`/api/assets`,{method:`POST`,body:o}))}async function f(e){return i(await fetch(`/api/imports`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({importer:`figma`,input:{url:e.url,format:`png`,scale:e.scale},type:e.type,id:e.id,folder:e.folder,manifests:e.manifests})}))}async function ee(e,t){return i(await fetch(`/api/assets/${encodeURIComponent(e)}/reimport`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({...t?{input:{...t,format:`png`}}:{}})}))}async function te(e,t){let n=new FormData;return n.set(`file`,t),i(await fetch(`/api/assets/${encodeURIComponent(e)}/raw`,{method:`PUT`,body:n}))}async function ne(e){return i(await fetch(`/api/folders`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:e})}))}async function re(e,t){return i(await fetch(`/api/folders/${encodeURIComponent(e)}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:t})}))}async function ie(e,t){return i(await fetch(`/api/folders/${encodeURIComponent(e)}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({parent:t})}))}async function ae(e){return i(await fetch(`/api/folders/${encodeURIComponent(e)}`,{method:`DELETE`}))}async function oe(e,t){return i(await fetch(`/api/assets/${encodeURIComponent(e)}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)}))}async function se(e,t){return i(await fetch(`/api/assets/move`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({assetIds:e,folder:t})}))}async function ce(e){return i(await fetch(`/api/assets/${encodeURIComponent(e)}`,{method:`DELETE`}))}async function le(e){return i(await fetch(`/api/assets/delete`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({assetIds:e})}))}async function ue(e,t){return a(await fetch(`/api/reveal`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({assetId:e,kind:t})}))}async function de(e){return a(await fetch(`/api/reveal`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({folder:e})}))}async function fe(e){return i(await fetch(`/api/manifests`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:e})}))}async function pe(e){return i(await fetch(`/api/manifests/${encodeURIComponent(e)}`,{method:`DELETE`}))}async function me(e,t){return i(await fetch(`/api/manifests/${encodeURIComponent(e)}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)}))}var he=class{#e=null;#t=null;#n=0;#r=[];get value(){return this.#t}replaceBase(e){this.#e=e,this.#a()}mergeBase(e){this.#e!==null&&(this.#e=e(this.#e),this.#a())}add(e,t=[]){let n=++this.#n;return this.#r.push({id:n,update:e,dependencies:t}),this.#t!==null&&(this.#t=e(this.#t)),n}confirm(e,t,n){let r=this.#r.findIndex(t=>t.id===e);if(r===-1)return;let i=this.#r[r],a=this.#e;if(a===null){this.#e=t,this.#i(e),this.#a();return}this.#e=n(i.update(a)),this.#i(e),r===0&&this.#t!==null?this.#t=n(this.#t):this.#a()}reject(e){this.#i(e),this.#a()}rejectAffectedFrom(e,t){this.#r=this.#r.filter(n=>n.id<e||n.id>e&&!p(n.dependencies,t)),this.#a()}#i(e){this.#r=this.#r.filter(t=>t.id!==e)}#a(){let e=this.#e;if(e===null){this.#t=null;return}let t=e;for(let e of this.#r)t=e.update(t);this.#t=t}};function p(e,t){return e.some(e=>t.some(t=>{if(e===t)return!0;if(!e.startsWith(`folder:`)||!t.startsWith(`folder:`))return!1;let n=e.slice(7),r=t.slice(7);return n.startsWith(`${r}/`)||r.startsWith(`${n}/`)}))}var ge=/[\u0000-\u001f\u007f]/,_e=/[<>:"|?*]/,ve=/^(con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\..*)?$/i;function ye(e){return e.length===0?`Folder names must not be empty.`:e===e.trim()?e===`.`||e===`..`?`"${e}" is not a valid folder name.`:e.includes(`/`)||e.includes(`\\`)?`Folder names must not contain path separators.`:ge.test(e)?`Folder names must not contain control characters.`:_e.test(e)?`Folder names must not contain Windows-reserved characters (: * ? " < > |).`:e.endsWith(`.`)?`Folder names must not end with a dot.`:e.toLocaleLowerCase(`en-US`)===`root`?`"${e}" is reserved for the implicit Fundus root folder.`:e.toLocaleLowerCase(`en-US`)===`.gitkeep`?`"${e}" is reserved for Fundus folder management.`:ve.test(e)?`"${e}" is a reserved filesystem name.`:null:`Folder names must not start or end with whitespace.`}function be(e){return e.split(`/`).map(e=>e.normalize(`NFC`)).join(`/`)}function m(e){return be(e).toLocaleLowerCase(`en-US`)}function h(e){let t=e.lastIndexOf(`/`);return t===-1?``:e.slice(0,t)}function g(e){let t=e.lastIndexOf(`/`);return t===-1?e:e.slice(t+1)}function _(e,t){return e===``?t:`${e}/${t}`}function v(e){return h(e)}function y(e){return g(e)}function b(e,t){return e===t||e.startsWith(`${t}/`)}function x(e,t,n){return e===t?n:`${n}${e.slice(t.length)}`}var S=`[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}`;RegExp(`^(?:\\.fundus-replace-${S}\\.tmp|\\.fundus-delete(?:-assets)?-${S})$`,`i`),RegExp(`\\.fundus-(?:replace-)?${S}$`,`i`);var C=[`preload`,`release`,`entries`,`constructor`,`prototype`,`hasOwnProperty`,`isPrototypeOf`,`propertyIsEnumerable`,`toLocaleString`,`toString`,`valueOf`],w=/^[a-z][A-Za-z0-9]*$/;function xe(e){return w.test(e)?C.includes(e)?`"${e}" is reserved (it collides with a Manifest member name).`:null:`"${e}" is not a valid asset id — use a camelCase identifier starting with a lowercase letter (e.g. "navigationPanel").`}function Se(e){return w.test(e)?C.includes(e)?`"${e}" is reserved (it collides with a Manifest member name).`:null:`"${e}" is not a valid manifest name — use a camelCase identifier starting with a lowercase letter (e.g. "mainCatalog").`}var T={type:`audio`,accepts:[`mp3`,`wav`,`m4a`,`ogg`,`flac`],defaultParameters:()=>({preset:`default`}),validateParameters(e){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`Audio parameters must be an object.`);let t=e;if(typeof t.preset!=`string`||t.preset.length===0)throw Error(`Audio parameters need a non-empty string "preset".`);return{preset:t.preset}}};function Ce(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&typeof e.$asset==`string`&&e.$asset!==``}var E={keyColor:[0,1,0],colorCutoff:.2,colorFeathering:.33,maskFeathering:1,sharpening:.5,despill:1,despillLuminanceAdd:.2},we=[`colorCutoff`,`colorFeathering`,`maskFeathering`,`sharpening`,`despill`,`despillLuminanceAdd`];function D(e){return Math.min(1,Math.max(0,e))}function Te(e){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`"chromaKey" must be an object.`);let t=e,n=t.keyColor;if(!Array.isArray(n)||n.length!==3||n.some(e=>typeof e!=`number`||!Number.isFinite(e)))throw Error(`"chromaKey.keyColor" must be an array of three numbers (RGB, 0–1 each).`);let r={keyColor:[D(n[0]),D(n[1]),D(n[2])]};for(let e of we){let n=t[e];if(typeof n!=`number`||!Number.isFinite(n))throw Error(`"chromaKey.${e}" must be a number (0–1).`);r[e]=D(n)}return r}var O=[`mp4`,`mov`,`webm`,`m4v`];function k(e,t){if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`${e} parameters must be an object.`);let n=t;if(typeof n.preset!=`string`||n.preset.length===0)throw Error(`${e} parameters need a non-empty string "preset".`);if(n.maxWidth!==void 0&&(typeof n.maxWidth!=`number`||!Number.isInteger(n.maxWidth)||n.maxWidth<=0))throw Error(`${e} "maxWidth" must be a positive integer when set.`);return{preset:n.preset,...n.maxWidth===void 0?{}:{maxWidth:n.maxWidth}}}var A={type:`video`,accepts:[...O],defaultParameters:()=>({preset:`default`}),validateParameters(e){return k(`Video`,e)}};function j(e,t){if(t!==void 0){if(!Ce(t))throw Error(`"${e}" must be an asset reference ({ "$asset": "<id>" }).`);return{$asset:t.$asset}}}var M={type:`chroma-key-video`,accepts:[...O],defaultParameters:()=>({preset:`default`,chromaKey:{...E,keyColor:[...E.keyColor]}}),validateParameters(e){let t=k(`Chroma-key-video`,e),n=e,r=Te(n.chromaKey),i=j(`mask`,n.mask),a=j(`fallback`,n.fallback);return{...t,chromaKey:r,...i===void 0?{}:{mask:i},...a===void 0?{}:{fallback:a}}},collectReferences(e){let t=[];return e.mask&&t.push({field:`mask`,assetId:e.mask.$asset,expectedTypes:[`image`]}),e.fallback&&t.push({field:`fallback`,assetId:e.fallback.$asset,expectedTypes:[`image`]}),t},processingParameters(e){return{preset:e.preset,...e.maxWidth===void 0?{}:{maxWidth:e.maxWidth}}}},N=[`png`,`jpg`,`jpeg`,`webp`,`avif`],P={type:`image`,accepts:[...N],defaultParameters:()=>({preset:`default`}),validateParameters(e){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`Image parameters must be an object.`);let t=e;if(typeof t.preset!=`string`||t.preset.length===0)throw Error(`Image parameters need a non-empty string "preset".`);if(t.targetWidth!==void 0&&(typeof t.targetWidth!=`number`||!Number.isInteger(t.targetWidth)||t.targetWidth<=0))throw Error(`Image "targetWidth" must be a positive integer when set.`);return{preset:t.preset,...t.targetWidth===void 0?{}:{targetWidth:t.targetWidth}}}},F=[`nine`,`three-horizontal`,`three-vertical`,`one`];function I(){return{top:0,right:0,bottom:0,left:0}}function L(e){return{horizontal:e===`nine`||e===`three-horizontal`,vertical:e===`nine`||e===`three-vertical`}}function R(e,t,n,r){return t===`left`?n-e.right:t===`right`?n-e.left:t===`top`?r-e.bottom:r-e.top}function Ee(e,t,n,r){return R(e,t,n,r)-1}function z(e,t,n){return Math.max(t,Math.min(n,e))}function De(e){let t=L(e.mode),n=e.overdraw??{top:0,right:0,bottom:0,left:0},r=t.horizontal&&(e.compression?.x??0)>0,i=t.vertical&&(e.compression?.y??0)>0,a=r?Math.max(e.insets.left,n.left):e.insets.left,o=r?Math.max(e.insets.right,n.right):e.insets.right,s=i?Math.max(e.insets.top,n.top):e.insets.top,c=i?Math.max(e.insets.bottom,n.bottom):e.insets.bottom,l=z(a,0,e.width),u=z(o,0,e.width-l),d=z(s,0,e.height);return{top:d,right:u,bottom:z(c,0,e.height-d),left:l}}function B(e,t){if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`Slice ${e} must be an object with top/right/bottom/left.`);let n=t,r=[`top`,`right`,`bottom`,`left`],i=I();for(let t of r){let r=n[t];if(typeof r!=`number`||!Number.isInteger(r)||r<0)throw Error(`Slice ${e}.${t} must be a non-negative integer.`);i[t]=r}return i}function Oe(e){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`Slice compression must be an object with x/y percentages.`);let t=e,n={x:0,y:0};for(let e of[`x`,`y`]){let r=t[e];if(typeof r!=`number`||!Number.isInteger(r)||r<0||r>100)throw Error(`Slice compression.${e} must be an integer from 0 to 100.`);n[e]=r}return n}var V={type:`slice`,accepts:[...N],defaultParameters:()=>({mode:`nine`,insets:I(),pixelRatio:1,preset:`default`}),validateParameters(e){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`Slice parameters must be an object.`);let t=e;if(typeof t.mode!=`string`||!F.includes(t.mode))throw Error(`Slice "mode" must be one of ${F.map(e=>`'${e}'`).join(` | `)}.`);let n=B(`insets`,t.insets);if(typeof t.pixelRatio!=`number`||!Number.isInteger(t.pixelRatio)||t.pixelRatio<1)throw Error(`Slice "pixelRatio" must be an integer ≥ 1.`);let r=t.overdraw===void 0?void 0:B(`overdraw`,t.overdraw),i=t.compression===void 0?void 0:Oe(t.compression);if(typeof t.preset!=`string`||t.preset.length===0)throw Error(`Slice parameters need a non-empty string "preset".`);return{mode:t.mode,insets:n,pixelRatio:t.pixelRatio,...r===void 0?{}:{overdraw:r},...i===void 0?{}:{compression:i},preset:t.preset}}},H=new class{#e=new Map;register(e){if(this.#e.has(e.type))throw Error(`Plugin type "${e.type}" is already registered.`);this.#e.set(e.type,e)}has(e){return this.#e.has(e)}values(){return[...this.#e.values()]}types(){return[...this.#e.keys()]}project(e,t){let n=Object.create(null);for(let r of this.#e.keys()){if(!Object.hasOwn(e,r))throw Error(`Registered plugin "${r}" has no ${t}.`);n[r]=e[r]}return n}};H.register(P),H.register(V),H.register(A),H.register(M),H.register(T);var U=H.values();function ke(e=U){return[...new Set(e.flatMap(e=>e.accepts))].sort().map(e=>`.${e}`)}function Ae(e,t=U){return t.find(t=>t.type===e)?.accepts.map(e=>`.${e}`).sort()??[]}function je(e,t=U){let n=e.slice(e.lastIndexOf(`.`)+1).toLowerCase();return t.filter(e=>e.accepts.includes(n)).map(e=>e.type)}function Me(e){let t=e.replace(/\.[^.]+$/,``).replace(/(?:@|[-_])\dx$/i,``).replace(/([a-z0-9])([A-Z])/g,`$1 $2`).split(/[^a-zA-Z0-9]+/).filter(Boolean);if(t.length===0)return`asset`;let n=t.map((e,t)=>t===0?e.toLowerCase():e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(``).replace(/^[0-9]+/,``);return n?n.charAt(0).toLowerCase()+n.slice(1):`asset`}function W(e){return K(e)}function G(e,t){return e<t?-1:+(e>t)}function K(e){if(e===void 0)return`null`;if(e===null||typeof e==`number`||typeof e==`boolean`||typeof e==`string`)return JSON.stringify(e);if(Array.isArray(e))return`[${e.map(K).join(`,`)}]`;if(typeof e==`object`){let t=e,n=[];for(let e of Object.keys(t).sort())t[e]!==void 0&&n.push(`${JSON.stringify(e)}:${K(t[e])}`);return`{${n.join(`,`)}}`}throw Error(`Cannot canonicalize a ${typeof e} value.`)}function Ne(e,t){let n={};for(let[r,i]of Object.entries(e.assets)){n[r]=[];let e=t[i.type];if(e?.collectReferences)try{n[r]=e.collectReferences(e.validateParameters(i.parameters))}catch{}}return n}function Pe(e,t){let n=new Set,r=[...e];for(;r.length>0;){let e=r.pop();if(!(n.has(e)||!Object.hasOwn(t,e))){n.add(e);for(let n of t[e])r.push(n.assetId)}}return n}function Fe(e,t){let n=new Set(Object.keys(e.manifests));for(let t of Object.values(e.assets))for(let e of t.manifests)n.add(e);let r={};for(let i of[...n].sort(G)){let n=Object.entries(e.assets).filter(([,e])=>e.manifests.includes(i)).map(([e])=>e).sort(G),a=new Set(n),o=new Set(n),s=new Map;for(let e of n)for(let n of Pe([e],t)){if(o.add(n),a.has(n))continue;let t=s.get(n)??[];t.push(e),s.set(n,t)}r[i]={explicitMemberIds:n,passiveMembers:[...s.entries()].map(([e,t])=>({assetId:e,via:t})).sort((e,t)=>G(e.assetId,t.assetId)),deliveredAssetIds:o}}return r}function Ie(e,t,n,r){return n&&q(n,r)?`committed`:t&&q(t,r)?`rolled-back`:`unknown`}function q(e,t){return W(e)===W(t)}var J=Object.fromEntries(H.values().map(e=>[e.type,e]));function Le(e,t,n){let r=e.library.assets[t]?.type,i=r?J[r]:void 0;if(!i)return[`asset:${t}`];try{let e=i.validateParameters(n),r=i.collectReferences?.(e)??[];return[...new Set([`asset:${t}`,...r.map(e=>`asset:${e.assetId}`)])]}catch{return[`asset:${t}`]}}function Y(e,t){let n=new Map(t.assets.map(e=>[e.id,e])),r={...e,assets:e.assets.map(e=>{let t=n.get(e.id);return t?{...e,rawUrl:t.rawUrl,rawHash:t.rawHash,gitStatus:t.gitStatus,importSource:t.importSource,proxy:t.proxy,warnings:t.warnings,passiveManifests:t.passiveManifests,references:t.references}:e}),gitBranch:t.gitBranch,importDefaults:t.importDefaults,issues:t.issues,presetNames:t.presetNames,presetCapabilities:t.presetCapabilities,rawIngestionQueue:t.rawIngestionQueue};return X(r,r.library)}function Re(e,t){let n=structuredClone(e.library);n.folders=[...t.library.folders];for(let[e,r]of Object.entries(n.assets)){let i=t.library.assets[e];i?r.raw=i.raw:delete n.assets[e]}return Y(X(e,n),t)}function X(e,t,n=new Map){let r=new Map(e.assets.map(e=>[e.id,e])),i=new Map([...n.entries()].map(([e,t])=>[t,e])),a=Ne(t,J),o=Fe(t,a),s=ze(o),c=new Map;for(let[e,t]of Object.entries(a))for(let n of t){let t=c.get(n.assetId)??[];t.push({field:n.field,assetId:e}),c.set(n.assetId,t)}let l=Object.entries(t.assets).map(([e,t])=>{let n=r.get(i.get(e)??e);return n?{...n,id:e,raw:t.raw,folder:v(t.raw),parameters:t.parameters,manifests:t.manifests,passiveManifests:s.get(e)??[],references:{outgoing:a[e].map(e=>({field:e.field,assetId:e.assetId})),incoming:c.get(e)??[]}}:null}).filter(e=>e!==null).sort((e,t)=>e.id.localeCompare(t.id)),u=new Map(l.map(e=>[e.id,e.proxy?.fileSize??0])),d=Object.fromEntries(Object.keys(t.manifests).map(e=>{let t=o[e];return[e,{explicitMemberIds:t.explicitMemberIds,passiveMembers:t.passiveMembers}]})),f=Object.fromEntries(Object.keys(t.manifests).map(e=>[e,[...o[e].deliveredAssetIds].reduce((e,t)=>e+(u.get(t)??0),0)]));return{...e,library:t,assets:l,manifestMemberships:d,manifestDeliveredBytes:f,issues:e.issues.map(e=>({...e,...e.assetId&&n.has(e.assetId)?{assetId:n.get(e.assetId)}:{}}))}}function ze(e){let t=new Map;for(let[n,r]of Object.entries(e))for(let e of r.passiveMembers){let{assetId:r,via:i}=e,a=t.get(r)??[];a.push({manifest:n,via:i}),t.set(r,a)}for(let e of t.values())e.sort((e,t)=>e.manifest.localeCompare(t.manifest));return t}function Z(e){return t=>{let n=structuredClone(t.library);return X(t,n,e(n)??new Map)}}function Be(e,t){return Z(n=>{let r=n.assets[e];if(!r)return;t.parameters!==void 0&&(r.parameters=structuredClone(t.parameters)),t.manifests!==void 0&&(r.manifests=[...new Set(t.manifests)].sort());let i=t.renameTo??e;if(!(i!==e&&n.assets[i]))return i!==e&&(delete n.assets[e],n.assets[i]=r),t.folder!==void 0&&(r.raw=_(t.folder,y(r.raw))),i===e?void 0:new Map([[e,i]])})}function Ve(e,t){return Z(n=>{for(let r of new Set(e)){let e=n.assets[r];e&&(e.raw=_(t,y(e.raw)))}})}function He(e){return Z(t=>{for(let n of new Set(e))delete t.assets[n]})}function Ue(e){return Z(t=>{t.folders.includes(e)||t.folders.push(e),t.folders.sort()})}function Q(e,t){return Z(n=>{let r=n.folders.filter(t=>b(t,e)).map(n=>x(n,e,t)),i=new Set(n.folders.filter(t=>!b(t,e)).map(m));if(!r.some(e=>i.has(m(e)))){n.folders=n.folders.map(n=>b(n,e)?x(n,e,t):n).sort();for(let r of Object.values(n.assets)){let n=v(r.raw);b(n,e)&&(r.raw=_(x(n,e,t),y(r.raw)))}}})}function We(e,t){return Q(e,_(h(e),t))}function Ge(e,t){return Q(e,_(t,g(e)))}function Ke(e){return Z(t=>{t.folders=t.folders.filter(t=>!b(t,e));for(let[n,r]of Object.entries(t.assets))b(v(r.raw),e)&&delete t.assets[n]})}function qe(e){return Z(t=>{Object.hasOwn(t.manifests,e)||(t.manifests[e]={})})}function Je(e,t){return Z(n=>{let r=n.manifests[e];if(r&&(t.color!==void 0&&(t.color===null?delete r.color:r.color=t.color),t.emoji!==void 0&&(t.emoji===null?delete r.emoji:r.emoji=t.emoji),!(t.renameTo===void 0||t.renameTo===e)&&!n.manifests[t.renameTo])){delete n.manifests[e],n.manifests[t.renameTo]=r;for(let r of Object.values(n.assets))r.manifests=r.manifests.map(n=>n===e?t.renameTo:n).sort()}})}function Ye(e){return Z(t=>{delete t.manifests[e];for(let n of Object.values(t.assets))n.manifests=n.manifests.filter(t=>t!==e)})}var Xe=class{#e=Promise.resolve();#t=new Map;enqueue(e){let t=this.#e.then(e,e);return this.#e=t.then(()=>{},()=>{}),t}coalesce(e,t){let n=this.#t.get(e);if(n)return n;let r=this.enqueue(t).finally(()=>{this.#t.get(e)===r&&this.#t.delete(e)});return this.#t.set(e,r),r}},Ze=new class{#e=new Xe;#t=new he;#n=0;#r=0;#i=[];#a=n(null);get state(){return e(this.#a)}set state(e){t(this.#a,e,!0)}#o=n(!1);get saving(){return e(this.#o)}set saving(e){t(this.#o,e,!0)}#s=n(null);get error(){return e(this.#s)}set error(e){t(this.#s,e,!0)}#c=n(!1);get loaded(){return e(this.#c)}set loaded(e){t(this.#c,e,!0)}async refresh(){return this.#l(o,{rebaseEditableState:!0})}reconcile(){return this.#l(s,{coalesce:!0})}#l(e,t={}){let n=async()=>{try{let n=await e();this.#t.value===null||t.rebaseEditableState?this.#t.replaceBase(n):this.#t.mergeBase(e=>Re(e,n)),this.#d(),this.error=null}catch(e){this.error=e instanceof Error?e.message:String(e)}finally{this.loaded=!0}};return t.coalesce?this.#e.coalesce(`reconcile`,n):this.#e.enqueue(n)}mutate(e,t,n){return this.#u(e,t,n)}mutateFromServer(e,t){return this.#u(e,void 0,t)}#u(e,t,n={dependencies:[]}){let r=++this.#r,i=this.#t.value?.library,a=t?this.#t.add(t,n.dependencies):null,s=a===null?void 0:this.#t.value?.library;return a!==null&&this.#d(),this.#n+=1,this.saving=!0,this.#e.enqueue(async()=>{this.error=null;try{if(this.#i.some(e=>e.failedMutationId<r&&r<=e.throughMutationId&&p(n.dependencies,e.dependencies)))throw a!==null&&(this.#t.reject(a),this.#d()),new $;let t=await e();a===null?this.#t.replaceBase(t):this.#t.confirm(a,t,e=>Y(e,t)),this.#d()}catch(e){if(e instanceof $)throw this.error=e.message,e;let t=null;try{t=await o();let c=Ie(e,i,s,t.library);if(c===`committed`&&a!==null){let e=t;this.#t.confirm(a,e,t=>Y(t,e)),this.#d(),this.error=null;return}this.#t.replaceBase(t),c===`rolled-back`&&a!==null&&n.invalidatesOnFailure?.length?(this.#i.push({failedMutationId:r,throughMutationId:this.#r,dependencies:n.invalidatesOnFailure}),this.#t.rejectAffectedFrom(a,n.invalidatesOnFailure)):a!==null&&this.#t.reject(a)}catch{a!==null&&this.#t.reject(a)}throw this.#d(),this.error=e instanceof Error?e.message:String(e),e}finally{--this.#n,this.saving=this.#n>0,this.#n===0&&(this.#i=[])}})}#d(){this.state=this.#t.value}get manifestNames(){return Object.keys(this.state?.library.manifests??{}).sort()}manifestAppearance(e){return this.state?.library.manifests[e]??{}}get generalIssues(){return this.state?.issues.filter(e=>e.assetId===void 0).map(e=>e.message)??[]}assetById(e){return this.state?.assets.find(t=>t.id===e)??null}},$=class extends Error{constructor(){super(`Change was cancelled because an earlier structural save failed.`)}};export{re as $,ye as A,ne as B,L as C,T as D,A as E,h as F,pe as G,ce as H,m as I,se as J,u as K,x as L,v as M,b as N,xe as O,_ as P,ee as Q,l as R,Ee as S,M as T,le as U,fe as V,ae as W,oe as X,ie as Y,me as Z,H as _,He as a,I as b,Ve as c,Je as d,te as et,We as f,je as g,Me as h,qe as i,g as j,Se as k,Ge as l,Ae as m,Le as n,de as nt,Ke as o,ke as p,f as q,Ue as r,d as rt,Ye as s,Ze as t,ue as tt,Be as u,De as v,P as w,R as x,V as y,c as z};