@baybreezy/docd 0.0.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 (268) hide show
  1. package/app/app.config.ts +239 -0
  2. package/app/app.vue +19 -0
  3. package/app/assets/css/tailwind.css +335 -0
  4. package/app/assets/css/theme.css +1171 -0
  5. package/app/components/OgImage/Docs.takumi.vue +69 -0
  6. package/app/components/OgImage/Landing.takumi.vue +64 -0
  7. package/app/components/OgImage/Site.takumi.vue +32 -0
  8. package/app/components/Ui/Avatar/Avatar.vue +75 -0
  9. package/app/components/Ui/Avatar/Badge.vue +34 -0
  10. package/app/components/Ui/Avatar/Fallback.vue +30 -0
  11. package/app/components/Ui/Avatar/Group.vue +29 -0
  12. package/app/components/Ui/Avatar/GroupCount.vue +29 -0
  13. package/app/components/Ui/Avatar/Image.vue +29 -0
  14. package/app/components/Ui/Badge.vue +86 -0
  15. package/app/components/Ui/BadgeGroup.vue +314 -0
  16. package/app/components/Ui/BgPattern/Grid.vue +137 -0
  17. package/app/components/Ui/BorderBeam.vue +97 -0
  18. package/app/components/Ui/Breadcrumbs.vue +103 -0
  19. package/app/components/Ui/Button.vue +169 -0
  20. package/app/components/Ui/ButtonGroup/ButtonGroup.vue +54 -0
  21. package/app/components/Ui/ButtonGroup/Separator.vue +38 -0
  22. package/app/components/Ui/ButtonGroup/Text.vue +33 -0
  23. package/app/components/Ui/Card/Action.vue +31 -0
  24. package/app/components/Ui/Card/Card.vue +58 -0
  25. package/app/components/Ui/Card/Content.vue +34 -0
  26. package/app/components/Ui/Card/Description.vue +36 -0
  27. package/app/components/Ui/Card/Footer.vue +31 -0
  28. package/app/components/Ui/Card/Header.vue +31 -0
  29. package/app/components/Ui/Card/Title.vue +37 -0
  30. package/app/components/Ui/Collapsible/Collapsible.vue +16 -0
  31. package/app/components/Ui/Collapsible/Content.vue +27 -0
  32. package/app/components/Ui/Collapsible/Trigger.vue +13 -0
  33. package/app/components/Ui/Command/Command.vue +115 -0
  34. package/app/components/Ui/Command/Dialog.vue +65 -0
  35. package/app/components/Ui/Command/Empty.vue +32 -0
  36. package/app/components/Ui/Command/Footer.vue +40 -0
  37. package/app/components/Ui/Command/Group.vue +58 -0
  38. package/app/components/Ui/Command/Input.vue +57 -0
  39. package/app/components/Ui/Command/Item.vue +102 -0
  40. package/app/components/Ui/Command/List.vue +33 -0
  41. package/app/components/Ui/Command/Separator.vue +30 -0
  42. package/app/components/Ui/Command/Shortcut.vue +28 -0
  43. package/app/components/Ui/Container.vue +46 -0
  44. package/app/components/Ui/ContextMenu/Arrow.vue +43 -0
  45. package/app/components/Ui/ContextMenu/CheckboxItem.vue +42 -0
  46. package/app/components/Ui/ContextMenu/Content.vue +53 -0
  47. package/app/components/Ui/ContextMenu/ContextMenu.vue +14 -0
  48. package/app/components/Ui/ContextMenu/Group.vue +12 -0
  49. package/app/components/Ui/ContextMenu/Item.vue +65 -0
  50. package/app/components/Ui/ContextMenu/ItemIndicator.vue +30 -0
  51. package/app/components/Ui/ContextMenu/Label.vue +35 -0
  52. package/app/components/Ui/ContextMenu/Portal.vue +12 -0
  53. package/app/components/Ui/ContextMenu/RadioGroup.vue +16 -0
  54. package/app/components/Ui/ContextMenu/RadioItem.vue +40 -0
  55. package/app/components/Ui/ContextMenu/Separator.vue +25 -0
  56. package/app/components/Ui/ContextMenu/Shortcut.vue +30 -0
  57. package/app/components/Ui/ContextMenu/Sub.vue +15 -0
  58. package/app/components/Ui/ContextMenu/SubContent.vue +55 -0
  59. package/app/components/Ui/ContextMenu/SubTrigger.vue +42 -0
  60. package/app/components/Ui/ContextMenu/Trigger.vue +12 -0
  61. package/app/components/Ui/Dialog/Close.vue +12 -0
  62. package/app/components/Ui/Dialog/Content.vue +79 -0
  63. package/app/components/Ui/Dialog/Description.vue +29 -0
  64. package/app/components/Ui/Dialog/Dialog.vue +14 -0
  65. package/app/components/Ui/Dialog/Footer.vue +32 -0
  66. package/app/components/Ui/Dialog/Header.vue +32 -0
  67. package/app/components/Ui/Dialog/Overlay.vue +25 -0
  68. package/app/components/Ui/Dialog/Portal.vue +12 -0
  69. package/app/components/Ui/Dialog/Title.vue +29 -0
  70. package/app/components/Ui/Dialog/Trigger.vue +12 -0
  71. package/app/components/Ui/Divider.vue +102 -0
  72. package/app/components/Ui/Drawer/Close.vue +12 -0
  73. package/app/components/Ui/Drawer/Content.vue +67 -0
  74. package/app/components/Ui/Drawer/Description.vue +33 -0
  75. package/app/components/Ui/Drawer/Drawer.vue +17 -0
  76. package/app/components/Ui/Drawer/Footer.vue +35 -0
  77. package/app/components/Ui/Drawer/Header.vue +34 -0
  78. package/app/components/Ui/Drawer/Overlay.vue +20 -0
  79. package/app/components/Ui/Drawer/Portal.vue +12 -0
  80. package/app/components/Ui/Drawer/Title.vue +35 -0
  81. package/app/components/Ui/Drawer/Trigger.vue +12 -0
  82. package/app/components/Ui/DropdownMenu/Arrow.vue +43 -0
  83. package/app/components/Ui/DropdownMenu/CheckboxItem.vue +41 -0
  84. package/app/components/Ui/DropdownMenu/Content.vue +56 -0
  85. package/app/components/Ui/DropdownMenu/DropdownMenu.vue +15 -0
  86. package/app/components/Ui/DropdownMenu/Group.vue +12 -0
  87. package/app/components/Ui/DropdownMenu/Item.vue +64 -0
  88. package/app/components/Ui/DropdownMenu/ItemIndicator.vue +32 -0
  89. package/app/components/Ui/DropdownMenu/Label.vue +34 -0
  90. package/app/components/Ui/DropdownMenu/Portal.vue +12 -0
  91. package/app/components/Ui/DropdownMenu/RadioGroup.vue +16 -0
  92. package/app/components/Ui/DropdownMenu/RadioItem.vue +40 -0
  93. package/app/components/Ui/DropdownMenu/Separator.vue +25 -0
  94. package/app/components/Ui/DropdownMenu/Shortcut.vue +44 -0
  95. package/app/components/Ui/DropdownMenu/Sub.vue +14 -0
  96. package/app/components/Ui/DropdownMenu/SubContent.vue +56 -0
  97. package/app/components/Ui/DropdownMenu/SubTrigger.vue +47 -0
  98. package/app/components/Ui/DropdownMenu/Trigger.vue +12 -0
  99. package/app/components/Ui/FancyIcon.vue +243 -0
  100. package/app/components/Ui/GradientDivider.vue +26 -0
  101. package/app/components/Ui/IframeLazy.vue +97 -0
  102. package/app/components/Ui/Input.vue +97 -0
  103. package/app/components/Ui/InputGroup/Addon.vue +66 -0
  104. package/app/components/Ui/InputGroup/Button.vue +50 -0
  105. package/app/components/Ui/InputGroup/Input.vue +25 -0
  106. package/app/components/Ui/InputGroup/InputGroup.vue +44 -0
  107. package/app/components/Ui/InputGroup/Text.vue +33 -0
  108. package/app/components/Ui/InputGroup/Textarea.vue +25 -0
  109. package/app/components/Ui/Kbd/Group.vue +32 -0
  110. package/app/components/Ui/Kbd/Kbd.vue +62 -0
  111. package/app/components/Ui/Label.vue +40 -0
  112. package/app/components/Ui/Popover/Anchor.vue +13 -0
  113. package/app/components/Ui/Popover/Arrow.vue +42 -0
  114. package/app/components/Ui/Popover/Close.vue +13 -0
  115. package/app/components/Ui/Popover/Content.vue +55 -0
  116. package/app/components/Ui/Popover/Popover.vue +15 -0
  117. package/app/components/Ui/Popover/Portal.vue +13 -0
  118. package/app/components/Ui/Popover/Trigger.vue +12 -0
  119. package/app/components/Ui/Popover/X.vue +38 -0
  120. package/app/components/Ui/ScrollArea/Corner.vue +12 -0
  121. package/app/components/Ui/ScrollArea/ScrollArea.vue +38 -0
  122. package/app/components/Ui/ScrollArea/Scrollbar.vue +39 -0
  123. package/app/components/Ui/ScrollArea/Thumb.vue +39 -0
  124. package/app/components/Ui/ScrollArea/Viewport.vue +27 -0
  125. package/app/components/Ui/Scrollspy.vue +61 -0
  126. package/app/components/Ui/Separator.vue +40 -0
  127. package/app/components/Ui/Skeleton.vue +39 -0
  128. package/app/components/Ui/Sonner.vue +25 -0
  129. package/app/components/Ui/Tabs/Content.vue +27 -0
  130. package/app/components/Ui/Tabs/Indicator.vue +37 -0
  131. package/app/components/Ui/Tabs/List.vue +37 -0
  132. package/app/components/Ui/Tabs/Tabs.vue +25 -0
  133. package/app/components/Ui/Tabs/Trigger.vue +41 -0
  134. package/app/components/Ui/Textarea.vue +81 -0
  135. package/app/components/Ui/Tooltip/Arrow.vue +30 -0
  136. package/app/components/Ui/Tooltip/Content.vue +50 -0
  137. package/app/components/Ui/Tooltip/Portal.vue +12 -0
  138. package/app/components/Ui/Tooltip/Provider.vue +14 -0
  139. package/app/components/Ui/Tooltip/Tooltip.vue +25 -0
  140. package/app/components/Ui/Tooltip/Trigger.vue +12 -0
  141. package/app/components/Ui/Tree/Item.vue +15 -0
  142. package/app/components/Ui/Tree/Tree.vue +15 -0
  143. package/app/components/Ui/Tree/Virtualizer.vue +13 -0
  144. package/app/components/component-api/ComponentApiSection.vue +135 -0
  145. package/app/components/content/docs/Callout/DocsCallout.vue +99 -0
  146. package/app/components/content/prose/ProseA.global.vue +31 -0
  147. package/app/components/content/prose/ProseBlockquote.global.vue +28 -0
  148. package/app/components/content/prose/ProseCallout.global.vue +306 -0
  149. package/app/components/content/prose/ProseCard.global.vue +100 -0
  150. package/app/components/content/prose/ProseCodeCollapse.global.vue +125 -0
  151. package/app/components/content/prose/ProseCodeCopy.global.vue +67 -0
  152. package/app/components/content/prose/ProseCodeGroup.global.vue +104 -0
  153. package/app/components/content/prose/ProseCodeTree.global.vue +277 -0
  154. package/app/components/content/prose/ProseCollapsible.global.vue +64 -0
  155. package/app/components/content/prose/ProseColorModeImage.global.vue +58 -0
  156. package/app/components/content/prose/ProseComponentApi.global.vue +104 -0
  157. package/app/components/content/prose/ProseComponentEvents.global.vue +27 -0
  158. package/app/components/content/prose/ProseComponentExposed.global.vue +27 -0
  159. package/app/components/content/prose/ProseComponentProps.global.vue +27 -0
  160. package/app/components/content/prose/ProseComponentSlots.global.vue +27 -0
  161. package/app/components/content/prose/ProseEm.global.vue +5 -0
  162. package/app/components/content/prose/ProseField.global.vue +118 -0
  163. package/app/components/content/prose/ProseFieldGroup.global.vue +62 -0
  164. package/app/components/content/prose/ProseH1.global.vue +58 -0
  165. package/app/components/content/prose/ProseH2.global.vue +58 -0
  166. package/app/components/content/prose/ProseH3.global.vue +58 -0
  167. package/app/components/content/prose/ProseH4.global.vue +58 -0
  168. package/app/components/content/prose/ProseH5.global.vue +47 -0
  169. package/app/components/content/prose/ProseH6.global.vue +47 -0
  170. package/app/components/content/prose/ProseHr.global.vue +33 -0
  171. package/app/components/content/prose/ProseIconList.global.vue +113 -0
  172. package/app/components/content/prose/ProseImg.global.vue +119 -0
  173. package/app/components/content/prose/ProseLead.global.vue +28 -0
  174. package/app/components/content/prose/ProseLi.global.vue +25 -0
  175. package/app/components/content/prose/ProseMermaid.global.vue +127 -0
  176. package/app/components/content/prose/ProseOl.global.vue +25 -0
  177. package/app/components/content/prose/ProseP.global.vue +25 -0
  178. package/app/components/content/prose/ProsePmInstall.global.vue +60 -0
  179. package/app/components/content/prose/ProsePmRun.global.vue +51 -0
  180. package/app/components/content/prose/ProsePmX.global.vue +56 -0
  181. package/app/components/content/prose/ProsePre.global.vue +181 -0
  182. package/app/components/content/prose/ProseShowCase.global.vue +56 -0
  183. package/app/components/content/prose/ProseSmartIcon.global.vue +54 -0
  184. package/app/components/content/prose/ProseStep.global.vue +22 -0
  185. package/app/components/content/prose/ProseSteps.global.vue +22 -0
  186. package/app/components/content/prose/ProseStrong.global.vue +34 -0
  187. package/app/components/content/prose/ProseTable.global.vue +34 -0
  188. package/app/components/content/prose/ProseTabs.global.vue +104 -0
  189. package/app/components/content/prose/ProseTabsInner.global.vue +274 -0
  190. package/app/components/content/prose/ProseTbody.global.vue +5 -0
  191. package/app/components/content/prose/ProseTd.global.vue +25 -0
  192. package/app/components/content/prose/ProseTh.global.vue +25 -0
  193. package/app/components/content/prose/ProseThead.global.vue +9 -0
  194. package/app/components/content/prose/ProseTr.global.vue +35 -0
  195. package/app/components/content/prose/ProseUl.global.vue +25 -0
  196. package/app/components/docs/DocsExtraStuff.vue +39 -0
  197. package/app/components/docs/DocsGithubLink.vue +11 -0
  198. package/app/components/docs/DocsHeader.vue +3 -0
  199. package/app/components/docs/DocsLogo.vue +74 -0
  200. package/app/components/docs/DocsMobileBar.vue +26 -0
  201. package/app/components/docs/DocsMobileNav.vue +49 -0
  202. package/app/components/docs/DocsNav.vue +161 -0
  203. package/app/components/docs/DocsPageTransition.vue +32 -0
  204. package/app/components/docs/DocsSearch.vue +220 -0
  205. package/app/components/docs/DocsSearchButton.vue +20 -0
  206. package/app/components/docs/DocsThemeCustomizer.vue +229 -0
  207. package/app/components/docs/DocsThemeToggler.vue +98 -0
  208. package/app/components/docs/DocsTocRail.vue +162 -0
  209. package/app/components/docs/DocsToclink.vue +52 -0
  210. package/app/components/docs/DocsZigZagRail.vue +70 -0
  211. package/app/components/landing/Hero.vue +222 -0
  212. package/app/components/page/PageFooter.vue +49 -0
  213. package/app/components/page/PageHeader.vue +68 -0
  214. package/app/components/page/PageHeaderLinks.vue +138 -0
  215. package/app/components/page/PageMobileToc.vue +162 -0
  216. package/app/components/page/PageToc.vue +33 -0
  217. package/app/composables/useDefaultSlotItems.ts +90 -0
  218. package/app/composables/useDocPage.ts +66 -0
  219. package/app/composables/useDocSearch.ts +23 -0
  220. package/app/composables/useDocd.ts +107 -0
  221. package/app/composables/useLogoAssets.ts +319 -0
  222. package/app/composables/usePm.ts +73 -0
  223. package/app/composables/useProseComponentMeta.ts +30 -0
  224. package/app/composables/useScrollspy.ts +327 -0
  225. package/app/composables/useSeo.ts +240 -0
  226. package/app/composables/useUIConfig.ts +36 -0
  227. package/app/layouts/default.vue +5 -0
  228. package/app/layouts/docs.vue +64 -0
  229. package/app/middleware/colorMode.global.ts +8 -0
  230. package/app/middleware/doc-page-layout.ts +11 -0
  231. package/app/middleware/landing-page-layout.ts +11 -0
  232. package/app/pages/[...slug].vue +63 -0
  233. package/app/plugins/mermaid.client.ts +35 -0
  234. package/app/plugins/navigation-direction.client.ts +15 -0
  235. package/app/plugins/theme-restore.client.ts +7 -0
  236. package/app/templates/landing.vue +40 -0
  237. package/app/transitions/presets.ts +71 -0
  238. package/app/types/prose-component-meta.d.ts +4 -0
  239. package/app/utils/og.ts +26 -0
  240. package/app/utils/prerender.ts +9 -0
  241. package/app/utils/translucent.ts +56 -0
  242. package/app/utils/tw-helper.ts +4 -0
  243. package/content.config.ts +81 -0
  244. package/index.d.ts +25 -0
  245. package/modules/config.ts +89 -0
  246. package/modules/custom-icons.ts +17 -0
  247. package/modules/markdown-rewrite.ts +96 -0
  248. package/modules/prose-component-meta.ts +150 -0
  249. package/modules/routing.ts +22 -0
  250. package/modules/skills/index.ts +167 -0
  251. package/modules/skills/runtime/server/routes/skills-files.ts +49 -0
  252. package/modules/skills/runtime/server/routes/skills-index.ts +8 -0
  253. package/nuxt.config.ts +96 -0
  254. package/nuxt.schema.ts +288 -0
  255. package/package.json +95 -0
  256. package/server/mcp/tools/get-page.ts +66 -0
  257. package/server/mcp/tools/list-pages.ts +61 -0
  258. package/server/routes/sitemap.xml.ts +73 -0
  259. package/server/utils/content.ts +3 -0
  260. package/tailwind.config.cjs +55 -0
  261. package/utils/component-api-content.ts +467 -0
  262. package/utils/component-api-discovery.ts +165 -0
  263. package/utils/component-api-schema.ts +28 -0
  264. package/utils/component-api.ts +243 -0
  265. package/utils/generate-prose-component-meta.ts +303 -0
  266. package/utils/git.ts +123 -0
  267. package/utils/meta.ts +40 -0
  268. package/utils/pages.ts +21 -0
@@ -0,0 +1,314 @@
1
+ <template>
2
+ <div :class="rootClass" data-slot="badge-group">
3
+ <template v-if="align === 'trailing'">
4
+ <span
5
+ v-if="theme === 'modern'"
6
+ class="relative inline-flex shrink-0"
7
+ data-slot="badge-group-dot-wrapper"
8
+ >
9
+ <span v-if="pulse" :class="dotClass" class="absolute animate-ping opacity-75" />
10
+ <span :class="dotClass" data-slot="badge-group-dot" />
11
+ </span>
12
+ <slot />
13
+ <span :class="addonClass" data-slot="badge-group-addon">
14
+ {{ addonText }}
15
+ <Icon v-if="icon" :name="icon" :class="iconClass" data-slot="badge-group-icon" />
16
+ </span>
17
+ </template>
18
+ <template v-else>
19
+ <span :class="addonClass" data-slot="badge-group-addon">
20
+ <span
21
+ v-if="theme === 'modern'"
22
+ class="relative inline-flex shrink-0"
23
+ data-slot="badge-group-dot-wrapper"
24
+ >
25
+ <span v-if="pulse" :class="dotClass" class="absolute animate-ping opacity-75" />
26
+ <span :class="dotClass" data-slot="badge-group-dot" />
27
+ </span>
28
+ {{ addonText }}
29
+ </span>
30
+ <slot />
31
+ <Icon v-if="icon" :name="icon" :class="iconClass" data-slot="badge-group-icon" />
32
+ </template>
33
+ </div>
34
+ </template>
35
+
36
+ <script lang="ts">
37
+ import { normalizeClass } from "vue";
38
+ import type { HTMLAttributes } from "vue";
39
+
40
+ export type BadgeGroupSize = "md" | "lg";
41
+ export type BadgeGroupColor =
42
+ | "primary"
43
+ | "gray"
44
+ | "red"
45
+ | "orange"
46
+ | "amber"
47
+ | "yellow"
48
+ | "lime"
49
+ | "green"
50
+ | "emerald"
51
+ | "teal"
52
+ | "cyan"
53
+ | "sky"
54
+ | "blue"
55
+ | "indigo"
56
+ | "violet"
57
+ | "purple"
58
+ | "fuchsia"
59
+ | "pink"
60
+ | "rose"
61
+ | "error"
62
+ | "warning"
63
+ | "success";
64
+ export type BadgeGroupTheme = "light" | "modern";
65
+ export type BadgeGroupAlign = "leading" | "trailing";
66
+ </script>
67
+
68
+ <script setup lang="ts">
69
+ const props = withDefaults(
70
+ defineProps<{
71
+ /** The text shown in the badge addon pill */
72
+ addonText: string;
73
+ /** Size of the badge group */
74
+ size?: BadgeGroupSize;
75
+ /** Color variant — only applies to the light theme */
76
+ color?: BadgeGroupColor;
77
+ /** Visual theme: pill-style (light) or card-style with dot (modern) */
78
+ theme?: BadgeGroupTheme;
79
+ /** Whether the badge addon appears before or after the main text */
80
+ align?: BadgeGroupAlign;
81
+ /** Icon name passed to `<Icon>`. Set to `false` to hide the icon. */
82
+ icon?: string | false;
83
+ /** Animate the modern theme dot with a ping pulse */
84
+ pulse?: boolean;
85
+ /** Additional classes applied to the root element */
86
+ class?: HTMLAttributes["class"];
87
+ }>(),
88
+ {
89
+ size: "md",
90
+ color: "primary",
91
+ theme: "light",
92
+ align: "leading",
93
+ icon: "lucide:arrow-right",
94
+ }
95
+ );
96
+
97
+ const slots = useSlots();
98
+
99
+ const hasText = computed(() => {
100
+ const nodes = slots.default?.();
101
+ return !!(nodes && nodes.length > 0);
102
+ });
103
+
104
+ const hasIcon = computed(() => !!props.icon);
105
+
106
+ // ─── Color maps ──────────────────────────────────────────────────────────────
107
+
108
+ const lightRootColors: Record<BadgeGroupColor, string> = {
109
+ primary:
110
+ "bg-primary/10 dark:bg-primary/20 text-primary dark:text-primary ring-primary/20 dark:ring-primary/40 hover:bg-primary/15 dark:hover:bg-primary/30",
111
+ gray: "bg-gray-50 dark:bg-gray-800 text-gray-700 dark:text-gray-200 ring-gray-200 dark:ring-gray-500 hover:bg-gray-100 dark:hover:bg-gray-700",
112
+ red: "bg-red-50 dark:bg-red-900/50 text-red-700 dark:text-red-300 ring-red-200 dark:ring-red-500 hover:bg-red-100 dark:hover:bg-red-900",
113
+ orange:
114
+ "bg-orange-50 dark:bg-orange-900/50 text-orange-700 dark:text-orange-300 ring-orange-200 dark:ring-orange-500 hover:bg-orange-100 dark:hover:bg-orange-900",
115
+ amber:
116
+ "bg-amber-50 dark:bg-amber-900/50 text-amber-700 dark:text-amber-300 ring-amber-200 dark:ring-amber-500 hover:bg-amber-100 dark:hover:bg-amber-900",
117
+ yellow:
118
+ "bg-yellow-50 dark:bg-yellow-900/50 text-yellow-700 dark:text-yellow-300 ring-yellow-200 dark:ring-yellow-500 hover:bg-yellow-100 dark:hover:bg-yellow-900",
119
+ lime: "bg-lime-50 dark:bg-lime-900/50 text-lime-700 dark:text-lime-300 ring-lime-200 dark:ring-lime-500 hover:bg-lime-100 dark:hover:bg-lime-900",
120
+ green:
121
+ "bg-green-50 dark:bg-green-900/50 text-green-700 dark:text-green-300 ring-green-200 dark:ring-green-500 hover:bg-green-100 dark:hover:bg-green-900",
122
+ emerald:
123
+ "bg-emerald-50 dark:bg-emerald-900/50 text-emerald-700 dark:text-emerald-300 ring-emerald-200 dark:ring-emerald-500 hover:bg-emerald-100 dark:hover:bg-emerald-900",
124
+ teal: "bg-teal-50 dark:bg-teal-900/50 text-teal-700 dark:text-teal-300 ring-teal-200 dark:ring-teal-500 hover:bg-teal-100 dark:hover:bg-teal-900",
125
+ cyan: "bg-cyan-50 dark:bg-cyan-900/50 text-cyan-700 dark:text-cyan-300 ring-cyan-200 dark:ring-cyan-500 hover:bg-cyan-100 dark:hover:bg-cyan-900",
126
+ sky: "bg-sky-50 dark:bg-sky-900/50 text-sky-700 dark:text-sky-300 ring-sky-200 dark:ring-sky-500 hover:bg-sky-100 dark:hover:bg-sky-900",
127
+ blue: "bg-blue-50 dark:bg-blue-900/50 text-blue-700 dark:text-blue-300 ring-blue-200 dark:ring-blue-500 hover:bg-blue-100 dark:hover:bg-blue-900",
128
+ indigo:
129
+ "bg-indigo-50 dark:bg-indigo-900/50 text-indigo-700 dark:text-indigo-300 ring-indigo-200 dark:ring-indigo-500 hover:bg-indigo-100 dark:hover:bg-indigo-900",
130
+ violet:
131
+ "bg-violet-50 dark:bg-violet-900/50 text-violet-700 dark:text-violet-300 ring-violet-200 dark:ring-violet-500 hover:bg-violet-100 dark:hover:bg-violet-900",
132
+ purple:
133
+ "bg-purple-50 dark:bg-purple-900/50 text-purple-700 dark:text-purple-300 ring-purple-200 dark:ring-purple-500 hover:bg-purple-100 dark:hover:bg-purple-900",
134
+ fuchsia:
135
+ "bg-fuchsia-50 dark:bg-fuchsia-900/50 text-fuchsia-700 dark:text-fuchsia-300 ring-fuchsia-200 dark:ring-fuchsia-500 hover:bg-fuchsia-100 dark:hover:bg-fuchsia-900",
136
+ pink: "bg-pink-50 dark:bg-pink-900/50 text-pink-700 dark:text-pink-300 ring-pink-200 dark:ring-pink-500 hover:bg-pink-100 dark:hover:bg-pink-900",
137
+ rose: "bg-rose-50 dark:bg-rose-900/50 text-rose-700 dark:text-rose-300 ring-rose-200 dark:ring-rose-500 hover:bg-rose-100 dark:hover:bg-rose-900",
138
+ error:
139
+ "bg-red-50 dark:bg-red-900/50 text-red-700 dark:text-red-300 ring-red-200 dark:ring-red-500 hover:bg-red-100 dark:hover:bg-red-900",
140
+ warning:
141
+ "bg-yellow-50 dark:bg-yellow-900/50 text-yellow-700 dark:text-yellow-300 ring-yellow-200 dark:ring-yellow-500 hover:bg-yellow-100 dark:hover:bg-yellow-900",
142
+ success:
143
+ "bg-green-50 dark:bg-green-900/50 text-green-700 dark:text-green-300 ring-green-200 dark:ring-green-500 hover:bg-green-100 dark:hover:bg-green-900",
144
+ };
145
+
146
+ const lightAddonColors: Record<BadgeGroupColor, string> = {
147
+ primary: "bg-background text-current ring-primary/20 dark:ring-primary/40",
148
+ gray: "bg-background text-current ring-gray-200 dark:ring-gray-500",
149
+ red: "bg-background text-current ring-red-200 dark:ring-red-500",
150
+ orange: "bg-background text-current ring-orange-200 dark:ring-orange-500",
151
+ amber: "bg-background text-current ring-amber-200 dark:ring-amber-500",
152
+ yellow: "bg-background text-current ring-yellow-200 dark:ring-yellow-500",
153
+ lime: "bg-background text-current ring-lime-200 dark:ring-lime-500",
154
+ green: "bg-background text-current ring-green-200 dark:ring-green-500",
155
+ emerald: "bg-background text-current ring-emerald-200 dark:ring-emerald-500",
156
+ teal: "bg-background text-current ring-teal-200 dark:ring-teal-500",
157
+ cyan: "bg-background text-current ring-cyan-200 dark:ring-cyan-500",
158
+ sky: "bg-background text-current ring-sky-200 dark:ring-sky-500",
159
+ blue: "bg-background text-current ring-blue-200 dark:ring-blue-500",
160
+ indigo: "bg-background text-current ring-indigo-200 dark:ring-indigo-500",
161
+ violet: "bg-background text-current ring-violet-200 dark:ring-violet-500",
162
+ purple: "bg-background text-current ring-purple-200 dark:ring-purple-500",
163
+ fuchsia: "bg-background text-current ring-fuchsia-200 dark:ring-fuchsia-500",
164
+ pink: "bg-background text-current ring-pink-200 dark:ring-pink-500",
165
+ rose: "bg-background text-current ring-rose-200 dark:ring-rose-500",
166
+ error: "bg-background text-current ring-red-200 dark:ring-red-500",
167
+ warning: "bg-background text-current ring-yellow-200 dark:ring-yellow-500",
168
+ success: "bg-background text-current ring-green-200 dark:ring-green-500",
169
+ };
170
+
171
+ const lightIconColors: Record<BadgeGroupColor, string> = {
172
+ primary: "text-primary",
173
+ gray: "text-gray-500",
174
+ red: "text-red-500",
175
+ orange: "text-orange-500",
176
+ amber: "text-amber-500",
177
+ yellow: "text-yellow-500",
178
+ lime: "text-lime-500",
179
+ green: "text-green-500",
180
+ emerald: "text-emerald-500",
181
+ teal: "text-teal-500",
182
+ cyan: "text-cyan-500",
183
+ sky: "text-sky-500",
184
+ blue: "text-blue-500",
185
+ indigo: "text-indigo-500",
186
+ violet: "text-violet-500",
187
+ purple: "text-purple-500",
188
+ fuchsia: "text-fuchsia-500",
189
+ pink: "text-pink-500",
190
+ rose: "text-rose-500",
191
+ error: "text-red-500",
192
+ warning: "text-yellow-500",
193
+ success: "text-green-500",
194
+ };
195
+
196
+ const modernDotColors: Record<BadgeGroupColor, string> = {
197
+ primary: "bg-primary outline-3 -outline-offset-1 outline-primary/20 dark:outline-primary/30",
198
+ gray: "bg-gray-500 outline-3 -outline-offset-1 outline-gray-100 dark:outline-gray-600/50",
199
+ red: "bg-red-500 outline-3 -outline-offset-1 outline-red-100 dark:outline-red-600/50",
200
+ orange:
201
+ "bg-orange-500 outline-3 -outline-offset-1 outline-orange-100 dark:outline-orange-600/50",
202
+ amber: "bg-amber-500 outline-3 -outline-offset-1 outline-amber-100 dark:outline-amber-600/50",
203
+ yellow:
204
+ "bg-yellow-500 outline-3 -outline-offset-1 outline-yellow-100 dark:outline-yellow-600/50",
205
+ lime: "bg-lime-500 outline-3 -outline-offset-1 outline-lime-100 dark:outline-lime-600/50",
206
+ green: "bg-green-500 outline-3 -outline-offset-1 outline-green-100 dark:outline-green-600/50",
207
+ emerald:
208
+ "bg-emerald-500 outline-3 -outline-offset-1 outline-emerald-100 dark:outline-emerald-600/50",
209
+ teal: "bg-teal-500 outline-3 -outline-offset-1 outline-teal-100 dark:outline-teal-600/50",
210
+ cyan: "bg-cyan-500 outline-3 -outline-offset-1 outline-cyan-100 dark:outline-cyan-600/50",
211
+ sky: "bg-sky-500 outline-3 -outline-offset-1 outline-sky-100 dark:outline-sky-600/50",
212
+ blue: "bg-blue-500 outline-3 -outline-offset-1 outline-blue-100 dark:outline-blue-600/50",
213
+ indigo:
214
+ "bg-indigo-500 outline-3 -outline-offset-1 outline-indigo-100 dark:outline-indigo-600/50",
215
+ violet:
216
+ "bg-violet-500 outline-3 -outline-offset-1 outline-violet-100 dark:outline-violet-600/50",
217
+ purple:
218
+ "bg-purple-500 outline-3 -outline-offset-1 outline-purple-100 dark:outline-purple-600/50",
219
+ fuchsia:
220
+ "bg-fuchsia-500 outline-3 -outline-offset-1 outline-fuchsia-100 dark:outline-fuchsia-600/50",
221
+ pink: "bg-pink-500 outline-3 -outline-offset-1 outline-pink-100 dark:outline-pink-600/50",
222
+ rose: "bg-rose-500 outline-3 -outline-offset-1 outline-rose-100 dark:outline-rose-600/50",
223
+ error: "bg-red-500 outline-3 -outline-offset-1 outline-red-100 dark:outline-red-600/50",
224
+ warning:
225
+ "bg-yellow-500 outline-3 -outline-offset-1 outline-yellow-100 dark:outline-yellow-600/50",
226
+ success: "bg-green-500 outline-3 -outline-offset-1 outline-green-100 dark:outline-green-600/50",
227
+ };
228
+
229
+ // ─── Computed classes ─────────────────────────────────────────────────────────
230
+
231
+ const rootClass = computed(() => {
232
+ const base =
233
+ "inline-flex w-max cursor-pointer items-center transition duration-100 ease-linear";
234
+
235
+ const themeBase =
236
+ props.theme === "modern"
237
+ ? "rounded-md bg-background text-muted-foreground shadow-xs ring-1 ring-inset ring-border hover:bg-muted"
238
+ : "rounded-full ring-1 ring-inset";
239
+
240
+ const colorCls = props.theme === "light" ? lightRootColors[props.color] : "";
241
+
242
+ let sizeCls: string;
243
+ if (props.align === "leading") {
244
+ const pr = !hasText.value && !hasIcon.value ? "pr-1" : "pr-2";
245
+ sizeCls =
246
+ props.size === "md"
247
+ ? `py-1 ${pr} pl-1 text-xs font-medium`
248
+ : `py-1 ${pr} pl-1 text-sm font-medium`;
249
+ } else {
250
+ const pl = props.theme === "modern" && props.size === "md" ? "pl-2.5" : "pl-3";
251
+ sizeCls =
252
+ props.size === "md"
253
+ ? `py-1 pr-1 ${pl} text-xs font-medium`
254
+ : `py-1 pr-1 pl-3 text-sm font-medium`;
255
+ }
256
+
257
+ return [base, themeBase, colorCls, sizeCls, normalizeClass(props.class) || undefined]
258
+ .filter(Boolean)
259
+ .join(" ");
260
+ });
261
+
262
+ const addonClass = computed(() => {
263
+ const themeBase =
264
+ props.theme === "modern"
265
+ ? "inline-flex items-center rounded-md bg-background shadow-xs ring-1 ring-inset ring-border"
266
+ : "inline-flex items-center rounded-full ring-1 ring-inset";
267
+
268
+ const colorCls = props.theme === "light" ? lightAddonColors[props.color] : "";
269
+
270
+ let sizeCls: string;
271
+ if (props.align === "leading") {
272
+ const margin = hasText.value ? "mr-2" : "";
273
+ sizeCls =
274
+ props.theme === "modern"
275
+ ? props.size === "md"
276
+ ? `gap-1 px-1.5 py-0.5 ${margin}`
277
+ : `gap-1.5 px-2 py-0.5 ${margin}`
278
+ : props.size === "md"
279
+ ? `px-2 py-0.5 ${margin}`
280
+ : `px-2.5 py-0.5 ${margin}`;
281
+ } else {
282
+ const margin = hasText.value ? "ml-2" : "";
283
+ sizeCls =
284
+ props.theme === "modern"
285
+ ? props.size === "md"
286
+ ? `py-0.5 pr-1.5 pl-2 ${margin}`
287
+ : `py-0.5 pr-1.5 pl-2 ${margin}`
288
+ : props.size === "md"
289
+ ? `py-0.5 pr-1.5 pl-2 ${margin}`
290
+ : `py-0.5 pr-2 pl-2.5 ${margin}`;
291
+ }
292
+
293
+ return [themeBase, colorCls, sizeCls].filter(Boolean).join(" ");
294
+ });
295
+
296
+ const dotClass = computed(() => {
297
+ const base = "inline-block size-2 shrink-0 rounded-full";
298
+ const position = props.align === "trailing" ? (props.size === "md" ? "mr-1.5" : "mr-2") : "";
299
+ return [base, position, modernDotColors[props.color]].filter(Boolean).join(" ");
300
+ });
301
+
302
+ const iconClass = computed(() => {
303
+ const colorCls = props.theme === "light" ? lightIconColors[props.color] : "text-gray-500";
304
+
305
+ const sizeCls =
306
+ props.align === "leading"
307
+ ? "ml-1 size-4"
308
+ : props.size === "md"
309
+ ? "ml-0.5 size-3 stroke-[3px]"
310
+ : "ml-1 size-3 stroke-[3px]";
311
+
312
+ return [colorCls, sizeCls].filter(Boolean).join(" ");
313
+ });
314
+ </script>
@@ -0,0 +1,137 @@
1
+ <template>
2
+ <svg
3
+ :width="dim.width"
4
+ :height="dim.height"
5
+ :viewBox="`0 0 ${dim.width} ${dim.height}`"
6
+ fill="none"
7
+ v-bind="$attrs"
8
+ :class="styles({ class: normalizeClass(props.class) })"
9
+ >
10
+ <mask
11
+ :id="maskId"
12
+ style="mask-type: alpha"
13
+ maskUnits="userSpaceOnUse"
14
+ x="0"
15
+ y="0"
16
+ :width="dim.width"
17
+ :height="dim.height"
18
+ >
19
+ <rect :width="dim.width" :height="dim.height" :fill="`url(#${gradientId})`" />
20
+ </mask>
21
+ <g :mask="`url(#${maskId})`">
22
+ <g :clip-path="`url(#${clipId0})`">
23
+ <g :clip-path="`url(#${clipId1})`">
24
+ <line
25
+ v-for="x in verticalLines"
26
+ :key="x"
27
+ :x1="x"
28
+ :x2="x"
29
+ :y2="dim.height"
30
+ stroke="currentColor"
31
+ />
32
+ </g>
33
+ <rect
34
+ x="0.5"
35
+ y="0.5"
36
+ :width="dim.width - 1"
37
+ :height="dim.height - 1"
38
+ stroke="currentColor"
39
+ />
40
+ <g :clip-path="`url(#${clipId2})`">
41
+ <line
42
+ v-for="y in horizontalLines"
43
+ :key="y"
44
+ :x2="dim.width"
45
+ :y1="y"
46
+ :y2="y"
47
+ stroke="currentColor"
48
+ />
49
+ </g>
50
+ <rect
51
+ x="0.5"
52
+ y="0.5"
53
+ :width="dim.width - 1"
54
+ :height="dim.height - 1"
55
+ stroke="currentColor"
56
+ />
57
+ </g>
58
+ </g>
59
+ <defs>
60
+ <radialGradient
61
+ :id="gradientId"
62
+ cx="0"
63
+ cy="0"
64
+ r="1"
65
+ gradientUnits="userSpaceOnUse"
66
+ :gradientTransform="`translate(${dim.cx} ${dim.cy}) rotate(90) scale(${dim.cx} ${dim.cy})`"
67
+ >
68
+ <stop />
69
+ <stop offset="1" stop-opacity="0" />
70
+ </radialGradient>
71
+ <clipPath :id="clipId0">
72
+ <rect :width="dim.width" :height="dim.height" fill="white" />
73
+ </clipPath>
74
+ <clipPath :id="clipId1">
75
+ <rect :width="dim.width" :height="dim.height" fill="white" />
76
+ </clipPath>
77
+ <clipPath :id="clipId2">
78
+ <rect :width="dim.width" :height="dim.height" fill="white" />
79
+ </clipPath>
80
+ </defs>
81
+ </svg>
82
+ </template>
83
+
84
+ <script lang="ts">
85
+ import { normalizeClass } from "vue";
86
+ import type { HTMLAttributes } from "vue";
87
+
88
+ export type BgPatternGridSize = "sm" | "md" | "lg";
89
+
90
+ export type BgPatternGridProps = {
91
+ /** Additional CSS classes */
92
+ class?: HTMLAttributes["class"];
93
+ /**
94
+ * Size of the pattern
95
+ * @default "lg"
96
+ */
97
+ size?: BgPatternGridSize;
98
+ };
99
+
100
+ const dimensions: Record<
101
+ BgPatternGridSize,
102
+ { width: number; height: number; cx: number; cy: number; step: number }
103
+ > = {
104
+ lg: { width: 768, height: 768, cx: 384, cy: 384, step: 48 },
105
+ md: { width: 480, height: 480, cx: 240, cy: 240, step: 32 },
106
+ sm: { width: 336, height: 336, cx: 168, cy: 168, step: 24 },
107
+ };
108
+ </script>
109
+
110
+ <script lang="ts" setup>
111
+ const props = withDefaults(defineProps<BgPatternGridProps>(), {
112
+ size: "lg",
113
+ });
114
+
115
+ const uid = useId();
116
+ const maskId = `bgpattern-grid-mask-${uid}`;
117
+ const gradientId = `bgpattern-grid-gradient-${uid}`;
118
+ const clipId0 = `bgpattern-grid-clip0-${uid}`;
119
+ const clipId1 = `bgpattern-grid-clip1-${uid}`;
120
+ const clipId2 = `bgpattern-grid-clip2-${uid}`;
121
+
122
+ const dim = computed(() => dimensions[props.size]);
123
+
124
+ const verticalLines = computed(() => {
125
+ const { width, step } = dim.value;
126
+ return Array.from({ length: width / step }, (_, i) => 0.5 + i * step);
127
+ });
128
+
129
+ const horizontalLines = computed(() => {
130
+ const { height, step } = dim.value;
131
+ return Array.from({ length: height / step }, (_, i) => step - 0.5 + i * step);
132
+ });
133
+
134
+ const styles = tv({
135
+ base: "text-border",
136
+ });
137
+ </script>
@@ -0,0 +1,97 @@
1
+ <template>
2
+ <div
3
+ class="pointer-events-none absolute inset-0 rounded-[inherit] border border-transparent mask-[linear-gradient(transparent,transparent),linear-gradient(#000,#000)] mask-intersect [mask-clip:padding-box,border-box]"
4
+ >
5
+ <motion.div
6
+ :class="styles({ class: normalizeClass(props.class) || undefined })"
7
+ :style="
8
+ {
9
+ width: `${size}px`,
10
+ offsetPath: `rect(0 auto auto 0 round ${size}px)`,
11
+ '--color-from': colorFrom,
12
+ '--color-to': colorTo,
13
+ ...style,
14
+ } as MotionStyle
15
+ "
16
+ :initial="{ offsetDistance: `${initialOffset}%` }"
17
+ :animate="{
18
+ offsetDistance: reverse
19
+ ? [`${100 - initialOffset}%`, `${-initialOffset}%`]
20
+ : [`${initialOffset}%`, `${100 + initialOffset}%`],
21
+ }"
22
+ :transition="{
23
+ repeat: Infinity,
24
+ ease: 'linear',
25
+ duration,
26
+ delay: -delay,
27
+ ...transition,
28
+ }"
29
+ />
30
+ </div>
31
+ </template>
32
+
33
+ <script lang="ts">
34
+ import { motion } from "motion-v";
35
+ import type { MotionStyle, Transition } from "motion-v";
36
+ import { normalizeClass } from "vue";
37
+ import type { CSSProperties, HTMLAttributes } from "vue";
38
+
39
+ interface BorderBeamProps {
40
+ /**
41
+ * The size of the border beam.
42
+ */
43
+ size?: number;
44
+ /**
45
+ * The duration of the border beam.
46
+ */
47
+ duration?: number;
48
+ /**
49
+ * The delay of the border beam.
50
+ */
51
+ delay?: number;
52
+ /**
53
+ * The color of the border beam from.
54
+ */
55
+ colorFrom?: string;
56
+ /**
57
+ * The color of the border beam to.
58
+ */
59
+ colorTo?: string;
60
+ /**
61
+ * The motion transition of the border beam.
62
+ */
63
+ transition?: Transition;
64
+ /**
65
+ * The class name of the border beam.
66
+ */
67
+ class?: HTMLAttributes["class"];
68
+ /**
69
+ * The style of the border beam.
70
+ */
71
+ style?: CSSProperties;
72
+ /**
73
+ * Whether to reverse the animation direction.
74
+ */
75
+ reverse?: boolean;
76
+ /**
77
+ * The initial offset position (0-100).
78
+ */
79
+ initialOffset?: number;
80
+ }
81
+ </script>
82
+
83
+ <script lang="ts" setup>
84
+ const props = withDefaults(defineProps<BorderBeamProps>(), {
85
+ size: 50,
86
+ delay: 0,
87
+ duration: 6,
88
+ colorFrom: "#ffaa40",
89
+ colorTo: "#9c40ff",
90
+ reverse: false,
91
+ initialOffset: 0,
92
+ });
93
+
94
+ const styles = tv({
95
+ base: "absolute aspect-square bg-linear-to-l from-(--color-from) via-(--color-to) to-transparent",
96
+ });
97
+ </script>
@@ -0,0 +1,103 @@
1
+ <template>
2
+ <nav
3
+ data-slot="breadcrumb"
4
+ aria-label="breadcrumb"
5
+ :class="styles({ class: normalizeClass(props.class) || undefined })"
6
+ >
7
+ <template v-for="(item, i) in items" :key="i">
8
+ <slot :name="item.slot || 'default'">
9
+ <div data-slot="breadcrumb-item" class="flex items-center gap-3">
10
+ <div class="group flex items-center gap-2">
11
+ <slot name="crumbIcon" :item="item" :index="i">
12
+ <Icon
13
+ v-if="item.icon"
14
+ data-slot="breadcrumb-icon"
15
+ :name="item.icon"
16
+ class="size-3.5 shrink-0"
17
+ :class="[
18
+ isNotLastItem(i)
19
+ ? 'text-muted-foreground group-hover:text-foreground'
20
+ : 'text-primary',
21
+ ]"
22
+ />
23
+ </slot>
24
+ <slot :item="item" :is-not-last-item="isNotLastItem" :index="i" name="link">
25
+ <NuxtLink
26
+ v-if="item.label"
27
+ :to="!item?.disabled ? item.link : ''"
28
+ data-slot="breadcrumb-label"
29
+ :class="[
30
+ item.link && !item.disabled && 'underline-offset-2 group-hover:underline',
31
+ isNotLastItem(i)
32
+ ? 'text-muted-foreground group-hover:text-foreground'
33
+ : 'font-medium text-primary',
34
+ ]"
35
+ class="text-sm text-foreground transition-colors"
36
+ @click="item?.click?.()"
37
+ >{{ item.label }}</NuxtLink
38
+ >
39
+ </slot>
40
+ </div>
41
+ </div>
42
+ </slot>
43
+ <slot name="separator" :item="item" :index="i">
44
+ <Icon
45
+ v-if="isNotLastItem(i)"
46
+ data-slot="breadcrumb-separator"
47
+ :name="separator"
48
+ class="h-3 w-3 text-muted-foreground"
49
+ />
50
+ </slot>
51
+ </template>
52
+ </nav>
53
+ </template>
54
+
55
+ <script lang="ts">
56
+ import { normalizeClass } from "vue";
57
+ </script>
58
+
59
+ <script setup lang="ts">
60
+ import type { HTMLAttributes } from "vue";
61
+
62
+ export interface BreadcrumbItem {
63
+ label?: string;
64
+ icon?: string;
65
+ link?: string;
66
+ disabled?: boolean;
67
+ slot?: string;
68
+ click?: () => void;
69
+ }
70
+
71
+ const props = withDefaults(
72
+ defineProps<{
73
+ /**
74
+ * The items to display in the breadcrumbs.
75
+ */
76
+ items?: BreadcrumbItem[];
77
+ /**
78
+ * The separator to use between each breadcrumb.
79
+ */
80
+ separator?: string;
81
+ /**
82
+ * Custom class(es) to add to the parent element.
83
+ */
84
+ class?: HTMLAttributes["class"];
85
+ }>(),
86
+ {
87
+ separator: "lucide:chevron-right",
88
+ items: () => [],
89
+ }
90
+ );
91
+
92
+ /**
93
+ * Detects if the current item is not the last item in the breadcrumbs.
94
+ * @param index - The index of the current item.
95
+ */
96
+ const isNotLastItem = (index: number) => {
97
+ return index !== props?.items?.length - 1;
98
+ };
99
+
100
+ const styles = tv({
101
+ base: "flex w-full flex-wrap items-center gap-1.5 text-sm wrap-break-word sm:gap-2.5",
102
+ });
103
+ </script>