fundus 0.0.3 → 0.0.4
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 +17 -2
- package/build/client/_app/immutable/assets/{2.wavcNhPC.css → 2.ohi-TClG.css} +1 -1
- package/build/client/_app/immutable/assets/2.ohi-TClG.css.br +0 -0
- package/build/client/_app/immutable/assets/2.ohi-TClG.css.gz +0 -0
- package/build/client/_app/immutable/assets/3.JwgtcTEd.css +1 -0
- package/build/client/_app/immutable/assets/3.JwgtcTEd.css.br +0 -0
- package/build/client/_app/immutable/assets/3.JwgtcTEd.css.gz +0 -0
- package/build/client/_app/immutable/assets/LibraryContextMenu.CMefGNE2.css +1 -0
- package/build/client/_app/immutable/assets/LibraryContextMenu.CMefGNE2.css.br +0 -0
- package/build/client/_app/immutable/assets/LibraryContextMenu.CMefGNE2.css.gz +0 -0
- package/build/client/_app/immutable/chunks/DOpBpjxS.js +108 -0
- package/build/client/_app/immutable/chunks/DOpBpjxS.js.br +0 -0
- package/build/client/_app/immutable/chunks/DOpBpjxS.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{DQ8SXFaX.js → DVEQFclp.js} +1 -1
- package/build/client/_app/immutable/chunks/DVEQFclp.js.br +1 -0
- package/build/client/_app/immutable/chunks/DVEQFclp.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CvY6YsFE.js → DiFoWL2c.js} +1 -1
- package/build/client/_app/immutable/chunks/DiFoWL2c.js.br +0 -0
- package/build/client/_app/immutable/chunks/DiFoWL2c.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BiIto6ft.js → DkADHpZF.js} +1 -1
- package/build/client/_app/immutable/chunks/DkADHpZF.js.br +0 -0
- package/build/client/_app/immutable/chunks/DkADHpZF.js.gz +0 -0
- package/build/client/_app/immutable/entry/{app.ubN0v9bN.js → app.CKgtYXQb.js} +2 -2
- package/build/client/_app/immutable/entry/app.CKgtYXQb.js.br +0 -0
- package/build/client/_app/immutable/entry/app.CKgtYXQb.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.CYZu5qE1.js +1 -0
- package/build/client/_app/immutable/entry/start.CYZu5qE1.js.br +0 -0
- package/build/client/_app/immutable/entry/start.CYZu5qE1.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{0.Dr5ijCIl.js → 0.I_1SApYQ.js} +1 -1
- package/build/client/_app/immutable/nodes/0.I_1SApYQ.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.I_1SApYQ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{1.DiIGIRAb.js → 1.v6eUTnWq.js} +1 -1
- package/build/client/_app/immutable/nodes/1.v6eUTnWq.js.br +2 -0
- package/build/client/_app/immutable/nodes/1.v6eUTnWq.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.DoA7Dfl-.js +3 -0
- package/build/client/_app/immutable/nodes/2.DoA7Dfl-.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.DoA7Dfl-.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.C-DO70Bs.js +1 -0
- package/build/client/_app/immutable/nodes/3.C-DO70Bs.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.C-DO70Bs.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.CALOuSyz.js +2 -0
- package/build/client/_app/immutable/nodes/4.CALOuSyz.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.CALOuSyz.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-Bw4WWLhG.js → context.js-BUZqFfWG.js} +19 -33
- package/build/server/chunks/chunks/context.js-BUZqFfWG.js.map +1 -0
- package/build/server/chunks/chunks/{core.js-DDntpb72.js → core.js-xfrkaQpS.js} +97 -48
- package/build/server/chunks/chunks/core.js-xfrkaQpS.js.map +1 -0
- package/build/server/chunks/chunks/{exports.js-CLTzaOxn.js → exports.js-C0rwMMtk.js} +2 -2
- package/build/server/chunks/chunks/{exports.js-CLTzaOxn.js.map → exports.js-C0rwMMtk.js.map} +1 -1
- package/build/server/chunks/chunks/{http.js-Dxoa-jtP.js → http.js-DvopzwKh.js} +2 -2
- package/build/server/chunks/chunks/{http.js-Dxoa-jtP.js.map → http.js-DvopzwKh.js.map} +1 -1
- package/build/server/chunks/chunks/{internal.js-BDBSzJId.js → internal.js-DGo2jPcg.js} +3 -3
- package/build/server/chunks/chunks/{internal.js-BDBSzJId.js.map → internal.js-DGo2jPcg.js.map} +1 -1
- package/build/server/chunks/chunks/internal2.js-BlXt2rfE.js.map +1 -1
- package/build/server/chunks/chunks/{library-store.js-BP8cL-qD.js → library-store.js-ZLudCJlT.js} +135 -64
- package/build/server/chunks/chunks/library-store.js-ZLudCJlT.js.map +1 -0
- package/build/server/chunks/chunks/{shared.js-BWXgl1Xf.js → shared.js-B1gC9MiJ.js} +2 -2
- package/build/server/chunks/chunks/{shared.js-BWXgl1Xf.js.map → shared.js-B1gC9MiJ.js.map} +1 -1
- package/build/server/chunks/chunks/{utils.js-9oI5Oz0w.js → utils.js-DnEJ3UjO.js} +3 -3
- package/build/server/chunks/chunks/{utils.js-9oI5Oz0w.js.map → utils.js-DnEJ3UjO.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/_...path_/{_server.ts.js-WknZVW_S.js → _server.ts.js-Cq5gXVQT.js} +5 -5
- package/build/server/chunks/entries/endpoints/api/_...path_/{_server.ts.js-WknZVW_S.js.map → _server.ts.js-Cq5gXVQT.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/_id_/{_server.ts.js-BrZ__-HZ.js → _server.ts.js-RXbedi8q.js} +6 -6
- package/build/server/chunks/entries/endpoints/api/assets/_id_/{_server.ts.js-BrZ__-HZ.js.map → _server.ts.js-RXbedi8q.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/{_server.ts.js-PqADGPXc.js → _server.ts.js-D7Qae9vU.js} +6 -6
- package/build/server/chunks/entries/endpoints/api/assets/{_server.ts.js-PqADGPXc.js.map → _server.ts.js-D7Qae9vU.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/delete/{_server.ts.js-OqoE5PN-.js → _server.ts.js-DtO20kgB.js} +6 -6
- package/build/server/chunks/entries/endpoints/api/assets/delete/{_server.ts.js-OqoE5PN-.js.map → _server.ts.js-DtO20kgB.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/move/{_server.ts.js-CJ08e1ho.js → _server.ts.js-BUebPbd5.js} +6 -6
- package/build/server/chunks/entries/endpoints/api/assets/move/{_server.ts.js-CJ08e1ho.js.map → _server.ts.js-BUebPbd5.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/folders/_path_/{_server.ts.js-DdF3eK2I.js → _server.ts.js-BjT2qPMT.js} +6 -6
- package/build/server/chunks/entries/endpoints/api/folders/_path_/{_server.ts.js-DdF3eK2I.js.map → _server.ts.js-BjT2qPMT.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/folders/{_server.ts.js-Cxt6jsJ5.js → _server.ts.js-DYRLsoT7.js} +6 -6
- package/build/server/chunks/entries/endpoints/api/folders/{_server.ts.js-Cxt6jsJ5.js.map → _server.ts.js-DYRLsoT7.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/manifests/_name_/{_server.ts.js-BWVM2Ntl.js → _server.ts.js-BbN2fGNN.js} +6 -6
- package/build/server/chunks/entries/endpoints/api/manifests/_name_/{_server.ts.js-BWVM2Ntl.js.map → _server.ts.js-BbN2fGNN.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/manifests/{_server.ts.js-Z2bM-qHM.js → _server.ts.js-b_MKZ41b.js} +6 -6
- package/build/server/chunks/entries/endpoints/api/manifests/{_server.ts.js-Z2bM-qHM.js.map → _server.ts.js-b_MKZ41b.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/state/{_server.ts.js-BX9H2Z34.js → _server.ts.js-evEfMpvn.js} +6 -6
- package/build/server/chunks/entries/endpoints/api/state/{_server.ts.js-BX9H2Z34.js.map → _server.ts.js-evEfMpvn.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/files/_...path_/{_server.ts.js-BWHDZ8mz.js → _server.ts.js-C04XE_1w.js} +5 -5
- package/build/server/chunks/entries/endpoints/files/_...path_/{_server.ts.js-BWHDZ8mz.js.map → _server.ts.js-C04XE_1w.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/files/proxy/_...path_/{_server.ts.js-CR_7mndO.js → _server.ts.js-DB8TdoEv.js} +6 -6
- package/build/server/chunks/entries/endpoints/files/proxy/_...path_/{_server.ts.js-CR_7mndO.js.map → _server.ts.js-DB8TdoEv.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/files/raw/_...path_/{_server.ts.js-Cw1PDBvb.js → _server.ts.js-BrpaijZO.js} +6 -6
- package/build/server/chunks/entries/endpoints/files/raw/_...path_/{_server.ts.js-Cw1PDBvb.js.map → _server.ts.js-BrpaijZO.js.map} +1 -1
- package/build/server/chunks/entries/{hooks.server.js-BHoE0yBi.js → hooks.server.js-BJJwZW_I.js} +5 -5
- package/build/server/chunks/entries/{hooks.server.js-BHoE0yBi.js.map → hooks.server.js-BJJwZW_I.js.map} +1 -1
- package/build/server/chunks/{handler-10cx4zHn.js → handler-DnbS2t1B.js} +5 -5
- package/build/server/chunks/{handler-10cx4zHn.js.map → handler-DnbS2t1B.js.map} +1 -1
- package/build/server/chunks/{index.js-DvPfiC00.js → index.js-g77q3Boj.js} +5 -5
- package/build/server/chunks/{index.js-DvPfiC00.js.map → index.js-g77q3Boj.js.map} +1 -1
- package/build/server/chunks/{manifest.js-DoPjUnzD.js → manifest.js-qmEXbstS.js} +20 -20
- package/build/server/chunks/{manifest.js-DoPjUnzD.js.map → manifest.js-qmEXbstS.js.map} +1 -1
- package/build/server/chunks/nodes/0.js-Bk6IZ-vD.js +11 -0
- package/build/server/chunks/nodes/{0.js-Di3qgAtW.js.map → 0.js-Bk6IZ-vD.js.map} +1 -1
- package/build/server/chunks/nodes/1.js-H-qwo4GJ.js +7 -0
- package/build/server/chunks/nodes/{1.js-BlWSFIA8.js.map → 1.js-H-qwo4GJ.js.map} +1 -1
- package/build/server/chunks/nodes/2.js-DRpXVLwp.js +7 -0
- package/build/server/chunks/nodes/{2.js-CO9nSPUN.js.map → 2.js-DRpXVLwp.js.map} +1 -1
- package/build/server/chunks/nodes/3.js-CDEzNFeU.js +7 -0
- package/build/server/chunks/nodes/3.js-CDEzNFeU.js.map +1 -0
- package/build/server/chunks/nodes/{4.js-B3IuagJW.js → 4.js-BKL7LSSm.js} +2 -2
- package/build/server/chunks/nodes/4.js-BKL7LSSm.js.map +1 -0
- package/dist/cli.js +9 -6
- package/dist/core/ingest.d.ts +7 -1
- package/dist/core/ingest.js +3 -19
- package/dist/core/plugins/registry.d.ts +16 -0
- package/dist/core/plugins/registry.js +52 -0
- package/dist/runtime/kind-handlers.d.ts +0 -6
- package/dist/runtime/kind-handlers.js +16 -7
- package/dist/server/config-loader.d.ts +3 -2
- package/dist/server/config-loader.js +24 -48
- package/dist/server/index.d.ts +1 -0
- package/dist/server/plugins/audio.d.ts +2 -1
- package/dist/server/plugins/audio.js +15 -1
- package/dist/server/plugins/chroma-key-video.js +2 -0
- package/dist/server/plugins/config.d.ts +13 -0
- package/dist/server/plugins/config.js +32 -0
- package/dist/server/plugins/contract.d.ts +17 -3
- package/dist/server/plugins/image.d.ts +2 -1
- package/dist/server/plugins/image.js +14 -1
- package/dist/server/plugins/slice.d.ts +2 -1
- package/dist/server/plugins/slice.js +14 -1
- package/dist/server/plugins/video.d.ts +2 -1
- package/dist/server/plugins/video.js +26 -1
- package/dist/server/plugins.d.ts +6 -6
- package/dist/server/plugins.js +3 -1
- package/dist/server/start.d.ts +13 -1
- package/dist/server/start.js +51 -4
- package/package.json +3 -1
- package/build/client/_app/immutable/assets/2.wavcNhPC.css.br +0 -0
- package/build/client/_app/immutable/assets/2.wavcNhPC.css.gz +0 -0
- package/build/client/_app/immutable/assets/3.Cjh_fXPY.css +0 -1
- package/build/client/_app/immutable/assets/3.Cjh_fXPY.css.br +0 -0
- package/build/client/_app/immutable/assets/3.Cjh_fXPY.css.gz +0 -0
- package/build/client/_app/immutable/assets/LibraryContextMenu.zyZtpKzC.css +0 -1
- package/build/client/_app/immutable/assets/LibraryContextMenu.zyZtpKzC.css.br +0 -0
- package/build/client/_app/immutable/assets/LibraryContextMenu.zyZtpKzC.css.gz +0 -0
- package/build/client/_app/immutable/chunks/BiIto6ft.js.br +0 -0
- package/build/client/_app/immutable/chunks/BiIto6ft.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CvY6YsFE.js.br +0 -0
- package/build/client/_app/immutable/chunks/CvY6YsFE.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DL0_39Ys.js +0 -5
- package/build/client/_app/immutable/chunks/DL0_39Ys.js.br +0 -0
- package/build/client/_app/immutable/chunks/DL0_39Ys.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DQ8SXFaX.js.br +0 -0
- package/build/client/_app/immutable/chunks/DQ8SXFaX.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DjdrdRzT.js +0 -1
- package/build/client/_app/immutable/chunks/DjdrdRzT.js.br +0 -0
- package/build/client/_app/immutable/chunks/DjdrdRzT.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.ubN0v9bN.js.br +0 -0
- package/build/client/_app/immutable/entry/app.ubN0v9bN.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.BW8dBDh6.js +0 -1
- package/build/client/_app/immutable/entry/start.BW8dBDh6.js.br +0 -0
- package/build/client/_app/immutable/entry/start.BW8dBDh6.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.Dr5ijCIl.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.Dr5ijCIl.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.DiIGIRAb.js.br +0 -3
- package/build/client/_app/immutable/nodes/1.DiIGIRAb.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.B8KYmQcV.js +0 -3
- package/build/client/_app/immutable/nodes/2.B8KYmQcV.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.B8KYmQcV.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.B1jc7arT.js +0 -104
- package/build/client/_app/immutable/nodes/3.B1jc7arT.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.B1jc7arT.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.BPK9n1mH.js +0 -2
- package/build/client/_app/immutable/nodes/4.BPK9n1mH.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.BPK9n1mH.js.gz +0 -0
- package/build/server/chunks/chunks/context.js-Bw4WWLhG.js.map +0 -1
- package/build/server/chunks/chunks/core.js-DDntpb72.js.map +0 -1
- package/build/server/chunks/chunks/library-store.js-BP8cL-qD.js.map +0 -1
- package/build/server/chunks/nodes/0.js-Di3qgAtW.js +0 -11
- package/build/server/chunks/nodes/1.js-BlWSFIA8.js +0 -7
- package/build/server/chunks/nodes/2.js-CO9nSPUN.js +0 -7
- package/build/server/chunks/nodes/3.js-C2D6xpEO.js +0 -7
- package/build/server/chunks/nodes/3.js-C2D6xpEO.js.map +0 -1
- package/build/server/chunks/nodes/4.js-B3IuagJW.js.map +0 -1
|
@@ -3,5 +3,6 @@
|
|
|
3
3
|
* No dimensions — the proxy's only output metadata is its duration.
|
|
4
4
|
*/
|
|
5
5
|
import { type AudioParameters, type AudioPreset } from '../../core/index.js';
|
|
6
|
-
import { type ServerAssetTypePlugin } from './contract.js';
|
|
6
|
+
import { type ServerAssetTypePlugin, type ServerPluginConfigDefinition } from './contract.js';
|
|
7
|
+
export declare const audioConfigDefinition: ServerPluginConfigDefinition;
|
|
7
8
|
export declare const audioServerPlugin: ServerAssetTypePlugin<AudioParameters, AudioPreset>;
|
|
@@ -2,12 +2,26 @@
|
|
|
2
2
|
* Audio plugin (server part): one ffmpeg transcode per preset.
|
|
3
3
|
* No dimensions — the proxy's only output metadata is its duration.
|
|
4
4
|
*/
|
|
5
|
-
import { audioPlugin } from '../../core/index.js';
|
|
5
|
+
import { AUDIO_BUILT_IN_PRESETS, audioPlugin, validateAudioPreset } from '../../core/index.js';
|
|
6
6
|
import { processAudioFile } from '../processing/audio-processing.js';
|
|
7
7
|
import { probeMedia } from '../processing/media-probe.js';
|
|
8
|
+
import { mergePresets } from './config.js';
|
|
8
9
|
import { requireProxyField, resolveNamedPreset } from './contract.js';
|
|
10
|
+
import { videoConfigDefinition } from './video.js';
|
|
11
|
+
export const audioConfigDefinition = {
|
|
12
|
+
namespace: 'audio',
|
|
13
|
+
resolve: ({ value }) => ({
|
|
14
|
+
presets: mergePresets({
|
|
15
|
+
label: 'audio',
|
|
16
|
+
builtIn: AUDIO_BUILT_IN_PRESETS,
|
|
17
|
+
pluginConfig: value,
|
|
18
|
+
validatePreset: validateAudioPreset
|
|
19
|
+
})
|
|
20
|
+
})
|
|
21
|
+
};
|
|
9
22
|
export const audioServerPlugin = {
|
|
10
23
|
descriptor: audioPlugin,
|
|
24
|
+
configDefinitions: [audioConfigDefinition, videoConfigDefinition],
|
|
11
25
|
pluginConfig: (config) => config.plugins.audio,
|
|
12
26
|
presets: (config) => config.plugins.audio.presets,
|
|
13
27
|
resolvePreset: (parameters, config) => resolveNamedPreset('audio', parameters.preset, config.plugins.audio.presets),
|
|
@@ -8,8 +8,10 @@ import { chromaKeyVideoPlugin } from '../../core/index.js';
|
|
|
8
8
|
import { probeMedia } from '../processing/media-probe.js';
|
|
9
9
|
import { processVideoFile } from '../processing/video-processing.js';
|
|
10
10
|
import { requireProxyField, resolveNamedPreset } from './contract.js';
|
|
11
|
+
import { videoConfigDefinition } from './video.js';
|
|
11
12
|
export const chromaKeyVideoServerPlugin = {
|
|
12
13
|
descriptor: chromaKeyVideoPlugin,
|
|
14
|
+
configDefinitions: [videoConfigDefinition],
|
|
13
15
|
// One preset namespace with the video plugin — the config slice,
|
|
14
16
|
// the preset map, and the resolution label are video's.
|
|
15
17
|
pluginConfig: (config) => config.plugins.video,
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
2
|
+
export declare function mergePresets<TPreset>(options: {
|
|
3
|
+
label: string;
|
|
4
|
+
builtIn: Record<string, TPreset>;
|
|
5
|
+
pluginConfig: unknown;
|
|
6
|
+
validatePreset: (name: string, value: unknown) => TPreset;
|
|
7
|
+
}): Record<string, TPreset>;
|
|
8
|
+
export declare function binaryPathOverride(options: {
|
|
9
|
+
projectRoot: string;
|
|
10
|
+
pluginConfig: unknown;
|
|
11
|
+
label: string;
|
|
12
|
+
key: string;
|
|
13
|
+
}): string | null;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { isAbsolute, resolve } from 'node:path';
|
|
2
|
+
export function isRecord(value) {
|
|
3
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
4
|
+
}
|
|
5
|
+
export function mergePresets(options) {
|
|
6
|
+
const { label, builtIn, pluginConfig, validatePreset } = options;
|
|
7
|
+
const merged = { ...builtIn };
|
|
8
|
+
if (pluginConfig === undefined)
|
|
9
|
+
return merged;
|
|
10
|
+
if (!isRecord(pluginConfig)) {
|
|
11
|
+
throw new Error(`fundus.config: "plugins.${label}" must be an object.`);
|
|
12
|
+
}
|
|
13
|
+
if (pluginConfig.presets === undefined)
|
|
14
|
+
return merged;
|
|
15
|
+
if (!isRecord(pluginConfig.presets)) {
|
|
16
|
+
throw new Error(`fundus.config: "plugins.${label}.presets" must be an object.`);
|
|
17
|
+
}
|
|
18
|
+
for (const [name, preset] of Object.entries(pluginConfig.presets)) {
|
|
19
|
+
merged[name] = validatePreset(name, preset);
|
|
20
|
+
}
|
|
21
|
+
return merged;
|
|
22
|
+
}
|
|
23
|
+
export function binaryPathOverride(options) {
|
|
24
|
+
const { projectRoot, pluginConfig, label, key } = options;
|
|
25
|
+
if (!isRecord(pluginConfig) || pluginConfig[key] === undefined)
|
|
26
|
+
return null;
|
|
27
|
+
const value = pluginConfig[key];
|
|
28
|
+
if (typeof value !== 'string' || value.length === 0) {
|
|
29
|
+
throw new Error(`fundus.config: "plugins.${label}.${key}" must be a non-empty string.`);
|
|
30
|
+
}
|
|
31
|
+
return isAbsolute(value) ? value : resolve(projectRoot, value);
|
|
32
|
+
}
|
|
@@ -4,8 +4,7 @@
|
|
|
4
4
|
* config slice, preset resolution, the processing step (sharp/ffmpeg), proxy
|
|
5
5
|
* probing, and the manifest-entry builder for codegen. The orchestrators
|
|
6
6
|
* (processor, codegen, check, store, operations) are type-agnostic and consult
|
|
7
|
-
* only the registry (plugins.ts)
|
|
8
|
-
* one `ServerAssetTypePlugin` + one registry entry — nothing else server-side.
|
|
7
|
+
* only the projected server registry (plugins.ts).
|
|
9
8
|
*/
|
|
10
9
|
import type { AssetTypePluginDescriptor, ManifestEntryData } from '../../core/index.js';
|
|
11
10
|
import type { ResolvedFundusConfig } from '../config-loader.js';
|
|
@@ -47,9 +46,24 @@ export interface ManifestEntryInput<TParameters> {
|
|
|
47
46
|
src: string;
|
|
48
47
|
proxy: AssetProxyInfo;
|
|
49
48
|
}
|
|
49
|
+
/** One host-config namespace required by a server plugin. */
|
|
50
|
+
export interface ServerPluginConfigDefinition {
|
|
51
|
+
/** Key below `plugins` in fundus.config.ts. */
|
|
52
|
+
namespace: string;
|
|
53
|
+
/** Validate and resolve that namespace's host value. */
|
|
54
|
+
resolve(context: {
|
|
55
|
+
projectRoot: string;
|
|
56
|
+
value: unknown;
|
|
57
|
+
}): unknown;
|
|
58
|
+
}
|
|
50
59
|
export interface ServerAssetTypePlugin<TParameters = unknown, TPreset = unknown> {
|
|
51
60
|
/** The environment-free half of the plugin (type key, ingestion, validation). */
|
|
52
61
|
descriptor: AssetTypePluginDescriptor<TParameters, unknown>;
|
|
62
|
+
/**
|
|
63
|
+
* Config namespaces this plugin needs. Shared definitions are deduplicated
|
|
64
|
+
* by identity (video, chroma-key-video, and audio share the video toolchain).
|
|
65
|
+
*/
|
|
66
|
+
configDefinitions: readonly ServerPluginConfigDefinition[];
|
|
53
67
|
/**
|
|
54
68
|
* The plugin's `plugins.<namespace>` config slice — handed to the
|
|
55
69
|
* descriptor's `defaultParameters` on ingest. Types may share a namespace
|
|
@@ -92,7 +106,7 @@ export interface ServerAssetTypePlugin<TParameters = unknown, TPreset = unknown>
|
|
|
92
106
|
*/
|
|
93
107
|
buildManifestEntry(input: ManifestEntryInput<TParameters>): ManifestEntryData;
|
|
94
108
|
}
|
|
95
|
-
/** The
|
|
109
|
+
/** The server projection consumed by type-agnostic orchestrators and tests. */
|
|
96
110
|
export type ServerPluginRegistry = Record<string, ServerAssetTypePlugin>;
|
|
97
111
|
/** Resolve a named preset out of a plugin's merged preset map, or throw listing the known names. */
|
|
98
112
|
export declare function resolveNamedPreset<TPreset>(label: string, presetName: string, presets: Record<string, TPreset>): TPreset;
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* Image plugin (server part): sharp scale + convert per preset.
|
|
3
3
|
*/
|
|
4
4
|
import { type ImageFormat, type ImageParameters, type ImagePreset } from '../../core/index.js';
|
|
5
|
-
import { type ServerAssetTypePlugin } from './contract.js';
|
|
5
|
+
import { type ServerAssetTypePlugin, type ServerPluginConfigDefinition } from './contract.js';
|
|
6
|
+
export declare const imageConfigDefinition: ServerPluginConfigDefinition;
|
|
6
7
|
/** The delivered file extension of an image-preset format. */
|
|
7
8
|
export declare function extensionForImageFormat(format: ImageFormat): string;
|
|
8
9
|
export declare const imageServerPlugin: ServerAssetTypePlugin<ImageParameters, ImagePreset>;
|
|
@@ -1,15 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Image plugin (server part): sharp scale + convert per preset.
|
|
3
3
|
*/
|
|
4
|
-
import { imagePlugin } from '../../core/index.js';
|
|
4
|
+
import { IMAGE_BUILT_IN_PRESETS, imagePlugin, validateImagePreset } from '../../core/index.js';
|
|
5
5
|
import { processImageFile, readImageDimensions } from '../processing/image-processing.js';
|
|
6
|
+
import { mergePresets } from './config.js';
|
|
6
7
|
import { requireProxyField, resolveNamedPreset } from './contract.js';
|
|
8
|
+
export const imageConfigDefinition = {
|
|
9
|
+
namespace: 'image',
|
|
10
|
+
resolve: ({ value }) => ({
|
|
11
|
+
presets: mergePresets({
|
|
12
|
+
label: 'image',
|
|
13
|
+
builtIn: IMAGE_BUILT_IN_PRESETS,
|
|
14
|
+
pluginConfig: value,
|
|
15
|
+
validatePreset: validateImagePreset
|
|
16
|
+
})
|
|
17
|
+
})
|
|
18
|
+
};
|
|
7
19
|
/** The delivered file extension of an image-preset format. */
|
|
8
20
|
export function extensionForImageFormat(format) {
|
|
9
21
|
return format === 'jpeg' ? 'jpg' : format;
|
|
10
22
|
}
|
|
11
23
|
export const imageServerPlugin = {
|
|
12
24
|
descriptor: imagePlugin,
|
|
25
|
+
configDefinitions: [imageConfigDefinition],
|
|
13
26
|
pluginConfig: (config) => config.plugins.image,
|
|
14
27
|
presets: (config) => config.plugins.image.presets,
|
|
15
28
|
resolvePreset: (parameters, config) => resolveNamedPreset('image', parameters.preset, config.plugins.image.presets),
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* keeps the source dimensions. The slicing data is entry-only.
|
|
5
5
|
*/
|
|
6
6
|
import { type ImagePreset, type SliceParameters } from '../../core/index.js';
|
|
7
|
-
import { type ServerAssetTypePlugin } from './contract.js';
|
|
7
|
+
import { type ServerAssetTypePlugin, type ServerPluginConfigDefinition } from './contract.js';
|
|
8
|
+
export declare const sliceConfigDefinition: ServerPluginConfigDefinition;
|
|
8
9
|
/**
|
|
9
10
|
* Best-effort guess of the asset's export scale from a `@2x` / `@3x` suffix in
|
|
10
11
|
* the file name (also tolerates `-`/`_` separators, e.g. `dialog-3x.png`).
|
|
@@ -3,10 +3,22 @@
|
|
|
3
3
|
* never resized — insets are authored in source pixels, so the delivered proxy
|
|
4
4
|
* keeps the source dimensions. The slicing data is entry-only.
|
|
5
5
|
*/
|
|
6
|
-
import { defaultInsetsForSize, slicePlugin } from '../../core/index.js';
|
|
6
|
+
import { SLICE_BUILT_IN_PRESETS, defaultInsetsForSize, slicePlugin, validateImagePreset } from '../../core/index.js';
|
|
7
7
|
import { processImageFile, readImageDimensions } from '../processing/image-processing.js';
|
|
8
8
|
import { extensionForImageFormat } from './image.js';
|
|
9
|
+
import { mergePresets } from './config.js';
|
|
9
10
|
import { requireProxyField, resolveNamedPreset } from './contract.js';
|
|
11
|
+
export const sliceConfigDefinition = {
|
|
12
|
+
namespace: 'slice',
|
|
13
|
+
resolve: ({ value }) => ({
|
|
14
|
+
presets: mergePresets({
|
|
15
|
+
label: 'slice',
|
|
16
|
+
builtIn: SLICE_BUILT_IN_PRESETS,
|
|
17
|
+
pluginConfig: value,
|
|
18
|
+
validatePreset: validateImagePreset
|
|
19
|
+
})
|
|
20
|
+
})
|
|
21
|
+
};
|
|
10
22
|
function hasAnySide(insets) {
|
|
11
23
|
if (!insets)
|
|
12
24
|
return false;
|
|
@@ -24,6 +36,7 @@ export function detectPixelRatio(fileName) {
|
|
|
24
36
|
}
|
|
25
37
|
export const sliceServerPlugin = {
|
|
26
38
|
descriptor: slicePlugin,
|
|
39
|
+
configDefinitions: [sliceConfigDefinition],
|
|
27
40
|
pluginConfig: (config) => config.plugins.slice,
|
|
28
41
|
presets: (config) => config.plugins.slice.presets,
|
|
29
42
|
resolvePreset: (parameters, config) => resolveNamedPreset('slice', parameters.preset, config.plugins.slice.presets),
|
|
@@ -2,5 +2,6 @@
|
|
|
2
2
|
* Video plugin (server part): one ffmpeg transcode per preset.
|
|
3
3
|
*/
|
|
4
4
|
import { type VideoParameters, type VideoPreset } from '../../core/index.js';
|
|
5
|
-
import { type ServerAssetTypePlugin } from './contract.js';
|
|
5
|
+
import { type ServerAssetTypePlugin, type ServerPluginConfigDefinition } from './contract.js';
|
|
6
|
+
export declare const videoConfigDefinition: ServerPluginConfigDefinition;
|
|
6
7
|
export declare const videoServerPlugin: ServerAssetTypePlugin<VideoParameters, VideoPreset>;
|
|
@@ -1,12 +1,37 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Video plugin (server part): one ffmpeg transcode per preset.
|
|
3
3
|
*/
|
|
4
|
-
import { videoPlugin } from '../../core/index.js';
|
|
4
|
+
import { VIDEO_BUILT_IN_PRESETS, validateVideoPreset, videoPlugin } from '../../core/index.js';
|
|
5
5
|
import { probeMedia } from '../processing/media-probe.js';
|
|
6
6
|
import { processVideoFile } from '../processing/video-processing.js';
|
|
7
|
+
import { binaryPathOverride, mergePresets } from './config.js';
|
|
7
8
|
import { requireProxyField, resolveNamedPreset } from './contract.js';
|
|
9
|
+
export const videoConfigDefinition = {
|
|
10
|
+
namespace: 'video',
|
|
11
|
+
resolve: ({ projectRoot, value }) => ({
|
|
12
|
+
presets: mergePresets({
|
|
13
|
+
label: 'video',
|
|
14
|
+
builtIn: VIDEO_BUILT_IN_PRESETS,
|
|
15
|
+
pluginConfig: value,
|
|
16
|
+
validatePreset: validateVideoPreset
|
|
17
|
+
}),
|
|
18
|
+
ffmpegPath: binaryPathOverride({
|
|
19
|
+
projectRoot,
|
|
20
|
+
pluginConfig: value,
|
|
21
|
+
label: 'video',
|
|
22
|
+
key: 'ffmpegPath'
|
|
23
|
+
}),
|
|
24
|
+
ffprobePath: binaryPathOverride({
|
|
25
|
+
projectRoot,
|
|
26
|
+
pluginConfig: value,
|
|
27
|
+
label: 'video',
|
|
28
|
+
key: 'ffprobePath'
|
|
29
|
+
})
|
|
30
|
+
})
|
|
31
|
+
};
|
|
8
32
|
export const videoServerPlugin = {
|
|
9
33
|
descriptor: videoPlugin,
|
|
34
|
+
configDefinitions: [videoConfigDefinition],
|
|
10
35
|
pluginConfig: (config) => config.plugins.video,
|
|
11
36
|
presets: (config) => config.plugins.video.presets,
|
|
12
37
|
resolvePreset: (parameters, config) => resolveNamedPreset('video', parameters.preset, config.plugins.video.presets),
|
package/dist/server/plugins.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The server-side
|
|
3
|
-
*
|
|
4
|
-
* processing + entry building — plugins/contract.ts)
|
|
2
|
+
* The server-side view of the central plugin registry. This module binds each
|
|
3
|
+
* available server implementation (core descriptor + config slice + presets +
|
|
4
|
+
* processing + entry building — plugins/contract.ts), then projects the
|
|
5
|
+
* centrally registered set onto that catalogue. The pipeline
|
|
5
6
|
* orchestrators (processor, codegen, check, store, operations) are
|
|
6
|
-
* type-agnostic and take the registry as a parameter defaulting to this map
|
|
7
|
-
*
|
|
8
|
-
* entry here — and tests can extend the registry without touching them.
|
|
7
|
+
* type-agnostic and take the registry as a parameter defaulting to this map.
|
|
8
|
+
* Tests can extend the resulting registry without touching the orchestrators.
|
|
9
9
|
*/
|
|
10
10
|
import type { AssetTypePluginDescriptor } from '../core/index.js';
|
|
11
11
|
import type { ServerAssetTypePlugin, ServerPluginRegistry } from './plugins/contract.js';
|
package/dist/server/plugins.js
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
|
+
import { plugins } from '../core/plugins/registry.js';
|
|
1
2
|
import { audioServerPlugin } from './plugins/audio.js';
|
|
2
3
|
import { chromaKeyVideoServerPlugin } from './plugins/chroma-key-video.js';
|
|
3
4
|
import { imageServerPlugin } from './plugins/image.js';
|
|
4
5
|
import { sliceServerPlugin } from './plugins/slice.js';
|
|
5
6
|
import { videoServerPlugin } from './plugins/video.js';
|
|
6
|
-
|
|
7
|
+
const serverPluginCatalogue = {
|
|
7
8
|
[imageServerPlugin.descriptor.type]: imageServerPlugin,
|
|
8
9
|
[sliceServerPlugin.descriptor.type]: sliceServerPlugin,
|
|
9
10
|
[videoServerPlugin.descriptor.type]: videoServerPlugin,
|
|
10
11
|
[chromaKeyVideoServerPlugin.descriptor.type]: chromaKeyVideoServerPlugin,
|
|
11
12
|
[audioServerPlugin.descriptor.type]: audioServerPlugin
|
|
12
13
|
};
|
|
14
|
+
export const serverPluginsByType = plugins.project(serverPluginCatalogue, 'server implementation');
|
|
13
15
|
export function serverPluginForType(type, registry = serverPluginsByType) {
|
|
14
16
|
const plugin = registry[type];
|
|
15
17
|
if (!plugin) {
|
package/dist/server/start.d.ts
CHANGED
|
@@ -1 +1,13 @@
|
|
|
1
|
-
export declare
|
|
1
|
+
export declare const DEFAULT_PORT = 7583;
|
|
2
|
+
interface StartBannerOptions {
|
|
3
|
+
port: number;
|
|
4
|
+
projectRoot: string;
|
|
5
|
+
color?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface RunStartOptions {
|
|
8
|
+
openBrowser?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** Format the human startup summary without pulling a terminal UI dependency into the CLI. */
|
|
11
|
+
export declare function formatStartBanner({ port, projectRoot, color }: StartBannerOptions): string;
|
|
12
|
+
export declare function runStart(projectRoot: string, { openBrowser }?: RunStartOptions): Promise<void>;
|
|
13
|
+
export {};
|
package/dist/server/start.js
CHANGED
|
@@ -2,9 +2,40 @@
|
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
3
|
import { resolve } from 'node:path';
|
|
4
4
|
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import open from 'open';
|
|
5
6
|
import { startServer } from './server.js';
|
|
6
|
-
export
|
|
7
|
-
|
|
7
|
+
export const DEFAULT_PORT = 7583;
|
|
8
|
+
function ansi(code, value, enabled) {
|
|
9
|
+
return enabled ? `\u001b[${code}m${value}\u001b[0m` : value;
|
|
10
|
+
}
|
|
11
|
+
/** Format the human startup summary without pulling a terminal UI dependency into the CLI. */
|
|
12
|
+
export function formatStartBanner({ port, projectRoot, color = false }) {
|
|
13
|
+
const url = `http://127.0.0.1:${port}`;
|
|
14
|
+
const brand = '◆ Fundus';
|
|
15
|
+
const editor = `Editor ${url}`;
|
|
16
|
+
const project = `Project ${projectRoot}`;
|
|
17
|
+
const ready = 'Ready · press Ctrl+C to stop';
|
|
18
|
+
const contentWidth = Math.max(42, brand.length, editor.length, project.length, ready.length);
|
|
19
|
+
const border = (value) => ansi('2', value, color);
|
|
20
|
+
const row = (plain, styled = plain) => `${border('│')} ${styled}${' '.repeat(contentWidth - plain.length)} ${border('│')}`;
|
|
21
|
+
const empty = row('');
|
|
22
|
+
return [
|
|
23
|
+
'',
|
|
24
|
+
border(`╭${'─'.repeat(contentWidth + 2)}╮`),
|
|
25
|
+
empty,
|
|
26
|
+
row(brand, `${ansi('38;2;24;152;243', '◆', color)} ${ansi('1', 'Fundus', color)}`),
|
|
27
|
+
empty,
|
|
28
|
+
row(editor, `${ansi('2', 'Editor', color)} ${ansi('4;36', url, color)}`),
|
|
29
|
+
row(project, `${ansi('2', 'Project', color)} ${projectRoot}`),
|
|
30
|
+
empty,
|
|
31
|
+
row(ready, ansi('32', ready, color)),
|
|
32
|
+
empty,
|
|
33
|
+
border(`╰${'─'.repeat(contentWidth + 2)}╯`)
|
|
34
|
+
].join('\n');
|
|
35
|
+
}
|
|
36
|
+
export async function runStart(projectRoot, { openBrowser = true } = {}) {
|
|
37
|
+
const resolvedProjectRoot = resolve(projectRoot);
|
|
38
|
+
process.env.FUNDUS_PROJECT_ROOT = resolvedProjectRoot;
|
|
8
39
|
process.env.FUNDUS_BODY_SIZE_LIMIT ??= 'Infinity';
|
|
9
40
|
process.env.FUNDUS_ADAPTER_BODY_SIZE_LIMIT = process.env.FUNDUS_BODY_SIZE_LIMIT;
|
|
10
41
|
process.env.FUNDUS_ADAPTER_PROTOCOL_HEADER = 'x-fundus-proto';
|
|
@@ -16,9 +47,25 @@ export async function runStart(projectRoot) {
|
|
|
16
47
|
if (typeof module.handler !== 'function') {
|
|
17
48
|
throw new Error(`The packaged Fundus handler at ${fileURLToPath(handlerUrl)} is invalid.`);
|
|
18
49
|
}
|
|
19
|
-
const configuredPort = Number(process.env.FUNDUS_API_PORT ??
|
|
50
|
+
const configuredPort = Number(process.env.FUNDUS_API_PORT ?? DEFAULT_PORT);
|
|
20
51
|
const server = await startServer({ handler: module.handler, port: configuredPort });
|
|
21
|
-
|
|
52
|
+
const editorUrl = `http://127.0.0.1:${server.port}`;
|
|
53
|
+
console.log(formatStartBanner({
|
|
54
|
+
port: server.port,
|
|
55
|
+
projectRoot: resolvedProjectRoot,
|
|
56
|
+
color: process.stdout.isTTY === true &&
|
|
57
|
+
process.env.NO_COLOR === undefined &&
|
|
58
|
+
process.env.TERM !== 'dumb'
|
|
59
|
+
}));
|
|
60
|
+
if (openBrowser) {
|
|
61
|
+
try {
|
|
62
|
+
await open(editorUrl);
|
|
63
|
+
}
|
|
64
|
+
catch (cause) {
|
|
65
|
+
console.warn(`Fundus could not open the editor in your browser. Open ${editorUrl} manually.\n` +
|
|
66
|
+
(cause instanceof Error ? cause.message : String(cause)));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
22
69
|
let signalStop;
|
|
23
70
|
const stopForSignal = () => {
|
|
24
71
|
signalStop ??= server.stop().then(() => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fundus",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
"build": "npm run build:package && npm run build:app",
|
|
40
40
|
"test": "npm run build && vitest run",
|
|
41
41
|
"smoke:pack": "node scripts/smoke-packed.mjs",
|
|
42
|
+
"smoke:e2e": "npm run build && node scripts/smoke-sveltekit.mjs",
|
|
42
43
|
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json && tsc --noEmit",
|
|
43
44
|
"lint": "prettier --check .",
|
|
44
45
|
"format": "prettier --write .",
|
|
@@ -51,6 +52,7 @@
|
|
|
51
52
|
"ffmpeg-static": "^5.3.0",
|
|
52
53
|
"ffprobe-static": "^3.1.0",
|
|
53
54
|
"jiti": "^2.5.1",
|
|
55
|
+
"open": "^11.0.0",
|
|
54
56
|
"sharp": "^0.34.4"
|
|
55
57
|
},
|
|
56
58
|
"peerDependencies": {
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.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}.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.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}.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}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}section.svelte-ij1927{border-bottom:1px solid var(--border-soft);padding:12px}.field.svelte-ij1927{margin-bottom:8px}.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}section.svelte-3jblpy{border-bottom:1px solid var(--border-soft);padding:12px}.field.svelte-3jblpy{margin-bottom:8px}.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}.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}.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}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}.detail.svelte-xy8zsr{flex:1;grid-template-columns:224px 1fr 280px;min-height:0;display:grid}.center.svelte-xy8zsr{flex-direction:column;min-width:0;min-height:0;padding:12px 16px;display:flex}.center.empty.svelte-xy8zsr,.empty.svelte-xy8zsr{color:var(--text-dim);flex:1;justify-content:center;align-items:center;display:flex}.tabs.svelte-xy8zsr{flex:none;gap:4px;margin-bottom:4px;display:inline-flex}.tabs.svelte-xy8zsr button:where(.svelte-xy8zsr){border-radius:var(--radius);color:var(--text-dim);background:0 0;border:none;padding:4px 10px}.tabs.svelte-xy8zsr button.on:where(.svelte-xy8zsr){background:var(--accent-soft);color:var(--accent)}.pane.svelte-xy8zsr{flex:1;min-height:0}.image-stage.svelte-xy8zsr{border:1px solid var(--border);border-radius:8px;justify-content:center;align-items:center;display:flex;overflow:auto}.image-stage.svelte-xy8zsr img{object-fit:contain;max-width:90%;max-height:90%}.preview-column.svelte-xy8zsr{flex-direction:column;align-items:center;gap:8px;display:flex}.video-frame.svelte-xy8zsr{width:min(90%,480px)}.video-frame.svelte-xy8zsr video{width:100%;height:100%}.compare-row.svelte-xy8zsr{justify-content:center;align-items:flex-start;gap:16px;width:100%;max-width:760px;display:flex}.compare.svelte-xy8zsr{flex-direction:column;flex:1 1 0;align-items:center;gap:6px;min-width:0;margin:0;display:flex}.compare.svelte-xy8zsr figcaption:where(.svelte-xy8zsr){text-transform:uppercase;letter-spacing:.06em;color:var(--text-faint);font-size:10px}.compare.svelte-xy8zsr .video-frame:where(.svelte-xy8zsr){width:100%}.audio-frame.svelte-xy8zsr{width:min(90%,480px);height:128px}.stage-hint.svelte-xy8zsr{color:var(--text-dim)}.inspector.svelte-xy8zsr{background:var(--panel);border-left:1px solid var(--border);overflow-y:auto}.inspector.svelte-xy8zsr section:where(.svelte-xy8zsr){border-bottom:1px solid var(--border-soft);padding:12px}.inspector.svelte-xy8zsr h2:where(.svelte-xy8zsr){word-break:break-all;margin:0;font-size:13px}.raw.svelte-xy8zsr{color:var(--text-dim);word-break:break-all;margin:4px 0 0}.warning.svelte-xy8zsr{color:var(--warning);margin:8px 0 0;font-size:11px}.hint.svelte-xy8zsr{color:var(--text-faint);margin:0;font-size:11px}.inspector.svelte-xy8zsr h4:where(.svelte-xy8zsr){text-transform:uppercase;letter-spacing:.06em;color:var(--text-faint);margin:8px 0 4px;font-size:10px}.reference-row.svelte-xy8zsr{border-radius:var(--radius);color:var(--text-dim);align-items:center;gap:6px;min-width:0;padding:3px 4px;display:flex}.reference-row.svelte-xy8zsr:hover{background:var(--panel-raised);color:var(--text)}.reference-field.svelte-xy8zsr{color:var(--text-faint);font-size:11px}.reference-arrow.svelte-xy8zsr{color:var(--text-faint);flex:none}.reference-asset.svelte-xy8zsr{color:var(--accent);text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.rename.svelte-xy8zsr{gap:8px;margin-bottom:8px;display:flex}.rename.svelte-xy8zsr input:where(.svelte-xy8zsr){flex:1;min-width:0}.danger.svelte-xy8zsr{width:100%}
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.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:48px;color:var(--text-dim);flex:none}.row.svelte-1f5yh58 input:where(.svelte-1f5yh58){flex:1}.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}.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}h3.svelte-1ol624f{letter-spacing:0;text-transform:none;color:#fff;margin:0 0 10px;font-size:11px;font-weight:400}.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)}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import{$ as e,B as t,E as n,G as r,I as i,J as a,K as o,L as s,M as c,N as l,O as u,P as d,S as f,T as p,U as m,W as h,X as g,Y as _,a as v,b as y,c as b,d as x,et as S,g as C,h as w,i as T,it as E,j as D,k as O,l as k,s as A,w as j,z as M}from"./CNRz3sSw.js";import"./CvY6YsFE.js";import"./xihTtKlq.js";import{f as N,l as P,n as ee,o as F,p as I,t as L}from"./CO4RBJfa.js";import{i as R,m as te,r as ne,t as re}from"./BiIto6ft.js";var z=/[\u0000-\u001f\u007f]/,B=/[<>:"|?*]/,V=/^(con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\..*)?$/i;function H(e){return e.length===0?`Folder names must not be empty.`:e===e.trim()?e===`.`||e===`..`?`"${e}" is not a valid folder name.`:e.includes(`/`)||e.includes(`\\`)?`Folder names must not contain path separators.`:z.test(e)?`Folder names must not contain control characters.`:B.test(e)?`Folder names must not contain Windows-reserved characters (: * ? " < > |).`:e.endsWith(`.`)?`Folder names must not end with a dot.`:e.toLocaleLowerCase(`en-US`)===`root`?`"${e}" is reserved for the implicit Fundus root folder.`:e.toLocaleLowerCase(`en-US`)===`.gitkeep`?`"${e}" is reserved for Fundus folder management.`:V.test(e)?`"${e}" is a reserved filesystem name.`:null:`Folder names must not start or end with whitespace.`}function U(e){return e.split(`/`).map(e=>e.normalize(`NFC`)).join(`/`)}function W(e){return U(e).toLocaleLowerCase(`en-US`)}function ie(e){let t=e.lastIndexOf(`/`);return t===-1?``:e.slice(0,t)}function ae(e){let t=e.lastIndexOf(`/`);return t===-1?e:e.slice(t+1)}function oe(e,t){return e===``?t:`${e}/${t}`}function G(e,t){return e===t||e.startsWith(`${t}/`)}var K=u(`<p class="error svelte-1f5yh58">This file type is not supported (raster images, video, or audio).</p>`),se=u(`<button> </button>`),q=u(`<p class="hint warn svelte-1f5yh58"> </p>`),J=u(`<p class="hint warn svelte-1f5yh58">An asset with this id already exists.</p>`),Y=u(`<div class="row svelte-1f5yh58"><span class="label svelte-1f5yh58">Type</span> <div class="segmented svelte-1f5yh58"></div></div> <label class="row svelte-1f5yh58"><span class="label svelte-1f5yh58">Id</span> <input class="control svelte-1f5yh58" type="text" spellcheck="false"/></label> <!> <!>`,1),ce=u(`<div class="backdrop svelte-1f5yh58" role="presentation"><div class="dialog svelte-1f5yh58" role="dialog" aria-label="Import asset" tabindex="-1"><h2 class="svelte-1f5yh58">Import asset</h2> <p class="file-name svelte-1f5yh58"> </p> <p class="destination svelte-1f5yh58"> </p> <!> <div class="actions svelte-1f5yh58"><button class="control">Cancel</button> <button class="control primary"> </button></div></div></div>`);function X(i,s){S(s,!0);let l=g(()=>R(s.file.name)),u=_(`image`),m=_(`asset`),v=_(!1),y=_(null);t(()=>{a(u,R(s.file.name)[0]??`image`,!0),a(m,ne(s.file.name),!0)});let x=g(()=>L.state?.assets.some(e=>e.id===d(m))??!1),w=g(()=>te(d(m))),T=g(()=>d(w)===null),D=g(()=>d(T)&&!d(x)&&d(l).length>0&&!d(v));async function O(){if(!d(D))return;let e=d(m),t=d(u);a(v,!0),a(y,null);try{await L.mutate(()=>I(s.file,t,e,s.folder)),s.onDone(e)}catch(e){a(y,e instanceof Error?e.message:String(e),!0)}finally{a(v,!1)}}var k=ce(),N=h(k),P=o(h(N),2),ee=h(P,!0);E(P);var F=o(P,2),re=h(F);E(F);var z=o(F,2),B=e=>{n(e,K())},V=e=>{var t=Y(),i=r(t),s=o(h(i),2);f(s,20,()=>d(l),e=>e,(e,t)=>{var r=se();let i;var o=h(r,!0);E(r),M(()=>{r.disabled=d(v),i=C(r,1,`svelte-1f5yh58`,null,i,{on:d(u)===t}),p(o,t)}),c(`click`,r,()=>a(u,t,!0)),n(e,r)}),E(s),E(i);var g=o(i,2),_=o(h(g),2);b(_),E(g);var S=o(g,2),D=e=>{var t=q(),r=h(t,!0);E(t),M(()=>p(r,d(w))),n(e,t)},O=e=>{n(e,J())};j(S,e=>{d(T)?d(x)&&e(O,1):e(D)});var k=o(S,2),N=e=>{var t=q(),r=h(t,!0);E(t),M(()=>p(r,d(y))),n(e,t)};j(k,e=>{d(y)&&e(N)}),M(()=>_.disabled=d(v)),A(_,()=>d(m),e=>a(m,e)),n(e,t)};j(z,e=>{d(l).length===0?e(B):e(V,-1)});var H=o(z,2),U=h(H),W=o(U,2),ie=h(W,!0);E(W),E(H),E(N),E(k),M(()=>{p(ee,s.file.name),p(re,`Destination: ${(s.folder||`Root`)??``}`),W.disabled=!d(D),p(ie,d(v)?`Importing…`:`Import`)}),c(`click`,k,function(...e){s.onCancel?.apply(this,e)}),c(`click`,N,e=>e.stopPropagation()),c(`keydown`,N,e=>{e.key===`Escape`&&s.onCancel()}),c(`click`,U,function(...e){s.onCancel?.apply(this,e)}),c(`click`,W,()=>void O()),n(i,k),e()}D([`click`,`keydown`]);function Z(e){let t=Number.isFinite(e)&&e>0?Math.floor(e):0;return`${Math.floor(t/60)}:${(t%60).toString().padStart(2,`0`)}`}var le=O(`<svg viewBox="0 0 16 16" aria-hidden="true" class="svelte-nchstv"><rect x="4.5" y="3.5" width="2.5" height="9" fill="currentColor"></rect><rect x="9" y="3.5" width="2.5" height="9" fill="currentColor"></rect></svg>`),ue=O(`<svg viewBox="0 0 16 16" aria-hidden="true" class="svelte-nchstv"><path d="M5 3.3v9.4l7-4.7z" fill="currentColor"></path></svg>`),de=u(`<span class="time svelte-nchstv"> </span> <input class="range scrub svelte-nchstv" type="range" min="0" step="0.01" aria-label="Seek"/> <span class="time svelte-nchstv"> </span>`,1),fe=u(`<span class="time svelte-nchstv"> </span>`),pe=O(`<svg viewBox="0 0 16 16" aria-hidden="true" class="svelte-nchstv"><path d="M2.5 6h2l3-2.5v9l-3-2.5h-2z" fill="currentColor"></path><path d="M10 6l3.5 4M13.5 6 10 10" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"></path></svg>`),me=O(`<svg viewBox="0 0 16 16" aria-hidden="true" class="svelte-nchstv"><path d="M2.5 6h2l3-2.5v9l-3-2.5h-2z" fill="currentColor"></path><path d="M10 5.6a3.4 3.4 0 0 1 0 4.8" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"></path><path d="M11.8 3.9a6 6 0 0 1 0 8.2" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"></path></svg>`),he=u(`<div class="volume-group svelte-nchstv"><button class="btn svelte-nchstv" type="button"><!></button> <input class="range volume svelte-nchstv" type="range" min="0" max="1" step="0.01" aria-label="Volume"/></div>`),ge=u(`<div><button class="btn svelte-nchstv" type="button"><!></button> <button class="btn svelte-nchstv" type="button" aria-label="Stop"><svg viewBox="0 0 16 16" aria-hidden="true" class="svelte-nchstv"><rect x="4" y="4" width="8" height="8" rx="1" fill="currentColor"></rect></svg></button> <button type="button" aria-label="Loop"><svg viewBox="0 0 16 16" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" class="svelte-nchstv"><path d="M4.4 4.5H9A3.5 3.5 0 0 1 12.5 8"></path><path d="M2.4 6.4 4.3 4.4 6.3 6.1"></path><path d="M11.6 11.5H7A3.5 3.5 0 0 1 3.5 8"></path><path d="M13.6 9.6 11.7 11.6 9.7 9.9"></path></svg></button> <!> <!></div>`);function _e(i,s){S(s,!0);let l=T(s,`media`,7),u=T(s,`showScrub`,3,!1),f=T(s,`showVolume`,3,!0),m=_(!1),v=_(0),y=_(0),w=_(!1),D=_(1),O=_(!1),A=_(!1),N=!1,P=null,ee=g(()=>Z(d(v))),F=g(()=>Z(d(y))),I=g(()=>d(y)>0),L=g(()=>d(O)?0:d(D));t(()=>{if(!l()){a(m,!1);return}let e=l();a(m,!e.paused),a(v,e.currentTime,!0),a(y,Number.isFinite(e.duration)?e.duration:0,!0),a(w,e.loop,!0),a(D,e.volume,!0),a(O,e.muted,!0);function t(){a(m,!0)}function n(){a(m,!1)}function r(){d(A)||a(v,e.currentTime,!0)}function i(){a(y,Number.isFinite(e.duration)?e.duration:0,!0)}function o(){a(D,e.volume,!0),a(O,e.muted,!0)}return e.addEventListener(`play`,t),e.addEventListener(`playing`,t),e.addEventListener(`pause`,n),e.addEventListener(`ended`,n),e.addEventListener(`timeupdate`,r),e.addEventListener(`seeked`,r),e.addEventListener(`loadedmetadata`,i),e.addEventListener(`durationchange`,i),e.addEventListener(`volumechange`,o),()=>{P===e&&(a(A,!1),N=!1,P=null),e.removeEventListener(`play`,t),e.removeEventListener(`playing`,t),e.removeEventListener(`pause`,n),e.removeEventListener(`ended`,n),e.removeEventListener(`timeupdate`,r),e.removeEventListener(`seeked`,r),e.removeEventListener(`loadedmetadata`,i),e.removeEventListener(`durationchange`,i),e.removeEventListener(`volumechange`,o)}});function R(){l()&&(l().paused?l().play():l().pause())}function te(){l()&&(l().pause(),l().currentTime=0)}function ne(){l()&&(l().loop=!l().loop,a(w,l().loop,!0))}function re(){l()&&(l().muted=!l().muted)}function z(e){if(!l())return;let t=e.currentTarget.valueAsNumber;l().volume=t,l().muted=t===0}function B(){!l()||d(A)||(a(A,!0),N=!l().paused,P=l(),l().pause())}function V(e){let t=P??l();if(!t)return;let n=e.currentTarget.valueAsNumber;Number.isFinite(t.duration)&&(t.currentTime=n),a(v,n,!0)}function H(){if(!d(A))return;let e=P;a(A,!1),N&&e&&l()===e&&e.play(),N=!1,P=null}t(()=>{if(d(A))return window.addEventListener(`pointerup`,H),window.addEventListener(`pointercancel`,H),()=>{window.removeEventListener(`pointerup`,H),window.removeEventListener(`pointercancel`,H)}});var U=ge(),W=h(U),ie=h(W),ae=e=>{n(e,le())},oe=e=>{n(e,ue())};j(ie,e=>{d(m)?e(ae):e(oe,-1)}),E(W);var G=o(W,2),K=o(G,2);let se;var q=o(K,2),J=e=>{var t=de(),i=r(t),a=h(i,!0);E(i);var s=o(i,2);b(s);var u=o(s,2),f=h(u,!0);E(u),M(()=>{p(a,d(ee)),k(s,`max`,d(I)?d(y):0),x(s,d(v)),s.disabled=!l()||!d(I),p(f,d(F))}),c(`pointerdown`,s,B),c(`input`,s,V),n(e,t)},Y=e=>{var t=fe(),r=h(t);E(t),M(()=>p(r,`${d(ee)??``} / ${d(F)??``}`)),n(e,t)};j(q,e=>{u()?e(J):d(I)&&e(Y,1)});var ce=o(q,2),X=e=>{var t=he(),r=h(t),i=h(r),a=e=>{n(e,pe())},s=e=>{n(e,me())};j(i,e=>{d(O)||d(D)===0?e(a):e(s,-1)}),E(r);var u=o(r,2);b(u),E(t),M(()=>{r.disabled=!l(),k(r,`aria-label`,d(O)?`Unmute`:`Mute`),x(u,d(L)),u.disabled=!l()}),c(`click`,r,re),c(`input`,u,z),n(e,t)};j(ce,e=>{f()&&e(X)}),E(U),M(()=>{C(U,1,`playback ${s.class??``??``}`,`svelte-nchstv`),W.disabled=!l(),k(W,`aria-label`,d(m)?`Pause`:`Play`),G.disabled=!l(),se=C(K,1,`btn svelte-nchstv`,null,se,{active:d(w)}),K.disabled=!l(),k(K,`aria-pressed`,d(w))}),c(`click`,W,R),c(`click`,G,te),c(`click`,K,ne),n(i,U),e()}D([`click`,`pointerdown`,`input`]);var ve=null;function ye(){return ve||=new AudioContext,ve}var Q=null;function be(e){let t=e.numberOfChannels;if(t===1)return e.getChannelData(0);let n=e.length,r=new Float32Array(n);for(let i=0;i<t;i++){let t=e.getChannelData(i);for(let e=0;e<n;e++)r[e]+=t[e]}for(let e=0;e<n;e++)r[e]/=t;return r}function xe(e,t){let n=new Float32Array(t),r=new Float32Array(t),i=e.length/t;for(let a=0;a<t;a++){let t=Math.floor(a*i),o=Math.min(e.length,Math.floor((a+1)*i)),s=0,c=0;for(let n=t;n<o;n++){let t=e[n];t<s&&(s=t),t>c&&(c=t)}n[a]=s,r[a]=c}return{min:n,max:r}}function Se(e,t,n){return Math.min(n,Math.max(t,e))}var Ce=u(`<div class="footer svelte-1liihyn"><!></div>`),we=u(`<div><canvas class="wave svelte-1liihyn" role="button" tabindex="0" aria-label="Audio waveform — click or press Enter to play; arrow keys scrub"></canvas> <!></div>`);function Te(r,i){S(i,!0);let l=T(i,`loop`,3,!1),u=T(i,`showControls`,3,!1),f=_(void 0),p=_(null),m=_(!1),g=_(0),y=_(0),b=`idle`,x=null,w=null,D=0,O=1,k=`#0d99ff`,A=`#7a7a7a`,N=`#f24822`,P=0;function ee(){if(!d(f))return;let e=getComputedStyle(d(f));k=e.getPropertyValue(`--accent`).trim()||k,A=e.getPropertyValue(`--text-faint`).trim()||A,N=e.getPropertyValue(`--danger`).trim()||N}function F(){if(!d(f))return;let e=d(f).getBoundingClientRect();O=window.devicePixelRatio||1;let t=Math.max(1,Math.round(e.width*O)),n=Math.max(1,Math.round(e.height*O));(d(f).width!==t||d(f).height!==n)&&(d(f).width=t,d(f).height=n,w=null),ee()}function I(){if(!d(f))return;let e=d(f).getContext(`2d`);if(!e)return;let t=d(f).width,n=d(f).height,r=n/2;if(e.clearRect(0,0,t,n),b!==`ready`||!x){e.strokeStyle=b===`error`?N:A,e.lineWidth=Math.max(1,O),e.beginPath(),e.moveTo(0,r),e.lineTo(t,r),e.stroke();return}let i=Math.max(1,Math.floor(t));(!w||D!==i)&&(w=xe(x,i),D=i);let a=d(y)>0?Se(d(g)/d(y),0,1):0,o=a*t,s=r*.9,c=t/i;e.lineWidth=1;for(let t=0;t<i;t++){let n=t*c,i=r-w.max[t]*s,a=r-w.min[t]*s;e.strokeStyle=n<=o?k:A,e.beginPath(),e.moveTo(n+.5,Math.min(i,r-.5)),e.lineTo(n+.5,Math.max(a,r+.5)),e.stroke()}a>0&&(e.strokeStyle=k,e.lineWidth=Math.max(1,O),e.beginPath(),e.moveTo(o,0),e.lineTo(o,n),e.stroke())}function L(){P&&=(cancelAnimationFrame(P),0)}function R(){d(p)&&a(g,d(p).currentTime,!0),I(),d(m)&&(P=requestAnimationFrame(R))}async function te(e){b=`loading`,I();try{let t=await(await fetch(e)).arrayBuffer(),n=await ye().decodeAudioData(t);if(e!==i.src)return;x=be(n),d(y)||a(y,n.duration,!0),b=`ready`,w=null,I()}catch{if(e!==i.src)return;b=`error`,I()}}function ne(e){if(e.preventDefault(),e.stopPropagation(),!d(f)||!d(p))return;let t=d(f).getBoundingClientRect(),n=Se((e.clientX-t.left)/t.width,0,1),r=d(p).duration;Number.isFinite(r)&&r>0&&(d(p).currentTime=n*r),d(p).play()}function re(){d(p)&&(d(p).paused?d(p).play():d(p).pause())}function z(e){if(d(p)){if(e.key===`Enter`||e.key===` `){e.preventDefault(),re();return}if(e.key===`ArrowRight`||e.key===`ArrowLeft`){let t=d(p).duration;if(!Number.isFinite(t)||t<=0)return;e.preventDefault();let n=e.key===`ArrowRight`?5:-5;d(p).currentTime=Se(d(p).currentTime+n,0,t)}}}t(()=>{let e=d(p);e&&(e.loop=l())}),t(()=>{let e=i.src,t=d(f);if(!t)return;b=`idle`,x=null,w=null,D=0,a(g,0),a(y,0),a(m,!1);let n=new Audio(e);n.preload=`metadata`,n.loop=s(()=>l());function r(){Q&&Q!==n&&Q.pause(),Q=n,a(m,!0),L(),P=requestAnimationFrame(R)}function o(){Q===n&&(Q=null),a(m,!1),L(),I()}function c(){Q===n&&(Q=null),a(m,!1),L(),I()}function u(){a(g,n.currentTime,!0),d(m)||I()}function h(){Number.isFinite(n.duration)&&a(y,n.duration,!0),I()}n.addEventListener(`play`,r),n.addEventListener(`pause`,o),n.addEventListener(`ended`,c),n.addEventListener(`timeupdate`,u),n.addEventListener(`loadedmetadata`,h),n.addEventListener(`durationchange`,h),n.addEventListener(`seeked`,u),a(p,n,!0);let _=new ResizeObserver(()=>{F(),I()});_.observe(t);let v=new IntersectionObserver(t=>{t.some(e=>e.isIntersecting)&&(v.disconnect(),te(e))});return v.observe(t),F(),I(),()=>{L(),_.disconnect(),v.disconnect(),n.removeEventListener(`play`,r),n.removeEventListener(`pause`,o),n.removeEventListener(`ended`,c),n.removeEventListener(`timeupdate`,u),n.removeEventListener(`loadedmetadata`,h),n.removeEventListener(`durationchange`,h),n.removeEventListener(`seeked`,u),n.pause(),Q===n&&(Q=null),n.removeAttribute(`src`),n.load(),a(p,null)}});var B=we(),V=h(B);v(V,e=>a(f,e),()=>d(f));var H=o(V,2),U=e=>{var t=Ce();_e(h(t),{get media(){return d(p)}}),E(t),n(e,t)};j(H,e=>{u()&&e(U)}),E(B),M(()=>C(B,1,`audio-waveform ${i.class??``??``}`,`svelte-1liihyn`)),c(`click`,V,ne),c(`keydown`,V,z),n(r,B),e()}D([`click`,`keydown`]);var Ee=u(`<h3 class="svelte-1ol624f"><!></h3>`);function De(e,t){var r=Ee();y(h(r),()=>t.children),E(r),n(e,r)}function Oe(e,t){return e!==t&&!G(t,e)&&ie(e)!==t}function ke(e,t,n){return e&&t!==null&&Oe(t,n)}var Ae=O(`<svg viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path d="M1.25 4.25A1.75 1.75 0 0 1 3 2.5h2.45c.55 0 1.06.26 1.39.7l.6.8H13a1.75 1.75 0 0 1 1.75 1.75v5.5A1.75 1.75 0 0 1 13 13H3a1.75 1.75 0 0 1-1.75-1.75v-7Z" fill="currentColor"></path><path d="M1.75 6h12.5" stroke="currentColor" stroke-opacity="0.35"></path></svg>`);function je(e,t){let r=T(t,`size`,3,14);var i=Ae();M(()=>{k(i,`width`,r()),k(i,`height`,r())}),n(e,i)}var Me=u(`<span class="asset-warning svelte-ftwms1">⚠</span>`),Ne=u(`<div class="asset-row svelte-ftwms1"><button class="row asset current svelte-ftwms1" draggable="true" aria-current="page"><span class="glyph asset-glyph svelte-ftwms1">◆</span> <span class="label svelte-ftwms1"> </span> <!></button></div>`),Pe=u(`<div class="folder-row svelte-ftwms1"><button draggable="true"><span class="glyph svelte-ftwms1"><!></span><span class="label svelte-ftwms1"> </span><span class="count svelte-ftwms1"> </span></button></div> <!>`,1),Fe=u(`<p class="dialog-warning svelte-ftwms1"> </p>`),Ie=u(`<p class="dialog-warning svelte-ftwms1">A sibling folder with this name already exists.</p>`),Le=u(`<label class="dialog-row svelte-ftwms1"><span class="svelte-ftwms1">Name</span> <input class="control svelte-ftwms1" spellcheck="false"/></label> <p class="dialog-path svelte-ftwms1"> </p> <!> <!> <!>`,1),Re=u(`<p class="dialog-text svelte-ftwms1">Delete <strong> </strong> </p> <!> <!>`,1),ze=u(`<aside class="directory svelte-ftwms1" aria-label="Asset folders"><header class="svelte-ftwms1"><strong class="svelte-ftwms1">Folders</strong> <div class="actions svelte-ftwms1"><button class="icon-button svelte-ftwms1">+</button> <button class="icon-button svelte-ftwms1">✎</button> <button class="icon-button danger svelte-ftwms1">×</button></div></header> <div class="tree svelte-ftwms1"><button><span class="glyph svelte-ftwms1">▦</span><span class="label svelte-ftwms1">All Assets</span><span class="count svelte-ftwms1"> </span></button> <button><span class="glyph svelte-ftwms1">⌂</span><span class="label svelte-ftwms1">Root</span><span class="count svelte-ftwms1"> </span></button> <!> <!></div></aside> <!> <!>`,1);function Be(s,u){S(u,!0);let m=T(u,`activeAsset`,3,null),y=T(u,`sharedDraggedFolder`,3,null),x=_(null),D=_(null),O=g(()=>y()??d(D)),I=g(()=>L.state?.library.folders??[]),R=g(()=>L.state?.assets??[]),te=g(()=>[...d(I)].sort((e,t)=>e.localeCompare(t)));function ne(e){return d(R).filter(t=>t.folder===e).length}function z(e,t){let n=e.dataTransfer?.types.includes(`application/x-fundus-assets`)??!1,r=ke(e.dataTransfer?.types.includes(`application/x-fundus-folder`)??!1,d(O),t);!n&&!r||(e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect=`move`),a(x,t,!0))}function B(e,t){e.preventDefault(),a(x,null);let n=e.dataTransfer?.getData(`application/x-fundus-assets`);if(n){try{let e=JSON.parse(n);Array.isArray(e)&&e.every(e=>typeof e==`string`)&&u.onMoveAssets(e,t)}catch{}return}let r=e.dataTransfer?.getData(`application/x-fundus-folder`)||d(O);r&&Oe(r,t)&&U(r,t)}function V(e,t){m()||u.selectedFolder!==null&&G(u.selectedFolder,e)&&u.onSelect(`${t}${u.selectedFolder.slice(e.length)}`)}async function U(e,t){let n=oe(t,ae(e));try{await L.mutate(()=>P(e,t)),V(e,n)}catch{}finally{a(D,null),u.onFolderDragEnd?.()}}let K=_(null),se=_(``),q=_(null),J=_(null),Y=_(``),ce=_(void 0),X=_(!1),Z=_(null),le=g(()=>u.selectedFolder!==null&&u.selectedFolder!==``?u.selectedFolder:null),ue=g(()=>d(Y)===``?null:H(d(Y))),de=g(()=>oe(d(K)===`rename`?ie(d(q)??``):d(se),d(Y).normalize(`NFC`))),fe=g(()=>d(Y)!==``&&d(I).some(e=>e!==(d(K)===`rename`?d(q):null)&&W(e)===W(d(de)))),pe=g(()=>d(Y)!==``&&!d(ue)&&!d(fe)&&!d(X));function me(e=u.selectedFolder??``){a(se,e,!0),a(Y,``),a(Z,null),a(K,`create`),i().then(()=>d(ce)?.focus())}let he=0;t(()=>{u.createRequest!==null&&u.createRequest.id!==he&&(he=u.createRequest.id,me(u.createRequest.parent))});function ge(e,t,n=null){e.preventDefault(),e.stopPropagation(),u.onContextMenu(e.clientX,e.clientY,t,n)}function _e(e){e!==null&&(a(q,e,!0),a(Y,ae(e),!0),a(Z,null),a(K,`rename`),i().then(()=>d(ce)?.focus()))}let ve=0;t(()=>{u.renameRequest!==null&&u.renameRequest.id!==ve&&(ve=u.renameRequest.id,_e(u.renameRequest.path))});function ye(e){e!==null&&(a(J,e,!0),a(Z,null),a(K,`delete`))}let Q=0;t(()=>{u.deleteRequest!==null&&u.deleteRequest.id!==Q&&(Q=u.deleteRequest.id,ye(u.deleteRequest.path))});function be(){d(X)||(a(K,null),a(Z,null))}async function xe(){if(d(pe)){a(X,!0),a(Z,null);try{if(d(K)===`create`){let e=d(de);await L.mutate(()=>ee(e)),m()||u.onSelect(e)}else if(d(K)===`rename`&&d(q)!==null){let e=d(q),t=d(de);await L.mutate(()=>N(e,d(Y))),V(e,t)}a(K,null)}catch(e){a(Z,e instanceof Error?e.message:String(e),!0)}finally{a(X,!1)}}}let Se=g(()=>d(J)===null?[]:d(I).filter(e=>G(e,d(J)??``))),Ce=g(()=>d(J)===null?[]:d(R).filter(e=>G(e.folder,d(J)??``))),we=g(()=>new Set(d(Ce).map(e=>e.id))),Te=g(()=>d(Ce).flatMap(e=>e.references.incoming.filter(e=>!d(we).has(e.assetId)).map(t=>`${t.assetId}.${t.field} → ${e.id}`)));async function Ee(){if(d(J)===null)return;let e=d(J),t=ie(e),n=m()!==null&&G(m().folder,e);a(X,!0),a(Z,null);try{await L.mutate(()=>F(e)),n?u.onActiveAssetDeleted?.(t):!m()&&u.selectedFolder!==null&&G(u.selectedFolder,e)&&u.onSelect(t),a(K,null)}catch(e){a(Z,e instanceof Error?e.message:String(e),!0)}finally{a(X,!1)}}function De(e){m()&&(e.dataTransfer?.setData(`application/x-fundus-assets`,JSON.stringify([m().id])),e.dataTransfer&&(e.dataTransfer.effectAllowed=`move`))}var Ae=ze(),Be=r(Ae),Ve=h(Be),He=o(h(Ve),2),Ue=h(He),We=o(Ue,2),Ge=o(We,2);E(He),E(Ve);var Ke=o(Ve,2),qe=h(Ke);let Je;var Ye=o(h(qe),2),Xe=h(Ye,!0);E(Ye),E(qe);var $=o(qe,2);let Ze;var Qe=o(h($),2),$e=h(Qe,!0);E(Qe),E($);var et=o($,2),tt=e=>{var t=Ne();w(t,``,{},{"--depth":0});var r=h(t),i=o(h(r),2),a=h(i,!0);E(i);var s=o(i,2),c=e=>{var t=Me();M(e=>k(t,`title`,e),[()=>m().warnings.join(`
|
|
2
|
-
`)]),n(e,t)};j(s,e=>{m().warnings.length>0&&e(c)}),E(r),E(t),M(()=>{k(r,`title`,m().id),p(a,m().id)}),l(`dragstart`,r,De),n(e,t)};j(et,e=>{m()?.folder===``&&e(tt)}),f(o(et,2),16,()=>d(te),e=>e,(e,t)=>{let i=g(()=>t.split(`/`).length-1);var s=Pe(),f=r(s);let _;var v=h(f);let y;var b=h(v);je(h(b),{}),E(b);var S=o(b),T=h(S,!0);E(S);var O=o(S),A=h(O,!0);E(O),E(v),E(f);var N=o(f,2),P=e=>{var t=Ne();let r;var a=h(t),s=o(h(a),2),c=h(s,!0);E(s);var u=o(s,2),f=e=>{var t=Me();M(e=>k(t,`title`,e),[()=>m().warnings.join(`
|
|
3
|
-
`)]),n(e,t)};j(u,e=>{m().warnings.length>0&&e(f)}),E(a),E(t),M(()=>{r=w(t,``,r,{"--depth":d(i)+1}),k(a,`title`,m().id),p(c,m().id)}),l(`dragstart`,a,De),n(e,t)};j(N,e=>{m()?.folder===t&&e(P)}),M((e,n)=>{_=w(f,``,_,{"--depth":d(i)}),y=C(v,1,`row folder svelte-ftwms1`,null,y,{selected:!m()&&u.selectedFolder===t,"drop-target":d(x)===t}),k(S,`title`,t),p(T,e),p(A,n)},[()=>ae(t),()=>ne(t)]),c(`click`,v,()=>u.onSelect(t)),c(`contextmenu`,v,e=>ge(e,t,t)),l(`dragstart`,v,e=>{a(D,t,!0),u.onFolderDragStart?.(t),e.dataTransfer?.setData(`application/x-fundus-folder`,t),e.dataTransfer&&(e.dataTransfer.effectAllowed=`move`)}),l(`dragend`,v,()=>{a(D,null),u.onFolderDragEnd?.(),a(x,null)}),l(`dragover`,v,e=>z(e,t)),l(`dragleave`,v,()=>a(x,null)),l(`drop`,v,e=>B(e,t)),n(e,s)}),E(Ke),E(Be);var nt=o(Be,2),rt=e=>{{let t=g(()=>d(K)===`create`?`Create folder`:`Rename folder`),i=g(()=>d(X)?`Saving…`:d(K)===`create`?`Create`:`Rename`),s=g(()=>!d(pe));re(e,{get title(){return d(t)},get confirmLabel(){return d(i)},get confirmDisabled(){return d(s)},get busy(){return d(X)},onConfirm:()=>void xe(),onCancel:be,children:(e,t)=>{var i=Le(),s=r(i),l=o(h(s),2);b(l),v(l,e=>a(ce,e),()=>d(ce)),E(s);var u=o(s,2),f=h(u,!0);E(u);var m=o(u,2),g=e=>{var t=Fe(),r=h(t,!0);E(t),M(()=>p(r,d(ue))),n(e,t)};j(m,e=>{d(ue)&&e(g)});var _=o(m,2),y=e=>{n(e,Ie())};j(_,e=>{d(fe)&&e(y)});var x=o(_,2),S=e=>{var t=Fe(),r=h(t,!0);E(t),M(()=>p(r,d(Z))),n(e,t)};j(x,e=>{d(Z)&&e(S)}),M(()=>{l.disabled=d(X),p(f,d(de)||`Root`)}),c(`keydown`,l,e=>e.key===`Enter`&&void xe()),A(l,()=>d(Y),e=>a(Y,e)),n(e,i)},$$slots:{default:!0}})}};j(nt,e=>{(d(K)===`create`||d(K)===`rename`)&&e(rt)});var it=o(nt,2),at=e=>{{let t=g(()=>d(X)?`Deleting…`:`Delete recursively`);re(e,{title:`Delete folder`,get confirmLabel(){return d(t)},danger:!0,get busy(){return d(X)},onConfirm:()=>void Ee(),onCancel:be,children:(e,t)=>{var i=Re(),a=r(i),s=o(h(a)),c=h(s,!0);E(s);var l=o(s);E(a);var u=o(a,2),f=e=>{var t=Fe(),r=h(t);E(t),M(e=>p(r,`This leaves ${d(Te).length??``} external reference(s) dangling:
|
|
4
|
-
${e??``}`),[()=>d(Te).join(`, `)]),n(e,t)};j(u,e=>{d(Te).length>0&&e(f)});var m=o(u,2),g=e=>{var t=Fe(),r=h(t,!0);E(t),M(()=>p(r,d(Z))),n(e,t)};j(m,e=>{d(Z)&&e(g)}),M(()=>{p(c,d(J)),p(l,`, ${d(Se).length-1} descendant folder(s),
|
|
5
|
-
and ${d(Ce).length??``} asset(s)? Raw and proxy files are removed.`)}),n(e,i)},$$slots:{default:!0}})}};j(it,e=>{d(K)===`delete`&&d(J)!==null&&e(at)}),M(e=>{k(Ue,`title`,m()?`Create folder beside the current asset`:`Create child folder`),k(We,`title`,m()?`Rename the current asset folder`:`Rename selected folder`),We.disabled=d(le)===null,k(Ge,`title`,m()?`Delete the current asset folder`:`Delete selected folder`),Ge.disabled=d(le)===null,Je=C(qe,1,`row special svelte-ftwms1`,null,Je,{selected:!m()&&u.selectedFolder===null}),p(Xe,d(R).length),Ze=C($,1,`row special svelte-ftwms1`,null,Ze,{selected:!m()&&u.selectedFolder===``,"drop-target":d(x)===``}),p($e,e)},[()=>ne(``)]),c(`contextmenu`,Be,e=>ge(e,``)),c(`click`,Ue,()=>me()),c(`click`,We,()=>_e(d(le))),c(`click`,Ge,()=>ye(d(le))),c(`click`,qe,()=>u.onSelect(null)),c(`click`,$,()=>u.onSelect(``)),l(`dragover`,$,e=>z(e,``)),l(`dragleave`,$,()=>a(x,null)),l(`drop`,$,e=>B(e,``)),n(s,Ae),e()}D([`contextmenu`,`click`,`keydown`]);var Ve=u(`<button role="menuitem" class="svelte-10jgqdh">Rename</button>`),He=u(`<button class="danger svelte-10jgqdh" role="menuitem">Delete Directory</button>`),Ue=u(`<div class="context-menu svelte-10jgqdh" role="menu" aria-label="Library actions" tabindex="-1"><button role="menuitem" class="svelte-10jgqdh">New Directory</button> <!> <button role="menuitem" class="svelte-10jgqdh">Import File</button> <!></div>`);function We(t,r){S(r,!0);let i=g(()=>Math.max(8,Math.min(r.x,window.innerWidth-176))),a=g(()=>2+ +!!r.onRenameDirectory+ +!!r.onDeleteDirectory),s=g(()=>Math.max(8,Math.min(r.y,window.innerHeight-(d(a)*32+8))));function u(e){e(),r.onClose()}var f=Ue();l(`click`,m,function(...e){r.onClose?.apply(this,e)}),l(`blur`,m,function(...e){r.onClose?.apply(this,e)}),l(`keydown`,m,e=>e.key===`Escape`&&r.onClose()),l(`resize`,m,function(...e){r.onClose?.apply(this,e)}),l(`scroll`,m,function(...e){r.onClose?.apply(this,e)});let p;var _=h(f),v=o(_,2),y=e=>{var t=Ve();c(`click`,t,()=>u(r.onRenameDirectory)),n(e,t)};j(v,e=>{r.onRenameDirectory&&e(y)});var b=o(v,2),x=o(b,2),C=e=>{var t=He();c(`click`,t,()=>u(r.onDeleteDirectory)),n(e,t)};j(x,e=>{r.onDeleteDirectory&&e(C)}),E(f),M(()=>p=w(f,``,p,{left:`${d(i)}px`,top:`${d(s)}px`})),c(`contextmenu`,f,e=>e.preventDefault()),c(`click`,_,()=>u(r.onNewDirectory)),c(`click`,b,()=>u(r.onImportFile)),n(t,f),e()}D([`contextmenu`,`click`]);export{Oe as a,_e as c,G as d,oe as f,ke as i,X as l,Be as n,De as o,ie as p,je as r,Te as s,We as t,ae as u};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
function e(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} kB`:`${(e/(1024*1024)).toFixed(2)} MB`}function t(e){return`${(e/1e3).toFixed(2)} s`}function n(e,t){let{maxWidth:n,...r}=e;return t===null||!Number.isFinite(t)||t<=0?r:{...r,maxWidth:Math.round(t)}}export{t as n,n as r,e as t};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e,s as t}from"../chunks/CvY6YsFE.js";export{t as load_css,e as start};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|