fumapress 0.5.0 → 0.5.1

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 (56) hide show
  1. package/css/generated.css +204 -3
  2. package/dist/adapters/mdx.d.ts +1 -1
  3. package/dist/client.d.ts +0 -1
  4. package/dist/client.js +1 -1
  5. package/dist/components/blog.js +1 -1
  6. package/dist/components/image.d.ts +30 -0
  7. package/dist/components/image.js +143 -0
  8. package/dist/components/provider.d.ts +6 -0
  9. package/dist/components/provider.js +38 -0
  10. package/dist/config.d.ts +73 -30
  11. package/dist/config.js +14 -7
  12. package/dist/image.d.ts +2 -0
  13. package/dist/image.js +2 -0
  14. package/dist/index.d.ts +2 -2
  15. package/dist/layouts/blog.d.ts +1 -1
  16. package/dist/layouts/blog.index.js +1 -1
  17. package/dist/layouts/blog.js +1 -1
  18. package/dist/layouts/docs.d.ts +2 -2
  19. package/dist/layouts/home.d.ts +1 -1
  20. package/dist/layouts/notebook.d.ts +2 -2
  21. package/dist/layouts/root.d.ts +5 -3
  22. package/dist/layouts/root.js +13 -16
  23. package/dist/layouts/switch.d.ts +2 -2
  24. package/dist/lib/pathname.js +14 -0
  25. package/dist/lib/shared.d.ts +10 -15
  26. package/dist/lib/shared.js +68 -33
  27. package/dist/lib/types.d.ts +25 -14
  28. package/dist/node_modules/.pnpm/http-cache-semantics@4.2.0/node_modules/http-cache-semantics/index.js +596 -0
  29. package/dist/plugins/blog.d.ts +3 -6
  30. package/dist/plugins/blog.js +6 -6
  31. package/dist/plugins/flexsearch.d.ts +1 -1
  32. package/dist/plugins/image/self-hosted.client.js +40 -0
  33. package/dist/plugins/image/self-hosted.d.ts +29 -0
  34. package/dist/plugins/image/self-hosted.js +30 -0
  35. package/dist/plugins/image/self-hosted.utils.js +270 -0
  36. package/dist/plugins/image/vercel.client.js +34 -0
  37. package/dist/plugins/image/vercel.d.ts +39 -0
  38. package/dist/plugins/image/vercel.enhancer.d.ts +10 -0
  39. package/dist/plugins/image/vercel.enhancer.js +16 -0
  40. package/dist/plugins/image/vercel.js +30 -0
  41. package/dist/plugins/image/vercel.utils.d.ts +10 -0
  42. package/dist/plugins/image/vercel.utils.js +30 -0
  43. package/dist/plugins/llms.txt.d.ts +1 -1
  44. package/dist/plugins/llms.txt.js +1 -1
  45. package/dist/plugins/openapi.d.ts +2 -0
  46. package/dist/plugins/openapi.js +8 -1
  47. package/dist/plugins/orama-search.d.ts +1 -1
  48. package/dist/plugins/takumi.d.ts +1 -1
  49. package/dist/plugins/takumi.js +1 -1
  50. package/dist/router/fs.js +1 -1
  51. package/dist/router/index.d.ts +17 -0
  52. package/dist/{router.js → router/index.js} +31 -11
  53. package/dist/vite.js +9 -9
  54. package/package.json +22 -9
  55. package/dist/lib/join-pathname.js +0 -9
  56. package/dist/router.d.ts +0 -15
package/css/generated.css CHANGED
@@ -1,21 +1,47 @@
1
+ @source inline("!ctx");
2
+ @source inline("!sizes");
1
3
  @source inline("---spacing");
2
4
  @source inline("-translate-x-1/2");
5
+ @source inline("@default");
3
6
  @source inline("@orama/orama");
4
7
  @source inline("a");
8
+ @source inline("above");
5
9
  @source inline("absolutePath");
10
+ @source inline("accepts");
6
11
  @source inline("active:scale-95");
12
+ @source inline("actually");
13
+ @source inline("all");
14
+ @source inline("allSizes");
7
15
  @source inline("allTags");
16
+ @source inline("allowed");
17
+ @source inline("allows");
18
+ @source inline("and");
19
+ @source inline("and/or");
20
+ @source inline("any");
21
+ @source inline("app");
22
+ @source inline("are");
8
23
  @source inline("as");
24
+ @source inline("associated");
25
+ @source inline("assumes");
9
26
  @source inline("async");
27
+ @source inline("attribute");
28
+ @source inline("attributes");
10
29
  @source inline("await");
11
30
  @source inline("backToHome");
12
31
  @source inline("backdrop-blur-sm");
32
+ @source inline("base");
33
+ @source inline("basePathname");
34
+ @source inline("be");
35
+ @source inline("because");
36
+ @source inline("before");
37
+ @source inline("between");
13
38
  @source inline("bg-fd-card");
14
39
  @source inline("bg-fd-primary");
15
40
  @source inline("bg-fd-primary/10");
16
41
  @source inline("bg-fd-secondary/80");
17
42
  @source inline("blog");
18
43
  @source inline("blogPosts");
44
+ @source inline("blue");
19
45
  @source inline("body");
20
46
  @source inline("border");
21
47
  @source inline("border-2");
@@ -24,18 +50,34 @@
24
50
  @source inline("border-fd-primary");
25
51
  @source inline("border-y");
26
52
  @source inline("bottom-2");
53
+ @source inline("browsers");
54
+ @source inline("bug");
55
+ @source inline("buildImageUrl");
56
+ @source inline("but");
27
57
  @source inline("buttonVariants");
58
+ @source inline("by");
28
59
  @source inline("can");
60
+ @source inline("canOptimize");
61
+ @source inline("cannot");
62
+ @source inline("cases");
63
+ @source inline("cause");
64
+ @source inline("causes");
65
+ @source inline("check");
29
66
  @source inline("children");
30
67
  @source inline("class-variance-authority");
31
68
  @source inline("className");
32
69
  @source inline("client");
33
70
  @source inline("cn");
71
+ @source inline("component");
34
72
  @source inline("components");
73
+ @source inline("conditions");
35
74
  @source inline("config");
36
75
  @source inline("const");
37
76
  @source inline("content");
38
77
  @source inline("copied");
78
+ @source inline("copies");
79
+ @source inline("copy");
80
+ @source inline("copyright");
39
81
  @source inline("core:docs-layout");
40
82
  @source inline("core:home-layout");
41
83
  @source inline("core:notebook-layout");
@@ -57,7 +99,7 @@
57
99
  @source inline("createNotebookLayoutPage");
58
100
  @source inline("createRootLayout");
59
101
  @source inline("creationDate");
60
- @source inline("cssUrl");
102
+ @source inline("crossOrigin");
61
103
  @source inline("ctx");
62
104
  @source inline("current");
63
105
  @source inline("currentDate");
@@ -66,23 +108,38 @@
66
108
  @source inline("data-fd-home-layout-container");
67
109
  @source inline("data-version");
68
110
  @source inline("date");
111
+ @source inline("deal");
69
112
  @source inline("decoded");
70
113
  @source inline("decoration-fd-primary");
71
114
  @source inline("default");
115
+ @source inline("defaultQuality");
116
+ @source inline("defaultWidth");
72
117
  @source inline("defined");
118
+ @source inline("detail");
73
119
  @source inline("detect");
74
120
  @source inline("detector");
121
+ @source inline("deviceSizes");
75
122
  @source inline("do");
123
+ @source inline("documentation");
76
124
  @source inline("duration-150");
125
+ @source inline("eager");
126
+ @source inline("edge");
77
127
  @source inline("else");
78
128
  @source inline("empty");
79
129
  @source inline("empty:hidden");
80
130
  @source inline("en");
81
131
  @source inline("english");
132
+ @source inline("even");
133
+ @source inline("except");
82
134
  @source inline("export");
83
135
  @source inline("extends");
136
+ @source inline("eye");
84
137
  @source inline("false");
138
+ @source inline("fetch");
139
+ @source inline("fetchPriority");
140
+ @source inline("files");
85
141
  @source inline("find");
142
+ @source inline("first");
86
143
  @source inline("fixed");
87
144
  @source inline("flex");
88
145
  @source inline("flex-1");
@@ -90,47 +147,76 @@
90
147
  @source inline("flex-row");
91
148
  @source inline("flex-wrap");
92
149
  @source inline("flexsearchStaticClient");
150
+ @source inline("following");
93
151
  @source inline("font-medium");
94
152
  @source inline("font-mono");
95
153
  @source inline("font-semibold");
96
154
  @source inline("for");
155
+ @source inline("framework");
156
+ @source inline("free");
97
157
  @source inline("from");
158
+ @source inline("full");
159
+ @source inline("fumadocs-core/framework");
98
160
  @source inline("fumadocs-core/i18n");
99
161
  @source inline("fumadocs-core/source");
100
162
  @source inline("fumadocs-core/toc");
101
163
  @source inline("fumadocs-ui/i18n");
102
164
  @source inline("fumapress");
103
165
  @source inline("function");
166
+ @source inline("furnished");
104
167
  @source inline("gap-1");
105
168
  @source inline("gap-2");
106
169
  @source inline("gap-4");
170
+ @source inline("generate");
171
+ @source inline("generatedProps");
107
172
  @source inline("getBlogContext");
108
173
  @source inline("getLayoutProps");
109
174
  @source inline("getPressContext");
110
175
  @source inline("getTags");
111
176
  @source inline("ghost");
112
177
  @source inline("githubUrl");
178
+ @source inline("given");
179
+ @source inline("green");
113
180
  @source inline("grid");
114
181
  @source inline("grid-cols-1");
115
182
  @source inline("grid-cols-2");
116
183
  @source inline("groupTags");
117
184
  @source inline("grouped");
118
185
  @source inline("h-12");
186
+ @source inline("height");
187
+ @source inline("hereby");
188
+ @source inline("high");
119
189
  @source inline("hook");
120
190
  @source inline("hooks");
191
+ @source inline("hostname");
121
192
  @source inline("hover:bg-fd-accent");
122
193
  @source inline("hover:text-fd-accent-foreground");
194
+ @source inline("how");
123
195
  @source inline("href");
196
+ @source inline("html");
197
+ @source inline("human");
198
+ @source inline("i");
124
199
  @source inline("i18n");
125
200
  @source inline("i18nProvider");
126
201
  @source inline("if");
202
+ @source inline("image");
203
+ @source inline("imageSizes");
204
+ @source inline("imageSrcSet");
205
+ @source inline("images");
206
+ @source inline("imagesrcset");
207
+ @source inline("immediately");
127
208
  @source inline("import");
128
209
  @source inline("in");
210
+ @source inline("included");
211
+ @source inline("including");
212
+ @source inline("incorrect");
129
213
  @source inline("indexPath");
130
214
  @source inline("inherit");
131
215
  @source inline("inheritLayoutProps");
132
216
  @source inline("inherited");
133
217
  @source inline("inline-flex");
218
+ @source inline("integer");
219
+ @source inline("intended");
134
220
  @source inline("interface");
135
221
  @source inline("is");
136
222
  @source inline("isBlog");
@@ -141,11 +227,15 @@
141
227
  @source inline("items-center");
142
228
  @source inline("items-start");
143
229
  @source inline("joinPathname");
230
+ @source inline("js");
231
+ @source inline("keep");
144
232
  @source inline("key");
145
233
  @source inline("keyof");
234
+ @source inline("kind");
146
235
  @source inline("label");
147
236
  @source inline("lang");
148
237
  @source inline("language");
238
+ @source inline("last");
149
239
  @source inline("lastModified");
150
240
  @source inline("layout");
151
241
  @source inline("layoutData");
@@ -154,9 +244,13 @@
154
244
  @source inline("left-1/2");
155
245
  @source inline("length");
156
246
  @source inline("let");
157
- @source inline("loaderConfig");
247
+ @source inline("level");
248
+ @source inline("like");
249
+ @source inline("limitation");
250
+ @source inline("loading");
158
251
  @source inline("locale");
159
252
  @source inline("lucide-react");
253
+ @source inline("magnifying");
160
254
  @source inline("markdownUrl");
161
255
  @source inline("matchingBlogPosts");
162
256
  @source inline("max-h-[min(600px,calc(100vh---spacing(30)))]");
@@ -168,15 +262,30 @@
168
262
  @source inline("md:grid-cols-3");
169
263
  @source inline("md:grid-cols-4");
170
264
  @source inline("md:p-8");
265
+ @source inline("means");
171
266
  @source inline("min-h-screen");
172
267
  @source inline("min-w-0");
268
+ @source inline("minIndex");
269
+ @source inline("minRatio");
270
+ @source inline("minSize");
271
+ @source inline("more");
272
+ @source inline("most");
173
273
  @source inline("ms-auto");
174
274
  @source inline("mt-4");
175
275
  @source inline("mt-6");
176
276
  @source inline("mt-auto");
277
+ @source inline("multiple");
177
278
  @source inline("mx-auto");
279
+ @source inline("name");
178
280
  @source inline("new");
281
+ @source inline("normal");
282
+ @source inline("not");
283
+ @source inline("notice");
284
+ @source inline("number");
285
+ @source inline("object");
286
+ @source inline("obtaining");
179
287
  @source inline("of");
288
+ @source inline("omit");
180
289
  @source inline("on");
181
290
  @source inline("onClick");
182
291
  @source inline("onCopy");
@@ -184,26 +293,48 @@
184
293
  @source inline("onSearchChange");
185
294
  @source inline("only");
186
295
  @source inline("open");
296
+ @source inline("optimized");
187
297
  @source inline("option");
188
298
  @source inline("options");
299
+ @source inline("or");
189
300
  @source inline("orderedPosts");
190
301
  @source inline("outer");
191
302
  @source inline("overline");
303
+ @source inline("p");
192
304
  @source inline("p-1");
193
305
  @source inline("p-4");
194
306
  @source inline("page");
195
307
  @source inline("pageProps");
196
308
  @source inline("panelButtonVariants");
309
+ @source inline("params");
310
+ @source inline("parsed");
311
+ @source inline("path");
312
+ @source inline("pathname");
197
313
  @source inline("payload");
198
314
  @source inline("pb-6");
315
+ @source inline("percent");
316
+ @source inline("percentSizes");
317
+ @source inline("permission");
318
+ @source inline("permit");
319
+ @source inline("person");
320
+ @source inline("persons");
321
+ @source inline("portions");
199
322
  @source inline("posts");
323
+ @source inline("potentially");
324
+ @source inline("preload");
325
+ @source inline("preloadElement");
326
+ @source inline("preloadOptions");
200
327
  @source inline("primary");
328
+ @source inline("production");
329
+ @source inline("prop");
201
330
  @source inline("props");
202
331
  @source inline("prose");
332
+ @source inline("provider");
203
333
  @source inline("providerProps");
204
334
  @source inline("pt-2");
205
335
  @source inline("pt-3.5");
206
336
  @source inline("pt-4");
337
+ @source inline("push");
207
338
  @source inline("px-1.5");
208
339
  @source inline("px-2");
209
340
  @source inline("px-3");
@@ -212,47 +343,86 @@
212
343
  @source inline("py-1");
213
344
  @source inline("py-2");
214
345
  @source inline("py-6");
346
+ @source inline("quality");
215
347
  @source inline("query");
216
348
  @source inline("r");
217
349
  @source inline("react");
350
+ @source inline("react-dom");
351
+ @source inline("received");
352
+ @source inline("red");
353
+ @source inline("reference");
354
+ @source inline("referrerPolicy");
355
+ @source inline("refresh");
218
356
  @source inline("rel");
357
+ @source inline("relative");
358
+ @source inline("relevant");
219
359
  @source inline("render");
220
360
  @source inline("renderCtx");
221
361
  @source inline("renderRootMeta");
222
362
  @source inline("replacements");
363
+ @source inline("reproduced");
364
+ @source inline("requests");
365
+ @source inline("resolution");
366
+ @source inline("resolve");
223
367
  @source inline("resolved");
368
+ @source inline("rest");
224
369
  @source inline("result");
225
370
  @source inline("return");
371
+ @source inline("rights");
226
372
  @source inline("root");
227
373
  @source inline("rotate-180");
228
374
  @source inline("rounded-2xl");
229
375
  @source inline("rounded-lg");
230
376
  @source inline("rounded-xl");
377
+ @source inline("router");
378
+ @source inline("run");
379
+ @source inline("s");
380
+ @source inline("satisfies");
381
+ @source inline("say");
231
382
  @source inline("schema");
232
383
  @source inline("schemaId");
384
+ @source inline("screens");
233
385
  @source inline("search");
386
+ @source inline("see");
387
+ @source inline("sell");
234
388
  @source inline("server");
235
389
  @source inline("setOpen");
236
390
  @source inline("shadow-inner");
237
391
  @source inline("shadow-md");
238
392
  @source inline("shadow-sm");
393
+ @source inline("shall");
239
394
  @source inline("shrink-0");
395
+ @source inline("significantly");
240
396
  @source inline("size-3.5");
241
397
  @source inline("size-4");
242
398
  @source inline("size-6");
399
+ @source inline("sizes");
243
400
  @source inline("sm:border");
244
401
  @source inline("sm:bottom-4");
245
402
  @source inline("sm:grid-cols-3");
246
403
  @source inline("sm:max-w-[400px]");
247
404
  @source inline("sm:rounded-xl");
248
405
  @source inline("so");
406
+ @source inline("software");
407
+ @source inline("something");
249
408
  @source inline("source");
409
+ @source inline("specified");
250
410
  @source inline("specify");
411
+ @source inline("src");
412
+ @source inline("srcSet");
413
+ @source inline("srcset");
414
+ @source inline("start");
251
415
  @source inline("static");
252
416
  @source inline("string");
253
417
  @source inline("styleTag");
254
- @source inline("styles");
418
+ @source inline("stylesHref");
419
+ @source inline("stylesInline");
255
420
  @source inline("stylesheet");
421
+ @source inline("subject");
422
+ @source inline("subset");
423
+ @source inline("substantial");
424
+ @source inline("support");
425
+ @source inline("supported");
256
426
  @source inline("sure");
257
427
  @source inline("swap");
258
428
  @source inline("t");
@@ -261,6 +431,7 @@
261
431
  @source inline("tags");
262
432
  @source inline("tagsInTotal");
263
433
  @source inline("tagsPath");
434
+ @source inline("takes");
264
435
  @source inline("text");
265
436
  @source inline("text-2xl");
266
437
  @source inline("text-3xl");
@@ -270,12 +441,17 @@
270
441
  @source inline("text-fd-primary-foreground");
271
442
  @source inline("text-sm");
272
443
  @source inline("text-xs");
444
+ @source inline("that");
273
445
  @source inline("the");
446
+ @source inline("they");
274
447
  @source inline("this");
448
+ @source inline("those");
449
+ @source inline("though");
275
450
  @source inline("throw");
276
451
  @source inline("title");
277
452
  @source inline("to");
278
453
  @source inline("toc");
454
+ @source inline("took");
279
455
  @source inline("transition-all");
280
456
  @source inline("transition-colors");
281
457
  @source inline("transition-transform");
@@ -286,22 +462,47 @@
286
462
  @source inline("truncate");
287
463
  @source inline("type");
288
464
  @source inline("typeof");
465
+ @source inline("undefined");
466
+ @source inline("unnecessary");
467
+ @source inline("unoptimized");
289
468
  @source inline("unstable_notFound");
469
+ @source inline("updated");
470
+ @source inline("updates");
290
471
  @source inline("url");
291
472
  @source inline("use");
292
473
  @source inline("useCopyButton");
293
474
  @source inline("useDocsSearch");
294
475
  @source inline("useI18n");
295
476
  @source inline("useMemo");
477
+ @source inline("useRouter");
296
478
  @source inline("useState");
297
479
  @source inline("useTOCItems");
298
480
  @source inline("useTranslations");
299
481
  @source inline("useTranslationsBase");
482
+ @source inline("used");
483
+ @source inline("v");
484
+ @source inline("valid");
300
485
  @source inline("value");
486
+ @source inline("values");
301
487
  @source inline("variant");
488
+ @source inline("viewport");
489
+ @source inline("viewportWidthRe");
490
+ @source inline("visually");
491
+ @source inline("vs");
492
+ @source inline("vw");
493
+ @source inline("w");
302
494
  @source inline("w-full");
303
495
  @source inline("waku");
496
+ @source inline("wasteful");
497
+ @source inline("we");
498
+ @source inline("whom");
499
+ @source inline("width");
500
+ @source inline("widths");
501
+ @source inline("will");
502
+ @source inline("without");
503
+ @source inline("would");
304
504
  @source inline("wrapper");
505
+ @source inline("x");
305
506
  @source inline("xl:grid-cols-4");
306
507
  @source inline("xl:grid-cols-6");
307
508
  @source inline("you");
@@ -5,7 +5,7 @@ import { MDXComponents } from "mdx/types";
5
5
 
6
6
  //#region src/adapters/mdx.d.ts
7
7
  interface MdxAdapterOptions<C extends ConfigContext = ConfigContext> {
8
- getMdxComponents?: (this: AppContext<C>, page: C["loaderConfig"]["page"]) => Awaitable<MDXComponents>;
8
+ getMdxComponents?: (this: AppContext<C>, page: C["page"]) => Awaitable<MDXComponents>;
9
9
  }
10
10
  declare function fumadocsMdx<C extends ConfigContext = ConfigContext>(options?: MdxAdapterOptions<C>): Adapter<C>;
11
11
  //#endregion
package/dist/client.d.ts CHANGED
@@ -16,7 +16,6 @@ interface LinkProps extends ComponentProps<"a"> {
16
16
  unstable_prefetchOnEnter?: boolean;
17
17
  unstable_prefetchOnView?: boolean;
18
18
  unstable_startTransition?: ((fn: TransitionFunction) => void) | undefined;
19
- href: string;
20
19
  }
21
20
  interface Router {
22
21
  push: (to: string, options?: {
package/dist/client.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import { Link as Link$1, useRouter as useRouter$1 } from "waku/router/client";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  //#region src/client.tsx
5
- function Link({ href, children, ...props }) {
5
+ function Link({ href = "#", children, ...props }) {
6
6
  return /* @__PURE__ */ jsx(Link$1, {
7
7
  to: href,
8
8
  ...props,
@@ -1,7 +1,7 @@
1
1
  import { getCreationDate, getPressContext } from "../lib/shared.js";
2
2
  import { cn } from "../lib/cn.js";
3
3
  import { I18nLabel } from "./i18n.js";
4
- import { joinPathname } from "../lib/join-pathname.js";
4
+ import { joinPathname } from "../lib/pathname.js";
5
5
  import { getBlogContext } from "../plugins/blog.js";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  import { Link } from "waku";
@@ -0,0 +1,30 @@
1
+ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import { ImgHTMLAttributes, ReactNode } from "react";
3
+
4
+ //#region src/components/image.d.ts
5
+ interface StaticImageData {
6
+ src: string;
7
+ width: number;
8
+ height: number;
9
+ }
10
+ interface ImageProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, "src"> {
11
+ src?: string | StaticImageData;
12
+ /** a value between 1-100, the quality of optimized image */
13
+ quality?: number;
14
+ /** Act like a normal `<img>` tag, default to `false` except for SVG images */
15
+ unoptimized?: boolean;
16
+ /** Preload the image @default true */
17
+ preload?: boolean;
18
+ }
19
+ declare function Image({
20
+ src: _src,
21
+ width: _width,
22
+ height: _height,
23
+ sizes,
24
+ quality,
25
+ unoptimized,
26
+ preload,
27
+ ...rest
28
+ }: ImageProps): _$react_jsx_runtime0.JSX.Element;
29
+ //#endregion
30
+ export { Image, ImageProps, StaticImageData };
@@ -0,0 +1,143 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { createContext, use, useMemo } from "react";
4
+ import ReactDOM from "react-dom";
5
+ import { useRouter } from "waku";
6
+ //#region src/components/image.tsx
7
+ function parseLength(v) {
8
+ if (typeof v !== "string") return v;
9
+ const parsed = parseInt(v, 10);
10
+ if (Number.isNaN(parsed)) throw new Error(`[Fumapress] <Image /> only accepts integer values of width/height, received: "${v}"`);
11
+ return parsed;
12
+ }
13
+ /**
14
+ * resolve src to a full pathname if relative
15
+ */
16
+ function normalizeSrc(src, basePathname) {
17
+ if (src.startsWith("http://") || src.startsWith("https://")) return src;
18
+ const base = new URL(basePathname, "http://localhost");
19
+ const resolved = new URL(src, base);
20
+ if (resolved.hostname !== base.hostname) throw new Error(`The src attribute "${src}" is not a valid relative path`);
21
+ return resolved.pathname;
22
+ }
23
+ const ImageContext = createContext(null);
24
+ function ImageProvider({ provider, children }) {
25
+ return /* @__PURE__ */ jsx(ImageContext, {
26
+ value: useMemo(() => ({ provider }), [provider]),
27
+ children
28
+ });
29
+ }
30
+ /** generate widths (ascending order) */
31
+ function getWidths(provider, width, sizes) {
32
+ if (sizes) {
33
+ const allSizes = provider.sizes ?? provider.deviceSizes;
34
+ const viewportWidthRe = /(^|\s)(1?\d?\d)vw/g;
35
+ const percentSizes = [];
36
+ for (let match; match = viewportWidthRe.exec(sizes);) percentSizes.push(parseInt(match[2]));
37
+ if (percentSizes.length !== 0) {
38
+ const minRatio = Math.min(...percentSizes) * .01;
39
+ const minSize = provider.deviceSizes[0] * minRatio;
40
+ const minIndex = allSizes.findLastIndex((s) => s < minSize);
41
+ return {
42
+ widths: minIndex === -1 ? allSizes : allSizes.slice(minIndex + 1),
43
+ kind: "w"
44
+ };
45
+ }
46
+ return {
47
+ widths: allSizes,
48
+ kind: "w"
49
+ };
50
+ }
51
+ if (typeof width !== "number") return {
52
+ widths: provider.deviceSizes,
53
+ kind: "w"
54
+ };
55
+ if (provider.sizes) {
56
+ const widths = /* @__PURE__ */ new Set();
57
+ const sizes = provider.sizes;
58
+ const defaultWidth = sizes.at(-1);
59
+ widths.add(sizes.find((p) => p >= width) ?? defaultWidth);
60
+ widths.add(sizes.find((p) => p >= width * 2) ?? defaultWidth);
61
+ return {
62
+ widths: Array.from(widths),
63
+ kind: "x"
64
+ };
65
+ }
66
+ return {
67
+ widths: [width, width * 2],
68
+ kind: "x"
69
+ };
70
+ }
71
+ function generateImageAttributes(provider, src, quality = provider.defaultQuality, width, sizes) {
72
+ const { widths, kind } = getWidths(provider, width, sizes);
73
+ return {
74
+ sizes: !sizes && kind === "w" ? "100vw" : sizes,
75
+ srcSet: widths.map((w, i) => `${provider.buildImageUrl({
76
+ src,
77
+ width: w,
78
+ quality
79
+ })} ${kind === "w" ? w : i + 1}${kind}`).join(", "),
80
+ src: provider.buildImageUrl({
81
+ src,
82
+ width: widths.at(-1),
83
+ quality
84
+ })
85
+ };
86
+ }
87
+ function Image({ src: _src, width: _width, height: _height, sizes, quality, unoptimized = false, preload = true, ...rest }) {
88
+ const ctx = use(ImageContext);
89
+ const pathname = useRouter().path;
90
+ const { src, width, height } = useMemo(() => {
91
+ if (typeof _src === "object") return {
92
+ src: normalizeSrc(_src.src, pathname),
93
+ width: parseLength(_width ?? _src.width),
94
+ height: parseLength(_height ?? _src.height)
95
+ };
96
+ return {
97
+ src: _src ? normalizeSrc(_src, pathname) : void 0,
98
+ width: parseLength(_width),
99
+ height: parseLength(_height)
100
+ };
101
+ }, [
102
+ _src,
103
+ _width,
104
+ _height,
105
+ pathname
106
+ ]);
107
+ if (src && ctx?.provider.canOptimize && !ctx.provider.canOptimize(src)) unoptimized = true;
108
+ if (!src || !ctx || unoptimized) return /* @__PURE__ */ jsx("img", {
109
+ ...rest,
110
+ width,
111
+ height,
112
+ sizes,
113
+ src
114
+ });
115
+ const { provider } = ctx;
116
+ provider.validate?.(src);
117
+ const generatedProps = generateImageAttributes(provider, src, quality, width, sizes);
118
+ let preloadElement;
119
+ if (preload) {
120
+ const preloadOptions = {
121
+ as: "image",
122
+ imageSrcSet: generatedProps.srcSet,
123
+ imageSizes: generatedProps.sizes,
124
+ crossOrigin: rest.crossOrigin,
125
+ referrerPolicy: rest.referrerPolicy,
126
+ fetchPriority: rest.fetchPriority
127
+ };
128
+ if (ReactDOM.preload) ReactDOM.preload(generatedProps.src, preloadOptions);
129
+ else preloadElement = /* @__PURE__ */ jsx("link", {
130
+ rel: "preload",
131
+ href: generatedProps.srcSet ? void 0 : generatedProps.src,
132
+ ...preloadOptions
133
+ }, "press-img-" + generatedProps.src + generatedProps.srcSet + generatedProps.sizes);
134
+ }
135
+ return /* @__PURE__ */ jsxs(Fragment, { children: [preloadElement, /* @__PURE__ */ jsx("img", {
136
+ ...rest,
137
+ width,
138
+ height,
139
+ ...generatedProps
140
+ })] });
141
+ }
142
+ //#endregion
143
+ export { Image, ImageProvider };
@@ -0,0 +1,6 @@
1
+ import { RootProviderProps } from "fumadocs-ui/provider/base";
2
+
3
+ //#region src/components/provider.d.ts
4
+ type PressProviderProps = RootProviderProps;
5
+ //#endregion
6
+ export { PressProviderProps };