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.
- package/README.md +6 -1
- package/build/client/_app/immutable/assets/0.CHekvMpo.css +1 -0
- package/build/client/_app/immutable/assets/0.CHekvMpo.css.br +0 -0
- package/build/client/_app/immutable/assets/0.CHekvMpo.css.gz +0 -0
- package/build/client/_app/immutable/assets/2.CK3PVkJ5.css +1 -0
- package/build/client/_app/immutable/assets/2.CK3PVkJ5.css.br +0 -0
- package/build/client/_app/immutable/assets/2.CK3PVkJ5.css.gz +0 -0
- package/build/client/_app/immutable/assets/FileChangeBadge.C6wwUZJS.css +1 -0
- package/build/client/_app/immutable/assets/FileChangeBadge.C6wwUZJS.css.br +0 -0
- package/build/client/_app/immutable/assets/FileChangeBadge.C6wwUZJS.css.gz +0 -0
- package/build/client/_app/immutable/assets/LibraryContextMenu.BSnKt_Is.css +1 -0
- package/build/client/_app/immutable/assets/LibraryContextMenu.BSnKt_Is.css.br +0 -0
- package/build/client/_app/immutable/assets/LibraryContextMenu.BSnKt_Is.css.gz +0 -0
- package/build/client/_app/immutable/assets/ManifestSelector.Cue3sCA1.css +1 -0
- package/build/client/_app/immutable/assets/ManifestSelector.Cue3sCA1.css.br +0 -0
- package/build/client/_app/immutable/assets/ManifestSelector.Cue3sCA1.css.gz +0 -0
- package/build/client/_app/immutable/chunks/4FCfXqUa.js +1 -0
- package/build/client/_app/immutable/chunks/4FCfXqUa.js.br +0 -0
- package/build/client/_app/immutable/chunks/4FCfXqUa.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{D24lHNM9.js → B6BtXxR0.js} +1 -1
- package/build/client/_app/immutable/chunks/B6BtXxR0.js.br +0 -0
- package/build/client/_app/immutable/chunks/B6BtXxR0.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BD3hQKzV.js +1 -0
- package/build/client/_app/immutable/chunks/BD3hQKzV.js.br +0 -0
- package/build/client/_app/immutable/chunks/BD3hQKzV.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BT3jFrxa.js → BEbRZpHw.js} +1 -1
- package/build/client/_app/immutable/chunks/BEbRZpHw.js.br +1 -0
- package/build/client/_app/immutable/chunks/BEbRZpHw.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BVDR6adL.js +1 -0
- package/build/client/_app/immutable/chunks/BVDR6adL.js.br +0 -0
- package/build/client/_app/immutable/chunks/BVDR6adL.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BX8lJS3k.js +108 -0
- package/build/client/_app/immutable/chunks/BX8lJS3k.js.br +0 -0
- package/build/client/_app/immutable/chunks/BX8lJS3k.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DPZDGjcn.js +1 -0
- package/build/client/_app/immutable/chunks/DPZDGjcn.js.br +0 -0
- package/build/client/_app/immutable/chunks/DPZDGjcn.js.gz +0 -0
- package/build/client/_app/immutable/chunks/NblqapDQ.js +3 -0
- package/build/client/_app/immutable/chunks/NblqapDQ.js.br +0 -0
- package/build/client/_app/immutable/chunks/NblqapDQ.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.CH6AvWYr.js +2 -0
- package/build/client/_app/immutable/entry/app.CH6AvWYr.js.br +0 -0
- package/build/client/_app/immutable/entry/app.CH6AvWYr.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.v9Hgefer.js +1 -0
- package/build/client/_app/immutable/entry/start.v9Hgefer.js.br +0 -0
- package/build/client/_app/immutable/entry/start.v9Hgefer.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.bYfuwnNW.js +2 -0
- package/build/client/_app/immutable/nodes/0.bYfuwnNW.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.bYfuwnNW.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.kv-uSGjV.js +1 -0
- package/build/client/_app/immutable/nodes/1.kv-uSGjV.js.br +2 -1
- package/build/client/_app/immutable/nodes/1.kv-uSGjV.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.B0CNEieI.js +3 -0
- package/build/client/_app/immutable/nodes/2.B0CNEieI.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.B0CNEieI.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.K5eLxWD7.js +1 -0
- package/build/client/_app/immutable/nodes/3.K5eLxWD7.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.K5eLxWD7.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.DXitiaKH.js +2 -0
- package/build/client/_app/immutable/nodes/4.DXitiaKH.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.DXitiaKH.js.gz +0 -0
- package/build/client/_app/version.json +1 -1
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/handler.js +7 -7
- package/build/index.js +7 -7
- package/build/server/chunks/chunks/{context.js-FvYkJDOy.js → context.js-CPdlcRhV.js} +157 -3
- package/build/server/chunks/chunks/context.js-CPdlcRhV.js.map +1 -0
- package/build/server/chunks/chunks/{contract.js-DGMufT2e.js → contract.js-nwG99Zzj.js} +2 -2
- package/build/server/chunks/chunks/{contract.js-DGMufT2e.js.map → contract.js-nwG99Zzj.js.map} +1 -1
- package/build/server/chunks/chunks/{exports.js-Bepiq5XZ.js → exports.js-Ci6jkE-z.js} +2 -2
- package/build/server/chunks/chunks/{exports.js-Bepiq5XZ.js.map → exports.js-Ci6jkE-z.js.map} +1 -1
- package/build/server/chunks/chunks/{http.js-DWYlsbZd.js → http.js-DmUA2gRk.js} +2 -2
- package/build/server/chunks/chunks/{http.js-DWYlsbZd.js.map → http.js-DmUA2gRk.js.map} +1 -1
- package/build/server/chunks/chunks/{internal.js-Cy01GWTk.js → internal.js-DWu3OCGw.js} +3 -3
- package/build/server/chunks/chunks/{internal.js-Cy01GWTk.js.map → internal.js-DWu3OCGw.js.map} +1 -1
- package/build/server/chunks/chunks/internal2.js-BlXt2rfE.js.map +1 -1
- package/build/server/chunks/chunks/{shared.js-b0LBJ1Hx.js → shared.js-BIggwEH0.js} +2 -2
- package/build/server/chunks/chunks/{shared.js-b0LBJ1Hx.js.map → shared.js-BIggwEH0.js.map} +1 -1
- package/build/server/chunks/chunks/{utils.js-CecFjHB0.js → utils.js-Dxvg75XM.js} +3 -3
- package/build/server/chunks/chunks/{utils.js-CecFjHB0.js.map → utils.js-Dxvg75XM.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/_...path_/{_server.ts.js-Bmyh2WUa.js → _server.ts.js-wQD5tBuh.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/_...path_/{_server.ts.js-Bmyh2WUa.js.map → _server.ts.js-wQD5tBuh.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/_id_/{_server.ts.js-hoRG5JRv.js → _server.ts.js-CLCx81uK.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/assets/_id_/{_server.ts.js-hoRG5JRv.js.map → _server.ts.js-CLCx81uK.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/_id_/raw/{_server.ts.js-BdO9kwrn.js → _server.ts.js-DkvELcZA.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/assets/_id_/raw/{_server.ts.js-BdO9kwrn.js.map → _server.ts.js-DkvELcZA.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/_id_/reimport/{_server.ts.js-BojOH5gj.js → _server.ts.js-CCNcWQxH.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/assets/_id_/reimport/{_server.ts.js-BojOH5gj.js.map → _server.ts.js-CCNcWQxH.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/{_server.ts.js-DWIptU3K.js → _server.ts.js-DUK4Rnpu.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/assets/{_server.ts.js-DWIptU3K.js.map → _server.ts.js-DUK4Rnpu.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/delete/{_server.ts.js-CaiOgcPc.js → _server.ts.js-DNgHnoga.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/assets/delete/{_server.ts.js-CaiOgcPc.js.map → _server.ts.js-DNgHnoga.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/move/{_server.ts.js-Bug1Y1W9.js → _server.ts.js-gdXko55o.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/assets/move/{_server.ts.js-Bug1Y1W9.js.map → _server.ts.js-gdXko55o.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/folders/_path_/{_server.ts.js-B9N7cPff.js → _server.ts.js-DcsBk_jx.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/folders/_path_/{_server.ts.js-B9N7cPff.js.map → _server.ts.js-DcsBk_jx.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/folders/{_server.ts.js-CiWdcZEv.js → _server.ts.js-BhTg6GgC.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/folders/{_server.ts.js-CiWdcZEv.js.map → _server.ts.js-BhTg6GgC.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/imports/{_server.ts.js-CNqGzdRB.js → _server.ts.js-CKjnRFXQ.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/imports/{_server.ts.js-CNqGzdRB.js.map → _server.ts.js-CKjnRFXQ.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/manifests/_name_/{_server.ts.js-BHwcGKE_.js → _server.ts.js-C9rdzmoj.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/manifests/_name_/{_server.ts.js-BHwcGKE_.js.map → _server.ts.js-C9rdzmoj.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/manifests/{_server.ts.js-CPoTCXQk.js → _server.ts.js-BdZb4d69.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/manifests/{_server.ts.js-CPoTCXQk.js.map → _server.ts.js-BdZb4d69.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/raw/adopt/{_server.ts.js-iDOU2RdK.js → _server.ts.js-DaTgBGGt.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/raw/adopt/{_server.ts.js-iDOU2RdK.js.map → _server.ts.js-DaTgBGGt.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/raw/edited/accept/{_server.ts.js-DikbQm3f.js → _server.ts.js-Btohjiz4.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/raw/edited/accept/{_server.ts.js-DikbQm3f.js.map → _server.ts.js-Btohjiz4.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/raw/edited/dismiss/{_server.ts.js-DTdHkWuR.js → _server.ts.js-D0alWeVb.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/raw/edited/dismiss/{_server.ts.js-DTdHkWuR.js.map → _server.ts.js-D0alWeVb.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/reconcile/{_server.ts.js-Cn8hwP5P.js → _server.ts.js-CRNi0bmU.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/reconcile/{_server.ts.js-Cn8hwP5P.js.map → _server.ts.js-CRNi0bmU.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/reveal/{_server.ts.js-BdUCIBJ_.js → _server.ts.js-B6C1DDpq.js} +19 -7
- package/build/server/chunks/entries/endpoints/api/reveal/_server.ts.js-B6C1DDpq.js.map +1 -0
- package/build/server/chunks/entries/endpoints/api/state/{_server.ts.js-CBLdZJZB.js → _server.ts.js-qPKxHQ-e.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/state/{_server.ts.js-CBLdZJZB.js.map → _server.ts.js-qPKxHQ-e.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/files/_...path_/{_server.ts.js-DVtQlFHS.js → _server.ts.js-BjioCWTI.js} +3 -3
- package/build/server/chunks/entries/endpoints/files/_...path_/{_server.ts.js-DVtQlFHS.js.map → _server.ts.js-BjioCWTI.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/files/proxy/_...path_/{_server.ts.js-CY_gjOPq.js → _server.ts.js-BzUFg_ur.js} +4 -4
- 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
- package/build/server/chunks/entries/endpoints/files/raw/_...path_/{_server.ts.js-BOfjGM87.js → _server.ts.js-CrjUXxJT.js} +4 -4
- package/build/server/chunks/entries/endpoints/files/raw/_...path_/{_server.ts.js-BOfjGM87.js.map → _server.ts.js-CrjUXxJT.js.map} +1 -1
- package/build/server/chunks/entries/{hooks.server.js-BH0-wX67.js → hooks.server.js-DQ8kZ3N2.js} +3 -3
- package/build/server/chunks/entries/{hooks.server.js-BH0-wX67.js.map → hooks.server.js-DQ8kZ3N2.js.map} +1 -1
- package/build/server/chunks/{handler-DMnHzDi5.js → handler-CJ8lsr6W.js} +5 -5
- package/build/server/chunks/{handler-DMnHzDi5.js.map → handler-CJ8lsr6W.js.map} +1 -1
- package/build/server/chunks/{index.js-BbOitM8j.js → index.js-Ph6LJ5Na.js} +5 -5
- package/build/server/chunks/{index.js-BbOitM8j.js.map → index.js-Ph6LJ5Na.js.map} +1 -1
- package/build/server/chunks/{manifest.js-EeQkh4Qe.js → manifest.js-CWjy0GQ9.js} +28 -28
- package/build/server/chunks/{manifest.js-EeQkh4Qe.js.map → manifest.js-CWjy0GQ9.js.map} +1 -1
- package/build/server/chunks/nodes/0.js-s3yR2Abv.js +11 -0
- package/build/server/chunks/nodes/0.js-s3yR2Abv.js.map +1 -0
- package/build/server/chunks/nodes/1.js-BKDWaQXi.js +7 -0
- package/build/server/chunks/nodes/{1.js-GmjtwLZL.js.map → 1.js-BKDWaQXi.js.map} +1 -1
- package/build/server/chunks/nodes/2.js-BuHtNZN4.js +7 -0
- package/build/server/chunks/nodes/2.js-BuHtNZN4.js.map +1 -0
- package/build/server/chunks/nodes/3.js-CxLEr5zC.js +7 -0
- package/build/server/chunks/nodes/3.js-CxLEr5zC.js.map +1 -0
- package/build/server/chunks/nodes/4.js-BoG4R0fU.js +7 -0
- package/build/server/chunks/nodes/{4.js-CtmXxVg2.js.map → 4.js-BoG4R0fU.js.map} +1 -1
- package/dist/core/api-types.d.ts +4 -0
- package/dist/server/cli-commands.d.ts +1 -1
- package/dist/server/cli-commands.js +125 -11
- package/dist/server/config-loader.d.ts +2 -0
- package/dist/server/config-loader.js +1 -0
- package/dist/server/git.d.ts +10 -0
- package/dist/server/git.js +148 -0
- package/dist/server/operations.js +7 -0
- package/package.json +1 -1
- package/build/client/_app/immutable/assets/0.inkPq3ni.css +0 -1
- package/build/client/_app/immutable/assets/0.inkPq3ni.css.br +0 -0
- package/build/client/_app/immutable/assets/0.inkPq3ni.css.gz +0 -0
- package/build/client/_app/immutable/assets/2.CtqoikFs.css +0 -1
- package/build/client/_app/immutable/assets/2.CtqoikFs.css.br +0 -0
- package/build/client/_app/immutable/assets/2.CtqoikFs.css.gz +0 -0
- package/build/client/_app/immutable/assets/LibraryContextMenu.CVIa_uFP.css +0 -1
- package/build/client/_app/immutable/assets/LibraryContextMenu.CVIa_uFP.css.br +0 -0
- package/build/client/_app/immutable/assets/LibraryContextMenu.CVIa_uFP.css.gz +0 -0
- package/build/client/_app/immutable/assets/ManifestSelector.Il8p28r8.css +0 -1
- package/build/client/_app/immutable/assets/ManifestSelector.Il8p28r8.css.br +0 -0
- package/build/client/_app/immutable/assets/ManifestSelector.Il8p28r8.css.gz +0 -0
- package/build/client/_app/immutable/chunks/BT3jFrxa.js.br +0 -1
- package/build/client/_app/immutable/chunks/BT3jFrxa.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CPFeEkfP.js +0 -108
- package/build/client/_app/immutable/chunks/CPFeEkfP.js.br +0 -0
- package/build/client/_app/immutable/chunks/CPFeEkfP.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CQrHfI-c.js +0 -1
- package/build/client/_app/immutable/chunks/CQrHfI-c.js.br +0 -0
- package/build/client/_app/immutable/chunks/CQrHfI-c.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D0BLX4Qd.js +0 -1
- package/build/client/_app/immutable/chunks/D0BLX4Qd.js.br +0 -0
- package/build/client/_app/immutable/chunks/D0BLX4Qd.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D24lHNM9.js.br +0 -0
- package/build/client/_app/immutable/chunks/D24lHNM9.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D65cSBhe.js +0 -3
- package/build/client/_app/immutable/chunks/D65cSBhe.js.br +0 -0
- package/build/client/_app/immutable/chunks/D65cSBhe.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D6VoU_x4.js +0 -1
- package/build/client/_app/immutable/chunks/D6VoU_x4.js.br +0 -0
- package/build/client/_app/immutable/chunks/D6VoU_x4.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.DmVWkUml.js +0 -2
- package/build/client/_app/immutable/entry/app.DmVWkUml.js.br +0 -0
- package/build/client/_app/immutable/entry/app.DmVWkUml.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.Dsf5wSaR.js +0 -1
- package/build/client/_app/immutable/entry/start.Dsf5wSaR.js.br +0 -0
- package/build/client/_app/immutable/entry/start.Dsf5wSaR.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.l-jE2v4o.js +0 -2
- package/build/client/_app/immutable/nodes/0.l-jE2v4o.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.l-jE2v4o.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.CRPVOtEh.js +0 -1
- package/build/client/_app/immutable/nodes/1.CRPVOtEh.js.br +0 -3
- package/build/client/_app/immutable/nodes/1.CRPVOtEh.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.8Si6qHSH.js +0 -3
- package/build/client/_app/immutable/nodes/2.8Si6qHSH.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.8Si6qHSH.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.CdI42Umt.js +0 -1
- package/build/client/_app/immutable/nodes/3.CdI42Umt.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.CdI42Umt.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.mMkL80q1.js +0 -2
- package/build/client/_app/immutable/nodes/4.mMkL80q1.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.mMkL80q1.js.gz +0 -0
- package/build/server/chunks/chunks/context.js-FvYkJDOy.js.map +0 -1
- package/build/server/chunks/entries/endpoints/api/reveal/_server.ts.js-BdUCIBJ_.js.map +0 -1
- package/build/server/chunks/nodes/0.js-CS9Xzs-1.js +0 -11
- package/build/server/chunks/nodes/0.js-CS9Xzs-1.js.map +0 -1
- package/build/server/chunks/nodes/1.js-GmjtwLZL.js +0 -7
- package/build/server/chunks/nodes/2.js-Pip0Abb-.js +0 -7
- package/build/server/chunks/nodes/2.js-Pip0Abb-.js.map +0 -1
- package/build/server/chunks/nodes/3.js-CJKDeQST.js +0 -7
- package/build/server/chunks/nodes/3.js-CJKDeQST.js.map +0 -1
- 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>]
|
|
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>]
|
|
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
|
|
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>]
|
|
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
|
|
338
|
-
|
|
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
|
-
|
|
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, {
|
|
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
|
-
|
|
655
|
-
|
|
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
|
-
|
|
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 +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}
|
|
Binary file
|
|
Binary file
|
|
@@ -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}
|
|
Binary file
|
|
Binary file
|
|
@@ -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}
|
|
Binary file
|
|
Binary file
|
|
@@ -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}
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
I@d�Z��Kf��Jb��.��ʬmT����I�
|
|
Binary file
|