@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
@@ -0,0 +1,46 @@
1
+ <script lang="ts" module>
2
+ /* eslint-disable svelte/no-useless-mustaches */
3
+ export function asString(artists: Array<NormalizedArtist>) {
4
+ let s = '';
5
+ for (let i = 0; i < artists.length; i++) {
6
+ const artist = artists[i];
7
+ const hasLink = !!artist.info?.links?.[0];
8
+ if (hasLink) {
9
+ s += '@' + (artist.info?.name || artist.name);
10
+ } else {
11
+ s += artist.info?.name || artist.name;
12
+ }
13
+ if (i < artists.length - 2) {
14
+ s += ', ';
15
+ }
16
+ if (i === artists.length - 2) {
17
+ s += ' and ';
18
+ }
19
+ }
20
+ return s;
21
+ }
22
+ </script>
23
+
24
+ <script lang="ts">
25
+ import type { NormalizedArtist } from '../util/art.js';
26
+ interface Props {
27
+ artists: Array<NormalizedArtist>;
28
+ }
29
+
30
+ let { artists }: Props = $props();
31
+ </script>
32
+
33
+ {#each artists as artist, i (artist.name)}
34
+ {@const link = Object.values(artist.info?.links ?? {})[0] ?? null}
35
+ {#if link}
36
+ <a target="_blank" rel="noreferrer nofollow noopener" href={link} style="font-weight: 700;">
37
+ @{artist.info?.name || artist.name}
38
+ </a>
39
+ {:else if artist}
40
+ <span style="font-weight: 700;">
41
+ {artist.info ? `@${artist.name}` : artist.name}</span
42
+ >{/if}{#if i < artists.length - 2},{' '}
43
+ {:else if i === artists.length - 2}
44
+ {' '}and{' '}
45
+ {/if}
46
+ {/each}
@@ -0,0 +1,9 @@
1
+ export declare function asString(artists: Array<NormalizedArtist>): string;
2
+ import type { NormalizedArtist } from '../util/art.ts';
3
+ interface Props {
4
+ artists: Array<NormalizedArtist>;
5
+ }
6
+ declare const ArtistLink: import("svelte").Component<Props, {}, "">;
7
+ type ArtistLink = ReturnType<typeof ArtistLink>;
8
+ export default ArtistLink;
9
+ //# sourceMappingURL=ArtistLink.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArtistLink.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/Postcard/ArtistLink.svelte.ts"],"names":[],"mappings":"AAIC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,gBAAgB,CAAC,UAkBxD;AAGF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEtD,UAAU,KAAK;IACd,OAAO,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;CACjC;AA0BF,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
@@ -0,0 +1,100 @@
1
+ <script lang="ts" module>
2
+ import {
3
+ useChipConfig,
4
+ type ChipOptionsByType,
5
+ type DataType
6
+ } from '../util/phosart_config.svelte.js';
7
+ </script>
8
+
9
+ <script lang="ts">
10
+ import Character from './Description/Character.svelte';
11
+
12
+ interface Props<K extends keyof ChipOptionsByType> {
13
+ type: K;
14
+ data: DataType<K>;
15
+ }
16
+
17
+ type ChipProps = NonNullable<
18
+ {
19
+ [K in keyof ChipOptionsByType]: Props<K>;
20
+ }[keyof ChipOptionsByType]
21
+ >;
22
+
23
+ let props: ChipProps = $props();
24
+
25
+ const config = $derived(useChipConfig(props.type));
26
+ const action = $derived(config?.action ?? null);
27
+ const href = $derived(action?.makeHref?.(props.data));
28
+ const clickHandler = $derived(
29
+ config?.action?.onclick ? () => action?.onclick?.(props.data) : null
30
+ );
31
+
32
+ const info = $derived.by(() => {
33
+ switch (props.type) {
34
+ case 'artist':
35
+ return props.data.info ? `@${props.data.info.name || props.data.name}` : props.data.name;
36
+ case 'character':
37
+ return '';
38
+ case 'permalink':
39
+ return 'Permalink';
40
+ case 'tag':
41
+ return `#${props.data}`;
42
+ }
43
+ });
44
+
45
+ const icon = $derived.by(() => {
46
+ switch (props.type) {
47
+ case 'artist':
48
+ return 'fa-paintbrush';
49
+ case 'character':
50
+ return 'n/a';
51
+ case 'permalink':
52
+ return '';
53
+ case 'tag':
54
+ return '';
55
+ }
56
+ });
57
+ </script>
58
+
59
+ <span class="chip-root">
60
+ {#if props.type == 'character'}
61
+ <Character character={props.data} />
62
+ {:else}
63
+ <svelte:element
64
+ this={href ? 'a' : 'span'}
65
+ style={href || clickHandler ? 'cursor: pointer;' : undefined}
66
+ href={href ?? undefined}
67
+ onclick={clickHandler ?? undefined}
68
+ role="button"
69
+ tabindex="0"
70
+ >
71
+ {#if icon}
72
+ <span class="fa solid {icon}"></span>
73
+ {/if}
74
+ {info}
75
+ </svelte:element>
76
+ {/if}
77
+ </span>
78
+
79
+ <style>
80
+ .chip-root {
81
+ line-height: 1.3em;
82
+ display: inline-block;
83
+ padding: 2px 6px;
84
+ border-radius: 4px;
85
+ border: 1px solid #fff4;
86
+ background-color: #0001;
87
+ transition: border-color 0.35s ease-in-out;
88
+ white-space: nowrap;
89
+
90
+ & :global(a) {
91
+ border: 0;
92
+ }
93
+ &:first-child {
94
+ margin-left: 0;
95
+ }
96
+ &:has(:global(a:hover)) {
97
+ border-color: var(--color-accent);
98
+ }
99
+ }
100
+ </style>
@@ -0,0 +1,12 @@
1
+ import { type ChipOptionsByType, type DataType } from '../util/phosart_config.svelte.ts';
2
+ interface Props<K extends keyof ChipOptionsByType> {
3
+ type: K;
4
+ data: DataType<K>;
5
+ }
6
+ type ChipProps = NonNullable<{
7
+ [K in keyof ChipOptionsByType]: Props<K>;
8
+ }[keyof ChipOptionsByType]>;
9
+ declare const Chip: import("svelte").Component<ChipProps, {}, "">;
10
+ type Chip = ReturnType<typeof Chip>;
11
+ export default Chip;
12
+ //# sourceMappingURL=Chip.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Chip.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/Postcard/Chip.svelte.ts"],"names":[],"mappings":"AAGC,OAAO,EAEN,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EACb,MAAM,kCAAkC,CAAC;AAM1C,UAAU,KAAK,CAAC,CAAC,SAAS,MAAM,iBAAiB;IAChD,IAAI,EAAE,CAAC,CAAC;IACR,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;CAClB;AAED,KAAK,SAAS,GAAG,WAAW,CAC3B;KACE,CAAC,IAAI,MAAM,iBAAiB,GAAG,KAAK,CAAC,CAAC,CAAC;CACxC,CAAC,MAAM,iBAAiB,CAAC,CAC1B,CAAC;AA6DH,QAAA,MAAM,IAAI,+CAAwC,CAAC;AACnD,KAAK,IAAI,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;AACpC,eAAe,IAAI,CAAC"}
@@ -0,0 +1,79 @@
1
+ <script lang="ts">
2
+ import '@fortawesome/fontawesome-free/css/all.min.css';
3
+
4
+ import type { Artist, NormalizedCharacter } from '../../util/art.js';
5
+ import { useArtists } from '../../util/artistcontext.svelte.js';
6
+ import { useChipConfig } from '../../util/phosart_config.svelte.js';
7
+
8
+ interface Props {
9
+ character: NormalizedCharacter;
10
+ }
11
+
12
+ let { character }: Props = $props();
13
+ const artists = useArtists();
14
+
15
+ let cname = $derived(character.name);
16
+ let characterObj = $derived(character.info ?? null);
17
+ let artist = $derived(character.from);
18
+ let artistObj: Artist | null = $derived(artist ? (artists[artist] ?? null) : null);
19
+ let artistUrl = $derived(artistObj?.links ? Object.values(artistObj.links)[0] : null);
20
+
21
+ let name = $derived(characterObj?.name ?? cname);
22
+
23
+ const config = useChipConfig('character');
24
+ const href = $derived(config?.action?.makeHref?.(character));
25
+ const clickHandler = $derived(
26
+ config?.action?.onclick ? () => config?.action?.onclick?.(character) : null
27
+ );
28
+ </script>
29
+
30
+ {#if !config?.hidden}
31
+ {#if artist}
32
+ <span class="character">
33
+ <svelte:element
34
+ this={artistUrl ? 'a' : 'span'}
35
+ href={artistUrl ?? undefined}
36
+ target={!artistUrl ? undefined : artistUrl.startsWith('http') ? '_blank' : '_self'}
37
+ rel={!artistUrl
38
+ ? undefined
39
+ : artistUrl.startsWith('http')
40
+ ? 'noreferrer noopener nofollow'
41
+ : ''}
42
+ >
43
+ <span class="fa solid fa-user-group"></span>
44
+ <span>
45
+ {artistObj?.name ? `@${artistObj.name}` : artist}'s
46
+ </span>
47
+ <span>
48
+ {name}
49
+ </span>
50
+ </svelte:element>
51
+ </span>
52
+ {:else if href}
53
+ <span class="character">
54
+ <a {href}>
55
+ <span class="fa solid fa-user"></span>
56
+ {name}
57
+ </a>
58
+ </span>
59
+ {:else if clickHandler}
60
+ <span class="character">
61
+ <!-- svelte-ignore a11y_invalid_attribute -->
62
+ <a href="#" onclick={clickHandler}>
63
+ <span class="fa solid fa-user"></span>
64
+ {name}
65
+ </a>
66
+ </span>
67
+ {:else}
68
+ <span class="character">
69
+ <span class="fa solid fa-user"></span>
70
+ {name}
71
+ </span>
72
+ {/if}
73
+ {/if}
74
+
75
+ <style>
76
+ .fa {
77
+ font-size: 0.85em;
78
+ }
79
+ </style>
@@ -0,0 +1,9 @@
1
+ import '@fortawesome/fontawesome-free/css/all.min.css';
2
+ import type { NormalizedCharacter } from '../../util/art.ts';
3
+ interface Props {
4
+ character: NormalizedCharacter;
5
+ }
6
+ declare const Character: import("svelte").Component<Props, {}, "">;
7
+ type Character = ReturnType<typeof Character>;
8
+ export default Character;
9
+ //# sourceMappingURL=Character.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Character.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/Postcard/Description/Character.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,+CAA+C,CAAC;AAEvD,OAAO,KAAK,EAAU,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAKpE,UAAU,KAAK;IACd,SAAS,EAAE,mBAAmB,CAAC;CAC/B;AAuEF,QAAA,MAAM,SAAS,2CAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
@@ -0,0 +1,146 @@
1
+ <script lang="ts">
2
+ import '@fortawesome/fontawesome-free/css/all.min.css';
3
+
4
+ import { markdown } from '../util/markdown.js';
5
+ import { type ArtPiece, normalizeArtist, normalizeCharacter } from '../util/art.js';
6
+
7
+ import { formatDate } from '../util/date.js';
8
+ import Chip from './Chip.svelte';
9
+ import { useCharacters } from '../util/charactercontext.svelte.js';
10
+ import { useArtists } from '../util/artistcontext.svelte.js';
11
+
12
+ interface Props {
13
+ piece: ArtPiece;
14
+ visible: boolean;
15
+ showName: boolean;
16
+ selectedAlt: number | null;
17
+ onselectalt?: (index: number | null) => void;
18
+ }
19
+
20
+ let {
21
+ piece,
22
+ visible = $bindable(),
23
+ showName,
24
+ selectedAlt,
25
+ onselectalt = undefined
26
+ }: Props = $props();
27
+
28
+ const characters = useCharacters();
29
+ const artists = useArtists();
30
+ </script>
31
+
32
+ <div class="description-inner" class:showing-description={visible}>
33
+ <div style="overflow: hidden;">
34
+ <div>
35
+ {#if showName}
36
+ <div style="margin-bottom: 0.5rem;">
37
+ <span style="border-bottom: 1px dashed #8886; font-style: italic;">
38
+ {piece.name}
39
+ </span>
40
+ </div>
41
+ {/if}
42
+ </div>
43
+
44
+ <div
45
+ style="font-size:0.8em; line-height: 1.2em; {piece.description ? 'margin-bottom: 1rem;' : ''}"
46
+ class="no-p"
47
+ >
48
+ <!-- eslint-disable-next-line svelte/no-at-html-tags -->
49
+ {@html markdown(
50
+ (selectedAlt && piece.alts?.[selectedAlt]?.description) || piece.description || ''
51
+ )}
52
+ </div>
53
+
54
+ {#if piece.alts && Object.keys(piece.alts).length > 0}
55
+ <div style="font-size: 0.7em; line-height: 1.2em; margin-bottom: 1rem" class="tags">
56
+ This piece as multiple versions:
57
+ {#if selectedAlt !== null}
58
+ <span>
59
+ <!-- svelte-ignore a11y_invalid_attribute -->
60
+ <a
61
+ href="#"
62
+ onclick={(e) => {
63
+ e.preventDefault();
64
+ e.stopPropagation();
65
+ onselectalt?.(null);
66
+ }}
67
+ >
68
+ Original Version
69
+ </a>
70
+ </span>
71
+ {/if}
72
+
73
+ {#each piece.alts as alt, i (alt.name)}
74
+ {#if i !== selectedAlt}
75
+ <span>
76
+ <!-- svelte-ignore a11y_invalid_attribute -->
77
+ <a
78
+ href="#"
79
+ onclick={(e) => {
80
+ e.preventDefault();
81
+ e.stopPropagation();
82
+ onselectalt?.(i);
83
+ }}
84
+ >
85
+ {alt.name}
86
+ </a>
87
+ </span>
88
+ {/if}
89
+ {/each}
90
+ </div>
91
+ {/if}
92
+
93
+ <div style="font-size: 0.7em; line-height: 1.2em; margin-bottom: 1rem" class="tags">
94
+ <Chip type="permalink" data={piece} />
95
+ </div>
96
+
97
+ <div style="font-size: 0.7em" class="tags">
98
+ {#each normalizeArtist(piece.artist, artists) as artist (artist.name)}
99
+ <Chip type="artist" data={artist} />
100
+ {/each}
101
+ {#each piece.characters ?? [] as character, i (i)}
102
+ <Chip type="character" data={normalizeCharacter(character, characters)} />
103
+ {/each}
104
+ {#if piece.tags}
105
+ {#each piece.tags as tag (tag)}
106
+ <Chip type="tag" data={tag} />
107
+ {/each}
108
+ {/if}
109
+ </div>
110
+ {#if piece.date}
111
+ <div
112
+ style="font-size: 0.7em; opacity: 0.8; font-style: italic; margin-top: 0.4rem; line-height: 1em"
113
+ >
114
+ {formatDate(piece.date)}
115
+ </div>
116
+ {/if}
117
+ </div>
118
+ </div>
119
+
120
+ <style>
121
+ .tags {
122
+ display: flex;
123
+ flex-wrap: wrap;
124
+ line-height: 2em;
125
+ row-gap: 0.25rem;
126
+ column-gap: 0.25rem;
127
+ }
128
+ .description-inner {
129
+ display: grid;
130
+ grid-template-rows: 0fr;
131
+ width: 100%;
132
+ text-align: left;
133
+ padding: 0 2rem 0 2rem;
134
+ transition:
135
+ grid-template-rows 0.2s ease-in-out,
136
+ padding 0.2s ease-in-out;
137
+ pointer-events: auto;
138
+ }
139
+ .description-inner.showing-description {
140
+ grid-template-rows: 1fr;
141
+ padding: 1rem 2rem 1rem 2rem;
142
+ }
143
+ .no-p > :global(p) {
144
+ margin-bottom: 0.25rem;
145
+ }
146
+ </style>
@@ -0,0 +1,13 @@
1
+ import '@fortawesome/fontawesome-free/css/all.min.css';
2
+ import { type ArtPiece } from '../util/art.ts';
3
+ interface Props {
4
+ piece: ArtPiece;
5
+ visible: boolean;
6
+ showName: boolean;
7
+ selectedAlt: number | null;
8
+ onselectalt?: (index: number | null) => void;
9
+ }
10
+ declare const Description: import("svelte").Component<Props, {}, "visible">;
11
+ type Description = ReturnType<typeof Description>;
12
+ export default Description;
13
+ //# sourceMappingURL=Description.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Description.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/Postcard/Description.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,+CAA+C,CAAC;AAGvD,OAAO,EAAE,KAAK,QAAQ,EAAuC,MAAM,gBAAgB,CAAC;AAQnF,UAAU,KAAK;IACd,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC7C;AA0GF,QAAA,MAAM,WAAW,kDAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -0,0 +1,70 @@
1
+ <script lang="ts">
2
+ import { normalizeArtist, type ArtPiece } from '../util/art.js';
3
+ import { useArtists } from '../util/artistcontext.svelte.js';
4
+ import ArtistLink from './ArtistLink.svelte';
5
+
6
+ const allArtists = useArtists();
7
+
8
+ interface Props {
9
+ piece: ArtPiece;
10
+ showName: boolean;
11
+ /* bind */
12
+ showingDescription: boolean;
13
+ }
14
+
15
+ let { piece, showName, showingDescription = $bindable() }: Props = $props();
16
+ let artists = $derived(normalizeArtist(piece.artist, allArtists));
17
+ </script>
18
+
19
+ <div class="headline-container">
20
+ <div style="font-style: italic; padding-left: 2rem;" class="byline">
21
+ {#if artists && artists.length > 0}
22
+ by <ArtistLink {artists} />
23
+ {/if}
24
+ </div>
25
+ <div style="display: flex">
26
+ {#if showName}
27
+ <div style="padding-right: 2rem" class="piece-name">
28
+ {piece.name}
29
+ </div>
30
+ {/if}
31
+ <div
32
+ role="button"
33
+ tabindex={-1}
34
+ onclick={() => (showingDescription = !showingDescription)}
35
+ onkeypress={() => (showingDescription = !showingDescription)}
36
+ class="details-toggle"
37
+ >
38
+ {showingDescription ? 'hide' : 'show'} details
39
+ </div>
40
+ </div>
41
+ </div>
42
+
43
+ <style>
44
+ .headline-container {
45
+ display: flex;
46
+ padding: 0 2rem;
47
+ flex-direction: row-reverse;
48
+ justify-content: space-between;
49
+ align-items: center;
50
+ overflow: hidden;
51
+ width: 100%;
52
+ height: 100%;
53
+ white-space: nowrap;
54
+ container: headline / size;
55
+ }
56
+
57
+ .details-toggle {
58
+ color: #6389da;
59
+ cursor: pointer;
60
+ font-size: 0.9em;
61
+ font-style: italic;
62
+ user-select: none;
63
+ }
64
+
65
+ @container headline (width < 300px) {
66
+ .byline {
67
+ visibility: hidden;
68
+ }
69
+ }
70
+ </style>
@@ -0,0 +1,10 @@
1
+ import { type ArtPiece } from '../util/art.ts';
2
+ interface Props {
3
+ piece: ArtPiece;
4
+ showName: boolean;
5
+ showingDescription: boolean;
6
+ }
7
+ declare const Headline: import("svelte").Component<Props, {}, "showingDescription">;
8
+ type Headline = ReturnType<typeof Headline>;
9
+ export default Headline;
10
+ //# sourceMappingURL=Headline.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Headline.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/Postcard/Headline.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAK/D,UAAU,KAAK;IACd,KAAK,EAAE,QAAQ,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAElB,kBAAkB,EAAE,OAAO,CAAC;CAC5B;AAkCF,QAAA,MAAM,QAAQ,6DAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,17 @@
1
+ export { default as FullGallery } from './FullGallery.svelte';
2
+ export { default as Gallery } from './Gallery.svelte';
3
+ export { default as GalleryPreview } from './GalleryPreview.svelte';
4
+ export { default as HighResContext } from './HighResContext.svelte';
5
+ export { default as Image } from './Image.svelte';
6
+ export { default as Modal } from './Modal.svelte';
7
+ export { default as ModalGallery } from './ModalGallery.svelte';
8
+ export { default as Carousel } from './ModalGallery/Carousel.svelte';
9
+ export { default as ImageSection } from './ModalGallery/ImageSection.svelte';
10
+ export { default as ImageView } from './ModalGallery/ImageView.svelte';
11
+ export { default as Spinner } from './ModalGallery/Spinner.svelte';
12
+ export { default as ArtistLink, asString } from './Postcard/ArtistLink.svelte';
13
+ export { default as Description } from './Postcard/Description.svelte';
14
+ export { default as Character } from './Postcard/Description/Character.svelte';
15
+ export { default as Headline } from './Postcard/Headline.svelte';
16
+ export { default as OpengraphMeta } from './OpengraphMeta.svelte';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/lib/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAEhE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAEnE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ // Reexport your entry components here
2
+ export { default as FullGallery } from './FullGallery.svelte';
3
+ export { default as Gallery } from './Gallery.svelte';
4
+ export { default as GalleryPreview } from './GalleryPreview.svelte';
5
+ export { default as HighResContext } from './HighResContext.svelte';
6
+ export { default as Image } from './Image.svelte';
7
+ export { default as Modal } from './Modal.svelte';
8
+ export { default as ModalGallery } from './ModalGallery.svelte';
9
+ export { default as Carousel } from './ModalGallery/Carousel.svelte';
10
+ export { default as ImageSection } from './ModalGallery/ImageSection.svelte';
11
+ export { default as ImageView } from './ModalGallery/ImageView.svelte';
12
+ export { default as Spinner } from './ModalGallery/Spinner.svelte';
13
+ export { default as ArtistLink, asString } from './Postcard/ArtistLink.svelte';
14
+ export { default as Description } from './Postcard/Description.svelte';
15
+ export { default as Character } from './Postcard/Description/Character.svelte';
16
+ export { default as Headline } from './Postcard/Headline.svelte';
17
+ export { default as OpengraphMeta } from './OpengraphMeta.svelte';
@@ -0,0 +1,7 @@
1
+ import type { z } from 'zod';
2
+ import { Artist } from './models/Artist.ts';
3
+ import { type NormalizedArtist } from '../util/art.ts';
4
+ export type ArtistCache = Record<string, z.infer<typeof Artist>>;
5
+ export declare function artists(): Promise<ArtistCache>;
6
+ export declare function getAllArtists(): Promise<Array<NormalizedArtist>>;
7
+ //# sourceMappingURL=artist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artist.d.ts","sourceRoot":"","sources":["../../src/lib/server/artist.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAmB,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGxE,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC;AAEjE,wBAAsB,OAAO,yBAoB5B;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAetE"}
@@ -0,0 +1,40 @@
1
+ import { $DATA } from "./directories.js";
2
+ import * as fs from 'node:fs/promises';
3
+ import * as path from 'node:path';
4
+ import * as yaml from 'yaml';
5
+ import { Artist } from "./models/Artist.js";
6
+ import { cacheVersion, getCache } from "./util.js";
7
+ import { normalizeArtist } from "../util/art.js";
8
+ import { galleries } from "./gallery.js";
9
+ export async function artists() {
10
+ const cached = getCache().artistCache;
11
+ const nextVersion = await cacheVersion();
12
+ if (cached.cache && cached.version === nextVersion) {
13
+ return cached.cache;
14
+ }
15
+ let artists;
16
+ try {
17
+ artists = yaml.parse(await fs.readFile(path.join($DATA(), 'artists.yaml'), { encoding: 'utf-8' }));
18
+ }
19
+ catch {
20
+ return {};
21
+ }
22
+ await Promise.all(Object.values(artists).map((v) => Artist.parseAsync(v)));
23
+ getCache().artistCache.cache = artists;
24
+ getCache().artistCache.version = nextVersion;
25
+ return artists;
26
+ }
27
+ export async function getAllArtists() {
28
+ const all = await artists();
29
+ const mapped = Object.values(await galleries())
30
+ .flatMap((g) => g.pieces)
31
+ .flatMap((p) => p.artist)
32
+ .flatMap((a) => normalizeArtist(a, all))
33
+ .concat(Object.values(all).flatMap((a) => normalizeArtist(a.name, all)));
34
+ // Collapse by name
35
+ const record = {};
36
+ for (const m of mapped) {
37
+ record[m.name] = m;
38
+ }
39
+ return Object.values(record);
40
+ }
@@ -0,0 +1,9 @@
1
+ import { FullCharacter, RawCharacter } from './models/Character.ts';
2
+ import type { z } from 'zod';
3
+ import { type NormalizedCharacter } from '../util/art.ts';
4
+ export type CharacterCache = Record<string, z.infer<typeof FullCharacter>>;
5
+ export type RawCharacterCache = Record<string, z.infer<typeof RawCharacter>>;
6
+ export declare function rawCharacters(): Promise<RawCharacterCache>;
7
+ export declare function characters(): Promise<CharacterCache>;
8
+ export declare function getAllCharacters(): Promise<Array<NormalizedCharacter>>;
9
+ //# sourceMappingURL=character.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"character.d.ts","sourceRoot":"","sources":["../../src/lib/server/character.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAK7B,OAAO,EAAsB,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE9E,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC;AAC3E,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC;AAkC7E,wBAAsB,aAAa,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAqBhE;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,cAAc,CAAC,CAyB1D;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAe5E"}