@fuzdev/fuz_ui 0.171.0 → 0.173.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/LICENSE +2 -2
  2. package/README.md +1 -1
  3. package/dist/Alert.svelte +21 -21
  4. package/dist/Alert.svelte.d.ts +2 -3
  5. package/dist/Alert.svelte.d.ts.map +1 -1
  6. package/dist/Breadcrumb.svelte +4 -2
  7. package/dist/Breadcrumb.svelte.d.ts +2 -1
  8. package/dist/Breadcrumb.svelte.d.ts.map +1 -1
  9. package/dist/Card.svelte +13 -14
  10. package/dist/Card.svelte.d.ts +2 -3
  11. package/dist/Card.svelte.d.ts.map +1 -1
  12. package/dist/ColorSchemeInput.svelte +5 -7
  13. package/dist/ColorSchemeInput.svelte.d.ts +2 -2
  14. package/dist/ColorSchemeInput.svelte.d.ts.map +1 -1
  15. package/dist/Contextmenu.svelte +4 -5
  16. package/dist/Contextmenu.svelte.d.ts +1 -2
  17. package/dist/Contextmenu.svelte.d.ts.map +1 -1
  18. package/dist/CopyToClipboard.svelte +1 -2
  19. package/dist/CopyToClipboard.svelte.d.ts.map +1 -1
  20. package/dist/DocsContent.svelte +4 -2
  21. package/dist/DocsContent.svelte.d.ts +2 -1
  22. package/dist/DocsContent.svelte.d.ts.map +1 -1
  23. package/dist/DocsFooter.svelte +6 -5
  24. package/dist/DocsFooter.svelte.d.ts +2 -2
  25. package/dist/DocsFooter.svelte.d.ts.map +1 -1
  26. package/dist/DocsList.svelte +5 -5
  27. package/dist/DocsList.svelte.d.ts +2 -2
  28. package/dist/DocsList.svelte.d.ts.map +1 -1
  29. package/dist/DocsMenu.svelte +4 -2
  30. package/dist/DocsMenu.svelte.d.ts +2 -1
  31. package/dist/DocsMenu.svelte.d.ts.map +1 -1
  32. package/dist/DocsMenuHeader.svelte +1 -2
  33. package/dist/DocsMenuHeader.svelte.d.ts.map +1 -1
  34. package/dist/DocsModulesList.svelte +4 -2
  35. package/dist/DocsModulesList.svelte.d.ts +2 -1
  36. package/dist/DocsModulesList.svelte.d.ts.map +1 -1
  37. package/dist/DocsPageLinks.svelte +4 -2
  38. package/dist/DocsPageLinks.svelte.d.ts +2 -1
  39. package/dist/DocsPageLinks.svelte.d.ts.map +1 -1
  40. package/dist/DocsPrimaryNav.svelte +4 -2
  41. package/dist/DocsPrimaryNav.svelte.d.ts +2 -1
  42. package/dist/DocsPrimaryNav.svelte.d.ts.map +1 -1
  43. package/dist/DocsSecondaryNav.svelte +5 -2
  44. package/dist/DocsSecondaryNav.svelte.d.ts +2 -1
  45. package/dist/DocsSecondaryNav.svelte.d.ts.map +1 -1
  46. package/dist/DocsTertiaryNav.svelte +4 -2
  47. package/dist/DocsTertiaryNav.svelte.d.ts +2 -1
  48. package/dist/DocsTertiaryNav.svelte.d.ts.map +1 -1
  49. package/dist/EcosystemLinks.svelte +8 -38
  50. package/dist/EcosystemLinks.svelte.d.ts +1 -1
  51. package/dist/EcosystemLinks.svelte.d.ts.map +1 -1
  52. package/dist/EcosystemLinksPanel.svelte +6 -2
  53. package/dist/EcosystemLinksPanel.svelte.d.ts.map +1 -1
  54. package/dist/GithubLink.svelte +9 -11
  55. package/dist/GithubLink.svelte.d.ts.map +1 -1
  56. package/dist/Glyph.svelte +1 -2
  57. package/dist/Glyph.svelte.d.ts.map +1 -1
  58. package/dist/Hashlink.svelte +2 -7
  59. package/dist/Hashlink.svelte.d.ts.map +1 -1
  60. package/dist/HueInput.svelte +5 -6
  61. package/dist/HueInput.svelte.d.ts +2 -2
  62. package/dist/HueInput.svelte.d.ts.map +1 -1
  63. package/dist/ImgOrSvg.svelte +23 -23
  64. package/dist/ImgOrSvg.svelte.d.ts +1 -3
  65. package/dist/ImgOrSvg.svelte.d.ts.map +1 -1
  66. package/dist/LibraryDetail.svelte +6 -3
  67. package/dist/MdnLink.svelte +3 -9
  68. package/dist/MdnLink.svelte.d.ts.map +1 -1
  69. package/dist/PasteFromClipboard.svelte +1 -2
  70. package/dist/PasteFromClipboard.svelte.d.ts.map +1 -1
  71. package/dist/PendingAnimation.svelte +1 -2
  72. package/dist/PendingAnimation.svelte.d.ts.map +1 -1
  73. package/dist/PendingButton.svelte +1 -2
  74. package/dist/PendingButton.svelte.d.ts.map +1 -1
  75. package/dist/ProjectLinks.svelte +69 -42
  76. package/dist/ProjectLinks.svelte.d.ts.map +1 -1
  77. package/dist/Spiders.svelte +2 -2
  78. package/dist/Svg.svelte +6 -7
  79. package/dist/Svg.svelte.d.ts +1 -2
  80. package/dist/Svg.svelte.d.ts.map +1 -1
  81. package/dist/ThemeInput.svelte +4 -2
  82. package/dist/ThemeInput.svelte.d.ts +2 -1
  83. package/dist/ThemeInput.svelte.d.ts.map +1 -1
  84. package/dist/Themed.svelte +2 -1
  85. package/dist/Themed.svelte.d.ts.map +1 -1
  86. package/dist/declaration.svelte.d.ts +1 -1
  87. package/dist/library.svelte.d.ts +1 -2
  88. package/dist/library.svelte.d.ts.map +1 -1
  89. package/dist/library_gen.d.ts +3 -4
  90. package/dist/library_gen.d.ts.map +1 -1
  91. package/dist/library_gen.js +9 -6
  92. package/dist/library_gen_helpers.d.ts +18 -2
  93. package/dist/library_gen_helpers.d.ts.map +1 -1
  94. package/dist/library_gen_helpers.js +18 -8
  95. package/dist/logos.d.ts +14 -57
  96. package/dist/logos.d.ts.map +1 -1
  97. package/dist/logos.js +32 -168
  98. package/dist/themer.svelte.d.ts +5 -4
  99. package/dist/themer.svelte.d.ts.map +1 -1
  100. package/dist/themer.svelte.js +5 -3
  101. package/dist/vite_plugin_library_well_known.d.ts +37 -0
  102. package/dist/vite_plugin_library_well_known.d.ts.map +1 -0
  103. package/dist/vite_plugin_library_well_known.js +144 -0
  104. package/package.json +3 -3
  105. package/src/lib/library_gen.ts +10 -10
  106. package/src/lib/library_gen_helpers.ts +33 -10
  107. package/src/lib/logos.ts +33 -175
  108. package/src/lib/themer.svelte.ts +12 -9
  109. package/src/lib/vite_plugin_library_well_known.ts +189 -0
  110. package/dist/HiddenPersonalLinks.svelte +0 -6
  111. package/dist/HiddenPersonalLinks.svelte.d.ts +0 -27
  112. package/dist/HiddenPersonalLinks.svelte.d.ts.map +0 -1
@@ -102,30 +102,53 @@ export const library_gen_sort_modules = (modules: Array<ModuleJson>): Array<Modu
102
102
  };
103
103
 
104
104
  /**
105
- * Generate the library.ts file content with library_json export.
105
+ * Result of generating library files.
106
+ * Contains both the JSON data and the TypeScript wrapper file.
107
+ */
108
+ export interface LibraryGenOutput {
109
+ /** JSON content for library.json */
110
+ json_content: string;
111
+ /** TypeScript wrapper content for library.ts */
112
+ ts_content: string;
113
+ }
114
+
115
+ /**
116
+ * Generate the library.json and library.ts file contents.
106
117
  * Parses at generation time so runtime only needs the pre-computed result.
118
+ *
119
+ * Returns JSON + .ts wrapper because:
120
+ * - JSON is natively importable by Node.js and Vite without TypeScript loaders
121
+ * - Works in CI environments that don't have TS compilation
122
+ * - The .ts wrapper validates with zod and exports with proper types
123
+ * (JSON imports get widened types like `string` instead of literal unions)
107
124
  */
108
- export const library_gen_generate_ts = (
125
+ export const library_gen_generate_json = (
109
126
  package_json: PackageJson,
110
127
  source_json: SourceJson,
111
- ): string => {
112
- const is_this_belt = package_json.name === '@fuzdev/fuz_util';
113
- const banner = `// generated by library.gen.ts !! do not edit directly or risk lost data`;
128
+ ): LibraryGenOutput => {
129
+ const is_this_fuz_util = package_json.name === '@fuzdev/fuz_util';
130
+ const fuz_util_prefix = is_this_fuz_util ? './' : '@fuzdev/fuz_util/';
114
131
 
115
132
  // Parse at generation time, not runtime
116
133
  const library_json: LibraryJson = library_json_parse(package_json, source_json);
117
134
 
118
- return `${banner}
135
+ const json_content = JSON.stringify(library_json, null, '\t') + '\n';
119
136
 
120
- import type {LibraryJson} from '${is_this_belt ? './library_json.js' : '@fuzdev/fuz_util/library_json.js'}';
137
+ const banner = '// generated by library.gen.ts - do not edit';
121
138
 
122
- export const library_json: LibraryJson = ${stringify(library_json)};
139
+ const ts_content = `${banner}
140
+
141
+ import type {LibraryJson} from '${fuz_util_prefix}library_json.js';
142
+
143
+ import json from './library.json' with {type: 'json'};
144
+
145
+ export const library_json: LibraryJson = json as LibraryJson;
123
146
 
124
147
  ${banner}
125
148
  `;
126
- };
127
149
 
128
- const stringify = (v: unknown): string => JSON.stringify(v, null, '\t');
150
+ return {json_content, ts_content};
151
+ };
129
152
 
130
153
  /**
131
154
  * Collect and filter source files from filer.
package/src/lib/logos.ts CHANGED
@@ -19,23 +19,7 @@ Logo colors are the midpoint between the light and dark versions of color varian
19
19
  ```
20
20
  */
21
21
 
22
- export const zzz_logo = {
23
- label: "three sleepy z's",
24
- fill: '#e55d95',
25
- paths: [
26
- {
27
- d: 'm 75.29285,61.962268 1.752156,1.914421 14.843359,1.811307 L 74.065203,86.193332 99.966781,85.408255 98.719988,83.648246 85.143565,82.136577 98.430963,62.887945',
28
- },
29
- {
30
- d: 'm 47.636533,44.203704 2.295155,2.48945 25.618425,0.406407 L 45.93783,91.082857 89.425317,93.78003 87.862334,91.36274 61.57861,83.03068 86.244719,42.177019',
31
- },
32
- {
33
- d: 'M 0.62464489,0.27405496 3.9721704,4.0993769 50.515703,10.089712 0.04581262,99.957542 68.009395,98.901532 65.391343,95.487941 24.119119,88.067804 66.301842,2.2896897',
34
- },
35
- ],
36
- } satisfies SvgData;
37
-
38
- export const gro_logo = {
22
+ export const logo_gro = {
39
23
  label: 'a pixelated green oak acorn with a glint of sun',
40
24
  paths: [
41
25
  {
@@ -69,7 +53,7 @@ export const gro_logo = {
69
53
  ],
70
54
  } satisfies SvgData;
71
55
 
72
- export const fuz_logo = {
56
+ export const logo_fuz = {
73
57
  label: 'a friendly brown spider facing you',
74
58
  fill: '#84522a',
75
59
  paths: [
@@ -79,64 +63,44 @@ export const fuz_logo = {
79
63
  ],
80
64
  } satisfies SvgData;
81
65
 
82
- export const fuz_css_logo = {
66
+ export const logo_fuz_ui = {
67
+ label: 'a friendly red spider facing you',
68
+ fill: '#d93636',
69
+ paths: logo_fuz.paths,
70
+ } satisfies SvgData;
71
+
72
+ export const logo_fuz_css = {
83
73
  label: 'a fuzzy tuft of green moss',
84
74
  fill: '#3db33d',
85
- paths: fuz_logo.paths,
75
+ paths: logo_fuz.paths,
86
76
  attrs: {style: 'transform: scaleX(-1) rotate(180deg)'},
87
77
  } satisfies SvgData;
88
78
 
89
- export const belt_logo = {
90
- label: 'a green sauropod wearing a brown belt',
91
- paths: [
92
- {
93
- fill: '#5e853f',
94
- d: 'M 18.067186,15.969407 C 21.788999,13.893836 17.949371,0.38957847 10.927436,0.04361599 4.8719565,-0.25473037 1.7349173,7.4851976 0.94704854,15.249287 c -0.92008807,9.06705 -1.79155525,17.669932 0.59969726,28.291532 2.4805689,12.269719 7.0800447,23.952702 13.1393162,34.8823 6.000724,10.5946 6.775015,20.816886 4.701503,21.478748 -0.03241,0.01035 -0.07998,0.06265 0.04147,0.06596 1.294211,0.03532 10.640814,0.04592 10.677563,-0.05295 0.485896,-1.307172 -3.047914,-6.728008 -1.423246,-8.607633 1.949043,-2.254904 17.430713,0.186565 21.929,0.285178 9.05576,0.198523 17.000796,-1.770745 18.230176,-0.990103 1.997906,1.268647 0.07692,8.622864 -1.734662,9.31776 -0.123669,0.04744 -0.0605,0.05786 8.7e-5,0.05776 1.355848,-0.0022 8.671284,0.02064 9.113066,-0.03424 1.109966,-0.137881 1.121155,-9.535235 1.329075,-10.418319 C 77.607043,89.2834 96.053852,85.109995 99.112049,70.368973 103.63141,48.584901 86.877032,39.05263 85.950278,39.29966 83.317032,40.001563 101.56057,48.396651 91.102193,67.902384 88.018737,73.653284 77.350057,79.523245 75.685258,79.119008 73.64059,78.622534 65.09671,63.091297 52.400901,65.836332 43.234666,67.818217 41.919113,72.011159 30.91062,71.457371 23.396234,71.079356 15.879493,62.020499 10.825044,44.977744 8.7853926,38.10038 7.9304392,31.282385 7.7195376,25.924892 7.3556266,16.68053 7.7329856,12.199716 7.7329856,12.199716 c 0,0 7.0326794,5.610875 10.3342004,3.769691 z',
95
- },
96
- {
97
- fill: '#6f492b',
98
- d: 'm 51.811124,91.579144 c -0.338516,0.300927 1.649325,0.223227 1.91566,0.125562 10.084215,-3.697658 13.756737,-6.313605 15.083689,-19.379753 0.213532,-2.102603 -6.814409,-6.279564 -6.854038,-5.131405 -0.399472,11.573929 -1.610604,16.392773 -10.086139,24.32687',
99
- },
100
- {
101
- fill: '#34251a',
102
- d: 'm 57.712693,87.945562 c 0,0 1.995464,1.865412 2.68268,1.964956 0.765874,0.110938 4.011805,-1.572536 4.056136,-2.519526 0.05138,-1.097583 -3.559853,-3.060285 -3.559853,-3.060285',
103
- },
104
- {
105
- fill: '#34251a',
106
- d: 'm 61.598583,82.940048 c 0,0 3.423751,3.095396 4.286346,2.851789 0.676123,-0.190945 2.567214,-3.369081 2.28239,-4.177499 -0.333199,-0.945723 -5.337842,-1.790867 -5.337842,-1.790867',
107
- },
108
- {
109
- fill: '#34251a',
110
- d: 'm 63.187415,78.383306 c 0,0 4.923745,1.759016 5.668289,1.154079 0.551751,-0.448294 1.380932,-3.505132 1.032166,-4.129317 -0.767431,-1.37347 -5.791186,-3.388548 -5.791186,-3.388548',
111
- },
112
- ],
113
- } satisfies SvgData;
114
-
115
- export const fuz_code_logo = {
79
+ export const logo_fuz_code = {
116
80
  label: 'a friendly pink spider facing you',
117
81
  fill: '#e55d95',
118
- paths: fuz_logo.paths,
82
+ paths: logo_fuz.paths,
119
83
  } satisfies SvgData;
120
84
 
121
- export const fuz_blog_logo = {
85
+ export const logo_fuz_blog = {
122
86
  label: 'a friendly yellow spider facing you',
123
87
  fill: '#d8bc31',
124
- paths: fuz_logo.paths,
88
+ paths: logo_fuz.paths,
125
89
  } satisfies SvgData;
126
90
 
127
- export const fuz_mastodon_logo = {
91
+ export const logo_fuz_mastodon = {
128
92
  label: 'a friendly purple spider facing you',
129
93
  fill: '#8866cc',
130
- paths: fuz_logo.paths,
94
+ paths: logo_fuz.paths,
131
95
  } satisfies SvgData;
132
96
 
133
- export const fuz_gitops_logo = {
97
+ export const logo_fuz_gitops = {
134
98
  label: 'a friendly blue spider facing you',
135
99
  fill: '#6199d1',
136
- paths: fuz_logo.paths,
100
+ paths: logo_fuz.paths,
137
101
  } satisfies SvgData;
138
102
 
139
- export const fuz_template_logo = {
103
+ export const logo_fuz_template = {
140
104
  label: 'a friendly orange pixelated spider facing you',
141
105
  fill: '#f4672f',
142
106
  paths: [
@@ -146,95 +110,33 @@ export const fuz_template_logo = {
146
110
  ],
147
111
  } satisfies SvgData;
148
112
 
149
- export const webdevladder_logo = {
150
- label: 'a spider web between two rungs of a ladder',
151
- fill: '#3db33d',
152
- paths: [
153
- {
154
- d: 'M 37.174163,0.4792687 21.634926,39.631201 0.16786597,97.97918 16.575416,99.521374 19.352058,91.559689 68.736056,94.77021 70.61636,84.176728 21.745713,80.516425 33.323161,43.781709 44.12821,16.308249 84.47938,15.069186 86.44336,5.5860536 47.872897,6.9685586 49.611104,1.8736809 M 86.061057,1.9243199 74.915756,51.346436 65.559591,99.975909 82.510118,98.660645 89.82178,48.868054 99.675222,0.2061973',
155
- },
156
- {
157
- d: 'M 82.541527,24.61445 53.862329,44.979685 26.077601,62.33992 25.099707,65.937651 55.229899,47.076762 81.507935,28.318661 M 66.33555,87.233139 54.738379,48.989886 44.170835,12.54806 42.725942,15.71185 52.060344,49.856839 63.493965,86.901562 M 67.524475,13.659828 52.81301,43.245382 35.985883,84.117296 38.703349,84.412401 55.158864,44.100695 70.474719,13.501929 m 5.1603,41.982295 -23.74376,-10.305007 -17.603166,-9.426434 -0.972181,2.878616 17.876898,8.612725 23.958503,10.964992',
158
- },
159
- {
160
- d: 'm 50.5769,48.285601 0.966122,3.361133 2.456436,-0.09293 2.944734,-2.586661 -0.487976,-4.866721 -1.365959,-1.908962 -3.545067,0.04669 -2.781093,2.644178 -1.139247,5.065325 1.443893,5.999034 5.886709,0.356695 5.877825,-5.767341 0.765816,-9.526984 -4.632806,-4.416277 -7.978619,-0.418274 -5.522701,6.340293 -1.318243,11.151446 3.639737,9.979651 L 57.644364,63.06574 65.560214,52.529221 68.781299,35.897047 60.700698,29.322838 46.760117,27.037036 36.988493,39.207818 33.631767,58.700914 41.28115,74.499356 60.724825,72.962824 71.958187,55.382886 77.273782,30.412258 65.694639,19.60012 44.511786,14.731021 44.715509,16.675374 64.52349,21.522567 74.843098,31.738084 69.730823,54.159963 59.634025,70.76874 42.717921,72.097706 35.95196,57.551866 l 2.738009,-17.179374 8.834853,-11.13111 12.095799,2.019068 6.862581,6.161296 -3.066403,14.068912 -6.523733,9.299082 -9.939247,0.591529 -2.829727,-8.963835 1.086548,-8.709392 4.596194,-5.524272 6.319767,0.309359 3.579728,3.550699 -0.928078,7.718816 -4.331029,4.154252 -4.574097,-0.220971',
161
- },
162
- ],
163
- } satisfies SvgData;
164
-
165
- export const earbetter_logo = {
166
- label: 'two beamed musical notes with ears',
167
- fill: '#8866cc',
168
- paths: [
169
- {
170
- d: 'M 17.649763,27.091907 92.652647,0.07053376 93.464619,72.197282 c 0.0732,6.502554 -1.033904,26.195178 -10.644213,24.298316 -7.390587,-3.01113 -12.412301,-8.362897 -15.415159,-15.610599 -1.399917,-3.394335 -2.714253,-7.01918 -2.443203,-10.740686 0.340155,-4.670337 3.306295,-10.054413 6.970064,-12.97067 5.830865,-4.641207 15.450507,3.781166 15.450507,3.781166 L 84.813136,20.044447 23.342705,37.878638 25.739331,81.968409 c 0.356336,6.555367 -1.690324,19.516051 -6.937964,17.89111 C 15.430616,98.815763 12.34752,96.863406 7.2108686,88.806175 5.5129407,86.142843 5.0055612,82.674429 5.1528405,79.556791 c 0.183839,-3.891543 2.8440779,-7.761614 6.0200145,-10.018009 3.189269,-2.265866 8.500011,1.905961 8.500011,1.905961 M 23.170251,33.362099 84.485514,14.48689 84.220567,8.2399358 23.002286,29.453122 Z m -3.615828,52.986209 c -9.350797,3.940785 2.203294,11.549107 1.505207,1.654032 0,0 -2.834448,-12.747668 -3.964416,-12.841723 -1.293231,-0.107644 -12.4433683,3.811252 -5.227105,14.095981 -1.8880811,-2.376702 -4.6381237,-9.29629 5.436642,-11.774152 m 67.749413,1.414718 c -11.923517,6.195109 3.283676,14.41667 1.96013,2.093665 0,0 -3.665948,-16.618177 -5.020704,-16.996094 -1.798588,-0.501728 -18.078576,4.37863 -8.198369,18.612282 C 71.38344,79.544295 68.77145,69.693545 82.044022,67.159294',
171
- },
172
- ],
173
- } satisfies SvgData;
174
-
175
- export const spiderspace_logo = {
176
- label: 'a galaxy full of twinkling star spiders',
177
- raw: `<defs>
178
- <radialGradient id="spiderspace_logo_galaxy_radial_gradient">
179
- <stop offset="0%" stop-color="#397fc6" />
180
- <stop offset="50%" stop-color="#5040bf" />
181
- <stop offset="70%" stop-color="#2e669e" />
182
- <stop offset="90%" stop-color="#8866cc" />
183
- <stop offset="95%" stop-color="#5040bf" />
184
- <stop offset="100%" stop-color="#6a40bf" />
185
- </radialGradient>
186
- <radialGradient id="spiderspace_logo_spider_radial_gradient" cx="0.55" cy="0.53">
187
- <stop offset="0%" stop-color="#ff901a" />
188
- <stop offset="35%" stop-color="#e5c005" />
189
- <stop offset="70%" stop-color="#ceac00" />
190
- <stop offset="100%" stop-color="#ec8134" />
191
- </radialGradient>
192
- </defs>`,
113
+ export const logo_fuz_util = {
114
+ label: 'a green sauropod wearing a brown belt',
193
115
  paths: [
194
116
  {
195
- fill: '#000000',
196
- d: 'm 2.7319777,12.06515 c -2.9772288,4.480651 0.101121,8.290257 -0.218631,13.660347 -0.2901896,4.873603 -2.72182351,9.904096 -2.22149984,14.965353 0.97446424,9.857645 -0.92984933,14.395113 3.58316664,23.331957 1.2917401,2.557952 8.4404405,10.715965 8.5086535,18.436157 0.04402,4.982653 -3.3698719,8.170635 4.926261,13.770622 4.403444,2.972374 18.065843,3.873614 21.458807,3.709972 2.659836,-0.128285 11.354843,0.275292 24.9486,-0.141686 5.199079,-0.159479 10.690562,-3.022132 15.834855,-3.791622 4.348365,-0.650434 9.591516,0.261065 13.262606,-2.158522 7.561814,-4.598552 6.506857,-11.480506 7.014701,-19.764216 C 100.31884,63.574373 98.667109,55.9074 99.602247,45.289695 100.11534,39.463957 95.897159,29.999919 94.097811,25.920626 89.9514,16.520316 97.655093,9.2962978 94.420382,3.9252755 92.95561,1.4931188 91.043485,0.72403527 86.242863,0.36951587 82.630045,0.10271417 79.176667,1.2696601 73.04615,0.66623613 60.497146,-0.56895658 49.326866,0.32368417 35.916077,0.35042141 25.942681,1.2235266 23.107679,5.0129412 18.245529,5.8490002 14.632362,6.4702933 6.0665522,7.0467033 2.7319777,12.06515 Z',
197
- },
198
- {
199
- fill: "url('#spiderspace_logo_galaxy_radial_gradient')",
200
- d: 'M 41.391236,63.051146 C 33.101277,59.381253 25.468093,45.742926 25.968903,40.864718 26.47209,33.815832 38.701833,22.418881 41.51038,20.969358 c 3.812312,-2.29735 23.213922,-2.657575 33.693681,2.03222 11.179251,4.788744 20.431016,18.081407 21.06409,20.733048 2.198069,8.91408 7.241359,29.651079 -3.162658,39.721942 -17.30326,13.408505 -20.52971,13.039204 -41.910242,16.402096 -8.814053,0.617556 -21.073344,-1.572123 -31.580566,-4.460774 -0.97087,-0.420143 -2.274673,-1.71451 -1.625837,-1.661149 18.282473,2.687822 15.269024,2.607025 31.6774,0.887128 C 73.483357,93.85536 76.00865,92.487339 88.202493,79.794536 95.264786,70.763831 98.219325,71.369947 90.726804,46.036416 86.486072,30.899346 80.838557,30.73624 72.72026,27.076918 63.988942,23.141276 56.075126,19.998521 44.238428,25.98457 c -5.498722,3.347106 -10.804182,2.46512 -11.364155,15.00928 0.834256,10.377361 2.640093,12.680871 9.795913,14.221232 12.169687,0.693813 12.056629,-15.713913 20.41488,-14.809854 8.798827,0.995591 15.825208,8.671317 16.154942,18.135372 -0.1498,5.614338 -6.300267,13.188764 -13.294214,17.625334 -9.314739,5.391697 -22.317147,1.772039 -32.536635,0.520804 C 16.927476,72.824023 4.869592,57.793694 3.6601863,54.998722 -0.29148097,43.060661 3.3014798,21.244121 8.8379156,14.335408 13.006415,7.5990804 32.225731,3.0503398 44.931515,1.3218515 c 9.09225,-1.09456615 15.891073,-3.3689028 43.901741,3.6485916 0.747362,0.1912686 1.683777,1.591738 1.201279,1.5230051 C 66.295051,3.077785 62.514079,3.0931959 45.950985,6.5403681 37.778696,7.5648832 19.035412,6.4179932 13.476809,17.898834 4.2612823,36.638405 4.3827466,37.458254 9.6277911,53.123189 13.765209,63.514895 12.709091,63.459113 35.008252,70.980947 43.888711,73.624142 49.51008,78.877631 63.132495,71.39185 68.152511,67.563314 72.325339,68.471179 72.090999,58.848803 72.86057,44.801893 65.67137,47.553592 62.194729,47.369105 53.522898,46.908938 48.591134,65.048567 41.391236,63.051146 Z',
201
- },
202
- {
203
- fill: "url('#spiderspace_logo_spider_radial_gradient')",
204
- d: 'm 24.4585,64.970717 -0.930962,-2.241324 -0.224544,-2.918957 -0.304656,-0.347669 -0.278169,0.03594 -1.592326,1.40895 -1.191021,1.478973 -0.467224,1.045104 -0.259107,0.07189 0.266678,-1.255052 1.037223,-1.74184 1.64018,-1.725952 -0.02215,-0.368073 -0.274852,-0.131558 -2.190347,-0.270682 -1.670993,0.337187 -0.953319,0.148773 -0.178034,-0.160885 1.021237,-0.497411 1.810539,-0.481202 2.299845,0.130503 0.127035,-0.218522 -0.07993,-0.170527 -1.376599,-1.056429 -1.369186,-0.625465 -0.491568,-0.521398 0.03733,-0.226693 0.776326,0.509595 1.272685,0.27188 1.429846,0.920058 0.34613,-0.167324 0.385057,-0.51644 -0.507846,-1.109613 -0.04766,-1.437916 -0.228535,-0.998702 0.207214,0.03989 0.27946,0.720271 0.412455,1.586861 0.597116,0.990816 0.113807,0.119774 0.28822,0.07792 0.437823,-2.14204 0.433085,-1.743293 0.691342,-1.08962 0.06641,0.190647 -0.343996,0.770599 -0.310789,2.058743 0.0125,2.31944 0.0764,0.217499 0.238771,0.10859 2.208552,-0.948814 1.580988,0.01918 0.83258,0.177777 0.143991,0.159779 -1.005217,0.01058 -1.538265,0.25429 -1.862719,1.084909 -0.0025,0.197317 0.285853,0.23216 2.32098,1.054317 1.764918,1.638937 0.805362,1.161766 -0.09835,0.266702 -0.934868,-0.884911 -1.954205,-1.44216 -2.685667,-0.973353 -0.502084,0.270421 -0.569458,0.921912 0.07444,2.789455 0.671329,2.538031 0.38061,0.950549 -0.344995,-0.006 z',
205
- },
206
- {
207
- fill: "url('#spiderspace_logo_spider_radial_gradient')",
208
- d: 'm 26.7296,29.884698 -2.320885,0.49838 -2.80025,-0.352714 -0.396099,0.239774 -0.02879,0.289202 0.968893,1.894849 1.125181,1.501825 0.87937,0.681576 0.0094,0.277041 -1.12227,-0.519968 -1.407397,-1.398139 -1.256758,-2.006406 -0.351724,-0.05074 -0.185828,0.252502 -0.747951,2.167283 -0.05842,1.761503 -0.07437,0.996301 -0.191635,0.148522 -0.238738,-1.134485 -0.04584,-1.931652 0.640522,-2.306192 -0.177192,-0.172312 -0.178626,0.04715 -1.304991,1.185874 -0.897272,1.264098 -0.601792,0.394801 -0.205109,-0.08306 0.654829,-0.685851 0.542527,-1.236505 1.188505,-1.266976 -0.07971,-0.384266 -0.399845,-0.493146 -1.159576,0.294331 -1.365278,-0.237588 -0.992232,0.03317 0.0843,-0.202166 0.741411,-0.140174 1.587682,-0.102722 1.067761,-0.408472 0.138519,-0.09156 0.138253,-0.276782 -1.919314,-0.869899 -1.544754,-0.785805 -0.87085,-0.917705 0.194539,-0.02953 0.648498,0.502081 1.869425,0.724525 2.187783,0.448488 0.222075,-0.03419 0.156022,-0.220553 -0.396756,-2.428234 0.37387,-1.599381 0.354858,-0.808922 0.182967,-0.114177 -0.216296,1.021432 -0.106646,1.610431 0.602776,2.104599 0.185346,0.04172 0.283019,-0.243744 1.515503,-2.143963 1.941107,-1.463819 1.275661,-0.585672 0.22911,0.152752 -1.043997,0.772043 -1.798389,1.694838 -1.521352,2.529838 0.141752,0.5629 0.740307,0.760759 2.644484,0.47917 2.54196,-0.176105 0.9811,-0.196917 -0.08396,0.348504 z',
209
- },
210
- {
211
- fill: "url('#spiderspace_logo_spider_radial_gradient')",
212
- d: 'm 55.788199,11.366192 2.350612,-0.586417 2.862956,0.227733 0.396802,-0.251787 0.02119,-0.284726 -1.040466,-1.8167425 -1.188746,-1.4247826 -0.915114,-0.6311097 -0.01738,-0.2711951 1.158049,0.462445 1.473267,1.3113167 1.336897,1.9139692 0.359783,0.03491 0.182208,-0.255394 0.70105,-2.1561917 0.01,-1.7293284 0.04771,-0.9798424 0.191075,-0.1536727 0.27515,1.1021105 0.10105,1.891732 -0.587714,2.2878377 0.185394,0.161434 0.180669,-0.05374 1.296226,-1.217564 0.878625,-1.2770591 0.60203,-0.4124016 0.211325,0.072723 -0.647865,0.699974 -0.517952,1.2350596 -1.175264,1.2921591 0.09205,0.373344 0.421256,0.466589 1.173153,-0.337421 1.397692,0.175361 1.010004,-0.07434 -0.08014,0.201757 -0.751447,0.168663 -1.614716,0.16763 -1.076393,0.445454 -0.138545,0.09561 -0.133071,0.277165 1.979972,0.77188 1.595977,0.705243 0.913089,0.862945 -0.197366,0.03713 -0.67485,-0.464864 -1.925052,-0.63147 -2.241641,-0.347445 -0.225295,0.04287 -0.152762,0.222791 0.472543,2.363757 -0.335908,1.58369 -0.338785,0.807975 -0.18323,0.119603 0.191636,-1.010462 0.06334,-1.583255 -0.673349,-2.037806 -0.190021,-0.03307 -0.281518,0.250853 -1.483749,2.165684 -1.936511,1.516864 -1.283227,0.62793 -0.23775,-0.140042 1.041949,-0.80087 1.784611,-1.737312 1.478838,-2.544223 -0.160261,-0.545862 -0.77567,-0.714583 -2.707809,-0.358275 -2.584921,0.279792 -0.994056,0.234407 0.07573,-0.345193 z',
213
- },
214
- {
215
- fill: "url('#spiderspace_logo_spider_radial_gradient')",
216
- d: 'm 83.118615,67.384674 0.62104,2.273532 -0.195632,2.849118 0.259268,0.370803 0.288028,-0.0032 1.823586,-1.182818 1.425757,-1.295927 0.626814,-0.958133 0.273895,-0.0402 -0.453425,1.18391 -1.307567,1.567608 -1.918309,1.484016 -0.03095,0.358574 0.260313,0.158411 2.187711,0.509725 1.747939,-0.137088 0.990895,-0.0361 0.157628,0.175793 -1.110579,0.365603 -1.910741,0.260604 -2.319397,-0.386512 -0.160944,0.196949 0.05649,0.174012 1.246219,1.177749 1.301319,0.759923 0.424077,0.560006 -0.07098,0.215053 -0.715265,-0.580929 -1.254513,-0.407007 -1.320161,-1.051846 -0.376225,0.122716 -0.466501,0.456012 0.355187,1.130882 -0.160382,1.396388 0.08733,0.991976 -0.204881,-0.06207 -0.179528,-0.728405 -0.188904,-1.581754 -0.463198,-1.026065 -0.09826,-0.128839 -0.281736,-0.107968 -0.756251,2.022592 -0.693527,1.637397 -0.861158,0.975824 -0.04,-0.191907 0.461707,-0.706519 0.614993,-1.956385 0.324124,-2.245171 -0.04606,-0.219044 -0.227012,-0.132063 -2.38333,0.667905 -1.604677,-0.197457 -0.820704,-0.266202 -0.12307,-0.170956 1.023578,0.103565 1.600953,-0.07192 2.051471,-0.838687 0.03107,-0.19063 -0.256968,-0.256909 -2.206741,-1.282541 -1.55644,-1.785177 -0.650121,-1.214999 0.138692,-0.246887 0.822003,0.961826 1.777428,1.616306 2.589262,1.245535 0.54976,-0.204789 0.712882,-0.827382 0.329438,-2.706854 -0.313968,-2.531179 -0.248904,-0.962615 0.349805,0.04547 z',
117
+ fill: '#5e853f',
118
+ d: 'M 18.067186,15.969407 C 21.788999,13.893836 17.949371,0.38957847 10.927436,0.04361599 4.8719565,-0.25473037 1.7349173,7.4851976 0.94704854,15.249287 c -0.92008807,9.06705 -1.79155525,17.669932 0.59969726,28.291532 2.4805689,12.269719 7.0800447,23.952702 13.1393162,34.8823 6.000724,10.5946 6.775015,20.816886 4.701503,21.478748 -0.03241,0.01035 -0.07998,0.06265 0.04147,0.06596 1.294211,0.03532 10.640814,0.04592 10.677563,-0.05295 0.485896,-1.307172 -3.047914,-6.728008 -1.423246,-8.607633 1.949043,-2.254904 17.430713,0.186565 21.929,0.285178 9.05576,0.198523 17.000796,-1.770745 18.230176,-0.990103 1.997906,1.268647 0.07692,8.622864 -1.734662,9.31776 -0.123669,0.04744 -0.0605,0.05786 8.7e-5,0.05776 1.355848,-0.0022 8.671284,0.02064 9.113066,-0.03424 1.109966,-0.137881 1.121155,-9.535235 1.329075,-10.418319 C 77.607043,89.2834 96.053852,85.109995 99.112049,70.368973 103.63141,48.584901 86.877032,39.05263 85.950278,39.29966 83.317032,40.001563 101.56057,48.396651 91.102193,67.902384 88.018737,73.653284 77.350057,79.523245 75.685258,79.119008 73.64059,78.622534 65.09671,63.091297 52.400901,65.836332 43.234666,67.818217 41.919113,72.011159 30.91062,71.457371 23.396234,71.079356 15.879493,62.020499 10.825044,44.977744 8.7853926,38.10038 7.9304392,31.282385 7.7195376,25.924892 7.3556266,16.68053 7.7329856,12.199716 7.7329856,12.199716 c 0,0 7.0326794,5.610875 10.3342004,3.769691 z',
217
119
  },
218
120
  {
219
- fill: "url('#spiderspace_logo_spider_radial_gradient')",
220
- d: 'm 63.126698,59.930492 -1.457655,1.884072 -2.411576,1.598041 -0.14286,0.431059 0.175554,0.223693 2.047571,0.701697 1.899748,0.320437 1.147922,-0.09787 0.196867,0.189865 -1.225591,0.372501 -2.04751,-0.06084 -2.347008,-0.590707 -0.307297,0.196172 0.02877,0.301318 0.903451,2.027304 1.160147,1.285175 0.624177,0.754132 -0.04682,0.23156 -0.961364,-0.645364 -1.357379,-1.336803 -1.081754,-2.054731 -0.255246,-0.0051 -0.106182,0.15122 -0.199874,1.700308 0.16965,1.486646 -0.196222,0.676476 -0.215771,0.07662 0.03816,-0.917443 -0.4257,-1.233049 0.05408,-1.680846 -0.324754,-0.219319 -0.647345,-0.08518 -0.697264,0.973408 -1.22068,0.732692 -0.746292,0.678168 -0.07307,-0.198684 0.478687,-0.588398 1.160161,-1.120278 0.548003,-0.993609 0.04466,-0.156207 -0.08226,-0.28709 -2.082758,0.650767 -1.734932,0.463136 -1.302914,-0.07485 0.130492,-0.149294 0.846167,-0.07257 1.94462,-0.720745 2.002452,-1.12614 0.148654,-0.170776 -0.03,-0.259033 -1.969161,-1.456694 -0.804703,-1.378587 -0.278548,-0.806617 0.06366,-0.201527 0.531341,0.865591 1.019411,1.210062 1.907348,1.091739 0.172175,-0.09283 0.05252,-0.359247 -0.292623,-2.517253 0.502654,-2.316735 0.587863,-1.256182 0.282085,-0.04314 -0.280782,1.235228 -0.233962,2.386062 0.552155,2.794191 0.495065,0.304841 1.094343,0.04993 2.377393,-1.405763 1.849523,-1.801865 0.625602,-0.786711 0.173431,0.302034 z',
121
+ fill: '#6f492b',
122
+ d: 'm 51.811124,91.579144 c -0.338516,0.300927 1.649325,0.223227 1.91566,0.125562 10.084215,-3.697658 13.756737,-6.313605 15.083689,-19.379753 0.213532,-2.102603 -6.814409,-6.279564 -6.854038,-5.131405 -0.399472,11.573929 -1.610604,16.392773 -10.086139,24.32687',
221
123
  },
222
124
  {
223
- fill: "url('#spiderspace_logo_spider_radial_gradient')",
224
- d: 'm 62.102874,37.816738 1.065395,-2.189224 2.035598,-2.104555 0.06013,-0.460695 -0.209289,-0.186442 -2.098287,-0.269378 -1.887384,0.08031 -1.088071,0.3397 -0.223723,-0.148187 1.113521,-0.630395 1.983063,-0.370763 2.366744,0.0954 0.260737,-0.260718 -0.08188,-0.294916 -1.234511,-1.834674 -1.348384,-1.039249 -0.736695,-0.621782 0.0036,-0.241179 1.041942,0.442027 1.547638,1.049244 1.411176,1.824489 0.246741,-0.0488 0.07505,-0.173454 -0.113049,-1.740566 -0.430559,-1.449258 0.06742,-0.717097 0.194051,-0.122029 0.128129,0.924482 0.631631,1.141969 0.249965,1.690402 0.352217,0.150643 0.638825,-0.05134 0.496654,-1.1193 1.044066,-0.989153 0.596941,-0.834708 0.106046,0.183061 -0.355324,0.688636 -0.916124,1.363567 -0.349263,1.108016 -0.01498,0.165454 0.130822,0.269447 1.889127,-1.089017 1.587826,-0.828283 1.268405,-0.199779 -0.09889,0.176609 -0.801972,0.250823 -1.743494,1.129805 -1.726347,1.546947 -0.112467,0.201927 0.07547,0.252422 2.158436,1.040077 1.022849,1.207451 0.413241,0.747028 -0.02513,0.214724 -0.667325,-0.752654 -1.199328,-0.993905 -2.033327,-0.688511 -0.149143,0.129015 0.01398,0.369914 0.734221,2.452817 -0.06781,2.420132 -0.340464,1.378711 -0.263959,0.102505 0.04846,-1.293053 -0.203448,-2.432754 -1.033965,-2.674759 -0.531598,-0.2002 -1.063021,0.180765 -2.037232,1.905293 -1.457615,2.189695 -0.461192,0.9177 -0.221298,-0.265177 z',
125
+ fill: '#34251a',
126
+ d: 'm 57.712693,87.945562 c 0,0 1.995464,1.865412 2.68268,1.964956 0.765874,0.110938 4.011805,-1.572536 4.056136,-2.519526 0.05138,-1.097583 -3.559853,-3.060285 -3.559853,-3.060285',
225
127
  },
226
128
  {
227
- fill: "url('#spiderspace_logo_spider_radial_gradient')",
228
- d: 'm 46.131527,47.070508 -1.381955,-1.93615 -0.792213,-2.712142 -0.377797,-0.269413 -0.276778,0.08753 -1.352158,1.637268 -0.929381,1.625933 -0.274857,1.076719 -0.25039,0.11786 0.02991,-1.236202 0.721781,-1.844401 1.339782,-1.945758 -0.09367,-0.343184 -0.30568,-0.0712 -2.286151,0.167102 -1.639165,0.640727 -0.943572,0.324438 -0.212597,-0.117553 0.945584,-0.666593 1.753713,-0.803592 2.370782,-0.320562 0.08749,-0.230726 -0.114326,-0.145579 -1.607822,-0.731657 -1.517135,-0.326173 -0.601949,-0.397338 -0.006,-0.221204 0.890085,0.331309 1.350462,0.01109 1.63582,0.592624 0.320721,-0.22476 0.293074,-0.561808 -0.732042,-0.949483 -0.326043,-1.348183 -0.425781,-0.898674 0.219026,-0.0024 0.424005,0.62602 0.726846,1.418394 0.800158,0.820125 0.139275,0.09115 0.308984,0.01793 0.03323,-2.106547 0.10527,-1.729222 0.494853,-1.161979 0.104665,0.16709 -0.202186,0.793814 0.0802,2.003397 0.460311,2.187112 0.119952,0.190557 0.264493,0.05639 2.06942,-1.321799 1.616124,-0.286997 0.883459,0.0071 0.17761,0.123154 -1.023185,0.203902 -1.519801,0.536849 -1.69046,1.38353 0.03567,0.186744 0.336369,0.163964 2.570594,0.547395 2.116262,1.206594 1.045542,0.941305 -0.04876,0.270745 -1.124211,-0.654953 -2.271319,-0.98439 -2.926901,-0.400648 -0.459895,0.352151 -0.40289,0.980154 0.614138,2.61886 1.174395,2.266342 0.571572,0.823893 -0.353157,0.06024 z',
129
+ fill: '#34251a',
130
+ d: 'm 61.598583,82.940048 c 0,0 3.423751,3.095396 4.286346,2.851789 0.676123,-0.190945 2.567214,-3.369081 2.28239,-4.177499 -0.333199,-0.945723 -5.337842,-1.790867 -5.337842,-1.790867',
229
131
  },
230
132
  {
231
- fill: "url('#spiderspace_logo_spider_radial_gradient')",
232
- d: 'm 45.945462,79.913836 1.411293,1.974457 0.875407,2.793632 0.375055,0.270233 0.262948,-0.09762 1.234572,-1.731035 0.827801,-1.70899 0.220151,-1.12342 0.236283,-0.128352 0.02248,1.282873 -0.618812,1.930522 -1.209885,2.050678 0.104382,0.353658 0.297402,0.06636 2.195098,-0.228975 1.552315,-0.704439 0.895418,-0.359408 0.209659,0.116708 -0.88317,0.714387 -1.65589,0.876151 -2.270252,0.390196 -0.07464,0.241491 0.116251,0.148176 1.578961,0.719684 1.474791,0.301433 0.596268,0.397444 0.01462,0.229274 -0.871067,-0.3219 -1.301225,0.02138 -1.600168,-0.57483 -0.299617,0.240897 -0.259016,0.589826 0.744438,0.966932 0.3699,1.390342 0.447337,0.921696 -0.21087,0.0077 -0.434326,-0.638951 -0.758851,-1.453407 -0.804696,-0.831098 -0.137842,-0.0911 -0.298358,-0.01111 0.05525,2.185628 -0.02983,1.796035 -0.42851,1.217208 -0.107598,-0.170824 0.161834,-0.828234 -0.160293,-2.075887 -0.533941,-2.257183 -0.123369,-0.194739 -0.257078,-0.05211 -1.938508,1.421314 -1.544781,0.336956 -0.851231,0.01407 -0.176242,-0.12329 0.977073,-0.236434 1.441632,-0.593816 1.570922,-1.476122 -0.04195,-0.192827 -0.330752,-0.161903 -2.498665,-0.505187 -2.088364,-1.199912 -1.046063,-0.950822 0.03583,-0.281987 1.109974,0.651924 2.228532,0.965598 2.83579,0.344261 0.428385,-0.376436 0.347479,-1.026383 -0.700023,-2.701216 -1.225057,-2.321962 -0.584683,-0.84057 0.337505,-0.07176 z',
133
+ fill: '#34251a',
134
+ d: 'm 63.187415,78.383306 c 0,0 4.923745,1.759016 5.668289,1.154079 0.551751,-0.448294 1.380932,-3.505132 1.032166,-4.129317 -0.767431,-1.37347 -5.791186,-3.388548 -5.791186,-3.388548',
233
135
  },
234
136
  ],
235
137
  } satisfies SvgData;
236
138
 
237
- export const github_logo = {
139
+ export const logo_github = {
238
140
  label: 'the GitHub logo, an octocat silhouette',
239
141
  paths: [
240
142
  {
@@ -247,7 +149,7 @@ export const github_logo = {
247
149
  viewBox: '0 0 1024 1024',
248
150
  } satisfies SvgData;
249
151
 
250
- export const mdn_logo = {
152
+ export const logo_mdn = {
251
153
  label: 'the MDN logo, an M formed from forward slashes and vertical bars',
252
154
  fill: '#8cb4ff',
253
155
  paths: [
@@ -256,47 +158,3 @@ export const mdn_logo = {
256
158
  },
257
159
  ],
258
160
  } satisfies SvgData;
259
-
260
- export const chatgpt_logo = {
261
- label: 'the ChatGPT logo',
262
- paths: [
263
- {
264
- d: 'M 92.824732,40.934711 C 95.093282,34.125934 94.312102,26.667213 90.684294,20.474005 85.228523,10.974839 74.260736,6.0877682 63.549176,8.3875665 58.783969,3.0192876 51.937693,-0.03356964 44.7602,0.01017652 33.811161,-0.0148213 24.096388,7.0345602 20.727933,17.452396 13.694174,18.892893 7.6228289,23.295632 4.0700165,29.535711 c -5.4963924,9.47417 -4.24337782,21.41687 3.0997279,29.541159 -2.268551,6.808776 -1.4873695,14.267497 2.1404374,20.460703 5.4557742,9.499168 16.4235632,14.386238 27.1351222,12.08644 4.762082,5.36828 11.611481,8.421127 18.788976,8.374265 C 66.189568,100.0264 75.907466,92.97077 79.27592,82.54356 86.309679,81.10306 92.381021,76.700323 95.933833,70.460245 101.42394,60.986077 100.1678,49.052749 92.827857,40.928461 Z M 55.24053,93.464477 c -4.38399,0.0062 -8.630493,-1.527992 -11.995823,-4.33712 0.15311,-0.08124 0.418714,-0.228105 0.590574,-0.334345 l 19.910752,-11.49899 c 1.018661,-0.578077 1.643606,-1.662356 1.637357,-2.834129 V 46.390482 l 8.414886,4.858949 c 0.09062,0.04375 0.149986,0.131237 0.162486,0.23123 V 74.725495 C 73.948265,85.06209 65.577123,93.442603 55.24053,93.464477 Z M 14.981562,76.26911 c -2.196682,-3.793417 -2.987238,-8.239901 -2.234179,-12.555149 0.146862,0.0875 0.406214,0.246855 0.590575,0.353095 l 19.910751,11.498992 c 1.009287,0.590572 2.259177,0.590572 3.271588,0 L 60.827539,61.529779 v 9.717898 c 0.0062,0.09999 -0.04062,0.196858 -0.118738,0.259352 L 40.58244,83.127883 C 31.617603,88.289931 20.168607,85.221451 14.984686,76.26911 Z M 9.7413935,32.8073 c 2.1873115,-3.799666 5.6401345,-6.705663 9.7522715,-8.214905 0,0.17186 -0.0094,0.474959 -0.0094,0.68744 v 23.001106 c -0.0062,1.168647 0.618696,2.252926 1.634232,2.831002 l 24.307241,14.033144 -8.414884,4.858948 c -0.08436,0.05625 -0.190608,0.06561 -0.284351,0.02501 L 16.597046,58.398803 C 7.6509526,53.218009 4.5824707,41.772137 9.7382699,32.810423 Z M 78.879081,48.896514 54.571838,34.860243 62.986724,30.00442 c 0.08436,-0.05625 0.19061,-0.06561 0.284351,-0.02501 l 20.129484,11.620861 c 8.961713,5.177671 12.033318,16.642291 6.855648,25.604002 -2.190432,3.79342 -5.64013,6.699414 -9.749143,8.211781 V 51.72751 c 0.0094,-1.168648 -0.612449,-2.249803 -1.624858,-2.831 z m 8.374265,-12.605145 c -0.146862,-0.09062 -0.406215,-0.246854 -0.590572,-0.353094 L 66.75202,24.439283 c -1.009288,-0.590573 -2.259177,-0.590573 -3.271588,0 L 39.17319,38.47555 v -9.717896 c -0.0062,-0.09999 0.04062,-0.196858 0.11874,-0.259352 L 59.418287,16.88682 c 8.96484,-5.17142 20.426334,-2.093565 25.59463,6.874398 2.184185,3.787168 2.974739,8.221153 2.23418,12.530151 z M 34.598592,53.611723 26.180579,48.752775 c -0.09062,-0.04375 -0.149987,-0.13124 -0.162484,-0.23123 V 25.276711 c 0.0062,-10.349094 8.402387,-18.7358576 18.751479,-18.729608 4.377741,0 8.614867,1.5373651 11.980199,4.33712 -0.153113,0.08124 -0.41559,0.228105 -0.590575,0.334345 L 36.248445,22.717559 c -1.018659,0.578073 -1.643603,1.659229 -1.637356,2.831002 l -0.01249,28.056913 z m 4.571472,-9.855385 10.827174,-6.252577 10.827177,6.249452 V 56.25524 L 49.997238,62.504693 39.170064,56.25524 Z',
265
- },
266
- ],
267
- } satisfies SvgData;
268
-
269
- export const claude_logo = {
270
- label: 'the Claude logo',
271
- fill: '#d97757',
272
- paths: [
273
- {
274
- d: 'M 19.63855,66.500252 39.30268,55.467015 39.63334,54.508777 39.30268,53.975672 H 38.344442 L 35.058089,53.773227 23.822407,53.46956 14.078068,53.064671 4.6373961,52.558559 2.2620448,52.052447 0.03515285,49.116999 l 0.22943735,-1.46435 1.9974546,-1.342883 2.8612187,0.249681 6.3230235,0.431882 9.487909,0.654572 6.88312,0.404889 10.196466,1.059461 H 39.63334 L 39.862777,48.45568 39.309428,48.05079 38.877546,47.645901 29.058977,40.992218 18.43063,33.960638 12.8634,29.911743 9.8537217,27.860303 8.3353863,25.937079 7.6808151,21.739725 l 2.7330039,-3.009678 3.670997,0.249681 0.937994,0.249682 3.718235,2.861219 7.942581,6.147571 10.371918,7.638914 1.518335,1.261906 0.607334,-0.431882 0.07423,-0.303667 L 38.573879,35.263032 32.93242,25.066566 26.913063,14.694649 24.234045,10.396072 23.525488,7.8182763 C 23.275807,6.7588156 23.093606,5.8680588 23.093606,4.7816055 l 3.110901,-4.22434647 1.72078,-0.5533489 4.150117,0.5533489 1.747772,1.51833537 2.577797,5.8978895 4.177109,9.2854641 6.478231,12.625803 1.896232,3.745227 1.012224,3.468553 0.377897,1.059461 h 0.654571 v -0.607335 l 0.533104,-7.112557 0.985231,-8.732116 0.958239,-11.235682 0.330659,-3.1648857 1.565573,-3.7924644 3.1109,-2.0514398 2.429337,1.1606831 1.997454,2.8612187 -0.276674,1.8489951 -1.187676,7.719892 -2.328114,12.092698 -1.518335,8.097789 h 0.884008 l 1.012224,-1.012224 4.096131,-5.439015 6.883121,-8.6039 3.036671,-3.414568 3.542782,-3.77222 2.274129,-1.79501 h 4.298576 l 3.164886,4.703466 -1.417113,4.858673 -4.426791,5.614467 -3.670998,4.757451 -5.263562,7.085565 -3.286353,5.668452 0.303667,0.452127 0.782786,-0.07423 11.890253,-2.530559 6.424246,-1.160683 7.665907,-1.315891 3.468553,1.619558 0.377897,1.64655 -1.363128,3.367331 -8.199011,2.024447 -9.616124,1.923225 -14.31959,3.387575 -0.175452,0.128215 0.202444,0.249682 6.451239,0.607334 2.759996,0.148459 h 6.754906 l 12.578565,0.937994 3.286352,2.172907 1.970462,2.658774 -0.330659,2.024447 -5.061118,2.577796 -6.829136,-1.619558 -15.939147,-3.792464 -5.466008,-1.363128 h -0.755793 v 0.452127 l 4.555006,4.453784 8.347471,7.537691 10.452895,9.717347 0.533105,2.402344 -1.342884,1.896232 L 86.715233,84.220913 77.530991,77.3108 73.988209,74.1999 65.96465,67.444994 h -0.533105 v 0.708557 l 1.848995,2.706011 9.764584,14.677242 0.506112,4.501021 -0.708557,1.46435 -2.530559,0.884009 -2.780241,-0.506112 -5.715689,-8.023559 -5.897889,-9.035783 -4.757451,-8.097789 -0.580342,0.33066 -2.807233,30.238493 -1.315891,1.545328 -3.036671,1.160683 -2.530559,-1.923225 -1.342883,-3.1109 1.342883,-6.147572 1.619558,-8.023559 1.315891,-6.377008 1.187676,-7.922337 0.708556,-2.631781 -0.04724,-0.175452 -0.580342,0.07423 -5.972119,8.199011 -9.08302,12.274899 -7.186787,7.692899 -1.72078,0.681564 -2.982686,-1.545328 0.276675,-2.759997 1.666795,-2.456329 9.946783,-12.652795 5.999112,-7.841359 3.873443,-4.528013 -0.02699,-0.654571 h -0.229437 l -26.419036,17.153815 -4.703466,0.607335 -2.024447,-1.896233 0.249682,-3.1109 0.958238,-1.012224 7.942581,-5.466007 -0.02699,0.02699 z',
275
- },
276
- ],
277
- } satisfies SvgData;
278
-
279
- export const gemini_logo = {
280
- label: 'the Gemini logo',
281
- fill: 'url(#paint0_radial_16771_53212)',
282
- raw: `
283
- <defs>
284
- <radialGradient
285
- id="paint0_radial_16771_53212"
286
- cx="0"
287
- cy="0"
288
- r="1"
289
- gradientUnits="userSpaceOnUse"
290
- gradientTransform="matrix(100.83118,34.096523,-273.13486,807.72196,9.9243877,40.642075)">
291
- <stop offset="0.0671246" stop-color="#9168C0" />
292
- <stop offset="0.342551" stop-color="#5684D1" />
293
- <stop offset="0.672076" stop-color="#1BA1E3" />
294
- </radialGradient>
295
- </defs>
296
- `,
297
- paths: [
298
- {
299
- d: 'm 50.001234,100.00247 c 0,-6.91696 -1.333248,-13.41712 -4.000099,-19.500484 C 43.417856,74.418621 39.875984,69.126705 35.375873,64.626594 30.875762,60.126484 25.583952,56.58461 19.500481,54.001331 13.417009,51.33448 6.9168492,50.001234 0,50.001234 c 6.9168492,0 13.417009,-1.291817 19.500481,-3.875096 6.083471,-2.666852 11.375281,-6.250154 15.875392,-10.750265 4.500111,-4.500111 8.041983,-9.791921 10.625262,-15.875392 C 48.667986,13.417009 50.001234,6.9168492 50.001234,0 c 0,6.9168492 1.291817,13.417009 3.875095,19.500481 2.666852,6.083471 6.250155,11.375281 10.750265,15.875392 4.500111,4.500111 9.792027,8.083413 15.875392,10.750265 6.083364,2.583279 12.583524,3.875096 19.500484,3.875096 -6.91696,0 -13.41712,1.333246 -19.500484,4.000097 -6.083365,2.583279 -11.375281,6.125153 -15.875392,10.625263 -4.50011,4.500111 -8.083413,9.792027 -10.750265,15.875392 -2.583278,6.083364 -3.875095,12.583524 -3.875095,19.500484 z',
300
- },
301
- ],
302
- } satisfies SvgData;
@@ -5,11 +5,20 @@ import {BROWSER} from 'esm-env';
5
5
  import {create_context} from './context_helpers.js';
6
6
  import {load_from_storage, save_to_storage} from './storage.js';
7
7
 
8
+ export interface ThemerJson {
9
+ theme: Theme;
10
+ color_scheme: ColorScheme;
11
+ }
12
+
13
+ export type ThemerOptions = Partial<ThemerJson>;
14
+
8
15
  export class Themer {
9
16
  theme: Theme = $state()!;
10
17
  color_scheme: ColorScheme = $state()!;
11
18
 
12
- constructor(theme: Theme = default_themes[0]!, color_scheme: ColorScheme = 'auto') {
19
+ constructor(options?: ThemerOptions) {
20
+ const theme = options?.theme ?? default_themes[0]!;
21
+ const color_scheme = options?.color_scheme ?? 'auto';
13
22
  if (parse_color_scheme(color_scheme) === null) {
14
23
  throw Error('unknown color scheme: ' + color_scheme);
15
24
  }
@@ -24,12 +33,6 @@ export class Themer {
24
33
  };
25
34
  }
26
35
  }
27
-
28
- export interface ThemerJson {
29
- theme: Theme;
30
- color_scheme: ColorScheme;
31
- }
32
-
33
36
  export const themer_context = create_context<Themer>();
34
37
 
35
38
  export const sync_color_scheme = (color_scheme: ColorScheme | null): void => {
@@ -61,8 +64,8 @@ export const save_theme = (theme: Theme | null, key = THEME_STORAGE_KEY): void =
61
64
  };
62
65
 
63
66
  export const load_theme = (fallback: Theme = default_themes[0]!, key = THEME_STORAGE_KEY): Theme =>
64
- load_from_storage<Theme>(key, true) ?? fallback; // TODO use `parse_theme` from moss
67
+ load_from_storage<Theme>(key, true) ?? fallback; // TODO use `parse_theme` from fuz_css
65
68
 
66
- // TODO move to moss
69
+ // TODO move to fuz_css
67
70
  const parse_color_scheme = (value: unknown): ColorScheme | null =>
68
71
  color_schemes.includes(value as any) ? (value as ColorScheme) : null;
@@ -0,0 +1,189 @@
1
+ import type {Plugin} from 'vite';
2
+ import type {ServerResponse} from 'node:http';
3
+ import {isAbsolute, join} from 'node:path';
4
+ import {readFile} from 'node:fs/promises';
5
+ import type {LibraryJson} from '@fuzdev/fuz_util/library_json.js';
6
+
7
+ export interface VitePluginLibraryWellKnownOptions {
8
+ /**
9
+ * Path to the library.json file (relative to vite.config.ts).
10
+ * @default './src/routes/library.json'
11
+ */
12
+ library_path?: string;
13
+ }
14
+
15
+ interface WellKnownContent {
16
+ package_json: string | null;
17
+ library_json: string | null;
18
+ }
19
+
20
+ const respond_json = (res: ServerResponse, body: string): void => {
21
+ res.setHeader('Content-Type', 'application/json');
22
+ res.setHeader('Cache-Control', 'no-store');
23
+ res.setHeader('Access-Control-Allow-Origin', '*');
24
+ res.end(body);
25
+ };
26
+
27
+ /**
28
+ * Vite plugin that publishes `package.json` and `library.json` to `.well-known/`.
29
+ *
30
+ * Requires a generated library.json file (created by `library_gen` from `gro gen`).
31
+ * The plugin reads this JSON file and publishes its metadata to `.well-known/` for
32
+ * both dev and production builds.
33
+ *
34
+ * Note: This plugin respects SvelteKit's `base` path configuration, so `.well-known/`
35
+ * will be served at `{base}.well-known/` (e.g., `/my-app/.well-known/`). This deviates
36
+ * from RFC 8615 which specifies `.well-known` should be at the domain root. This tradeoff
37
+ * allows the plugin to work correctly when apps are deployed to non-root paths.
38
+ *
39
+ * Note: CORS headers are only set for the dev server. For production, configure
40
+ * CORS at the server level (nginx, Caddy, etc.) if cross-origin access is needed.
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * // vite.config.ts
45
+ * import {defineConfig} from 'vite';
46
+ * import {sveltekit} from '@sveltejs/kit/vite';
47
+ * import {vite_plugin_library_well_known} from '@fuzdev/fuz_ui/vite_plugin_library_well_known.js';
48
+ *
49
+ * export default defineConfig({
50
+ * plugins: [sveltekit(), vite_plugin_library_well_known()],
51
+ * });
52
+ * ```
53
+ */
54
+ export const vite_plugin_library_well_known = (
55
+ options: VitePluginLibraryWellKnownOptions = {},
56
+ ): Plugin => {
57
+ const {library_path = './src/routes/library.json'} = options;
58
+
59
+ const content: WellKnownContent = {
60
+ package_json: null,
61
+ library_json: null,
62
+ };
63
+
64
+ // Set by configResolved
65
+ let root: string;
66
+ let base: string; // e.g., '/' or '/my-app/'
67
+
68
+ // Promise that resolves when library is loaded, used by middleware to avoid race condition
69
+ let ready_promise: Promise<void> | null = null;
70
+
71
+ const load_library = async (): Promise<void> => {
72
+ // Resolve path relative to project root
73
+ const resolved_path = isAbsolute(library_path) ? library_path : join(root, library_path);
74
+
75
+ let json_content: string;
76
+ try {
77
+ json_content = await readFile(resolved_path, 'utf-8');
78
+ } catch (err) {
79
+ throw new Error(
80
+ `vite_plugin_library_well_known: failed to read library.json from "${library_path}"\n` +
81
+ `Resolved to: ${resolved_path}\n` +
82
+ `Make sure you've run \`gro gen\` to generate the library metadata.\n` +
83
+ `Error: ${err}`,
84
+ );
85
+ }
86
+
87
+ let raw: unknown;
88
+ try {
89
+ raw = JSON.parse(json_content);
90
+ } catch (err) {
91
+ throw new Error(
92
+ `vite_plugin_library_well_known: failed to parse library.json from "${library_path}"\n` +
93
+ `Error: ${err}`,
94
+ );
95
+ }
96
+
97
+ // Basic structure validation (file is generated by library_gen)
98
+ if (raw == null || typeof raw !== 'object') {
99
+ throw new Error(
100
+ `vite_plugin_library_well_known: invalid library.json at "${library_path}"\n` +
101
+ `Expected object, got ${typeof raw}`,
102
+ );
103
+ }
104
+ if (!('package_json' in raw) || !('source_json' in raw)) {
105
+ throw new Error(
106
+ `vite_plugin_library_well_known: invalid library.json at "${library_path}"\n` +
107
+ `Expected object with package_json and source_json properties`,
108
+ );
109
+ }
110
+ const library_json = raw as LibraryJson;
111
+
112
+ content.package_json = JSON.stringify(library_json.package_json, null, '\t') + '\n';
113
+ content.library_json = JSON.stringify(library_json, null, '\t') + '\n';
114
+ };
115
+
116
+ return {
117
+ name: 'vite_plugin_library_well_known',
118
+
119
+ configResolved(config) {
120
+ root = config.root;
121
+ base = config.base; // e.g., '/' or '/my-app/'
122
+ },
123
+
124
+ async buildStart() {
125
+ ready_promise = load_library();
126
+ await ready_promise;
127
+ },
128
+
129
+ configureServer(server) {
130
+ // TODO: add HMR support to reload library.json when it changes
131
+ const well_known_prefix = `${base}.well-known/`;
132
+
133
+ server.middlewares.use(async (req, res, next) => {
134
+ if (!req.url) {
135
+ next();
136
+ return;
137
+ }
138
+
139
+ const {pathname} = new URL(req.url, 'http://localhost');
140
+ if (!pathname.startsWith(well_known_prefix)) {
141
+ next();
142
+ return;
143
+ }
144
+
145
+ // Wait for library to load before serving
146
+ try {
147
+ if (!ready_promise) throw new Error('not initialized');
148
+ await ready_promise;
149
+ } catch {
150
+ res.statusCode = 503;
151
+ respond_json(res, JSON.stringify({error: 'Library not ready'}));
152
+ return;
153
+ }
154
+
155
+ const path = pathname.slice(well_known_prefix.length);
156
+
157
+ if (path === 'package.json' && content.package_json) {
158
+ respond_json(res, content.package_json);
159
+ return;
160
+ }
161
+
162
+ if (path === 'library.json' && content.library_json) {
163
+ respond_json(res, content.library_json);
164
+ return;
165
+ }
166
+
167
+ next();
168
+ });
169
+ },
170
+
171
+ generateBundle() {
172
+ if (content.package_json) {
173
+ this.emitFile({
174
+ type: 'asset',
175
+ fileName: '.well-known/package.json',
176
+ source: content.package_json,
177
+ });
178
+ }
179
+
180
+ if (content.library_json) {
181
+ this.emitFile({
182
+ type: 'asset',
183
+ fileName: '.well-known/library.json',
184
+ source: content.library_json,
185
+ });
186
+ }
187
+ },
188
+ };
189
+ };
@@ -1,6 +0,0 @@
1
- <div hidden>
2
- @ryanatkn@hci.social on <a rel="me" href="https://hci.social/@ryanatkn">Mastodon</a>
3
- </div>
4
- <div hidden>
5
- @webdevladder@fosstodon.org on <a rel="me" href="https://fosstodon.org/@webdevladder">Mastodon</a>
6
- </div>