fulldev-ui 0.9.3 → 0.10.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 (258) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +100 -16
  3. package/package.json +3 -2
  4. package/public/r/accordion.json +3 -5
  5. package/public/r/alert-dialog.json +1 -1
  6. package/public/r/alert.json +0 -5
  7. package/public/r/article-1.json +1 -1
  8. package/public/r/article-2.json +1 -1
  9. package/public/r/articles-1.json +1 -1
  10. package/public/r/articles-2.json +1 -1
  11. package/public/r/articles-3.json +1 -1
  12. package/public/r/avatar.json +1 -16
  13. package/public/r/badge.json +1 -1
  14. package/public/r/banner-1.json +5 -3
  15. package/public/r/banner-2.json +1 -1
  16. package/public/r/banner.json +5 -3
  17. package/public/r/blocks-1.json +6 -3
  18. package/public/r/breadcrumb.json +4 -4
  19. package/public/r/button.json +1 -1
  20. package/public/r/card.json +4 -4
  21. package/public/r/carousel.json +5 -5
  22. package/public/r/checkbox.json +1 -1
  23. package/public/r/combobox.json +8 -8
  24. package/public/r/command.json +6 -6
  25. package/public/r/components.json +1 -7
  26. package/public/r/contact-1.json +4 -2
  27. package/public/r/contact-2.json +4 -2
  28. package/public/r/contact-3.json +11 -3
  29. package/public/r/content-1.json +11 -3
  30. package/public/r/content-2.json +11 -3
  31. package/public/r/content-3.json +7 -1
  32. package/public/r/content-4.json +11 -3
  33. package/public/r/cta-2.json +7 -1
  34. package/public/r/cta-4.json +7 -1
  35. package/public/r/cta-5.json +11 -3
  36. package/public/r/cta-6.json +7 -1
  37. package/public/r/dialog.json +6 -6
  38. package/public/r/doc-1.json +6 -3
  39. package/public/r/dropdown-menu.json +9 -11
  40. package/public/r/features-1.json +5 -3
  41. package/public/r/features-2.json +5 -3
  42. package/public/r/features-4.json +5 -3
  43. package/public/r/features-5.json +4 -2
  44. package/public/r/field.json +2 -7
  45. package/public/r/footer-1.json +5 -3
  46. package/public/r/footer-2.json +5 -3
  47. package/public/r/footer-3.json +5 -3
  48. package/public/r/header-1.json +1 -1
  49. package/public/r/header.json +3 -0
  50. package/public/r/hero-13.json +1 -1
  51. package/public/r/hero-4.json +5 -3
  52. package/public/r/hero-5.json +5 -3
  53. package/public/r/hero-6.json +5 -3
  54. package/public/r/hero-7.json +5 -3
  55. package/public/r/hero-8.json +1 -1
  56. package/public/r/hero-9.json +5 -3
  57. package/public/r/hover-card.json +2 -2
  58. package/public/r/icon.json +1 -1
  59. package/public/r/input-group.json +1 -1
  60. package/public/r/item.json +2 -20
  61. package/public/r/kbd.json +2 -2
  62. package/public/r/layout.json +4 -7
  63. package/public/r/links-2.json +5 -3
  64. package/public/r/marquee.json +1 -1
  65. package/public/r/native-select.json +3 -3
  66. package/public/r/navigation-menu.json +6 -8
  67. package/public/r/page.json +17 -0
  68. package/public/r/popover.json +1 -1
  69. package/public/r/pricing-1.json +5 -3
  70. package/public/r/pricing-2.json +5 -3
  71. package/public/r/pricing-3.json +5 -3
  72. package/public/r/products-1.json +1 -1
  73. package/public/r/products-4.json +1 -1
  74. package/public/r/products-5.json +1 -1
  75. package/public/r/radio-group.json +1 -1
  76. package/public/r/rating.json +3 -3
  77. package/public/r/registry.json +186 -450
  78. package/public/r/reviews-1.json +5 -3
  79. package/public/r/reviews-2.json +5 -3
  80. package/public/r/reviews-3.json +5 -3
  81. package/public/r/reviews-4.json +1 -1
  82. package/public/r/reviews-5.json +5 -3
  83. package/public/r/select.json +6 -8
  84. package/public/r/services-1.json +11 -3
  85. package/public/r/services-2.json +7 -1
  86. package/public/r/services-3.json +7 -1
  87. package/public/r/services-4.json +11 -3
  88. package/public/r/services-5.json +5 -3
  89. package/public/r/services-6.json +11 -3
  90. package/public/r/services-7.json +11 -3
  91. package/public/r/sheet.json +6 -3
  92. package/public/r/sidebar-1.json +4 -2
  93. package/public/r/sidebar.json +10 -7
  94. package/public/r/slider.json +1 -1
  95. package/public/r/spinner.json +3 -3
  96. package/public/r/switch.json +1 -1
  97. package/public/r/theme-toggle.json +5 -3
  98. package/public/r/tooltip.json +1 -1
  99. package/public/r/typography.json +16 -16
  100. package/public/r/video.json +1 -1
  101. package/registry.json +186 -450
  102. package/src/components/blocks/article-1.astro +1 -1
  103. package/src/components/blocks/article-2.astro +1 -1
  104. package/src/components/blocks/articles-1.astro +1 -1
  105. package/src/components/blocks/articles-2.astro +2 -2
  106. package/src/components/blocks/articles-3.astro +1 -1
  107. package/src/components/blocks/banner-1.astro +3 -5
  108. package/src/components/blocks/banner-2.astro +1 -1
  109. package/src/components/blocks/blocks-1.astro +25 -37
  110. package/src/components/blocks/contact-3.astro +4 -3
  111. package/src/components/blocks/content-1.astro +5 -4
  112. package/src/components/blocks/content-2.astro +6 -5
  113. package/src/components/blocks/content-3.astro +9 -2
  114. package/src/components/blocks/content-4.astro +6 -5
  115. package/src/components/blocks/cta-2.astro +4 -3
  116. package/src/components/blocks/cta-4.astro +3 -2
  117. package/src/components/blocks/cta-5.astro +6 -5
  118. package/src/components/blocks/cta-6.astro +4 -3
  119. package/src/components/blocks/doc-1.astro +28 -56
  120. package/src/components/blocks/features-1.astro +3 -1
  121. package/src/components/blocks/features-2.astro +4 -2
  122. package/src/components/blocks/features-4.astro +3 -1
  123. package/src/components/blocks/footer-1.astro +26 -12
  124. package/src/components/blocks/footer-2.astro +24 -12
  125. package/src/components/blocks/footer-3.astro +26 -12
  126. package/src/components/blocks/header-1.astro +2 -3
  127. package/src/components/blocks/hero-13.astro +1 -1
  128. package/src/components/blocks/hero-4.astro +2 -2
  129. package/src/components/blocks/hero-5.astro +3 -3
  130. package/src/components/blocks/hero-6.astro +3 -3
  131. package/src/components/blocks/hero-7.astro +3 -3
  132. package/src/components/blocks/hero-8.astro +1 -1
  133. package/src/components/blocks/hero-9.astro +2 -2
  134. package/src/components/blocks/links-2.astro +3 -5
  135. package/src/components/blocks/pricing-1.astro +3 -2
  136. package/src/components/blocks/pricing-2.astro +3 -2
  137. package/src/components/blocks/pricing-3.astro +3 -2
  138. package/src/components/blocks/products-1.astro +1 -1
  139. package/src/components/blocks/products-4.astro +2 -2
  140. package/src/components/blocks/products-5.astro +4 -4
  141. package/src/components/blocks/reviews-1.astro +2 -2
  142. package/src/components/blocks/reviews-2.astro +2 -2
  143. package/src/components/blocks/reviews-3.astro +2 -2
  144. package/src/components/blocks/reviews-4.astro +4 -4
  145. package/src/components/blocks/reviews-5.astro +16 -25
  146. package/src/components/blocks/services-1.astro +7 -9
  147. package/src/components/blocks/services-2.astro +5 -4
  148. package/src/components/blocks/services-3.astro +6 -5
  149. package/src/components/blocks/services-4.astro +7 -9
  150. package/src/components/blocks/services-5.astro +3 -4
  151. package/src/components/blocks/services-6.astro +7 -6
  152. package/src/components/blocks/services-7.astro +7 -9
  153. package/src/components/blocks/sidebar-1.astro +42 -97
  154. package/src/components/ui/accordion/accordion-trigger.astro +7 -8
  155. package/src/components/ui/alert-dialog/alert-dialog.astro +23 -3
  156. package/src/components/ui/avatar/avatar.astro +1 -1
  157. package/src/components/ui/badge/badge.astro +1 -0
  158. package/src/components/ui/banner/banner-container.astro +3 -3
  159. package/src/components/ui/breadcrumb/breadcrumb-ellipsis.astro +2 -2
  160. package/src/components/ui/breadcrumb/breadcrumb-separator.astro +2 -2
  161. package/src/components/ui/button/button-variants.ts +8 -7
  162. package/src/components/ui/card/card-content.astro +1 -1
  163. package/src/components/ui/card/card-footer.astro +1 -1
  164. package/src/components/ui/card/card-header.astro +1 -1
  165. package/src/components/ui/card/card.astro +1 -1
  166. package/src/components/ui/carousel/carousel-next.astro +3 -3
  167. package/src/components/ui/carousel/carousel-previous.astro +3 -3
  168. package/src/components/ui/checkbox/checkbox.astro +1 -1
  169. package/src/components/ui/combobox/combobox-input.astro +2 -2
  170. package/src/components/ui/combobox/combobox-item.astro +4 -4
  171. package/src/components/ui/combobox/combobox-list.astro +1 -1
  172. package/src/components/ui/combobox/combobox-trigger.astro +2 -5
  173. package/src/components/ui/combobox/combobox.astro +3 -0
  174. package/src/components/ui/command/command-dialog.astro +10 -10
  175. package/src/components/ui/command/command-input.astro +2 -2
  176. package/src/components/ui/command/command-item.astro +4 -5
  177. package/src/components/ui/dialog/dialog-close.astro +2 -2
  178. package/src/components/ui/dialog/dialog-content.astro +2 -2
  179. package/src/components/ui/dialog/dialog.astro +26 -3
  180. package/src/components/ui/dropdown-menu/dropdown-menu-checkbox-item.astro +4 -5
  181. package/src/components/ui/dropdown-menu/dropdown-menu-content.astro +4 -4
  182. package/src/components/ui/dropdown-menu/dropdown-menu-item.astro +1 -1
  183. package/src/components/ui/dropdown-menu/dropdown-menu-label.astro +1 -1
  184. package/src/components/ui/dropdown-menu/dropdown-menu-radio-item.astro +4 -5
  185. package/src/components/ui/dropdown-menu/dropdown-menu-shortcut.astro +1 -1
  186. package/src/components/ui/dropdown-menu/dropdown-menu.astro +3 -0
  187. package/src/components/ui/field/field-label.astro +1 -1
  188. package/src/components/ui/field/field-title.astro +1 -1
  189. package/src/components/ui/hover-card/hover-card-content.astro +4 -4
  190. package/src/components/ui/hover-card/hover-card.astro +2 -2
  191. package/src/components/ui/icon/icon.astro +8 -17
  192. package/src/components/ui/input-group/input-group-button.astro +0 -1
  193. package/src/components/ui/item/item-media.astro +1 -1
  194. package/src/components/ui/item/item.astro +0 -18
  195. package/src/components/ui/kbd/kbd-group.astro +1 -1
  196. package/src/components/ui/kbd/kbd.astro +1 -1
  197. package/src/components/ui/layout/layout-body.astro +1 -1
  198. package/src/components/ui/layout/layout-head.astro +3 -2
  199. package/src/components/ui/layout/layout-main.astro +1 -1
  200. package/src/components/ui/layout/layout.astro +4 -0
  201. package/src/components/ui/marquee/marquee.astro +50 -69
  202. package/src/components/ui/native-select/native-select.astro +2 -3
  203. package/src/components/ui/navigation-menu/navigation-menu-content.astro +1 -1
  204. package/src/components/ui/navigation-menu/navigation-menu-list.astro +1 -1
  205. package/src/components/ui/navigation-menu/navigation-menu-trigger.astro +2 -3
  206. package/src/components/ui/navigation-menu/navigation-menu.astro +1 -1
  207. package/src/components/ui/popover/popover-content.astro +1 -1
  208. package/src/components/ui/radio-group/radio-group-item.astro +3 -3
  209. package/src/components/ui/rating/rating.astro +3 -3
  210. package/src/components/ui/select/select-content.astro +1 -1
  211. package/src/components/ui/select/select-item.astro +4 -4
  212. package/src/components/ui/select/select-trigger.astro +3 -6
  213. package/src/components/ui/select/select.astro +6 -0
  214. package/src/components/ui/sheet/sheet-content.astro +4 -5
  215. package/src/components/ui/sidebar/sidebar-menu-button.astro +13 -10
  216. package/src/components/ui/sidebar/sidebar-menu-sub-button.astro +10 -8
  217. package/src/components/ui/sidebar/sidebar-provider.astro +1 -13
  218. package/src/components/ui/sidebar/sidebar-rail.astro +1 -1
  219. package/src/components/ui/sidebar/sidebar-trigger.astro +3 -3
  220. package/src/components/ui/sidebar/sidebar.astro +1 -1
  221. package/src/components/ui/slider/slider.astro +6 -4
  222. package/src/components/ui/spinner/spinner.astro +4 -4
  223. package/src/components/ui/switch/switch.astro +1 -1
  224. package/src/components/ui/theme-toggle/theme-toggle.astro +4 -3
  225. package/src/components/ui/tooltip/tooltip-content.astro +1 -1
  226. package/src/components/ui/typography/typography-a.astro +19 -4
  227. package/src/components/ui/typography/typography-blockquote.astro +26 -6
  228. package/src/components/ui/typography/typography-h1.astro +7 -9
  229. package/src/components/ui/typography/typography-h2.astro +12 -9
  230. package/src/components/ui/typography/typography-h3.astro +7 -9
  231. package/src/components/ui/typography/typography-h4.astro +7 -9
  232. package/src/components/ui/typography/typography-inline-code.astro +28 -12
  233. package/src/components/ui/typography/typography-lead.astro +29 -4
  234. package/src/components/ui/typography/typography-list-item.astro +25 -9
  235. package/src/components/ui/typography/typography-list.astro +29 -11
  236. package/src/components/ui/typography/typography-p.astro +26 -6
  237. package/src/components/ui/typography/typography-table-cell.astro +32 -13
  238. package/src/components/ui/typography/typography-table-head.astro +27 -13
  239. package/src/components/ui/typography/typography-table-row.astro +23 -13
  240. package/src/components/ui/typography/typography-table.astro +29 -20
  241. package/src/components/ui/typography/typography.astro +172 -46
  242. package/src/components/ui/video/video.astro +11 -27
  243. package/src/styles/global.css +2 -15
  244. package/public/r/beta-repo-setup.json +0 -125
  245. package/public/r/blocks.json +0 -91
  246. package/public/r/content-5.json +0 -17
  247. package/public/r/content-6.json +0 -17
  248. package/public/r/gradient.json +0 -17
  249. package/public/r/init.json +0 -23
  250. package/public/r/tile.json +0 -27
  251. package/src/components/blocks/content-5.astro +0 -115
  252. package/src/components/blocks/content-6.astro +0 -91
  253. package/src/components/ui/gradient/gradient.astro +0 -45
  254. package/src/components/ui/gradient/index.ts +0 -1
  255. package/src/components/ui/tile/index.ts +0 -3
  256. package/src/components/ui/tile/tile-content.astro +0 -17
  257. package/src/components/ui/tile/tile-group.astro +0 -76
  258. package/src/components/ui/tile/tile.astro +0 -46
@@ -1,17 +1,25 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "services-7",
4
+ "dependencies": [
5
+ "@lucide/astro"
6
+ ],
4
7
  "registryDependencies": [
5
8
  "@fulldev/badge",
6
9
  "@fulldev/button",
7
- "@fulldev/section",
8
- "@fulldev/icon"
10
+ "@fulldev/section"
9
11
  ],
10
12
  "files": [
11
13
  {
12
14
  "path": "src/components/blocks/services-7.astro",
13
- "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Button } from \"@/components/ui/button\"\nimport { Icon } from \"@/components/ui/icon\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = {\n class?: string\n badge?: string\n title: string\n description?: string\n buttons?: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n services: {\n image: {\n src: ImageMetadata\n alt: string\n }\n label?: string\n title: string\n description: string\n href?: string\n }[]\n}\n\nconst {\n class: className,\n badge,\n title,\n description,\n buttons,\n services,\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)}>\n <SectionContainer class=\"gap-8\">\n <div\n class=\"flex flex-col gap-4 md:flex-row md:items-end md:justify-between\"\n >\n <div class=\"max-w-2xl\">\n {badge && <Badge variant=\"secondary\">{badge}</Badge>}\n <h2\n class=\"mt-4 text-3xl font-semibold tracking-tight text-balance sm:text-4xl\"\n >\n {title}\n </h2>\n {\n description && (\n <p class=\"text-muted-foreground mt-4 text-base leading-relaxed text-balance\">\n {description}\n </p>\n )\n }\n </div>\n {\n buttons?.length && (\n <div class=\"flex flex-wrap gap-3\">\n {buttons.map(({ href, label, ...button }) => (\n <Button as=\"a\" href={href} variant={button.variant}>\n {label}\n </Button>\n ))}\n </div>\n )\n }\n </div>\n <div class=\"grid gap-6 lg:grid-cols-3\">\n {\n services.map((service, index) => (\n <a\n href={service.href ?? \"#\"}\n class={cn(\n \"group/service flex flex-col overflow-hidden rounded-xl border shadow-xs transition-shadow hover:shadow-md\",\n index === 0 && \"lg:col-span-2 lg:row-span-2\"\n )}\n >\n <Image\n src={service.image.src}\n alt={service.image.alt}\n class={cn(\n \"w-full object-cover\",\n index === 0 ? \"aspect-video\" : \"aspect-16/10\"\n )}\n widths={[320, 480, 640, 960]}\n sizes={\n index === 0\n ? \"(min-width: 1024px) 66vw, 100vw\"\n : \"(min-width: 1024px) 33vw, 100vw\"\n }\n />\n <div class=\"flex flex-1 flex-col gap-2 p-5\">\n {service.label && (\n <Badge variant=\"secondary\" class=\"w-fit\">\n {service.label}\n </Badge>\n )}\n <h3\n class={cn(\"font-medium\", index === 0 ? \"text-xl\" : \"text-base\")}\n >\n {service.title}\n </h3>\n <p class=\"text-muted-foreground text-sm leading-relaxed\">\n {service.description}\n </p>\n <div\n class={cn(\n \"text-primary flex items-center gap-1.5 pt-2 text-sm font-medium\",\n index !== 0 && \"mt-auto\"\n )}\n >\n Learn more\n <Icon\n name=\"arrow-right\"\n class=\"size-3.5 transition-transform group-hover/service:translate-x-1\"\n />\n </div>\n </div>\n </a>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
15
+ "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport ArrowRightIcon from \"@lucide/astro/icons/arrow-right\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Button } from \"@/components/ui/button\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\nimport PlaceholderImage from \"@/assets/placeholder.webp\"\n\ntype Props = {\n class?: string\n badge?: string\n title: string\n description?: string\n buttons?: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n services: {\n image?: {\n src: ImageMetadata\n alt: string\n }\n label?: string\n title: string\n description: string\n href?: string\n }[]\n}\n\nconst {\n class: className,\n badge,\n title,\n description,\n buttons,\n services,\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)}>\n <SectionContainer class=\"gap-8\">\n <div\n class=\"flex flex-col gap-4 md:flex-row md:items-end md:justify-between\"\n >\n <div class=\"max-w-2xl\">\n {badge && <Badge variant=\"secondary\">{badge}</Badge>}\n <h2\n class=\"mt-4 text-3xl font-semibold tracking-tight text-balance sm:text-4xl\"\n >\n {title}\n </h2>\n {\n description && (\n <p class=\"text-muted-foreground mt-4 text-base leading-relaxed text-balance\">\n {description}\n </p>\n )\n }\n </div>\n {\n buttons?.length && (\n <div class=\"flex flex-wrap gap-3\">\n {buttons.map(({ href, label, ...button }) => (\n <Button as=\"a\" href={href} variant={button.variant}>\n {label}\n </Button>\n ))}\n </div>\n )\n }\n </div>\n <div class=\"grid gap-6 lg:grid-cols-3\">\n {\n services.map((service, index) => (\n <a\n href={service.href ?? \"#\"}\n class={cn(\n \"group/service flex flex-col overflow-hidden rounded-xl border shadow-xs transition-shadow hover:shadow-md\",\n index === 0 && \"lg:col-span-2 lg:row-span-2\"\n )}\n >\n <Image\n src={service.image?.src ?? PlaceholderImage}\n alt={service.image?.alt ?? service.title}\n class={cn(\n \"w-full object-cover\",\n index === 0 ? \"aspect-[16/9]\" : \"aspect-[16/10]\"\n )}\n widths={[320, 480, 640, 960]}\n sizes={\n index === 0\n ? \"(min-width: 1024px) 66vw, 100vw\"\n : \"(min-width: 1024px) 33vw, 100vw\"\n }\n />\n <div class=\"flex flex-1 flex-col gap-2 p-5\">\n {service.label && (\n <Badge variant=\"secondary\" class=\"w-fit\">\n {service.label}\n </Badge>\n )}\n <h3\n class={cn(\"font-medium\", index === 0 ? \"text-xl\" : \"text-base\")}\n >\n {service.title}\n </h3>\n <p class=\"text-muted-foreground text-sm leading-relaxed\">\n {service.description}\n </p>\n <div\n class={cn(\n \"text-primary flex items-center gap-1.5 pt-2 text-sm font-medium\",\n index !== 0 && \"mt-auto\"\n )}\n >\n Learn more\n <ArrowRightIcon class=\"size-3.5 transition-transform group-hover/service:translate-x-1\" />\n </div>\n </div>\n </a>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
14
16
  "type": "registry:block"
17
+ },
18
+ {
19
+ "path": "src/assets/placeholder.webp",
20
+ "content": "RIFFnK\u0000\u0000WEBPVP8 bK\u0000\u0000\u0010�\u0002�\u0001*\u0000\u0006`\u0003>)\u0014�C!�!\u0011��H\u0018\u0002���ӿ��\u001c{�\u0007���p[���&/�������\u0018�\u001eP������oHfb���=�R���\u001a\u0019;�����ͼ�8�\u0012\u0003���\u000fP��?�{Z�\u000e���9�[A��?��d�\u0001�;�\u0003�\u0007�\u000f�\u001f8�[�oׯ����>\r����?��*�\t�ǿ�~��'~[�o��\u0004�����_ҽ��\t�G�_�������c�_����s���@�\u000f�?������Y���w�}�?�?����������/����b������\u0004��`�P҅%�u����X\u000b\u0001`\u0013Ry�Q\u0004�j�*��b��\r���N-��\u001e�\u0002ѡ�k����\u000e��i�mq��R�q�\u000e�h\u0018�t\u0007|�Fg\fwK'gu.��Xce\n\u0011l\u0002�Dv�\ntlp\u0015�%�F�\bb\u001bx��d�F�\u0004\u000f\u0019�tO�t�\u001e��d�[\u001d��q�\u001e�\u0000?M\u0003LT\u0001�4W���G-�Α?�@7l\u001a\u0019�İ��\u0017F�\u0010y�p�\u001f���\u0018�\u001e�$��=>!1t[�Jq'�\u0000\\��4\u0003�b\u0018d��̀�t@��$�u��-��&62n�bɺk�%��\u001c\u0019\u0013�v�����\u0007Ő\tO:x�l�I<f��ay9^�-��I#��t��d��a\u0005�\u001ee\u0014�\u001d\u001aJ\r&��L\u0013\u001at��d�F��`���ޓ�\f�>\u0013Ǒ�IA�{㤲eI.�\u001c�K�\b�3\u0007M�,A抾��\u001f��t��cN���:G�2k�N��O\u001e,�K͆Fm�c*\u0003\u0004ɮ�\u001bœt�\u0019/rv\u001aN��F\u001f\u001b���\u0018�u�;�\u0018������p�y\u0006�\u0015\\�@\u0000r\u000e�d�͜��o��\u00174����e�K[&��d7���[\u0006�[\u000f�<Pb_0Y�׏u\u0003-�\bB�x�ѱ\u0007�6l�_,*|E���xJ�_���\u0007�����M�:��8[\f4����8��\u0002��\u001e��sX�i\u001f\u0004Ɲ+�\u0005\u0001�Mu�����\u001f���Q�\u0017\u000bC��Yd|2�tp\u000f�O�ɧ\u000b��\u0016ІGͬ�S���w�rl��3���R\r\u0001'�\r᎛X�o\u0007�Y�(���N��Li����4�ѱ�?�\rI�Y�\u0014_&�\u000b�q��I�5\f���X���t����z�S[(�W�a\u0011\u0012M4�'�_<:���8iӊ\u001d[�\u0005\u0006Ɲ%\u0006�\\\u0019\"T2� �<����F\u0018���l��QB������\u0004Cˀ$����\u0000Q�j���@�\b�I�\u0012�\u0007z[�<�\t5��I(A�F��@�c���\u0006�*\u0001��4�}o�76\u0018\u001e$\u00168\b�L$\u0001�\u0016r\u001a��Q|�����[�\u000b!R�j2��X��s?��uS?H�3P�\u000f+\u000e4�\u001fu���J��?���P \u0006�\u0010�T��V�rc\u0007�\u000f91�7��\u0015\u0005�R%Á!'lH_��C�S�\u0003���B�M����\u0016�\u0012Jبټ\u001c2�cN��ތ m.\u00198�Tl���U\u0004>\u001d\u0002\r&͎�M�)p!tnF\u0003O\u00164�\u0011\u0011qP}߬����Dh$J��\u0011>�l\f�\r^LpPs�$����NI��\u0013yR���/1�S�\fԳ�\u001a4e����d��_��\"\t�� m�c����J��S\u0004�3\u0003�Q��`�E��91���4T���\u0011,��b�J\u0019��M%\u0014����2y��q�\r\u0018�'}B�\u001eI�\u0011f~H�nƣ$җK(��\u000e*\t�:LrP\u0004��6%�:=�'(^��\u000eΒ@8��\u001e\u0005c��A�1mFbR��/\u0017\u0014\u000e�\b\u001f�e����x\u0017H�}�Z�\u001e�i��0�\u0005�e�T\u000eo�r�d�C-�'+Մ��@7g�\u001d��\u0016�\u0007����-E��^�C6\u0010;q��N3N��\u0004�X6� !>�*@�u�z�\u0014[n\u00170�����c\u0000�\u0002�b�}s�\u0004l\u000b��ud+�'�S�st\"��ɦ\u0005'<\u0003d\u0000�8�i���H\u0006�<�]΁���ӥti��\u0006\\�;6 �`H\u001a�\n�o���\u001e���̈́\u0001;P�Jy�'�&4��\b8C�d=L\u0016,�eW C�I\u0019x��E[\u0003z�=J!f!m-�\u0013q\u001d�:m�i��:��EO^�\u0000���\f�\u000f\u001b�S\u0000y�\u0016~?�L-��>��%������\tlG\t�Q�_���\u0004��Y蹄\u001f�\r�2��\u0014o�u�\u0001\u0006�\u001ab>�>�H�C'� 5�\nT�O���K��P��! �! ����z(nu<���+��-���D\u0015�\u0000\u0003�C{r\u0002��d\u0001�\u00114,����c�,�\b\fpF��F����=�ZJ\u0013g�2\u0019@_\u001e�\u0003=�����\"F�\r'j��C�(F�HC���x\u0015����v`�<g$֮C�`\u001a\u0018J�'�q�q/f�e�\u0004\u0013`��\u0000:`\u0001|�\u0000\u0011�\u0001+\u0001�!O���\u0006�\f�>�d�\u0012?�!��;�$:�\u000b�+��GX\u0016�jc��y)�\u001d�W�$�\u0007:��Ss�\"\u0017�\u0018t�ߙ�XW�wP�\u000f$���r\u000bf\u000b�\r�;\u0016J�\u0005��\u0010\u0000\u0000\u0001\u001c\u0000\u0001\b��\u001a�Ƃ�7�\u000f,\n����\u0010-��|3�}�\u0016�m@�`��6[�M�\u0007]���\u001e0�V;�_��)<�qkA~/�e(�' m�\u0010�����\u001b\f�\u0005�W) _��r�H4�p!`�@\u0003�\u0000\u0000\u0000\u001d�\u0000\u0000ʀ\u0000\u0000\u0003\u0001\u0002��\b\u001c�\u000e�K��J�~�\u0005-�;Jr\u001b�b��44�i0\u0006\u000b��?�\u000e\u0003��*�H�*b�_|Q�\u0013\u0007�j�tsT�@`��2n\u001b\u0018��[�۔\fA�G�9�\u000e��\b�z7�̄���6��\u0002\u001f��dT�+��`�\\{\u0006�\u0000\u0001\"��\u0000\u0018��4R�P\"�\"h��0�\u0000\u0000\u000b�\u0012/s�jH���bص�'?8���3X���i!ZV:PA��\u000f�i��\u0003�t}R\u001aV2\u001f�\u0007�\u0002�T�\u0014m\f4\u001e���fP�r\u0012\u00052� �Ik`�o��&[�ˆQ�Z�b��\u0005H�\u000b�In\"~\tڻ�\n[�fK�\u0016�����\u0012\u0014?�\u0018�~p��Հ�2���Elc4\u000bS��\u001c���\u0003�_\u0000����\rBG��7��\u0007����,���3��\u0000H\u00168{Ŏ���\u001a\u0017�-�\u0018�o^��^�\u0004\u0001�t=�Nx\u0018kO�F��WAH\u0018}@\n�3�O\u0001�?n�#��\u000fpha�\\Av<�|\u000e\"v�\f�\u0015(\u00131\u0000\u0000\u0000\u000012�/� \u0000��c\u0012f�z>\u0001$�\u0012�\u0002\u0000?\u001d�\u0013q�ku\u000b\t���ž\u001ejq�\u000e\u0007�0N��\u0019�i��%�\f\u0004���gǟE�����9���F�\f�J�3\u0019K\f����͛�4�l̸\u0006&�8Af\u0001{�t���\u0016\u001f,��\u0010\u0005CM\u0006�t���\b�А\u001d\f�1�8ҳg�&\u0004�`����]EYy���\\W�H�c�-t-}�\u0006Xu��r2t\u000e*\r�\u0000$�3\u0011�\u0018'<#A*2Iv;\u0002&h�S��k,�\u0007b\"\t���=E�У\u0002����|#\u0002�˜]XL��\u0016:{0\u0001��\\\u001d\u001a\u0013�a��ـ\u0000%�ޚ'Ɠ?\u0006\u0011�>!\u0003�\u0003�;����=\u001aK�,�|��h\n}\u000f\u0002�D��\u0004\"����\u0012y�{2T\u0013���\u001b�n���=$�Y��\u0004z\u00164�Bf�\u0015;\n��a�Q�_��\u0014v����\r��\f�\b��\u0000%\t\"|/=�\f�4\u0018ʹ��\u001e\u0004�Q���.\"�c0�\t�\u001a\u0000\u00008\u0000�\u00034\u0015ޡ@\u0007\u0018\u0018�$ޏg��\r*\t\u0010��v�\u0011y�t�:q#�.̎�V���1n�=�Bu����-[��\"]7E��+&�\u0001�%J\u0004h���\u0013�\u0002=D1�'�`-\u000e$t�\u0003F3\u0004c\u001e\u001b��a\u000f\u00190�\u0000t�\f@r@T���\u0000\u0007\t\nA�h�K��\b\u001a���;`\u0001]�G&ҏե�\u0010�F׉\u0000��@�I��~�Y���jZ�\u00110�Z�z�<\u0007bwWu��.�\b\u0018d3\u0007�9�XN\r\u0010\r��\u001f\t�ų\f�\\�\u00194��\u001a{\u0013�GC�>��\u0011�b\u0001\u0002�8\u0000S�\u0000\u0000\u0002��\u0000\u001f��\u0000\u0001�\u0001��؂5'��f;#�h%�,J�`є:\u0007(W\u0018H�L�\u0010�\u0005���\u001c~��^&��w�9ጲ\u0004,�\u0012֨x��W����2��B�4_T�e�T{}6�z5��z\tn�I�\u001bR�!>'\u0007A�l\\`�\blk�\u0018kh�_\u0018���L�\u0003�ſlFT��h���nM���\u0003�\u0006u��,\u000en\u0019q\u0017��\u000eVm��F�\"�\u0016;�,�\u0003�2�Q��&c%\">\u001a\u0012���A�=��\u0014`X\u0015��\u0019�t�K/\u0002A�� #��\u0007A\u001a�\u0000l\u0001�8\n\u001b0\rOU�X=��X%ʱ\bA�-��8Pr\u0018�1*у�y�f;���\"Y\u0013�_\u001av\u0005�_M>��o.�Vj����ɾN6\u0001��\u0007�p\u000f*�Iti�v\u0012S\u0019�˹8��$�fV\u0010���{`�M[\r�ַĔQ�����\u0017�\u0000gga��\b��a�zE����\n�A��K�3��?QG\u0015�kF�?� ��\u0014V�6H$��VF��\t�;�D��\u0000�\bo���MpGI@��M!��×�4_�c@\u001c�\u0019Ԡ\u001d���6\u001a�S�\u001cs�\u00163�0cT�\u000e�s\u00194��\u0001\u0006F�\fO�2&G��?\u0018�Yz�\u001b\u000eO�\u0005\u000f�\u00026$\u00066���IX�P]�\u0007\u0001\u001b\n\u000fI^�m]�j\u0018�6��\u000e\u0016j��\u0019^�\u001d�p���J\u0017�X2�\u0010���'�<?�\u0013\u0000\\�,�0ź��S3\u000e��\u000b\u0010R�ӡ�\t���I=C3��G��k�����6�EL\u001a������D��$u�p<�`���\u0014\u000e䂟�Ԡ�Yb�qʰdv�\r@ቹ�\u0011�m^�N֭\u001c6\u001b5���vء��\u000few��\u0004��\f��ܜ5�&/�(�\u001a�-\\O�\u0014�#���;�c�\u0000�C(BB�\u0019\u0002\u0007�3v�w\u0013���h�G�V�D�}��ylE�v8��L;\u0000�:\u001f�\u0014�[X�Q�z���h��\u0004\u000eVX��&\u0017I\\���>\u0013Ǒ��=d\td�F�\r(}e�Ĵ]1OG^�\r���{\\<�<hذZ�h�iW\u0007l&\u001e^�\u0014�Ԭ\u0002�;r^�\"M&\u0014��\u0006��ê�f`��\u0019L\u000b\b\u0014�\u0004a?��\u001bU/�\u0015\u0002V&�\u00156=`�B\u0016� �\u001e&{嫊JȮ\u0019a%n\u001b`f�i�r�a�А����)�`y%,Zb�$�O{����D�f�\u0001zΣ\u0013\u0016�\u0000��h\u0002�c]wU���\u001b2\u0018\u0007���}\"��ш��-_���\"l�\u0000��\u0010\u0007AsŊ8\u0011����\u001fb%\u000b��./]���M��(\u0002�\u001b'�\u001a�\u001cQ薩^_�)���0�\nH�%��rQ�����D��O�\r#��t� ��\u0013,�Y\u0013%W\u001b�K(�\u0000\r�ҁٖ5�E��-��C��\\��v���a�\u001f`��;s\bj#w/�Ӵs�\u001a\u0001�$�wz\u0015��\u001d$�lY�]�$NѼ\u001bӀ~b\u001bo4�������\u0002�zL�����~\u0006|@i\u001f\t�ō���U}a�z�}mj}�0���S�$�<\u0004�3��D���j5�g\u0017p��\u001e5f�B�V\u000f/\b@HŚ��1jrT \fJ$�7f�\u0004���+�\u0010��\u0005�ʁdo�گ��\f�\u0005!k\u001ct�\\����\u0012�gԟ\u0010�|=v�q�j�v,\u001aQ����\u000boW�L���\f@\b���\u0014��R\u001boɷ��t���A�\u0001\u001eV W(�:\u00046�\u0012�n�n&xŋ\u001a�\u0019h\u001d�2p���n{���\\##�\u0016\u00112\u00013���.�ف\u0017\u0002L�� �\u0001︔\u0016\u001e!�\u00026��%{���C\t#+��AE\u0014���ͼʠ�YiՇo(e!��hm���\u0000�xPH\u0012(o�Q�t��\u0005�b��1})�Lۆ\u0015��I����Ā�&7��t���X\u001eM��.wӉQ*C��\"H\u0014��\u001a�����X.�X���\bp��q����:�]TT+\r\u0010*d���V��Ҧ�\u0018I����MbOrI\u0015\"\u0003�U\u0019&\u0005\u000f�q�R�$\u000b���<���b-��;�4�\u001dK�\u000b���%2'T{�5\u001c˸��D��O�\u0012�5'C-�*�\u0000��Ζ_��i��)\u0011�_7U�m������]���8���\u0012�q���y�ߚ��,m���'�REa�?L���3\u0018\u0002f&ce�\"�\tu�\u0016�\f�7�\u0001�\u0000y�\u000f�O�Ӈ\u0003lU\u001eP�l����\u000e�6\b�_�t����\u000eDm����\\2�����\u0007#\u0011�淎�Xt� �\u0005\u0017a�\u0011��\u0015��ٚYi1�]&-6�V�N�w3KY\u001f�����\u000f�n\u0019s^c�^��=u,\u001c3���\u0004�K0ʩ��I\u0012\u0006�>_�q���O\"�y���\u001c�E*\u001eSy\u0006�E�˺�t���c��5�ٲ���1D�O�O0�D\u0016Ѳ\u000fWc��ǣp]8ջ�\\AO\u0013׷\u0014�@����)�16Ga6�\n\u0010��\u0019�e��~͚�ct�}�����s�w�N\u001enU�\t�UgS3'/�\u001d�H\u001c����`\u0010�\u001f!�>?\u000e�s��#��M�\"dž͕�\u0019��©&-G��E/\u0005�L�����#:\u000eu#�n*;\\Ȗl��\u0006A�Z��\u0010fl0��t!��+ZO(5\u0007)\u0002F\u0019���h'/�:d�\u001f��\u0013إJt�\tO�����2�k&����1�\u001c\u0003�uG�+p���R\n�\u0013�\u001d\r�s��\u0002$�F��]��3��\u001f�ʹ\f:?��c�1/��{̹n\u001b��*q��\u0015��4��I�6� z^p\u0004��R��B��\t�b4\u0003s\u0004\u001d:\f�v��H�Dd�=Y�L>`��\u0007t����w�C~\u0016�\bK\u001a�AH�8��M`WW��LS��\f\u0011�-��J\u0017eU�f�GD#���\u001b5�\u0006\u0005e�\rlT \f��/\u0001�=�fN䄂��+�\u001a|��4�n?I �0Sʡ���N�M��e���q\u0012����PG�^R��]���Q�L\"�\fyv1�?\u0015=p\u0001S����\\�\u000b�\r��:Yiջ\u0018O�I�J\nБ�%N�m��\u0007���|x^F�#�G'�v\u0019�U\u0014�\u001f\u0010k,D�eW�G��{��N7o���\u0019\u0004��\t3�i�ҡ\u0013��\f;wQA�a<�\b'��U��D=h\u0000\u0000��G�\u000b�T0����;w�\u0019�wR���b\u0019��\u0006�M]���T��X\b�]�\u0005�����d�\t\u0015�\u0003a� �M��=���@��rL��H�OQ�l��v(RJ\u0007qK��N:��\u0007\u0013ʩ�:&1�<rh:��穁{\u0001�-�r�\u0000&�\u0004�Ԍ�\u0010J\u000eݮ`���\u0017�5�Yvڷ���O̡L�B*\r��Y�0�1�\u0015f�%�\u000f`�@5B\u0001*\u0010i�Q�\r��?��\\ �!�����!Fj��?Q�1�Ś��QO�DRp�\\\"x\n\u0014�䯦��-&�R�\u001e/:9&�\u000b�%�Gɾ���T�)���Vح��\u0003c��6��\u000e�靶pڕ�\u001c�Ϳ��_4�\u001b�9\u0002\u001bk�\u000fJ�2]�3ܶ�\\��\u0013��&����\u001dH���~U\u0012��=>�f\u0002R��#\\������;��e\u0000�卑����<\u001a��\f5��\b\u0018\tPu\u0012^!P����䡙��kB �{{b0�\f�����r\ru��)�\u0005���{b\u001c\\V�8��qh^z@NTL<B��vAB\u001f\u0004��\u001a��\n3k�X�Y��J�s\u0006\u00055b����A�sur���2��]�Up��LU݀/�s�c�I�[E�\rL���t��|\r=�b-Ϭ[\u0018Z\u00174�\f�9\\��_6f\u001c\u001d\u0005\u001b��f#?Iz\u0003PLb�-�i\\n\u0019�W������Fo.�Ec��\u0003G��f\u0000=R\u000b�i��+C��y\u0019Ke���R��͜�*�H����\\\\T\u001b�\u001c�cՑ�:��]�~6\u0005�\u001ag�a�O\u001aEa�Ѳ�\u0004[Df�-$�[f�þ�����.��\u0011!п�+�T��%q�\u001b l\u0003w�El��_�\u0005`�\"�>=��?;;�w\tu��뭮�oTe��U|\"Ub�x\u0019���\u0010z�\u0015�xK]\u000f>�\u000f�>\u000e�\u001b,���2�kET_%�-t;Q\u0007�����3z�\"�<\u001cmN��\u00103\u000et!��\n9�E��*6��%t��\u0018��[�W_��qt\u0006���H����\u0001Pp�,��g{�*�Ѧ���}_��Ҽ~��̷�\u001b�\u0016Z�T�5�m���\u001aB�\r�\tNNj\r�en;�ˎ�%��\u000e\u0012+� R\n��\\�<\f\u001f�JL\u001f�yCS�<�/���_�\u0005)�}�1\u0002J<r,|�<\f\u001f�JJ�h���\u0014�\u0013��j�{\u001d\"4)I�\u001bxfZ*�{��Ehx�\u0018^}�,�=��~&��R2���L�lh\\�y\u0018��=\u0011����\u0000�ɍ�tE�no���S�]��\u0013ɴ%e��S\u001d��Э��27���t��\u000e+i��cU\u0013��\u0005��ۆ!�\u0000�C\f,_�\u0002\u0006�G�&�P��9>\u0007�\u000b�g�+�wڹ/�q�\bKB<{�-�Px�\u0014\u0006g!�\u0014m˵��6c\u00138�\n\u001a�f�<\u0016P���a�4\r*\u000f��\u001b۽�\\����N\u0003���D\f��N�w6�p���`P]�8������V�ea\u001b>w�2�:\u0013�\u0003\u000b{ڜ\u0014\u0000�b\u001d�\u0002�⑚l���A�\u0013�*\u00166�M,_1q\t�\t�\u001c\"��4\u0013�\u000f��q\u0002�1\\�\u001a�;�͵\u001f�/\t{�ڎ\u0011��\u001b��\u0005\u001bҪ\u000f�*G�{\u001d���>c\u0000;���)&�c�K�\u0004#ג9_�C�q�ӣ�w==��+\u0002KE��w\u000fH��\u0000?�]�`����������\u001d\u000f�=\u000fc��\u0019g\u001c�뚋j�\u001d��Ͷq�ZyCk��)�d�@u�؋��Kv�\b㥷o\u0012v�<v�!�U�zi��\u0014L��L@��@\bn���ӛ�(�i*�!o��F}��[�k\nvC��Y�U;\u0001�\u0002����J%�ݳ�\\���\u0004-��*���\u001b\u001exo\u0000�bz�\u0017g�ʠ쾵��u�%� X|4^?�F|����a7D\\F_`��2B�R;݋h|\\Iz����ʵ���\u001e\\=<!\u0016�\u0005%:N|@�s�\\F�\u0003H �X�\u001c��mu�\u0006��AJJ�ryCnmF0�,\t�P��\u0010��Ik^�\u0017&�A����V�H˗\\\u001d%\t-1����\u0010�U�\u0007\u001e \u001f��]��\\��\u000e_� �\rX�b����N�\u001d!\u000e�#�\u0005g�s��[n��bs\u000b\u001b`��œ���P�HG\u00017g�I�ΰ\u0001�R>����cL\u0012��ꐂ��+\t:�r��P��}\u0000ƨ}K\u001f\u000b/݉'2;�\u001c'��;�\u000f���m|�F�æl�-\u0018>g�7��r�\u0014�NL,��W\u000b��-�2\u001e\u0016�G]np��\u000fc�:/�`ɕ����/\"�[�HA�\u001f�\u0016S=\u0006F)�!�\r��M�\u0017LJ@��a�P,'�w.4+�\u000e�9%\u0003��,E���#�q�\f/1U�\u0010\u001a0�Hm\u0018B$8\u001bA�T���᫶�E\\�] �U�\u000f�E8��\u001c\u0007�o\u00067�X�\u001e^�h��9g\u000f��\u0002]��\u0007\u0014�\b!o\u0015\u001a\u0002rq��6�ա�B茥o#3?z������\"�).�\u0003f\u001cW\f��ԍ ����\u0010���d۫��\".V��LҞ2�cx>��K'O^w�NB�U���\u001a�\u0018꫋����\u001f�\u0010Y\b�:n*x@%\u0007��#\u0004\u0000\u0010�\u0001��A}\u000fFW�\u0000���\u0011�c�Q ��\u001e�\u000b��mb\u000e�c�6IO\u0019l3\t�\u001d��\u00041�\n�0�����\u0015�]n�\u001ee��\u0016�\u001d�.�z�d��}l�^E����\u0012\f�\u0006�$���3<����4U|6�፾)\t�s�\u0013Nm�!��\u001f*�\u0001�`6�r�k���`�SU�r�/�±�1MSO�0�6�ܩx�q ������#����A�7V\\\u0004I2)\u001a.3���Ӈ�6\u0018����G�x�k^�_�<���\u0005��d�{�m�\u0013���cl\u001f�JSyg\u00128��\u0001uW�ڢ\u0011�(�{��:��#�y*\u000f�\u001d�U!\n\u0019�7��\u001c�%�wz����&\u0002�Ƀ��1�e�Z\u0016�Ƚ��\u0018�$�m��nnx�s��Pu�\u0004��f\u0001�U�F\u001eɹI�^�k\u000e�\u001a�ޯT����\u0018c\b88[A��e�z���p�/�=oz:��(~\\�e5D��G�q����\u0006�\u0006�\u0012��\u001bn$Lnf�Y���\n\u001eg�Bx$�fT)���ބ3ٔ:�z�\u0019>�\tZ\u0011/w@���{���|\u0004ف�\u0003s\u0005�\\\u0019�\"�D�k��A\u000e�mt\u001c\u0015�`����\u000e8�~\\�Ǻ\u0018��K���b�Z[<�n:��Z��C�ʹb�,����,����'(����\u0002`�y�f�S�\t\u0016\u00016*��y�\n�~�\u0000�A��U����^��y�=�\u0004���\u0015������g��rT\u001f>�,�����i\bW[Ӳ8V���\b\u000e�%\u0005�N�(h��2\u001a\t��[�:��[�\u00048\u0017�U�\u0011���� �p\u0013R͞�;�\u0019��\u0016�R�T'\n���D�\u0018\u0014-�1TB�J\u0014<�m麖\u0006=�}\u0002�\u0012_�tY�o\u0001j\u001ee0�\u0003\u00123�CD\u0015I\u000e�\u00182��_n�\u0006!�z\u0015h�DDzq�'�g�n� �\u0000*�v��:� H���78�����\\{�\u0000��U��Y\u001aVi@���\u0013�����(2�M�\u001e��n\f�*�<�v�;�Z\u0017�o��Ӳ_}���{X\u001c�?z��U\u0019��J�\u001f?/��\u00174����\u0013`_l\u001c��\u001f��zeDŻ���w1t��n�lI�j���_D|-��`��x�q7���[�j�p�\u0004�\u0017Uq�\b�%\u0016˒\u0003�8\ru����rd��+rtp5bm\u0011\u001b�5\u000fB�\u001c\u0017�ub\u0001���\t�U��1�Ƚ�p�\u0014�\u0014\u0006�%K\u0004��I��+�q����V\u0001C3\u0002���&zp��-\u0006���/c�j�O0s�r\u0017�� ��TEҕ[\u0005)�e��t����/F\n\u0011c��ne5#U�6�\u0018X�\u0013\b8_d�\r΁)�'\u000f�\r�5\n�f��k\u0010&+Cʅ��_�Rd\u000f��ryjC��I\bc\u0007�\u0004�\u0013����l\\,�8�>3�����8F��̆>�J�r\u0019=\u0006�q\u0017�\u0013�Hׅ��G㧗��?��se���S�!\n����\u00140�@;۝�����&��\fB�\u0013�ڽ����V\\M���S\u001c�ܞj\u001a�=|\u001c�1_<�#�� �˩ڡ\u0005F�\u001f���v�2�q[��e�[�\u0002i��\u0006n]���w�)�Р\nwC�k�x\u000b�\u0018g�\u0000� =�r�9i\u00181�W���q���/D��\u0001Ւbm��b~��-_Rdeߦ3^\u0016�\u0013�٥\t]>61��F=\"���\\k�j��p�C�u\u0007\n9?�9/�Z�W\u000fv�>�(Gd��q�J\u0012�|kz\u0010W\rZZuĨ�8�tWt��0z1��m�j��D-�n�;\u001aao�xǢs�q��J؈�0S]�f\u0006�˭m\u0003�\u000f�~t'�M���ҶV�m\u0012Uhv�\u000fc��\u001dO����+��[��I_%�?\u001bM�_>��DFb� ��[�\t���\u001a��ѱq1�\u0017EU��Y�u�\u001d��F�i���@�R�5P��I\u001e���a����,���C*.\u0006*���tNu�5�L��QI�\u0006y��\u001b�\u0019ߪ��龶\u0014�$���\u0007p�4�\u0019�b\u001ay�$���\b˱�\u0004$�T�\"��\u0004\u0000Tl6�&V���rU�k�g���~Î2���K\u000b�\u0017W����}�A�L5�Ӆ�\u001b�{\fa�����Ь��Y�s���\u0010.1�1j�Y�\u0015Iz��e\u0005���x���K\\X�bn\u000b��'o!�W�:n;��:�뽤o��tu���\u001f��H��\u000f\u001b+���\u0007�Q\b�M0��+b,\u0004o���~�TL\u0000\r���>}��\u0013Ȓ\u0000\u0014�~ǒ�>�7��:�\u000e:S�\u000b休��/\u000b\u000e�\u001c絩�+\t\u0015��\u0015\u0000f]\u000b�{�6���y<���7੒ը����ԯ�u}�\u0005\u0004�g�\u0019,\u0013�E�7<��\u000bE06>\u001c\u0013�\u0011]�\u0012�\u0002\r�%\u0011�<�Ry�%z?�������g�f�@\u0003\u0012�k\u0013k;\u0000\u0011Yv9N\u00162�i�qA\u000bRf\u0000\u0011��\u0000\f�\u001a޶$\u001f�\u000f:��\u0006���\u0003#\u0006�({\u0007R�K2�4�\r�[Ӟ8bY��\u0010����u��y\u0014y�o\u0019Q7|\u001b�g\n�%K\u0004���S\b\u0002�>�;�pZ�\u0013�<\n�g!��\\#�O�J�N��]8�Q\u0007\u001eJ������\u0011�\u0018X�.Y\f���9�e-�\u0007�W\r7�A|���/@Q��u���>�a_��G��:��:�m\u0019I1\u0005�D\b���:\f\u0019�K�*\u001d�\u0001�W��\u0000\u0004k���z$G\u001d-�ZP��0\\�47\u0001a=3�w�a֎hтVp$EC򑭹S�\u0004�\u001a*\u0019�\u000fv�\u0006e2������آ��\u0016zg82�^5`�<\u0007x�/�,��5@\u0014�\u0018\u0000��\u001b�㐙v�NS\rq֜Rs��q���AS=�\u000f�|\u0004T~-(��\u0000\"\u000b�p\u001f�U���\"FC�����\u0007�~��ި��.��P����x�G\u0019a5�\u000f��QD\u0011#!��fj�ɿt��:��6��\u0011]�:ۮn=�����ʐˬ�\u0013�婃&tˢ�/��\u000eR\u0012�\u0000���\u0004m���w�\u0004<�ZLOD�\u000e�\u000b4}*���N�XL�Us0�8���>�o�ŭ�Pbx\u0017����]�Ԋ��\u001a\u001ci8-�6y\u0005\u0001�7rf�B\u0013��,�d͎���\u000e3t%���SP���O��6H\u0000�/��U��\u0018kw��\u0000�\b���B\u0016c�~�,\n�9\"�i\u00041�X:(\u0010�E���a*)�>^\u0004�;e\b�0؞�5��iw,�������|~kfu\u0002��c�0���ȼg�\u00193�q�\u001b\u0012ξ\u001c!�Q\u001f��\u001a�v\u0001��s�uZ��Q�.�\u0011�\u001f]v\u0015��\f)�q��݁q���ع�\u0003���u�\u001cf�\u001evG�Q��x�k�x��\bER�}�=`\u0004=\u0014�\t,#\u0017A\b\u0014\u0011\u0001�ヒ�!%j\u0006+�ԑ�=RY�xod��\u0003�N]\n�\\C§\"�5X\u0019�J�d�M�cJ���qY�Q��*��\u0015\u000b\u001b)�M�,m�u\u0004��ñ`�������ݒ\u001a1MV��4:�������7\u0000��\n���*R�ڿ=vmkX\u0017����_~\b\u0000�q�\u0003\n��\u001fWW\t�x���\u001bO��\rn�\u0006RB�Asn\u0003�\u0019��lљϲL�\u001f0�<�\f��_�R�\u0013 ����A�)T�F0��\t;x\u001f>�:q\u0003��3\\j]_\rL�\u0019V��[�:my�6����m턁꿺�̻L��?��\fu���̀E�(R�*�y��NLk�w��\n�3�\\r����|�u����\u00108�#5ƥ��\u000e|_h��\\=�5�g����ޱ%��p�^����\u000f�*�XZ�g��\\�\\WKH%��@\u0003O�\u0019�mc\n.��V��-��+�0�^�B����\u001cN�Zec��~��\f�\u0001�7x�6LFr\u001d�oނ�B����\u001e��\u0012v��G�-_\u001c��x\u0019l'�P�nƕ�\n�K\u001d�@w�A�53B\u0003���j�F\u0018[��\u0010�-��\u000b�o�\u001d�Ê�\u000e�a�}�W��:�����A��\u0013}��Q/�d%�\u0011���U�\u0015]=�\u001a07�Q�f|�\u0007Nc��j\u001e����\u0013���#�\f�V�p�\u001fJ�?�������n\u0019Ӡ��\u0016��\u0000\u001a�|\n�$Y�O1�D.\u0000\u0001\u0010W���\"\u001bk\u0003(W�nN�Ac��ۏ�l8#��G`��V���ySY\u0007�J\u001f��\u0002�'�~�PR�QNX9\u001f��A�F?I�pv��c���\u0000��J�\n�D�5l�0*\u0012-�Ǻh׏\u0017o�\u0011^W\n\t\u0017\u001b�\b�nl�3��w<�η`�1�!�t>K\u001b�\u0017bzM�`\u0006\u0006D\u001a���K��Yi�.���i��U�D�\\[�y��2K�M�|\u0006��9�5\u000f�t\u000b�)թt6�\u0013�R�?^�$BG4\u001es�����7��\u0014�\u0007\u001c�c��c�F�F�'��v��z��`�]9�c�3��q� ��\u0016��'�\u0001\t{�\b-A�_��\rQ\u0012�/z\u001b\u0012\u0017\b6_��N��8-n&9A|�\u0000\b�6��Ѡ=M��(n\u0010c(��f\u0014�� \u0015�\u000e\u0011p\\̎Jt���E�9\u001a��\u0019\b�@��/�\u001c\u0018��5�Wĥ�\u001f;�H7�b�٪�87��f\u0000=RH�K²�Sl�0�vo@\tF�dV\u0000\u0000\nڝR�;�{�|�\u0003G��f'!�\u0003�k�\u0013�s�C֒�Û�r\u000b[��.������D��Gm��\u0003aнluP9بv��߆�6��Z!tEr����mF\u0000\u001f [�E'8ZG\u0019\u0001�\u00195�wWڝ��\u000f�|5�}�\t\t�fo�K᧊7�����r�\u0004c�\u00166��9�:���\u001f>�^\u0013\u0006���\u001c\u001a{\u001fV��\u001f}��>k p\u0015\u0014M>�\u0003d��\u0006���HX@����>p�\"\u0012�%\u0004�@\u0018,\u0015\r�MVҭ�#B<�\u000f�\"I�a�\t\b\u0017�^f�(\u0003\u0003�{�K\u001aQ���\u001c��_���8��\u0006�c�dC\u0012v��3���\u0018>���֯<�\u000fRG���\u001c\u000f\"��uU1\u0003�(qӴ9=�@�ѩ(M^y�\u0005�\u001aͻ�u�\u0018{һ��\u0012�oa\u000e�79}�t/\u0017U��PE\u000eƸ=BC.O�\u0018\u0018R'���~��y\"��}@�.*��TO�\u0002��UV\u0013?W\u000e�si\u0018�d�Z�\u0003C��=�,!o��\u0006\u0000�\u00035D���ۙ��M!�!5�\u000f��;/��)�k\u0000��˦�m%N�Y�?�\u0018pz�v�\u000eX���њ�ؽ|�\"򔳃?�ȥ�Ԥ�fr\"\u0014\u0006âw���*p��>\bw\u0018�+�\u0005:�΅\u0011l��:���\u001a��<�ր=���e/����\u0014n\u0000\u0000\u0000\u0003BS��:�g3q�W�\u001aW����\u0016��<]�H�-�qm���H�h饷\u0017J8#�,>��\u001f\u0001/�]���$[\f�+��?~�E��\u000b�64�\u000b~�]��\u0006l�CEGd����Ŕ�Cc\bL�<H'>�n!��¬\u001b3{�\u0013�[���*T\u0000�\u001buo��/�,�'��DqHi�фK����I�!Dh�h·}�Ԝ$ ^\u0012v4\u0010۸�\\��\u0017�ЩnnR۴\u0014,{��\u0015�-,�l%�S#nuL\u001dJ\u001b�:���CNi���ـ��р�H�\r�\u000e�\u0012w\u0003g��I�\u0019�ZY��(���V�|2�\u0015\u0004��}I�B\u0004�d�<��,�B��'rU����!��WD�yD;�ޔ`�\u0006hH��xb:�̻L�\u0014�s\u0016.T��b[�3�y��)�x�v��HMb�\u0011͛\u001a�0�.��\u0007�\u0016�c&tˢ�2�\f��Hso�m\n�X�L5��%�\u0016Q,���\b\u000etZ)��Pb��[�\u000e0�z��nw�y�C�U�IJ�諽��\n&(e\u0000�\u0012c��\u0006���\u0000#bp([����.;��Wt�/<\u0000\u0000�<��\u0000\u0011�qĩ\u0010���2zG`\",�;y\u0004\"\u0013~< v�\u0003\\:{�2�\u0016�ܵ�:��\u0002�%]������\u00115_��'��_�\u0007\u0016�-�����z\u0017�g�]~ѿ�﷏�@��_�5���+��\u001a_�����s�}ݒ4�T@x��_���)���n�g��N�\"�g޿��\u0016\t��(��E�N�p�\u000b�U���zoEu�e�\u000e�aw�yw���\u000f\u0005�]�y�C�dO���DS\u0010�\u0001�z�\u0000.u$\u0012Ǯa���t��!\u000bs�D�Q��������;Ww;���nI<� R�\u001a:�˫\u0000\"�# \u0007\b /!�C\u0011%\u0005�\u0005oT�ϒ�'(���Jn��t�*�;�\\C\u0002�>���n��/Ksԯd��U\u0016��&�2�\u001a�eY��j|ۨ|�d�~f��v�N0�\"�K���\u0001rQ�:#�R\t�O�A\n.��X�J�=��\u0006�^���\u001e�?��\u0014.\b�B�2_A\u0001��t������Џ���XЀ����O&]\u000fd�\u0007ci=��B�\u0002㟂PN\u0014\u0001�ֱI(�0�\u0001��D�4�]xur:ߟV��D�9��!�ǿK�\u0010����d�\\;�s\u0004��0���u2e���/��Ǻ\u0017X\u001d���K-V\u0010�R��\u0000\u0000��+�n`\n�\u0019yڬ����l�֘\t�3\u0013�i\u0006@m\u0010RB�+���p\fO �\tG+�7x�\u0004�\u0018���\u0014\u0007b\u0000`���.����\u0002RNB��I\u001a�7�\u0001U磌\t���n>ݘ4:\u000e�\t{�\u0012\u0019��c�J���\u001f��\u0015�����L���\u0014�?C����jǾV��\u0015��I�B�VV�\b\u0019�M���Q�_?��/�\u000e�L�QK8�F���\u001d\u0013\u0017}��elw-\u0012뾾�tJA���w��_r\u001bR�X\u0013ץ7�\bf8f��&�H� ��Kֺ�$���\u0013$�F9��$\u0019�n�\u0001�}o#)4u���\u0013�%疴�l��R�\u0002@J\u00029`'�\u001c�_�����}N�/\n���fڃ�[\u0005�򩍆\nSt�G�\bs���\nU=�[\u0019Qaఢ_(�ŽE\u001f(G\fR\u000ei��+\u0018�2\u0011�@\u001d��1lW\u0012���DV���.�\u001c��7?6\u0017Y/�u��p\u0005\u0014�]>��k�Z��Sni\u0012KԖ��Y�J��8#�6_\f)�r�%P��B�Xm��p��Ԅ�\u000f�g&���8Ou�\b�~j$\u0018\u0002j�����\u0007�vR�\u0000a+Z\u0005%4�����^����}�f�M��Ƭ/�^wY����5\u001d���~�4}�١%e^�ޟ����Ԫ�!d\u001e��6\u0016PTN\u0014F����V:?B�0\b�e�6U\b���!��[\u0016��h�K\u0001�^�l\u0001������\u0010���7`d�(�m*�-����s�=v��_��'�\u0015�!�M.\u0003T\u000e���\u001d��\u0019�A\u0015́���9�:�\u0003/FU��&<�S{�r�T�FV�)�]V�Ua3�p��Ԅ�\u000f�g*\u0012��IF��D�\u000f��ށ����i[���<����������s�y\u0012\fy\u0000\f�\u001b��#\u0019�\u000bRv��r_�ȱ��%�\u0010#:<���;'�vI2\u0006z��l\u0006B�\u0001f��\u0019\u001d�y��3>a5��VS����gp���\u0011���o����\u0018m\u0006�xU����\u0014w���W\t�+ں޶�z�P�\u0013�j噇�{�\u0006���uҤ<y,QR\u001ec����\n��q\u0006��W%�-t=\u001c�{ �ϒ�\u0004��K9A\r��C�Z��J��'s]��\u0017\u001a��\u0001��\u000f���F\u0002\u0018ؤ\u0000�X�l5fKi����'�o��7�R\u0016^�Ů���lK���Q��di�\u001cc|��D\u001c�?\u0013���5�\u0006\u00193�6ԋg\u000b>�\u001cZ��Mi�ҡu\u0007\u000f�>��\u0004�d�\u001ed�sD�[4k�����Sp\u001c�&���?/\u0003���N q\u0014u��@���\tN(\u0010���ѕ\u001c�G\u0006\r\t`�|���w��ڵ�t`]rWa\\8��Ӹ\n�x�+�o��C\u0015ֲxy����(A���g*'C�E�z\u0001\u0014�[bԡ��!\u0003\"�M\u0014.[�\n�\u001ehמ*\u0004�W�f!\u0011F��[���\r�Ћ1��5[���t\u001a�\b\u0005�h��|�n\u0004X�(�4:\u000e�\t����5vs��[��\f�`_�7Sa6Z�xE$\u0012�蕯N�g�&3�iP�0�����c�o�\u0013U,��6\u001f���\u0014��\u0005\u0014�]>��k�Z�p\u0003�j�w�\u0013�0�h\f���i���+��w��A�h\u0012��\u001fn%�O��0�5�5t���\u001a\u0016\u001f��t��\u0010��{f�f��\u0006�?\u001a�\u000e\u0014Z\u0010��y���\f�t\t;n)+`ad\u0007$�@\b�H5~m�ҽ�Wu���eIP����9�V�\u0015 ����\u0014ĐLy�jQ2^�C��\u0011]�c�u���\u0018���\\\u0000��o\u0001��\u00186?_�#^\u0005֞�U��\u0002��<\u001c�P GWSbc�\u0016\u0012\u0014Rp��6��w\u001cbmQk���j�Oq\u001d\u0016F\u0006^���\u0014J�v�����A��\u0006-�(�Ʉ���0\u0011����x�L�X7\u0013|X��3�z\u0005+(�\u0001E9�t\u000e\u001e\u0001��\u001e�\rQ+x��Ģ\u0017\u0000\u0000�.m�}�Uw�O�Ăs\u0018�\u0010{\u0015(��\u001b�|�)&�\u0005�\u001f�\u001c�Z6{�]�҆H�_��$�Kg��,�>‘ؑo\t�:u�.)b��|\u001eY �V�~-\u001b=�!�\u0018�'}K\r��:\u0000�\u0018Y��%B������\u0007�Uo%ڢ%�^�6$.\u0010l�����J�\u0012����7�KƱ�w\u0003Y�\u0004�_�/P���o\u0018b���[�\b\u000fՀ�ij������HY#W��\u0014�:m��Sǧ\u001a\u001c��8���\u0010�\u0004�U3�\u001f�����dw�eW\u0016���yV�z�����O�\u0012Y漭�Z�v��\u001d�5����1�G��+C���\\�g\n\u0006\u0011\u0002tL�\u0012i��ڱ� Ļ�.R$�><��\t��X�}*ЙT-Nzl�& <��\u0014�P��z:@�\"�قH\u0003�Q�='�\u0010�z\u0006>ӥ��\u0006��}p�}�}q�\u0011\t�ڵ$\u0010!\t�\u0017:�\b\u0002\u001eb�\u0017�|w�E�V\u001ae)��3%�Ʋ��>���P�\u0006BCt��B:�1!�;f�I�%\u0012�w�\u000e\u0007���r5\u001b\u0019\u00069.�V�a�S��\n3��46P�X� rP�k�Ӻ�+��ͨ�ù����D�\u0015O\bW��ҽ�\u001f�\u0003(]�]����V�����\u0015��=b�����N\n\t'�Y&&����hf`�0�-B<a�\u0013�\u0018��Wa��9\ny\u0006x��a[��M�\u000b��I-$��\u0003\u000b30M�7�\u0014�(\u001e�<�˼\u001a��\nNo\u0001)\u0018\u001a����7`o=��~:V`t�\u0004���s�\u000e��p�Z�&tG#\u0000\u0005\u0019�K3)OJ�\u0019��T�\u0004Si\u0004�.��O���^��ڇ��4\"��K\u0019\u0002��Gl��E\u0002�<��D�Z�s�\u0013�\n\u001af\u0005�)�{BS��N<\u001a�7�*g|מ\"��;8�\fx���8�j�\u0015�'3��0��F�5yNC\u001aIi��$u\b��R!����2m�7$36�/\t{��l`����/D��9�Hj\u001a�c�����\f�Y�\u0015WΧ���~z�H+JD�aWz3���ˢʛ3\u000e�\u0015x����\u001b�1\u001fCh�Ĭ\u0016GK��Sn�@��B\u0002�\"\u000e�\u0019��q(q\bd:\u0003�\u0019�f{����:�r�\u0017�\b\u0011ֶdH�\n��޺>>�Lۅ۽\u0007/Pb���ٷM\u0002\u0019��\u001aug���g��k�����\u001d�K�_\u0005�Dg�׺z��!�\u0014�s\r�B��^<�E���i�;\u0019^�\u001a�\u0018�/*Rd]>�\u000f��4��\\�^��g\\�\u0004�*�A�o�\u0018XJ�C�S�MR�<qF����Hכ}S��C�㆘���t��k�.<�\u0017��7������F>\u0012���\u001e\u00100�~�\u0017�c�:DC�j8�X�]\u000f7K=Nf\u001c.����\n\u0013\u001e�\u001fHe��-\u000e\u001b\u001eT�Y�\u0006$@.�`��J囷_��T ܪ\u000f(�\"�BJ��c�\u000e�i+�V>�Ք�k��$ׂ�\u0011�^��6��ȯ&R�\u001f��jXB6@�#\u0017~\u0015�H�F��\u0004\u001c�ǻ�`�)ݵ�\u001f�?�U���\u0010�#I\u001aL#\u001a\u0016xZ��=Gё\r�&�\r�\u0011�\f^�x��[\u0010�1\f���%`W���=��]�`���p�\u0003��C��\b�\\Ud\"��G.\u0010\u001f;�����\u0006/[ѓ���K�4}�5'���E6�\u00054j9<�LN\u001c@ʘ��+rΜ�y�ϽP�0K1h}�oT&\u001c�\\g2g�\u001d�<\u0002g�o���\u001aK�S�C\u0010;�1�m��6kE��\u001a� h�\n�\u0012\u000fLE�M�P~\u0001��ܰ�\u0014~Y�\t6��Zf��tPY\u0017&��S\u000f�o�l�d�)\bA����\u00006)�\u001e\u0012�<\u0018��3I��KJ�>�M:�\u0001:\u0013����r\u0012͜U|%d#c\u0011�\u0002\u0002����;�D\u0011��ID�1ힶY�r��u��\u0015=���5��X�\u0016\u0019�m��K�\u0017)\n�\u0006��Pג� א�)vW�C[H��N�\u001d\u001c\u0012o�\"0��ic�\t\u0007�\u0010\u001b)�\u0007\\���?\u0014KJ�D�tV{���Pb���붏N��e2�b���ɐ�cׇϼxN3���D镹[�W�\u0001�\u0017@�\fi�u��u�\u0006>�\\�VB�\f��\f\u000b�-�8�h4�'��S �\u0019$�\u0004�u��Ȉ�\u0007�]�Xp\u000fT��Q�A2B��\"K�ߓ�U�\u001aD�_'�䦯U�|\u0018;\u0000��\u0003��\n\u0011E�s�\u0002\u000f�%�DD\u001c�y���g\u001b�n\b\u0000Wo�����+e�zwV������\u001a@?�sz%�\t3<%ʉ\f���\u0001�${n �&=\u0018����r!}�n/�6\u0018�\tݯ��[�\by��9\u001c3{j�g\u0019��\u0014\r��[�H�K��{d�(�o�\u0003ĕ\bB�iˉ�®�y�2�T\u0005��\u001c�5��Y[���0x(Zմ�\u0013\u001f��Tt�\u0012��\u000b\u0016R�Õ\u0002�ӣ��`�CaY\u0015^b\u0006�Y�ꮑ _f��lf2}����\u00061ϱ��d\u0014\u0005\u001f_\u0011X�7��OBe\u000f��ᵤ��\u000f�>Z׆֓�P�g>dvn�\\�����\u0014���R��S1\u001dD.\u0003V�B.�]��,hт�#�Z��25<d�b�ц}-�M�H�9��C\u0010&y�T\"_���uR�I�\u0005bc��k\u0006�?ݝ�\u001aVy�q*��1�{B�\u0005�\u001b\u0011]�gd7��A}3]�e�\u0007Y��R�\u000bJ�w\t@��8�\\�6I�\u0003!��5s$�q\u0004�ޕ%���Q6LW[�<�C�����7�d6�OE�`�o�VJ�'\bve\u0017�P\u0002���\u001e����q�ާ�iV8f�\u0011je\u001a��+\u0019Ƞ��?����\t�\\~��^�`V\u001e�M@��d��Z2�\u0004�x}�l�v�s\\\u0006K$�᎗�q됎���&א)�̡�3>�d�\n\b�\u0017�\u0012%��̽_ܳ��<�G�\u0019��(ܟ�\u001ar��!�R)���#G$ג�C'���J�\u001a*�!WV����;�\u0002e\u0015];��ؾKЌʠ=�vD\r\u001eaW�N�v�8*V� <�f�,�\u0014%\u0011Os\u001fs�;�v��\u000f�q�\"a*���_l���&�wl\u00139��H��\u0013��,\n���x��q�?'\u0007\u0012b���\u001d\u00187�\u0000�)��\b�d}\\t�_^��Mlz�=\rQ�m�1�2\\�\u001c>�фYC�VS�|ƽ�\u0002�\u0004�����|\u0019�Uc(��4�.�]��'?����5eT�9�/�xnՐ]*Qe\u0002Ab��d#����ڦ�\u0007�\\W���\u0014rvS{�\u0003\"�et�؟_�?���b�W\u0007L\u000e�*.D�7\u0013\u001b���\u0003\u0003�Ȅ�6��$$�\u001e+���&+�Z\u001d�����2O\n��Ru3�d�K�F�\b_0\u001f\u0013�io?nm\u0005$E\u001c&�\n�9<�g����&�\u0016��\"����E��\"H��T2����9D2\n<0@���\u0014�xH�\u000f@\u001d�Pj��\u0012\u0011�\u0015\u0000���M���AQ��\u000e��\u0006���w8Q3I��\u0013��0\u0018\u0013�h�4|����(\u001a�bc���67�ڃk�`F\u000b��h����\u000e3m8}ך����� n3�\u0011���\u0019���\u0002S�\u0017?�E��Kfr�3o�L3�bk�ͽ����-QU��\u0011|1�dTy\n�y(����*\u001ft�ؐ�\\�7�l��7�P��Kѫ�]lʒ��gxT\u0016#-I�Ǟ6\u0015�$�P��I�\\G�3Wu�����2jl^)�sV%�U��B�Z�b�W��>\u0003��)��\\\u001e1{�\u0013�\u001f��|��\u00129�\u0000�[<�|\u000e{@�\u0016�\u001e�\u0004�\u0017\\��r�z�!�g%4\"D7:E�\b�\u000f|�~\u000bh$rn�򈚒��0ꊷ�\u0010y\\�\"m�\u0015Yii&�u�^嵋p(�B�}F���X��H��\u0012\u001b��-��N��tI��P��*��.C�4�E��ٮ\b=�\u000f��\u0001�\"����Y���T\u001c�=���>P�Lg��T̑)�[��m����\u0011\u0005{��2ٜ��v�2\u0016�D�ۚ<����1\u0005�q���,��ښ�W��X!\"L��\"��w���_��Q&1\r�ó'�{eP\"�(�\r�\u0005��C�D�[0!�]���/w��\u0017�\u001f���B���ȱ�$oA3��O��=\u0015$��\u0017\u0013\nzK*r�\u0014�\\\u001ex�$\u0019��7\u0015/vN\u0001K�%�=\u0004X�9YJvC�\u001avm\u0007�\u001b��E�� j(m�v��c�#~�z�\u0000�*\u001dx����\r�3_\u001eX\u001a�\u0018�\u001dla�t�Z\u0001�G_�T\f����z�=�U�\u001e\u0017��78Q1�U�\u0012\n�&�˞HEC\u0010{��ʭ�e�\u001c�p\u0019\u0017B��bFu�ʴI�\u0004�8�E�1y\u0011\u0013\u0013]}�\u001f�xK]\u000eӡ�z;�f)�-�N�=ꉑg#��m-����c�ë`c�\u0011��c�h�}n\u0010�\u0010)o�f^�Z��l�Wz�E^\u0005�\\J��ó^��\b��7''ٲΧR�\u0014\u001ar���\u0013����L���d@�\u001b�!\u0015���j��'��_!\u0001JTR\u0015�� !M���o\u001e\t���︛�︛׎�m�5��\u0016�h�\u0012�h�*\u00166>A�\u0013\rێ�m�5��\f�c�\b�>��M�Fz�\u0014<헁B�KS���e!�� �K����d:\nvAvx\u0007�DŽWdV�\u001a�\u0002\u0013 6�\u0016�\rwF!��ɜڏ�b�y�&\u000b�ξ\u001e8�<��s��`\n�\u0001���ܳ=��_�+�ήCѐ;)>�f�\rU\u0007�&������\u000f���TCcK���fWu���u���*�� .�����\u0000#元��\u0000\u0014�7��Q-�͜��F�\nR��y(���ȵׄ#�����DYyCS�$\u0004�!�ia\u0019J�FR���\r��Ȅ�Q75�����;\u0007�_�eI��\u001a\t\u0015�\bE�X\rX���)hn��\u000b�1\u0011�\u001d8�V<g\u001bz�\u0004!\u0001\u001fS��NB\n�J�,�\u0019|Xc�\u0017�݀�\u001c�[a�4�lZ��\u0018�v⏪8\u0005�MF\u0005��$P\u0004���m�\u001e�\u001eƖK���jm���X��\u0007��VYۺ�T\u0015�X\u001beV��X@f*��O�z�)��Xs\"\u001b�b�\u001b\u0014(��\u0017֔׿xi�\u0018��\u001d^\u001c6#\\\"���b�d~=�\u0010�\u001as\u001f��?�a�D��[��[\tN�s�\r�ѽS��ڀ=�����;�U�W�������\u000f�\u001b�\u0002i��<�\u0003Qf~$�x<�\r�hn<����׉v��ϓf�6>�\u001e\u001cL�\u001bQ�~��R(�+D*�\u0015�\u000b\b��\u001b\u0012+|��!�����R����cV�w��h�i�,��Q�ߤ#L�G�,@��?V�W��y�چ�~���\u0006{��o�<\u0003\u0016\u0006�Z�\u001c\u0005�s*S��Pp�A��\u0018�iO?\u0010��cM�6�G@/#)otU��Īņ𜔠��\\����ҿ+��F\u001e���3K�\\��jA��\u001a\u001e������\u0015�ә\u001ar��NP�\n�U�N\u001f_�\b�g&Ͳ\u0016���^!���i �\u0004\u000b���W�(�SQ�{>\u001dp���\u001dg\u000f�\noE�L��\u00010TϚ\u0010���3#�\t��I����I��{�Y��(IW!x�JNx���)���\u0017�~�.��H��1�\u000b/T\u001d\u001a�걨)�7Y��hU�\u0001„�����d��\u000e��ƪ�\u001c�2l\u001bNR��l%�lƉ�8\u0002��z�/�F�Y��=��w�S2\bϸ��ƱLz�2��*\u0002���\u000f��!~�\u001c\u0013Нb�5\u0017|4N\b^�!�֦\u001f׸�ė���7�\u0015ft��\bE��i\u0012^!9��(��e\u0016���[\u0006AB\u0011Vwk��Ys\u000eC\u0015��R�b�!(I�u��\u0003��\b��\u0018Y�l����=�jTi���%���5w��O�\u000bU��s\u0001��_�\ni�\u001e\u0018=�N\u0011D3�\u001c�\u001a��A{Z%�\u000f��\u0019�*��\u001c�\u0007���J/&�.�7A���u��Rt��$��<�\u0002��U\u000f�դXՀ�\u001e�O,�'���\u000fk\u001f�~O\u001bS\u0003zQ���ԍw%p\b�'�\u000e\u000f\u0001;\u0015vЌ�AeE�:� \u00008�\u0014_�h������;\u001b�3/Ԁ�0�*���}\u0011��Av�´\u001a��K�[ڢmL�\u0007�@Ք�Y�\u0000",
21
+ "type": "registry:file",
22
+ "target": "src/assets/placeholder.webp"
15
23
  }
16
24
  ],
17
25
  "type": "registry:block"
@@ -1,10 +1,13 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "sheet",
4
+ "dependencies": [
5
+ "@data-slot/dialog",
6
+ "@lucide/astro"
7
+ ],
4
8
  "registryDependencies": [
5
9
  "@fulldev/button",
6
- "@fulldev/dialog",
7
- "@fulldev/icon"
10
+ "@fulldev/dialog"
8
11
  ],
9
12
  "files": [
10
13
  {
@@ -19,7 +22,7 @@
19
22
  },
20
23
  {
21
24
  "path": "src/components/ui/sheet/sheet-content.astro",
22
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport DialogPortal from \"@/components/ui/dialog/dialog-portal.astro\"\nimport { Icon } from \"@/components/ui/icon\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n showCloseButton?: boolean\n}\n\nconst {\n class: className,\n side = \"right\",\n showCloseButton = true,\n style,\n ...props\n} = Astro.props\n---\n\n<DialogPortal>\n <div\n data-slot=\"dialog-overlay\"\n hidden\n class=\"fixed inset-0 z-50 bg-black/10 transition-opacity duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0 supports-backdrop-filter:backdrop-blur-xs\"\n style=\"z-index: calc(var(--dialog-overlay-stack-index, 0) + 100);\"\n >\n </div>\n <div\n data-slot=\"dialog-content\"\n data-side={side}\n hidden\n class={cn(\n \"bg-popover text-popover-foreground fixed z-50 flex flex-col gap-4 bg-clip-padding text-sm shadow-lg transition duration-200 ease-in-out outline-none data-ending-style:opacity-0 data-starting-style:opacity-0 data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=bottom]:data-ending-style:translate-y-10 data-[side=bottom]:data-starting-style:translate-y-10 data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=left]:data-ending-style:-translate-x-10 data-[side=left]:data-starting-style:-translate-x-10 data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=right]:data-ending-style:translate-x-10 data-[side=right]:data-starting-style:translate-x-10 data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=top]:data-ending-style:-translate-y-10 data-[side=top]:data-starting-style:-translate-y-10 data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm\",\n \"bg-popover text-popover-foreground fixed z-50 flex flex-col gap-4 bg-clip-padding text-sm shadow-lg transition duration-200 ease-in-out outline-none data-ending-style:opacity-0 data-starting-style:opacity-0 data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=bottom]:data-ending-style:translate-y-10 data-[side=bottom]:data-starting-style:translate-y-10 data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=left]:data-ending-style:-translate-x-10 data-[side=left]:data-starting-style:-translate-x-10 data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=right]:data-ending-style:translate-x-10 data-[side=right]:data-starting-style:translate-x-10 data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=top]:data-ending-style:-translate-y-10 data-[side=top]:data-starting-style:-translate-y-10 data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm\",\n className\n )}\n style={`z-index: calc(var(--dialog-content-stack-index, 0) + 101);${style ? ` ${style}` : \"\"}`}\n {...props}\n >\n <slot />\n {\n showCloseButton && (\n <Button\n type=\"button\"\n data-slot=\"dialog-close\"\n variant=\"ghost\"\n size=\"icon-sm\"\n class=\"absolute top-3 right-3\"\n >\n <Icon name=\"x\" class=\"size-4\" />\n <span class=\"sr-only\">Close</span>\n </Button>\n )\n }\n </div>\n</DialogPortal>\n",
25
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport XIcon from \"@lucide/astro/icons/x\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport DialogPortal from \"@/components/ui/dialog/dialog-portal.astro\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n showCloseButton?: boolean\n}\n\nconst {\n class: className,\n side = \"right\",\n showCloseButton = true,\n style,\n ...props\n} = Astro.props\n---\n\n<DialogPortal>\n <div\n data-slot=\"dialog-overlay\"\n hidden\n class=\"fixed inset-0 z-50 bg-black/10 transition-opacity duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0 supports-backdrop-filter:backdrop-blur-xs\"\n style=\"z-index: calc(var(--dialog-overlay-stack-index, 0) + 100);\"\n >\n </div>\n <div\n data-slot=\"dialog-content\"\n data-side={side}\n hidden\n class={cn(\n \"bg-popover text-popover-foreground fixed z-50 flex flex-col gap-4 bg-clip-padding text-sm shadow-lg transition duration-200 ease-in-out outline-none data-ending-style:opacity-0 data-starting-style:opacity-0 data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=bottom]:data-ending-style:translate-y-[2.5rem] data-[side=bottom]:data-starting-style:translate-y-[2.5rem] data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=left]:data-ending-style:translate-x-[-2.5rem] data-[side=left]:data-starting-style:translate-x-[-2.5rem] data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=right]:data-ending-style:translate-x-[2.5rem] data-[side=right]:data-starting-style:translate-x-[2.5rem] data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=top]:data-ending-style:translate-y-[-2.5rem] data-[side=top]:data-starting-style:translate-y-[-2.5rem] data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm\",\n className\n )}\n style={`z-index: calc(var(--dialog-content-stack-index, 0) + 101);${style ? ` ${style}` : \"\"}`}\n {...props}\n >\n <slot />\n {\n showCloseButton && (\n <Button\n type=\"button\"\n data-slot=\"dialog-close\"\n variant=\"ghost\"\n size=\"icon-sm\"\n class=\"absolute top-4 right-4\"\n >\n <XIcon />\n <span class=\"sr-only\">Close</span>\n </Button>\n )\n }\n </div>\n</DialogPortal>\n",
23
26
  "type": "registry:ui"
24
27
  },
25
28
  {
@@ -1,6 +1,9 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "sidebar-1",
4
+ "dependencies": [
5
+ "@lucide/astro"
6
+ ],
4
7
  "registryDependencies": [
5
8
  "@fulldev/breadcrumb",
6
9
  "@fulldev/button",
@@ -9,7 +12,6 @@
9
12
  "@fulldev/dropdown-menu",
10
13
  "@fulldev/header",
11
14
  "@fulldev/icon",
12
- "@fulldev/input-group",
13
15
  "@fulldev/kbd",
14
16
  "@fulldev/layout",
15
17
  "@fulldev/logo",
@@ -20,7 +22,7 @@
20
22
  "files": [
21
23
  {
22
24
  "path": "src/components/blocks/sidebar-1.astro",
23
- "content": "---\nimport { cn } from \"@/lib/utils\"\nimport {\n Breadcrumb,\n BreadcrumbEllipsis,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n Command,\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandShortcut,\n} from \"@/components/ui/command\"\nimport { Dialog, DialogTrigger } from \"@/components/ui/dialog\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { Header, HeaderContainer, HeaderGroup } from \"@/components/ui/header\"\nimport { Icon } from \"@/components/ui/icon\"\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupInput,\n} from \"@/components/ui/input-group\"\nimport { Kbd } from \"@/components/ui/kbd\"\nimport { LogoImage, LogoText } from \"@/components/ui/logo\"\nimport { Separator } from \"@/components/ui/separator\"\nimport {\n Sidebar,\n SidebarContent,\n SidebarGroup,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInset,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarProvider,\n SidebarTrigger,\n} from \"@/components/ui/sidebar\"\nimport { ThemeToggle } from \"@/components/ui/theme-toggle\"\n\ntype Props = {\n class?: string\n logo: {\n label: string\n href: string\n src?: any\n srcLight?: any\n srcDark?: any\n alt?: string\n }\n search: {\n label: string\n empty: string\n items: {\n label: string\n href: string\n title: string\n path: string\n description: string\n group: string\n }[]\n }\n breadcrumb: {\n items: {\n label: string\n href: string\n }[]\n menu: {\n label: string\n href: string\n }[]\n }\n navigation: {\n label: string\n href: string\n links?: {\n label: string\n href: string\n }[]\n }[]\n githubRepo: string\n}\n\nconst {\n class: className,\n logo,\n search,\n breadcrumb,\n navigation,\n githubRepo,\n}: Props = Astro.props\n\nconst normalizePath = (path: string) => {\n if (path === \"/\") return path\n\n return path.replace(/\\/$/, \"\")\n}\nconst currentPath = normalizePath(Astro.url.pathname)\nconst searchGroups = search.items.reduce<\n { label: string; items: typeof search.items }[]\n>((groups, item) => {\n const group = groups.find((entry) => entry.label === item.group)\n\n if (group) {\n group.items.push(item)\n } else {\n groups.push({ label: item.group, items: [item] })\n }\n\n return groups\n}, [])\n\nconst githubStars = \"560+\"\n---\n\n<SidebarProvider>\n <Sidebar class={cn(\"\", className)} collapsible=\"offcanvas\" variant=\"inset\">\n <SidebarHeader class=\"flex-col\">\n <SidebarMenuButton size=\"lg\" variant=\"ghost\" href={logo.href}>\n <LogoImage\n src={logo.src}\n srcLight={logo.srcLight}\n srcDark={logo.srcDark}\n alt={logo.alt}\n />\n <LogoText class=\"font-semibold\">{logo.label}</LogoText>\n </SidebarMenuButton>\n <Dialog class=\"w-full\" data-search-dialog>\n <DialogTrigger\n as=\"div\"\n role=\"button\"\n tabindex=\"0\"\n class=\"h-auto w-full cursor-pointer border-0 bg-transparent p-0 shadow-none hover:bg-transparent\"\n aria-keyshortcuts=\"Meta+K Control+K\"\n >\n <InputGroup class=\"h-8 shadow-none\">\n <InputGroupInput\n placeholder={search.label}\n readonly\n tabindex=\"-1\"\n aria-label={search.label}\n class=\"cursor-pointer\"\n />\n <InputGroupAddon>\n <Icon name=\"search\" />\n </InputGroupAddon>\n <InputGroupAddon align=\"inline-end\">\n <Kbd data-search-modifier>⌘</Kbd>\n <Kbd>K</Kbd>\n </InputGroupAddon>\n </InputGroup>\n </DialogTrigger>\n\n <CommandDialog title={search.label} description={search.label}>\n <Command\n class=\"[&_[data-slot=command-item][data-selected]]:bg-accent [&_[data-slot=command-item][data-selected]]:text-accent-foreground\"\n >\n <CommandInput placeholder={search.label} />\n <CommandList>\n <CommandEmpty>{search.empty}</CommandEmpty>\n\n {\n searchGroups.map((group) => (\n <CommandGroup heading={group.label}>\n {group.items.map((item) => (\n <CommandItem\n href={item.href}\n value={item.path}\n label={item.label}\n keywords={[item.title, item.path]}\n >\n {item.label}\n <CommandShortcut>{item.href}</CommandShortcut>\n </CommandItem>\n ))}\n </CommandGroup>\n ))\n }\n </CommandList>\n </Command>\n </CommandDialog>\n </Dialog>\n </SidebarHeader>\n <SidebarContent\n class=\"mask-[linear-gradient(to_bottom,transparent,black_1rem,black_calc(100%-1rem),transparent)] [-webkit-mask-image:linear-gradient(to_bottom,transparent,black_1rem,black_calc(100%-1rem),transparent)] group-data-[collapsible=icon]:mask-none group-data-[collapsible=icon]:[-webkit-mask-image:none]\"\n >\n {\n navigation.map((group) => (\n <SidebarGroup>\n <SidebarGroupLabel>{group.label}</SidebarGroupLabel>\n <SidebarMenu>\n {(group.links ?? [group]).map((item) => (\n <SidebarMenuItem>\n <SidebarMenuButton\n href={item.href}\n isActive={normalizePath(item.href) === currentPath}\n >\n <span>{item.label}</span>\n </SidebarMenuButton>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarGroup>\n ))\n }\n </SidebarContent>\n </Sidebar>\n <SidebarInset>\n <Header class=\"h-16\">\n <HeaderContainer class=\"max-w-none justify-between\">\n <HeaderGroup class=\"flex-1 md:flex-none\">\n <SidebarTrigger />\n <Separator orientation=\"vertical\" class=\"my-auto mr-2 h-4\" />\n <Dialog class=\"block min-w-0 flex-1 md:hidden\" data-search-dialog>\n <DialogTrigger\n as=\"div\"\n role=\"button\"\n tabindex=\"0\"\n class=\"h-auto w-full cursor-pointer border-0 bg-transparent p-0 shadow-none hover:bg-transparent\"\n aria-keyshortcuts=\"Meta+K Control+K\"\n >\n <InputGroup class=\"h-8 shadow-none\">\n <InputGroupInput\n placeholder={search.label}\n readonly\n tabindex=\"-1\"\n aria-label={search.label}\n class=\"cursor-pointer\"\n />\n <InputGroupAddon>\n <Icon name=\"search\" />\n </InputGroupAddon>\n </InputGroup>\n </DialogTrigger>\n\n <CommandDialog title={search.label} description={search.label}>\n <Command\n class=\"[&_[data-slot=command-item][data-selected]]:bg-accent [&_[data-slot=command-item][data-selected]]:text-accent-foreground\"\n >\n <CommandInput placeholder={search.label} />\n <CommandList>\n <CommandEmpty>{search.empty}</CommandEmpty>\n\n {\n searchGroups.map((group) => (\n <CommandGroup heading={group.label}>\n {group.items.map((item) => (\n <CommandItem\n href={item.href}\n value={item.path}\n label={item.label}\n keywords={[item.title, item.path]}\n >\n {item.label}\n <CommandShortcut>{item.href}</CommandShortcut>\n </CommandItem>\n ))}\n </CommandGroup>\n ))\n }\n </CommandList>\n </Command>\n </CommandDialog>\n </Dialog>\n <Breadcrumb class=\"hidden md:block\">\n <BreadcrumbList>\n {\n breadcrumb.items.map((item, index) => {\n const isLast = index === breadcrumb.items.length - 1\n const isHome = item.href === \"/\"\n const hasMenu =\n !isHome &&\n breadcrumb.menu.some(\n (menuItem) =>\n normalizePath(menuItem.href) ===\n normalizePath(item.href)\n )\n\n return (\n <>\n {index > 0 && (\n <BreadcrumbSeparator>/</BreadcrumbSeparator>\n )}\n <BreadcrumbItem>\n {hasMenu ? (\n <DropdownMenu>\n <DropdownMenuTrigger\n aria-label={`${item.label} pages`}\n aria-current={isLast ? \"page\" : undefined}\n class={cn(\n \"hover:text-foreground inline-flex items-center gap-1 transition-colors\",\n isLast && \"text-foreground\"\n )}\n >\n {item.label}\n <Icon\n name=\"chevron-down\"\n class=\"size-3.5 opacity-70\"\n aria-hidden=\"true\"\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuGroup>\n {breadcrumb.menu.map((menuItem) => (\n <a\n href={menuItem.href}\n aria-current={\n normalizePath(menuItem.href) ===\n currentPath\n ? \"page\"\n : undefined\n }\n class=\"hover:bg-accent hover:text-accent-foreground aria-[current=page]:text-foreground flex items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none select-none\"\n >\n {menuItem.label}\n </a>\n ))}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : isLast ? (\n <BreadcrumbPage>{item.label}</BreadcrumbPage>\n ) : (\n <BreadcrumbLink href={item.href}>\n {item.label}\n </BreadcrumbLink>\n )}\n </BreadcrumbItem>\n </>\n )\n })\n }\n {\n breadcrumb.menu.length > 0 && currentPath === \"/\" && (\n <>\n <BreadcrumbSeparator>/</BreadcrumbSeparator>\n <BreadcrumbItem>\n <DropdownMenu>\n <DropdownMenuTrigger\n aria-label=\"Open page menu\"\n class=\"hover:text-foreground inline-flex items-center leading-none transition-colors\"\n >\n <BreadcrumbEllipsis />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuGroup>\n {breadcrumb.menu.map((item) => (\n <a\n href={item.href}\n class=\"hover:bg-accent hover:text-accent-foreground flex items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none select-none\"\n >\n {item.label}\n </a>\n ))}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n </BreadcrumbItem>\n </>\n )\n }\n </BreadcrumbList>\n </Breadcrumb>\n </HeaderGroup>\n <HeaderGroup>\n <Button\n as=\"a\"\n href={`https://github.com/${githubRepo}`}\n size=\"sm\"\n variant=\"ghost\"\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label={`View ${githubRepo} on GitHub, ${githubStars}`}\n >\n <Icon name=\"github\" />\n <span>{githubStars}</span>\n </Button>\n <ThemeToggle />\n </HeaderGroup>\n </HeaderContainer>\n </Header>\n <slot />\n </SidebarInset>\n</SidebarProvider>\n\n<script>\n const isMac = /Mac|iPhone|iPad|iPod/i.test(\n navigator.platform || navigator.userAgent\n )\n\n document.querySelectorAll(\"[data-search-modifier]\").forEach((shortcut) => {\n shortcut.textContent = isMac ? \"⌘\" : \"Ctrl\"\n })\n\n document.addEventListener(\"keydown\", (event) => {\n if (event.key.toLowerCase() !== \"k\") return\n if (event.shiftKey || event.altKey) return\n\n const dialogs = Array.from(\n document.querySelectorAll(\"[data-search-dialog]\")\n )\n const dialog =\n dialogs.find((dialog) => dialog.getClientRects().length > 0) ?? dialogs[0]\n const isSearchShortcut = isMac\n ? event.metaKey && !event.ctrlKey\n : event.ctrlKey && !event.metaKey\n\n if (!dialog || dialog.hasAttribute(\"data-open\") || !isSearchShortcut) return\n\n event.preventDefault()\n dialog.dispatchEvent(\n new CustomEvent(\"dialog:set\", { detail: { open: true } })\n )\n })\n</script>\n",
25
+ "content": "---\nimport ChevronDownIcon from \"@lucide/astro/icons/chevron-down\"\nimport SearchIcon from \"@lucide/astro/icons/search\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n Breadcrumb,\n BreadcrumbEllipsis,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n Command,\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandShortcut,\n} from \"@/components/ui/command\"\nimport { Dialog, DialogTrigger } from \"@/components/ui/dialog\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { Header, HeaderContainer, HeaderGroup } from \"@/components/ui/header\"\nimport { Icon } from \"@/components/ui/icon\"\nimport { Kbd } from \"@/components/ui/kbd\"\nimport { LogoImage, LogoText } from \"@/components/ui/logo\"\nimport { Separator } from \"@/components/ui/separator\"\nimport {\n Sidebar,\n SidebarContent,\n SidebarGroup,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInset,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarProvider,\n SidebarTrigger,\n} from \"@/components/ui/sidebar\"\nimport { ThemeToggle } from \"@/components/ui/theme-toggle\"\n\ntype Props = {\n class?: string\n logo: {\n label: string\n href: string\n src?: any\n srcLight?: any\n srcDark?: any\n alt?: string\n }\n search: {\n label: string\n empty: string\n items: {\n label: string\n href: string\n title: string\n path: string\n description: string\n group: string\n }[]\n }\n breadcrumb: {\n items: {\n label: string\n href: string\n }[]\n menu: {\n label: string\n href: string\n }[]\n }\n navigation: {\n label: string\n href: string\n links?: {\n label: string\n href: string\n }[]\n }[]\n githubRepo: string\n}\n\nconst {\n class: className,\n logo,\n search,\n breadcrumb,\n navigation,\n githubRepo,\n}: Props = Astro.props\n\nconst normalizePath = (path: string) => {\n if (path === \"/\") return path\n\n return path.replace(/\\/$/, \"\")\n}\nconst currentPath = normalizePath(Astro.url.pathname)\nconst searchGroups = search.items.reduce<\n { label: string; items: typeof search.items }[]\n>((groups, item) => {\n const group = groups.find((entry) => entry.label === item.group)\n\n if (group) {\n group.items.push(item)\n } else {\n groups.push({ label: item.group, items: [item] })\n }\n\n return groups\n}, [])\n\nlet githubStars = \"Stars\"\n\ntry {\n const response = await fetch(`https://api.github.com/repos/${githubRepo}`)\n const data = await response.json()\n\n if (response.ok && typeof data.stargazers_count === \"number\") {\n githubStars = new Intl.NumberFormat().format(data.stargazers_count)\n }\n} catch {\n // Keep the fallback label when GitHub is unavailable.\n}\n---\n\n<SidebarProvider>\n <Sidebar class={cn(\"\", className)} collapsible=\"offcanvas\" variant=\"inset\">\n <SidebarHeader class=\"flex-col\">\n <SidebarMenuButton size=\"lg\" variant=\"ghost\" href={logo.href}>\n <LogoImage\n src={logo.src}\n srcLight={logo.srcLight}\n srcDark={logo.srcDark}\n alt={logo.alt}\n />\n <LogoText class=\"font-semibold\">{logo.label}</LogoText>\n </SidebarMenuButton>\n <Dialog class=\"w-full\" data-search-dialog>\n <DialogTrigger\n variant=\"outline\"\n size=\"sm\"\n class=\"w-full justify-start shadow-none\"\n aria-keyshortcuts=\"Meta+K Control+K\"\n >\n <SearchIcon data-icon=\"inline-start\" />\n <span class=\"truncate\">{search.label}</span>\n <Kbd\n class=\"bg-background/80 ml-auto h-4 min-w-4 translate-y-0 px-1 text-[10px]\"\n data-search-shortcut\n >\n ⌘ + K\n </Kbd>\n </DialogTrigger>\n\n <CommandDialog title={search.label} description={search.label}>\n <Command\n class=\"[&_[data-slot=command-item][data-selected]]:bg-accent [&_[data-slot=command-item][data-selected]]:text-accent-foreground\"\n >\n <CommandInput placeholder={search.label} />\n <CommandList>\n <CommandEmpty>{search.empty}</CommandEmpty>\n\n {\n searchGroups.map((group) => (\n <CommandGroup heading={group.label}>\n {group.items.map((item) => (\n <CommandItem\n href={item.href}\n value={`${item.group} ${item.label}`}\n label={item.label}\n keywords={[\n item.group,\n item.title,\n item.path,\n item.description,\n ]}\n >\n {item.label}\n <CommandShortcut>{item.href}</CommandShortcut>\n </CommandItem>\n ))}\n </CommandGroup>\n ))\n }\n </CommandList>\n </Command>\n </CommandDialog>\n </Dialog>\n </SidebarHeader>\n <SidebarContent\n class=\"[mask-image:linear-gradient(to_bottom,transparent,black_1rem,black_calc(100%_-_1rem),transparent)] [-webkit-mask-image:linear-gradient(to_bottom,transparent,black_1rem,black_calc(100%_-_1rem),transparent)] group-data-[collapsible=icon]:[mask-image:none] group-data-[collapsible=icon]:[-webkit-mask-image:none]\"\n >\n {\n navigation.map((group) => (\n <SidebarGroup>\n <SidebarGroupLabel>{group.label}</SidebarGroupLabel>\n <SidebarMenu>\n {(group.links ?? [group]).map((item) => (\n <SidebarMenuItem>\n <SidebarMenuButton\n href={item.href}\n isActive={normalizePath(item.href) === currentPath}\n >\n <span>{item.label}</span>\n </SidebarMenuButton>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarGroup>\n ))\n }\n </SidebarContent>\n </Sidebar>\n <SidebarInset>\n <Header class=\"h-16\">\n <HeaderContainer class=\"max-w-none justify-between\">\n <HeaderGroup>\n <SidebarTrigger />\n <Separator orientation=\"vertical\" class=\"my-auto mr-2 h-4\" />\n <Breadcrumb>\n <BreadcrumbList>\n {\n breadcrumb.items.map((item, index) => {\n const isLast = index === breadcrumb.items.length - 1\n const isHome = item.href === \"/\"\n const hasMenu =\n !isHome &&\n breadcrumb.menu.some(\n (menuItem) =>\n normalizePath(menuItem.href) ===\n normalizePath(item.href)\n )\n\n return (\n <>\n {index > 0 && (\n <BreadcrumbSeparator>/</BreadcrumbSeparator>\n )}\n <BreadcrumbItem>\n {hasMenu ? (\n <DropdownMenu>\n <DropdownMenuTrigger\n aria-current={isLast ? \"page\" : undefined}\n class={cn(\n \"hover:text-foreground inline-flex items-center gap-1 transition-colors\",\n isLast && \"text-foreground\"\n )}\n >\n {item.label}\n <ChevronDownIcon\n class=\"size-3.5 opacity-70\"\n aria-hidden=\"true\"\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuGroup>\n {breadcrumb.menu.map((menuItem) => (\n <a\n href={menuItem.href}\n aria-current={\n normalizePath(menuItem.href) ===\n currentPath\n ? \"page\"\n : undefined\n }\n class=\"hover:bg-accent hover:text-accent-foreground aria-[current=page]:text-foreground flex items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none select-none\"\n >\n {menuItem.label}\n </a>\n ))}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : isLast ? (\n <BreadcrumbPage>{item.label}</BreadcrumbPage>\n ) : (\n <BreadcrumbLink href={item.href}>\n {item.label}\n </BreadcrumbLink>\n )}\n </BreadcrumbItem>\n </>\n )\n })\n }\n {\n breadcrumb.menu.length > 0 && currentPath === \"/\" && (\n <>\n <BreadcrumbSeparator>/</BreadcrumbSeparator>\n <BreadcrumbItem>\n <DropdownMenu>\n <DropdownMenuTrigger class=\"hover:text-foreground inline-flex items-center leading-none transition-colors\">\n <BreadcrumbEllipsis />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuGroup>\n {breadcrumb.menu.map((item) => (\n <a\n href={item.href}\n class=\"hover:bg-accent hover:text-accent-foreground flex items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none select-none\"\n >\n {item.label}\n </a>\n ))}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n </BreadcrumbItem>\n </>\n )\n }\n </BreadcrumbList>\n </Breadcrumb>\n </HeaderGroup>\n <HeaderGroup>\n <Button\n as=\"a\"\n href={`https://github.com/${githubRepo}`}\n size=\"sm\"\n variant=\"ghost\"\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label={`View ${githubRepo} on GitHub`}\n >\n <Icon name=\"github\" />\n <span>{githubStars}</span>\n </Button>\n <ThemeToggle />\n </HeaderGroup>\n </HeaderContainer>\n </Header>\n <slot />\n </SidebarInset>\n</SidebarProvider>\n\n<script>\n const isMac = /Mac|iPhone|iPad|iPod/i.test(\n navigator.platform || navigator.userAgent\n )\n\n document.querySelectorAll(\"[data-search-shortcut]\").forEach((shortcut) => {\n shortcut.textContent = isMac ? \"⌘ + K\" : \"Ctrl + K\"\n })\n\n document.addEventListener(\"keydown\", (event) => {\n if (event.key.toLowerCase() !== \"k\") return\n if (event.shiftKey || event.altKey) return\n\n const dialog = document.querySelector(\"[data-search-dialog]\")\n const isSearchShortcut = isMac\n ? event.metaKey && !event.ctrlKey\n : event.ctrlKey && !event.metaKey\n\n if (!dialog || dialog.hasAttribute(\"data-open\") || !isSearchShortcut) return\n\n event.preventDefault()\n dialog.dispatchEvent(\n new CustomEvent(\"dialog:set\", { detail: { open: true } })\n )\n })\n</script>\n",
24
26
  "type": "registry:block"
25
27
  }
26
28
  ],
@@ -1,6 +1,10 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "sidebar",
4
+ "dependencies": [
5
+ "@data-slot/tooltip",
6
+ "@lucide/astro"
7
+ ],
4
8
  "registryDependencies": [
5
9
  "@fulldev/layout",
6
10
  "@fulldev/button",
@@ -8,28 +12,27 @@
8
12
  "@fulldev/separator",
9
13
  "@fulldev/sheet",
10
14
  "@fulldev/skeleton",
11
- "@fulldev/icon",
12
15
  "@fulldev/tooltip"
13
16
  ],
14
17
  "files": [
15
18
  {
16
19
  "path": "src/components/ui/sidebar/sidebar-provider.astro",
17
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n}\n\nconst {\n class: className,\n style,\n defaultOpen = true,\n open,\n ...props\n} = Astro.props\n\nconst resolvedStyle = [\n `--sidebar-width: ${SIDEBAR_WIDTH}`,\n `--sidebar-width-mobile: ${SIDEBAR_WIDTH_MOBILE}`,\n `--sidebar-width-icon: ${SIDEBAR_WIDTH_ICON}`,\n typeof style === \"string\" ? style : undefined,\n]\n .filter(Boolean)\n .join(\"; \")\n---\n\n<div\n data-slot=\"sidebar-wrapper\"\n data-default-open={defaultOpen ? \"true\" : \"false\"}\n data-open={open === undefined ? undefined : open ? \"true\" : \"false\"}\n data-sidebar-initializing=\"true\"\n style={resolvedStyle}\n class={cn(\n \"group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full\",\n className\n )}\n {...props}\n>\n <slot />\n <style is:inline>\n [data-slot=\"sidebar-wrapper\"][data-sidebar-initializing=\"true\"]\n [data-slot=\"sidebar-gap\"],\n [data-slot=\"sidebar-wrapper\"][data-sidebar-initializing=\"true\"]\n [data-slot=\"sidebar-container\"] {\n transition: none !important;\n }\n </style>\n <script is:inline>\n ;(() => {\n window.__fulldevSyncSidebarProvider ??= (provider, open) => {\n const state = open ? \"expanded\" : \"collapsed\"\n const sidebar = provider.querySelector(\n \"[data-slot='sidebar']:not([data-mobile='true'])\"\n )\n const collapsible = sidebar?.dataset.sidebarCollapsible ?? \"offcanvas\"\n\n provider.dataset.open = open ? \"true\" : \"false\"\n provider.dataset.state = state\n\n if (sidebar) {\n sidebar.dataset.state = collapsible === \"none\" ? \"expanded\" : state\n sidebar.dataset.collapsible =\n collapsible === \"none\" ? \"none\" : open ? \"\" : collapsible\n }\n\n provider\n .querySelectorAll(\"[data-sidebar='trigger'], [data-sidebar='rail']\")\n .forEach((control) => {\n control.setAttribute(\"aria-expanded\", String(open))\n })\n\n provider\n .querySelectorAll(\"[data-sidebar='menu-tooltip']\")\n .forEach((tooltip) => {\n tooltip.hidden = state !== \"collapsed\"\n })\n }\n\n const provider = document.currentScript?.closest(\n \"[data-slot='sidebar-wrapper']\"\n )\n if (!(provider instanceof HTMLElement)) return\n\n const controlledOpen = provider.dataset.open\n const cookieValue = document.cookie\n .split(\"; \")\n .find((entry) => entry.startsWith(\"sidebar_state=\"))\n ?.slice(\"sidebar_state=\".length)\n\n const isOpen =\n controlledOpen === \"true\" || controlledOpen === \"false\"\n ? controlledOpen === \"true\"\n : cookieValue === \"true\" || cookieValue === \"false\"\n ? cookieValue === \"true\"\n : provider.dataset.defaultOpen !== \"false\"\n\n provider.dataset.openMobile = \"false\"\n window.__fulldevSyncSidebarProvider(provider, isOpen)\n requestAnimationFrame(() => {\n provider.removeAttribute(\"data-sidebar-initializing\")\n })\n })()\n </script>\n</div>\n\n<script is:inline>\n ;(() => {\n const scrollTop = Number(sessionStorage.getItem(\"sidebar_scroll\") || 0)\n\n document.querySelectorAll(\"[data-sidebar='content']\").forEach((content) => {\n content.scrollTop = scrollTop\n })\n })()\n</script>\n\n<script is:inline>\n ;(() => {\n if (window.__fulldevSidebarInitialized) return\n window.__fulldevSidebarInitialized = true\n\n const SIDEBAR_COOKIE_NAME = \"sidebar_state\"\n const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\n\n const toggleSidebar = (provider) => {\n if (!window.matchMedia(\"(min-width: 768px)\").matches) {\n const openMobile = provider.dataset.openMobile !== \"true\"\n provider.dataset.openMobile = openMobile ? \"true\" : \"false\"\n provider\n .querySelector(\"[data-sidebar='sheet']\")\n ?.dispatchEvent(\n new CustomEvent(\"dialog:set\", { detail: { open: openMobile } })\n )\n return\n }\n\n const open = provider.dataset.open === \"false\"\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${open}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n window.__fulldevSyncSidebarProvider?.(provider, open)\n }\n\n document.addEventListener(\"click\", (event) => {\n const control = event.target?.closest?.(\n \"[data-sidebar='trigger'], [data-sidebar='rail']\"\n )\n if (!control || control.matches(\":disabled, [aria-disabled='true']\")) {\n return\n }\n\n const provider = control.closest(\"[data-slot='sidebar-wrapper']\")\n if (!provider) return\n\n toggleSidebar(provider)\n })\n\n document.addEventListener(\"keydown\", (event) => {\n if (event.key.toLowerCase() !== \"b\") return\n if (!event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) {\n return\n }\n if (event.defaultPrevented) return\n\n const target = event.target\n const isTyping =\n target instanceof HTMLElement &&\n (target.isContentEditable ||\n target.matches(\"input, textarea, select, [role='textbox']\"))\n if (isTyping) return\n\n const provider = document.querySelector(\"[data-slot='sidebar-wrapper']\")\n if (!(provider instanceof HTMLElement)) return\n\n event.preventDefault()\n toggleSidebar(provider)\n })\n\n document.addEventListener(\n \"scroll\",\n (event) => {\n if (event.target?.dataset?.sidebar === \"content\") {\n sessionStorage.setItem(\"sidebar_scroll\", event.target.scrollTop)\n }\n },\n true\n )\n })()\n</script>\n",
20
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n}\n\nconst {\n class: className,\n style,\n defaultOpen = true,\n open,\n ...props\n} = Astro.props\n\nconst resolvedStyle = [\n `--sidebar-width: ${SIDEBAR_WIDTH}`,\n `--sidebar-width-mobile: ${SIDEBAR_WIDTH_MOBILE}`,\n `--sidebar-width-icon: ${SIDEBAR_WIDTH_ICON}`,\n typeof style === \"string\" ? style : undefined,\n]\n .filter(Boolean)\n .join(\"; \")\n---\n\n<div\n data-slot=\"sidebar-wrapper\"\n data-default-open={defaultOpen ? \"true\" : \"false\"}\n data-open={open === undefined ? undefined : open ? \"true\" : \"false\"}\n style={resolvedStyle}\n class={cn(\n \"group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full\",\n className\n )}\n {...props}\n>\n <slot />\n <script is:inline>\n ;(() => {\n window.__fulldevSyncSidebarProvider ??= (provider, open) => {\n const state = open ? \"expanded\" : \"collapsed\"\n const sidebar = provider.querySelector(\n \"[data-slot='sidebar']:not([data-mobile='true'])\"\n )\n const collapsible = sidebar?.dataset.sidebarCollapsible ?? \"offcanvas\"\n\n provider.dataset.open = open ? \"true\" : \"false\"\n provider.dataset.state = state\n\n if (sidebar) {\n sidebar.dataset.state = collapsible === \"none\" ? \"expanded\" : state\n sidebar.dataset.collapsible =\n collapsible === \"none\" ? \"none\" : open ? \"\" : collapsible\n }\n\n provider\n .querySelectorAll(\"[data-sidebar='trigger'], [data-sidebar='rail']\")\n .forEach((control) => {\n control.setAttribute(\"aria-expanded\", String(open))\n })\n\n provider\n .querySelectorAll(\"[data-sidebar='menu-tooltip']\")\n .forEach((tooltip) => {\n tooltip.hidden = state !== \"collapsed\"\n })\n }\n\n const provider = document.currentScript?.closest(\n \"[data-slot='sidebar-wrapper']\"\n )\n if (!(provider instanceof HTMLElement)) return\n\n const controlledOpen = provider.dataset.open\n const cookieValue = document.cookie\n .split(\"; \")\n .find((entry) => entry.startsWith(\"sidebar_state=\"))\n ?.slice(\"sidebar_state=\".length)\n\n const isOpen =\n controlledOpen === \"true\" || controlledOpen === \"false\"\n ? controlledOpen === \"true\"\n : cookieValue === \"true\" || cookieValue === \"false\"\n ? cookieValue === \"true\"\n : provider.dataset.defaultOpen !== \"false\"\n\n provider.dataset.openMobile = \"false\"\n window.__fulldevSyncSidebarProvider(provider, isOpen)\n })()\n </script>\n</div>\n\n<script is:inline>\n ;(() => {\n const scrollTop = Number(sessionStorage.getItem(\"sidebar_scroll\") || 0)\n\n document.querySelectorAll(\"[data-sidebar='content']\").forEach((content) => {\n content.scrollTop = scrollTop\n })\n })()\n</script>\n\n<script is:inline>\n ;(() => {\n if (window.__fulldevSidebarInitialized) return\n window.__fulldevSidebarInitialized = true\n\n const SIDEBAR_COOKIE_NAME = \"sidebar_state\"\n const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\n\n const toggleSidebar = (provider) => {\n if (!window.matchMedia(\"(min-width: 768px)\").matches) {\n const openMobile = provider.dataset.openMobile !== \"true\"\n provider.dataset.openMobile = openMobile ? \"true\" : \"false\"\n provider\n .querySelector(\"[data-sidebar='sheet']\")\n ?.dispatchEvent(\n new CustomEvent(\"dialog:set\", { detail: { open: openMobile } })\n )\n return\n }\n\n const open = provider.dataset.open === \"false\"\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${open}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n window.__fulldevSyncSidebarProvider?.(provider, open)\n }\n\n document.addEventListener(\"click\", (event) => {\n const control = event.target?.closest?.(\n \"[data-sidebar='trigger'], [data-sidebar='rail']\"\n )\n if (!control || control.matches(\":disabled, [aria-disabled='true']\")) {\n return\n }\n\n const provider = control.closest(\"[data-slot='sidebar-wrapper']\")\n if (!provider) return\n\n toggleSidebar(provider)\n })\n\n document.addEventListener(\"keydown\", (event) => {\n if (event.key.toLowerCase() !== \"b\") return\n if (!(event.metaKey || event.ctrlKey) || event.shiftKey || event.altKey) {\n return\n }\n if (event.defaultPrevented) return\n\n const target = event.target\n const isTyping =\n target instanceof HTMLElement &&\n (target.isContentEditable ||\n target.matches(\"input, textarea, select, [role='textbox']\"))\n if (isTyping) return\n\n const provider = document.querySelector(\"[data-slot='sidebar-wrapper']\")\n if (!(provider instanceof HTMLElement)) return\n\n event.preventDefault()\n toggleSidebar(provider)\n })\n\n document.addEventListener(\n \"scroll\",\n (event) => {\n if (event.target?.dataset?.sidebar === \"content\") {\n sessionStorage.setItem(\"sidebar_scroll\", event.target.scrollTop)\n }\n },\n true\n )\n })()\n</script>\n",
18
21
  "type": "registry:ui"
19
22
  },
20
23
  {
21
24
  "path": "src/components/ui/sidebar/sidebar.astro",
22
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"@/components/ui/sheet\"\n\ntype Props = Omit<HTMLAttributes<\"div\">, \"dir\"> & {\n side?: \"left\" | \"right\"\n variant?: \"sidebar\" | \"floating\" | \"inset\"\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n state?: \"expanded\" | \"collapsed\"\n}\n\nconst {\n class: className,\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n state = \"expanded\",\n ...props\n} = Astro.props\n\nconst desktopState = collapsible === \"none\" ? \"expanded\" : state\nconst desktopCollapsible = desktopState === \"collapsed\" ? collapsible : \"\"\n---\n\n{\n collapsible === \"none\" ? (\n <div\n data-slot=\"sidebar\"\n data-state=\"expanded\"\n data-collapsible=\"none\"\n data-variant={variant}\n data-side={side}\n data-sidebar-collapsible=\"none\"\n class={cn(\n \"bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col\",\n className\n )}\n {...props}\n >\n <slot />\n </div>\n ) : (\n <>\n <Sheet data-sidebar=\"sheet\" defaultOpen={false}>\n <SheetContent\n side={side}\n showCloseButton={false}\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n style=\"--sidebar-width: var(--sidebar-width-mobile);\"\n class={cn(\n \"bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 md:hidden\",\n className\n )}\n >\n <SheetHeader class=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div class=\"flex h-full w-full flex-col\">\n <slot />\n </div>\n </SheetContent>\n </Sheet>\n\n <div\n data-slot=\"sidebar\"\n data-state={desktopState}\n data-collapsible={desktopCollapsible}\n data-variant={variant}\n data-side={side}\n data-sidebar-collapsible={collapsible}\n class=\"group peer text-sidebar-foreground hidden md:block\"\n >\n <div\n data-slot=\"sidebar-gap\"\n class={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\"\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n data-side={side}\n class={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:-left-(--sidebar-width) data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:-right-(--sidebar-width) md:flex\",\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n class=\"bg-sidebar group-data-[variant=floating]:ring-sidebar-border flex size-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1\"\n >\n <slot />\n </div>\n </div>\n </div>\n </>\n )\n}\n",
25
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"@/components/ui/sheet\"\n\ntype Props = Omit<HTMLAttributes<\"div\">, \"dir\"> & {\n side?: \"left\" | \"right\"\n variant?: \"sidebar\" | \"floating\" | \"inset\"\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n state?: \"expanded\" | \"collapsed\"\n}\n\nconst {\n class: className,\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n state = \"expanded\",\n ...props\n} = Astro.props\n\nconst desktopState = collapsible === \"none\" ? \"expanded\" : state\nconst desktopCollapsible = desktopState === \"collapsed\" ? collapsible : \"\"\n---\n\n{\n collapsible === \"none\" ? (\n <div\n data-slot=\"sidebar\"\n data-state=\"expanded\"\n data-collapsible=\"none\"\n data-variant={variant}\n data-side={side}\n data-sidebar-collapsible=\"none\"\n class={cn(\n \"bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col\",\n className\n )}\n {...props}\n >\n <slot />\n </div>\n ) : (\n <>\n <Sheet data-sidebar=\"sheet\" defaultOpen={false}>\n <SheetContent\n side={side}\n showCloseButton={false}\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n style=\"--sidebar-width: var(--sidebar-width-mobile);\"\n class={cn(\n \"bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 md:hidden\",\n className\n )}\n >\n <SheetHeader class=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div class=\"flex h-full w-full flex-col\">\n <slot />\n </div>\n </SheetContent>\n </Sheet>\n\n <div\n data-slot=\"sidebar\"\n data-state={desktopState}\n data-collapsible={desktopCollapsible}\n data-variant={variant}\n data-side={side}\n data-sidebar-collapsible={collapsible}\n class=\"group peer text-sidebar-foreground hidden md:block\"\n >\n <div\n data-slot=\"sidebar-gap\"\n class={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\"\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n data-side={side}\n class={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex\",\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n class=\"bg-sidebar group-data-[variant=floating]:ring-sidebar-border flex size-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1\"\n >\n <slot />\n </div>\n </div>\n </div>\n </>\n )\n}\n",
23
26
  "type": "registry:ui"
24
27
  },
25
28
  {
26
29
  "path": "src/components/ui/sidebar/sidebar-trigger.astro",
27
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { Icon } from \"@/components/ui/icon\"\n\ntype Props = HTMLAttributes<\"button\"> & {\n variant?: \"ghost\" | \"secondary\"\n}\n\nconst { class: className, ...props } = Astro.props\n---\n\n<Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon-sm\"\n class={className}\n aria-keyshortcuts=\"Meta+B\"\n {...props}\n>\n <Icon name=\"panel-left\" />\n <span class=\"sr-only\">Toggle Sidebar</span>\n <slot />\n</Button>\n",
30
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport PanelLeftIcon from \"@lucide/astro/icons/panel-left\"\n\nimport { Button } from \"@/components/ui/button\"\n\ntype Props = HTMLAttributes<\"button\"> & {\n variant?: \"ghost\" | \"secondary\"\n}\n\nconst { class: className, ...props } = Astro.props\n---\n\n<Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon-sm\"\n class={className}\n aria-keyshortcuts=\"Control+B Meta+B\"\n {...props}\n>\n <PanelLeftIcon />\n <span class=\"sr-only\">Toggle Sidebar</span>\n <slot />\n</Button>\n",
28
31
  "type": "registry:ui"
29
32
  },
30
33
  {
31
34
  "path": "src/components/ui/sidebar/sidebar-rail.astro",
32
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"button\">\n\nconst { class: className, type = \"button\", ...props } = Astro.props\n---\n\n<button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabindex={-1}\n title=\"Toggle Sidebar\"\n type={type}\n class={cn(\n \"hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className\n )}\n {...props}></button>\n",
35
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"button\">\n\nconst { class: className, type = \"button\", ...props } = Astro.props\n---\n\n<button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabindex={-1}\n title=\"Toggle Sidebar\"\n type={type}\n class={cn(\n \"hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className\n )}\n {...props}></button>\n",
33
36
  "type": "registry:ui"
34
37
  },
35
38
  {
@@ -89,7 +92,7 @@
89
92
  },
90
93
  {
91
94
  "path": "src/components/ui/sidebar/sidebar-menu-button.astro",
92
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport type { TooltipAlign, TooltipSide } from \"@data-slot/tooltip\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\"\n\nconst variants = cva(\n \"peer/menu-button group/menu-button ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-active:font-medium [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background hover:bg-sidebar-accent hover:text-sidebar-accent-foreground shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\ntype TooltipValue =\n | string\n | (HTMLAttributes<\"div\"> & {\n content?: string\n children?: string\n side?: TooltipSide\n align?: TooltipAlign\n sideOffset?: number\n alignOffset?: number\n avoidCollisions?: boolean\n collisionPadding?: number\n })\n\ninterface Props\n extends VariantProps<typeof variants>, HTMLAttributes<\"button\"> {\n as?: \"a\" | \"button\" | \"div\" | \"span\"\n href?: string\n isActive?: boolean\n active?: boolean\n tooltip?: TooltipValue\n}\n\nconst {\n as: explicitTag,\n class: className,\n variant = \"default\",\n size = \"default\",\n isActive,\n active = false,\n tooltip,\n type,\n ...props\n} = Astro.props satisfies Props\n\nconst Tag = explicitTag || (\"href\" in Astro.props ? \"a\" : \"button\")\nconst resolvedActive = isActive ?? active\nconst baseClassName = cn(variants({ variant, size }), className)\nconst resolvedTooltip =\n typeof tooltip === \"string\" ? { children: tooltip } : tooltip\nconst tooltipText =\n resolvedTooltip?.content ??\n (typeof resolvedTooltip?.children === \"string\"\n ? resolvedTooltip.children\n : undefined)\nconst {\n content: _tooltipContent,\n children: _tooltipChildren,\n ...tooltipProps\n} = resolvedTooltip ?? {}\n---\n\n{\n tooltipText ? (\n <Tooltip>\n <TooltipTrigger\n as={Tag}\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={resolvedActive ? \"true\" : undefined}\n aria-current={resolvedActive ? \"page\" : undefined}\n type={Tag === \"button\" ? type || \"button\" : undefined}\n class={baseClassName}\n {...props}\n >\n <slot />\n </TooltipTrigger>\n <TooltipContent\n data-sidebar=\"menu-tooltip\"\n side=\"right\"\n align=\"center\"\n hidden\n {...tooltipProps}\n >\n {tooltipText}\n </TooltipContent>\n </Tooltip>\n ) : (\n <Tag\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={resolvedActive ? \"true\" : undefined}\n aria-current={resolvedActive ? \"page\" : undefined}\n type={Tag === \"button\" ? type || \"button\" : undefined}\n class={baseClassName}\n {...props}\n >\n <slot />\n </Tag>\n )\n}\n",
95
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport type { TooltipAlign, TooltipSide } from \"@data-slot/tooltip\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\"\n\nconst variants = cva(\n \"peer/menu-button group/menu-button ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-active:font-medium [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background hover:bg-sidebar-accent hover:text-sidebar-accent-foreground shadow-[0_0_0_1px_var(--sidebar-border)] hover:shadow-[0_0_0_1px_var(--sidebar-accent)]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\ntype TooltipValue =\n | string\n | (HTMLAttributes<\"div\"> & {\n content?: string\n children?: string\n side?: TooltipSide\n align?: TooltipAlign\n sideOffset?: number\n alignOffset?: number\n avoidCollisions?: boolean\n collisionPadding?: number\n })\n\ntype Props = VariantProps<typeof variants> &\n HTMLAttributes<\"button\"> &\n HTMLAttributes<\"a\"> &\n HTMLAttributes<\"div\"> &\n HTMLAttributes<\"span\"> & {\n as?: \"a\" | \"button\" | \"div\" | \"span\"\n href?: string\n isActive?: boolean\n active?: boolean\n tooltip?: TooltipValue\n }\n\nconst {\n as: explicitTag,\n class: className,\n variant = \"default\",\n size = \"default\",\n isActive,\n active = false,\n tooltip,\n type,\n ...props\n} = Astro.props\n\nconst Tag = explicitTag || (\"href\" in Astro.props ? \"a\" : \"button\")\nconst resolvedActive = isActive ?? active\nconst baseClassName = cn(variants({ variant, size }), className)\nconst resolvedTooltip =\n typeof tooltip === \"string\" ? { children: tooltip } : tooltip\nconst tooltipText =\n resolvedTooltip?.content ??\n (typeof resolvedTooltip?.children === \"string\"\n ? resolvedTooltip.children\n : undefined)\nconst {\n content: _tooltipContent,\n children: _tooltipChildren,\n ...tooltipProps\n} = resolvedTooltip ?? {}\n---\n\n{\n tooltipText ? (\n <Tooltip>\n <TooltipTrigger\n as={Tag}\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={resolvedActive ? \"true\" : undefined}\n aria-current={resolvedActive ? \"page\" : undefined}\n type={Tag === \"button\" ? type || \"button\" : undefined}\n class={baseClassName}\n {...props}\n >\n <slot />\n </TooltipTrigger>\n <TooltipContent\n data-sidebar=\"menu-tooltip\"\n side=\"right\"\n align=\"center\"\n hidden\n {...tooltipProps}\n >\n {tooltipText}\n </TooltipContent>\n </Tooltip>\n ) : (\n <Tag\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={resolvedActive ? \"true\" : undefined}\n aria-current={resolvedActive ? \"page\" : undefined}\n type={Tag === \"button\" ? type || \"button\" : undefined}\n class={baseClassName}\n {...props}\n >\n <slot />\n </Tag>\n )\n}\n",
93
96
  "type": "registry:ui"
94
97
  },
95
98
  {
@@ -119,7 +122,7 @@
119
122
  },
120
123
  {
121
124
  "path": "src/components/ui/sidebar/sidebar-menu-sub-button.astro",
122
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst variants = cva(\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden group-data-[collapsible=icon]:hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n {\n variants: {\n size: {\n sm: \"text-xs\",\n md: \"text-sm\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n }\n)\n\ninterface Props\n extends VariantProps<typeof variants>, HTMLAttributes<\"button\"> {\n as?: \"a\" | \"button\" | \"span\"\n href?: string\n isActive?: boolean\n active?: boolean\n}\n\nconst {\n as: explicitTag,\n class: className,\n size = \"md\",\n isActive,\n active = false,\n type,\n ...props\n} = Astro.props satisfies Props\n\nconst Tag = explicitTag || \"a\"\nconst resolvedActive = isActive ?? active\n---\n\n<Tag\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={resolvedActive ? \"true\" : undefined}\n aria-current={resolvedActive ? \"page\" : undefined}\n type={Tag === \"button\" ? type || \"button\" : undefined}\n class={cn(variants({ size }), className)}\n {...props}\n>\n <slot />\n</Tag>\n",
125
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst variants = cva(\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden group-data-[collapsible=icon]:hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n {\n variants: {\n size: {\n sm: \"text-xs\",\n md: \"text-sm\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n }\n)\n\ntype Props = VariantProps<typeof variants> &\n HTMLAttributes<\"button\"> &\n HTMLAttributes<\"a\"> &\n HTMLAttributes<\"span\"> & {\n as?: \"a\" | \"button\" | \"span\"\n href?: string\n isActive?: boolean\n active?: boolean\n }\n\nconst {\n as: explicitTag,\n class: className,\n size = \"md\",\n isActive,\n active = false,\n type,\n ...props\n} = Astro.props\n\nconst Tag = explicitTag || \"a\"\nconst resolvedActive = isActive ?? active\n---\n\n<Tag\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={resolvedActive ? \"true\" : undefined}\n aria-current={resolvedActive ? \"page\" : undefined}\n type={Tag === \"button\" ? type || \"button\" : undefined}\n class={cn(variants({ size }), className)}\n {...props}\n>\n <slot />\n</Tag>\n",
123
126
  "type": "registry:ui"
124
127
  },
125
128
  {
@@ -7,7 +7,7 @@
7
7
  "files": [
8
8
  {
9
9
  "path": "src/components/ui/slider/slider.astro",
10
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype SliderValue = number | [number, number] | string\ntype ThumbAlignment = \"center\" | \"edge\" | \"edge-client-only\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n defaultValue?: SliderValue\n min?: number\n max?: number\n step?: number\n largeStep?: number\n orientation?: \"horizontal\" | \"vertical\"\n thumbAlignment?: ThumbAlignment\n disabled?: boolean\n}\n\nconst {\n class: className,\n defaultValue,\n min,\n max,\n step,\n largeStep,\n orientation = \"horizontal\",\n thumbAlignment = \"edge\",\n disabled,\n ...props\n} = Astro.props\n\nconst serializedDefaultValue = Array.isArray(defaultValue)\n ? defaultValue.join(\",\")\n : defaultValue\nconst thumbCount = Array.isArray(defaultValue) ? defaultValue.length : 1\n---\n\n<div\n data-slot=\"slider\"\n data-default-value={serializedDefaultValue}\n data-min={min}\n data-max={max}\n data-step={step}\n data-large-step={largeStep}\n data-orientation={orientation}\n data-thumb-alignment={thumbAlignment}\n data-disabled={disabled}\n class={cn(\n \"relative flex touch-none items-center select-none data-disabled:opacity-50 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-40 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col\",\n className\n )}\n {...props}\n>\n <div\n data-slot=\"slider-control\"\n class=\"relative flex w-full touch-none items-center select-none data-disabled:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-40 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col\"\n >\n <div\n data-slot=\"slider-track\"\n class=\"bg-muted relative grow overflow-hidden rounded-full select-none data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5\"\n >\n <div\n data-slot=\"slider-range\"\n class=\"bg-primary rounded-full select-none data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full\"\n >\n </div>\n </div>\n {\n Array.from({ length: thumbCount }).map(() => (\n <div\n data-slot=\"slider-thumb\"\n class=\"border-primary bg-background ring-ring/50 block size-4 shrink-0 rounded-full border shadow-sm transition-[color,box-shadow] select-none hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden data-disabled:pointer-events-none data-disabled:opacity-50\"\n />\n ))\n }\n </div>\n</div>\n\n<script>\n import { create } from \"@data-slot/slider\"\n\n create()\n</script>\n",
10
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype SliderValue = number | [number, number] | string\ntype ThumbAlignment = \"center\" | \"edge\" | \"edge-client-only\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n defaultValue?: SliderValue\n min?: number\n max?: number\n step?: number\n largeStep?: number\n orientation?: \"horizontal\" | \"vertical\"\n thumbAlignment?: ThumbAlignment\n disabled?: boolean\n}\n\nconst {\n class: className,\n defaultValue,\n min,\n max,\n step,\n largeStep,\n orientation = \"horizontal\",\n thumbAlignment = \"edge\",\n disabled,\n ...props\n} = Astro.props\n\nconst serializedDefaultValue = Array.isArray(defaultValue)\n ? defaultValue.join(\",\")\n : defaultValue\nconst thumbCount = Array.isArray(defaultValue) ? defaultValue.length : 1\n---\n\n<div\n data-slot=\"slider\"\n data-default-value={serializedDefaultValue}\n data-min={min}\n data-max={max}\n data-step={step}\n data-large-step={largeStep}\n data-orientation={orientation}\n data-thumb-alignment={thumbAlignment}\n data-disabled={disabled}\n class={cn(\n \"data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full\",\n className\n )}\n {...props}\n>\n <div\n data-slot=\"slider-control\"\n data-orientation={orientation}\n data-disabled={disabled}\n class=\"relative flex w-full touch-none items-center select-none data-[disabled]:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-40 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col\"\n >\n <div\n data-slot=\"slider-track\"\n class=\"bg-muted relative grow overflow-hidden rounded-full select-none data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5\"\n >\n <div\n data-slot=\"slider-range\"\n class=\"bg-primary select-none data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full\"\n >\n </div>\n </div>\n {\n Array.from({ length: thumbCount }).map(() => (\n <div\n data-slot=\"slider-thumb\"\n class=\"border-primary ring-ring/50 block size-4 shrink-0 rounded-full border bg-white shadow-sm transition-[color,box-shadow] select-none hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden data-[disabled]:pointer-events-none data-[disabled]:opacity-50\"\n />\n ))\n }\n </div>\n</div>\n\n<script>\n import { create } from \"@data-slot/slider\"\n\n create()\n</script>\n",
11
11
  "type": "registry:ui"
12
12
  },
13
13
  {
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "spinner",
4
- "registryDependencies": [
5
- "@fulldev/icon"
4
+ "dependencies": [
5
+ "@lucide/astro"
6
6
  ],
7
7
  "files": [
8
8
  {
9
9
  "path": "src/components/ui/spinner/spinner.astro",
10
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Icon } from \"@/components/ui/icon\"\n\ntype Props = HTMLAttributes<\"svg\"> & {\n color?: string\n size?: number | string\n \"stroke-width\"?: number | string\n absoluteStrokeWidth?: boolean\n title?: string\n}\n\nconst { class: className, ...props } = Astro.props\n---\n\n<Icon\n {...props}\n role=\"status\"\n aria-label=\"Loading\"\n name=\"loader-circle\"\n class={cn(\"size-4 animate-spin\", className)}\n/>\n",
10
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport LoaderCircle from \"@lucide/astro/icons/loader-circle\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"svg\"> & {\n color?: string\n size?: number | string\n \"stroke-width\"?: number | string\n absoluteStrokeWidth?: boolean\n title?: string\n}\n\nconst { class: className, ...props } = Astro.props\n---\n\n<LoaderCircle\n data-slot=\"spinner\"\n role=\"status\"\n aria-label=\"Loading\"\n class={cn(\"size-4 animate-spin\", className)}\n {...props}\n/>\n",
11
11
  "type": "registry:ui"
12
12
  },
13
13
  {
@@ -7,7 +7,7 @@
7
7
  "files": [
8
8
  {
9
9
  "path": "src/components/ui/switch/switch.astro",
10
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"span\"> & {\n defaultChecked?: boolean\n disabled?: boolean\n readOnly?: boolean\n required?: boolean\n name?: string\n size?: \"default\" | \"sm\"\n value?: string\n uncheckedValue?: string\n}\n\nconst {\n class: className,\n defaultChecked,\n disabled,\n readOnly,\n required,\n name,\n size = \"default\",\n value,\n uncheckedValue,\n ...props\n} = Astro.props\n\nconst initialChecked = defaultChecked === true\nconst switchStyle =\n \"peer group/switch focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 relative inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:ring-3 aria-invalid:ring-3 data-disabled:cursor-not-allowed data-disabled:opacity-50 data-readonly:cursor-default\"\nconst switchSizeStyle = {\n sm: \"h-[14px] w-[24px]\",\n default: \"h-[18.4px] w-[32px]\",\n}\n---\n\n<span\n role=\"switch\"\n aria-checked={initialChecked ? \"true\" : \"false\"}\n aria-disabled={disabled ? \"true\" : undefined}\n aria-readonly={readOnly ? \"true\" : undefined}\n aria-required={required ? \"true\" : undefined}\n data-slot=\"switch\"\n data-size={size}\n data-checked={initialChecked ? \"\" : undefined}\n data-unchecked={initialChecked ? undefined : \"\"}\n data-default-checked={defaultChecked}\n data-disabled={disabled}\n data-read-only={readOnly}\n data-readonly={readOnly}\n data-required={required}\n data-name={name}\n data-value={value}\n data-unchecked-value={uncheckedValue}\n class={cn(switchStyle, switchSizeStyle[size], className)}\n {...props}\n>\n <span\n aria-hidden=\"true\"\n data-slot=\"switch-thumb\"\n class=\"bg-background dark:data-checked:bg-primary-foreground dark:data-unchecked:bg-foreground pointer-events-none block rounded-full ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0\"\n ></span>\n</span>\n\n<script>\n import { create } from \"@data-slot/switch\"\n\n create()\n</script>\n",
10
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"span\"> & {\n defaultChecked?: boolean\n disabled?: boolean\n readOnly?: boolean\n required?: boolean\n name?: string\n size?: \"default\" | \"sm\"\n value?: string\n uncheckedValue?: string\n}\n\nconst {\n class: className,\n defaultChecked,\n disabled,\n readOnly,\n required,\n name,\n size = \"default\",\n value,\n uncheckedValue,\n ...props\n} = Astro.props\n\nconst initialChecked = defaultChecked === true\nconst switchStyle =\n \"peer group/switch focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 relative inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none group-has-[:focus-visible]/field-label:border-transparent group-has-[:focus-visible]/field-label:ring-0 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:ring-3 aria-invalid:ring-3 data-disabled:cursor-not-allowed data-disabled:opacity-50 data-readonly:cursor-default\"\nconst switchSizeStyle = {\n sm: \"h-[14px] w-[24px]\",\n default: \"h-[18.4px] w-[32px]\",\n}\n---\n\n<span\n role=\"switch\"\n aria-checked={initialChecked ? \"true\" : \"false\"}\n aria-disabled={disabled ? \"true\" : undefined}\n aria-readonly={readOnly ? \"true\" : undefined}\n aria-required={required ? \"true\" : undefined}\n data-slot=\"switch\"\n data-size={size}\n data-checked={initialChecked ? \"\" : undefined}\n data-unchecked={initialChecked ? undefined : \"\"}\n data-default-checked={defaultChecked}\n data-disabled={disabled}\n data-read-only={readOnly}\n data-readonly={readOnly}\n data-required={required}\n data-name={name}\n data-value={value}\n data-unchecked-value={uncheckedValue}\n class={cn(switchStyle, switchSizeStyle[size], className)}\n {...props}\n>\n <span\n aria-hidden=\"true\"\n data-slot=\"switch-thumb\"\n class=\"bg-background dark:data-checked:bg-primary-foreground dark:data-unchecked:bg-foreground pointer-events-none block rounded-full ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0\"\n ></span>\n</span>\n\n<script>\n import { create } from \"@data-slot/switch\"\n\n create()\n</script>\n",
11
11
  "type": "registry:ui"
12
12
  },
13
13
  {
@@ -1,14 +1,16 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "theme-toggle",
4
+ "dependencies": [
5
+ "@lucide/astro"
6
+ ],
4
7
  "registryDependencies": [
5
- "@fulldev/button",
6
- "@fulldev/icon"
8
+ "@fulldev/button"
7
9
  ],
8
10
  "files": [
9
11
  {
10
12
  "path": "src/components/ui/theme-toggle/theme-toggle.astro",
11
- "content": "---\nimport type { ComponentProps } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Icon } from \"@/components/ui/icon\"\n\ntype Props = ComponentProps<typeof Button>\n\nconst {\n class: className,\n variant = \"ghost\",\n size = \"icon-sm\",\n ...props\n} = Astro.props\n---\n\n<Button\n data-theme-toggle\n aria-label=\"Toggle theme\"\n variant={variant}\n size={size}\n class={cn(\"relative\", className)}\n {...props}\n>\n <Icon name=\"sun\" class=\"dark:hidden\" />\n <Icon name=\"moon\" class=\"hidden dark:block\" />\n <span class=\"sr-only\">Toggle theme</span>\n</Button>\n\n<script is:inline>\n if (!window.__themeToggleHandlersInitialized) {\n window.__themeToggleHandlersInitialized = true\n\n const syncThemeToggles = () => {\n const isDark = document.documentElement.classList.contains(\"dark\")\n\n document.querySelectorAll(\"[data-theme-toggle]\").forEach((toggle) => {\n if (!(toggle instanceof HTMLButtonElement)) return\n\n toggle.setAttribute(\"aria-pressed\", isDark ? \"true\" : \"false\")\n toggle.setAttribute(\"data-state\", isDark ? \"on\" : \"off\")\n\n if (isDark) {\n toggle.setAttribute(\"data-pressed\", \"\")\n } else {\n toggle.removeAttribute(\"data-pressed\")\n }\n })\n }\n\n syncThemeToggles()\n\n const observer = new MutationObserver(syncThemeToggles)\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"class\"],\n })\n\n document.addEventListener(\"click\", (event) => {\n const target = event.target\n\n if (!(target instanceof Element)) return\n\n const toggle = target.closest(\"[data-theme-toggle]\")\n\n if (!(toggle instanceof HTMLButtonElement)) return\n if (toggle.disabled) return\n\n const isDark = document.documentElement.classList.contains(\"dark\")\n const nextTheme = isDark ? \"light\" : \"dark\"\n\n if (typeof window.__setTheme === \"function\") {\n window.__setTheme(nextTheme)\n return\n }\n\n document.documentElement.classList[\n nextTheme === \"dark\" ? \"add\" : \"remove\"\n ](\"dark\")\n })\n }\n</script>\n",
13
+ "content": "---\nimport type { ComponentProps } from \"astro/types\"\nimport Moon from \"@lucide/astro/icons/moon\"\nimport Sun from \"@lucide/astro/icons/sun\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\n\ntype Props = ComponentProps<typeof Button>\n\nconst {\n class: className,\n variant = \"ghost\",\n size = \"icon-sm\",\n ...props\n} = Astro.props\n---\n\n<Button\n data-theme-toggle\n aria-label=\"Toggle theme\"\n variant={variant}\n size={size}\n class={cn(\"relative\", className)}\n {...props}\n>\n <Sun class=\"dark:hidden\" />\n <Moon class=\"hidden dark:block\" />\n <span class=\"sr-only\">Toggle theme</span>\n</Button>\n\n<script is:inline>\n if (!window.__themeToggleHandlersInitialized) {\n window.__themeToggleHandlersInitialized = true\n\n const syncThemeToggles = () => {\n const isDark = document.documentElement.classList.contains(\"dark\")\n\n document.querySelectorAll(\"[data-theme-toggle]\").forEach((toggle) => {\n if (!(toggle instanceof HTMLButtonElement)) return\n\n toggle.setAttribute(\"aria-pressed\", isDark ? \"true\" : \"false\")\n toggle.setAttribute(\"data-state\", isDark ? \"on\" : \"off\")\n\n if (isDark) {\n toggle.setAttribute(\"data-pressed\", \"\")\n } else {\n toggle.removeAttribute(\"data-pressed\")\n }\n })\n }\n\n syncThemeToggles()\n\n const observer = new MutationObserver(syncThemeToggles)\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"class\"],\n })\n\n document.addEventListener(\"click\", (event) => {\n const target = event.target\n\n if (!(target instanceof Element)) return\n\n const toggle = target.closest(\"[data-theme-toggle]\")\n\n if (!(toggle instanceof HTMLButtonElement)) return\n if (toggle.disabled) return\n\n const isDark = document.documentElement.classList.contains(\"dark\")\n const nextTheme = isDark ? \"light\" : \"dark\"\n\n if (typeof window.__setTheme === \"function\") {\n window.__setTheme(nextTheme)\n return\n }\n\n document.documentElement.classList[\n nextTheme === \"dark\" ? \"add\" : \"remove\"\n ](\"dark\")\n })\n }\n</script>\n",
12
14
  "type": "registry:ui"
13
15
  },
14
16
  {
@@ -17,7 +17,7 @@
17
17
  },
18
18
  {
19
19
  "path": "src/components/ui/tooltip/tooltip-content.astro",
20
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport type { TooltipAlign, TooltipSide } from \"@data-slot/tooltip\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n side?: TooltipSide\n align?: TooltipAlign\n sideOffset?: number\n alignOffset?: number\n avoidCollisions?: boolean\n collisionPadding?: number\n}\n\nconst {\n class: className,\n hidden = true,\n side,\n align,\n sideOffset,\n alignOffset,\n avoidCollisions,\n collisionPadding,\n ...props\n} = Astro.props\n---\n\n<div data-slot=\"tooltip-portal\">\n <div\n data-slot=\"tooltip-positioner\"\n data-side={side}\n data-align={align}\n data-side-offset={sideOffset}\n data-align-offset={alignOffset}\n data-avoid-collisions={avoidCollisions}\n data-collision-padding={collisionPadding}\n class=\"z-50\"\n >\n <div\n data-slot=\"tooltip-content\"\n data-side={side}\n data-align={align}\n data-side-offset={sideOffset}\n data-align-offset={alignOffset}\n data-avoid-collisions={avoidCollisions}\n data-collision-padding={collisionPadding}\n hidden={hidden}\n class={cn(\n \"bg-foreground text-background data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-md px-3 py-1.5 text-xs has-data-[slot=kbd]:pr-1.5 data-[instant]:animate-none data-[instant]:transition-none **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm\",\n className\n )}\n {...props}\n >\n <slot />\n <div\n data-slot=\"tooltip-arrow\"\n aria-hidden=\"true\"\n class=\"bg-foreground fill-foreground z-50 size-2.5 rotate-45 rounded-[2px] data-[side=bottom]:-top-1 data-[side=inline-end]:-left-1 data-[side=inline-end]:translate-x-[1.5px] data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-x-[1.5px] data-[side=left]:-right-1 data-[side=left]:-translate-x-[1.5px] data-[side=right]:-left-1 data-[side=right]:translate-x-[1.5px] data-[side=top]:-bottom-1\"\n >\n </div>\n </div>\n </div>\n</div>\n",
20
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport type { TooltipAlign, TooltipSide } from \"@data-slot/tooltip\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n side?: TooltipSide\n align?: TooltipAlign\n sideOffset?: number\n alignOffset?: number\n avoidCollisions?: boolean\n collisionPadding?: number\n}\n\nconst {\n class: className,\n hidden = true,\n side,\n align,\n sideOffset,\n alignOffset,\n avoidCollisions,\n collisionPadding,\n ...props\n} = Astro.props\n---\n\n<div data-slot=\"tooltip-portal\">\n <div\n data-slot=\"tooltip-positioner\"\n data-side={side}\n data-align={align}\n data-side-offset={sideOffset}\n data-align-offset={alignOffset}\n data-avoid-collisions={avoidCollisions}\n data-collision-padding={collisionPadding}\n class=\"isolate z-50\"\n >\n <div\n data-slot=\"tooltip-content\"\n data-side={side}\n data-align={align}\n data-side-offset={sideOffset}\n data-align-offset={alignOffset}\n data-avoid-collisions={avoidCollisions}\n data-collision-padding={collisionPadding}\n hidden={hidden}\n class={cn(\n \"bg-foreground text-background data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-md px-3 py-1.5 text-xs has-data-[slot=kbd]:pr-1.5 data-[instant]:animate-none data-[instant]:transition-none **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm\",\n className\n )}\n {...props}\n >\n <slot />\n <div\n data-slot=\"tooltip-arrow\"\n aria-hidden=\"true\"\n class=\"bg-foreground fill-foreground z-50 size-2.5 rotate-45 rounded-[2px] data-[side=bottom]:-top-1 data-[side=inline-end]:-left-1 data-[side=inline-end]:translate-x-[1.5px] data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-x-[1.5px] data-[side=left]:-right-1 data-[side=left]:-translate-x-[1.5px] data-[side=right]:-left-1 data-[side=right]:translate-x-[1.5px] data-[side=top]:-bottom-1\"\n >\n </div>\n </div>\n </div>\n</div>\n",
21
21
  "type": "registry:ui"
22
22
  },
23
23
  {