fundus 0.17.2 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. package/README.md +60 -121
  2. package/build/client/_app/immutable/assets/2.C-1MfvLQ.css +1 -0
  3. package/build/client/_app/immutable/assets/2.C-1MfvLQ.css.br +0 -0
  4. package/build/client/_app/immutable/assets/2.C-1MfvLQ.css.gz +0 -0
  5. package/build/client/_app/immutable/assets/{3.66PJT3JC.css → 3.q3CUOEpz.css} +1 -1
  6. package/build/client/_app/immutable/assets/3.q3CUOEpz.css.br +0 -0
  7. package/build/client/_app/immutable/assets/3.q3CUOEpz.css.gz +0 -0
  8. package/build/client/_app/immutable/assets/{AssetSourceMenu.Buj2UxUg.css → AssetSourceMenu.CgyMTAb6.css} +1 -1
  9. package/build/client/_app/immutable/assets/AssetSourceMenu.CgyMTAb6.css.br +0 -0
  10. package/build/client/_app/immutable/assets/AssetSourceMenu.CgyMTAb6.css.gz +0 -0
  11. package/build/client/_app/immutable/chunks/Bly9uffh.js +1 -0
  12. package/build/client/_app/immutable/chunks/Bly9uffh.js.br +0 -0
  13. package/build/client/_app/immutable/chunks/Bly9uffh.js.gz +0 -0
  14. package/build/client/_app/immutable/chunks/{R0o69z6O.js → BpsKkIFc.js} +1 -1
  15. package/build/client/_app/immutable/chunks/BpsKkIFc.js.br +2 -0
  16. package/build/client/_app/immutable/chunks/BpsKkIFc.js.gz +0 -0
  17. package/build/client/_app/immutable/chunks/{jEVVu5G9.js → CrIZjnDr.js} +1 -1
  18. package/build/client/_app/immutable/chunks/CrIZjnDr.js.br +0 -0
  19. package/build/client/_app/immutable/chunks/CrIZjnDr.js.gz +0 -0
  20. package/build/client/_app/immutable/chunks/ZGU9Utak.js +108 -0
  21. package/build/client/_app/immutable/chunks/ZGU9Utak.js.br +0 -0
  22. package/build/client/_app/immutable/chunks/ZGU9Utak.js.gz +0 -0
  23. package/build/client/_app/immutable/chunks/lw3KP4og.js +2 -0
  24. package/build/client/_app/immutable/chunks/lw3KP4og.js.br +0 -0
  25. package/build/client/_app/immutable/chunks/lw3KP4og.js.gz +0 -0
  26. package/build/client/_app/immutable/entry/{app.DxYfHxs-.js → app.D-lO1MC-.js} +2 -2
  27. package/build/client/_app/immutable/entry/app.D-lO1MC-.js.br +0 -0
  28. package/build/client/_app/immutable/entry/app.D-lO1MC-.js.gz +0 -0
  29. package/build/client/_app/immutable/entry/start.BrSEFrid.js +1 -0
  30. package/build/client/_app/immutable/entry/start.BrSEFrid.js.br +1 -0
  31. package/build/client/_app/immutable/entry/start.BrSEFrid.js.gz +0 -0
  32. package/build/client/_app/immutable/nodes/{0.Do0MsVUC.js → 0.BPGg3A-F.js} +1 -1
  33. package/build/client/_app/immutable/nodes/0.BPGg3A-F.js.br +0 -0
  34. package/build/client/_app/immutable/nodes/0.BPGg3A-F.js.gz +0 -0
  35. package/build/client/_app/immutable/nodes/{1.DhfAdUbg.js → 1.-VJ5Mlss.js} +1 -1
  36. package/build/client/_app/immutable/nodes/1.-VJ5Mlss.js.br +1 -0
  37. package/build/client/_app/immutable/nodes/1.-VJ5Mlss.js.gz +0 -0
  38. package/build/client/_app/immutable/nodes/2.Dhyvb4bF.js +3 -0
  39. package/build/client/_app/immutable/nodes/2.Dhyvb4bF.js.br +0 -0
  40. package/build/client/_app/immutable/nodes/2.Dhyvb4bF.js.gz +0 -0
  41. package/build/client/_app/immutable/nodes/3.D9Fgsq-b.js +1 -0
  42. package/build/client/_app/immutable/nodes/3.D9Fgsq-b.js.br +0 -0
  43. package/build/client/_app/immutable/nodes/3.D9Fgsq-b.js.gz +0 -0
  44. package/build/client/_app/immutable/nodes/{4.gPNAednG.js → 4.DErtysFP.js} +1 -1
  45. package/build/client/_app/immutable/nodes/4.DErtysFP.js.br +0 -0
  46. package/build/client/_app/immutable/nodes/4.DErtysFP.js.gz +0 -0
  47. package/build/client/_app/version.json +1 -1
  48. package/build/client/_app/version.json.br +0 -0
  49. package/build/client/_app/version.json.gz +0 -0
  50. package/build/handler.js +7 -7
  51. package/build/index.js +7 -7
  52. package/build/server/chunks/chunks/{context.js-Dh0ibRIF.js → context.js-BIgcUcEl.js} +216 -604
  53. package/build/server/chunks/chunks/context.js-BIgcUcEl.js.map +1 -0
  54. package/build/server/chunks/chunks/{contract.js-_LTMZBo2.js → contract.js-B6KBK8D9.js} +59 -95
  55. package/build/server/chunks/chunks/contract.js-B6KBK8D9.js.map +1 -0
  56. package/build/server/chunks/chunks/{core.js-CTyKR4bu.js → core.js-Bp-ReC60.js} +38 -38
  57. package/build/server/chunks/chunks/core.js-Bp-ReC60.js.map +1 -0
  58. package/build/server/chunks/chunks/dependencies.js-pUkjICr5.js +45 -0
  59. package/build/server/chunks/chunks/dependencies.js-pUkjICr5.js.map +1 -0
  60. package/build/server/chunks/chunks/{exports.js-gUMFfqhw.js → exports.js-bhKV7cEL.js} +2 -2
  61. package/build/server/chunks/chunks/{exports.js-gUMFfqhw.js.map → exports.js-bhKV7cEL.js.map} +1 -1
  62. package/build/server/chunks/chunks/{http.js-BiqUcAuu.js → http.js-BTq44nR5.js} +2 -2
  63. package/build/server/chunks/chunks/{http.js-BiqUcAuu.js.map → http.js-BTq44nR5.js.map} +1 -1
  64. package/build/server/chunks/chunks/{internal.js-DvC1GD8s.js → internal.js-7MmaxxwZ.js} +3 -3
  65. package/build/server/chunks/chunks/{internal.js-DvC1GD8s.js.map → internal.js-7MmaxxwZ.js.map} +1 -1
  66. package/build/server/chunks/chunks/internal2.js-BlXt2rfE.js.map +1 -1
  67. package/build/server/chunks/chunks/{manifest-membership.js-at1ixQdW.js → manifest-membership.js-Dj3WwZgz.js} +2 -2
  68. package/build/server/chunks/chunks/{manifest-membership.js-at1ixQdW.js.map → manifest-membership.js-Dj3WwZgz.js.map} +1 -1
  69. package/build/server/chunks/chunks/{raw-reconciliation.js-CUH8IIJx.js → raw-reconciliation.js-mWOAOdgL.js} +3 -3
  70. package/build/server/chunks/chunks/raw-reconciliation.js-mWOAOdgL.js.map +1 -0
  71. package/build/server/chunks/chunks/{raw-reconciliation2.js-z4xl5zw2.js → raw-reconciliation2.js-Bo1jJgvd.js} +2 -2
  72. package/build/server/chunks/chunks/{raw-reconciliation2.js-z4xl5zw2.js.map → raw-reconciliation2.js-Bo1jJgvd.js.map} +1 -1
  73. package/build/server/chunks/chunks/{shared.js-nXNT--BO.js → shared.js-B0m3s2U9.js} +2 -2
  74. package/build/server/chunks/chunks/{shared.js-nXNT--BO.js.map → shared.js-B0m3s2U9.js.map} +1 -1
  75. package/build/server/chunks/chunks/{utils.js-C5pr7OK-.js → utils.js-BXV0zq44.js} +3 -3
  76. package/build/server/chunks/chunks/{utils.js-C5pr7OK-.js.map → utils.js-BXV0zq44.js.map} +1 -1
  77. package/build/server/chunks/entries/endpoints/api/_...path_/{_server.ts.js-CdDjuW0r.js → _server.ts.js-B_aa_zh7.js} +6 -6
  78. package/build/server/chunks/entries/endpoints/api/_...path_/{_server.ts.js-CdDjuW0r.js.map → _server.ts.js-B_aa_zh7.js.map} +1 -1
  79. package/build/server/chunks/entries/endpoints/api/assets/_id_/{_server.ts.js-OWM1eORG.js → _server.ts.js-DbEPdkbO.js} +8 -8
  80. package/build/server/chunks/entries/endpoints/api/assets/_id_/{_server.ts.js-OWM1eORG.js.map → _server.ts.js-DbEPdkbO.js.map} +1 -1
  81. package/build/server/chunks/entries/endpoints/api/assets/_id_/raw/{_server.ts.js-DoG-7ZpZ.js → _server.ts.js-BzA96yBM.js} +8 -8
  82. package/build/server/chunks/entries/endpoints/api/assets/_id_/raw/{_server.ts.js-DoG-7ZpZ.js.map → _server.ts.js-BzA96yBM.js.map} +1 -1
  83. package/build/server/chunks/entries/endpoints/api/assets/_id_/reimport/{_server.ts.js-CAWjVeGd.js → _server.ts.js-fQAXFRLh.js} +8 -8
  84. package/build/server/chunks/entries/endpoints/api/assets/_id_/reimport/{_server.ts.js-CAWjVeGd.js.map → _server.ts.js-fQAXFRLh.js.map} +1 -1
  85. package/build/server/chunks/entries/endpoints/api/assets/_id_/retag/{_server.ts.js-CqS4aALY.js → _server.ts.js-RTBrlhk5.js} +8 -8
  86. package/build/server/chunks/entries/endpoints/api/assets/_id_/retag/{_server.ts.js-CqS4aALY.js.map → _server.ts.js-RTBrlhk5.js.map} +1 -1
  87. package/build/server/chunks/entries/endpoints/api/assets/{_server.ts.js-Bo_EsYXJ.js → _server.ts.js-Baz4gPRd.js} +8 -8
  88. package/build/server/chunks/entries/endpoints/api/assets/{_server.ts.js-Bo_EsYXJ.js.map → _server.ts.js-Baz4gPRd.js.map} +1 -1
  89. package/build/server/chunks/entries/endpoints/api/assets/delete/{_server.ts.js-DW4w0XAr.js → _server.ts.js-CnqdPxWQ.js} +8 -8
  90. package/build/server/chunks/entries/endpoints/api/assets/delete/{_server.ts.js-DW4w0XAr.js.map → _server.ts.js-CnqdPxWQ.js.map} +1 -1
  91. package/build/server/chunks/entries/endpoints/api/assets/move/{_server.ts.js-_MiNPnSy.js → _server.ts.js-bvrtSRDz.js} +8 -8
  92. package/build/server/chunks/entries/endpoints/api/assets/move/{_server.ts.js-_MiNPnSy.js.map → _server.ts.js-bvrtSRDz.js.map} +1 -1
  93. package/build/server/chunks/entries/endpoints/api/folders/_path_/{_server.ts.js-DwbrQnBc.js → _server.ts.js-cgYcVXgU.js} +8 -8
  94. package/build/server/chunks/entries/endpoints/api/folders/_path_/{_server.ts.js-DwbrQnBc.js.map → _server.ts.js-cgYcVXgU.js.map} +1 -1
  95. package/build/server/chunks/entries/endpoints/api/folders/{_server.ts.js-CEnHQf3b.js → _server.ts.js-DbXw3YEr.js} +8 -8
  96. package/build/server/chunks/entries/endpoints/api/folders/{_server.ts.js-CEnHQf3b.js.map → _server.ts.js-DbXw3YEr.js.map} +1 -1
  97. package/build/server/chunks/entries/endpoints/api/imports/{_server.ts.js-BZDuJZtF.js → _server.ts.js-D0PEYlzG.js} +8 -8
  98. package/build/server/chunks/entries/endpoints/api/imports/{_server.ts.js-BZDuJZtF.js.map → _server.ts.js-D0PEYlzG.js.map} +1 -1
  99. package/build/server/chunks/entries/endpoints/api/manifests/_name_/{_server.ts.js-DRgdpKKd.js → _server.ts.js-Dt9Wfgs7.js} +8 -8
  100. package/build/server/chunks/entries/endpoints/api/manifests/_name_/{_server.ts.js-DRgdpKKd.js.map → _server.ts.js-Dt9Wfgs7.js.map} +1 -1
  101. package/build/server/chunks/entries/endpoints/api/manifests/{_server.ts.js-CP5QyIhz.js → _server.ts.js-BBuZYakQ.js} +8 -8
  102. package/build/server/chunks/entries/endpoints/api/manifests/{_server.ts.js-CP5QyIhz.js.map → _server.ts.js-BBuZYakQ.js.map} +1 -1
  103. package/build/server/chunks/entries/endpoints/api/raw/adopt/{_server.ts.js-BKEvt065.js → _server.ts.js-DQ_CWMTu.js} +8 -8
  104. package/build/server/chunks/entries/endpoints/api/raw/adopt/{_server.ts.js-BKEvt065.js.map → _server.ts.js-DQ_CWMTu.js.map} +1 -1
  105. package/build/server/chunks/entries/endpoints/api/raw/edited/accept/{_server.ts.js-C_zihkDS.js → _server.ts.js-B3TVoDCl.js} +8 -8
  106. package/build/server/chunks/entries/endpoints/api/raw/edited/accept/{_server.ts.js-C_zihkDS.js.map → _server.ts.js-B3TVoDCl.js.map} +1 -1
  107. package/build/server/chunks/entries/endpoints/api/raw/edited/dismiss/{_server.ts.js-watkBmy6.js → _server.ts.js--2C2x6Q0.js} +8 -8
  108. package/build/server/chunks/entries/endpoints/api/raw/edited/dismiss/{_server.ts.js-watkBmy6.js.map → _server.ts.js--2C2x6Q0.js.map} +1 -1
  109. package/build/server/chunks/entries/endpoints/api/reconcile/{_server.ts.js-YtumLIou.js → _server.ts.js-DD2Hz15k.js} +8 -8
  110. package/build/server/chunks/entries/endpoints/api/reconcile/{_server.ts.js-YtumLIou.js.map → _server.ts.js-DD2Hz15k.js.map} +1 -1
  111. package/build/server/chunks/entries/endpoints/api/reveal/{_server.ts.js-Dkouuu-M.js → _server.ts.js-Ei98ilB5.js} +8 -8
  112. package/build/server/chunks/entries/endpoints/api/reveal/{_server.ts.js-Dkouuu-M.js.map → _server.ts.js-Ei98ilB5.js.map} +1 -1
  113. package/build/server/chunks/entries/endpoints/api/state/{_server.ts.js-DwsEQeuf.js → _server.ts.js-NNuDGwyK.js} +8 -8
  114. package/build/server/chunks/entries/endpoints/api/state/{_server.ts.js-DwsEQeuf.js.map → _server.ts.js-NNuDGwyK.js.map} +1 -1
  115. package/build/server/chunks/entries/endpoints/api/usage/{_server.ts.js-CdQxfhV3.js → _server.ts.js-6_Wl_k0H.js} +8 -8
  116. package/build/server/chunks/entries/endpoints/api/usage/{_server.ts.js-CdQxfhV3.js.map → _server.ts.js-6_Wl_k0H.js.map} +1 -1
  117. package/build/server/chunks/entries/endpoints/files/_...path_/{_server.ts.js-DDdMocWj.js → _server.ts.js-DkYQlG9U.js} +6 -6
  118. package/build/server/chunks/entries/endpoints/files/_...path_/{_server.ts.js-DDdMocWj.js.map → _server.ts.js-DkYQlG9U.js.map} +1 -1
  119. package/build/server/chunks/entries/endpoints/files/proxy/_...path_/{_server.ts.js-DbzjbH32.js → _server.ts.js-Dft0Zgh3.js} +8 -8
  120. package/build/server/chunks/entries/endpoints/files/proxy/_...path_/{_server.ts.js-DbzjbH32.js.map → _server.ts.js-Dft0Zgh3.js.map} +1 -1
  121. package/build/server/chunks/entries/endpoints/files/raw/_...path_/{_server.ts.js-K_JbXZsU.js → _server.ts.js-rlV0QRQS.js} +8 -8
  122. package/build/server/chunks/entries/endpoints/files/raw/_...path_/{_server.ts.js-K_JbXZsU.js.map → _server.ts.js-rlV0QRQS.js.map} +1 -1
  123. package/build/server/chunks/entries/{hooks.server.js-DgZAVFbQ.js → hooks.server.js-C345JVQ2.js} +7 -7
  124. package/build/server/chunks/entries/{hooks.server.js-DgZAVFbQ.js.map → hooks.server.js-C345JVQ2.js.map} +1 -1
  125. package/build/server/chunks/{handler-C4m7sKKb.js → handler-C_S3CtEF.js} +5 -5
  126. package/build/server/chunks/{handler-C4m7sKKb.js.map → handler-C_S3CtEF.js.map} +1 -1
  127. package/build/server/chunks/{index.js-pAnkrzRH.js → index.js-CSCxgyyg.js} +5 -5
  128. package/build/server/chunks/{index.js-pAnkrzRH.js.map → index.js-CSCxgyyg.js.map} +1 -1
  129. package/build/server/chunks/{manifest.js-CXQHeYnS.js → manifest.js-CO6AjAUm.js} +30 -30
  130. package/build/server/chunks/{manifest.js-CXQHeYnS.js.map → manifest.js-CO6AjAUm.js.map} +1 -1
  131. package/build/server/chunks/nodes/{0.js-lmQMhWZd.js → 0.js-CRc8onmc.js} +2 -2
  132. package/build/server/chunks/nodes/{0.js-lmQMhWZd.js.map → 0.js-CRc8onmc.js.map} +1 -1
  133. package/build/server/chunks/nodes/1.js-CZm_Doa7.js +7 -0
  134. package/build/server/chunks/nodes/{1.js-CdH3UJI2.js.map → 1.js-CZm_Doa7.js.map} +1 -1
  135. package/build/server/chunks/nodes/2.js-B92vn1Hu.js +7 -0
  136. package/build/server/chunks/nodes/2.js-B92vn1Hu.js.map +1 -0
  137. package/build/server/chunks/nodes/3.js-C14BP7Jm.js +7 -0
  138. package/build/server/chunks/nodes/3.js-C14BP7Jm.js.map +1 -0
  139. package/build/server/chunks/nodes/4.js-BLNdVCa1.js +7 -0
  140. package/build/server/chunks/nodes/{4.js-DtgDNAZF.js.map → 4.js-BLNdVCa1.js.map} +1 -1
  141. package/dist/config.d.ts +5 -3
  142. package/dist/config.js +3 -2
  143. package/dist/core/api-types.d.ts +7 -22
  144. package/dist/core/config.d.ts +8 -82
  145. package/dist/core/config.js +0 -9
  146. package/dist/core/dependencies.d.ts +52 -0
  147. package/dist/core/dependencies.js +56 -0
  148. package/dist/core/dependency-validation.d.ts +17 -0
  149. package/dist/core/dependency-validation.js +19 -0
  150. package/dist/core/index.d.ts +8 -10
  151. package/dist/core/index.js +4 -5
  152. package/dist/core/library.d.ts +0 -19
  153. package/dist/core/library.js +4 -4
  154. package/dist/core/manifest-membership.d.ts +2 -2
  155. package/dist/core/reference-graph.d.ts +3 -3
  156. package/dist/server/build.js +12 -26
  157. package/dist/server/check.d.ts +3 -13
  158. package/dist/server/check.js +33 -112
  159. package/dist/server/codegen.d.ts +1 -3
  160. package/dist/server/codegen.js +0 -18
  161. package/dist/server/config-loader.d.ts +10 -33
  162. package/dist/server/config-loader.js +87 -156
  163. package/dist/server/index.d.ts +1 -1
  164. package/dist/server/index.js +1 -1
  165. package/dist/server/library-store.d.ts +1 -11
  166. package/dist/server/library-store.js +60 -42
  167. package/dist/server/operations.js +54 -161
  168. package/package.json +1 -1
  169. package/build/client/_app/immutable/assets/2.X44Wyac-.css +0 -1
  170. package/build/client/_app/immutable/assets/2.X44Wyac-.css.br +0 -0
  171. package/build/client/_app/immutable/assets/2.X44Wyac-.css.gz +0 -0
  172. package/build/client/_app/immutable/assets/3.66PJT3JC.css.br +0 -0
  173. package/build/client/_app/immutable/assets/3.66PJT3JC.css.gz +0 -0
  174. package/build/client/_app/immutable/assets/AssetSourceMenu.Buj2UxUg.css.br +0 -0
  175. package/build/client/_app/immutable/assets/AssetSourceMenu.Buj2UxUg.css.gz +0 -0
  176. package/build/client/_app/immutable/chunks/0SQyBKXe.js +0 -108
  177. package/build/client/_app/immutable/chunks/0SQyBKXe.js.br +0 -0
  178. package/build/client/_app/immutable/chunks/0SQyBKXe.js.gz +0 -0
  179. package/build/client/_app/immutable/chunks/DXiUbZ9S.js +0 -2
  180. package/build/client/_app/immutable/chunks/DXiUbZ9S.js.br +0 -0
  181. package/build/client/_app/immutable/chunks/DXiUbZ9S.js.gz +0 -0
  182. package/build/client/_app/immutable/chunks/R0o69z6O.js.br +0 -0
  183. package/build/client/_app/immutable/chunks/R0o69z6O.js.gz +0 -0
  184. package/build/client/_app/immutable/chunks/TrnW_5ju.js +0 -1
  185. package/build/client/_app/immutable/chunks/TrnW_5ju.js.br +0 -0
  186. package/build/client/_app/immutable/chunks/TrnW_5ju.js.gz +0 -0
  187. package/build/client/_app/immutable/chunks/jEVVu5G9.js.br +0 -0
  188. package/build/client/_app/immutable/chunks/jEVVu5G9.js.gz +0 -0
  189. package/build/client/_app/immutable/entry/app.DxYfHxs-.js.br +0 -0
  190. package/build/client/_app/immutable/entry/app.DxYfHxs-.js.gz +0 -0
  191. package/build/client/_app/immutable/entry/start.CdM7ozdO.js +0 -1
  192. package/build/client/_app/immutable/entry/start.CdM7ozdO.js.br +0 -0
  193. package/build/client/_app/immutable/entry/start.CdM7ozdO.js.gz +0 -0
  194. package/build/client/_app/immutable/nodes/0.Do0MsVUC.js.br +0 -0
  195. package/build/client/_app/immutable/nodes/0.Do0MsVUC.js.gz +0 -0
  196. package/build/client/_app/immutable/nodes/1.DhfAdUbg.js.br +0 -1
  197. package/build/client/_app/immutable/nodes/1.DhfAdUbg.js.gz +0 -0
  198. package/build/client/_app/immutable/nodes/2.lLNAdU5s.js +0 -3
  199. package/build/client/_app/immutable/nodes/2.lLNAdU5s.js.br +0 -0
  200. package/build/client/_app/immutable/nodes/2.lLNAdU5s.js.gz +0 -0
  201. package/build/client/_app/immutable/nodes/3.DA8xzCvA.js +0 -1
  202. package/build/client/_app/immutable/nodes/3.DA8xzCvA.js.br +0 -0
  203. package/build/client/_app/immutable/nodes/3.DA8xzCvA.js.gz +0 -0
  204. package/build/client/_app/immutable/nodes/4.gPNAednG.js.br +0 -0
  205. package/build/client/_app/immutable/nodes/4.gPNAednG.js.gz +0 -0
  206. package/build/server/chunks/chunks/context.js-Dh0ibRIF.js.map +0 -1
  207. package/build/server/chunks/chunks/contract.js-_LTMZBo2.js.map +0 -1
  208. package/build/server/chunks/chunks/core.js-CTyKR4bu.js.map +0 -1
  209. package/build/server/chunks/chunks/raw-reconciliation.js-CUH8IIJx.js.map +0 -1
  210. package/build/server/chunks/nodes/1.js-CdH3UJI2.js +0 -7
  211. package/build/server/chunks/nodes/2.js-BHnsJqcE.js +0 -7
  212. package/build/server/chunks/nodes/2.js-BHnsJqcE.js.map +0 -1
  213. package/build/server/chunks/nodes/3.js-cR9NdrYS.js +0 -7
  214. package/build/server/chunks/nodes/3.js-cR9NdrYS.js.map +0 -1
  215. package/build/server/chunks/nodes/4.js-DtgDNAZF.js +0 -7
  216. package/dist/core/library-validation.d.ts +0 -13
  217. package/dist/core/library-validation.js +0 -48
  218. package/dist/core/package-declaration.d.ts +0 -43
  219. package/dist/core/package-declaration.js +0 -80
  220. package/dist/core/package-merge.d.ts +0 -65
  221. package/dist/core/package-merge.js +0 -173
@@ -7,10 +7,9 @@
7
7
  */
8
8
  import { readFile } from 'node:fs/promises';
9
9
  import { join } from 'node:path';
10
- import { assetIdError, allDeliveredAssetIds, canonicalizeParameters, collectAllReferences, compareCodeUnits, computeLibraryMembership, flatLibraryIssues, folderOfRawPath, materializeLibrary, mergePackages, normalizeFolderPath, parentFolderPath, portableFolderPathKey, proposeAssetId, rawFileNameOfPath, serializeLibrary, typesForFileName } from '../core/index.js';
10
+ import { assetIdError, allDeliveredAssetIds, canonicalizeParameters, collectAllReferences, compareCodeUnits, computeLibraryMembership, folderOfRawPath, normalizeFolderPath, parentFolderPath, portableFolderPathKey, proposeAssetId, rawFileNameOfPath, serializeLibrary, typesForFileName, validateDependencies } from '../core/index.js';
11
11
  import { LibraryStore } from './library-store.js';
12
- import { generateManifestModules, locateGeneratedAssetDeclaration, manifestModuleCollisionIssues, manifestModuleFileName } from './codegen.js';
13
- import { packageSlotFindings } from './check.js';
12
+ import { generateManifestModules, locateGeneratedAssetDeclaration, manifestModuleFileName } from './codegen.js';
14
13
  import { descriptorsByType, serverPluginForType, serverPluginsByType } from './plugins.js';
15
14
  import { processAssets, readCurrentProxy } from './processing/processor.js';
16
15
  import { encodeRelativePathForUrl } from './folder-filesystem.js';
@@ -600,65 +599,36 @@ export class FundusOperations {
600
599
  this.#validateImportedRaw(raw);
601
600
  const fileName = raw.suggestedFileName ?? `${options.id}.${raw.extension}`;
602
601
  const plugin = serverPluginForType(options.type, this.#registry);
603
- // Filling a Package slot writes a host override that inherits the Package's
604
- // parameters via the deep merge, so the override is partial. Byte-derived
605
- // fields the Package can't author — the slice pixelRatio from the import
606
- // scale — must still be supplied here; an explicit patch then wins.
607
- const packageBase = this.#packageBase(await this.#store.read(), options.id);
608
- if (packageBase && packageBase.type !== options.type) {
609
- throw new SourceImportError('invalid-input', `Filling slot "${options.id}" requires the package type "${packageBase.type}", not "${options.type}".`);
610
- }
611
- let slotOverride = {};
612
- if (packageBase) {
602
+ const library = await this.#store.createAsset({
603
+ fileName,
604
+ bytes: raw.bytes,
605
+ type: options.type,
606
+ id: options.id,
607
+ folder: options.folder,
608
+ manifests: options.manifests,
609
+ importSource: raw.importSource
610
+ }, async ({ rawPath, rawFileName, parameters }) => {
611
+ let next = parameters;
612
+ if (plugin.seedIngestParameters) {
613
+ const seeded = await plugin.seedIngestParameters({
614
+ rawPath,
615
+ rawFileName,
616
+ parameters: next,
617
+ config: this.#config
618
+ });
619
+ if (seeded !== undefined)
620
+ next = seeded;
621
+ }
622
+ // Source scale is a default: an explicit parametersPatch below still wins.
613
623
  const pixelRatio = figmaSlicePixelRatio(raw, options.type);
614
624
  if (pixelRatio !== undefined) {
615
- slotOverride = mergeParameterPatch(slotOverride, { pixelRatio });
625
+ next = mergeParameterPatch(next, { pixelRatio });
616
626
  }
617
627
  if (options.parametersPatch !== undefined) {
618
- slotOverride = mergeParameterPatch(slotOverride, options.parametersPatch);
628
+ next = mergeParameterPatch(next, options.parametersPatch);
619
629
  }
620
- }
621
- const library = packageBase
622
- ? await this.#store.createAsset({
623
- fileName,
624
- bytes: raw.bytes,
625
- type: options.type,
626
- id: options.id,
627
- folder: options.folder,
628
- manifests: options.manifests,
629
- importSource: raw.importSource,
630
- parametersOverride: slotOverride
631
- })
632
- : await this.#store.createAsset({
633
- fileName,
634
- bytes: raw.bytes,
635
- type: options.type,
636
- id: options.id,
637
- folder: options.folder,
638
- manifests: options.manifests,
639
- importSource: raw.importSource
640
- }, async ({ rawPath, rawFileName, parameters }) => {
641
- let next = parameters;
642
- if (plugin.seedIngestParameters) {
643
- const seeded = await plugin.seedIngestParameters({
644
- rawPath,
645
- rawFileName,
646
- parameters: next,
647
- config: this.#config
648
- });
649
- if (seeded !== undefined)
650
- next = seeded;
651
- }
652
- // Source scale is a default: an explicit parametersPatch below still wins.
653
- const pixelRatio = figmaSlicePixelRatio(raw, options.type);
654
- if (pixelRatio !== undefined) {
655
- next = mergeParameterPatch(next, { pixelRatio });
656
- }
657
- if (options.parametersPatch !== undefined) {
658
- next = mergeParameterPatch(next, options.parametersPatch);
659
- }
660
- return plugin.descriptor.validateParameters(next);
661
- });
630
+ return plugin.descriptor.validateParameters(next);
631
+ });
662
632
  return this.#afterMutation(library);
663
633
  }
664
634
  #validateImportTarget(options, library) {
@@ -683,10 +653,8 @@ export class FundusOperations {
683
653
  options.manifests.some((value) => typeof value !== 'string'))) {
684
654
  throw new SourceImportError('invalid-input', 'Import manifests must be an array of strings.');
685
655
  }
686
- // A placement may target a Package-introduced manifest (host + package union).
687
- const validManifests = this.#effectiveOf(library).effective.manifests;
688
656
  for (const manifest of new Set(options.manifests ?? [])) {
689
- if (!Object.hasOwn(validManifests, manifest)) {
657
+ if (!Object.hasOwn(library.manifests, manifest)) {
690
658
  throw new SourceImportError('invalid-input', `Unknown manifest "${manifest}".`);
691
659
  }
692
660
  }
@@ -710,9 +678,7 @@ export class FundusOperations {
710
678
  }
711
679
  async #patchAsset(id, body) {
712
680
  let library = await this.#store.read();
713
- // A pure Package asset is read-only; fill/override it by importing bytes
714
- // with its id. Host assets and existing overrides patch normally.
715
- this.#assertHostAsset(library, id, 'editing it');
681
+ this.#requireAsset(library, id);
716
682
  if (body.parameters !== undefined) {
717
683
  library = await this.#store.updateParameters(id, body.parameters);
718
684
  }
@@ -934,19 +900,12 @@ export class FundusOperations {
934
900
  async #runAfterMutation(library) {
935
901
  const pipelineIssues = [];
936
902
  const classification = await this.#classifyRawDirectory(library);
937
- const { effective, provenance, mergeFindings } = this.#effectiveOf(library);
938
- const materialized = materializeLibrary(effective);
939
- const ordinaryIssues = [
940
- ...(await this.#store.validate(library, { flatSpace: false })),
941
- ...this.#flatIssues(effective, provenance, mergeFindings)
942
- ];
903
+ const ordinaryIssues = await this.#store.validate(library);
943
904
  const safetyIssues = this.#rawSafetyIssues(library, classification);
944
905
  if (ordinaryIssues.length === 0 && safetyIssues.length === 0) {
945
906
  try {
946
- // Codegen runs over the merged, materialized library so the dev server
947
- // writes the same modules `fundus build`/`fundus check` expect.
948
- const report = await processAssets(this.#config, materialized, this.#registry);
949
- await generateManifestModules(this.#config, materialized, report.proxies, this.#registry);
907
+ const report = await processAssets(this.#config, library, this.#registry);
908
+ await generateManifestModules(this.#config, library, report.proxies, this.#registry);
950
909
  }
951
910
  catch (cause) {
952
911
  pipelineIssues.push({
@@ -962,15 +921,13 @@ export class FundusOperations {
962
921
  state: await this.#snapshotState(latestLibrary, latestClassification, pipelineIssues)
963
922
  };
964
923
  }
965
- async #buildState(host, library, provenance, issues, classification) {
924
+ async #buildState(library, issues, classification) {
966
925
  const [gitBranch, changedGitAssets] = await Promise.all([
967
926
  currentGitBranch(this.#config.projectRoot),
968
- // Git diff over the host library only — Package assets are not host-owned
969
- // and would otherwise all read as "new".
970
- gitAssetChanges(this.#config.projectRoot, this.#config.library, host)
927
+ gitAssetChanges(this.#config.projectRoot, this.#config.library, library)
971
928
  ]);
972
929
  const referencesByAsset = collectAllReferences(library, descriptorsByType(this.#registry));
973
- const duplicatesByAsset = await this.#duplicateDetector.find(host, this.#config.rawDir);
930
+ const duplicatesByAsset = await this.#duplicateDetector.find(library, this.#config.rawDir);
974
931
  const membershipByManifest = computeLibraryMembership(library, referencesByAsset);
975
932
  const delivered = allDeliveredAssetIds(membershipByManifest);
976
933
  // Per asset: the manifests it is a passive member of, with attribution.
@@ -990,17 +947,15 @@ export class FundusOperations {
990
947
  incomingByAsset.set(reference.assetId, incoming);
991
948
  }
992
949
  }
950
+ // Which dependency sources declare each asset id (D2), so the editor can
951
+ // flag required assets and warn before deleting one.
952
+ const requiredByAsset = new Map();
953
+ for (const dependency of this.#config.dependencies) {
954
+ requiredByAsset.set(dependency.id, [...dependency.sources]);
955
+ }
993
956
  const assets = [];
994
957
  for (const assetId of Object.keys(library.assets).sort(compareCodeUnits)) {
995
958
  const record = library.assets[assetId];
996
- const prov = provenance[assetId] ?? { source: 'host' };
997
- const origin = prov.source === 'host'
998
- ? { kind: 'host' }
999
- : prov.source === 'package'
1000
- ? { kind: 'package', origin: prov.origin }
1001
- : { kind: 'override', origin: prov.origin };
1002
- // An unfilled Package slot carries no bytes.
1003
- const isSlot = record.raw === undefined;
1004
959
  const warnings = [];
1005
960
  for (const issue of issues) {
1006
961
  if (issue.assetId === assetId)
@@ -1008,9 +963,8 @@ export class FundusOperations {
1008
963
  }
1009
964
  // Unreachable: no explicit membership AND no passive membership in any
1010
965
  // manifest — nothing delivers the asset. A passively delivered asset is
1011
- // fine (it ships inlined into its referrers) and must not warn. An inert
1012
- // unfilled Package slot is not a host mistake and must not warn.
1013
- if (record.manifests.length === 0 && !delivered.has(assetId) && !isSlot) {
966
+ // fine (it ships inlined into its referrers) and must not warn.
967
+ if (record.manifests.length === 0 && !delivered.has(assetId)) {
1014
968
  warnings.push('In no manifest and not referenced by any delivered asset — ' +
1015
969
  'nothing is processed or generated for it.');
1016
970
  }
@@ -1018,7 +972,7 @@ export class FundusOperations {
1018
972
  warnings.push(`Importer "${record.importSource.importer}" is unavailable; the local raw file remains usable.`);
1019
973
  }
1020
974
  let proxy = null;
1021
- if (delivered.has(assetId) && !isSlot) {
975
+ if (delivered.has(assetId)) {
1022
976
  try {
1023
977
  const currentProxy = await readCurrentProxy(assetId, record, this.#config, this.#registry);
1024
978
  if (currentProxy) {
@@ -1036,17 +990,13 @@ export class FundusOperations {
1036
990
  warnings.push(cause instanceof Error ? cause.message : String(cause));
1037
991
  }
1038
992
  }
1039
- const raw = record.raw ?? '';
1040
- const rawHash = record.rawHash ?? '';
1041
993
  assets.push({
1042
994
  id: assetId,
1043
995
  type: record.type,
1044
- raw,
1045
- folder: folderOfRawPath(raw),
1046
- rawUrl: isSlot
1047
- ? ''
1048
- : `/files/raw/${encodeRelativePathForUrl(raw)}?v=${rawHash.slice(0, 12)}`,
1049
- rawHash,
996
+ raw: record.raw,
997
+ folder: folderOfRawPath(record.raw),
998
+ rawUrl: `/files/raw/${encodeRelativePathForUrl(record.raw)}?v=${record.rawHash.slice(0, 12)}`,
999
+ rawHash: record.rawHash,
1050
1000
  gitStatus: changedGitAssets.get(assetId) ?? null,
1051
1001
  importSource: record.importSource,
1052
1002
  parameters: record.parameters,
@@ -1062,8 +1012,7 @@ export class FundusOperations {
1062
1012
  })),
1063
1013
  incoming: incomingByAsset.get(assetId) ?? []
1064
1014
  },
1065
- origin,
1066
- overridden: origin.kind === 'override'
1015
+ requiredBy: requiredByAsset.get(assetId) ?? []
1067
1016
  });
1068
1017
  }
1069
1018
  // Per manifest: the membership picture for the manifests view, and the
@@ -1094,7 +1043,7 @@ export class FundusOperations {
1094
1043
  presetNames[type] = names;
1095
1044
  presetCapabilities[type] = Object.fromEntries(names.map((name) => [name, plugin.presetCapabilities?.(presets[name]) ?? {}]));
1096
1045
  }
1097
- const rawIngestionQueue = this.#buildRawIngestionQueue(host, classification);
1046
+ const rawIngestionQueue = this.#buildRawIngestionQueue(library, classification);
1098
1047
  return {
1099
1048
  gitBranch,
1100
1049
  library,
@@ -1112,8 +1061,7 @@ export class FundusOperations {
1112
1061
  presetCapabilities,
1113
1062
  manifestMemberships,
1114
1063
  manifestDeliveredBytes,
1115
- rawIngestionQueue,
1116
- packageOrigins: this.#config.packages.map((pkg) => pkg.origin).sort(compareCodeUnits)
1064
+ rawIngestionQueue
1117
1065
  };
1118
1066
  }
1119
1067
  #compatibleTypes(path) {
@@ -1126,11 +1074,10 @@ export class FundusOperations {
1126
1074
  return rawSafetyIssues(library, classification, (path) => this.#compatibleTypes(path));
1127
1075
  }
1128
1076
  async #snapshotState(library, classification, extraIssues = []) {
1129
- const { effective, provenance, mergeFindings } = this.#effectiveOf(library);
1130
1077
  const issues = [
1131
- ...(await this.#store.validate(library, { flatSpace: false })),
1132
- ...this.#flatIssues(effective, provenance, mergeFindings),
1078
+ ...(await this.#store.validate(library)),
1133
1079
  ...this.#rawSafetyIssues(library, classification),
1080
+ ...validateDependencies(this.#config.dependencies, library),
1134
1081
  ...extraIssues
1135
1082
  ];
1136
1083
  const seen = new Set();
@@ -1141,7 +1088,7 @@ export class FundusOperations {
1141
1088
  seen.add(key);
1142
1089
  return true;
1143
1090
  });
1144
- return this.#buildState(library, effective, provenance, uniqueIssues, classification);
1091
+ return this.#buildState(library, uniqueIssues, classification);
1145
1092
  }
1146
1093
  #canAutoReconcile(classification, retry = false) {
1147
1094
  return (classification.complete &&
@@ -1247,60 +1194,6 @@ export class FundusOperations {
1247
1194
  throw new Error(`Unknown asset "${id}".`);
1248
1195
  }
1249
1196
  }
1250
- /** Merge the configured Packages under the host library (host wins). */
1251
- #effectiveOf(host) {
1252
- const { library, provenance, findings } = mergePackages(host, this.#config.packages ?? []);
1253
- return { effective: library, provenance, mergeFindings: findings };
1254
- }
1255
- /**
1256
- * The Package base record for `id` when `id` is a read-only Package asset the
1257
- * host has not yet filled — i.e. this create is a *slot fill*. Returns null
1258
- * for a plain new host asset.
1259
- */
1260
- #packageBase(host, id) {
1261
- if (Object.hasOwn(host.assets, id))
1262
- return null;
1263
- const { effective, provenance } = this.#effectiveOf(host);
1264
- if (provenance[id]?.source === 'package')
1265
- return { type: effective.assets[id].type };
1266
- return null;
1267
- }
1268
- /**
1269
- * Flat-space validation over the effective library: merge errors, id/type/
1270
- * parameter/membership/appearance/reference checks, module collisions, and
1271
- * delivered-slot findings. Disk/host checks stay in `store.validate(host,
1272
- * { flatSpace: false })`.
1273
- */
1274
- #flatIssues(effective, provenance, mergeFindings) {
1275
- const referencesByAsset = collectAllReferences(effective, descriptorsByType(this.#registry));
1276
- const membership = computeLibraryMembership(effective, referencesByAsset);
1277
- return [
1278
- ...mergeFindings
1279
- .filter((finding) => finding.kind !== 'package-overridden')
1280
- .map((finding) => ({ assetId: finding.assetId, message: finding.message })),
1281
- ...flatLibraryIssues(effective, descriptorsByType(this.#registry)),
1282
- ...manifestModuleCollisionIssues(effective.manifests),
1283
- ...packageSlotFindings(effective, provenance, membership).map((finding) => ({
1284
- assetId: finding.assetId,
1285
- message: finding.message
1286
- }))
1287
- ];
1288
- }
1289
- /**
1290
- * Whether an id is a read-only Package asset the host has not overridden.
1291
- * Such ids can be filled/overridden (write a host record) but not mutated,
1292
- * renamed, moved, or deleted in place.
1293
- */
1294
- #assertHostAsset(host, id, action) {
1295
- if (Object.hasOwn(host.assets, id))
1296
- return;
1297
- const { provenance } = this.#effectiveOf(host);
1298
- const prov = provenance[id];
1299
- if (prov && prov.source !== 'host') {
1300
- throw new Error(`Asset "${id}" is provided by package "${prov.origin}"; ${action} is not available. Override it by importing or uploading bytes with this id.`);
1301
- }
1302
- throw new Error(`Unknown asset "${id}".`);
1303
- }
1304
1197
  /**
1305
1198
  * Apply a CLI asset change to the store, validating the resulting library
1306
1199
  * on an in-memory candidate first — nothing is persisted when the change
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fundus",
3
- "version": "0.17.2",
3
+ "version": "0.19.0",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1 +0,0 @@
1
- .submenu-anchor.svelte-13hq4tl{position:relative}button.svelte-13hq4tl{width:100%;color:var(--text);font:inherit;text-align:left;white-space:nowrap;background:0 0;border:0;border-radius:4px;padding:6px 8px}button.svelte-13hq4tl:hover,button.svelte-13hq4tl:focus-visible{background:var(--accent-soft);outline:none}.submenu-anchor.svelte-13hq4tl:has(.submenu:where(.svelte-13hq4tl))>.submenu-trigger:where(.svelte-13hq4tl){background:var(--accent-soft);outline:none}button.svelte-13hq4tl:disabled{color:var(--text-faint);background:0 0}.submenu-trigger.svelte-13hq4tl{justify-content:space-between;align-items:center;gap:12px;display:flex}.arrow.svelte-13hq4tl{color:var(--text-faint);font-size:16px;line-height:12px}.submenu.svelte-13hq4tl{z-index:1;background:var(--panel-raised);border:1px solid var(--border);border-radius:6px;min-width:168px;max-width:320px;padding:4px;position:absolute;top:-5px;left:calc(100% - 4px);overflow-y:auto;box-shadow:0 8px 24px #00000073}.submenu.opens-left.svelte-13hq4tl{left:auto;right:calc(100% - 4px)}.submenu.svelte-13hq4tl button:where(.svelte-13hq4tl){text-overflow:ellipsis;overflow:hidden}hr.svelte-13hq4tl{background:var(--border);border:0;height:1px;margin:4px 8px}.context-menu.svelte-109nkvw{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-109nkvw{width:100%;color:var(--text);font:inherit;text-align:left;background:0 0;border:0;border-radius:4px;padding:6px 8px}button.svelte-109nkvw:hover,button.svelte-109nkvw:focus-visible{background:var(--accent-soft);outline:none}button.danger.svelte-109nkvw{color:var(--danger)}button.svelte-109nkvw:disabled{color:var(--text-dim);cursor:default}button.svelte-109nkvw:disabled:hover,button.svelte-109nkvw:disabled:focus-visible{background:0 0}hr.svelte-109nkvw{background:var(--border);border:0;height:1px;margin:4px 8px}.manifest-label.svelte-1b4m5oj{align-items:center;gap:4px;min-width:0;display:inline-flex}.emoji.svelte-1b4m5oj{flex:none;line-height:1}.name.svelte-1b4m5oj{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.chip.svelte-1b4m5oj{background:color-mix(in srgb, var(--manifest-color) 20%, transparent);color:var(--manifest-color);border-radius:4px;padding:0 5px;font-size:10px}.chip.passive.svelte-1b4m5oj{border:1px dashed var(--manifest-color);background:0 0}.browse-select.svelte-dr99ka{border-radius:4px;align-items:center;min-width:0;height:24px;padding:0 6px 0 0;display:inline-flex}.browse-select.svelte-dr99ka:focus-within{border-color:var(--accent)}.browse-select.filter-active.svelte-dr99ka{border-color:var(--accent);background:var(--accent-soft);color:var(--accent)}.browse-select.filter-active.svelte-dr99ka .icon-slot:where(.svelte-dr99ka){color:var(--accent)}.icon-slot.svelte-dr99ka{width:24px;height:24px;color:var(--text-dim);-webkit-user-select:none;user-select:none;flex:none;justify-content:center;align-items:center;display:flex}select.svelte-dr99ka{background:0 0;border:0;outline:none;min-width:0;height:100%;margin:0;padding:0 6px 0 0}.filter-field .popover-anchor{width:100%}.multi-select-trigger.svelte-1yxb8yh{text-align:left;border-radius:4px;align-items:center;gap:5px;width:100%;min-width:0;height:24px;padding:0 6px 0 0;display:flex}.multi-select-trigger.filter-active.svelte-1yxb8yh{border-color:var(--accent);background:var(--accent-soft);color:var(--accent)}.icon-slot.svelte-1yxb8yh{width:24px;height:24px;color:var(--text-dim);flex:none;place-items:center;display:grid}.filter-active.svelte-1yxb8yh .icon-slot:where(.svelte-1yxb8yh){color:var(--accent)}.summary.svelte-1yxb8yh{min-width:0;color:var(--text);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.filter-active.svelte-1yxb8yh .summary:where(.svelte-1yxb8yh){color:var(--accent)}.selected-count.svelte-1yxb8yh{background:var(--accent);min-width:15px;height:15px;color:var(--text);border-radius:999px;flex:none;place-items:center;padding:0 4px;font-size:9px;font-weight:700;display:grid}.multi-select-menu.svelte-1yxb8yh{width:max(160px, var(--multi-select-width,100%));min-width:160px}.menu-header.svelte-1yxb8yh{border-bottom:1px solid var(--border-soft);color:var(--text-dim);justify-content:space-between;align-items:center;gap:12px;padding:1px 4px 6px;font-size:10px;display:flex}.menu-header.svelte-1yxb8yh button:where(.svelte-1yxb8yh){color:var(--accent);font:inherit;background:0 0;border:0;padding:1px 2px}.menu-header.svelte-1yxb8yh button:where(.svelte-1yxb8yh):disabled{opacity:.4;cursor:default}.options.svelte-1yxb8yh{max-height:224px;padding-top:4px;overflow-y:auto}.options.svelte-1yxb8yh label:where(.svelte-1yxb8yh){border-radius:var(--radius-small);min-width:0;height:26px;color:var(--text);cursor:pointer;align-items:center;gap:7px;padding:0 5px;display:flex}.options.svelte-1yxb8yh label:where(.svelte-1yxb8yh):hover,.options.svelte-1yxb8yh label:where(.svelte-1yxb8yh):focus-within{background:var(--accent-soft)}.options.svelte-1yxb8yh label.selected:where(.svelte-1yxb8yh){color:var(--accent)}.options.svelte-1yxb8yh input:where(.svelte-1yxb8yh){width:12px;height:12px;accent-color:var(--accent);flex:none;margin:0}.options.svelte-1yxb8yh span:where(.svelte-1yxb8yh){text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.browse-checkbox.svelte-sa6meb{cursor:pointer;align-items:center;min-width:0;height:24px;display:inline-flex}.browse-checkbox.svelte-sa6meb:focus-within .value:where(.svelte-sa6meb){color:var(--accent)}.icon-slot.svelte-sa6meb{-webkit-user-select:none;user-select:none;flex:none;justify-content:center;align-items:center;width:24px;height:24px;display:flex}.value.svelte-sa6meb{min-width:0;color:var(--text);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:11px;line-height:14px;overflow:hidden}input.svelte-sa6meb{width:12px;height:12px;accent-color:var(--accent);margin:0}.library-view.svelte-1uha8ag{flex:1;min-height:0;display:flex}.page.svelte-1uha8ag{flex:1;min-height:0;padding:16px;position:relative;overflow-y:auto}.library-toolbar.svelte-1uha8ag{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:16px;display:flex}.library-toolbar.svelte-1uha8ag .control{border-radius:var(--radius-small);height:24px}.selection-controls.svelte-1uha8ag{align-items:center;gap:8px;display:inline-flex}.selection-action.svelte-1uha8ag:disabled{opacity:.45;cursor:default}.selection-action.svelte-1uha8ag{justify-content:center;align-items:center;display:inline-flex}.selection-summary.svelte-1uha8ag{color:var(--accent);white-space:nowrap;font-weight:600}.preview-size-control.svelte-1uha8ag{height:24px;color:var(--text-dim);cursor:default;align-items:center;gap:6px;margin-left:auto;padding:0 7px;display:inline-flex}.preview-size-icon.svelte-1uha8ag{fill:currentColor;flex:none;width:14px;height:14px}.preview-size-icon.dense.svelte-1uha8ag{color:var(--text-faint)}.preview-size-icon.dense.svelte-1uha8ag rect:where(.svelte-1uha8ag){rx:.75px;width:3px;height:3px}.preview-size-icon.roomy.svelte-1uha8ag rect:where(.svelte-1uha8ag){rx:1.25px}.preview-size-range.svelte-1uha8ag{appearance:none;cursor:pointer;background:0 0;flex:none;width:104px;height:14px;margin:0;padding:0}.preview-size-range.svelte-1uha8ag::-webkit-slider-runnable-track{background:linear-gradient(to right, var(--accent) 0 var(--preview-size-progress), var(--border) var(--preview-size-progress) 100%);border-radius:999px;height:3px}.preview-size-range.svelte-1uha8ag::-moz-range-track{background:var(--border);border-radius:999px;height:3px}.preview-size-range.svelte-1uha8ag::-moz-range-progress{background:var(--accent);border-radius:999px;height:3px}.preview-size-range.svelte-1uha8ag::-webkit-slider-thumb{border:2px solid var(--panel-raised);appearance:none;background:var(--accent);width:12px;height:12px;box-shadow:0 0 0 1px var(--accent);border-radius:50%;margin-top:-4.5px}.preview-size-range.svelte-1uha8ag::-moz-range-thumb{border:2px solid var(--panel-raised);background:var(--accent);width:8px;height:8px;box-shadow:0 0 0 1px var(--accent);border-radius:50%}.preview-size-range.svelte-1uha8ag:focus-visible{outline:none}.preview-size-range.svelte-1uha8ag:focus-visible::-webkit-slider-thumb{box-shadow:0 0 0 1px var(--accent), 0 0 0 4px var(--accent-soft)}.preview-size-range.svelte-1uha8ag:focus-visible::-moz-range-thumb{box-shadow:0 0 0 1px var(--accent), 0 0 0 4px var(--accent-soft)}.search.svelte-1uha8ag{flex:0 0 240px;align-items:center;gap:4px;width:240px;min-width:200px;height:24px;padding:0 6px 0 0;display:flex}.search.svelte-1uha8ag:focus-within{border-color:var(--accent)}.search.filter-active.svelte-1uha8ag{border-color:var(--accent);background:var(--accent-soft)}.search.filter-active.svelte-1uha8ag .search-icon-slot:where(.svelte-1uha8ag),.search.filter-active.svelte-1uha8ag kbd:where(.svelte-1uha8ag){color:var(--accent)}.search.filter-active.svelte-1uha8ag kbd:where(.svelte-1uha8ag){border-color:var(--accent)}.search-icon-slot.svelte-1uha8ag{width:24px;height:24px;color:var(--text-dim);flex:none;justify-content:center;align-items:center;display:flex}.search-icon.svelte-1uha8ag{fill:none;stroke:currentColor;stroke-width:1.5px;stroke-linecap:round;flex:none;width:14px;height:14px}.search-input.svelte-1uha8ag{min-width:0;height:100%;color:var(--text);font:inherit;background:0 0;border:0;outline:none;flex:1;padding:0}.search-input.svelte-1uha8ag::-webkit-search-cancel-button{appearance:none;background:var(--text-dim);cursor:pointer;width:12px;height:12px;margin:0;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Cpath d='m3 3 8 8m0-8-8 8' fill='none' stroke='black' stroke-linecap='round' stroke-width='2.25'/%3E%3C/svg%3E") 50%/12px 12px no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Cpath d='m3 3 8 8m0-8-8 8' fill='none' stroke='black' stroke-linecap='round' stroke-width='2.25'/%3E%3C/svg%3E") 50%/12px 12px no-repeat}.search.filter-active.svelte-1uha8ag .search-input:where(.svelte-1uha8ag)::-webkit-search-cancel-button{background:var(--accent)}.search.svelte-1uha8ag kbd:where(.svelte-1uha8ag){border:1px solid var(--border);color:var(--text-faint);border-radius:3px;flex:none;padding:1px 4px;font:9px/14px system-ui,sans-serif}.toolbar-button.svelte-1uha8ag,.import-trigger.svelte-1uha8ag{white-space:nowrap;justify-content:center;align-items:center;gap:6px;display:inline-flex}.toolbar-button.active.svelte-1uha8ag{border-color:var(--accent);background:var(--accent-soft);color:var(--accent)}.filter-count.svelte-1uha8ag{background:var(--accent);min-width:16px;height:16px;color:var(--text);border-radius:999px;place-items:center;padding:0 4px;font-size:10px;font-weight:700;display:inline-grid}.filters-popover.svelte-1uha8ag{width:min(480px,100vw - 24px)}.popover-header.svelte-1uha8ag{border-bottom:1px solid var(--border-soft);justify-content:space-between;align-items:center;gap:16px;padding:2px 2px 10px;display:flex}.popover-header.svelte-1uha8ag strong:where(.svelte-1uha8ag){color:var(--text);font-size:11px;font-weight:400}.clear-filters.svelte-1uha8ag{color:var(--accent);font:inherit;background:0 0;border:0;padding:2px 4px;font-size:11px}.clear-filters.svelte-1uha8ag:disabled{opacity:.4;cursor:default}.filter-grid.svelte-1uha8ag{grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;padding:10px 2px;display:grid}.filter-field.svelte-1uha8ag{flex-direction:column;gap:4px;min-width:0;display:flex}.filter-field.svelte-1uha8ag>span:where(.svelte-1uha8ag){color:#ffffffb2;letter-spacing:.27px;-webkit-user-select:none;user-select:none;font-size:9px;font-weight:500;line-height:14px}.filter-field.svelte-1uha8ag .browse-select,.filter-field.svelte-1uha8ag .browse-checkbox{width:100%}.filter-field.svelte-1uha8ag .browse-select select{flex:1;width:100%}.filter-options-grid.svelte-1uha8ag{padding-top:0;padding-bottom:2px}.filter-options-grid.svelte-1uha8ag .browse-checkbox,.filter-options-grid.svelte-1uha8ag .browse-checkbox .icon-slot{height:14px}.filter-options-grid.svelte-1uha8ag .browse-checkbox .icon-slot{justify-content:flex-start;align-items:flex-start;width:18px}@media (width<=560px){.filter-grid.svelte-1uha8ag{grid-template-columns:1fr}}@media (width<=1056px){.search.svelte-1uha8ag{flex-basis:100%;order:10;width:100%}}.section.svelte-1uha8ag{margin-bottom:24px}.section.svelte-1uha8ag:last-child{margin-bottom:0}.section-emoji.svelte-1uha8ag{margin-right:6px}.grid.svelte-1uha8ag,.folder-grid.svelte-1uha8ag{gap:8px;display:grid}.grid.svelte-1uha8ag{grid-template-columns:repeat(auto-fill, minmax(min(100%, var(--preview-card-width)), 1fr))}.folder-grid.svelte-1uha8ag{grid-template-columns:repeat(auto-fill,minmax(160px,1fr))}.folder-card.svelte-1uha8ag{background:var(--panel);border:1px solid var(--border-soft);min-width:0;height:60px;color:var(--text);text-align:left;border-radius:8px;align-items:center;gap:10px;padding:8px 10px;display:flex}.folder-card.svelte-1uha8ag:hover,.folder-card.svelte-1uha8ag:focus-visible{border-color:var(--accent);outline:none}.folder-card.drop-target.svelte-1uha8ag{border-color:var(--accent);background:var(--accent-soft);box-shadow:0 0 0 1px var(--accent)}.folder-card.dragging-folder.svelte-1uha8ag{opacity:.55}.folder-card-icon.svelte-1uha8ag{color:var(--text-dim);flex:none;align-items:center;display:flex}.folder-card-details.svelte-1uha8ag{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.folder-card-details.svelte-1uha8ag strong:where(.svelte-1uha8ag){text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.folder-card-details.svelte-1uha8ag span:where(.svelte-1uha8ag),.folder-card-arrow.svelte-1uha8ag{color:var(--text-faint)}.folder-card-arrow.svelte-1uha8ag{flex:none;font-size:18px}.card.svelte-1uha8ag{background:var(--panel);border:1px solid var(--border-soft);border-radius:8px;flex-direction:column;gap:clamp(4px,5cqi,8px);padding:clamp(4px,5cqi,8px);display:flex;position:relative;container-type:inline-size}.card.selected.svelte-1uha8ag{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}.asset-select.svelte-1uha8ag{z-index:1;width:16px;height:16px;accent-color:var(--accent);position:absolute;top:clamp(6px,8cqi,12px);left:clamp(6px,8cqi,12px)}.card.svelte-1uha8ag:hover{border-color:var(--accent)}.thumbnail.svelte-1uha8ag{width:100%;height:min(var(--preview-card-height), 66.667cqi);border-radius:var(--radius);justify-content:center;align-items:center;display:flex;overflow:hidden}.meta.svelte-1uha8ag{align-items:center;gap:6px;min-width:0;display:flex}.id.svelte-1uha8ag{text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.type-badge.svelte-1uha8ag{color:var(--text-dim);border:1px solid var(--border);border-radius:4px;flex:none;margin-left:auto;padding:0 5px;font-size:10px}.badges.svelte-1uha8ag{flex-wrap:wrap;gap:4px;min-height:16px;display:flex}.badge.svelte-1uha8ag{border-radius:4px;padding:0 5px;font-size:10px}.badge.warning.svelte-1uha8ag{background:var(--warning-soft);color:var(--warning)}@container (width<=109px){.type-badge.svelte-1uha8ag{display:none}.badges.svelte-1uha8ag{flex-wrap:nowrap;overflow:hidden}}@container (width<=79px){.card.svelte-1uha8ag>.overlay{background:var(--accent);border:0;width:6px;height:6px;padding:0;font-size:0;top:5px;left:auto;right:5px;transform:none}.card.svelte-1uha8ag>.overlay.edited{background:var(--warning)}.asset-select.svelte-1uha8ag{width:8px;height:8px;top:0;left:0;transform:translate(-8%,8%)}.meta.svelte-1uha8ag,.badges.svelte-1uha8ag{display:none}}.empty.svelte-1uha8ag{color:var(--text-dim);text-align:center;padding:48px}.dialog-row.svelte-1uha8ag{align-items:center;gap:8px;display:flex}.dialog-row.svelte-1uha8ag span:where(.svelte-1uha8ag){width:44px;color:var(--text-dim)}.dialog-row.svelte-1uha8ag input:where(.svelte-1uha8ag){flex:1}.dialog-text.svelte-1uha8ag,.dialog-warning.svelte-1uha8ag{margin:8px 0 0}.dialog-warning.svelte-1uha8ag{color:var(--warning)}.drop-hint.svelte-1uha8ag{border:2px dashed var(--accent);color:var(--accent);pointer-events:none;background:#0d99ff14;border-radius:12px;justify-content:center;align-items:center;font-size:14px;display:flex;position:fixed;inset:48px 8px 8px}