fumadocs-ui 14.2.1 → 14.3.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 (229) hide show
  1. package/dist/components/accordion.d.ts +4 -7
  2. package/dist/components/accordion.d.ts.map +1 -0
  3. package/dist/components/accordion.js +32 -104
  4. package/dist/components/api.d.ts +4 -13
  5. package/dist/components/api.d.ts.map +1 -0
  6. package/dist/components/api.js +3 -16
  7. package/dist/components/banner.d.ts +3 -5
  8. package/dist/components/banner.d.ts.map +1 -0
  9. package/dist/components/banner.js +53 -120
  10. package/dist/components/callout.d.ts +4 -7
  11. package/dist/components/callout.d.ts.map +1 -0
  12. package/dist/components/callout.js +13 -9
  13. package/dist/components/card.d.ts +5 -7
  14. package/dist/components/card.d.ts.map +1 -0
  15. package/dist/components/card.js +10 -10
  16. package/dist/components/codeblock.d.ts +6 -9
  17. package/dist/components/codeblock.d.ts.map +1 -0
  18. package/dist/components/codeblock.js +41 -15
  19. package/dist/components/dialog/search-algolia.d.ts +7 -11
  20. package/dist/components/dialog/search-algolia.d.ts.map +1 -0
  21. package/dist/components/dialog/search-algolia.js +19 -79
  22. package/dist/components/dialog/search-default.d.ts +6 -10
  23. package/dist/components/dialog/search-default.d.ts.map +1 -0
  24. package/dist/components/dialog/search-default.js +24 -73
  25. package/dist/components/dialog/search-orama.d.ts +7 -11
  26. package/dist/components/dialog/search-orama.d.ts.map +1 -0
  27. package/dist/components/dialog/search-orama.js +22 -79
  28. package/dist/components/dialog/search.d.ts +7 -9
  29. package/dist/components/dialog/search.d.ts.map +1 -0
  30. package/dist/components/dialog/search.js +98 -13
  31. package/dist/components/dialog/tag-list.d.ts +13 -0
  32. package/dist/components/dialog/tag-list.d.ts.map +1 -0
  33. package/dist/components/dialog/tag-list.js +20 -0
  34. package/dist/components/files.d.ts +7 -9
  35. package/dist/components/files.d.ts.map +1 -0
  36. package/dist/components/files.js +15 -63
  37. package/dist/components/heading.d.ts +4 -5
  38. package/dist/components/heading.d.ts.map +1 -0
  39. package/dist/components/heading.js +9 -9
  40. package/dist/components/image-zoom.d.ts +7 -8
  41. package/dist/components/image-zoom.d.ts.map +1 -0
  42. package/dist/components/image-zoom.js +16 -40
  43. package/dist/components/inline-toc.d.ts +4 -6
  44. package/dist/components/inline-toc.d.ts.map +1 -0
  45. package/dist/components/inline-toc.js +8 -46
  46. package/dist/components/layout/breadcrumb.d.ts +11 -0
  47. package/dist/components/layout/breadcrumb.d.ts.map +1 -0
  48. package/dist/components/layout/breadcrumb.js +20 -0
  49. package/dist/components/layout/language-toggle.d.ts +5 -7
  50. package/dist/components/layout/language-toggle.d.ts.map +1 -0
  51. package/dist/components/layout/language-toggle.js +24 -14
  52. package/dist/components/layout/nav.d.ts +28 -0
  53. package/dist/components/layout/nav.d.ts.map +1 -0
  54. package/dist/components/layout/nav.js +29 -0
  55. package/dist/components/layout/root-toggle.d.ts +5 -7
  56. package/dist/components/layout/root-toggle.d.ts.map +1 -0
  57. package/dist/components/layout/root-toggle.js +28 -13
  58. package/dist/components/layout/search-toggle.d.ts +4 -0
  59. package/dist/components/layout/search-toggle.d.ts.map +1 -0
  60. package/dist/components/layout/search-toggle.js +24 -0
  61. package/dist/components/layout/theme-toggle.d.ts +3 -0
  62. package/dist/components/layout/theme-toggle.d.ts.map +1 -0
  63. package/dist/components/layout/theme-toggle.js +21 -0
  64. package/dist/components/layout/toc-clerk.d.ts +6 -0
  65. package/dist/components/layout/toc-clerk.d.ts.map +1 -0
  66. package/dist/components/layout/toc-clerk.js +76 -0
  67. package/dist/components/layout/toc-popover.d.ts +8 -0
  68. package/dist/components/layout/toc-popover.d.ts.map +1 -0
  69. package/dist/components/layout/toc-popover.js +20 -0
  70. package/dist/components/layout/toc-thumb.d.ts +6 -0
  71. package/dist/components/layout/toc-thumb.d.ts.map +1 -0
  72. package/dist/components/layout/toc-thumb.js +53 -0
  73. package/dist/components/layout/toc.d.ts +19 -0
  74. package/dist/components/layout/toc.d.ts.map +1 -0
  75. package/dist/components/layout/toc.js +25 -0
  76. package/dist/components/registry.d.ts +3 -0
  77. package/dist/components/registry.d.ts.map +1 -0
  78. package/dist/components/registry.js +70 -0
  79. package/dist/components/steps.d.ts +4 -6
  80. package/dist/components/steps.d.ts.map +1 -0
  81. package/dist/components/steps.js +5 -16
  82. package/dist/components/tabs.d.ts +7 -21
  83. package/dist/components/tabs.d.ts.map +1 -0
  84. package/dist/components/tabs.js +61 -171
  85. package/dist/components/type-table.d.ts +5 -6
  86. package/dist/components/type-table.d.ts.map +1 -0
  87. package/dist/components/type-table.js +18 -59
  88. package/dist/components/ui/button.d.ts +5 -0
  89. package/dist/components/ui/button.d.ts.map +1 -0
  90. package/dist/components/ui/button.js +14 -0
  91. package/dist/components/ui/collapsible.d.ts +6 -0
  92. package/dist/components/ui/collapsible.d.ts.map +1 -0
  93. package/dist/components/ui/collapsible.js +12 -0
  94. package/dist/components/ui/navigation-menu.d.ts +11 -0
  95. package/dist/components/ui/navigation-menu.d.ts.map +1 -0
  96. package/dist/components/ui/navigation-menu.js +15 -0
  97. package/dist/components/ui/popover.d.ts +8 -0
  98. package/dist/components/ui/popover.d.ts.map +1 -0
  99. package/dist/components/ui/popover.js +11 -0
  100. package/dist/components/ui/scroll-area.d.ts +7 -0
  101. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  102. package/dist/components/ui/scroll-area.js +11 -0
  103. package/dist/components/ui/tabs.d.ts +8 -0
  104. package/dist/components/ui/tabs.d.ts.map +1 -0
  105. package/dist/components/ui/tabs.js +16 -0
  106. package/dist/{i18n-Db2HAPOu.d.ts → contexts/i18n.d.ts} +9 -5
  107. package/dist/contexts/i18n.d.ts.map +1 -0
  108. package/dist/contexts/i18n.js +23 -0
  109. package/dist/contexts/search.d.ts +50 -0
  110. package/dist/contexts/search.d.ts.map +1 -0
  111. package/dist/contexts/search.js +50 -0
  112. package/dist/contexts/sidebar.d.ts +18 -0
  113. package/dist/contexts/sidebar.d.ts.map +1 -0
  114. package/dist/contexts/sidebar.js +31 -0
  115. package/dist/contexts/tree.d.ts +13 -0
  116. package/dist/contexts/tree.d.ts.map +1 -0
  117. package/dist/contexts/tree.js +25 -0
  118. package/dist/i18n.d.ts +5 -6
  119. package/dist/i18n.d.ts.map +1 -0
  120. package/dist/i18n.js +31 -49
  121. package/dist/layouts/docs/navbar.d.ts +4 -0
  122. package/dist/layouts/docs/navbar.d.ts.map +1 -0
  123. package/dist/layouts/docs/navbar.js +22 -0
  124. package/dist/layouts/docs/sidebar.d.ts +40 -0
  125. package/dist/layouts/docs/sidebar.d.ts.map +1 -0
  126. package/dist/layouts/docs/sidebar.js +146 -0
  127. package/dist/layouts/docs.client.d.ts +14 -25
  128. package/dist/layouts/docs.client.d.ts.map +1 -0
  129. package/dist/layouts/docs.client.js +53 -195
  130. package/dist/layouts/docs.d.ts +34 -19
  131. package/dist/layouts/docs.d.ts.map +1 -0
  132. package/dist/layouts/docs.js +67 -202
  133. package/dist/layouts/home/menu.d.ts +6 -0
  134. package/dist/layouts/home/menu.d.ts.map +1 -0
  135. package/dist/layouts/home/menu.js +33 -0
  136. package/dist/layouts/home/navbar.d.ts +16 -0
  137. package/dist/layouts/home/navbar.d.ts.map +1 -0
  138. package/dist/layouts/home/navbar.js +48 -0
  139. package/dist/layouts/home.d.ts +5 -7
  140. package/dist/layouts/home.d.ts.map +1 -0
  141. package/dist/layouts/home.js +51 -59
  142. package/dist/layouts/links.d.ts +80 -0
  143. package/dist/layouts/links.d.ts.map +1 -0
  144. package/dist/layouts/links.js +14 -0
  145. package/dist/layouts/shared.d.ts +48 -2
  146. package/dist/layouts/shared.d.ts.map +1 -0
  147. package/dist/layouts/shared.js +27 -9
  148. package/dist/mdx.client.d.ts +3 -6
  149. package/dist/mdx.client.d.ts.map +1 -0
  150. package/dist/mdx.client.js +12 -19
  151. package/dist/mdx.d.ts +18 -20
  152. package/dist/mdx.d.ts.map +1 -0
  153. package/dist/mdx.js +47 -56
  154. package/dist/og.d.ts +6 -7
  155. package/dist/og.d.ts.map +1 -0
  156. package/dist/og.js +43 -102
  157. package/dist/page.client.d.ts +8 -41
  158. package/dist/page.client.d.ts.map +1 -0
  159. package/dist/page.client.js +71 -261
  160. package/dist/page.d.ts +28 -30
  161. package/dist/page.d.ts.map +1 -0
  162. package/dist/page.js +80 -168
  163. package/dist/provider.d.ts +12 -72
  164. package/dist/provider.d.ts.map +1 -0
  165. package/dist/provider.js +19 -55
  166. package/dist/style.css +1 -1
  167. package/dist/tailwind-plugin.d.ts +9 -20
  168. package/dist/tailwind-plugin.d.ts.map +1 -0
  169. package/dist/tailwind-plugin.js +191 -699
  170. package/dist/theme/animations.d.ts +170 -0
  171. package/dist/theme/animations.d.ts.map +1 -0
  172. package/dist/theme/animations.js +95 -0
  173. package/dist/theme/colors.d.ts +11 -0
  174. package/dist/theme/colors.d.ts.map +1 -0
  175. package/dist/theme/colors.js +327 -0
  176. package/dist/theme/typography.d.ts +70 -0
  177. package/dist/theme/typography.d.ts.map +1 -0
  178. package/dist/theme/typography.js +71 -0
  179. package/dist/utils/cn.d.ts +2 -0
  180. package/dist/utils/cn.d.ts.map +1 -0
  181. package/dist/utils/cn.js +1 -0
  182. package/dist/utils/get-sidebar-tabs.d.ts +7 -0
  183. package/dist/utils/get-sidebar-tabs.d.ts.map +1 -0
  184. package/dist/utils/get-sidebar-tabs.js +20 -0
  185. package/dist/utils/is-active.d.ts +2 -0
  186. package/dist/utils/is-active.d.ts.map +1 -0
  187. package/dist/utils/is-active.js +3 -0
  188. package/dist/utils/use-copy-button.d.ts +3 -0
  189. package/dist/utils/use-copy-button.d.ts.map +1 -0
  190. package/dist/utils/use-copy-button.js +25 -0
  191. package/package.json +9 -9
  192. package/dist/chunk-27HFSL7N.js +0 -53
  193. package/dist/chunk-2FLZOPQN.js +0 -54
  194. package/dist/chunk-2KMKNVSN.js +0 -29
  195. package/dist/chunk-AFMXKA2S.js +0 -125
  196. package/dist/chunk-CDPVENXR.js +0 -8
  197. package/dist/chunk-CLF6ZVYS.js +0 -259
  198. package/dist/chunk-DGKCMOIC.js +0 -56
  199. package/dist/chunk-DN6Z5VW6.js +0 -61
  200. package/dist/chunk-E3VO2QQT.js +0 -29
  201. package/dist/chunk-EFMHXXHW.js +0 -24
  202. package/dist/chunk-F534DZID.js +0 -43
  203. package/dist/chunk-GHOAONNQ.js +0 -48
  204. package/dist/chunk-IL64LMKR.js +0 -82
  205. package/dist/chunk-ILBYBJ5C.js +0 -38
  206. package/dist/chunk-IVBHRX3O.js +0 -31
  207. package/dist/chunk-J6XGK6ZG.js +0 -212
  208. package/dist/chunk-KZTWSBYY.js +0 -68
  209. package/dist/chunk-MCX7E6ZW.js +0 -57
  210. package/dist/chunk-MLKGABMK.js +0 -9
  211. package/dist/chunk-QKOA6KEZ.js +0 -22
  212. package/dist/chunk-TK3TM3MR.js +0 -6
  213. package/dist/chunk-TQJ6YPJ3.js +0 -31
  214. package/dist/chunk-UUGCW3UP.js +0 -84
  215. package/dist/chunk-VPJMNIJX.js +0 -542
  216. package/dist/chunk-W36BQGMB.js +0 -69
  217. package/dist/chunk-YL3MZH7N.js +0 -66
  218. package/dist/chunk-ZBOI25UW.js +0 -139
  219. package/dist/components/api.client.d.ts +0 -5
  220. package/dist/components/api.client.js +0 -8
  221. package/dist/dynamic-sidebar-SYEETGZL.js +0 -129
  222. package/dist/edit-on-github-FIYOWWPQ.js +0 -49
  223. package/dist/layouts/home.client.d.ts +0 -11
  224. package/dist/layouts/home.client.js +0 -274
  225. package/dist/shared-SScCiV7b.d.ts +0 -152
  226. package/dist/sidebar-CQ4HmzQl.d.ts +0 -50
  227. package/dist/tag-list-BsEgfE3x.d.ts +0 -6
  228. package/dist/toc-clerk-SKE4LBT7.js +0 -158
  229. package/dist/tree-06ley65N.d.ts +0 -21
@@ -1,82 +1,22 @@
1
- "use client";
2
- import {
3
- TagsList
4
- } from "../../chunk-DGKCMOIC.js";
5
- import {
6
- SearchDialog
7
- } from "../../chunk-CLF6ZVYS.js";
8
- import "../../chunk-QKOA6KEZ.js";
9
- import "../../chunk-VPJMNIJX.js";
10
- import "../../chunk-TK3TM3MR.js";
11
- import "../../chunk-UUGCW3UP.js";
12
- import "../../chunk-27HFSL7N.js";
13
- import "../../chunk-EFMHXXHW.js";
14
- import "../../chunk-MLKGABMK.js";
15
-
16
- // src/components/dialog/search-algolia.tsx
17
- import {
18
- useDocsSearch
19
- } from "fumadocs-core/search/client";
20
- import { useState } from "react";
21
- import { useOnChange } from "fumadocs-core/utils/use-on-change";
22
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
23
- function AlgoliaSearchDialog({
24
- index,
25
- searchOptions,
26
- tags,
27
- defaultTag,
28
- showAlgolia = false,
29
- allowClear = false,
30
- ...props
31
- }) {
32
- const [tag, setTag] = useState(defaultTag);
33
- const { search, setSearch, query } = useDocsSearch(
34
- {
35
- type: "algolia",
36
- index,
37
- ...searchOptions
38
- },
39
- void 0,
40
- tag
41
- );
42
- useOnChange(defaultTag, (v) => {
43
- setTag(v);
44
- });
45
- return /* @__PURE__ */ jsx(
46
- SearchDialog,
47
- {
48
- search,
49
- onSearchChange: setSearch,
50
- results: query.data ?? [],
51
- isLoading: query.isLoading,
52
- ...props,
53
- footer: tags ? /* @__PURE__ */ jsxs(Fragment, { children: [
54
- /* @__PURE__ */ jsx(
55
- TagsList,
56
- {
57
- tag,
58
- onTagChange: setTag,
59
- items: tags,
60
- allowClear,
61
- children: showAlgolia ? /* @__PURE__ */ jsx(AlgoliaTitle, {}) : null
62
- }
63
- ),
64
- props.footer
65
- ] }) : props.footer
66
- }
67
- );
1
+ 'use client';
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useDocsSearch, } from 'fumadocs-core/search/client';
4
+ import { useState } from 'react';
5
+ import { useOnChange } from 'fumadocs-core/utils/use-on-change';
6
+ import { SearchDialog } from './search';
7
+ import { TagsList } from './tag-list';
8
+ export default function AlgoliaSearchDialog({ index, searchOptions, tags, defaultTag, showAlgolia = false, allowClear = false, ...props }) {
9
+ const [tag, setTag] = useState(defaultTag);
10
+ const { search, setSearch, query } = useDocsSearch({
11
+ type: 'algolia',
12
+ index,
13
+ ...searchOptions,
14
+ }, undefined, tag);
15
+ useOnChange(defaultTag, (v) => {
16
+ setTag(v);
17
+ });
18
+ return (_jsx(SearchDialog, { search: search, onSearchChange: setSearch, results: query.data ?? [], isLoading: query.isLoading, ...props, footer: tags ? (_jsxs(_Fragment, { children: [_jsx(TagsList, { tag: tag, onTagChange: setTag, items: tags, allowClear: allowClear, children: showAlgolia ? _jsx(AlgoliaTitle, {}) : null }), props.footer] })) : (props.footer) }));
68
19
  }
69
20
  function AlgoliaTitle() {
70
- return /* @__PURE__ */ jsx(
71
- "a",
72
- {
73
- href: "https://algolia.com",
74
- rel: "noreferrer noopener",
75
- className: "ms-auto text-xs text-fd-muted-foreground",
76
- children: "Search powered by Algolia"
77
- }
78
- );
21
+ return (_jsx("a", { href: "https://algolia.com", rel: "noreferrer noopener", className: "ms-auto text-xs text-fd-muted-foreground", children: "Search powered by Algolia" }));
79
22
  }
80
- export {
81
- AlgoliaSearchDialog as default
82
- };
@@ -1,10 +1,7 @@
1
- import { ReactNode } from 'react';
2
- import { SharedProps } from './search.js';
3
- import { T as TagItem } from '../../tag-list-BsEgfE3x.js';
4
- import 'react/jsx-runtime';
5
- import 'fumadocs-core/server';
6
-
7
- interface DefaultSearchDialogProps extends SharedProps {
1
+ import { type ReactNode } from 'react';
2
+ import { type SharedProps } from './search';
3
+ import { type TagItem } from './tag-list';
4
+ export interface DefaultSearchDialogProps extends SharedProps {
8
5
  /**
9
6
  * @defaultValue 'fetch'
10
7
  */
@@ -27,6 +24,5 @@ interface DefaultSearchDialogProps extends SharedProps {
27
24
  */
28
25
  allowClear?: boolean;
29
26
  }
30
- declare function DefaultSearchDialog({ defaultTag, tags, api, delayMs, type, allowClear, ...props }: DefaultSearchDialogProps): ReactNode;
31
-
32
- export { type DefaultSearchDialogProps, DefaultSearchDialog as default };
27
+ export default function DefaultSearchDialog({ defaultTag, tags, api, delayMs, type, allowClear, ...props }: DefaultSearchDialogProps): ReactNode;
28
+ //# sourceMappingURL=search-default.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-default.d.ts","sourceRoot":"","sources":["../../../src/components/dialog/search-default.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAGjD,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,EAAE,KAAK,OAAO,EAAY,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,wBAAyB,SAAQ,WAAW;IAC3D;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAE1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IAEjB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,EAC1C,UAAU,EACV,IAAI,EACJ,GAAG,EACH,OAAO,EACP,IAAc,EACd,UAAkB,EAClB,GAAG,KAAK,EACT,EAAE,wBAAwB,GAAG,SAAS,CA8CtC"}
@@ -1,74 +1,25 @@
1
- "use client";
2
- import {
3
- TagsList
4
- } from "../../chunk-DGKCMOIC.js";
5
- import {
6
- SearchDialog
7
- } from "../../chunk-CLF6ZVYS.js";
8
- import "../../chunk-QKOA6KEZ.js";
9
- import "../../chunk-VPJMNIJX.js";
10
- import "../../chunk-TK3TM3MR.js";
11
- import "../../chunk-UUGCW3UP.js";
12
- import "../../chunk-27HFSL7N.js";
13
- import {
14
- useI18n
15
- } from "../../chunk-EFMHXXHW.js";
16
- import "../../chunk-MLKGABMK.js";
17
-
18
- // src/components/dialog/search-default.tsx
19
- import { useDocsSearch } from "fumadocs-core/search/client";
20
- import { useState } from "react";
21
- import { useOnChange } from "fumadocs-core/utils/use-on-change";
22
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
23
- function DefaultSearchDialog({
24
- defaultTag,
25
- tags,
26
- api,
27
- delayMs,
28
- type = "fetch",
29
- allowClear = false,
30
- ...props
31
- }) {
32
- const { locale } = useI18n();
33
- const [tag, setTag] = useState(defaultTag);
34
- const { search, setSearch, query } = useDocsSearch(
35
- type === "fetch" ? {
36
- type: "fetch",
37
- api
38
- } : {
39
- type: "static",
40
- from: api
41
- },
42
- locale,
43
- tag,
44
- delayMs
45
- );
46
- useOnChange(defaultTag, (v) => {
47
- setTag(v);
48
- });
49
- return /* @__PURE__ */ jsx(
50
- SearchDialog,
51
- {
52
- search,
53
- onSearchChange: setSearch,
54
- isLoading: query.isLoading,
55
- results: query.data ?? [],
56
- ...props,
57
- footer: tags ? /* @__PURE__ */ jsxs(Fragment, { children: [
58
- /* @__PURE__ */ jsx(
59
- TagsList,
60
- {
61
- tag,
62
- onTagChange: setTag,
63
- items: tags,
64
- allowClear
65
- }
66
- ),
67
- props.footer
68
- ] }) : props.footer
69
- }
70
- );
1
+ 'use client';
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useDocsSearch } from 'fumadocs-core/search/client';
4
+ import { useState } from 'react';
5
+ import { useOnChange } from 'fumadocs-core/utils/use-on-change';
6
+ import { useI18n } from '../../contexts/i18n';
7
+ import { SearchDialog } from './search';
8
+ import { TagsList } from './tag-list';
9
+ export default function DefaultSearchDialog({ defaultTag, tags, api, delayMs, type = 'fetch', allowClear = false, ...props }) {
10
+ const { locale } = useI18n();
11
+ const [tag, setTag] = useState(defaultTag);
12
+ const { search, setSearch, query } = useDocsSearch(type === 'fetch'
13
+ ? {
14
+ type: 'fetch',
15
+ api,
16
+ }
17
+ : {
18
+ type: 'static',
19
+ from: api,
20
+ }, locale, tag, delayMs);
21
+ useOnChange(defaultTag, (v) => {
22
+ setTag(v);
23
+ });
24
+ return (_jsx(SearchDialog, { search: search, onSearchChange: setSearch, isLoading: query.isLoading, results: query.data ?? [], ...props, footer: tags ? (_jsxs(_Fragment, { children: [_jsx(TagsList, { tag: tag, onTagChange: setTag, items: tags, allowClear: allowClear }), props.footer] })) : (props.footer) }));
71
25
  }
72
- export {
73
- DefaultSearchDialog as default
74
- };
@@ -1,11 +1,8 @@
1
- import { OramaCloudOptions } from 'fumadocs-core/search/client';
2
- import { ReactNode } from 'react';
3
- import { SharedProps } from './search.js';
4
- import { T as TagItem } from '../../tag-list-BsEgfE3x.js';
5
- import 'react/jsx-runtime';
6
- import 'fumadocs-core/server';
7
-
8
- interface OramaSearchDialogProps extends SharedProps {
1
+ import { type OramaCloudOptions } from 'fumadocs-core/search/client';
2
+ import { type ReactNode } from 'react';
3
+ import { type SharedProps } from './search';
4
+ import { type TagItem } from './tag-list';
5
+ export interface OramaSearchDialogProps extends SharedProps {
9
6
  client: OramaCloudOptions['client'];
10
7
  searchOptions?: OramaCloudOptions['params'];
11
8
  footer?: ReactNode;
@@ -27,6 +24,5 @@ interface OramaSearchDialogProps extends SharedProps {
27
24
  /**
28
25
  * Orama Cloud integration
29
26
  */
30
- declare function OramaSearchDialog({ client, searchOptions, tags, defaultTag, showOrama, allowClear, ...props }: OramaSearchDialogProps): ReactNode;
31
-
32
- export { type OramaSearchDialogProps, OramaSearchDialog as default };
27
+ export default function OramaSearchDialog({ client, searchOptions, tags, defaultTag, showOrama, allowClear, ...props }: OramaSearchDialogProps): ReactNode;
28
+ //# sourceMappingURL=search-orama.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-orama.d.ts","sourceRoot":"","sources":["../../../src/components/dialog/search-orama.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAEjD,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,EAAE,KAAK,OAAO,EAAY,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,sBAAuB,SAAQ,WAAW;IACzD,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACpC,aAAa,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IAEjB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EACxC,MAAM,EACN,aAAa,EACb,IAAI,EACJ,UAAU,EACV,SAAiB,EACjB,UAAkB,EAClB,GAAG,KAAK,EACT,EAAE,sBAAsB,GAAG,SAAS,CA0CpC"}
@@ -1,82 +1,25 @@
1
- "use client";
2
- import {
3
- TagsList
4
- } from "../../chunk-DGKCMOIC.js";
5
- import {
6
- SearchDialog
7
- } from "../../chunk-CLF6ZVYS.js";
8
- import "../../chunk-QKOA6KEZ.js";
9
- import "../../chunk-VPJMNIJX.js";
10
- import "../../chunk-TK3TM3MR.js";
11
- import "../../chunk-UUGCW3UP.js";
12
- import "../../chunk-27HFSL7N.js";
13
- import "../../chunk-EFMHXXHW.js";
14
- import "../../chunk-MLKGABMK.js";
15
-
16
- // src/components/dialog/search-orama.tsx
17
- import {
18
- useDocsSearch
19
- } from "fumadocs-core/search/client";
20
- import { useState } from "react";
21
- import { useOnChange } from "fumadocs-core/utils/use-on-change";
22
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
23
- function OramaSearchDialog({
24
- client,
25
- searchOptions,
26
- tags,
27
- defaultTag,
28
- showOrama = false,
29
- allowClear = false,
30
- ...props
31
- }) {
32
- const [tag, setTag] = useState(defaultTag);
33
- const { search, setSearch, query } = useDocsSearch(
34
- {
35
- type: "orama-cloud",
36
- client,
37
- params: searchOptions
38
- },
39
- void 0,
40
- tag
41
- );
42
- useOnChange(defaultTag, (v) => {
43
- setTag(v);
44
- });
45
- return /* @__PURE__ */ jsx(
46
- SearchDialog,
47
- {
48
- search,
49
- onSearchChange: setSearch,
50
- results: query.data ?? [],
51
- isLoading: query.isLoading,
52
- ...props,
53
- footer: tags ? /* @__PURE__ */ jsxs(Fragment, { children: [
54
- /* @__PURE__ */ jsx(
55
- TagsList,
56
- {
57
- tag,
58
- onTagChange: setTag,
59
- items: tags,
60
- allowClear,
61
- children: showOrama ? /* @__PURE__ */ jsx(Label, {}) : null
62
- }
63
- ),
64
- props.footer
65
- ] }) : props.footer
66
- }
67
- );
1
+ 'use client';
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useDocsSearch, } from 'fumadocs-core/search/client';
4
+ import { useState } from 'react';
5
+ import { useOnChange } from 'fumadocs-core/utils/use-on-change';
6
+ import { SearchDialog } from './search';
7
+ import { TagsList } from './tag-list';
8
+ /**
9
+ * Orama Cloud integration
10
+ */
11
+ export default function OramaSearchDialog({ client, searchOptions, tags, defaultTag, showOrama = false, allowClear = false, ...props }) {
12
+ const [tag, setTag] = useState(defaultTag);
13
+ const { search, setSearch, query } = useDocsSearch({
14
+ type: 'orama-cloud',
15
+ client,
16
+ params: searchOptions,
17
+ }, undefined, tag);
18
+ useOnChange(defaultTag, (v) => {
19
+ setTag(v);
20
+ });
21
+ return (_jsx(SearchDialog, { search: search, onSearchChange: setSearch, results: query.data ?? [], isLoading: query.isLoading, ...props, footer: tags ? (_jsxs(_Fragment, { children: [_jsx(TagsList, { tag: tag, onTagChange: setTag, items: tags, allowClear: allowClear, children: showOrama ? _jsx(Label, {}) : null }), props.footer] })) : (props.footer) }));
68
22
  }
69
23
  function Label() {
70
- return /* @__PURE__ */ jsx(
71
- "a",
72
- {
73
- href: "https://orama.com",
74
- rel: "noreferrer noopener",
75
- className: "ms-auto text-xs text-fd-muted-foreground",
76
- children: "Search powered by Orama"
77
- }
78
- );
24
+ return (_jsx("a", { href: "https://orama.com", rel: "noreferrer noopener", className: "ms-auto text-xs text-fd-muted-foreground", children: "Search powered by Orama" }));
79
25
  }
80
- export {
81
- OramaSearchDialog as default
82
- };
@@ -1,9 +1,7 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { SortedResult } from 'fumadocs-core/server';
3
- import { ReactNode } from 'react';
4
-
5
- type SearchLink = [name: string, href: string];
6
- interface SharedProps {
1
+ import type { SortedResult } from 'fumadocs-core/server';
2
+ import { type ReactNode } from 'react';
3
+ export type SearchLink = [name: string, href: string];
4
+ export interface SharedProps {
7
5
  open: boolean;
8
6
  onOpenChange: (open: boolean) => void;
9
7
  /**
@@ -24,6 +22,6 @@ interface SearchResultProps {
24
22
  items: SortedResult[];
25
23
  hideResults?: boolean;
26
24
  }
27
- declare function SearchDialog({ open, onOpenChange, footer, links, ...props }: SearchDialogProps): react_jsx_runtime.JSX.Element;
28
-
29
- export { SearchDialog, type SearchLink, type SharedProps };
25
+ export declare function SearchDialog({ open, onOpenChange, footer, links, ...props }: SearchDialogProps): import("react/jsx-runtime").JSX.Element;
26
+ export {};
27
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/components/dialog/search.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAEL,KAAK,SAAS,EAKf,MAAM,OAAO,CAAC;AAaf,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAEtD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAEtC;;OAEG;IACH,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;CACtB;AAED,KAAK,iBAAiB,GAAG,WAAW,GAClC,gBAAgB,GAChB,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,GAAG;IACjC,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAElC,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB,CAAC;AAEJ,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,UAAU,iBAAiB;IACzB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,YAAY,EACZ,MAAM,EACN,KAAU,EACV,GAAG,KAAK,EACT,EAAE,iBAAiB,2CAoCnB"}
@@ -1,14 +1,99 @@
1
- "use client";
2
- import {
3
- SearchDialog
4
- } from "../../chunk-CLF6ZVYS.js";
5
- import "../../chunk-QKOA6KEZ.js";
6
- import "../../chunk-VPJMNIJX.js";
7
- import "../../chunk-TK3TM3MR.js";
8
- import "../../chunk-UUGCW3UP.js";
9
- import "../../chunk-27HFSL7N.js";
10
- import "../../chunk-EFMHXXHW.js";
11
- import "../../chunk-MLKGABMK.js";
12
- export {
13
- SearchDialog
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { FileText, Hash, Loader2, SearchIcon, Text } from 'lucide-react';
4
+ import { useRouter } from 'next/navigation';
5
+ import { useMemo, useEffect, useState, useRef, } from 'react';
6
+ import { useI18n } from '../../contexts/i18n';
7
+ import { cn } from '../../utils/cn';
8
+ import { useSearchContext } from '../../contexts/search';
9
+ import { useSidebar } from '../../contexts/sidebar';
10
+ import { buttonVariants } from '../../components/ui/button';
11
+ import { Dialog, DialogContent, DialogOverlay, DialogTitle, } from '@radix-ui/react-dialog';
12
+ export function SearchDialog({ open, onOpenChange, footer, links = [], ...props }) {
13
+ const { text } = useI18n();
14
+ const defaultItems = useMemo(() => links.map(([name, link]) => ({
15
+ type: 'page',
16
+ id: name,
17
+ content: name,
18
+ url: link,
19
+ })), [links]);
20
+ return (_jsxs(Dialog, { open: open, onOpenChange: onOpenChange, children: [_jsx(DialogOverlay, { className: "fixed inset-0 z-50 bg-fd-background/50 backdrop-blur-sm data-[state=closed]:animate-fd-fade-out data-[state=open]:animate-fd-fade-in" }), _jsxs(DialogContent, { "aria-describedby": undefined, className: "fixed left-1/2 top-[10vh] z-50 w-[98vw] max-w-screen-sm origin-left -translate-x-1/2 rounded-lg border bg-fd-popover text-fd-popover-foreground shadow-lg data-[state=closed]:animate-fd-dialog-out data-[state=open]:animate-fd-dialog-in", children: [_jsx(DialogTitle, { className: "hidden", children: text.search }), _jsx(SearchInput, { search: props.search, onSearchChange: props.onSearchChange, isLoading: props.isLoading }), _jsx(SearchList, { items: props.results === 'empty' ? defaultItems : props.results, hideResults: props.results === 'empty' && defaultItems.length === 0 }), footer ? (_jsx("div", { className: "mt-auto flex flex-col border-t p-3", children: footer })) : null] })] }));
21
+ }
22
+ const icons = {
23
+ text: _jsx(Text, { className: "size-4 text-fd-muted-foreground" }),
24
+ heading: _jsx(Hash, { className: "size-4 text-fd-muted-foreground" }),
25
+ page: _jsx(FileText, { className: "size-4 text-fd-muted-foreground" }),
14
26
  };
27
+ function SearchInput({ search, onSearchChange, isLoading }) {
28
+ const { text } = useI18n();
29
+ const { setOpenSearch } = useSearchContext();
30
+ return (_jsxs("div", { className: "flex flex-row items-center gap-2 px-3", children: [_jsx(LoadingIndicator, { isLoading: isLoading ?? false }), _jsx("input", { value: search, onChange: (e) => {
31
+ onSearchChange(e.target.value);
32
+ }, placeholder: text.search, className: "w-0 flex-1 bg-transparent py-3 text-base placeholder:text-fd-muted-foreground focus-visible:outline-none" }), _jsx("button", { type: "button", "aria-label": "Close Search", onClick: () => {
33
+ setOpenSearch(false);
34
+ }, className: cn(buttonVariants({
35
+ color: 'outline',
36
+ className: 'text-xs p-1.5',
37
+ })), children: "Esc" })] }));
38
+ }
39
+ function SearchList({ items, hideResults = false }) {
40
+ const [active, setActive] = useState();
41
+ const { text } = useI18n();
42
+ const router = useRouter();
43
+ const sidebar = useSidebar();
44
+ const { setOpenSearch } = useSearchContext();
45
+ if (items.length > 0 &&
46
+ (!active || items.every((item) => item.id !== active))) {
47
+ setActive(items[0].id);
48
+ }
49
+ const listenerRef = useRef();
50
+ listenerRef.current = (e) => {
51
+ if (e.key === 'ArrowDown' || e.key == 'ArrowUp') {
52
+ setActive((cur) => {
53
+ const idx = items.findIndex((item) => item.id === cur);
54
+ if (idx === -1)
55
+ return items.at(0)?.id;
56
+ return items.at((e.key === 'ArrowDown' ? idx + 1 : idx - 1) % items.length)?.id;
57
+ });
58
+ e.preventDefault();
59
+ }
60
+ if (e.key === 'Enter') {
61
+ const selected = items.find((item) => item.id === active);
62
+ if (selected)
63
+ onOpen(selected.url);
64
+ e.preventDefault();
65
+ }
66
+ };
67
+ useEffect(() => {
68
+ const listener = (e) => {
69
+ listenerRef.current?.(e);
70
+ };
71
+ window.addEventListener('keydown', listener);
72
+ return () => {
73
+ window.removeEventListener('keydown', listener);
74
+ };
75
+ }, []);
76
+ const onOpen = (url) => {
77
+ router.push(url);
78
+ setOpenSearch(false);
79
+ sidebar.setOpen(false);
80
+ };
81
+ return (_jsxs("div", { className: cn('flex max-h-[460px] flex-col overflow-y-auto border-t p-2', hideResults && 'hidden'), children: [items.length === 0 ? (_jsx("div", { className: "py-12 text-center text-sm", children: text.searchNoResult })) : null, items.map((item) => (_jsxs(CommandItem, { value: item.id, active: active, onActiveChange: setActive, onClick: () => {
82
+ onOpen(item.url);
83
+ }, children: [item.type !== 'page' ? (_jsx("div", { role: "none", className: "ms-2 h-full min-h-10 w-px bg-fd-border" })) : null, icons[item.type], _jsx("p", { className: "w-0 flex-1 truncate", children: item.content })] }, item.id)))] }));
84
+ }
85
+ function LoadingIndicator({ isLoading }) {
86
+ return (_jsxs("div", { className: "relative size-4", children: [_jsx(Loader2, { className: cn('absolute size-full animate-spin text-fd-primary transition-opacity', !isLoading && 'opacity-0') }), _jsx(SearchIcon, { className: cn('absolute size-full text-fd-muted-foreground transition-opacity', isLoading && 'opacity-0') })] }));
87
+ }
88
+ function CommandItem({ active, onActiveChange, value, ...props }) {
89
+ const ref = useRef(null);
90
+ useEffect(() => {
91
+ const element = ref.current;
92
+ if (active === value && element) {
93
+ element.scrollIntoView({
94
+ block: 'nearest',
95
+ });
96
+ }
97
+ }, [active, value]);
98
+ return (_jsx("button", { ref: ref, type: "button", "aria-selected": active === value, onPointerMove: () => onActiveChange(value), ...props, className: cn('flex min-h-10 select-none flex-row items-center gap-2.5 rounded-lg px-2 text-start text-sm aria-disabled:pointer-events-none aria-disabled:opacity-50 aria-selected:bg-fd-accent aria-selected:text-fd-accent-foreground', props.className), children: props.children }));
99
+ }
@@ -0,0 +1,13 @@
1
+ import type { HTMLAttributes } from 'react';
2
+ export interface TagItem {
3
+ name: string;
4
+ value: string | undefined;
5
+ }
6
+ export interface TagsListProps extends HTMLAttributes<HTMLDivElement> {
7
+ tag?: string;
8
+ onTagChange: (tag: string | undefined) => void;
9
+ allowClear?: boolean;
10
+ items: TagItem[];
11
+ }
12
+ export declare function TagsList({ tag, onTagChange, items, allowClear, ...props }: TagsListProps): import("react/jsx-runtime").JSX.Element;
13
+ //# sourceMappingURL=tag-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag-list.d.ts","sourceRoot":"","sources":["../../../src/components/dialog/tag-list.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAI5C,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,aAAc,SAAQ,cAAc,CAAC,cAAc,CAAC;IACnE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAC/C,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,KAAK,EAAE,OAAO,EAAE,CAAC;CAClB;AAaD,wBAAgB,QAAQ,CAAC,EACvB,GAAG,EACH,WAAW,EACX,KAAK,EACL,UAAU,EACV,GAAG,KAAK,EACT,EAAE,aAAa,2CA0Bf"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cva } from 'class-variance-authority';
3
+ import { cn } from '../../utils/cn';
4
+ const itemVariants = cva('rounded-md border px-2 py-0.5 text-xs font-medium text-fd-muted-foreground transition-colors', {
5
+ variants: {
6
+ active: {
7
+ true: 'bg-fd-accent text-fd-accent-foreground',
8
+ },
9
+ },
10
+ });
11
+ export function TagsList({ tag, onTagChange, items, allowClear, ...props }) {
12
+ return (_jsxs("div", { ...props, className: cn('flex flex-row items-center gap-1', props.className), children: [items.map((item) => (_jsx("button", { type: "button", className: cn(itemVariants({ active: tag === item.value })), onClick: () => {
13
+ if (tag === item.value && allowClear) {
14
+ onTagChange(undefined);
15
+ }
16
+ else {
17
+ onTagChange(item.value);
18
+ }
19
+ }, tabIndex: -1, children: item.name }, item.value))), props.children] }));
20
+ }
@@ -1,11 +1,10 @@
1
- import { HTMLAttributes, ReactNode } from 'react';
2
-
3
- declare function Files({ className, ...props }: HTMLAttributes<HTMLDivElement>): React.ReactElement;
4
- interface FileProps extends HTMLAttributes<HTMLDivElement> {
1
+ import { type HTMLAttributes, type ReactNode } from 'react';
2
+ export declare function Files({ className, ...props }: HTMLAttributes<HTMLDivElement>): React.ReactElement;
3
+ export interface FileProps extends HTMLAttributes<HTMLDivElement> {
5
4
  name: string;
6
5
  icon?: ReactNode;
7
6
  }
8
- interface FolderProps extends HTMLAttributes<HTMLDivElement> {
7
+ export interface FolderProps extends HTMLAttributes<HTMLDivElement> {
9
8
  name: string;
10
9
  disabled?: boolean;
11
10
  /**
@@ -15,7 +14,6 @@ interface FolderProps extends HTMLAttributes<HTMLDivElement> {
15
14
  */
16
15
  defaultOpen?: boolean;
17
16
  }
18
- declare function File({ name, icon, className, ...rest }: FileProps): React.ReactElement;
19
- declare function Folder({ name, defaultOpen, ...props }: FolderProps): React.ReactElement;
20
-
21
- export { File, type FileProps, Files, Folder, type FolderProps };
17
+ export declare function File({ name, icon, className, ...rest }: FileProps): React.ReactElement;
18
+ export declare function Folder({ name, defaultOpen, ...props }: FolderProps): React.ReactElement;
19
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/components/files.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAY,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAYtE,wBAAgB,KAAK,CAAC,EACpB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,YAAY,CASrD;AAED,MAAM,WAAW,SAAU,SAAQ,cAAc,CAAC,cAAc,CAAC;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,WAAY,SAAQ,cAAc,CAAC,cAAc,CAAC;IACjE,IAAI,EAAE,MAAM,CAAC;IAEb,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,IAAI,CAAC,EACnB,IAAI,EACJ,IAAmB,EACnB,SAAS,EACT,GAAG,IAAI,EACR,EAAE,SAAS,GAAG,KAAK,CAAC,YAAY,CAOhC;AAED,wBAAgB,MAAM,CAAC,EACrB,IAAI,EACJ,WAAmB,EACnB,GAAG,KAAK,EACT,EAAE,WAAW,GAAG,KAAK,CAAC,YAAY,CAclC"}