@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.
Files changed (178) hide show
  1. package/README.md +58 -0
  2. package/dist/FullGallery.svelte +51 -0
  3. package/dist/FullGallery.svelte.d.ts +17 -0
  4. package/dist/FullGallery.svelte.d.ts.map +1 -0
  5. package/dist/Gallery.svelte +30 -0
  6. package/dist/Gallery.svelte.d.ts +14 -0
  7. package/dist/Gallery.svelte.d.ts.map +1 -0
  8. package/dist/GalleryPreview.svelte +60 -0
  9. package/dist/GalleryPreview.svelte.d.ts +9 -0
  10. package/dist/GalleryPreview.svelte.d.ts.map +1 -0
  11. package/dist/HighResContext.svelte +21 -0
  12. package/dist/HighResContext.svelte.d.ts +8 -0
  13. package/dist/HighResContext.svelte.d.ts.map +1 -0
  14. package/dist/Image.svelte +171 -0
  15. package/dist/Image.svelte.d.ts +14 -0
  16. package/dist/Image.svelte.d.ts.map +1 -0
  17. package/dist/Modal.svelte +87 -0
  18. package/dist/Modal.svelte.d.ts +9 -0
  19. package/dist/Modal.svelte.d.ts.map +1 -0
  20. package/dist/ModalGallery/Carousel.svelte +76 -0
  21. package/dist/ModalGallery/Carousel.svelte.d.ts +10 -0
  22. package/dist/ModalGallery/Carousel.svelte.d.ts.map +1 -0
  23. package/dist/ModalGallery/ImageSection.svelte +156 -0
  24. package/dist/ModalGallery/ImageSection.svelte.d.ts +11 -0
  25. package/dist/ModalGallery/ImageSection.svelte.d.ts.map +1 -0
  26. package/dist/ModalGallery/ImageView.svelte +92 -0
  27. package/dist/ModalGallery/ImageView.svelte.d.ts +9 -0
  28. package/dist/ModalGallery/ImageView.svelte.d.ts.map +1 -0
  29. package/dist/ModalGallery/Spinner.svelte +71 -0
  30. package/dist/ModalGallery/Spinner.svelte.d.ts +7 -0
  31. package/dist/ModalGallery/Spinner.svelte.d.ts.map +1 -0
  32. package/dist/ModalGallery.svelte +165 -0
  33. package/dist/ModalGallery.svelte.d.ts +16 -0
  34. package/dist/ModalGallery.svelte.d.ts.map +1 -0
  35. package/dist/OpengraphMeta.svelte +125 -0
  36. package/dist/OpengraphMeta.svelte.d.ts +15 -0
  37. package/dist/OpengraphMeta.svelte.d.ts.map +1 -0
  38. package/dist/Postcard/ArtistLink.svelte +46 -0
  39. package/dist/Postcard/ArtistLink.svelte.d.ts +9 -0
  40. package/dist/Postcard/ArtistLink.svelte.d.ts.map +1 -0
  41. package/dist/Postcard/Chip.svelte +100 -0
  42. package/dist/Postcard/Chip.svelte.d.ts +12 -0
  43. package/dist/Postcard/Chip.svelte.d.ts.map +1 -0
  44. package/dist/Postcard/Description/Character.svelte +79 -0
  45. package/dist/Postcard/Description/Character.svelte.d.ts +9 -0
  46. package/dist/Postcard/Description/Character.svelte.d.ts.map +1 -0
  47. package/dist/Postcard/Description.svelte +146 -0
  48. package/dist/Postcard/Description.svelte.d.ts +13 -0
  49. package/dist/Postcard/Description.svelte.d.ts.map +1 -0
  50. package/dist/Postcard/Headline.svelte +70 -0
  51. package/dist/Postcard/Headline.svelte.d.ts +10 -0
  52. package/dist/Postcard/Headline.svelte.d.ts.map +1 -0
  53. package/dist/index.d.ts +17 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +17 -0
  56. package/dist/server/artist.d.ts +7 -0
  57. package/dist/server/artist.d.ts.map +1 -0
  58. package/dist/server/artist.js +40 -0
  59. package/dist/server/character.d.ts +9 -0
  60. package/dist/server/character.d.ts.map +1 -0
  61. package/dist/server/character.js +76 -0
  62. package/dist/server/directories.d.ts +4 -0
  63. package/dist/server/directories.d.ts.map +1 -0
  64. package/dist/server/directories.js +39 -0
  65. package/dist/server/fastcache.d.ts +11 -0
  66. package/dist/server/fastcache.d.ts.map +1 -0
  67. package/dist/server/fastcache.js +43 -0
  68. package/dist/server/filter.d.ts +6 -0
  69. package/dist/server/filter.d.ts.map +1 -0
  70. package/dist/server/filter.js +53 -0
  71. package/dist/server/gallery.d.ts +16 -0
  72. package/dist/server/gallery.d.ts.map +1 -0
  73. package/dist/server/gallery.js +162 -0
  74. package/dist/server/imageprocess.d.ts +18 -0
  75. package/dist/server/imageprocess.d.ts.map +1 -0
  76. package/dist/server/imageprocess.js +243 -0
  77. package/dist/server/index.d.ts +15 -0
  78. package/dist/server/index.d.ts.map +1 -0
  79. package/dist/server/index.js +15 -0
  80. package/dist/server/models/Artist.d.ts +7 -0
  81. package/dist/server/models/Artist.d.ts.map +1 -0
  82. package/dist/server/models/Artist.js +15 -0
  83. package/dist/server/models/Character.d.ts +108 -0
  84. package/dist/server/models/Character.d.ts.map +1 -0
  85. package/dist/server/models/Character.js +21 -0
  86. package/dist/server/models/Gallery.d.ts +373 -0
  87. package/dist/server/models/Gallery.d.ts.map +1 -0
  88. package/dist/server/models/Gallery.js +60 -0
  89. package/dist/server/models/image.d.ts +64 -0
  90. package/dist/server/models/image.d.ts.map +1 -0
  91. package/dist/server/models/image.js +17 -0
  92. package/dist/server/pack.d.ts +3 -0
  93. package/dist/server/pack.d.ts.map +1 -0
  94. package/dist/server/pack.js +26 -0
  95. package/dist/server/theme/schema.d.ts +57 -0
  96. package/dist/server/theme/schema.d.ts.map +1 -0
  97. package/dist/server/theme/schema.js +217 -0
  98. package/dist/server/util.d.ts +24 -0
  99. package/dist/server/util.d.ts.map +1 -0
  100. package/dist/server/util.js +71 -0
  101. package/dist/util/art.d.ts +52 -0
  102. package/dist/util/art.d.ts.map +1 -0
  103. package/dist/util/art.js +57 -0
  104. package/dist/util/artistcontext.svelte.d.ts +8 -0
  105. package/dist/util/artistcontext.svelte.d.ts.map +1 -0
  106. package/dist/util/artistcontext.svelte.js +18 -0
  107. package/dist/util/charactercontext.svelte.d.ts +4 -0
  108. package/dist/util/charactercontext.svelte.d.ts.map +1 -0
  109. package/dist/util/charactercontext.svelte.js +11 -0
  110. package/dist/util/date.d.ts +2 -0
  111. package/dist/util/date.d.ts.map +1 -0
  112. package/dist/util/date.js +6 -0
  113. package/dist/util/index.d.ts +13 -0
  114. package/dist/util/index.d.ts.map +1 -0
  115. package/dist/util/index.js +10 -0
  116. package/dist/util/markdown.d.ts +2 -0
  117. package/dist/util/markdown.d.ts.map +1 -0
  118. package/dist/util/markdown.js +16 -0
  119. package/dist/util/phosart_config.svelte.d.ts +44 -0
  120. package/dist/util/phosart_config.svelte.d.ts.map +1 -0
  121. package/dist/util/phosart_config.svelte.js +51 -0
  122. package/dist/util/search.d.ts +3 -0
  123. package/dist/util/search.d.ts.map +1 -0
  124. package/dist/util/search.js +24 -0
  125. package/dist/util/smoothscroll.d.ts +4 -0
  126. package/dist/util/smoothscroll.d.ts.map +1 -0
  127. package/dist/util/smoothscroll.js +21 -0
  128. package/dist/util/tree.d.ts +19 -0
  129. package/dist/util/tree.d.ts.map +1 -0
  130. package/dist/util/tree.js +58 -0
  131. package/dist/util/util.d.ts +4 -0
  132. package/dist/util/util.d.ts.map +1 -0
  133. package/dist/util/util.js +22 -0
  134. package/package.json +102 -0
  135. package/src/lib/FullGallery.svelte +51 -0
  136. package/src/lib/Gallery.svelte +30 -0
  137. package/src/lib/GalleryPreview.svelte +60 -0
  138. package/src/lib/HighResContext.svelte +21 -0
  139. package/src/lib/Image.svelte +171 -0
  140. package/src/lib/Modal.svelte +87 -0
  141. package/src/lib/ModalGallery/Carousel.svelte +76 -0
  142. package/src/lib/ModalGallery/ImageSection.svelte +156 -0
  143. package/src/lib/ModalGallery/ImageView.svelte +92 -0
  144. package/src/lib/ModalGallery/Spinner.svelte +71 -0
  145. package/src/lib/ModalGallery.svelte +165 -0
  146. package/src/lib/OpengraphMeta.svelte +125 -0
  147. package/src/lib/Postcard/ArtistLink.svelte +46 -0
  148. package/src/lib/Postcard/Chip.svelte +100 -0
  149. package/src/lib/Postcard/Description/Character.svelte +79 -0
  150. package/src/lib/Postcard/Description.svelte +146 -0
  151. package/src/lib/Postcard/Headline.svelte +70 -0
  152. package/src/lib/index.ts +20 -0
  153. package/src/lib/server/artist.ts +50 -0
  154. package/src/lib/server/character.ts +113 -0
  155. package/src/lib/server/directories.ts +45 -0
  156. package/src/lib/server/fastcache.ts +66 -0
  157. package/src/lib/server/filter.ts +71 -0
  158. package/src/lib/server/gallery.ts +259 -0
  159. package/src/lib/server/imageprocess.ts +382 -0
  160. package/src/lib/server/index.ts +57 -0
  161. package/src/lib/server/models/Artist.ts +19 -0
  162. package/src/lib/server/models/Character.ts +24 -0
  163. package/src/lib/server/models/Gallery.ts +70 -0
  164. package/src/lib/server/models/image.ts +20 -0
  165. package/src/lib/server/pack.ts +31 -0
  166. package/src/lib/server/theme/schema.ts +286 -0
  167. package/src/lib/server/util.ts +102 -0
  168. package/src/lib/util/art.ts +136 -0
  169. package/src/lib/util/artistcontext.svelte.ts +25 -0
  170. package/src/lib/util/charactercontext.svelte.ts +15 -0
  171. package/src/lib/util/date.ts +7 -0
  172. package/src/lib/util/index.ts +29 -0
  173. package/src/lib/util/markdown.ts +17 -0
  174. package/src/lib/util/phosart_config.svelte.ts +101 -0
  175. package/src/lib/util/search.ts +28 -0
  176. package/src/lib/util/smoothscroll.ts +21 -0
  177. package/src/lib/util/tree.ts +75 -0
  178. 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"}