fumadocs-ui 16.1.0 → 16.2.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 (139) hide show
  1. package/css/black.css +1 -1
  2. package/css/catppuccin.css +1 -1
  3. package/css/colors/index.css +51 -0
  4. package/css/dusk.css +1 -1
  5. package/css/layouts/docs.css +1 -0
  6. package/css/layouts/home.css +1 -0
  7. package/css/layouts/notebook.css +1 -0
  8. package/css/neutral.css +1 -40
  9. package/css/ocean.css +1 -1
  10. package/css/preset.css +21 -28
  11. package/css/purple.css +1 -1
  12. package/css/shadcn.css +5 -1
  13. package/css/shiki.css +1 -3
  14. package/css/solar.css +48 -21
  15. package/css/vitepress.css +1 -1
  16. package/dist/components/image-zoom.d.ts +3 -3
  17. package/dist/components/image-zoom.d.ts.map +1 -1
  18. package/dist/components/image-zoom.js +1 -1
  19. package/dist/components/sidebar/base.d.ts +64 -0
  20. package/dist/components/sidebar/base.d.ts.map +1 -0
  21. package/dist/components/sidebar/base.js +178 -0
  22. package/dist/components/sidebar/link-item.d.ts +11 -0
  23. package/dist/components/sidebar/link-item.d.ts.map +1 -0
  24. package/dist/components/sidebar/link-item.js +13 -0
  25. package/dist/components/sidebar/page-tree.d.ts +19 -0
  26. package/dist/components/sidebar/page-tree.d.ts.map +1 -0
  27. package/dist/components/sidebar/page-tree.js +34 -0
  28. package/dist/components/{layout/root-toggle.d.ts → sidebar/tabs.d.ts} +4 -4
  29. package/dist/components/sidebar/tabs.d.ts.map +1 -0
  30. package/dist/components/{layout/root-toggle.js → sidebar/tabs.js} +3 -3
  31. package/dist/components/tabs.unstyled.d.ts +0 -3
  32. package/dist/components/tabs.unstyled.d.ts.map +1 -1
  33. package/dist/components/tabs.unstyled.js +23 -32
  34. package/dist/components/toc/clerk.d.ts +3 -0
  35. package/dist/components/toc/clerk.d.ts.map +1 -0
  36. package/dist/components/{layout/toc-clerk.js → toc/clerk.js} +5 -6
  37. package/dist/components/toc/default.d.ts +3 -0
  38. package/dist/components/toc/default.d.ts.map +1 -0
  39. package/dist/components/{layout/toc.js → toc/default.js} +5 -16
  40. package/dist/components/{layout/toc.d.ts → toc/index.d.ts} +7 -3
  41. package/dist/components/toc/index.d.ts.map +1 -0
  42. package/dist/components/{layout/toc-thumb.js → toc/index.js} +17 -3
  43. package/dist/contexts/search.js +1 -1
  44. package/dist/contexts/tree.d.ts +1 -1
  45. package/dist/contexts/tree.d.ts.map +1 -1
  46. package/dist/contexts/tree.js +3 -3
  47. package/dist/layouts/docs/client.d.ts +12 -6
  48. package/dist/layouts/docs/client.d.ts.map +1 -1
  49. package/dist/layouts/docs/client.js +26 -31
  50. package/dist/layouts/docs/index.d.ts +9 -9
  51. package/dist/layouts/docs/index.d.ts.map +1 -1
  52. package/dist/layouts/docs/index.js +37 -48
  53. package/dist/layouts/docs/{page-client.d.ts → page/client.d.ts} +3 -4
  54. package/dist/layouts/docs/page/client.d.ts.map +1 -0
  55. package/dist/layouts/docs/{page-client.js → page/client.js} +39 -76
  56. package/dist/layouts/docs/page/index.d.ts +58 -0
  57. package/dist/layouts/docs/page/index.d.ts.map +1 -0
  58. package/dist/layouts/docs/page/index.js +51 -0
  59. package/dist/layouts/docs/sidebar.d.ts +17 -0
  60. package/dist/layouts/docs/sidebar.d.ts.map +1 -0
  61. package/dist/layouts/docs/sidebar.js +93 -0
  62. package/dist/layouts/home/client.d.ts +2 -20
  63. package/dist/layouts/home/client.d.ts.map +1 -1
  64. package/dist/layouts/home/client.js +54 -17
  65. package/dist/layouts/home/index.d.ts +2 -3
  66. package/dist/layouts/home/index.d.ts.map +1 -1
  67. package/dist/layouts/home/index.js +3 -35
  68. package/dist/layouts/notebook/client.d.ts +20 -8
  69. package/dist/layouts/notebook/client.d.ts.map +1 -1
  70. package/dist/layouts/notebook/client.js +57 -33
  71. package/dist/layouts/notebook/index.d.ts +9 -9
  72. package/dist/layouts/notebook/index.d.ts.map +1 -1
  73. package/dist/layouts/notebook/index.js +47 -70
  74. package/dist/layouts/notebook/page/client.d.ts +24 -0
  75. package/dist/layouts/notebook/page/client.d.ts.map +1 -0
  76. package/dist/layouts/notebook/page/client.js +119 -0
  77. package/dist/layouts/notebook/page/index.d.ts +58 -0
  78. package/dist/layouts/notebook/page/index.d.ts.map +1 -0
  79. package/dist/layouts/notebook/page/index.js +51 -0
  80. package/dist/layouts/notebook/sidebar.d.ts +17 -0
  81. package/dist/layouts/notebook/sidebar.d.ts.map +1 -0
  82. package/dist/layouts/notebook/sidebar.js +90 -0
  83. package/dist/layouts/shared/index.d.ts +12 -78
  84. package/dist/layouts/shared/index.d.ts.map +1 -1
  85. package/dist/layouts/shared/index.js +11 -15
  86. package/dist/layouts/shared/language-toggle.d.ts +5 -0
  87. package/dist/layouts/shared/language-toggle.d.ts.map +1 -0
  88. package/dist/layouts/shared/link-item.d.ts +78 -0
  89. package/dist/layouts/shared/link-item.d.ts.map +1 -0
  90. package/dist/layouts/shared/{client.js → link-item.js} +1 -1
  91. package/dist/layouts/shared/search-toggle.d.ts.map +1 -0
  92. package/dist/{components/layout → layouts/shared}/theme-toggle.d.ts +2 -2
  93. package/dist/layouts/shared/theme-toggle.d.ts.map +1 -0
  94. package/dist/{components/layout → layouts/shared}/theme-toggle.js +3 -3
  95. package/dist/page.d.ts +6 -59
  96. package/dist/page.d.ts.map +1 -1
  97. package/dist/page.js +16 -50
  98. package/dist/provider/base.d.ts.map +1 -1
  99. package/dist/provider/base.js +2 -3
  100. package/dist/style.css +221 -211
  101. package/dist/utils/use-footer-items.d.ts +6 -0
  102. package/dist/utils/use-footer-items.d.ts.map +1 -0
  103. package/dist/utils/use-footer-items.js +27 -0
  104. package/dist/utils/use-is-scroll-top.d.ts +4 -0
  105. package/dist/utils/use-is-scroll-top.d.ts.map +1 -0
  106. package/dist/utils/use-is-scroll-top.js +17 -0
  107. package/package.json +11 -24
  108. package/css/default.css +0 -34
  109. package/dist/components/layout/language-toggle.d.ts +0 -5
  110. package/dist/components/layout/language-toggle.d.ts.map +0 -1
  111. package/dist/components/layout/root-toggle.d.ts.map +0 -1
  112. package/dist/components/layout/search-toggle.d.ts.map +0 -1
  113. package/dist/components/layout/sidebar.d.ts +0 -66
  114. package/dist/components/layout/sidebar.d.ts.map +0 -1
  115. package/dist/components/layout/sidebar.js +0 -200
  116. package/dist/components/layout/theme-toggle.d.ts.map +0 -1
  117. package/dist/components/layout/toc-clerk.d.ts +0 -3
  118. package/dist/components/layout/toc-clerk.d.ts.map +0 -1
  119. package/dist/components/layout/toc-thumb.d.ts +0 -7
  120. package/dist/components/layout/toc-thumb.d.ts.map +0 -1
  121. package/dist/components/layout/toc.d.ts.map +0 -1
  122. package/dist/contexts/layout.d.ts +0 -28
  123. package/dist/contexts/layout.d.ts.map +0 -1
  124. package/dist/contexts/layout.js +0 -38
  125. package/dist/contexts/sidebar.d.ts +0 -18
  126. package/dist/contexts/sidebar.d.ts.map +0 -1
  127. package/dist/contexts/sidebar.js +0 -31
  128. package/dist/layouts/docs/page-client.d.ts.map +0 -1
  129. package/dist/layouts/docs/page.d.ts +0 -17
  130. package/dist/layouts/docs/page.d.ts.map +0 -1
  131. package/dist/layouts/docs/page.js +0 -26
  132. package/dist/layouts/shared/client.d.ts +0 -6
  133. package/dist/layouts/shared/client.d.ts.map +0 -1
  134. package/dist/provider/index.d.ts +0 -11
  135. package/dist/provider/index.d.ts.map +0 -1
  136. package/dist/provider/index.js +0 -12
  137. /package/dist/{components/layout → layouts/shared}/language-toggle.js +0 -0
  138. /package/dist/{components/layout → layouts/shared}/search-toggle.d.ts +0 -0
  139. /package/dist/{components/layout → layouts/shared}/search-toggle.js +0 -0
package/css/black.css CHANGED
@@ -1,4 +1,4 @@
1
- @import './default.css';
1
+ @import './colors/index.css';
2
2
 
3
3
  @theme {
4
4
  --color-fd-background: hsl(0, 0%, 98%);
@@ -1,4 +1,4 @@
1
- @import './default.css';
1
+ @import './colors/index.css';
2
2
 
3
3
  @theme {
4
4
  --color-fd-popover: hsl(220, 22%, 92%);
@@ -0,0 +1,51 @@
1
+ @theme {
2
+ --color-fd-background: hsl(0, 0%, 96%);
3
+ --color-fd-foreground: hsl(0, 0%, 3.9%);
4
+ --color-fd-muted: hsl(0, 0%, 96.1%);
5
+ --color-fd-muted-foreground: hsl(0, 0%, 45.1%);
6
+ --color-fd-popover: hsl(0, 0%, 98%);
7
+ --color-fd-popover-foreground: hsl(0, 0%, 15.1%);
8
+ --color-fd-card: hsl(0, 0%, 94.7%);
9
+ --color-fd-card-foreground: hsl(0, 0%, 3.9%);
10
+ --color-fd-border: hsla(0, 0%, 80%, 50%);
11
+ --color-fd-primary: hsl(0, 0%, 9%);
12
+ --color-fd-primary-foreground: hsl(0, 0%, 98%);
13
+ --color-fd-secondary: hsl(0, 0%, 93.1%);
14
+ --color-fd-secondary-foreground: hsl(0, 0%, 9%);
15
+ --color-fd-accent: hsla(0, 0%, 82%, 50%);
16
+ --color-fd-accent-foreground: hsl(0, 0%, 9%);
17
+ --color-fd-ring: hsl(0, 0%, 63.9%);
18
+ --color-fd-overlay: hsla(0, 0%, 0%, 0.2);
19
+ }
20
+
21
+ .dark {
22
+ --color-fd-background: hsl(0, 0%, 7.04%);
23
+ --color-fd-foreground: hsl(0, 0%, 92%);
24
+ --color-fd-muted: hsl(0, 0%, 12.9%);
25
+ --color-fd-muted-foreground: hsla(0, 0%, 70%, 0.8);
26
+ --color-fd-popover: hsl(0, 0%, 11.6%);
27
+ --color-fd-popover-foreground: hsl(0, 0%, 86.9%);
28
+ --color-fd-card: hsl(0, 0%, 9.8%);
29
+ --color-fd-card-foreground: hsl(0, 0%, 98%);
30
+ --color-fd-border: hsla(0, 0%, 40%, 20%);
31
+ --color-fd-primary: hsl(0, 0%, 98%);
32
+ --color-fd-primary-foreground: hsl(0, 0%, 9%);
33
+ --color-fd-secondary: hsl(0, 0%, 12.9%);
34
+ --color-fd-secondary-foreground: hsl(0, 0%, 92%);
35
+ --color-fd-accent: hsla(0, 0%, 40.9%, 30%);
36
+ --color-fd-accent-foreground: hsl(0, 0%, 90%);
37
+ --color-fd-ring: hsl(0, 0%, 54.9%);
38
+ --color-fd-overlay: hsla(0, 0%, 0%, 0.2);
39
+ }
40
+
41
+ @theme static {
42
+ --color-fd-info: oklch(62.3% 0.214 259.815);
43
+ --color-fd-warning: oklch(76.9% 0.188 70.08);
44
+ --color-fd-error: oklch(63.7% 0.237 25.331);
45
+ --color-fd-success: oklch(72.3% 0.219 149.579);
46
+ --color-fd-idea: oklch(70.5% 0.209 60.849);
47
+ --color-fd-diff-remove: rgba(200, 10, 100, 0.12);
48
+ --color-fd-diff-remove-symbol: rgb(230, 10, 100);
49
+ --color-fd-diff-add: rgba(14, 180, 100, 0.1);
50
+ --color-fd-diff-add-symbol: rgb(10, 200, 100);
51
+ }
package/css/dusk.css CHANGED
@@ -1,4 +1,4 @@
1
- @import './default.css';
1
+ @import './colors/index.css';
2
2
 
3
3
  @theme {
4
4
  --color-fd-background: hsl(250, 20%, 92%);
@@ -0,0 +1 @@
1
+ @source '../../dist/layouts/docs/**/*.js';
@@ -0,0 +1 @@
1
+ @source '../../dist/layouts/home/**/*.js';
@@ -0,0 +1 @@
1
+ @source '../../dist/layouts/notebook/**/*.js';
package/css/neutral.css CHANGED
@@ -1,43 +1,4 @@
1
- @import './default.css';
2
-
3
- @theme {
4
- --color-fd-background: hsl(0, 0%, 96%);
5
- --color-fd-foreground: hsl(0, 0%, 3.9%);
6
- --color-fd-muted: hsl(0, 0%, 96.1%);
7
- --color-fd-muted-foreground: hsl(0, 0%, 45.1%);
8
- --color-fd-popover: hsl(0, 0%, 98%);
9
- --color-fd-popover-foreground: hsl(0, 0%, 15.1%);
10
- --color-fd-card: hsl(0, 0%, 94.7%);
11
- --color-fd-card-foreground: hsl(0, 0%, 3.9%);
12
- --color-fd-border: hsla(0, 0%, 80%, 50%);
13
- --color-fd-primary: hsl(0, 0%, 9%);
14
- --color-fd-primary-foreground: hsl(0, 0%, 98%);
15
- --color-fd-secondary: hsl(0, 0%, 93.1%);
16
- --color-fd-secondary-foreground: hsl(0, 0%, 9%);
17
- --color-fd-accent: hsla(0, 0%, 82%, 50%);
18
- --color-fd-accent-foreground: hsl(0, 0%, 9%);
19
- --color-fd-ring: hsl(0, 0%, 63.9%);
20
- }
21
-
22
- .dark {
23
- --color-fd-background: hsl(0, 0%, 7.04%);
24
- --color-fd-foreground: hsl(0, 0%, 92%);
25
- --color-fd-muted: hsl(0, 0%, 12.9%);
26
- --color-fd-muted-foreground: hsla(0, 0%, 70%, 0.8);
27
- --color-fd-popover: hsl(0, 0%, 11.6%);
28
- --color-fd-popover-foreground: hsl(0, 0%, 86.9%);
29
- --color-fd-card: hsl(0, 0%, 9.8%);
30
- --color-fd-card-foreground: hsl(0, 0%, 98%);
31
- --color-fd-border: hsla(0, 0%, 40%, 20%);
32
- --color-fd-primary: hsl(0, 0%, 98%);
33
- --color-fd-primary-foreground: hsl(0, 0%, 9%);
34
- --color-fd-secondary: hsl(0, 0%, 12.9%);
35
- --color-fd-secondary-foreground: hsl(0, 0%, 92%);
36
- --color-fd-accent: hsla(0, 0%, 40.9%, 30%);
37
- --color-fd-accent-foreground: hsl(0, 0%, 90%);
38
- --color-fd-ring: hsl(0, 0%, 54.9%);
39
- --color-fd-overlay: hsla(0, 0%, 0%, 0.2);
40
- }
1
+ @import './colors/index.css';
41
2
 
42
3
  .dark #nd-sidebar {
43
4
  --color-fd-muted: hsl(0, 0%, 16%);
package/css/ocean.css CHANGED
@@ -1,4 +1,4 @@
1
- @import './default.css';
1
+ @import './colors/index.css';
2
2
 
3
3
  @theme {
4
4
  --color-fd-background: hsl(0, 0%, 98%);
package/css/preset.css CHANGED
@@ -1,22 +1,25 @@
1
1
  @import './shiki.css';
2
2
 
3
- @source '../dist/**/*.js';
3
+ /* TODO: remove them on next major */
4
+ @import './layouts/docs.css';
5
+ @import './layouts/home.css';
6
+ @import './layouts/notebook.css';
7
+
8
+ @source '../dist/*.js';
9
+ @source '../dist/{components,contexts,provider,utils}/**/*.js';
10
+ @source '../dist/layouts/shared/**/*.js';
11
+
4
12
  @plugin '../dist/theme/typography/index.js';
5
13
 
14
+ :root {
15
+ --fd-sidebar-drawer-offset: 100%;
16
+ }
17
+
6
18
  [dir='rtl'] {
7
- --fd-sidebar-mobile-offset: -100%;
19
+ --fd-sidebar-drawer-offset: -100%;
8
20
  }
9
21
 
10
22
  @theme {
11
- --fd-sidebar-mobile-offset: 100%;
12
- --spacing-fd-container: 1400px;
13
- --fd-page-width: 1200px;
14
- --fd-sidebar-width: 0px;
15
- --fd-toc-width: 0px;
16
- --fd-layout-width: 1600px;
17
- --fd-banner-height: 0px;
18
- --fd-nav-height: 0px;
19
- --fd-tocnav-height: 0px;
20
23
  --animate-fd-fade-in: fd-fade-in 300ms ease;
21
24
  --animate-fd-fade-out: fd-fade-out 300ms ease;
22
25
 
@@ -48,13 +51,13 @@
48
51
 
49
52
  @keyframes fd-sidebar-in {
50
53
  from {
51
- transform: translateX(var(--fd-sidebar-mobile-offset));
54
+ transform: translateX(var(--fd-sidebar-drawer-offset));
52
55
  }
53
56
  }
54
57
 
55
58
  @keyframes fd-sidebar-out {
56
59
  to {
57
- transform: translateX(var(--fd-sidebar-mobile-offset));
60
+ transform: translateX(var(--fd-sidebar-drawer-offset));
58
61
  }
59
62
  }
60
63
 
@@ -230,11 +233,6 @@
230
233
  background-color: var(--color-fd-background);
231
234
  color: var(--color-fd-foreground);
232
235
  }
233
-
234
- :root,
235
- #nd-docs-layout {
236
- --fd-layout-offset: max(calc(50vw - var(--fd-layout-width) / 2), 0px);
237
- }
238
236
  }
239
237
 
240
238
  @utility fd-scroll-container {
@@ -295,18 +293,13 @@
295
293
  initial-value: 0px;
296
294
  }
297
295
 
298
- @utility container {
299
- margin-inline: auto;
300
- padding-inline: 1rem;
301
-
302
- @apply 2xl:max-w-(--spacing-fd-container);
303
- }
304
-
305
296
  @variant dark (&:where(.dark, .dark *));
306
297
 
307
- /* Apply styles to :root */
308
- @custom-variant on-root {
309
- :root:has(&) {
298
+ /* define/override layout variables */
299
+ @variant layout {
300
+ #nd-docs-layout:has(&),
301
+ #nd-notebook-layout:has(&),
302
+ #nd-home-layout:has(&) {
310
303
  @slot;
311
304
  }
312
305
  }
package/css/purple.css CHANGED
@@ -1,4 +1,4 @@
1
- @import './default.css';
1
+ @import './colors/index.css';
2
2
 
3
3
  @theme {
4
4
  --color-fd-background: hsl(256, 100%, 96%);
package/css/shadcn.css CHANGED
@@ -1,4 +1,4 @@
1
- @import './default.css';
1
+ @import './colors/index.css';
2
2
 
3
3
  @theme {
4
4
  --color-fd-background: var(--background);
@@ -29,3 +29,7 @@
29
29
  --color-fd-ring: var(--sidebar-ring);
30
30
  --color-fd-primary-foreground: var(--sidebar-primary-foreground);
31
31
  }
32
+
33
+ @theme static {
34
+ --color-fd-error: var(--destructive);
35
+ }
package/css/shiki.css CHANGED
@@ -1,9 +1,7 @@
1
- :root {
1
+ .shiki:not(.not-fumadocs-codeblock *) {
2
2
  --padding-left: calc(var(--spacing) * 4);
3
3
  --padding-right: calc(var(--spacing) * 4);
4
- }
5
4
 
6
- .shiki:not(.not-fumadocs-codeblock *) {
7
5
  code span {
8
6
  color: var(--shiki-light);
9
7
  }
package/css/solar.css CHANGED
@@ -1,4 +1,4 @@
1
- @import './neutral.css';
1
+ @import './colors/index.css';
2
2
 
3
3
  @theme {
4
4
  --color-fd-primary: oklch(0.487 0.083 262.691);
@@ -7,8 +7,6 @@
7
7
 
8
8
  :root {
9
9
  letter-spacing: -0.25px;
10
- --fd-layout-width: 1600px;
11
- --fd-page-width: 1400px;
12
10
  }
13
11
 
14
12
  .dark {
@@ -18,31 +16,60 @@
18
16
  }
19
17
 
20
18
  @variant md {
21
- #nd-page article {
22
- @apply bg-fd-article rounded-xl border shadow-xl my-4;
23
- }
19
+ #nd-docs-layout {
20
+ #nd-page {
21
+ @apply relative md:px-9 xl:px-12;
22
+ }
24
23
 
25
- #nd-tocnav,
26
- #nd-subnav > div {
27
- border: none;
28
- }
24
+ #nd-page:before {
25
+ content: '';
26
+ @apply absolute inset-0 bg-fd-article rounded-xl border shadow-xl m-4 mb-2 -z-1;
27
+ }
29
28
 
30
- .fd-default-layout #nd-page article {
31
- @apply mx-4;
32
- }
29
+ [data-toc-popover-trigger],
30
+ [data-toc-popover-content] {
31
+ @apply px-4;
32
+ }
33
33
 
34
- .fd-notebook-layout #nd-page article {
35
- @apply mx-6;
34
+ [data-toc-popover] {
35
+ top: calc(var(--fd-docs-row-1) + 2.5 * var(--spacing));
36
+ @apply mx-4 mt-2.5;
37
+
38
+ header {
39
+ transform-origin: top center;
40
+ @apply border rounded-xl shadow-lg transition-[margin] has-data-[active=true]:-mx-2 has-data-[active=true]:bg-fd-popover/80;
41
+ }
42
+ }
36
43
  }
37
- }
38
44
 
39
- #nd-sidebar {
40
- @apply bg-fd-background;
45
+ #nd-notebook-layout {
46
+ #nd-page {
47
+ @apply relative md:px-9 xl:px-12;
48
+ }
49
+
50
+ #nd-page:before {
51
+ content: '';
52
+ @apply absolute inset-0 bg-fd-article rounded-xl border shadow-xl m-4 mb-2 -z-1;
53
+ }
54
+
55
+ [data-toc-popover-trigger],
56
+ [data-toc-popover-content] {
57
+ @apply px-4;
58
+ }
59
+
60
+ [data-toc-popover] {
61
+ top: calc(var(--fd-docs-row-2) + 2.5 * var(--spacing));
62
+ @apply mx-4 mt-2.5;
63
+
64
+ header {
65
+ transform-origin: top center;
66
+ @apply border rounded-xl shadow-lg transition-[margin] has-data-[active=true]:-mx-2 has-data-[active=true]:bg-fd-popover/80;
67
+ }
68
+ }
69
+ }
41
70
  }
42
71
 
43
72
  #nd-sidebar[data-collapsed='false'] {
44
73
  border: none;
45
- --color-fd-muted: inherit;
46
- --color-fd-secondary: inherit;
47
- --color-fd-muted-foreground: inherit;
74
+ @apply bg-fd-background;
48
75
  }
package/css/vitepress.css CHANGED
@@ -1,4 +1,4 @@
1
- @import './default.css';
1
+ @import './colors/index.css';
2
2
 
3
3
  @theme {
4
4
  --color-fd-muted: hsl(0, 0%, 96.1%);
@@ -1,12 +1,12 @@
1
1
  import { type ImageProps } from 'fumadocs-core/framework';
2
- import { type ImgHTMLAttributes } from 'react';
3
- import './image-zoom.css';
2
+ import type { ComponentProps } from 'react';
4
3
  import { type UncontrolledProps } from 'react-medium-image-zoom';
4
+ import './image-zoom.css';
5
5
  export type ImageZoomProps = ImageProps & {
6
6
  /**
7
7
  * Image props when zoom in
8
8
  */
9
- zoomInProps?: ImgHTMLAttributes<HTMLImageElement>;
9
+ zoomInProps?: ComponentProps<'img'>;
10
10
  /**
11
11
  * Props for `react-medium-image-zoom`
12
12
  */
@@ -1 +1 @@
1
- {"version":3,"file":"image-zoom.d.ts","sourceRoot":"","sources":["../../src/components/image-zoom.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAS,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,kBAAkB,CAAC;AAC1B,OAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEvE,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG;IACxC;;OAEG;IACH,WAAW,CAAC,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IAElD;;OAEG;IACH,IAAI,CAAC,EAAE,iBAAiB,CAAC;CAC1B,CAAC;AAeF,wBAAgB,SAAS,CAAC,EACxB,WAAW,EACX,QAAQ,EACR,IAAI,EACJ,GAAG,KAAK,EACT,EAAE,cAAc,2CAoBhB"}
1
+ {"version":3,"file":"image-zoom.d.ts","sourceRoot":"","sources":["../../src/components/image-zoom.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAS,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,kBAAkB,CAAC;AAE1B,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG;IACxC;;OAEG;IACH,WAAW,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;IAEpC;;OAEG;IACH,IAAI,CAAC,EAAE,iBAAiB,CAAC;CAC1B,CAAC;AAeF,wBAAgB,SAAS,CAAC,EACxB,WAAW,EACX,QAAQ,EACR,IAAI,EACJ,GAAG,KAAK,EACT,EAAE,cAAc,2CAoBhB"}
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { Image } from 'fumadocs-core/framework';
4
- import './image-zoom.css';
5
4
  import Zoom from 'react-medium-image-zoom';
5
+ import './image-zoom.css';
6
6
  function getImageSrc(src) {
7
7
  if (typeof src === 'string')
8
8
  return src;
@@ -0,0 +1,64 @@
1
+ import { type ComponentProps, type PointerEvent, type ReactNode, type RefObject } from 'react';
2
+ import { type LinkProps } from 'fumadocs-core/link';
3
+ import { type ScrollAreaProps } from '@radix-ui/react-scroll-area';
4
+ import type { CollapsibleContentProps, CollapsibleTriggerProps } from '@radix-ui/react-collapsible';
5
+ interface SidebarContext {
6
+ open: boolean;
7
+ setOpen: React.Dispatch<React.SetStateAction<boolean>>;
8
+ collapsed: boolean;
9
+ setCollapsed: React.Dispatch<React.SetStateAction<boolean>>;
10
+ /**
11
+ * When set to false, don't close the sidebar when navigate to another page
12
+ */
13
+ closeOnRedirect: RefObject<boolean>;
14
+ defaultOpenLevel: number;
15
+ prefetch: boolean;
16
+ mode: Mode;
17
+ }
18
+ export interface SidebarProviderProps {
19
+ /**
20
+ * Open folders by default if their level is lower or equal to a specific level
21
+ * (Starting from 1)
22
+ *
23
+ * @defaultValue 0
24
+ */
25
+ defaultOpenLevel?: number;
26
+ /**
27
+ * Prefetch links
28
+ *
29
+ * @defaultValue true
30
+ */
31
+ prefetch?: boolean;
32
+ children?: ReactNode;
33
+ }
34
+ type Mode = 'drawer' | 'full';
35
+ declare const SidebarContext: import("react").Context<SidebarContext | null>;
36
+ export declare function SidebarProvider({ defaultOpenLevel, prefetch, children, }: SidebarProviderProps): import("react/jsx-runtime").JSX.Element;
37
+ export declare function useSidebar(): SidebarContext;
38
+ export declare function useFolderDepth(): number;
39
+ export declare function SidebarContent({ children, }: {
40
+ children: (state: {
41
+ ref: RefObject<HTMLElement | null>;
42
+ collapsed: boolean;
43
+ hovered: boolean;
44
+ onPointerEnter: (event: PointerEvent) => void;
45
+ onPointerLeave: (event: PointerEvent) => void;
46
+ }) => ReactNode;
47
+ }): ReactNode;
48
+ export declare function SidebarDrawerOverlay(props: ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element | undefined;
49
+ export declare function SidebarDrawerContent({ className, children, ...props }: ComponentProps<'aside'>): import("react/jsx-runtime").JSX.Element | undefined;
50
+ export declare function SidebarViewport(props: ScrollAreaProps): import("react/jsx-runtime").JSX.Element;
51
+ export declare function SidebarSeparator(props: ComponentProps<'p'>): import("react/jsx-runtime").JSX.Element;
52
+ export declare function SidebarItem({ icon, children, ...props }: LinkProps & {
53
+ icon?: ReactNode;
54
+ }): import("react/jsx-runtime").JSX.Element;
55
+ export declare function SidebarFolder({ defaultOpen: defaultOpenOption, ...props }: ComponentProps<'div'> & {
56
+ defaultOpen?: boolean | ((currentDefault: boolean) => boolean);
57
+ }): import("react/jsx-runtime").JSX.Element;
58
+ export declare function SidebarFolderTrigger(props: CollapsibleTriggerProps): import("react/jsx-runtime").JSX.Element;
59
+ export declare function SidebarFolderLink(props: LinkProps): import("react/jsx-runtime").JSX.Element;
60
+ export declare function SidebarFolderContent(props: CollapsibleContentProps): import("react/jsx-runtime").JSX.Element;
61
+ export declare function SidebarTrigger({ children, ...props }: ComponentProps<'button'>): import("react/jsx-runtime").JSX.Element;
62
+ export declare function SidebarCollapseTrigger(props: ComponentProps<'button'>): import("react/jsx-runtime").JSX.Element;
63
+ export {};
64
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/base.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,178 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { ChevronDown, ExternalLink } from '../../icons.js';
4
+ import { createContext, use, useEffect, useMemo, useRef, useState, } from 'react';
5
+ import Link from 'fumadocs-core/link';
6
+ import { useOnChange } from 'fumadocs-core/utils/use-on-change';
7
+ import { cn } from '../../utils/cn.js';
8
+ import { ScrollArea, ScrollViewport } from '../../components/ui/scroll-area.js';
9
+ import { isActive } from '../../utils/is-active.js';
10
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from '../../components/ui/collapsible.js';
11
+ import { useMediaQuery } from 'fumadocs-core/utils/use-media-query';
12
+ import { Presence } from '@radix-ui/react-presence';
13
+ import scrollIntoView from 'scroll-into-view-if-needed';
14
+ import { usePathname } from 'fumadocs-core/framework';
15
+ const SidebarContext = createContext(null);
16
+ const FolderContext = createContext(null);
17
+ export function SidebarProvider({ defaultOpenLevel = 0, prefetch = true, children, }) {
18
+ const closeOnRedirect = useRef(true);
19
+ const [open, setOpen] = useState(false);
20
+ const [collapsed, setCollapsed] = useState(false);
21
+ const pathname = usePathname();
22
+ const mode = useMediaQuery('(width < 768px)') ? 'drawer' : 'full';
23
+ useOnChange(pathname, () => {
24
+ if (closeOnRedirect.current) {
25
+ setOpen(false);
26
+ }
27
+ closeOnRedirect.current = true;
28
+ });
29
+ return (_jsx(SidebarContext, { value: useMemo(() => ({
30
+ open,
31
+ setOpen,
32
+ collapsed,
33
+ setCollapsed,
34
+ closeOnRedirect,
35
+ defaultOpenLevel,
36
+ prefetch,
37
+ mode,
38
+ }), [open, collapsed, defaultOpenLevel, prefetch, mode]), children: children }));
39
+ }
40
+ export function useSidebar() {
41
+ const ctx = use(SidebarContext);
42
+ if (!ctx)
43
+ throw new Error('Missing SidebarContext, make sure you have wrapped the component in <DocsLayout /> and the context is available.');
44
+ return ctx;
45
+ }
46
+ export function useFolderDepth() {
47
+ return use(FolderContext)?.depth ?? 0;
48
+ }
49
+ export function SidebarContent({ children, }) {
50
+ const { collapsed, mode } = useSidebar();
51
+ const [hover, setHover] = useState(false);
52
+ const ref = useRef(null);
53
+ const timerRef = useRef(0);
54
+ useOnChange(collapsed, () => {
55
+ if (collapsed)
56
+ setHover(false);
57
+ });
58
+ if (mode !== 'full')
59
+ return;
60
+ function shouldIgnoreHover(e) {
61
+ const element = ref.current;
62
+ if (!element)
63
+ return true;
64
+ return (!collapsed ||
65
+ e.pointerType === 'touch' ||
66
+ element.getAnimations().length > 0);
67
+ }
68
+ return children({
69
+ ref,
70
+ collapsed,
71
+ hovered: hover,
72
+ onPointerEnter(e) {
73
+ if (shouldIgnoreHover(e))
74
+ return;
75
+ window.clearTimeout(timerRef.current);
76
+ setHover(true);
77
+ },
78
+ onPointerLeave(e) {
79
+ if (shouldIgnoreHover(e))
80
+ return;
81
+ window.clearTimeout(timerRef.current);
82
+ timerRef.current = window.setTimeout(() => setHover(false),
83
+ // if mouse is leaving the viewport, add a close delay
84
+ Math.min(e.clientX, document.body.clientWidth - e.clientX) > 100
85
+ ? 0
86
+ : 500);
87
+ },
88
+ });
89
+ }
90
+ export function SidebarDrawerOverlay(props) {
91
+ const { open, setOpen, mode } = useSidebar();
92
+ if (mode !== 'drawer')
93
+ return;
94
+ return (_jsx(Presence, { present: open, children: _jsx("div", { "data-state": open ? 'open' : 'closed', onClick: () => setOpen(false), ...props }) }));
95
+ }
96
+ export function SidebarDrawerContent({ className, children, ...props }) {
97
+ const { open, mode } = useSidebar();
98
+ const state = open ? 'open' : 'closed';
99
+ if (mode !== 'drawer')
100
+ return;
101
+ return (_jsx(Presence, { present: open, children: ({ present }) => (_jsx("aside", { id: "nd-sidebar-mobile", "data-state": state, className: cn(!present && 'invisible', className), ...props, children: children })) }));
102
+ }
103
+ export function SidebarViewport(props) {
104
+ return (_jsx(ScrollArea, { ...props, className: cn('min-h-0 flex-1', props.className), children: _jsx(ScrollViewport, { className: "p-4 overscroll-contain", style: {
105
+ maskImage: 'linear-gradient(to bottom, transparent, white 12px, white calc(100% - 12px), transparent)',
106
+ }, children: props.children }) }));
107
+ }
108
+ export function SidebarSeparator(props) {
109
+ const depth = useFolderDepth();
110
+ return (_jsx("p", { ...props, className: cn('inline-flex items-center gap-2 mb-1.5 px-2 mt-6 empty:mb-0', depth === 0 && 'first:mt-0', props.className), children: props.children }));
111
+ }
112
+ export function SidebarItem({ icon, children, ...props }) {
113
+ const pathname = usePathname();
114
+ const ref = useRef(null);
115
+ const { prefetch } = useSidebar();
116
+ const active = props.href !== undefined && isActive(props.href, pathname, false);
117
+ useAutoScroll(active, ref);
118
+ return (_jsxs(Link, { ref: ref, "data-active": active, prefetch: prefetch, ...props, children: [icon ?? (props.external ? _jsx(ExternalLink, {}) : null), children] }));
119
+ }
120
+ export function SidebarFolder({ defaultOpen: defaultOpenOption = false, ...props }) {
121
+ const { defaultOpenLevel } = useSidebar();
122
+ const depth = useFolderDepth() + 1;
123
+ const defaultOpen = typeof defaultOpenOption === 'function'
124
+ ? defaultOpenOption(defaultOpenLevel >= depth)
125
+ : defaultOpenLevel >= depth || defaultOpenOption;
126
+ const [open, setOpen] = useState(defaultOpen);
127
+ useOnChange(defaultOpen, (v) => {
128
+ if (v)
129
+ setOpen(v);
130
+ });
131
+ return (_jsx(Collapsible, { open: open, onOpenChange: setOpen, ...props, children: _jsx(FolderContext, { value: useMemo(() => ({ open, setOpen, depth }), [depth, open]), children: props.children }) }));
132
+ }
133
+ export function SidebarFolderTrigger(props) {
134
+ const { open } = use(FolderContext);
135
+ return (_jsxs(CollapsibleTrigger, { ...props, children: [props.children, _jsx(ChevronDown, { "data-icon": true, className: cn('ms-auto transition-transform', !open && '-rotate-90') })] }));
136
+ }
137
+ export function SidebarFolderLink(props) {
138
+ const ref = useRef(null);
139
+ const { open, setOpen } = use(FolderContext);
140
+ const { prefetch } = useSidebar();
141
+ const pathname = usePathname();
142
+ const active = props.href !== undefined && isActive(props.href, pathname, false);
143
+ useAutoScroll(active, ref);
144
+ return (_jsxs(Link, { ref: ref, "data-active": active, onClick: (e) => {
145
+ if (e.target instanceof Element &&
146
+ e.target.matches('[data-icon], [data-icon] *')) {
147
+ setOpen(!open);
148
+ e.preventDefault();
149
+ }
150
+ else {
151
+ setOpen(active ? !open : true);
152
+ }
153
+ }, prefetch: prefetch, ...props, children: [props.children, _jsx(ChevronDown, { "data-icon": true, className: cn('ms-auto transition-transform', !open && '-rotate-90') })] }));
154
+ }
155
+ export function SidebarFolderContent(props) {
156
+ return _jsx(CollapsibleContent, { ...props, children: props.children });
157
+ }
158
+ export function SidebarTrigger({ children, ...props }) {
159
+ const { setOpen } = useSidebar();
160
+ return (_jsx("button", { "aria-label": "Open Sidebar", onClick: () => setOpen((prev) => !prev), ...props, children: children }));
161
+ }
162
+ export function SidebarCollapseTrigger(props) {
163
+ const { collapsed, setCollapsed } = useSidebar();
164
+ return (_jsx("button", { type: "button", "aria-label": "Collapse Sidebar", "data-collapsed": collapsed, onClick: () => {
165
+ setCollapsed((prev) => !prev);
166
+ }, ...props, children: props.children }));
167
+ }
168
+ function useAutoScroll(active, ref) {
169
+ const { mode } = useSidebar();
170
+ useEffect(() => {
171
+ if (active && ref.current) {
172
+ scrollIntoView(ref.current, {
173
+ boundary: document.getElementById(mode === 'drawer' ? 'nd-sidebar-mobile' : 'nd-sidebar'),
174
+ scrollMode: 'if-needed',
175
+ });
176
+ }
177
+ }, [active, mode, ref]);
178
+ }
@@ -0,0 +1,11 @@
1
+ import type { HTMLAttributes } from 'react';
2
+ import type * as Base from './base.js';
3
+ import type { LinkItemType } from '../../layouts/shared/link-item.js';
4
+ type InternalComponents = Pick<typeof Base, 'SidebarFolder' | 'SidebarFolderLink' | 'SidebarFolderContent' | 'SidebarFolderTrigger' | 'SidebarItem'>;
5
+ export declare function createLinkItemRenderer({ SidebarFolder, SidebarFolderContent, SidebarFolderLink, SidebarFolderTrigger, SidebarItem, }: InternalComponents): ({ item, ...props }: HTMLAttributes<HTMLElement> & {
6
+ item: Exclude<LinkItemType, {
7
+ type: "icon";
8
+ }>;
9
+ }) => import("react/jsx-runtime").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=link-item.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-item.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/link-item.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,KAAK,KAAK,IAAI,MAAM,QAAQ,CAAC;AACpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,KAAK,kBAAkB,GAAG,IAAI,CAC5B,OAAO,IAAI,EACT,eAAe,GACf,mBAAmB,GACnB,sBAAsB,GACtB,sBAAsB,GACtB,aAAa,CAChB,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,EACrC,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,GACZ,EAAE,kBAAkB,IAIa,oBAG7B,cAAc,CAAC,WAAW,CAAC,GAAG;IAC/B,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/C,6CAoCF"}