fundus 0.6.0 → 0.8.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 (212) hide show
  1. package/README.md +6 -1
  2. package/build/client/_app/immutable/assets/0.CHekvMpo.css +1 -0
  3. package/build/client/_app/immutable/assets/0.CHekvMpo.css.br +0 -0
  4. package/build/client/_app/immutable/assets/0.CHekvMpo.css.gz +0 -0
  5. package/build/client/_app/immutable/assets/2.CK3PVkJ5.css +1 -0
  6. package/build/client/_app/immutable/assets/2.CK3PVkJ5.css.br +0 -0
  7. package/build/client/_app/immutable/assets/2.CK3PVkJ5.css.gz +0 -0
  8. package/build/client/_app/immutable/assets/FileChangeBadge.C6wwUZJS.css +1 -0
  9. package/build/client/_app/immutable/assets/FileChangeBadge.C6wwUZJS.css.br +0 -0
  10. package/build/client/_app/immutable/assets/FileChangeBadge.C6wwUZJS.css.gz +0 -0
  11. package/build/client/_app/immutable/assets/LibraryContextMenu.BSnKt_Is.css +1 -0
  12. package/build/client/_app/immutable/assets/LibraryContextMenu.BSnKt_Is.css.br +0 -0
  13. package/build/client/_app/immutable/assets/LibraryContextMenu.BSnKt_Is.css.gz +0 -0
  14. package/build/client/_app/immutable/assets/ManifestSelector.Cue3sCA1.css +1 -0
  15. package/build/client/_app/immutable/assets/ManifestSelector.Cue3sCA1.css.br +0 -0
  16. package/build/client/_app/immutable/assets/ManifestSelector.Cue3sCA1.css.gz +0 -0
  17. package/build/client/_app/immutable/chunks/4FCfXqUa.js +1 -0
  18. package/build/client/_app/immutable/chunks/4FCfXqUa.js.br +0 -0
  19. package/build/client/_app/immutable/chunks/4FCfXqUa.js.gz +0 -0
  20. package/build/client/_app/immutable/chunks/{D24lHNM9.js → B6BtXxR0.js} +1 -1
  21. package/build/client/_app/immutable/chunks/B6BtXxR0.js.br +0 -0
  22. package/build/client/_app/immutable/chunks/B6BtXxR0.js.gz +0 -0
  23. package/build/client/_app/immutable/chunks/BD3hQKzV.js +1 -0
  24. package/build/client/_app/immutable/chunks/BD3hQKzV.js.br +0 -0
  25. package/build/client/_app/immutable/chunks/BD3hQKzV.js.gz +0 -0
  26. package/build/client/_app/immutable/chunks/{BT3jFrxa.js → BEbRZpHw.js} +1 -1
  27. package/build/client/_app/immutable/chunks/BEbRZpHw.js.br +1 -0
  28. package/build/client/_app/immutable/chunks/BEbRZpHw.js.gz +0 -0
  29. package/build/client/_app/immutable/chunks/BVDR6adL.js +1 -0
  30. package/build/client/_app/immutable/chunks/BVDR6adL.js.br +0 -0
  31. package/build/client/_app/immutable/chunks/BVDR6adL.js.gz +0 -0
  32. package/build/client/_app/immutable/chunks/BX8lJS3k.js +108 -0
  33. package/build/client/_app/immutable/chunks/BX8lJS3k.js.br +0 -0
  34. package/build/client/_app/immutable/chunks/BX8lJS3k.js.gz +0 -0
  35. package/build/client/_app/immutable/chunks/DPZDGjcn.js +1 -0
  36. package/build/client/_app/immutable/chunks/DPZDGjcn.js.br +0 -0
  37. package/build/client/_app/immutable/chunks/DPZDGjcn.js.gz +0 -0
  38. package/build/client/_app/immutable/chunks/NblqapDQ.js +3 -0
  39. package/build/client/_app/immutable/chunks/NblqapDQ.js.br +0 -0
  40. package/build/client/_app/immutable/chunks/NblqapDQ.js.gz +0 -0
  41. package/build/client/_app/immutable/entry/app.CH6AvWYr.js +2 -0
  42. package/build/client/_app/immutable/entry/app.CH6AvWYr.js.br +0 -0
  43. package/build/client/_app/immutable/entry/app.CH6AvWYr.js.gz +0 -0
  44. package/build/client/_app/immutable/entry/start.v9Hgefer.js +1 -0
  45. package/build/client/_app/immutable/entry/start.v9Hgefer.js.br +0 -0
  46. package/build/client/_app/immutable/entry/start.v9Hgefer.js.gz +0 -0
  47. package/build/client/_app/immutable/nodes/0.bYfuwnNW.js +2 -0
  48. package/build/client/_app/immutable/nodes/0.bYfuwnNW.js.br +0 -0
  49. package/build/client/_app/immutable/nodes/0.bYfuwnNW.js.gz +0 -0
  50. package/build/client/_app/immutable/nodes/1.kv-uSGjV.js +1 -0
  51. package/build/client/_app/immutable/nodes/1.kv-uSGjV.js.br +2 -1
  52. package/build/client/_app/immutable/nodes/1.kv-uSGjV.js.gz +0 -0
  53. package/build/client/_app/immutable/nodes/2.B0CNEieI.js +3 -0
  54. package/build/client/_app/immutable/nodes/2.B0CNEieI.js.br +0 -0
  55. package/build/client/_app/immutable/nodes/2.B0CNEieI.js.gz +0 -0
  56. package/build/client/_app/immutable/nodes/3.K5eLxWD7.js +1 -0
  57. package/build/client/_app/immutable/nodes/3.K5eLxWD7.js.br +0 -0
  58. package/build/client/_app/immutable/nodes/3.K5eLxWD7.js.gz +0 -0
  59. package/build/client/_app/immutable/nodes/4.DXitiaKH.js +2 -0
  60. package/build/client/_app/immutable/nodes/4.DXitiaKH.js.br +0 -0
  61. package/build/client/_app/immutable/nodes/4.DXitiaKH.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-FvYkJDOy.js → context.js-CPdlcRhV.js} +157 -3
  68. package/build/server/chunks/chunks/context.js-CPdlcRhV.js.map +1 -0
  69. package/build/server/chunks/chunks/{contract.js-DGMufT2e.js → contract.js-nwG99Zzj.js} +2 -2
  70. package/build/server/chunks/chunks/{contract.js-DGMufT2e.js.map → contract.js-nwG99Zzj.js.map} +1 -1
  71. package/build/server/chunks/chunks/{exports.js-Bepiq5XZ.js → exports.js-Ci6jkE-z.js} +2 -2
  72. package/build/server/chunks/chunks/{exports.js-Bepiq5XZ.js.map → exports.js-Ci6jkE-z.js.map} +1 -1
  73. package/build/server/chunks/chunks/{http.js-DWYlsbZd.js → http.js-DmUA2gRk.js} +2 -2
  74. package/build/server/chunks/chunks/{http.js-DWYlsbZd.js.map → http.js-DmUA2gRk.js.map} +1 -1
  75. package/build/server/chunks/chunks/{internal.js-Cy01GWTk.js → internal.js-DWu3OCGw.js} +3 -3
  76. package/build/server/chunks/chunks/{internal.js-Cy01GWTk.js.map → internal.js-DWu3OCGw.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-b0LBJ1Hx.js → shared.js-BIggwEH0.js} +2 -2
  79. package/build/server/chunks/chunks/{shared.js-b0LBJ1Hx.js.map → shared.js-BIggwEH0.js.map} +1 -1
  80. package/build/server/chunks/chunks/{utils.js-CecFjHB0.js → utils.js-Dxvg75XM.js} +3 -3
  81. package/build/server/chunks/chunks/{utils.js-CecFjHB0.js.map → utils.js-Dxvg75XM.js.map} +1 -1
  82. package/build/server/chunks/entries/endpoints/api/_...path_/{_server.ts.js-Bmyh2WUa.js → _server.ts.js-wQD5tBuh.js} +3 -3
  83. package/build/server/chunks/entries/endpoints/api/_...path_/{_server.ts.js-Bmyh2WUa.js.map → _server.ts.js-wQD5tBuh.js.map} +1 -1
  84. package/build/server/chunks/entries/endpoints/api/assets/_id_/{_server.ts.js-hoRG5JRv.js → _server.ts.js-CLCx81uK.js} +4 -4
  85. package/build/server/chunks/entries/endpoints/api/assets/_id_/{_server.ts.js-hoRG5JRv.js.map → _server.ts.js-CLCx81uK.js.map} +1 -1
  86. package/build/server/chunks/entries/endpoints/api/assets/_id_/raw/{_server.ts.js-BdO9kwrn.js → _server.ts.js-DkvELcZA.js} +4 -4
  87. package/build/server/chunks/entries/endpoints/api/assets/_id_/raw/{_server.ts.js-BdO9kwrn.js.map → _server.ts.js-DkvELcZA.js.map} +1 -1
  88. package/build/server/chunks/entries/endpoints/api/assets/_id_/reimport/{_server.ts.js-BojOH5gj.js → _server.ts.js-CCNcWQxH.js} +4 -4
  89. package/build/server/chunks/entries/endpoints/api/assets/_id_/reimport/{_server.ts.js-BojOH5gj.js.map → _server.ts.js-CCNcWQxH.js.map} +1 -1
  90. package/build/server/chunks/entries/endpoints/api/assets/{_server.ts.js-DWIptU3K.js → _server.ts.js-DUK4Rnpu.js} +4 -4
  91. package/build/server/chunks/entries/endpoints/api/assets/{_server.ts.js-DWIptU3K.js.map → _server.ts.js-DUK4Rnpu.js.map} +1 -1
  92. package/build/server/chunks/entries/endpoints/api/assets/delete/{_server.ts.js-CaiOgcPc.js → _server.ts.js-DNgHnoga.js} +4 -4
  93. package/build/server/chunks/entries/endpoints/api/assets/delete/{_server.ts.js-CaiOgcPc.js.map → _server.ts.js-DNgHnoga.js.map} +1 -1
  94. package/build/server/chunks/entries/endpoints/api/assets/move/{_server.ts.js-Bug1Y1W9.js → _server.ts.js-gdXko55o.js} +4 -4
  95. package/build/server/chunks/entries/endpoints/api/assets/move/{_server.ts.js-Bug1Y1W9.js.map → _server.ts.js-gdXko55o.js.map} +1 -1
  96. package/build/server/chunks/entries/endpoints/api/folders/_path_/{_server.ts.js-B9N7cPff.js → _server.ts.js-DcsBk_jx.js} +4 -4
  97. package/build/server/chunks/entries/endpoints/api/folders/_path_/{_server.ts.js-B9N7cPff.js.map → _server.ts.js-DcsBk_jx.js.map} +1 -1
  98. package/build/server/chunks/entries/endpoints/api/folders/{_server.ts.js-CiWdcZEv.js → _server.ts.js-BhTg6GgC.js} +4 -4
  99. package/build/server/chunks/entries/endpoints/api/folders/{_server.ts.js-CiWdcZEv.js.map → _server.ts.js-BhTg6GgC.js.map} +1 -1
  100. package/build/server/chunks/entries/endpoints/api/imports/{_server.ts.js-CNqGzdRB.js → _server.ts.js-CKjnRFXQ.js} +4 -4
  101. package/build/server/chunks/entries/endpoints/api/imports/{_server.ts.js-CNqGzdRB.js.map → _server.ts.js-CKjnRFXQ.js.map} +1 -1
  102. package/build/server/chunks/entries/endpoints/api/manifests/_name_/{_server.ts.js-BHwcGKE_.js → _server.ts.js-C9rdzmoj.js} +4 -4
  103. package/build/server/chunks/entries/endpoints/api/manifests/_name_/{_server.ts.js-BHwcGKE_.js.map → _server.ts.js-C9rdzmoj.js.map} +1 -1
  104. package/build/server/chunks/entries/endpoints/api/manifests/{_server.ts.js-CPoTCXQk.js → _server.ts.js-BdZb4d69.js} +4 -4
  105. package/build/server/chunks/entries/endpoints/api/manifests/{_server.ts.js-CPoTCXQk.js.map → _server.ts.js-BdZb4d69.js.map} +1 -1
  106. package/build/server/chunks/entries/endpoints/api/raw/adopt/{_server.ts.js-iDOU2RdK.js → _server.ts.js-DaTgBGGt.js} +4 -4
  107. package/build/server/chunks/entries/endpoints/api/raw/adopt/{_server.ts.js-iDOU2RdK.js.map → _server.ts.js-DaTgBGGt.js.map} +1 -1
  108. package/build/server/chunks/entries/endpoints/api/raw/edited/accept/{_server.ts.js-DikbQm3f.js → _server.ts.js-Btohjiz4.js} +4 -4
  109. package/build/server/chunks/entries/endpoints/api/raw/edited/accept/{_server.ts.js-DikbQm3f.js.map → _server.ts.js-Btohjiz4.js.map} +1 -1
  110. package/build/server/chunks/entries/endpoints/api/raw/edited/dismiss/{_server.ts.js-DTdHkWuR.js → _server.ts.js-D0alWeVb.js} +4 -4
  111. package/build/server/chunks/entries/endpoints/api/raw/edited/dismiss/{_server.ts.js-DTdHkWuR.js.map → _server.ts.js-D0alWeVb.js.map} +1 -1
  112. package/build/server/chunks/entries/endpoints/api/reconcile/{_server.ts.js-Cn8hwP5P.js → _server.ts.js-CRNi0bmU.js} +4 -4
  113. package/build/server/chunks/entries/endpoints/api/reconcile/{_server.ts.js-Cn8hwP5P.js.map → _server.ts.js-CRNi0bmU.js.map} +1 -1
  114. package/build/server/chunks/entries/endpoints/api/reveal/{_server.ts.js-BdUCIBJ_.js → _server.ts.js-B6C1DDpq.js} +19 -7
  115. package/build/server/chunks/entries/endpoints/api/reveal/_server.ts.js-B6C1DDpq.js.map +1 -0
  116. package/build/server/chunks/entries/endpoints/api/state/{_server.ts.js-CBLdZJZB.js → _server.ts.js-qPKxHQ-e.js} +4 -4
  117. package/build/server/chunks/entries/endpoints/api/state/{_server.ts.js-CBLdZJZB.js.map → _server.ts.js-qPKxHQ-e.js.map} +1 -1
  118. package/build/server/chunks/entries/endpoints/files/_...path_/{_server.ts.js-DVtQlFHS.js → _server.ts.js-BjioCWTI.js} +3 -3
  119. package/build/server/chunks/entries/endpoints/files/_...path_/{_server.ts.js-DVtQlFHS.js.map → _server.ts.js-BjioCWTI.js.map} +1 -1
  120. package/build/server/chunks/entries/endpoints/files/proxy/_...path_/{_server.ts.js-CY_gjOPq.js → _server.ts.js-BzUFg_ur.js} +4 -4
  121. package/build/server/chunks/entries/endpoints/files/proxy/_...path_/{_server.ts.js-CY_gjOPq.js.map → _server.ts.js-BzUFg_ur.js.map} +1 -1
  122. package/build/server/chunks/entries/endpoints/files/raw/_...path_/{_server.ts.js-BOfjGM87.js → _server.ts.js-CrjUXxJT.js} +4 -4
  123. package/build/server/chunks/entries/endpoints/files/raw/_...path_/{_server.ts.js-BOfjGM87.js.map → _server.ts.js-CrjUXxJT.js.map} +1 -1
  124. package/build/server/chunks/entries/{hooks.server.js-BH0-wX67.js → hooks.server.js-DQ8kZ3N2.js} +3 -3
  125. package/build/server/chunks/entries/{hooks.server.js-BH0-wX67.js.map → hooks.server.js-DQ8kZ3N2.js.map} +1 -1
  126. package/build/server/chunks/{handler-DMnHzDi5.js → handler-CJ8lsr6W.js} +5 -5
  127. package/build/server/chunks/{handler-DMnHzDi5.js.map → handler-CJ8lsr6W.js.map} +1 -1
  128. package/build/server/chunks/{index.js-BbOitM8j.js → index.js-Ph6LJ5Na.js} +5 -5
  129. package/build/server/chunks/{index.js-BbOitM8j.js.map → index.js-Ph6LJ5Na.js.map} +1 -1
  130. package/build/server/chunks/{manifest.js-EeQkh4Qe.js → manifest.js-CWjy0GQ9.js} +28 -28
  131. package/build/server/chunks/{manifest.js-EeQkh4Qe.js.map → manifest.js-CWjy0GQ9.js.map} +1 -1
  132. package/build/server/chunks/nodes/0.js-s3yR2Abv.js +11 -0
  133. package/build/server/chunks/nodes/0.js-s3yR2Abv.js.map +1 -0
  134. package/build/server/chunks/nodes/1.js-BKDWaQXi.js +7 -0
  135. package/build/server/chunks/nodes/{1.js-GmjtwLZL.js.map → 1.js-BKDWaQXi.js.map} +1 -1
  136. package/build/server/chunks/nodes/2.js-BuHtNZN4.js +7 -0
  137. package/build/server/chunks/nodes/2.js-BuHtNZN4.js.map +1 -0
  138. package/build/server/chunks/nodes/3.js-CxLEr5zC.js +7 -0
  139. package/build/server/chunks/nodes/3.js-CxLEr5zC.js.map +1 -0
  140. package/build/server/chunks/nodes/4.js-BoG4R0fU.js +7 -0
  141. package/build/server/chunks/nodes/{4.js-CtmXxVg2.js.map → 4.js-BoG4R0fU.js.map} +1 -1
  142. package/dist/core/api-types.d.ts +4 -0
  143. package/dist/server/cli-commands.d.ts +1 -1
  144. package/dist/server/cli-commands.js +125 -11
  145. package/dist/server/config-loader.d.ts +2 -0
  146. package/dist/server/config-loader.js +1 -0
  147. package/dist/server/git.d.ts +10 -0
  148. package/dist/server/git.js +148 -0
  149. package/dist/server/operations.js +7 -0
  150. package/package.json +1 -1
  151. package/build/client/_app/immutable/assets/0.inkPq3ni.css +0 -1
  152. package/build/client/_app/immutable/assets/0.inkPq3ni.css.br +0 -0
  153. package/build/client/_app/immutable/assets/0.inkPq3ni.css.gz +0 -0
  154. package/build/client/_app/immutable/assets/2.CtqoikFs.css +0 -1
  155. package/build/client/_app/immutable/assets/2.CtqoikFs.css.br +0 -0
  156. package/build/client/_app/immutable/assets/2.CtqoikFs.css.gz +0 -0
  157. package/build/client/_app/immutable/assets/LibraryContextMenu.CVIa_uFP.css +0 -1
  158. package/build/client/_app/immutable/assets/LibraryContextMenu.CVIa_uFP.css.br +0 -0
  159. package/build/client/_app/immutable/assets/LibraryContextMenu.CVIa_uFP.css.gz +0 -0
  160. package/build/client/_app/immutable/assets/ManifestSelector.Il8p28r8.css +0 -1
  161. package/build/client/_app/immutable/assets/ManifestSelector.Il8p28r8.css.br +0 -0
  162. package/build/client/_app/immutable/assets/ManifestSelector.Il8p28r8.css.gz +0 -0
  163. package/build/client/_app/immutable/chunks/BT3jFrxa.js.br +0 -1
  164. package/build/client/_app/immutable/chunks/BT3jFrxa.js.gz +0 -0
  165. package/build/client/_app/immutable/chunks/CPFeEkfP.js +0 -108
  166. package/build/client/_app/immutable/chunks/CPFeEkfP.js.br +0 -0
  167. package/build/client/_app/immutable/chunks/CPFeEkfP.js.gz +0 -0
  168. package/build/client/_app/immutable/chunks/CQrHfI-c.js +0 -1
  169. package/build/client/_app/immutable/chunks/CQrHfI-c.js.br +0 -0
  170. package/build/client/_app/immutable/chunks/CQrHfI-c.js.gz +0 -0
  171. package/build/client/_app/immutable/chunks/D0BLX4Qd.js +0 -1
  172. package/build/client/_app/immutable/chunks/D0BLX4Qd.js.br +0 -0
  173. package/build/client/_app/immutable/chunks/D0BLX4Qd.js.gz +0 -0
  174. package/build/client/_app/immutable/chunks/D24lHNM9.js.br +0 -0
  175. package/build/client/_app/immutable/chunks/D24lHNM9.js.gz +0 -0
  176. package/build/client/_app/immutable/chunks/D65cSBhe.js +0 -3
  177. package/build/client/_app/immutable/chunks/D65cSBhe.js.br +0 -0
  178. package/build/client/_app/immutable/chunks/D65cSBhe.js.gz +0 -0
  179. package/build/client/_app/immutable/chunks/D6VoU_x4.js +0 -1
  180. package/build/client/_app/immutable/chunks/D6VoU_x4.js.br +0 -0
  181. package/build/client/_app/immutable/chunks/D6VoU_x4.js.gz +0 -0
  182. package/build/client/_app/immutable/entry/app.DmVWkUml.js +0 -2
  183. package/build/client/_app/immutable/entry/app.DmVWkUml.js.br +0 -0
  184. package/build/client/_app/immutable/entry/app.DmVWkUml.js.gz +0 -0
  185. package/build/client/_app/immutable/entry/start.Dsf5wSaR.js +0 -1
  186. package/build/client/_app/immutable/entry/start.Dsf5wSaR.js.br +0 -0
  187. package/build/client/_app/immutable/entry/start.Dsf5wSaR.js.gz +0 -0
  188. package/build/client/_app/immutable/nodes/0.l-jE2v4o.js +0 -2
  189. package/build/client/_app/immutable/nodes/0.l-jE2v4o.js.br +0 -0
  190. package/build/client/_app/immutable/nodes/0.l-jE2v4o.js.gz +0 -0
  191. package/build/client/_app/immutable/nodes/1.CRPVOtEh.js +0 -1
  192. package/build/client/_app/immutable/nodes/1.CRPVOtEh.js.br +0 -3
  193. package/build/client/_app/immutable/nodes/1.CRPVOtEh.js.gz +0 -0
  194. package/build/client/_app/immutable/nodes/2.8Si6qHSH.js +0 -3
  195. package/build/client/_app/immutable/nodes/2.8Si6qHSH.js.br +0 -0
  196. package/build/client/_app/immutable/nodes/2.8Si6qHSH.js.gz +0 -0
  197. package/build/client/_app/immutable/nodes/3.CdI42Umt.js +0 -1
  198. package/build/client/_app/immutable/nodes/3.CdI42Umt.js.br +0 -0
  199. package/build/client/_app/immutable/nodes/3.CdI42Umt.js.gz +0 -0
  200. package/build/client/_app/immutable/nodes/4.mMkL80q1.js +0 -2
  201. package/build/client/_app/immutable/nodes/4.mMkL80q1.js.br +0 -0
  202. package/build/client/_app/immutable/nodes/4.mMkL80q1.js.gz +0 -0
  203. package/build/server/chunks/chunks/context.js-FvYkJDOy.js.map +0 -1
  204. package/build/server/chunks/entries/endpoints/api/reveal/_server.ts.js-BdUCIBJ_.js.map +0 -1
  205. package/build/server/chunks/nodes/0.js-CS9Xzs-1.js +0 -11
  206. package/build/server/chunks/nodes/0.js-CS9Xzs-1.js.map +0 -1
  207. package/build/server/chunks/nodes/1.js-GmjtwLZL.js +0 -7
  208. package/build/server/chunks/nodes/2.js-Pip0Abb-.js +0 -7
  209. package/build/server/chunks/nodes/2.js-Pip0Abb-.js.map +0 -1
  210. package/build/server/chunks/nodes/3.js-CJKDeQST.js +0 -7
  211. package/build/server/chunks/nodes/3.js-CJKDeQST.js.map +0 -1
  212. package/build/server/chunks/nodes/4.js-CtmXxVg2.js +0 -7
@@ -257,10 +257,13 @@ Example:
257
257
  export const ASSET_INGEST_HELP = `fundus asset ingest — acquire a file or Figma selection as a typed asset
258
258
 
259
259
  Usage: fundus asset ingest <file> [--type <type>] [--id <id>] [--folder <path|root>]
260
- [--manifests <a,b>] [--parameters <json>] [--from file] [--json]
260
+ [--manifests <a,b>] [--parameters <json>]
261
+ [--compression-x <0-100>] [--compression-y <0-100>]
262
+ [--from file] [--json]
261
263
  fundus asset ingest <figma-selection-link> --from figma --type <image|slice> --id <id>
262
264
  [--scale <1|2|3|4>] [--folder <path|root>]
263
- [--manifests <a,b>] [--parameters <json>] [--json]
265
+ [--manifests <a,b>] [--parameters <json>]
266
+ [--compression-x <0-100>] [--compression-y <0-100>] [--json]
264
267
 
265
268
  File ingest remains the default and behaves like an editor upload. Figma
266
269
  ingest materializes one selection as PNG through the same importer-neutral
@@ -278,6 +281,10 @@ Flags:
278
281
  --manifests <a,b> explicit manifest membership (every name must exist)
279
282
  --parameters <json> shallow parameter patch merged after ingest seeding
280
283
  (see \`fundus asset set --help\`)
284
+ --compression-x <0-100>
285
+ --compression-y <0-100>
286
+ percentage compression of a Slice asset's horizontal or
287
+ vertical stretch region; omitted axes default to 0
281
288
  --scale <1|2|3|4> Figma export scale; default:
282
289
  import.figma.defaults.scale from fundus.config.ts
283
290
  (invalid for file ingest)
@@ -287,7 +294,8 @@ Flags:
287
294
  A failed ingest leaves neither a raw file nor a record behind.
288
295
 
289
296
  Example:
290
- fundus asset ingest ./exports/navigation_panel@2x.png --type slice --json
297
+ fundus asset ingest ./exports/navigation_panel@2x.png --type slice \\
298
+ --compression-x 75 --compression-y 25 --json
291
299
  fundus asset ingest 'https://www.figma.com/design/abc/UI?node-id=12-34' \\
292
300
  --from figma --type slice --id navigationPanel --scale 3 --json
293
301
  `;
@@ -332,10 +340,11 @@ Example:
332
340
  `;
333
341
  export const ASSET_SET_HELP = `fundus asset set — update an asset's parameters and/or memberships
334
342
 
335
- Usage: fundus asset set <id> [--parameters <json>] [--manifests <a,b>] [--json]
343
+ Usage: fundus asset set <id> [--parameters <json>] [--manifests <a,b>]
344
+ [--compression-x <0-100>] [--compression-y <0-100>] [--json]
336
345
 
337
- At least one of --parameters/--manifests is required. Runs the full
338
- autosave chain (write library → process → regenerate manifest modules).
346
+ At least one change flag is required. Runs the full autosave chain
347
+ (write library → process → regenerate manifest modules).
339
348
 
340
349
  Flags:
341
350
  --parameters <json> SHALLOW MERGE at the top level onto the current
@@ -351,6 +360,12 @@ Flags:
351
360
  reference
352
361
  --manifests <a,b> REPLACES the explicit membership set (declarative,
353
362
  idempotent); --manifests "" clears it
363
+ --compression-x <0-100>
364
+ --compression-y <0-100>
365
+ set one Slice stretch-compression axis while preserving
366
+ the omitted axis; setting both axes to 0 removes
367
+ compression. These values override compression supplied
368
+ through --parameters in the same invocation
354
369
  --json print {"ok": true, "asset": <AssetStateDto>, "issues": […]}
355
370
  --help this help
356
371
 
@@ -360,6 +375,7 @@ asset, a reference cycle, or an unknown manifest name. Ingest reference
360
375
  targets before pointing at them.
361
376
 
362
377
  Example:
378
+ fundus asset set navigationPanel --compression-x 75 --compression-y 25 --json
363
379
  fundus asset set characterIdle \\
364
380
  --parameters '{"mask": {"$asset": "characterIdleMask"}}' --json
365
381
  `;
@@ -492,6 +508,70 @@ function inferTypeForFileName(fileName) {
492
508
  }
493
509
  throw new Error(`The ".${extension}" extension is ambiguous — pass --type <${candidates.join('|')}>.`);
494
510
  }
511
+ function parseCompressionPercentage(name, value, commandPath) {
512
+ if (value === undefined)
513
+ return undefined;
514
+ if (typeof value !== 'string' || !/^\d+$/.test(value) || Number(value) > 100) {
515
+ throw new CliUsageError(`Flag "--${name}" must be an integer from 0 to 100 — run \`${commandPath} --help\`.`);
516
+ }
517
+ return Number(value);
518
+ }
519
+ function parseSliceCompressionFlags(flags, commandPath) {
520
+ const x = parseCompressionPercentage('compression-x', flags['compression-x'], commandPath);
521
+ const y = parseCompressionPercentage('compression-y', flags['compression-y'], commandPath);
522
+ if (x === undefined && y === undefined)
523
+ return undefined;
524
+ return {
525
+ ...(x !== undefined ? { x } : {}),
526
+ ...(y !== undefined ? { y } : {})
527
+ };
528
+ }
529
+ function parameterPatchRecord(parametersPatch) {
530
+ if (typeof parametersPatch !== 'object' ||
531
+ parametersPatch === null ||
532
+ Array.isArray(parametersPatch)) {
533
+ throw new Error('The parameter patch must be a JSON object, e.g. {"preset": "default"}.');
534
+ }
535
+ return parametersPatch;
536
+ }
537
+ function compressionFromParameters(parameters) {
538
+ if (typeof parameters !== 'object' || parameters === null || Array.isArray(parameters)) {
539
+ return { x: 0, y: 0 };
540
+ }
541
+ const compression = parameters.compression;
542
+ if (typeof compression !== 'object' || compression === null || Array.isArray(compression)) {
543
+ return { x: 0, y: 0 };
544
+ }
545
+ return compression;
546
+ }
547
+ /** Add the ergonomic per-axis flags to the generic top-level parameter patch. */
548
+ function applySliceCompressionFlags(options) {
549
+ if (options.flags === undefined)
550
+ return options.parametersPatch;
551
+ if (options.type !== 'slice') {
552
+ throw new CliUsageError(`Flags "--compression-x" and "--compression-y" are only valid for Slice assets — run \`${options.commandPath} --help\`.`);
553
+ }
554
+ const patch = options.parametersPatch === undefined ? {} : parameterPatchRecord(options.parametersPatch);
555
+ let compression = compressionFromParameters(options.currentParameters);
556
+ if (Object.hasOwn(patch, 'compression')) {
557
+ if (patch.compression === null) {
558
+ compression = { x: 0, y: 0 };
559
+ }
560
+ else if (typeof patch.compression === 'object' &&
561
+ patch.compression !== null &&
562
+ !Array.isArray(patch.compression)) {
563
+ compression = { ...compression, ...patch.compression };
564
+ }
565
+ else {
566
+ throw new Error('Slice compression must be an object with x/y percentages.');
567
+ }
568
+ }
569
+ const nextCompression = { ...compression, ...options.flags };
570
+ return {
571
+ ...patch,
572
+ compression: nextCompression.x === 0 && nextCompression.y === 0 ? null : nextCompression
573
+ };
574
+ }
495
575
  async function runAssetIngest(argumentList) {
496
576
  const parsed = parseArguments(argumentList, {
497
577
  ...COMMON_FLAGS,
@@ -499,6 +579,8 @@ async function runAssetIngest(argumentList) {
499
579
  id: { takesValue: true },
500
580
  manifests: { takesValue: true },
501
581
  parameters: { takesValue: true },
582
+ 'compression-x': { takesValue: true },
583
+ 'compression-y': { takesValue: true },
502
584
  folder: { takesValue: true },
503
585
  from: { takesValue: true },
504
586
  scale: { takesValue: true }
@@ -514,9 +596,10 @@ async function runAssetIngest(argumentList) {
514
596
  if (from === 'file' && scale !== undefined) {
515
597
  throw new CliUsageError('Flag "--scale" is only valid with `--from figma` — run `fundus asset ingest --help`.');
516
598
  }
517
- const parametersPatch = typeof parsed.flags.parameters === 'string'
599
+ let parametersPatch = typeof parsed.flags.parameters === 'string'
518
600
  ? parseJsonFlag('parameters', parsed.flags.parameters)
519
601
  : undefined;
602
+ const compressionFlags = parseSliceCompressionFlags(parsed.flags, 'fundus asset ingest');
520
603
  const manifests = typeof parsed.flags.manifests === 'string'
521
604
  ? parseManifestList(parsed.flags.manifests)
522
605
  : undefined;
@@ -531,6 +614,12 @@ async function runAssetIngest(argumentList) {
531
614
  }
532
615
  const id = parsed.flags.id;
533
616
  const type = parsed.flags.type;
617
+ parametersPatch = applySliceCompressionFlags({
618
+ type,
619
+ flags: compressionFlags,
620
+ parametersPatch,
621
+ commandPath: 'fundus asset ingest'
622
+ });
534
623
  const operations = await createOperations();
535
624
  const state = await operations.importAsset({
536
625
  importer: 'figma',
@@ -561,6 +650,12 @@ async function runAssetIngest(argumentList) {
561
650
  const fileName = basename(absolutePath);
562
651
  const type = typeof parsed.flags.type === 'string' ? parsed.flags.type : inferTypeForFileName(fileName);
563
652
  const id = typeof parsed.flags.id === 'string' ? parsed.flags.id : proposeAssetId(fileName);
653
+ parametersPatch = applySliceCompressionFlags({
654
+ type,
655
+ flags: compressionFlags,
656
+ parametersPatch,
657
+ commandPath: 'fundus asset ingest'
658
+ });
564
659
  const operations = await createOperations();
565
660
  const state = await operations.ingest({
566
661
  fileName,
@@ -649,18 +744,37 @@ async function runAssetReplace(argumentList) {
649
744
  printMutationResult(`Replaced raw file for asset "${id}" with "${fileName}".`, asset, state);
650
745
  }
651
746
  async function runAssetSet(argumentList) {
652
- const parsed = parseArguments(argumentList, { ...COMMON_FLAGS, parameters: { takesValue: true }, manifests: { takesValue: true } }, 'fundus asset set');
747
+ const parsed = parseArguments(argumentList, {
748
+ ...COMMON_FLAGS,
749
+ parameters: { takesValue: true },
750
+ manifests: { takesValue: true },
751
+ 'compression-x': { takesValue: true },
752
+ 'compression-y': { takesValue: true }
753
+ }, 'fundus asset set');
653
754
  const [id] = requirePositionals(parsed, ['<id>'], 'fundus asset set');
654
- if (parsed.flags.parameters === undefined && parsed.flags.manifests === undefined) {
655
- throw new CliUsageError('`fundus asset set` needs --parameters and/or --manifests — run `fundus asset set --help`.');
755
+ const compressionFlags = parseSliceCompressionFlags(parsed.flags, 'fundus asset set');
756
+ if (parsed.flags.parameters === undefined &&
757
+ parsed.flags.manifests === undefined &&
758
+ compressionFlags === undefined) {
759
+ throw new CliUsageError('`fundus asset set` needs --parameters and/or --manifests, or a compression flag — run `fundus asset set --help`.');
656
760
  }
657
- const parametersPatch = typeof parsed.flags.parameters === 'string'
761
+ let parametersPatch = typeof parsed.flags.parameters === 'string'
658
762
  ? parseJsonFlag('parameters', parsed.flags.parameters)
659
763
  : undefined;
660
764
  const manifests = typeof parsed.flags.manifests === 'string'
661
765
  ? parseManifestList(parsed.flags.manifests)
662
766
  : undefined;
663
767
  const operations = await createOperations();
768
+ if (compressionFlags !== undefined) {
769
+ const currentAsset = assetById(await operations.state(), id);
770
+ parametersPatch = applySliceCompressionFlags({
771
+ type: currentAsset.type,
772
+ flags: compressionFlags,
773
+ parametersPatch,
774
+ currentParameters: currentAsset.parameters,
775
+ commandPath: 'fundus asset set'
776
+ });
777
+ }
664
778
  const state = await operations.setAsset(id, { parametersPatch, manifests });
665
779
  const asset = assetById(state, id);
666
780
  if (parsed.flags.json) {
@@ -14,6 +14,8 @@ export interface ResolvedAudioPluginConfig {
14
14
  presets: Record<string, AudioPreset>;
15
15
  }
16
16
  export interface ResolvedFundusConfig {
17
+ /** Absolute host project directory containing fundus.config.ts. */
18
+ projectRoot: string;
17
19
  /** All paths absolute. */
18
20
  rawDir: string;
19
21
  proxyDir: string;
@@ -71,6 +71,7 @@ export function resolveConfig(projectRoot, value, registry = serverPluginsByType
71
71
  throw new Error('fundus.config: "import.figma.defaults.scale" must be 1, 2, 3, or 4.');
72
72
  }
73
73
  return {
74
+ projectRoot: resolve(projectRoot),
74
75
  rawDir: resolvePath(projectRoot, requiredString(value, 'rawDir')),
75
76
  proxyDir: resolvePath(projectRoot, requiredString(value, 'proxyDir')),
76
77
  library: resolvePath(projectRoot, requiredString(value, 'library')),
@@ -0,0 +1,10 @@
1
+ import { type Library } from '../core/index.js';
2
+ export type GitAssetChange = 'new' | 'edited';
3
+ /** Current branch of the repository containing projectRoot; null outside Git or when detached. */
4
+ export declare function currentGitBranch(projectRoot: string): Promise<string | null>;
5
+ /**
6
+ * Asset-record changes made since this branch diverged from the repository's
7
+ * default branch. The current parsed library includes committed and local
8
+ * changes; raw-file state is intentionally handled by raw reconciliation.
9
+ */
10
+ export declare function gitAssetChanges(projectRoot: string, libraryPath: string, currentLibrary: Library): Promise<Map<string, GitAssetChange>>;
@@ -0,0 +1,148 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { realpath } from 'node:fs/promises';
3
+ import { isAbsolute, relative, resolve, sep } from 'node:path';
4
+ import { isDeepStrictEqual, promisify } from 'node:util';
5
+ import { compareCodeUnits, parseLibrary } from '../core/index.js';
6
+ const execFileAsync = promisify(execFile);
7
+ const MAX_LIBRARY_BLOB_BYTES = 64 * 1024 * 1024;
8
+ async function git(projectRoot, args, options = {}) {
9
+ const { stdout } = await execFileAsync('git', ['-C', projectRoot, ...args], {
10
+ encoding: 'utf8',
11
+ ...options
12
+ });
13
+ return stdout;
14
+ }
15
+ async function gitBlob(projectRoot, objectId) {
16
+ const { stdout } = await execFileAsync('git', ['-C', projectRoot, 'cat-file', 'blob', objectId], {
17
+ encoding: null,
18
+ maxBuffer: MAX_LIBRARY_BLOB_BYTES
19
+ });
20
+ return new TextDecoder('utf-8', { fatal: true }).decode(stdout);
21
+ }
22
+ /** Current branch of the repository containing projectRoot; null outside Git or when detached. */
23
+ export async function currentGitBranch(projectRoot) {
24
+ try {
25
+ return (await git(projectRoot, ['branch', '--show-current'])).trim() || null;
26
+ }
27
+ catch {
28
+ return null;
29
+ }
30
+ }
31
+ async function verifiedRef(projectRoot, ref) {
32
+ try {
33
+ await git(projectRoot, ['rev-parse', '--verify', '--quiet', ref]);
34
+ return ref;
35
+ }
36
+ catch {
37
+ return null;
38
+ }
39
+ }
40
+ async function firstExistingRef(projectRoot, refs) {
41
+ for (const ref of refs) {
42
+ if (await verifiedRef(projectRoot, ref))
43
+ return ref;
44
+ }
45
+ return null;
46
+ }
47
+ async function defaultBranchRef(projectRoot) {
48
+ try {
49
+ const remoteHead = (await git(projectRoot, ['symbolic-ref', '--quiet', 'refs/remotes/origin/HEAD'])).trim();
50
+ if (remoteHead && (await verifiedRef(projectRoot, remoteHead)))
51
+ return remoteHead;
52
+ }
53
+ catch {
54
+ // Repositories without a usable origin/HEAD fall back to conventional branch names.
55
+ }
56
+ return firstExistingRef(projectRoot, [
57
+ 'refs/remotes/origin/main',
58
+ 'refs/remotes/origin/master',
59
+ 'refs/heads/main',
60
+ 'refs/heads/master'
61
+ ]);
62
+ }
63
+ async function repositoryLibraryPath(repositoryRoot, libraryPath) {
64
+ const path = relative(repositoryRoot, await realpath(resolve(libraryPath)));
65
+ if (path === '' || isAbsolute(path) || path === '..' || path.startsWith(`..${sep}`))
66
+ return null;
67
+ return path.split(sep).join('/');
68
+ }
69
+ async function historicalLibrary(projectRoot, mergeBase, repositoryRelativeLibraryPath) {
70
+ let tree;
71
+ try {
72
+ tree = await git(projectRoot, [
73
+ 'ls-tree',
74
+ '--full-tree',
75
+ '-z',
76
+ mergeBase,
77
+ '--',
78
+ `:(literal)${repositoryRelativeLibraryPath}`
79
+ ]);
80
+ }
81
+ catch {
82
+ return { kind: 'unavailable' };
83
+ }
84
+ if (tree === '')
85
+ return { kind: 'missing' };
86
+ if (!tree.endsWith('\0'))
87
+ return { kind: 'unavailable' };
88
+ const entries = tree.slice(0, -1).split('\0');
89
+ if (entries.length !== 1)
90
+ return { kind: 'unavailable' };
91
+ const match = /^([0-7]{6}) (blob) ([0-9a-fA-F]+)\t([\s\S]+)$/.exec(entries[0]);
92
+ if (!match || match[4] !== repositoryRelativeLibraryPath)
93
+ return { kind: 'unavailable' };
94
+ try {
95
+ return { kind: 'available', library: parseLibrary(await gitBlob(projectRoot, match[3])) };
96
+ }
97
+ catch {
98
+ return { kind: 'unavailable' };
99
+ }
100
+ }
101
+ function comparableRecord(record) {
102
+ return {
103
+ ...record,
104
+ manifests: [...new Set(record.manifests)].sort(compareCodeUnits)
105
+ };
106
+ }
107
+ /**
108
+ * Asset-record changes made since this branch diverged from the repository's
109
+ * default branch. The current parsed library includes committed and local
110
+ * changes; raw-file state is intentionally handled by raw reconciliation.
111
+ */
112
+ export async function gitAssetChanges(projectRoot, libraryPath, currentLibrary) {
113
+ try {
114
+ const repositoryRoot = (await git(projectRoot, ['rev-parse', '--show-toplevel'])).trim();
115
+ if (!repositoryRoot)
116
+ return new Map();
117
+ const libraryGitPath = await repositoryLibraryPath(repositoryRoot, libraryPath);
118
+ if (!libraryGitPath)
119
+ return new Map();
120
+ const defaultRef = await defaultBranchRef(projectRoot);
121
+ if (!defaultRef)
122
+ return new Map();
123
+ const mergeBase = (await git(projectRoot, ['merge-base', 'HEAD', defaultRef])).trim();
124
+ if (!mergeBase)
125
+ return new Map();
126
+ const historical = await historicalLibrary(projectRoot, mergeBase, libraryGitPath);
127
+ if (historical.kind === 'unavailable')
128
+ return new Map();
129
+ const changes = new Map();
130
+ for (const [assetId, currentRecord] of Object.entries(currentLibrary.assets)) {
131
+ if (historical.kind === 'missing') {
132
+ changes.set(assetId, 'new');
133
+ continue;
134
+ }
135
+ if (!Object.hasOwn(historical.library.assets, assetId)) {
136
+ changes.set(assetId, 'new');
137
+ continue;
138
+ }
139
+ if (!isDeepStrictEqual(comparableRecord(currentRecord), comparableRecord(historical.library.assets[assetId]))) {
140
+ changes.set(assetId, 'edited');
141
+ }
142
+ }
143
+ return changes;
144
+ }
145
+ catch {
146
+ return new Map();
147
+ }
148
+ }
@@ -17,6 +17,7 @@ import { rawSafetyIssues } from './raw-safety.js';
17
17
  import { serverImporters } from './importers.js';
18
18
  import { SourceImportError } from './importers/contract.js';
19
19
  import { validateFigmaSourceParameters } from './importers/figma.js';
20
+ import { currentGitBranch, gitAssetChanges } from './git.js';
20
21
  /**
21
22
  * The CLI's `--parameters` merge semantics (M7): a SHALLOW merge at the top
22
23
  * level onto the current parameters — a nested object value replaces the whole
@@ -661,6 +662,10 @@ export class FundusOperations {
661
662
  };
662
663
  }
663
664
  async #buildState(library, issues, classification) {
665
+ const [gitBranch, changedGitAssets] = await Promise.all([
666
+ currentGitBranch(this.#config.projectRoot),
667
+ gitAssetChanges(this.#config.projectRoot, this.#config.library, library)
668
+ ]);
664
669
  const referencesByAsset = collectAllReferences(library, descriptorsByType(this.#registry));
665
670
  const membershipByManifest = computeLibraryMembership(library, referencesByAsset);
666
671
  const delivered = allDeliveredAssetIds(membershipByManifest);
@@ -725,6 +730,7 @@ export class FundusOperations {
725
730
  folder: folderOfRawPath(record.raw),
726
731
  rawUrl: `/files/raw/${encodeRelativePathForUrl(record.raw)}?v=${record.rawHash.slice(0, 12)}`,
727
732
  rawHash: record.rawHash,
733
+ gitStatus: changedGitAssets.get(assetId) ?? null,
728
734
  importSource: record.importSource,
729
735
  parameters: record.parameters,
730
736
  manifests: record.manifests,
@@ -766,6 +772,7 @@ export class FundusOperations {
766
772
  }
767
773
  const rawIngestionQueue = this.#buildRawIngestionQueue(library, classification);
768
774
  return {
775
+ gitBranch,
769
776
  library,
770
777
  assets,
771
778
  importDefaults: { figma: { scale: this.#config.import.figma.defaults.scale } },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fundus",
3
- "version": "0.6.0",
3
+ "version": "0.8.0",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1 +0,0 @@
1
- :root{--panel:#2c2c2c;--panel-raised:#383838;--canvas:#1e1e1e;--border:#444;--border-soft:#383838;--text:#fff;--text-dim:#a0a0a0;--text-faint:#7a7a7a;--accent:#0d99ff;--accent-soft:#0d99ff29;--warning:#ffcd29;--warning-soft:#ffcd2924;--danger:#f24822;--ok:#14ae5c;--radius:6px;--radius-small:4px;--radius-large:8px;--font-ui:"Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*{box-sizing:border-box}html,body{height:100%;margin:0;padding:0}body{background:var(--canvas);color:var(--text);font-family:var(--font-ui);-webkit-font-smoothing:antialiased;font-size:12px;line-height:1.45}a{color:inherit;text-decoration:none}button,input,select{font:inherit;color:inherit}button{cursor:pointer}.control{background:var(--panel-raised);border-radius:var(--radius);border:1px solid #0000;height:28px;padding:4px 8px}.control:hover{border-color:var(--border)}.control:focus,.control:focus-visible{border-color:var(--accent);outline:none}.control.primary{background:var(--accent);color:var(--text)}.control.primary:disabled{opacity:.4;cursor:not-allowed}.control.danger{color:var(--danger)}.control.danger:hover{border-color:var(--danger)}.checkerboard{background-color:var(--canvas);background-image:linear-gradient(45deg, var(--panel) 25%, transparent 25%), linear-gradient(-45deg, var(--panel) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, var(--panel) 75%), linear-gradient(-45deg, transparent 75%, var(--panel) 75%);background-position:0 0,0 8px,8px -8px,-8px 0;background-size:16px 16px}.queue.svelte-1rcmmyd{background:color-mix(in srgb, var(--accent) 8%, var(--panel));border-bottom:1px solid var(--border);flex:none;padding:10px 16px}.heading.svelte-1rcmmyd,.identity.svelte-1rcmmyd{align-items:center;gap:10px;display:flex}.heading.svelte-1rcmmyd{justify-content:space-between;margin-bottom:8px}.heading.svelte-1rcmmyd span:where(.svelte-1rcmmyd),p.svelte-1rcmmyd{color:var(--text-dim);font-size:11px}.items.svelte-1rcmmyd{gap:6px;display:grid}.item.svelte-1rcmmyd{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);padding:8px 10px}.identity.svelte-1rcmmyd>span:where(.svelte-1rcmmyd){background:var(--accent-soft);color:var(--accent);text-transform:uppercase;border-radius:999px;padding:2px 6px;font-size:10px}.identity.svelte-1rcmmyd>span.edited:where(.svelte-1rcmmyd){background:var(--warning-soft);color:var(--warning)}.identity.svelte-1rcmmyd>span.unsupported:where(.svelte-1rcmmyd){background:color-mix(in srgb, var(--danger) 14%, transparent);color:var(--danger)}.identity.svelte-1rcmmyd h2:where(.svelte-1rcmmyd){word-break:break-all;margin:0;font-size:13px}.raw.svelte-1rcmmyd{color:var(--text-dim);word-break:break-all;margin:8px 0 0;font-size:12px}.form-controls.svelte-1rcmmyd{gap:8px;width:min(100%,326px);display:grid}.new-form.svelte-1rcmmyd{margin-top:10px}.edited-form.svelte-1rcmmyd{margin-top:6px}.form-controls.svelte-1rcmmyd label:where(.svelte-1rcmmyd),.manifest-row.svelte-1rcmmyd{grid-template-columns:69px minmax(0,1fr);gap:10px;width:100%;display:grid}.form-controls.svelte-1rcmmyd label:where(.svelte-1rcmmyd){align-items:center}.manifest-row.svelte-1rcmmyd>span:where(.svelte-1rcmmyd){color:var(--text-dim);font-size:11px;line-height:28px}.manifest-row.svelte-1rcmmyd p:where(.svelte-1rcmmyd){color:var(--text-faint);margin:0;line-height:28px}.manifest-list.svelte-1rcmmyd{max-height:96px;overflow-y:auto}.form-controls.svelte-1rcmmyd input:where(.svelte-1rcmmyd),.form-controls.svelte-1rcmmyd select:where(.svelte-1rcmmyd){box-sizing:border-box;width:100%;min-width:0}.actions.svelte-1rcmmyd{align-items:center;gap:10px;display:flex}label.svelte-1rcmmyd{color:var(--text-dim);align-items:center;gap:6px;font-size:11px;display:inline-flex}input.svelte-1rcmmyd,select.svelte-1rcmmyd{min-width:150px;color:var(--text);background:var(--panel-raised);border:1px solid var(--border);border-radius:4px;padding:4px 6px}button.svelte-1rcmmyd{background:var(--accent);color:#fff;cursor:pointer;border:0;border-radius:4px;padding:5px 10px}button.secondary.svelte-1rcmmyd{background:var(--panel-raised);color:var(--text);border:1px solid var(--border)}button.svelte-1rcmmyd:disabled{opacity:.45;cursor:default}p.error.svelte-1rcmmyd{color:var(--danger);margin:6px 0 0}.shell.svelte-12qhfyh{flex-direction:column;height:100vh;display:flex}.topbar.svelte-12qhfyh{background:var(--panel);border-bottom:1px solid var(--border);flex:none;align-items:center;gap:24px;height:40px;padding:0 16px;display:flex}.brand.svelte-12qhfyh{align-items:center;gap:8px;font-size:12px;font-weight:600;display:inline-flex}.logo.svelte-12qhfyh{color:var(--accent)}nav.svelte-12qhfyh{gap:4px;display:flex}nav.svelte-12qhfyh a:where(.svelte-12qhfyh){border-radius:var(--radius);color:var(--text-dim);padding:4px 10px}nav.svelte-12qhfyh a:where(.svelte-12qhfyh):hover{color:var(--text)}nav.svelte-12qhfyh a.active:where(.svelte-12qhfyh){background:var(--accent-soft);color:var(--accent)}.status.svelte-12qhfyh{color:var(--text-dim);align-items:center;gap:6px;margin-left:auto;display:inline-flex}.status-text.error.svelte-12qhfyh{color:var(--danger)}.dot.svelte-12qhfyh{background:var(--text-faint);border-radius:50%;width:7px;height:7px}.dot.ok.svelte-12qhfyh{background:var(--ok)}.dot.bad.svelte-12qhfyh{background:var(--danger)}.dot.saving.svelte-12qhfyh{background:var(--accent);animation:.8s ease-in-out infinite svelte-12qhfyh-pulse}@keyframes svelte-12qhfyh-pulse{0%,to{opacity:.35}50%{opacity:1}}.notice.svelte-12qhfyh{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-dim);margin:24px;padding:12px 16px}.issue-banner.svelte-12qhfyh{background:color-mix(in srgb, var(--danger) 14%, var(--panel));border-bottom:1px solid var(--danger);color:var(--text);flex-direction:column;gap:4px;padding:8px 16px;display:flex}code.svelte-12qhfyh{background:var(--panel-raised);border-radius:4px;padding:1px 5px}
@@ -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}.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)}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}.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}.selection-bar.svelte-1uha8ag,.filter-bar.svelte-1uha8ag{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.selection-bar.svelte-1uha8ag{margin-bottom:8px}.filter-bar.svelte-1uha8ag{margin-bottom:16px}.selection-summary.svelte-1uha8ag{color:var(--accent);white-space:nowrap;font-weight:600}.toggle.svelte-1uha8ag{color:var(--text-dim);align-items:center;gap:6px;display:inline-flex}.search.svelte-1uha8ag{align-items:center;gap:5px;width:220px;padding:0 6px;display:flex}.search.svelte-1uha8ag:focus-within{border-color:var(--accent)}.search-icon.svelte-1uha8ag{fill:none;width:14px;height:14px;stroke:var(--text-faint);stroke-width:1.5px;stroke-linecap:round;flex:none}.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.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}.import.svelte-1uha8ag{background:var(--accent);color:var(--text);margin-left:auto}.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{grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:8px;display:grid}.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:8px;padding:8px;display:flex;position:relative}.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:12px;left:12px}.card.svelte-1uha8ag:hover{border-color:var(--accent)}.thumbnail.svelte-1uha8ag{border-radius:var(--radius);justify-content:center;align-items:center;height:96px;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)}.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}
@@ -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)}.icon.svelte-jamecx{display:block}.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
- .manifest-selector.svelte-151zph4{flex-direction:column;gap:4px;width:100%;display:flex}.manifest-option.svelte-151zph4{border-color:var(--border-soft);width:100%;height:28px;color:var(--text-dim);cursor:pointer;border-radius:4px;align-items:center;gap:7px;padding:2px 7px;display:flex}.manifest-option.svelte-151zph4:hover{border-color:var(--manifest-color);background:color-mix(in srgb, var(--manifest-color) 10%, var(--panel-raised));color:var(--text)}.manifest-option.svelte-151zph4:focus-within{border-color:var(--manifest-color)}.manifest-option.selected.svelte-151zph4{border-color:var(--manifest-color);background:color-mix(in srgb, var(--manifest-color) 20%, var(--panel-raised));color:var(--text)}.manifest-option.passive.svelte-151zph4{border-color:var(--manifest-color);border-style:dashed}.manifest-option.disabled.svelte-151zph4{cursor:default;opacity:.6}.manifest-option.disabled.svelte-151zph4:hover{border-color:var(--border-soft);background:var(--panel-raised);color:var(--text-dim)}input.svelte-151zph4{width:14px;height:14px;accent-color:var(--manifest-color);flex:none;margin:0}.marker.svelte-151zph4{border:1px solid color-mix(in srgb, var(--manifest-color) 70%, var(--border));background:color-mix(in srgb, var(--manifest-color) 24%, var(--panel));border-radius:3px;flex:none;justify-content:center;align-items:center;width:18px;height:18px;font-size:12px;display:inline-flex}.color-dot.svelte-151zph4{background:var(--manifest-color);border-radius:50%;width:8px;height:8px}.name.svelte-151zph4,.via.svelte-151zph4{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.name.svelte-151zph4{font-size:11px;font-weight:500}.via.svelte-151zph4{color:var(--text-faint);margin-left:auto;font-size:9px}
@@ -1 +0,0 @@
1
- I@d�Z��Kf��Jb��.��ʬmT����I�