@phosart/common 0.4.22
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 +58 -0
- package/dist/FullGallery.svelte +51 -0
- package/dist/FullGallery.svelte.d.ts +17 -0
- package/dist/FullGallery.svelte.d.ts.map +1 -0
- package/dist/Gallery.svelte +30 -0
- package/dist/Gallery.svelte.d.ts +14 -0
- package/dist/Gallery.svelte.d.ts.map +1 -0
- package/dist/GalleryPreview.svelte +60 -0
- package/dist/GalleryPreview.svelte.d.ts +9 -0
- package/dist/GalleryPreview.svelte.d.ts.map +1 -0
- package/dist/HighResContext.svelte +21 -0
- package/dist/HighResContext.svelte.d.ts +8 -0
- package/dist/HighResContext.svelte.d.ts.map +1 -0
- package/dist/Image.svelte +171 -0
- package/dist/Image.svelte.d.ts +14 -0
- package/dist/Image.svelte.d.ts.map +1 -0
- package/dist/Modal.svelte +87 -0
- package/dist/Modal.svelte.d.ts +9 -0
- package/dist/Modal.svelte.d.ts.map +1 -0
- package/dist/ModalGallery/Carousel.svelte +76 -0
- package/dist/ModalGallery/Carousel.svelte.d.ts +10 -0
- package/dist/ModalGallery/Carousel.svelte.d.ts.map +1 -0
- package/dist/ModalGallery/ImageSection.svelte +156 -0
- package/dist/ModalGallery/ImageSection.svelte.d.ts +11 -0
- package/dist/ModalGallery/ImageSection.svelte.d.ts.map +1 -0
- package/dist/ModalGallery/ImageView.svelte +92 -0
- package/dist/ModalGallery/ImageView.svelte.d.ts +9 -0
- package/dist/ModalGallery/ImageView.svelte.d.ts.map +1 -0
- package/dist/ModalGallery/Spinner.svelte +71 -0
- package/dist/ModalGallery/Spinner.svelte.d.ts +7 -0
- package/dist/ModalGallery/Spinner.svelte.d.ts.map +1 -0
- package/dist/ModalGallery.svelte +165 -0
- package/dist/ModalGallery.svelte.d.ts +16 -0
- package/dist/ModalGallery.svelte.d.ts.map +1 -0
- package/dist/OpengraphMeta.svelte +125 -0
- package/dist/OpengraphMeta.svelte.d.ts +15 -0
- package/dist/OpengraphMeta.svelte.d.ts.map +1 -0
- package/dist/Postcard/ArtistLink.svelte +46 -0
- package/dist/Postcard/ArtistLink.svelte.d.ts +9 -0
- package/dist/Postcard/ArtistLink.svelte.d.ts.map +1 -0
- package/dist/Postcard/Chip.svelte +100 -0
- package/dist/Postcard/Chip.svelte.d.ts +12 -0
- package/dist/Postcard/Chip.svelte.d.ts.map +1 -0
- package/dist/Postcard/Description/Character.svelte +79 -0
- package/dist/Postcard/Description/Character.svelte.d.ts +9 -0
- package/dist/Postcard/Description/Character.svelte.d.ts.map +1 -0
- package/dist/Postcard/Description.svelte +146 -0
- package/dist/Postcard/Description.svelte.d.ts +13 -0
- package/dist/Postcard/Description.svelte.d.ts.map +1 -0
- package/dist/Postcard/Headline.svelte +70 -0
- package/dist/Postcard/Headline.svelte.d.ts +10 -0
- package/dist/Postcard/Headline.svelte.d.ts.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/server/artist.d.ts +7 -0
- package/dist/server/artist.d.ts.map +1 -0
- package/dist/server/artist.js +40 -0
- package/dist/server/character.d.ts +9 -0
- package/dist/server/character.d.ts.map +1 -0
- package/dist/server/character.js +76 -0
- package/dist/server/directories.d.ts +4 -0
- package/dist/server/directories.d.ts.map +1 -0
- package/dist/server/directories.js +39 -0
- package/dist/server/fastcache.d.ts +11 -0
- package/dist/server/fastcache.d.ts.map +1 -0
- package/dist/server/fastcache.js +43 -0
- package/dist/server/filter.d.ts +6 -0
- package/dist/server/filter.d.ts.map +1 -0
- package/dist/server/filter.js +53 -0
- package/dist/server/gallery.d.ts +16 -0
- package/dist/server/gallery.d.ts.map +1 -0
- package/dist/server/gallery.js +162 -0
- package/dist/server/imageprocess.d.ts +18 -0
- package/dist/server/imageprocess.d.ts.map +1 -0
- package/dist/server/imageprocess.js +243 -0
- package/dist/server/index.d.ts +15 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +15 -0
- package/dist/server/models/Artist.d.ts +7 -0
- package/dist/server/models/Artist.d.ts.map +1 -0
- package/dist/server/models/Artist.js +15 -0
- package/dist/server/models/Character.d.ts +108 -0
- package/dist/server/models/Character.d.ts.map +1 -0
- package/dist/server/models/Character.js +21 -0
- package/dist/server/models/Gallery.d.ts +373 -0
- package/dist/server/models/Gallery.d.ts.map +1 -0
- package/dist/server/models/Gallery.js +60 -0
- package/dist/server/models/image.d.ts +64 -0
- package/dist/server/models/image.d.ts.map +1 -0
- package/dist/server/models/image.js +17 -0
- package/dist/server/pack.d.ts +3 -0
- package/dist/server/pack.d.ts.map +1 -0
- package/dist/server/pack.js +26 -0
- package/dist/server/theme/schema.d.ts +57 -0
- package/dist/server/theme/schema.d.ts.map +1 -0
- package/dist/server/theme/schema.js +217 -0
- package/dist/server/util.d.ts +24 -0
- package/dist/server/util.d.ts.map +1 -0
- package/dist/server/util.js +71 -0
- package/dist/util/art.d.ts +52 -0
- package/dist/util/art.d.ts.map +1 -0
- package/dist/util/art.js +57 -0
- package/dist/util/artistcontext.svelte.d.ts +8 -0
- package/dist/util/artistcontext.svelte.d.ts.map +1 -0
- package/dist/util/artistcontext.svelte.js +18 -0
- package/dist/util/charactercontext.svelte.d.ts +4 -0
- package/dist/util/charactercontext.svelte.d.ts.map +1 -0
- package/dist/util/charactercontext.svelte.js +11 -0
- package/dist/util/date.d.ts +2 -0
- package/dist/util/date.d.ts.map +1 -0
- package/dist/util/date.js +6 -0
- package/dist/util/index.d.ts +13 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +10 -0
- package/dist/util/markdown.d.ts +2 -0
- package/dist/util/markdown.d.ts.map +1 -0
- package/dist/util/markdown.js +16 -0
- package/dist/util/phosart_config.svelte.d.ts +44 -0
- package/dist/util/phosart_config.svelte.d.ts.map +1 -0
- package/dist/util/phosart_config.svelte.js +51 -0
- package/dist/util/search.d.ts +3 -0
- package/dist/util/search.d.ts.map +1 -0
- package/dist/util/search.js +24 -0
- package/dist/util/smoothscroll.d.ts +4 -0
- package/dist/util/smoothscroll.d.ts.map +1 -0
- package/dist/util/smoothscroll.js +21 -0
- package/dist/util/tree.d.ts +19 -0
- package/dist/util/tree.d.ts.map +1 -0
- package/dist/util/tree.js +58 -0
- package/dist/util/util.d.ts +4 -0
- package/dist/util/util.d.ts.map +1 -0
- package/dist/util/util.js +22 -0
- package/package.json +102 -0
- package/src/lib/FullGallery.svelte +51 -0
- package/src/lib/Gallery.svelte +30 -0
- package/src/lib/GalleryPreview.svelte +60 -0
- package/src/lib/HighResContext.svelte +21 -0
- package/src/lib/Image.svelte +171 -0
- package/src/lib/Modal.svelte +87 -0
- package/src/lib/ModalGallery/Carousel.svelte +76 -0
- package/src/lib/ModalGallery/ImageSection.svelte +156 -0
- package/src/lib/ModalGallery/ImageView.svelte +92 -0
- package/src/lib/ModalGallery/Spinner.svelte +71 -0
- package/src/lib/ModalGallery.svelte +165 -0
- package/src/lib/OpengraphMeta.svelte +125 -0
- package/src/lib/Postcard/ArtistLink.svelte +46 -0
- package/src/lib/Postcard/Chip.svelte +100 -0
- package/src/lib/Postcard/Description/Character.svelte +79 -0
- package/src/lib/Postcard/Description.svelte +146 -0
- package/src/lib/Postcard/Headline.svelte +70 -0
- package/src/lib/index.ts +20 -0
- package/src/lib/server/artist.ts +50 -0
- package/src/lib/server/character.ts +113 -0
- package/src/lib/server/directories.ts +45 -0
- package/src/lib/server/fastcache.ts +66 -0
- package/src/lib/server/filter.ts +71 -0
- package/src/lib/server/gallery.ts +259 -0
- package/src/lib/server/imageprocess.ts +382 -0
- package/src/lib/server/index.ts +57 -0
- package/src/lib/server/models/Artist.ts +19 -0
- package/src/lib/server/models/Character.ts +24 -0
- package/src/lib/server/models/Gallery.ts +70 -0
- package/src/lib/server/models/image.ts +20 -0
- package/src/lib/server/pack.ts +31 -0
- package/src/lib/server/theme/schema.ts +286 -0
- package/src/lib/server/util.ts +102 -0
- package/src/lib/util/art.ts +136 -0
- package/src/lib/util/artistcontext.svelte.ts +25 -0
- package/src/lib/util/charactercontext.svelte.ts +15 -0
- package/src/lib/util/date.ts +7 -0
- package/src/lib/util/index.ts +29 -0
- package/src/lib/util/markdown.ts +17 -0
- package/src/lib/util/phosart_config.svelte.ts +101 -0
- package/src/lib/util/search.ts +28 -0
- package/src/lib/util/smoothscroll.ts +21 -0
- package/src/lib/util/tree.ts +75 -0
- package/src/lib/util/util.ts +37 -0
package/README.md
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Svelte library
|
|
2
|
+
|
|
3
|
+
Everything you need to build a Svelte library, powered by [`sv`](https://npmjs.com/package/sv).
|
|
4
|
+
|
|
5
|
+
Read more about creating a library [in the docs](https://svelte.dev/docs/kit/packaging).
|
|
6
|
+
|
|
7
|
+
## Creating a project
|
|
8
|
+
|
|
9
|
+
If you're seeing this, you've probably already done this step. Congrats!
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
# create a new project in the current directory
|
|
13
|
+
npx sv create
|
|
14
|
+
|
|
15
|
+
# create a new project in my-app
|
|
16
|
+
npx sv create my-app
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Developing
|
|
20
|
+
|
|
21
|
+
Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
npm run dev
|
|
25
|
+
|
|
26
|
+
# or start the server and open the app in a new browser tab
|
|
27
|
+
npm run dev -- --open
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Everything inside `src/lib` is part of your library, everything inside `src/routes` can be used as a showcase or preview app.
|
|
31
|
+
|
|
32
|
+
## Building
|
|
33
|
+
|
|
34
|
+
To build your library:
|
|
35
|
+
|
|
36
|
+
```sh
|
|
37
|
+
npm pack
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
To create a production version of your showcase app:
|
|
41
|
+
|
|
42
|
+
```sh
|
|
43
|
+
npm run build
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
You can preview the production build with `npm run preview`.
|
|
47
|
+
|
|
48
|
+
> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment.
|
|
49
|
+
|
|
50
|
+
## Publishing
|
|
51
|
+
|
|
52
|
+
Go into the `package.json` and give your package the desired name through the `"name"` option. Also consider adding a `"license"` field and point it to a `LICENSE` file which you can create from a template (one popular option is the [MIT license](https://opensource.org/license/mit/)).
|
|
53
|
+
|
|
54
|
+
To publish your library to [npm](https://www.npmjs.com):
|
|
55
|
+
|
|
56
|
+
```sh
|
|
57
|
+
npm publish
|
|
58
|
+
```
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { ArtPiece } from './util/art.js';
|
|
3
|
+
import ModalGallery from './ModalGallery.svelte';
|
|
4
|
+
import type { Component } from 'svelte';
|
|
5
|
+
import { useLibraryConfig } from './util/phosart_config.svelte.js';
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
pieces: ArtPiece[];
|
|
9
|
+
addNav?: boolean;
|
|
10
|
+
noDetails?: boolean;
|
|
11
|
+
browser: boolean;
|
|
12
|
+
CardComponent?: Component<{
|
|
13
|
+
piece: ArtPiece;
|
|
14
|
+
onselect: () => void;
|
|
15
|
+
showDescriptionByDefault: boolean;
|
|
16
|
+
}>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let { pieces, addNav = false, noDetails = false, browser, CardComponent }: Props = $props();
|
|
20
|
+
|
|
21
|
+
let config = useLibraryConfig();
|
|
22
|
+
|
|
23
|
+
const TheCardComponent = $derived(CardComponent ?? config.gallery?.DefaultCardComponent);
|
|
24
|
+
|
|
25
|
+
let selected: number | null = $state(null);
|
|
26
|
+
|
|
27
|
+
function onSelect(idx: number) {
|
|
28
|
+
selected = idx;
|
|
29
|
+
}
|
|
30
|
+
</script>
|
|
31
|
+
|
|
32
|
+
<div
|
|
33
|
+
style="margin-bottom: 24px; align-items: stretch; display: flex; flex-direction: column; row-gap: 2rem;"
|
|
34
|
+
>
|
|
35
|
+
{#each pieces as piece, i (piece.slug)}
|
|
36
|
+
<section
|
|
37
|
+
id={piece.name}
|
|
38
|
+
data-nav={piece.name}
|
|
39
|
+
data-nav-icon="palette"
|
|
40
|
+
class:scroll-ignore={!addNav}
|
|
41
|
+
>
|
|
42
|
+
<TheCardComponent
|
|
43
|
+
{piece}
|
|
44
|
+
onselect={() => onSelect(i)}
|
|
45
|
+
showDescriptionByDefault={!noDetails}
|
|
46
|
+
/>
|
|
47
|
+
</section>
|
|
48
|
+
{/each}
|
|
49
|
+
|
|
50
|
+
<ModalGallery {pieces} {browser} bind:selected />
|
|
51
|
+
</div>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ArtPiece } from './util/art.ts';
|
|
2
|
+
import type { Component } from 'svelte';
|
|
3
|
+
interface Props {
|
|
4
|
+
pieces: ArtPiece[];
|
|
5
|
+
addNav?: boolean;
|
|
6
|
+
noDetails?: boolean;
|
|
7
|
+
browser: boolean;
|
|
8
|
+
CardComponent?: Component<{
|
|
9
|
+
piece: ArtPiece;
|
|
10
|
+
onselect: () => void;
|
|
11
|
+
showDescriptionByDefault: boolean;
|
|
12
|
+
}>;
|
|
13
|
+
}
|
|
14
|
+
declare const FullGallery: Component<Props, {}, "">;
|
|
15
|
+
type FullGallery = ReturnType<typeof FullGallery>;
|
|
16
|
+
export default FullGallery;
|
|
17
|
+
//# sourceMappingURL=FullGallery.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FullGallery.svelte.d.ts","sourceRoot":"","sources":["../src/lib/FullGallery.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAIvC,UAAU,KAAK;IACd,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,SAAS,CAAC;QACzB,KAAK,EAAE,QAAQ,CAAC;QAChB,QAAQ,EAAE,MAAM,IAAI,CAAC;QACrB,wBAAwB,EAAE,OAAO,CAAC;KAClC,CAAC,CAAC;CACH;AAiCF,QAAA,MAAM,WAAW,0BAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { ArtPiece } from './util/art.js';
|
|
3
|
+
import ModalGallery from './ModalGallery.svelte';
|
|
4
|
+
import type { Component } from 'svelte';
|
|
5
|
+
import { useLibraryConfig } from './util/phosart_config.svelte.js';
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
pieces: ArtPiece[];
|
|
9
|
+
browser: boolean;
|
|
10
|
+
PieceComponent?: Component<{ piece: ArtPiece; onselect: () => void }>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
let { pieces, browser, PieceComponent }: Props = $props();
|
|
14
|
+
|
|
15
|
+
let config = useLibraryConfig();
|
|
16
|
+
|
|
17
|
+
let ThePieceComponent = $derived(PieceComponent ?? config.gallery?.DefaultPieceComponent);
|
|
18
|
+
|
|
19
|
+
let selected: number | null = $state(null);
|
|
20
|
+
|
|
21
|
+
function onSelect(idx: number) {
|
|
22
|
+
selected = idx;
|
|
23
|
+
}
|
|
24
|
+
</script>
|
|
25
|
+
|
|
26
|
+
{#each pieces as piece, i (piece.slug)}
|
|
27
|
+
<ThePieceComponent {piece} onselect={() => onSelect(i)} />
|
|
28
|
+
{/each}
|
|
29
|
+
|
|
30
|
+
<ModalGallery {pieces} {browser} bind:selected />
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ArtPiece } from './util/art.ts';
|
|
2
|
+
import type { Component } from 'svelte';
|
|
3
|
+
interface Props {
|
|
4
|
+
pieces: ArtPiece[];
|
|
5
|
+
browser: boolean;
|
|
6
|
+
PieceComponent?: Component<{
|
|
7
|
+
piece: ArtPiece;
|
|
8
|
+
onselect: () => void;
|
|
9
|
+
}>;
|
|
10
|
+
}
|
|
11
|
+
declare const Gallery: Component<Props, {}, "">;
|
|
12
|
+
type Gallery = ReturnType<typeof Gallery>;
|
|
13
|
+
export default Gallery;
|
|
14
|
+
//# sourceMappingURL=Gallery.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Gallery.svelte.d.ts","sourceRoot":"","sources":["../src/lib/Gallery.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAIvC,UAAU,KAAK;IACd,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,SAAS,CAAC;QAAE,KAAK,EAAE,QAAQ,CAAC;QAAC,QAAQ,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC,CAAC;CACtE;AA6BF,QAAA,MAAM,OAAO,0BAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Gallery } from './util/art.js';
|
|
3
|
+
import Image from './Image.svelte';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
gallery: Gallery;
|
|
7
|
+
cssSize: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { gallery, cssSize }: Props = $props();
|
|
11
|
+
|
|
12
|
+
const pieces = $derived(gallery.pieces.slice(0, 4));
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
{#if pieces[0]}
|
|
16
|
+
{@const topw = pieces[1] ? 'calc(var(--preview-size) / 2)' : 'var(--preview-size)'}
|
|
17
|
+
{@const toph = pieces[2] ? 'calc(var(--preview-size) / 2)' : 'var(--preview-size)'}
|
|
18
|
+
{@const botw = pieces[3] ? 'calc(var(--preview-size) / 2)' : 'var(--preview-size)'}
|
|
19
|
+
{@const both = 'calc(var(--preview-size) / 2)'}
|
|
20
|
+
<div class="preview" style="--preview-size: {cssSize}">
|
|
21
|
+
<div style="height: {toph}; width: {topw}" class="imgcontainer" class:square={topw === toph}>
|
|
22
|
+
<div><Image alt={pieces[0].alt} picture={pieces[0].image.thumbnail} /></div>
|
|
23
|
+
</div>
|
|
24
|
+
{#if pieces[1]}
|
|
25
|
+
<div style="height: {toph}; width: {topw}" class="imgcontainer" class:square={topw === toph}>
|
|
26
|
+
<div><Image alt={pieces[1].alt} picture={pieces[1].image.thumbnail} /></div>
|
|
27
|
+
</div>
|
|
28
|
+
{/if}
|
|
29
|
+
{#if pieces[2]}
|
|
30
|
+
<div style="height: {both}; width: {botw}" class="imgcontainer" class:square={botw === both}>
|
|
31
|
+
<div><Image alt={pieces[2].alt} picture={pieces[2].image.thumbnail} /></div>
|
|
32
|
+
</div>
|
|
33
|
+
{/if}
|
|
34
|
+
{#if pieces[3]}
|
|
35
|
+
<div style="height: {both}; width: {botw}" class="imgcontainer" class:square={botw === both}>
|
|
36
|
+
<div><Image alt={pieces[3].alt} picture={pieces[3].image.thumbnail} /></div>
|
|
37
|
+
</div>
|
|
38
|
+
{/if}
|
|
39
|
+
</div>
|
|
40
|
+
{/if}
|
|
41
|
+
|
|
42
|
+
<style>
|
|
43
|
+
.preview {
|
|
44
|
+
display: contents;
|
|
45
|
+
}
|
|
46
|
+
.imgcontainer {
|
|
47
|
+
overflow: hidden;
|
|
48
|
+
display: flex;
|
|
49
|
+
justify-content: center;
|
|
50
|
+
align-items: center;
|
|
51
|
+
}
|
|
52
|
+
.imgcontainer:not(.square) > div {
|
|
53
|
+
width: var(--preview-size);
|
|
54
|
+
height: var(--preview-size);
|
|
55
|
+
max-width: var(--preview-size);
|
|
56
|
+
max-height: var(--preview-size);
|
|
57
|
+
min-width: var(--preview-size);
|
|
58
|
+
min-height: var(--preview-size);
|
|
59
|
+
}
|
|
60
|
+
</style>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Gallery } from './util/art.ts';
|
|
2
|
+
interface Props {
|
|
3
|
+
gallery: Gallery;
|
|
4
|
+
cssSize: string;
|
|
5
|
+
}
|
|
6
|
+
declare const GalleryPreview: import("svelte").Component<Props, {}, "">;
|
|
7
|
+
type GalleryPreview = ReturnType<typeof GalleryPreview>;
|
|
8
|
+
export default GalleryPreview;
|
|
9
|
+
//# sourceMappingURL=GalleryPreview.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GalleryPreview.svelte.d.ts","sourceRoot":"","sources":["../src/lib/GalleryPreview.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAI5C,UAAU,KAAK;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CAChB;AA0CF,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import { getContext } from 'svelte';
|
|
3
|
+
const ctxKey = Symbol();
|
|
4
|
+
|
|
5
|
+
export function isHighRes() {
|
|
6
|
+
return getContext(ctxKey) === true;
|
|
7
|
+
}
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<script lang="ts">
|
|
11
|
+
import { setContext } from 'svelte';
|
|
12
|
+
interface Props {
|
|
13
|
+
children?: import('svelte').Snippet;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
let { children }: Props = $props();
|
|
17
|
+
|
|
18
|
+
setContext(ctxKey, true);
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
{@render children?.()}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function isHighRes(): boolean;
|
|
2
|
+
interface Props {
|
|
3
|
+
children?: import('svelte').Snippet;
|
|
4
|
+
}
|
|
5
|
+
declare const HighResContext: import("svelte").Component<Props, {}, "">;
|
|
6
|
+
type HighResContext = ReturnType<typeof HighResContext>;
|
|
7
|
+
export default HighResContext;
|
|
8
|
+
//# sourceMappingURL=HighResContext.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HighResContext.svelte.d.ts","sourceRoot":"","sources":["../src/lib/HighResContext.svelte.ts"],"names":[],"mappings":"AAMC,wBAAgB,SAAS,YAExB;AAKD,UAAU,KAAK;IACd,QAAQ,CAAC,EAAE,OAAO,QAAQ,EAAE,OAAO,CAAC;CACpC;AAgBF,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onlyHighRes, type Image as ImageModel, no4K } from './util/art.js';
|
|
3
|
+
import { untrack } from 'svelte';
|
|
4
|
+
import { isHighRes } from './HighResContext.svelte';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
picture: ImageModel;
|
|
8
|
+
alt: string;
|
|
9
|
+
video?: string | undefined;
|
|
10
|
+
controls?: boolean;
|
|
11
|
+
nolqip?: boolean;
|
|
12
|
+
onloaded?: () => void;
|
|
13
|
+
loading?: boolean;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
let {
|
|
17
|
+
picture,
|
|
18
|
+
alt,
|
|
19
|
+
onloaded = undefined,
|
|
20
|
+
video = undefined,
|
|
21
|
+
controls = false,
|
|
22
|
+
nolqip = false,
|
|
23
|
+
loading = $bindable(true)
|
|
24
|
+
}: Props = $props();
|
|
25
|
+
|
|
26
|
+
let showBackground = $state(true);
|
|
27
|
+
let loadingMeta = $state(true);
|
|
28
|
+
// svelte-ignore state_referenced_locally
|
|
29
|
+
let lastSrc = $state(picture.fallback.src);
|
|
30
|
+
|
|
31
|
+
const highRes = isHighRes();
|
|
32
|
+
let src = $derived(highRes ? onlyHighRes(picture) : no4K(picture));
|
|
33
|
+
|
|
34
|
+
let background = $derived(
|
|
35
|
+
!nolqip && src.lqip && showBackground
|
|
36
|
+
? `url(${src.lqip?.src}) no-repeat center/contain`
|
|
37
|
+
: 'none'
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
$effect(() => {
|
|
41
|
+
let prev = untrack(() => lastSrc);
|
|
42
|
+
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
44
|
+
picture;
|
|
45
|
+
untrack(() => {
|
|
46
|
+
lastSrc = picture.fallback.src;
|
|
47
|
+
if (prev !== picture.fallback.src) {
|
|
48
|
+
showBackground = true;
|
|
49
|
+
loading = true;
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
function onload(el: HTMLImageElement | HTMLVideoElement) {
|
|
55
|
+
let timeoutHandle: ReturnType<typeof setTimeout> | null = null;
|
|
56
|
+
const onloadend = () => {
|
|
57
|
+
loading = false;
|
|
58
|
+
onloaded?.();
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const onloadstart = () => {
|
|
62
|
+
if (loading) {
|
|
63
|
+
showBackground = true;
|
|
64
|
+
loadingMeta = true;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const animationend = () => {
|
|
69
|
+
showBackground = false;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const onloadmeta = () => {
|
|
73
|
+
loadingMeta = false;
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
el.addEventListener('loadstart', onloadstart);
|
|
77
|
+
el.addEventListener('load', onloadend);
|
|
78
|
+
el.addEventListener('loadeddata', onloadend);
|
|
79
|
+
el.addEventListener('loadedmetadata', onloadmeta);
|
|
80
|
+
el.addEventListener('animationend', animationend);
|
|
81
|
+
|
|
82
|
+
onloadstart();
|
|
83
|
+
|
|
84
|
+
return {
|
|
85
|
+
destroy() {
|
|
86
|
+
if (timeoutHandle) {
|
|
87
|
+
clearTimeout(timeoutHandle);
|
|
88
|
+
}
|
|
89
|
+
el.removeEventListener('loadstart', onloadstart);
|
|
90
|
+
el.removeEventListener('load', onloadend);
|
|
91
|
+
el.removeEventListener('loadeddata', onloadend);
|
|
92
|
+
el.removeEventListener('loadedmetadata', onloadmeta);
|
|
93
|
+
el.removeEventListener('animationend', animationend);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
</script>
|
|
98
|
+
|
|
99
|
+
{#each [{ src, video }] as pic (JSON.stringify(pic))}
|
|
100
|
+
{#if video}
|
|
101
|
+
<video
|
|
102
|
+
style="background: {background}; aspect-ratio: {src.fallback.w} / {src.fallback.h};"
|
|
103
|
+
muted
|
|
104
|
+
autoplay
|
|
105
|
+
{controls}
|
|
106
|
+
disablepictureinpicture
|
|
107
|
+
disableremoteplayback
|
|
108
|
+
loop
|
|
109
|
+
playsinline
|
|
110
|
+
use:onload
|
|
111
|
+
>
|
|
112
|
+
<source src={video} type="video/mp4" />
|
|
113
|
+
</video>
|
|
114
|
+
{:else}
|
|
115
|
+
<picture style="background: {background}; aspect-ratio: {src.fallback.w} / {src.fallback.h};">
|
|
116
|
+
{#each Object.entries(src.sources) as [format, images] (format)}
|
|
117
|
+
<source
|
|
118
|
+
srcset={images.map((img) => `${img.src} ${img.w}w`).join(', ')}
|
|
119
|
+
type={'image/' + format}
|
|
120
|
+
/>
|
|
121
|
+
{/each}
|
|
122
|
+
<img
|
|
123
|
+
src={src.fallback.src}
|
|
124
|
+
{alt}
|
|
125
|
+
use:onload
|
|
126
|
+
loading="lazy"
|
|
127
|
+
decoding="async"
|
|
128
|
+
class:loading
|
|
129
|
+
class:loaded={!loading}
|
|
130
|
+
width={src.fallback.w}
|
|
131
|
+
height={src.fallback.h}
|
|
132
|
+
style="font-size: 0; {!(!loadingMeta || !loading) &&
|
|
133
|
+
`width: ${src.fallback.w}px; height: ${src.fallback.h}px;`}"
|
|
134
|
+
/>
|
|
135
|
+
</picture>
|
|
136
|
+
{/if}
|
|
137
|
+
{/each}
|
|
138
|
+
|
|
139
|
+
<style>
|
|
140
|
+
picture,
|
|
141
|
+
video {
|
|
142
|
+
display: flex;
|
|
143
|
+
width: 100%;
|
|
144
|
+
height: 100%;
|
|
145
|
+
max-height: 100%;
|
|
146
|
+
max-width: 100%;
|
|
147
|
+
overflow: hidden;
|
|
148
|
+
}
|
|
149
|
+
img {
|
|
150
|
+
object-fit: contain;
|
|
151
|
+
object-position: center;
|
|
152
|
+
width: 100%;
|
|
153
|
+
height: 100%;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.loading {
|
|
157
|
+
opacity: 0;
|
|
158
|
+
}
|
|
159
|
+
.loaded {
|
|
160
|
+
animation: in 0.1s linear;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
@keyframes in {
|
|
164
|
+
from {
|
|
165
|
+
opacity: 0;
|
|
166
|
+
}
|
|
167
|
+
to {
|
|
168
|
+
opacity: 1;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
</style>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type Image as ImageModel } from './util/art.ts';
|
|
2
|
+
interface Props {
|
|
3
|
+
picture: ImageModel;
|
|
4
|
+
alt: string;
|
|
5
|
+
video?: string | undefined;
|
|
6
|
+
controls?: boolean;
|
|
7
|
+
nolqip?: boolean;
|
|
8
|
+
onloaded?: () => void;
|
|
9
|
+
loading?: boolean;
|
|
10
|
+
}
|
|
11
|
+
declare const Image: import("svelte").Component<Props, {}, "loading">;
|
|
12
|
+
type Image = ReturnType<typeof Image>;
|
|
13
|
+
export default Image;
|
|
14
|
+
//# sourceMappingURL=Image.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Image.svelte.d.ts","sourceRoot":"","sources":["../src/lib/Image.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,KAAK,KAAK,IAAI,UAAU,EAAQ,MAAM,eAAe,CAAC;AAK3E,UAAU,KAAK;IACd,OAAO,EAAE,UAAU,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AA8GF,QAAA,MAAM,KAAK,kDAAwC,CAAC;AACpD,KAAK,KAAK,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AACtC,eAAe,KAAK,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
interface Props {
|
|
3
|
+
open?: boolean;
|
|
4
|
+
children?: import('svelte').Snippet;
|
|
5
|
+
onclose?: () => void;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
let { open = $bindable(false), children, onclose }: Props = $props();
|
|
9
|
+
|
|
10
|
+
let dialog: HTMLDialogElement | undefined = $state();
|
|
11
|
+
let closing = false;
|
|
12
|
+
|
|
13
|
+
function doClose() {
|
|
14
|
+
dialog?.close();
|
|
15
|
+
// closing = true;
|
|
16
|
+
// const evt = (e: AnimationEvent) => {
|
|
17
|
+
// dialog.close();
|
|
18
|
+
// closing = false;
|
|
19
|
+
// dialog.removeEventListener('animationend', evt);
|
|
20
|
+
// };
|
|
21
|
+
// dialog.addEventListener('animationend', evt);
|
|
22
|
+
}
|
|
23
|
+
$effect(() => {
|
|
24
|
+
if (dialog && open && !dialog.open) dialog.showModal();
|
|
25
|
+
});
|
|
26
|
+
$effect(() => {
|
|
27
|
+
if (dialog && !open && dialog.open) doClose();
|
|
28
|
+
});
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<dialog
|
|
32
|
+
class:closing
|
|
33
|
+
bind:this={dialog}
|
|
34
|
+
onclick={doClose}
|
|
35
|
+
onclose={() => {
|
|
36
|
+
open = false;
|
|
37
|
+
onclose?.();
|
|
38
|
+
}}
|
|
39
|
+
onkeypress={(e) => e.code === 'Escape' && doClose()}
|
|
40
|
+
>
|
|
41
|
+
{@render children?.()}
|
|
42
|
+
</dialog>
|
|
43
|
+
|
|
44
|
+
<style>
|
|
45
|
+
dialog {
|
|
46
|
+
border: none;
|
|
47
|
+
background: none;
|
|
48
|
+
padding: 0;
|
|
49
|
+
animation: in 0.1s linear;
|
|
50
|
+
overflow: hidden;
|
|
51
|
+
width: 100%;
|
|
52
|
+
height: 100%;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
dialog:modal {
|
|
56
|
+
max-width: 100%;
|
|
57
|
+
max-height: 100%;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
dialog::backdrop {
|
|
61
|
+
background-color: #000a;
|
|
62
|
+
animation: in 0.1s linear;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
dialog.closing,
|
|
66
|
+
dialog.closing::backdrop {
|
|
67
|
+
animation: out 0.1s linear;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@keyframes in {
|
|
71
|
+
from {
|
|
72
|
+
opacity: 0;
|
|
73
|
+
}
|
|
74
|
+
to {
|
|
75
|
+
opacity: 1;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@keyframes out {
|
|
80
|
+
from {
|
|
81
|
+
opacity: 1;
|
|
82
|
+
}
|
|
83
|
+
to {
|
|
84
|
+
opacity: 0;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
</style>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
open?: boolean;
|
|
3
|
+
children?: import('svelte').Snippet;
|
|
4
|
+
onclose?: () => void;
|
|
5
|
+
}
|
|
6
|
+
declare const Modal: import("svelte").Component<Props, {}, "open">;
|
|
7
|
+
type Modal = ReturnType<typeof Modal>;
|
|
8
|
+
export default Modal;
|
|
9
|
+
//# sourceMappingURL=Modal.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Modal.svelte.d.ts","sourceRoot":"","sources":["../src/lib/Modal.svelte.ts"],"names":[],"mappings":"AAGC,UAAU,KAAK;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,QAAQ,EAAE,OAAO,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAsCF,QAAA,MAAM,KAAK,+CAAwC,CAAC;AACpD,KAAK,KAAK,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AACtC,eAAe,KAAK,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { run, createBubbler, stopPropagation } from 'svelte/legacy';
|
|
3
|
+
|
|
4
|
+
const bubble = createBubbler();
|
|
5
|
+
import Image from '../Image.svelte';
|
|
6
|
+
import type { ArtPiece } from '../util/art.js';
|
|
7
|
+
|
|
8
|
+
interface Props {
|
|
9
|
+
pieces: ArtPiece[];
|
|
10
|
+
selected: number | null;
|
|
11
|
+
browser: boolean;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
let { pieces, selected = $bindable(), browser }: Props = $props();
|
|
15
|
+
|
|
16
|
+
let carouselScroller: HTMLDivElement | undefined = $state();
|
|
17
|
+
|
|
18
|
+
run(() => {
|
|
19
|
+
if (carouselScroller && selected !== null && browser) {
|
|
20
|
+
const width = browser
|
|
21
|
+
? parseInt(
|
|
22
|
+
getComputedStyle(document.documentElement).getPropertyValue('--carousel-height') ||
|
|
23
|
+
'100'
|
|
24
|
+
)
|
|
25
|
+
: 100;
|
|
26
|
+
carouselScroller.scroll({
|
|
27
|
+
left: Math.max(0, width * selected + width / 2 - window.innerWidth / 2),
|
|
28
|
+
behavior: 'smooth'
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
</script>
|
|
33
|
+
|
|
34
|
+
<div
|
|
35
|
+
style="height: var(--carousel-height); width: 100%; overflow: scroll;"
|
|
36
|
+
bind:this={carouselScroller}
|
|
37
|
+
onclick={stopPropagation(bubble('click'))}
|
|
38
|
+
onkeypress={stopPropagation(bubble('keypress'))}
|
|
39
|
+
role="button"
|
|
40
|
+
tabindex={-1}
|
|
41
|
+
>
|
|
42
|
+
<div style="width: fit-content;">
|
|
43
|
+
<div style=" display: flex; flex-direction: row; align-items: end;">
|
|
44
|
+
{#each pieces as piece, j (piece.slug)}
|
|
45
|
+
<div
|
|
46
|
+
class="gallery-item"
|
|
47
|
+
onclick={() => (selected = j)}
|
|
48
|
+
onkeypress={() => (selected = j)}
|
|
49
|
+
class:selected={selected === j}
|
|
50
|
+
role="button"
|
|
51
|
+
tabindex={-1}
|
|
52
|
+
>
|
|
53
|
+
<Image picture={piece.image.thumbnail} alt={piece.alt} />
|
|
54
|
+
</div>
|
|
55
|
+
{/each}
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
|
|
60
|
+
<style>
|
|
61
|
+
.selected.gallery-item {
|
|
62
|
+
opacity: 1;
|
|
63
|
+
}
|
|
64
|
+
.gallery-item {
|
|
65
|
+
border: 1px solid #0008;
|
|
66
|
+
height: var(--carousel-height);
|
|
67
|
+
width: auto;
|
|
68
|
+
aspect-ratio: 1 / 1;
|
|
69
|
+
user-select: none;
|
|
70
|
+
cursor: pointer;
|
|
71
|
+
display: flex;
|
|
72
|
+
flex-direction: row;
|
|
73
|
+
justify-content: center;
|
|
74
|
+
opacity: 0.5;
|
|
75
|
+
}
|
|
76
|
+
</style>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ArtPiece } from '../util/art.ts';
|
|
2
|
+
interface Props {
|
|
3
|
+
pieces: ArtPiece[];
|
|
4
|
+
selected: number | null;
|
|
5
|
+
browser: boolean;
|
|
6
|
+
}
|
|
7
|
+
declare const Carousel: import("svelte").Component<Props, {}, "selected">;
|
|
8
|
+
type Carousel = ReturnType<typeof Carousel>;
|
|
9
|
+
export default Carousel;
|
|
10
|
+
//# sourceMappingURL=Carousel.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Carousel.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/ModalGallery/Carousel.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG9C,UAAU,KAAK;IACd,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;CACjB;AA6CF,QAAA,MAAM,QAAQ,mDAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
|