fulldev-ui 0.10.0 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/package.json +1 -1
  3. package/public/r/accordion.json +1 -1
  4. package/public/r/alert-dialog.json +2 -2
  5. package/public/r/dialog.json +2 -2
  6. package/public/r/hover-card.json +3 -2
  7. package/public/r/navigation-menu.json +4 -4
  8. package/public/r/registry.json +1 -1
  9. package/public/r/sheet.json +2 -2
  10. package/public/r/sidebar.json +3 -3
  11. package/public/r/slider.json +1 -1
  12. package/public/r/switch.json +1 -1
  13. package/public/r/tabs.json +1 -1
  14. package/public/r/toggle.json +1 -1
  15. package/registry.json +1 -1
  16. package/src/components/ui/accordion/accordion-content.astro +2 -1
  17. package/src/components/ui/alert-dialog/alert-dialog-content.astro +1 -1
  18. package/src/components/ui/alert-dialog/alert-dialog-overlay.astro +1 -1
  19. package/src/components/ui/dialog/dialog-content.astro +1 -1
  20. package/src/components/ui/dialog/dialog-overlay.astro +1 -1
  21. package/src/components/ui/hover-card/hover-card.astro +6 -3
  22. package/src/components/ui/navigation-menu/navigation-menu-content.astro +2 -0
  23. package/src/components/ui/navigation-menu/navigation-menu-indicator.astro +2 -1
  24. package/src/components/ui/navigation-menu/navigation-menu-list.astro +1 -1
  25. package/src/components/ui/navigation-menu/navigation-menu-positioner.astro +2 -0
  26. package/src/components/ui/sheet/sheet-content.astro +2 -2
  27. package/src/components/ui/sheet/sheet.astro +1 -89
  28. package/src/components/ui/sidebar/sidebar-menu-button.astro +0 -1
  29. package/src/components/ui/sidebar/sidebar-provider.astro +36 -2
  30. package/src/components/ui/sidebar/sidebar.astro +0 -1
  31. package/src/components/ui/slider/slider.astro +3 -3
  32. package/src/components/ui/switch/switch.astro +4 -2
  33. package/src/components/ui/tabs/tabs-content.astro +2 -1
  34. package/src/components/ui/toggle/toggle.astro +2 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Fulldev UI
2
2
 
3
+ ## 0.10.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#184](https://github.com/fulldotdev/ui/pull/184) [`b4c6557`](https://github.com/fulldotdev/ui/commit/b4c6557df695a167c5ecb38761f65f809bdca918) Thanks [@silveltman](https://github.com/silveltman)! - Prevent navigation and inactive panels flashing before initialization. Correct Sidebar slot composition and state synchronization, use Data Slot's native Sheet scroll locking, align modal stack styles, and fix controlled HoverCard initialization, string range sliders and initial control states. Align Combobox examples with the documented list structure.
8
+
3
9
  ## 0.10.0
4
10
 
5
11
  ### Minor Changes
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "fulldev-ui",
3
3
  "type": "module",
4
- "version": "0.10.0",
4
+ "version": "0.10.1",
5
5
  "description": "Open-source Astro UI components and blocks",
6
6
  "homepage": "https://ui.full.dev",
7
7
  "bugs": "https://github.com/fulldotdev/ui/issues",
@@ -13,7 +13,7 @@
13
13
  },
14
14
  {
15
15
  "path": "src/components/ui/accordion/accordion-content.astro",
16
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<div\n data-slot=\"accordion-content\"\n class=\"data-open:animate-accordion-down data-closed:animate-accordion-up overflow-hidden text-sm\"\n {...props}\n>\n <div\n data-slot=\"accordion-content-inner\"\n class={cn(\n \"[&_a]:hover:text-foreground h-(--accordion-panel-height) pt-0 pb-4 data-ending-style:h-0 data-starting-style:h-0 [&_a]:underline [&_a]:underline-offset-3 [&_p:not(:last-child)]:mb-4\",\n className\n )}\n >\n <slot />\n </div>\n</div>\n",
16
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, hidden = true, ...props } = Astro.props\n---\n\n<div\n data-slot=\"accordion-content\"\n hidden={hidden}\n class=\"data-open:animate-accordion-down data-closed:animate-accordion-up overflow-hidden text-sm\"\n {...props}\n>\n <div\n data-slot=\"accordion-content-inner\"\n class={cn(\n \"[&_a]:hover:text-foreground h-(--accordion-panel-height) pt-0 pb-4 data-ending-style:h-0 data-starting-style:h-0 [&_a]:underline [&_a]:underline-offset-3 [&_p:not(:last-child)]:mb-4\",\n className\n )}\n >\n <slot />\n </div>\n</div>\n",
17
17
  "type": "registry:ui"
18
18
  },
19
19
  {
@@ -25,12 +25,12 @@
25
25
  },
26
26
  {
27
27
  "path": "src/components/ui/alert-dialog/alert-dialog-overlay.astro",
28
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, style, ...props } = Astro.props\n---\n\n<div\n data-slot=\"alert-dialog-overlay\"\n hidden\n class={cn(\n \"data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0 fixed inset-0 isolate z-(--alert-dialog-overlay-stack-index) bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs\",\n className\n )}\n style={`z-index: calc(var(--alert-dialog-overlay-stack-index, 0) + 110);${style ? ` ${style}` : \"\"}`}\n {...props}\n>\n</div>\n",
28
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, style, ...props } = Astro.props\n---\n\n<div\n data-slot=\"alert-dialog-overlay\"\n hidden\n class={cn(\n \"data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0 fixed inset-0 isolate z-(--alert-dialog-overlay-stack-index) bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs\",\n className\n )}\n style={`z-index: calc(var(--alert-dialog-overlay-stack-index, 0) * 2 + 100);${style ? ` ${style}` : \"\"}`}\n {...props}\n>\n</div>\n",
29
29
  "type": "registry:ui"
30
30
  },
31
31
  {
32
32
  "path": "src/components/ui/alert-dialog/alert-dialog-content.astro",
33
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport AlertDialogOverlay from \"@/components/ui/alert-dialog/alert-dialog-overlay.astro\"\nimport AlertDialogPortal from \"@/components/ui/alert-dialog/alert-dialog-portal.astro\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n size?: \"default\" | \"sm\"\n}\n\nconst { class: className, size = \"default\", style, ...props } = Astro.props\n---\n\n<AlertDialogPortal>\n <AlertDialogOverlay />\n <div\n data-slot=\"alert-dialog-content\"\n data-size={size}\n hidden\n class={cn(\n \"group/alert-dialog-content bg-popover text-popover-foreground ring-foreground/10 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 fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 gap-6 rounded-xl p-6 ring-1 duration-100 outline-none data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-lg\",\n className\n )}\n style={`z-index: calc(var(--alert-dialog-content-stack-index, 0) + 111);${style ? ` ${style}` : \"\"}`}\n {...props}\n >\n <slot />\n </div>\n</AlertDialogPortal>\n",
33
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport AlertDialogOverlay from \"@/components/ui/alert-dialog/alert-dialog-overlay.astro\"\nimport AlertDialogPortal from \"@/components/ui/alert-dialog/alert-dialog-portal.astro\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n size?: \"default\" | \"sm\"\n}\n\nconst { class: className, size = \"default\", style, ...props } = Astro.props\n---\n\n<AlertDialogPortal>\n <AlertDialogOverlay />\n <div\n data-slot=\"alert-dialog-content\"\n data-size={size}\n hidden\n class={cn(\n \"group/alert-dialog-content bg-popover text-popover-foreground ring-foreground/10 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 fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 gap-6 rounded-xl p-6 ring-1 duration-100 outline-none data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-lg\",\n className\n )}\n style={`z-index: calc(var(--alert-dialog-content-stack-index, 0) * 2 + 101);${style ? ` ${style}` : \"\"}`}\n {...props}\n >\n <slot />\n </div>\n</AlertDialogPortal>\n",
34
34
  "type": "registry:ui"
35
35
  },
36
36
  {
@@ -26,12 +26,12 @@
26
26
  },
27
27
  {
28
28
  "path": "src/components/ui/dialog/dialog-overlay.astro",
29
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, style, ...props } = Astro.props\n---\n\n<div\n data-slot=\"dialog-overlay\"\n hidden\n class={cn(\n \"data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0 fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs\",\n className\n )}\n style={`z-index: calc(var(--dialog-overlay-stack-index, 0) + 100);${style ? ` ${style}` : \"\"}`}\n {...props}\n>\n <slot />\n</div>\n",
29
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, style, ...props } = Astro.props\n---\n\n<div\n data-slot=\"dialog-overlay\"\n hidden\n class={cn(\n \"data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0 fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs\",\n className\n )}\n style={`z-index: calc(var(--dialog-overlay-stack-index, 0) * 2 + 100);${style ? ` ${style}` : \"\"}`}\n {...props}\n>\n <slot />\n</div>\n",
30
30
  "type": "registry:ui"
31
31
  },
32
32
  {
33
33
  "path": "src/components/ui/dialog/dialog-content.astro",
34
- "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 DialogOverlay from \"@/components/ui/dialog/dialog-overlay.astro\"\nimport DialogPortal from \"@/components/ui/dialog/dialog-portal.astro\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n showCloseButton?: boolean\n}\n\nconst {\n class: className,\n showCloseButton = true,\n style,\n ...props\n} = Astro.props\n---\n\n<DialogPortal>\n <DialogOverlay />\n <div\n data-slot=\"dialog-content\"\n hidden\n class={cn(\n \"bg-popover text-popover-foreground ring-foreground/10 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 fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-6 rounded-xl p-6 text-sm ring-1 duration-100 outline-none sm:max-w-md\",\n className\n )}\n style={`z-index: calc(var(--dialog-content-stack-index, 0) + 101);${style ? ` ${style}` : \"\"}`}\n {...props}\n >\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 <slot />\n </div>\n</DialogPortal>\n",
34
+ "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 DialogOverlay from \"@/components/ui/dialog/dialog-overlay.astro\"\nimport DialogPortal from \"@/components/ui/dialog/dialog-portal.astro\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n showCloseButton?: boolean\n}\n\nconst {\n class: className,\n showCloseButton = true,\n style,\n ...props\n} = Astro.props\n---\n\n<DialogPortal>\n <DialogOverlay />\n <div\n data-slot=\"dialog-content\"\n hidden\n class={cn(\n \"bg-popover text-popover-foreground ring-foreground/10 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 fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-6 rounded-xl p-6 text-sm ring-1 duration-100 outline-none sm:max-w-md\",\n className\n )}\n style={`z-index: calc(var(--dialog-content-stack-index, 0) * 2 + 101);${style ? ` ${style}` : \"\"}`}\n {...props}\n >\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 <slot />\n </div>\n</DialogPortal>\n",
35
35
  "type": "registry:ui"
36
36
  },
37
37
  {
@@ -2,12 +2,13 @@
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "hover-card",
4
4
  "dependencies": [
5
- "@data-slot/hover-card"
5
+ "@data-slot/hover-card",
6
+ "@data-slot/core"
6
7
  ],
7
8
  "files": [
8
9
  {
9
10
  "path": "src/components/ui/hover-card/hover-card.astro",
10
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n delay?: number\n skipDelayDuration?: number\n closeDelay?: number\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n align?: \"start\" | \"center\" | \"end\"\n sideOffset?: number\n alignOffset?: number\n avoidCollisions?: boolean\n collisionPadding?: number\n portal?: boolean\n closeOnClickOutside?: boolean\n closeOnEscape?: boolean\n}\n\nconst {\n class: className,\n defaultOpen,\n open,\n delay = 700,\n skipDelayDuration = 300,\n closeDelay = 300,\n side = \"bottom\",\n align = \"center\",\n sideOffset = 4,\n alignOffset = 0,\n avoidCollisions = true,\n collisionPadding = 8,\n portal = true,\n closeOnClickOutside = true,\n closeOnEscape = true,\n ...props\n} = Astro.props\n---\n\n<div\n data-slot=\"hover-card\"\n data-default-open={defaultOpen}\n data-open={open}\n data-delay={delay}\n data-skip-delay-duration={skipDelayDuration}\n data-close-delay={closeDelay}\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 data-portal={portal}\n data-close-on-click-outside={closeOnClickOutside}\n data-close-on-escape={closeOnEscape}\n class={cn(className)}\n {...props}\n>\n <slot />\n</div>\n\n<script>\n import { create } from \"@data-slot/hover-card\"\n\n create()\n</script>\n",
11
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n delay?: number\n skipDelayDuration?: number\n closeDelay?: number\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n align?: \"start\" | \"center\" | \"end\"\n sideOffset?: number\n alignOffset?: number\n avoidCollisions?: boolean\n collisionPadding?: number\n portal?: boolean\n closeOnClickOutside?: boolean\n closeOnEscape?: boolean\n}\n\nconst {\n class: className,\n defaultOpen,\n open,\n delay = 700,\n skipDelayDuration = 300,\n closeDelay = 300,\n side = \"bottom\",\n align = \"center\",\n sideOffset = 4,\n alignOffset = 0,\n avoidCollisions = true,\n collisionPadding = 8,\n portal = true,\n closeOnClickOutside = true,\n closeOnEscape = true,\n ...props\n} = Astro.props\n---\n\n<div\n data-slot=\"hover-card\"\n data-default-open={defaultOpen}\n data-controlled-open={open}\n data-delay={delay}\n data-skip-delay-duration={skipDelayDuration}\n data-close-delay={closeDelay}\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 data-portal={portal}\n data-close-on-click-outside={closeOnClickOutside}\n data-close-on-escape={closeOnEscape}\n class={cn(className)}\n {...props}\n>\n <slot />\n</div>\n\n<script>\n import { getDataBool } from \"@data-slot/core\"\n import { createHoverCard } from \"@data-slot/hover-card\"\n\n document.querySelectorAll('[data-slot=\"hover-card\"]').forEach((root) => {\n createHoverCard(root, { open: getDataBool(root, \"controlledOpen\") })\n })\n</script>\n",
11
12
  "type": "registry:ui"
12
13
  },
13
14
  {
@@ -13,7 +13,7 @@
13
13
  },
14
14
  {
15
15
  "path": "src/components/ui/navigation-menu/navigation-menu-content.astro",
16
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = {\n class?: string\n align?: \"start\" | \"center\" | \"end\"\n alignOffset?: number\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n sideOffset?: number\n} & HTMLAttributes<\"div\">\n\nconst {\n class: className = \"\",\n align,\n alignOffset,\n side,\n sideOffset,\n ...props\n} = Astro.props\n---\n\n<div\n {...props}\n data-slot=\"navigation-menu-content\"\n data-align={align}\n data-align-offset={alignOffset}\n data-side={side}\n data-side-offset={sideOffset}\n class={cn(\n \"group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:ring-foreground/10 data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 data-[motion^=from-]:animate-in data-[motion^=from-]:fade-in data-[motion^=to-]:animate-out data-[motion^=to-]:fade-out group-data-[viewport=false]/navigation-menu:data-open:animate-in group-data-[viewport=false]/navigation-menu:data-open:fade-in-0 group-data-[viewport=false]/navigation-menu:data-open:zoom-in-95 group-data-[viewport=false]/navigation-menu:data-closed:animate-out group-data-[viewport=false]/navigation-menu:data-closed:fade-out-0 group-data-[viewport=false]/navigation-menu:data-closed:zoom-out-95 h-full w-auto p-2 pr-2.5 transition-[opacity,transform,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] group-data-[viewport=false]/navigation-menu:rounded-md group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:ring-1 group-data-[viewport=false]/navigation-menu:duration-300 data-ending-style:opacity-0 data-starting-style:opacity-0 data-ending-style:data-[activation-direction=left]:translate-x-[50%] data-starting-style:data-[activation-direction=left]:translate-x-[-50%] data-ending-style:data-[activation-direction=right]:translate-x-[-50%] data-starting-style:data-[activation-direction=right]:translate-x-[50%] **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none\",\n className\n )}\n>\n <slot />\n</div>\n",
16
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = {\n class?: string\n align?: \"start\" | \"center\" | \"end\"\n alignOffset?: number\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n sideOffset?: number\n} & HTMLAttributes<\"div\">\n\nconst {\n class: className = \"\",\n hidden = true,\n align,\n alignOffset,\n side,\n sideOffset,\n ...props\n} = Astro.props\n---\n\n<div\n {...props}\n data-slot=\"navigation-menu-content\"\n hidden={hidden}\n data-align={align}\n data-align-offset={alignOffset}\n data-side={side}\n data-side-offset={sideOffset}\n class={cn(\n \"group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:ring-foreground/10 data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 data-[motion^=from-]:animate-in data-[motion^=from-]:fade-in data-[motion^=to-]:animate-out data-[motion^=to-]:fade-out group-data-[viewport=false]/navigation-menu:data-open:animate-in group-data-[viewport=false]/navigation-menu:data-open:fade-in-0 group-data-[viewport=false]/navigation-menu:data-open:zoom-in-95 group-data-[viewport=false]/navigation-menu:data-closed:animate-out group-data-[viewport=false]/navigation-menu:data-closed:fade-out-0 group-data-[viewport=false]/navigation-menu:data-closed:zoom-out-95 h-full w-auto p-2 pr-2.5 transition-[opacity,transform,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] group-data-[viewport=false]/navigation-menu:rounded-md group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:ring-1 group-data-[viewport=false]/navigation-menu:duration-300 data-ending-style:opacity-0 data-starting-style:opacity-0 data-ending-style:data-[activation-direction=left]:translate-x-[50%] data-starting-style:data-[activation-direction=left]:translate-x-[-50%] data-ending-style:data-[activation-direction=right]:translate-x-[-50%] data-starting-style:data-[activation-direction=right]:translate-x-[50%] **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none\",\n className\n )}\n>\n <slot />\n</div>\n",
17
17
  "type": "registry:ui"
18
18
  },
19
19
  {
@@ -28,12 +28,12 @@
28
28
  },
29
29
  {
30
30
  "path": "src/components/ui/navigation-menu/navigation-menu-list.astro",
31
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"ul\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<ul\n data-slot=\"navigation-menu-list\"\n class={cn(\n \"group flex flex-1 list-none items-center justify-center gap-0\",\n className\n )}\n {...props}\n>\n <slot />\n</ul>\n",
31
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"ul\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<ul\n data-slot=\"navigation-menu-list\"\n class={cn(\n \"group relative flex flex-1 list-none items-center justify-center gap-0\",\n className\n )}\n {...props}\n>\n <slot />\n</ul>\n",
32
32
  "type": "registry:ui"
33
33
  },
34
34
  {
35
35
  "path": "src/components/ui/navigation-menu/navigation-menu-indicator.astro",
36
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<div\n data-slot=\"navigation-menu-indicator\"\n class={cn(\n \"data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:animate-in data-[state=visible]:fade-in top-full z-1 flex h-1.5 items-end justify-center overflow-hidden\",\n className\n )}\n {...props}\n>\n <div\n class=\"bg-border relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm shadow-md\"\n >\n </div>\n</div>\n",
36
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<div\n data-slot=\"navigation-menu-indicator\"\n data-state=\"hidden\"\n class={cn(\n \"data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:animate-in data-[state=visible]:fade-in absolute top-full left-(--indicator-left) z-1 flex h-1.5 w-(--indicator-width) items-end justify-center overflow-hidden data-[state=hidden]:invisible\",\n className\n )}\n {...props}\n>\n <div\n class=\"bg-border relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm shadow-md\"\n >\n </div>\n</div>\n",
37
37
  "type": "registry:ui"
38
38
  },
39
39
  {
@@ -48,7 +48,7 @@
48
48
  },
49
49
  {
50
50
  "path": "src/components/ui/navigation-menu/navigation-menu-positioner.astro",
51
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n sideOffset?: number\n align?: \"start\" | \"center\" | \"end\"\n alignOffset?: number\n}\n\nconst {\n class: className,\n side = \"bottom\",\n sideOffset = 8,\n align = \"start\",\n alignOffset = 0,\n ...props\n} = Astro.props\n---\n\n<div data-slot=\"navigation-menu-portal\">\n <div\n {...props}\n data-slot=\"navigation-menu-positioner\"\n data-side={side}\n data-side-offset={sideOffset}\n data-align={align}\n data-align-offset={alignOffset}\n class={cn(\n \"isolate z-50 h-(--positioner-height) w-(--positioner-width) max-w-(--available-width) transition-[top,left,right,bottom] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] data-instant:transition-none data-[side=bottom]:before:top-[-10px] data-[side=bottom]:before:right-0 data-[side=bottom]:before:left-0\",\n className\n )}\n >\n <div\n data-slot=\"navigation-menu-popup\"\n class=\"data-[ending-style]:easing-[ease] xs:w-(--popup-width) bg-popover text-popover-foreground ring-foreground/10 relative h-(--popup-height) w-(--popup-width) origin-(--transform-origin) rounded-lg shadow ring-1 transition-[opacity,transform,width,height,scale,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] outline-none data-ending-style:scale-90 data-ending-style:opacity-0 data-ending-style:duration-150 data-starting-style:scale-90 data-starting-style:opacity-0\"\n >\n <div\n data-slot=\"navigation-menu-viewport\"\n class=\"relative size-full overflow-hidden\"\n >\n </div>\n </div>\n </div>\n</div>\n",
51
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n sideOffset?: number\n align?: \"start\" | \"center\" | \"end\"\n alignOffset?: number\n}\n\nconst {\n class: className,\n side = \"bottom\",\n sideOffset = 8,\n align = \"start\",\n alignOffset = 0,\n ...props\n} = Astro.props\n---\n\n<div data-slot=\"navigation-menu-portal\">\n <div\n {...props}\n data-slot=\"navigation-menu-positioner\"\n data-side={side}\n data-side-offset={sideOffset}\n data-align={align}\n data-align-offset={alignOffset}\n class={cn(\n \"isolate z-50 h-(--positioner-height) w-(--positioner-width) max-w-(--available-width) transition-[top,left,right,bottom] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] data-instant:transition-none data-[side=bottom]:before:top-[-10px] data-[side=bottom]:before:right-0 data-[side=bottom]:before:left-0\",\n className\n )}\n >\n <div\n data-slot=\"navigation-menu-popup\"\n hidden\n class=\"data-[ending-style]:easing-[ease] xs:w-(--popup-width) bg-popover text-popover-foreground ring-foreground/10 relative h-(--popup-height) w-(--popup-width) origin-(--transform-origin) rounded-lg shadow ring-1 transition-[opacity,transform,width,height,scale,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] outline-none data-ending-style:scale-90 data-ending-style:opacity-0 data-ending-style:duration-150 data-starting-style:scale-90 data-starting-style:opacity-0\"\n >\n <div\n data-slot=\"navigation-menu-viewport\"\n hidden\n class=\"relative size-full overflow-hidden\"\n >\n </div>\n </div>\n </div>\n</div>\n",
52
52
  "type": "registry:ui"
53
53
  },
54
54
  {
@@ -637,7 +637,7 @@
637
637
  {
638
638
  "name": "hover-card",
639
639
  "type": "registry:ui",
640
- "dependencies": ["@data-slot/hover-card"],
640
+ "dependencies": ["@data-slot/hover-card", "@data-slot/core"],
641
641
  "files": [
642
642
  {
643
643
  "path": "src/components/ui/hover-card/hover-card.astro",
@@ -12,7 +12,7 @@
12
12
  "files": [
13
13
  {
14
14
  "path": "src/components/ui/sheet/sheet.astro",
15
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n defaultOpen?: boolean\n closeOnClickOutside?: boolean\n closeOnEscape?: boolean\n lockScroll?: boolean\n}\n\nconst {\n class: className,\n defaultOpen,\n closeOnClickOutside,\n closeOnEscape,\n lockScroll,\n ...props\n} = Astro.props\n\nconst manageScrollLock = lockScroll !== false\n---\n\n<div\n data-slot=\"dialog\"\n data-sheet-lock-scroll={manageScrollLock ? \"\" : undefined}\n class={className}\n data-default-open={defaultOpen}\n data-close-on-click-outside={closeOnClickOutside}\n data-close-on-escape={closeOnEscape}\n data-lock-scroll=\"false\"\n {...props}\n>\n <slot />\n</div>\n\n<script>\n import { create } from \"@data-slot/dialog\"\n\n create()\n\n declare global {\n interface Window {\n __fulldevSheetScrollLock?: {\n roots: Set<HTMLElement>\n savedHtmlOverflow: string\n savedHtmlScrollbarGutter: string\n savedBodyPaddingRight: string\n }\n __fulldevSheetScrollLockBound?: boolean\n }\n }\n\n const state =\n window.__fulldevSheetScrollLock ??\n (window.__fulldevSheetScrollLock = {\n roots: new Set<HTMLElement>(),\n savedHtmlOverflow: \"\",\n savedHtmlScrollbarGutter: \"\",\n savedBodyPaddingRight: \"\",\n })\n\n const applyScrollLock = () => {\n const html = document.documentElement\n const body = document.body\n\n if (state.roots.size === 0) {\n html.style.overflow = state.savedHtmlOverflow\n html.style.scrollbarGutter = state.savedHtmlScrollbarGutter\n body.style.paddingRight = state.savedBodyPaddingRight\n return\n }\n\n if (state.roots.size === 1) {\n state.savedHtmlOverflow = html.style.overflow\n state.savedHtmlScrollbarGutter = html.style.scrollbarGutter\n state.savedBodyPaddingRight = body.style.paddingRight\n }\n\n const scrollbarWidth = window.innerWidth - html.clientWidth\n const bodyPaddingRight = Number.parseFloat(\n window.getComputedStyle(body).paddingRight || \"0\"\n )\n\n html.style.overflow = \"hidden\"\n html.style.scrollbarGutter = \"auto\"\n body.style.paddingRight = `${bodyPaddingRight + Math.max(scrollbarWidth, 0)}px`\n }\n\n const syncRoot = (root: HTMLElement, open: boolean) => {\n const hasRoot = state.roots.has(root)\n if (open === hasRoot) return\n\n if (open) state.roots.add(root)\n else state.roots.delete(root)\n\n applyScrollLock()\n }\n\n if (!window.__fulldevSheetScrollLockBound) {\n window.__fulldevSheetScrollLockBound = true\n\n document.addEventListener(\"dialog:change\", (event) => {\n const target = event.target\n\n if (\n !(target instanceof HTMLElement) ||\n target.dataset.slot !== \"dialog\" ||\n target.dataset.sheetLockScroll === undefined\n ) {\n return\n }\n\n const detail = (event as CustomEvent<{ open?: boolean }>).detail\n syncRoot(target, Boolean(detail?.open))\n })\n }\n\n document\n .querySelectorAll<HTMLElement>(\n '[data-slot=\"dialog\"][data-sheet-lock-scroll]'\n )\n .forEach((root) => {\n syncRoot(root, root.hasAttribute(\"data-open\"))\n })\n</script>\n",
15
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n defaultOpen?: boolean\n closeOnClickOutside?: boolean\n closeOnEscape?: boolean\n lockScroll?: boolean\n}\n\nconst {\n class: className,\n defaultOpen,\n closeOnClickOutside,\n closeOnEscape,\n lockScroll,\n ...props\n} = Astro.props\n---\n\n<div\n data-slot=\"dialog\"\n class={className}\n data-default-open={defaultOpen}\n data-close-on-click-outside={closeOnClickOutside}\n data-close-on-escape={closeOnEscape}\n data-lock-scroll={lockScroll}\n {...props}\n>\n <slot />\n</div>\n\n<script>\n import { create } from \"@data-slot/dialog\"\n\n create()\n</script>\n",
16
16
  "type": "registry:ui"
17
17
  },
18
18
  {
@@ -22,7 +22,7 @@
22
22
  },
23
23
  {
24
24
  "path": "src/components/ui/sheet/sheet-content.astro",
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",
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) * 2 + 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) * 2 + 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",
26
26
  "type": "registry:ui"
27
27
  },
28
28
  {
@@ -17,12 +17,12 @@
17
17
  "files": [
18
18
  {
19
19
  "path": "src/components/ui/sidebar/sidebar-provider.astro",
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",
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-slot='tooltip']\")\n .forEach((tooltip) => {\n if (\n state !== \"collapsed\" &&\n tooltip.querySelector(\"[data-sidebar='menu-button']\")\n ) {\n tooltip.dispatchEvent(\n new CustomEvent(\"tooltip:set\", { detail: { open: false } })\n )\n }\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(\"dialog:change\", (event) => {\n const root = event.target\n if (!(root instanceof HTMLElement) || root.dataset.sidebar !== \"sheet\")\n return\n const provider = root.closest(\"[data-slot='sidebar-wrapper']\")\n if (provider)\n provider.dataset.openMobile = String(Boolean(event.detail?.open))\n })\n\n document.addEventListener(\"tooltip:change\", (event) => {\n if (!event.detail?.open) return\n const root = event.target\n if (!(root instanceof HTMLElement)) return\n if (!root.querySelector(\"[data-sidebar='menu-button']\")) return\n const provider = root.closest(\"[data-slot='sidebar-wrapper']\")\n const sidebar = root.closest(\"[data-slot='sidebar']\")\n if (\n provider?.dataset.state !== \"collapsed\" ||\n sidebar?.dataset.collapsible !== \"icon\" ||\n !window.matchMedia(\"(min-width: 768px)\").matches\n ) {\n root.dispatchEvent(\n new CustomEvent(\"tooltip:set\", { detail: { open: false } })\n )\n }\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",
21
21
  "type": "registry:ui"
22
22
  },
23
23
  {
24
24
  "path": "src/components/ui/sidebar/sidebar.astro",
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",
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-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",
26
26
  "type": "registry:ui"
27
27
  },
28
28
  {
@@ -92,7 +92,7 @@
92
92
  },
93
93
  {
94
94
  "path": "src/components/ui/sidebar/sidebar-menu-button.astro",
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",
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-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",
96
96
  "type": "registry:ui"
97
97
  },
98
98
  {
@@ -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 \"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",
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 = String(serializedDefaultValue ?? \"\").includes(\",\") ? 2 : 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 ? \"true\" : undefined}\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 ? \"true\" : undefined}\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
  {
@@ -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 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",
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 ? \"true\" : undefined}\n data-read-only={readOnly}\n data-readonly={readOnly ? \"\" : undefined}\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 data-checked={initialChecked ? \"\" : undefined}\n data-unchecked={initialChecked ? undefined : \"\"}\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
  {
@@ -12,7 +12,7 @@
12
12
  },
13
13
  {
14
14
  "path": "src/components/ui/tabs/tabs-content.astro",
15
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n value?: string\n}\n\nconst { class: className, value, ...props } = Astro.props\n---\n\n<div\n data-slot=\"tabs-content\"\n data-value={value}\n class={cn(\"flex-1 text-sm outline-none\", className)}\n {...props}\n>\n <slot />\n</div>\n",
15
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n value?: string\n}\n\nconst { class: className, hidden = true, value, ...props } = Astro.props\n---\n\n<div\n data-slot=\"tabs-content\"\n hidden={hidden}\n data-value={value}\n class={cn(\"flex-1 text-sm outline-none\", className)}\n {...props}\n>\n <slot />\n</div>\n",
16
16
  "type": "registry:ui"
17
17
  },
18
18
  {
@@ -7,7 +7,7 @@
7
7
  "files": [
8
8
  {
9
9
  "path": "src/components/ui/toggle/toggle.astro",
10
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\nimport { toggleVariants, type ToggleVariantProps } from \"./toggle-variants\"\n\ntype Props = HTMLAttributes<\"button\"> &\n ToggleVariantProps & {\n defaultPressed?: boolean\n disabled?: boolean\n }\n\nconst {\n class: className,\n variant = \"default\",\n size = \"default\",\n defaultPressed,\n disabled,\n type = \"button\",\n ...props\n} = Astro.props\n---\n\n<button\n data-slot=\"toggle\"\n data-default-pressed={defaultPressed}\n data-disabled={disabled}\n type={type}\n class={cn(toggleVariants({ variant, size }), className)}\n {...props}\n>\n <slot />\n</button>\n\n<script>\n import { create } from \"@data-slot/toggle\"\n\n create()\n</script>\n",
10
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\nimport { toggleVariants, type ToggleVariantProps } from \"./toggle-variants\"\n\ntype Props = HTMLAttributes<\"button\"> &\n ToggleVariantProps & {\n defaultPressed?: boolean\n disabled?: boolean\n }\n\nconst {\n class: className,\n variant = \"default\",\n size = \"default\",\n defaultPressed,\n disabled,\n type = \"button\",\n ...props\n} = Astro.props\n---\n\n<button\n data-slot=\"toggle\"\n data-default-pressed={defaultPressed}\n data-disabled={disabled}\n type={type}\n disabled={disabled}\n aria-pressed={defaultPressed === true ? \"true\" : \"false\"}\n class={cn(toggleVariants({ variant, size }), className)}\n {...props}\n>\n <slot />\n</button>\n\n<script>\n import { create } from \"@data-slot/toggle\"\n\n create()\n</script>\n",
11
11
  "type": "registry:ui"
12
12
  },
13
13
  {
package/registry.json CHANGED
@@ -637,7 +637,7 @@
637
637
  {
638
638
  "name": "hover-card",
639
639
  "type": "registry:ui",
640
- "dependencies": ["@data-slot/hover-card"],
640
+ "dependencies": ["@data-slot/hover-card", "@data-slot/core"],
641
641
  "files": [
642
642
  {
643
643
  "path": "src/components/ui/hover-card/hover-card.astro",
@@ -5,11 +5,12 @@ import { cn } from "@/lib/utils"
5
5
 
6
6
  type Props = HTMLAttributes<"div">
7
7
 
8
- const { class: className, ...props } = Astro.props
8
+ const { class: className, hidden = true, ...props } = Astro.props
9
9
  ---
10
10
 
11
11
  <div
12
12
  data-slot="accordion-content"
13
+ hidden={hidden}
13
14
  class="data-open:animate-accordion-down data-closed:animate-accordion-up overflow-hidden text-sm"
14
15
  {...props}
15
16
  >
@@ -22,7 +22,7 @@ const { class: className, size = "default", style, ...props } = Astro.props
22
22
  "group/alert-dialog-content bg-popover text-popover-foreground ring-foreground/10 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 fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 gap-6 rounded-xl p-6 ring-1 duration-100 outline-none data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-lg",
23
23
  className
24
24
  )}
25
- style={`z-index: calc(var(--alert-dialog-content-stack-index, 0) + 111);${style ? ` ${style}` : ""}`}
25
+ style={`z-index: calc(var(--alert-dialog-content-stack-index, 0) * 2 + 101);${style ? ` ${style}` : ""}`}
26
26
  {...props}
27
27
  >
28
28
  <slot />
@@ -15,7 +15,7 @@ const { class: className, style, ...props } = Astro.props
15
15
  "data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0 fixed inset-0 isolate z-(--alert-dialog-overlay-stack-index) bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs",
16
16
  className
17
17
  )}
18
- style={`z-index: calc(var(--alert-dialog-overlay-stack-index, 0) + 110);${style ? ` ${style}` : ""}`}
18
+ style={`z-index: calc(var(--alert-dialog-overlay-stack-index, 0) * 2 + 100);${style ? ` ${style}` : ""}`}
19
19
  {...props}
20
20
  >
21
21
  </div>
@@ -28,7 +28,7 @@ const {
28
28
  "bg-popover text-popover-foreground ring-foreground/10 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 fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-6 rounded-xl p-6 text-sm ring-1 duration-100 outline-none sm:max-w-md",
29
29
  className
30
30
  )}
31
- style={`z-index: calc(var(--dialog-content-stack-index, 0) + 101);${style ? ` ${style}` : ""}`}
31
+ style={`z-index: calc(var(--dialog-content-stack-index, 0) * 2 + 101);${style ? ` ${style}` : ""}`}
32
32
  {...props}
33
33
  >
34
34
  {
@@ -15,7 +15,7 @@ const { class: className, style, ...props } = Astro.props
15
15
  "data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0 fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs",
16
16
  className
17
17
  )}
18
- style={`z-index: calc(var(--dialog-overlay-stack-index, 0) + 100);${style ? ` ${style}` : ""}`}
18
+ style={`z-index: calc(var(--dialog-overlay-stack-index, 0) * 2 + 100);${style ? ` ${style}` : ""}`}
19
19
  {...props}
20
20
  >
21
21
  <slot />
@@ -43,7 +43,7 @@ const {
43
43
  <div
44
44
  data-slot="hover-card"
45
45
  data-default-open={defaultOpen}
46
- data-open={open}
46
+ data-controlled-open={open}
47
47
  data-delay={delay}
48
48
  data-skip-delay-duration={skipDelayDuration}
49
49
  data-close-delay={closeDelay}
@@ -63,7 +63,10 @@ const {
63
63
  </div>
64
64
 
65
65
  <script>
66
- import { create } from "@data-slot/hover-card"
66
+ import { getDataBool } from "@data-slot/core"
67
+ import { createHoverCard } from "@data-slot/hover-card"
67
68
 
68
- create()
69
+ document.querySelectorAll('[data-slot="hover-card"]').forEach((root) => {
70
+ createHoverCard(root, { open: getDataBool(root, "controlledOpen") })
71
+ })
69
72
  </script>
@@ -13,6 +13,7 @@ type Props = {
13
13
 
14
14
  const {
15
15
  class: className = "",
16
+ hidden = true,
16
17
  align,
17
18
  alignOffset,
18
19
  side,
@@ -24,6 +25,7 @@ const {
24
25
  <div
25
26
  {...props}
26
27
  data-slot="navigation-menu-content"
28
+ hidden={hidden}
27
29
  data-align={align}
28
30
  data-align-offset={alignOffset}
29
31
  data-side={side}
@@ -10,8 +10,9 @@ const { class: className, ...props } = Astro.props
10
10
 
11
11
  <div
12
12
  data-slot="navigation-menu-indicator"
13
+ data-state="hidden"
13
14
  class={cn(
14
- "data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:animate-in data-[state=visible]:fade-in top-full z-1 flex h-1.5 items-end justify-center overflow-hidden",
15
+ "data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:animate-in data-[state=visible]:fade-in absolute top-full left-(--indicator-left) z-1 flex h-1.5 w-(--indicator-width) items-end justify-center overflow-hidden data-[state=hidden]:invisible",
15
16
  className
16
17
  )}
17
18
  {...props}
@@ -11,7 +11,7 @@ const { class: className, ...props } = Astro.props
11
11
  <ul
12
12
  data-slot="navigation-menu-list"
13
13
  class={cn(
14
- "group flex flex-1 list-none items-center justify-center gap-0",
14
+ "group relative flex flex-1 list-none items-center justify-center gap-0",
15
15
  className
16
16
  )}
17
17
  {...props}
@@ -35,10 +35,12 @@ const {
35
35
  >
36
36
  <div
37
37
  data-slot="navigation-menu-popup"
38
+ hidden
38
39
  class="data-[ending-style]:easing-[ease] xs:w-(--popup-width) bg-popover text-popover-foreground ring-foreground/10 relative h-(--popup-height) w-(--popup-width) origin-(--transform-origin) rounded-lg shadow ring-1 transition-[opacity,transform,width,height,scale,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] outline-none data-ending-style:scale-90 data-ending-style:opacity-0 data-ending-style:duration-150 data-starting-style:scale-90 data-starting-style:opacity-0"
39
40
  >
40
41
  <div
41
42
  data-slot="navigation-menu-viewport"
43
+ hidden
42
44
  class="relative size-full overflow-hidden"
43
45
  >
44
46
  </div>
@@ -25,7 +25,7 @@ const {
25
25
  data-slot="dialog-overlay"
26
26
  hidden
27
27
  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"
28
- style="z-index: calc(var(--dialog-overlay-stack-index, 0) + 100);"
28
+ style="z-index: calc(var(--dialog-overlay-stack-index, 0) * 2 + 100);"
29
29
  >
30
30
  </div>
31
31
  <div
@@ -36,7 +36,7 @@ const {
36
36
  "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",
37
37
  className
38
38
  )}
39
- style={`z-index: calc(var(--dialog-content-stack-index, 0) + 101);${style ? ` ${style}` : ""}`}
39
+ style={`z-index: calc(var(--dialog-content-stack-index, 0) * 2 + 101);${style ? ` ${style}` : ""}`}
40
40
  {...props}
41
41
  >
42
42
  <slot />
@@ -16,18 +16,15 @@ const {
16
16
  lockScroll,
17
17
  ...props
18
18
  } = Astro.props
19
-
20
- const manageScrollLock = lockScroll !== false
21
19
  ---
22
20
 
23
21
  <div
24
22
  data-slot="dialog"
25
- data-sheet-lock-scroll={manageScrollLock ? "" : undefined}
26
23
  class={className}
27
24
  data-default-open={defaultOpen}
28
25
  data-close-on-click-outside={closeOnClickOutside}
29
26
  data-close-on-escape={closeOnEscape}
30
- data-lock-scroll="false"
27
+ data-lock-scroll={lockScroll}
31
28
  {...props}
32
29
  >
33
30
  <slot />
@@ -37,89 +34,4 @@ const manageScrollLock = lockScroll !== false
37
34
  import { create } from "@data-slot/dialog"
38
35
 
39
36
  create()
40
-
41
- declare global {
42
- interface Window {
43
- __fulldevSheetScrollLock?: {
44
- roots: Set<HTMLElement>
45
- savedHtmlOverflow: string
46
- savedHtmlScrollbarGutter: string
47
- savedBodyPaddingRight: string
48
- }
49
- __fulldevSheetScrollLockBound?: boolean
50
- }
51
- }
52
-
53
- const state =
54
- window.__fulldevSheetScrollLock ??
55
- (window.__fulldevSheetScrollLock = {
56
- roots: new Set<HTMLElement>(),
57
- savedHtmlOverflow: "",
58
- savedHtmlScrollbarGutter: "",
59
- savedBodyPaddingRight: "",
60
- })
61
-
62
- const applyScrollLock = () => {
63
- const html = document.documentElement
64
- const body = document.body
65
-
66
- if (state.roots.size === 0) {
67
- html.style.overflow = state.savedHtmlOverflow
68
- html.style.scrollbarGutter = state.savedHtmlScrollbarGutter
69
- body.style.paddingRight = state.savedBodyPaddingRight
70
- return
71
- }
72
-
73
- if (state.roots.size === 1) {
74
- state.savedHtmlOverflow = html.style.overflow
75
- state.savedHtmlScrollbarGutter = html.style.scrollbarGutter
76
- state.savedBodyPaddingRight = body.style.paddingRight
77
- }
78
-
79
- const scrollbarWidth = window.innerWidth - html.clientWidth
80
- const bodyPaddingRight = Number.parseFloat(
81
- window.getComputedStyle(body).paddingRight || "0"
82
- )
83
-
84
- html.style.overflow = "hidden"
85
- html.style.scrollbarGutter = "auto"
86
- body.style.paddingRight = `${bodyPaddingRight + Math.max(scrollbarWidth, 0)}px`
87
- }
88
-
89
- const syncRoot = (root: HTMLElement, open: boolean) => {
90
- const hasRoot = state.roots.has(root)
91
- if (open === hasRoot) return
92
-
93
- if (open) state.roots.add(root)
94
- else state.roots.delete(root)
95
-
96
- applyScrollLock()
97
- }
98
-
99
- if (!window.__fulldevSheetScrollLockBound) {
100
- window.__fulldevSheetScrollLockBound = true
101
-
102
- document.addEventListener("dialog:change", (event) => {
103
- const target = event.target
104
-
105
- if (
106
- !(target instanceof HTMLElement) ||
107
- target.dataset.slot !== "dialog" ||
108
- target.dataset.sheetLockScroll === undefined
109
- ) {
110
- return
111
- }
112
-
113
- const detail = (event as CustomEvent<{ open?: boolean }>).detail
114
- syncRoot(target, Boolean(detail?.open))
115
- })
116
- }
117
-
118
- document
119
- .querySelectorAll<HTMLElement>(
120
- '[data-slot="dialog"][data-sheet-lock-scroll]'
121
- )
122
- .forEach((root) => {
123
- syncRoot(root, root.hasAttribute("data-open"))
124
- })
125
37
  </script>
@@ -91,7 +91,6 @@ const {
91
91
  <Tooltip>
92
92
  <TooltipTrigger
93
93
  as={Tag}
94
- data-slot="sidebar-menu-button"
95
94
  data-sidebar="menu-button"
96
95
  data-size={size}
97
96
  data-active={resolvedActive ? "true" : undefined}
@@ -67,9 +67,16 @@ const resolvedStyle = [
67
67
  })
68
68
 
69
69
  provider
70
- .querySelectorAll("[data-sidebar='menu-tooltip']")
70
+ .querySelectorAll("[data-slot='tooltip']")
71
71
  .forEach((tooltip) => {
72
- tooltip.hidden = state !== "collapsed"
72
+ if (
73
+ state !== "collapsed" &&
74
+ tooltip.querySelector("[data-sidebar='menu-button']")
75
+ ) {
76
+ tooltip.dispatchEvent(
77
+ new CustomEvent("tooltip:set", { detail: { open: false } })
78
+ )
79
+ }
73
80
  })
74
81
  }
75
82
 
@@ -132,6 +139,33 @@ const resolvedStyle = [
132
139
  window.__fulldevSyncSidebarProvider?.(provider, open)
133
140
  }
134
141
 
142
+ document.addEventListener("dialog:change", (event) => {
143
+ const root = event.target
144
+ if (!(root instanceof HTMLElement) || root.dataset.sidebar !== "sheet")
145
+ return
146
+ const provider = root.closest("[data-slot='sidebar-wrapper']")
147
+ if (provider)
148
+ provider.dataset.openMobile = String(Boolean(event.detail?.open))
149
+ })
150
+
151
+ document.addEventListener("tooltip:change", (event) => {
152
+ if (!event.detail?.open) return
153
+ const root = event.target
154
+ if (!(root instanceof HTMLElement)) return
155
+ if (!root.querySelector("[data-sidebar='menu-button']")) return
156
+ const provider = root.closest("[data-slot='sidebar-wrapper']")
157
+ const sidebar = root.closest("[data-slot='sidebar']")
158
+ if (
159
+ provider?.dataset.state !== "collapsed" ||
160
+ sidebar?.dataset.collapsible !== "icon" ||
161
+ !window.matchMedia("(min-width: 768px)").matches
162
+ ) {
163
+ root.dispatchEvent(
164
+ new CustomEvent("tooltip:set", { detail: { open: false } })
165
+ )
166
+ }
167
+ })
168
+
135
169
  document.addEventListener("click", (event) => {
136
170
  const control = event.target?.closest?.(
137
171
  "[data-sidebar='trigger'], [data-sidebar='rail']"
@@ -54,7 +54,6 @@ const desktopCollapsible = desktopState === "collapsed" ? collapsible : ""
54
54
  side={side}
55
55
  showCloseButton={false}
56
56
  data-sidebar="sidebar"
57
- data-slot="sidebar"
58
57
  data-mobile="true"
59
58
  style="--sidebar-width: var(--sidebar-width-mobile);"
60
59
  class={cn(
@@ -33,7 +33,7 @@ const {
33
33
  const serializedDefaultValue = Array.isArray(defaultValue)
34
34
  ? defaultValue.join(",")
35
35
  : defaultValue
36
- const thumbCount = Array.isArray(defaultValue) ? defaultValue.length : 1
36
+ const thumbCount = String(serializedDefaultValue ?? "").includes(",") ? 2 : 1
37
37
  ---
38
38
 
39
39
  <div
@@ -45,7 +45,7 @@ const thumbCount = Array.isArray(defaultValue) ? defaultValue.length : 1
45
45
  data-large-step={largeStep}
46
46
  data-orientation={orientation}
47
47
  data-thumb-alignment={thumbAlignment}
48
- data-disabled={disabled}
48
+ data-disabled={disabled ? "true" : undefined}
49
49
  class={cn(
50
50
  "data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full",
51
51
  className
@@ -55,7 +55,7 @@ const thumbCount = Array.isArray(defaultValue) ? defaultValue.length : 1
55
55
  <div
56
56
  data-slot="slider-control"
57
57
  data-orientation={orientation}
58
- data-disabled={disabled}
58
+ data-disabled={disabled ? "true" : undefined}
59
59
  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"
60
60
  >
61
61
  <div
@@ -47,9 +47,9 @@ const switchSizeStyle = {
47
47
  data-checked={initialChecked ? "" : undefined}
48
48
  data-unchecked={initialChecked ? undefined : ""}
49
49
  data-default-checked={defaultChecked}
50
- data-disabled={disabled}
50
+ data-disabled={disabled ? "true" : undefined}
51
51
  data-read-only={readOnly}
52
- data-readonly={readOnly}
52
+ data-readonly={readOnly ? "" : undefined}
53
53
  data-required={required}
54
54
  data-name={name}
55
55
  data-value={value}
@@ -60,6 +60,8 @@ const switchSizeStyle = {
60
60
  <span
61
61
  aria-hidden="true"
62
62
  data-slot="switch-thumb"
63
+ data-checked={initialChecked ? "" : undefined}
64
+ data-unchecked={initialChecked ? undefined : ""}
63
65
  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"
64
66
  ></span>
65
67
  </span>
@@ -7,11 +7,12 @@ type Props = HTMLAttributes<"div"> & {
7
7
  value?: string
8
8
  }
9
9
 
10
- const { class: className, value, ...props } = Astro.props
10
+ const { class: className, hidden = true, value, ...props } = Astro.props
11
11
  ---
12
12
 
13
13
  <div
14
14
  data-slot="tabs-content"
15
+ hidden={hidden}
15
16
  data-value={value}
16
17
  class={cn("flex-1 text-sm outline-none", className)}
17
18
  {...props}
@@ -27,6 +27,8 @@ const {
27
27
  data-default-pressed={defaultPressed}
28
28
  data-disabled={disabled}
29
29
  type={type}
30
+ disabled={disabled}
31
+ aria-pressed={defaultPressed === true ? "true" : "false"}
30
32
  class={cn(toggleVariants({ variant, size }), className)}
31
33
  {...props}
32
34
  >