fulldev-ui 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/package.json +24 -20
  3. package/public/r/accordion.json +2 -2
  4. package/public/r/alert-dialog.json +2 -2
  5. package/public/r/banner-2.json +1 -1
  6. package/public/r/banner.json +1 -5
  7. package/public/r/blocks-1.json +1 -1
  8. package/public/r/button.json +1 -1
  9. package/public/r/collapsible.json +2 -2
  10. package/public/r/combobox.json +4 -3
  11. package/public/r/command.json +5 -4
  12. package/public/r/contact-1.json +1 -1
  13. package/public/r/contact-2.json +1 -1
  14. package/public/r/contact-3.json +1 -1
  15. package/public/r/dialog.json +2 -2
  16. package/public/r/doc-1.json +1 -1
  17. package/public/r/dropdown-menu.json +4 -4
  18. package/public/r/hover-card.json +4 -4
  19. package/public/r/input-group.json +0 -1
  20. package/public/r/layout.json +3 -0
  21. package/public/r/navigation-menu.json +3 -3
  22. package/public/r/popover.json +3 -3
  23. package/public/r/radio-group.json +2 -2
  24. package/public/r/registry.json +26 -26
  25. package/public/r/select.json +3 -3
  26. package/public/r/sheet.json +2 -2
  27. package/public/r/sidebar-1.json +1 -1
  28. package/public/r/sidebar.json +1 -1
  29. package/public/r/slider.json +2 -2
  30. package/public/r/switch.json +2 -2
  31. package/public/r/tabs.json +4 -4
  32. package/public/r/toggle.json +2 -2
  33. package/public/r/tooltip.json +3 -3
  34. package/public/r/typography.json +1 -1
  35. package/registry.json +31 -21
  36. package/src/components/blocks/banner-2.astro +7 -4
  37. package/src/components/blocks/blocks-1.astro +23 -23
  38. package/src/components/blocks/contact-1.astro +2 -1
  39. package/src/components/blocks/contact-2.astro +2 -1
  40. package/src/components/blocks/contact-3.astro +2 -1
  41. package/src/components/blocks/doc-1.astro +40 -26
  42. package/src/components/blocks/sidebar-1.astro +48 -46
  43. package/src/components/ui/accordion/accordion.astro +8 -2
  44. package/src/components/ui/alert-dialog/alert-dialog.astro +8 -2
  45. package/src/components/ui/banner/banner.astro +23 -41
  46. package/src/components/ui/button/button.astro +4 -1
  47. package/src/components/ui/collapsible/collapsible.astro +8 -2
  48. package/src/components/ui/combobox/combobox-content.astro +1 -1
  49. package/src/components/ui/combobox/combobox.astro +9 -17
  50. package/src/components/ui/command/command-dialog.astro +1 -0
  51. package/src/components/ui/command/command.astro +40 -25
  52. package/src/components/ui/dialog/dialog.astro +8 -2
  53. package/src/components/ui/dropdown-menu/dropdown-menu-content.astro +1 -1
  54. package/src/components/ui/dropdown-menu/dropdown-menu-item.astro +40 -9
  55. package/src/components/ui/dropdown-menu/dropdown-menu.astro +8 -2
  56. package/src/components/ui/hover-card/hover-card-content.astro +1 -1
  57. package/src/components/ui/hover-card/hover-card.astro +15 -4
  58. package/src/components/ui/navigation-menu/navigation-menu-positioner.astro +1 -1
  59. package/src/components/ui/navigation-menu/navigation-menu.astro +11 -2
  60. package/src/components/ui/popover/popover-content.astro +2 -1
  61. package/src/components/ui/popover/popover.astro +9 -2
  62. package/src/components/ui/radio-group/radio-group.astro +8 -2
  63. package/src/components/ui/select/select-content.astro +2 -2
  64. package/src/components/ui/select/select.astro +11 -7
  65. package/src/components/ui/sheet/sheet.astro +8 -2
  66. package/src/components/ui/slider/slider.astro +10 -4
  67. package/src/components/ui/switch/switch.astro +8 -2
  68. package/src/components/ui/tabs/tabs-content.astro +1 -1
  69. package/src/components/ui/tabs/tabs-trigger.astro +3 -2
  70. package/src/components/ui/tabs/tabs.astro +8 -2
  71. package/src/components/ui/toggle/toggle.astro +8 -2
  72. package/src/components/ui/tooltip/tooltip-content.astro +1 -1
  73. package/src/components/ui/tooltip/tooltip.astro +11 -2
  74. package/src/components/ui/typography/typography.astro +1 -1
  75. package/src/styles/global.css +2 -2
@@ -4,12 +4,12 @@
4
4
  "title": "Switch",
5
5
  "description": "A control that allows the user to toggle between checked and not checked.",
6
6
  "dependencies": [
7
- "@data-slot/switch"
7
+ "@data-slot/switch@^1.0.1"
8
8
  ],
9
9
  "files": [
10
10
  {
11
11
  "path": "src/components/ui/switch/switch.astro",
12
- "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 document.addEventListener(\"astro:page-load\", () => create())\n</script>\n",
12
+ "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 const controllers: ReturnType<typeof create> = []\n const initialize = () => controllers.push(...create())\n initialize()\n document.addEventListener(\"astro:page-load\", initialize)\n document.addEventListener(\"astro:before-swap\", () => {\n for (const controller of controllers) controller.destroy()\n controllers.length = 0\n })\n</script>\n",
13
13
  "type": "registry:ui"
14
14
  },
15
15
  {
@@ -4,17 +4,17 @@
4
4
  "title": "Tabs",
5
5
  "description": "A set of layered sections of content, known as tabs, that display one panel of content at a time.",
6
6
  "dependencies": [
7
- "@data-slot/tabs"
7
+ "@data-slot/tabs@^1.0.1"
8
8
  ],
9
9
  "files": [
10
10
  {
11
11
  "path": "src/components/ui/tabs/tabs.astro",
12
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n defaultValue?: string\n orientation?: \"horizontal\" | \"vertical\"\n activationMode?: \"auto\" | \"manual\"\n}\n\nconst {\n class: className,\n defaultValue,\n orientation = \"horizontal\",\n activationMode,\n ...props\n} = Astro.props\n---\n\n<div\n data-slot=\"tabs\"\n data-default-value={defaultValue}\n data-orientation={orientation}\n data-activation-mode={activationMode}\n data-horizontal={orientation === \"horizontal\" ? \"\" : undefined}\n data-vertical={orientation === \"vertical\" ? \"\" : undefined}\n class={cn(\"group/tabs flex gap-2 data-horizontal:flex-col\", className)}\n {...props}\n>\n <slot />\n</div>\n\n<script>\n import { create } from \"@data-slot/tabs\"\n\n create()\n document.addEventListener(\"astro:page-load\", () => create())\n</script>\n",
12
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n defaultValue?: string\n orientation?: \"horizontal\" | \"vertical\"\n activationMode?: \"auto\" | \"manual\"\n}\n\nconst {\n class: className,\n defaultValue,\n orientation = \"horizontal\",\n activationMode,\n ...props\n} = Astro.props\n---\n\n<div\n data-slot=\"tabs\"\n data-default-value={defaultValue}\n data-orientation={orientation}\n data-activation-mode={activationMode}\n data-horizontal={orientation === \"horizontal\" ? \"\" : undefined}\n data-vertical={orientation === \"vertical\" ? \"\" : undefined}\n class={cn(\"group/tabs flex gap-2 data-horizontal:flex-col\", className)}\n {...props}\n>\n <slot />\n</div>\n\n<script>\n import { create } from \"@data-slot/tabs\"\n\n const controllers: ReturnType<typeof create> = []\n const initialize = () => controllers.push(...create())\n initialize()\n document.addEventListener(\"astro:page-load\", initialize)\n document.addEventListener(\"astro:before-swap\", () => {\n for (const controller of controllers) controller.destroy()\n controllers.length = 0\n })\n</script>\n",
13
13
  "type": "registry:ui"
14
14
  },
15
15
  {
16
16
  "path": "src/components/ui/tabs/tabs-content.astro",
17
- "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",
17
+ "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",
18
18
  "type": "registry:ui"
19
19
  },
20
20
  {
@@ -29,7 +29,7 @@
29
29
  },
30
30
  {
31
31
  "path": "src/components/ui/tabs/tabs-trigger.astro",
32
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"button\"> & {\n value?: string\n}\n\nconst { class: className, value, ...props } = Astro.props\n---\n\n<button\n data-slot=\"tabs-trigger\"\n data-value={value}\n class={cn(\n \"text-foreground/60 hover:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:text-muted-foreground dark:hover:text-foreground relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-disabled:pointer-events-none aria-disabled:opacity-50 group-data-[variant=default]/tabs-list:data-[state=active]:shadow-sm group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n \"group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:border-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent\",\n \"data-[state=active]:bg-background data-[state=active]:text-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 dark:data-[state=active]:text-foreground\",\n \"after:bg-foreground after:absolute after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100\",\n className\n )}\n {...props}\n>\n <slot />\n</button>\n",
32
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"button\"> & {\n value: string\n}\n\nconst { class: className, value, type = \"button\", ...props } = Astro.props\n---\n\n<button\n data-slot=\"tabs-trigger\"\n type={type}\n data-value={value}\n class={cn(\n \"text-foreground/60 hover:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:text-muted-foreground dark:hover:text-foreground relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-disabled:pointer-events-none aria-disabled:opacity-50 group-data-[variant=default]/tabs-list:data-[state=active]:shadow-sm group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n \"group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:border-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent\",\n \"data-[state=active]:bg-background data-[state=active]:text-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 dark:data-[state=active]:text-foreground\",\n \"after:bg-foreground after:absolute after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100\",\n className\n )}\n {...props}\n>\n <slot />\n</button>\n",
33
33
  "type": "registry:ui"
34
34
  },
35
35
  {
@@ -4,12 +4,12 @@
4
4
  "title": "Toggle",
5
5
  "description": "A two-state button that can be either on or off.",
6
6
  "dependencies": [
7
- "@data-slot/toggle"
7
+ "@data-slot/toggle@^1.0.1"
8
8
  ],
9
9
  "files": [
10
10
  {
11
11
  "path": "src/components/ui/toggle/toggle.astro",
12
- "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 document.addEventListener(\"astro:page-load\", () => create())\n</script>\n",
12
+ "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 const controllers: ReturnType<typeof create> = []\n const initialize = () => controllers.push(...create())\n initialize()\n document.addEventListener(\"astro:page-load\", initialize)\n document.addEventListener(\"astro:before-swap\", () => {\n for (const controller of controllers) controller.destroy()\n controllers.length = 0\n })\n</script>\n",
13
13
  "type": "registry:ui"
14
14
  },
15
15
  {
@@ -4,12 +4,12 @@
4
4
  "title": "Tooltip",
5
5
  "description": "Displays contextual information when a user hovers or focuses a trigger.",
6
6
  "dependencies": [
7
- "@data-slot/tooltip"
7
+ "@data-slot/tooltip@^1.0.1"
8
8
  ],
9
9
  "files": [
10
10
  {
11
11
  "path": "src/components/ui/tooltip/tooltip.astro",
12
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport type { TooltipAlign, TooltipSide } from \"@data-slot/tooltip\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n delay?: number\n skipDelayDuration?: number\n side?: TooltipSide\n align?: TooltipAlign\n sideOffset?: number\n alignOffset?: number\n avoidCollisions?: boolean\n collisionPadding?: number\n portal?: boolean\n}\n\nconst {\n class: className,\n delay = 300,\n skipDelayDuration = 300,\n side = \"top\",\n align = \"center\",\n sideOffset = 4,\n alignOffset = 0,\n avoidCollisions = true,\n collisionPadding = 8,\n portal = true,\n ...props\n} = Astro.props\n---\n\n<div\n data-slot=\"tooltip\"\n data-delay={delay}\n data-skip-delay-duration={skipDelayDuration}\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 class={cn(className)}\n {...props}\n>\n <slot />\n</div>\n\n<script>\n import { create } from \"@data-slot/tooltip\"\n\n create()\n document.addEventListener(\"astro:page-load\", () => create())\n</script>\n",
12
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport type { TooltipAlign, TooltipSide } from \"@data-slot/tooltip\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n mountStrategy?: \"lazy\" | \"eager\"\n delay?: number\n skipDelayDuration?: number\n side?: TooltipSide\n align?: TooltipAlign\n sideOffset?: number\n alignOffset?: number\n avoidCollisions?: boolean\n collisionPadding?: number\n portal?: boolean\n}\n\nconst {\n mountStrategy,\n class: className,\n delay = 300,\n skipDelayDuration = 300,\n side = \"top\",\n align = \"center\",\n sideOffset = 4,\n alignOffset = 0,\n avoidCollisions = true,\n collisionPadding = 8,\n portal = true,\n ...props\n} = Astro.props\n---\n\n<div\n data-slot=\"tooltip\"\n data-mount-strategy={mountStrategy}\n data-delay={delay}\n data-skip-delay-duration={skipDelayDuration}\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 class={cn(className)}\n {...props}\n>\n <slot />\n</div>\n\n<script>\n import { create } from \"@data-slot/tooltip\"\n\n const controllers: ReturnType<typeof create> = []\n const initialize = () => controllers.push(...create())\n initialize()\n document.addEventListener(\"astro:page-load\", initialize)\n document.addEventListener(\"astro:before-swap\", () => {\n for (const controller of controllers) controller.destroy()\n controllers.length = 0\n })\n</script>\n",
13
13
  "type": "registry:ui"
14
14
  },
15
15
  {
@@ -19,7 +19,7 @@
19
19
  },
20
20
  {
21
21
  "path": "src/components/ui/tooltip/tooltip-content.astro",
22
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport type { TooltipAlign, TooltipSide } from \"@data-slot/tooltip\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n side?: TooltipSide\n align?: TooltipAlign\n sideOffset?: number\n alignOffset?: number\n avoidCollisions?: boolean\n collisionPadding?: number\n}\n\nconst {\n class: className,\n hidden = true,\n side,\n align,\n sideOffset,\n alignOffset,\n avoidCollisions,\n collisionPadding,\n ...props\n} = Astro.props\n---\n\n<div data-slot=\"tooltip-portal\">\n <div\n data-slot=\"tooltip-positioner\"\n data-side={side}\n data-align={align}\n data-side-offset={sideOffset}\n data-align-offset={alignOffset}\n data-avoid-collisions={avoidCollisions}\n data-collision-padding={collisionPadding}\n class=\"isolate z-50\"\n >\n <div\n data-slot=\"tooltip-content\"\n data-side={side}\n data-align={align}\n data-side-offset={sideOffset}\n data-align-offset={alignOffset}\n data-avoid-collisions={avoidCollisions}\n data-collision-padding={collisionPadding}\n hidden={hidden}\n class={cn(\n \"bg-foreground text-background data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-md px-3 py-1.5 text-xs has-data-[slot=kbd]:pr-1.5 data-[instant]:animate-none data-[instant]:transition-none **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm\",\n className\n )}\n {...props}\n >\n <slot />\n <div\n data-slot=\"tooltip-arrow\"\n aria-hidden=\"true\"\n class=\"bg-foreground fill-foreground z-50 size-2.5 rotate-45 rounded-[2px] data-[side=bottom]:-top-1 data-[side=inline-end]:-left-1 data-[side=inline-end]:translate-x-[1.5px] data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-x-[1.5px] data-[side=left]:-right-1 data-[side=left]:-translate-x-[1.5px] data-[side=right]:-left-1 data-[side=right]:translate-x-[1.5px] data-[side=top]:-bottom-1\"\n >\n </div>\n </div>\n </div>\n</div>\n",
22
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport type { TooltipAlign, TooltipSide } from \"@data-slot/tooltip\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n side?: TooltipSide\n align?: TooltipAlign\n sideOffset?: number\n alignOffset?: number\n avoidCollisions?: boolean\n collisionPadding?: number\n}\n\nconst {\n class: className,\n hidden = true,\n side,\n align,\n sideOffset,\n alignOffset,\n avoidCollisions,\n collisionPadding,\n ...props\n} = Astro.props\n---\n\n<div data-slot=\"tooltip-portal\">\n <div\n data-slot=\"tooltip-positioner\"\n data-side={side}\n data-align={align}\n data-side-offset={sideOffset}\n data-align-offset={alignOffset}\n data-avoid-collisions={avoidCollisions}\n data-collision-padding={collisionPadding}\n class=\"isolate z-[1000]\"\n >\n <div\n data-slot=\"tooltip-content\"\n data-side={side}\n data-align={align}\n data-side-offset={sideOffset}\n data-align-offset={alignOffset}\n data-avoid-collisions={avoidCollisions}\n data-collision-padding={collisionPadding}\n hidden={hidden}\n class={cn(\n \"bg-foreground text-background data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-md px-3 py-1.5 text-xs has-data-[slot=kbd]:pr-1.5 data-[instant]:animate-none data-[instant]:transition-none **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm\",\n className\n )}\n {...props}\n >\n <slot />\n <div\n data-slot=\"tooltip-arrow\"\n aria-hidden=\"true\"\n class=\"bg-foreground fill-foreground z-50 size-2.5 rotate-45 rounded-[2px] data-[side=bottom]:-top-1 data-[side=inline-end]:-left-1 data-[side=inline-end]:translate-x-[1.5px] data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-x-[1.5px] data-[side=left]:-right-1 data-[side=left]:-translate-x-[1.5px] data-[side=right]:-left-1 data-[side=right]:translate-x-[1.5px] data-[side=top]:-bottom-1\"\n >\n </div>\n </div>\n </div>\n</div>\n",
23
23
  "type": "registry:ui"
24
24
  },
25
25
  {
@@ -6,7 +6,7 @@
6
6
  "files": [
7
7
  {
8
8
  "path": "src/components/ui/typography/typography.astro",
9
- "content": "---\nimport type { HTMLTag, Polymorphic } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Size = \"sm\" | \"default\" | \"lg\"\ntype Props<Tag extends HTMLTag> = Polymorphic<{ as: Tag; size?: Size }>\n\nconst {\n as: Tag = \"div\",\n class: className,\n size = \"default\",\n ...props\n} = Astro.props\n---\n\n<Tag\n data-slot=\"typography\"\n data-size={size}\n class={cn(\"text-foreground text-base\", className)}\n {...props}\n>\n <slot />\n</Tag>\n\n<style is:global>\n @reference \"@/styles/global.css\";\n\n [data-slot=\"typography\"]\n > :is(\n [data-slot=\"typography-lead\"],\n [data-slot=\"typography-table-container\"],\n div,\n section,\n article,\n aside,\n nav,\n figure,\n details,\n pre,\n small,\n dl,\n img,\n picture,\n video,\n iframe\n ):not(:first-child) {\n @apply mt-6;\n }\n\n [data-slot=\"typography\"] > h1 {\n @apply scroll-m-20 text-4xl font-semibold tracking-tight text-balance;\n }\n\n [data-slot=\"typography\"] > h2 {\n @apply scroll-m-20 text-3xl font-semibold tracking-tight;\n }\n\n [data-slot=\"typography\"] > h2:first-child {\n @apply mt-0;\n }\n\n [data-slot=\"typography\"] > h2:not(:first-child) {\n @apply mt-10;\n }\n\n [data-slot=\"typography\"] > h3 {\n @apply scroll-m-20 text-2xl font-semibold tracking-tight;\n }\n\n [data-slot=\"typography\"] > h3:not(:first-child) {\n @apply mt-8;\n }\n\n [data-slot=\"typography\"] > h4 {\n @apply scroll-m-20 text-xl font-semibold tracking-tight;\n }\n\n [data-slot=\"typography\"] > h4:not(:first-child) {\n @apply mt-8;\n }\n\n [data-slot=\"typography\"]\n > :is(h1, h2, h3, h4)\n + :is(\n [data-slot=\"typography-lead\"],\n [data-slot=\"typography-table-container\"],\n div,\n section,\n article,\n aside,\n nav,\n figure,\n details,\n p,\n blockquote,\n pre,\n ul,\n ol,\n table,\n small,\n dl,\n img,\n picture,\n video,\n iframe\n ) {\n @apply mt-4;\n }\n\n [data-slot=\"typography\"] > p {\n @apply text-base leading-7;\n }\n\n [data-slot=\"typography\"] > p:not(:first-child) {\n @apply mt-6;\n }\n\n [data-slot=\"typography\"]\n > :is(h1, h2, h3, h4)\n + :is(p, [data-slot=\"typography-lead\"]):not(:first-child) {\n @apply mt-4;\n }\n\n [data-slot=\"typography\"] > a:not([data-slot]),\n [data-slot=\"typography\"]\n > :is(p, blockquote, ul, ol, dl, table)\n a:not([data-slot]) {\n @apply text-primary font-medium underline underline-offset-4;\n }\n\n [data-slot=\"typography\"] > blockquote {\n @apply mt-6 border-l-2 pl-6 text-base italic;\n }\n\n [data-slot=\"typography\"] > hr {\n @apply border-border my-8;\n }\n\n [data-slot=\"typography\"] > pre {\n @apply border-border bg-muted/60 overflow-x-auto rounded-xl border p-4 text-sm;\n }\n\n [data-slot=\"typography\"] > .docs-code-block {\n @apply border-border bg-muted/60 relative overflow-hidden rounded-xl border;\n }\n\n [data-slot=\"typography\"] > .docs-code-block > pre,\n [data-slot=\"typography\"] > .docs-code-block > pre.astro-code {\n @apply m-0 rounded-none border-0 !bg-transparent p-4 pr-14 text-sm leading-[var(--text-sm--line-height)];\n font-family: var(--font-mono);\n }\n\n [data-slot=\"typography\"] > .docs-code-block > pre.astro-code code {\n @apply text-sm leading-[var(--text-sm--line-height)] !text-[var(--shiki-light,var(--foreground))];\n }\n\n .dark [data-slot=\"typography\"] > .docs-code-block > pre.astro-code code {\n @apply !text-[var(--shiki-dark,var(--foreground))];\n }\n\n .dark\n [data-slot=\"typography\"]\n > .docs-code-block\n > pre.astro-code\n span[style*=\"--shiki-dark\"] {\n @apply ![font-weight:var(--shiki-dark-font-weight,inherit)] !text-[var(--shiki-dark)] ![font-style:var(--shiki-dark-font-style,inherit)] ![text-decoration:var(--shiki-dark-text-decoration,inherit)];\n }\n\n [data-slot=\"typography\"] > .docs-code-block > .docs-code-copy {\n @apply border-border bg-background text-muted-foreground hover:bg-accent hover:text-accent-foreground absolute top-3 right-3 z-10 inline-flex size-8 items-center justify-center rounded-md border shadow-sm transition-colors;\n }\n\n [data-slot=\"typography\"] > .docs-code-block svg {\n @apply size-4;\n }\n\n [data-slot=\"typography\"] > ul,\n [data-slot=\"typography\"] > ol {\n @apply my-6 ml-6 text-base;\n }\n\n [data-slot=\"typography\"] > ul {\n @apply list-disc;\n }\n\n [data-slot=\"typography\"] > ol {\n @apply list-decimal;\n }\n\n [data-slot=\"typography\"] > ul > li,\n [data-slot=\"typography\"] > ol > li {\n @apply mt-2;\n }\n\n [data-slot=\"typography\"] > [data-slot=\"typography-lead\"] {\n @apply text-muted-foreground;\n }\n\n [data-slot=\"typography\"][data-size=\"sm\"] > [data-slot=\"typography-lead\"] {\n @apply text-base;\n }\n\n [data-slot=\"typography\"] > [data-slot=\"typography-lead\"],\n [data-slot=\"typography\"][data-size=\"default\"]\n > [data-slot=\"typography-lead\"] {\n @apply text-lg;\n }\n\n [data-slot=\"typography\"][data-size=\"lg\"] > [data-slot=\"typography-lead\"] {\n @apply text-xl;\n }\n\n [data-slot=\"typography\"] > small {\n @apply block leading-none font-medium;\n }\n\n [data-slot=\"typography\"] > small {\n @apply text-sm;\n }\n\n [data-slot=\"typography\"] > table {\n @apply border-border my-6 block w-full overflow-x-auto rounded-lg border;\n border-collapse: separate;\n border-spacing: 0;\n }\n\n [data-slot=\"typography\"] > table th,\n [data-slot=\"typography\"] > table td {\n @apply border-border border-b px-4 py-2 text-left align-top whitespace-nowrap;\n }\n\n [data-slot=\"typography\"] > table th {\n @apply text-foreground bg-muted/40 font-medium;\n }\n\n [data-slot=\"typography\"] > table tr:last-child td {\n @apply border-b-0;\n }\n\n [data-slot=\"typography\"] > table thead,\n [data-slot=\"typography\"] > table tbody,\n [data-slot=\"typography\"] > table tr {\n @apply w-full;\n }\n\n [data-slot=\"typography\"] > table tr {\n @apply grid grid-cols-[minmax(0,1fr)_minmax(0,1fr)_minmax(0,1fr)];\n }\n\n [data-slot=\"typography\"] > table tr {\n @apply even:bg-muted/40 m-0 border-t p-0 first:border-t-0;\n }\n\n [data-slot=\"typography\"] > table th {\n @apply border-r px-4 py-2 text-left font-bold last:border-r-0;\n }\n\n [data-slot=\"typography\"] > table th[align=\"center\"] {\n @apply text-center;\n }\n\n [data-slot=\"typography\"] > table th[align=\"right\"] {\n @apply text-right;\n }\n\n [data-slot=\"typography\"] > table td {\n @apply border-r px-4 py-2 text-left last:border-r-0;\n }\n\n [data-slot=\"typography\"] > table td[align=\"center\"] {\n @apply text-center;\n }\n\n [data-slot=\"typography\"] > table td[align=\"right\"] {\n @apply text-right;\n }\n\n [data-slot=\"typography\"] > table tbody tr:last-child td {\n @apply border-b-0;\n }\n\n [data-slot=\"typography\"] :not(pre) > code {\n @apply bg-muted relative rounded px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold;\n }\n\n [data-slot=\"typography\"] > table :not(pre) > code {\n @apply rounded-md text-sm leading-5 font-normal;\n }\n\n [data-slot=\"typography\"] > pre.astro-code {\n @apply border-border !bg-muted/60 rounded-xl border p-4 text-sm leading-[var(--text-sm--line-height)];\n }\n\n [data-slot=\"typography\"] > pre.astro-code code {\n @apply !text-inherit;\n }\n\n .dark [data-slot=\"typography\"] > pre.astro-code {\n @apply !text-[var(--shiki-dark,var(--foreground))];\n }\n\n .dark [data-slot=\"typography\"] > pre.astro-code span[style*=\"--shiki-dark\"] {\n @apply ![font-weight:var(--shiki-dark-font-weight,inherit)] !text-[var(--shiki-dark)] ![font-style:var(--shiki-dark-font-style,inherit)] ![text-decoration:var(--shiki-dark-text-decoration,inherit)];\n }\n</style>\n",
9
+ "content": "---\nimport type { HTMLTag, Polymorphic } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Size = \"sm\" | \"default\" | \"lg\"\ntype Props<Tag extends HTMLTag> = Polymorphic<{ as: Tag; size?: Size }>\n\nconst {\n as: Tag = \"div\",\n class: className,\n size = \"default\",\n ...props\n} = Astro.props\n---\n\n<Tag\n data-slot=\"typography\"\n data-size={size}\n class={cn(\"text-foreground text-base\", className)}\n {...props}\n>\n <slot />\n</Tag>\n\n<style is:global>\n @reference \"@/styles/global.css\";\n\n [data-slot=\"typography\"]\n > :is(\n [data-slot=\"typography-lead\"],\n [data-slot=\"typography-table-container\"],\n div,\n section,\n article,\n aside,\n nav,\n figure,\n details,\n pre,\n small,\n dl,\n img,\n picture,\n video,\n iframe\n ):not(:first-child) {\n @apply mt-6;\n }\n\n [data-slot=\"typography\"] > h1 {\n @apply scroll-m-20 text-4xl font-semibold tracking-tight text-balance;\n }\n\n [data-slot=\"typography\"] > h2 {\n @apply scroll-m-20 text-3xl font-semibold tracking-tight;\n }\n\n [data-slot=\"typography\"] > h2:first-child {\n @apply mt-0;\n }\n\n [data-slot=\"typography\"] > h2:not(:first-child) {\n @apply mt-10;\n }\n\n [data-slot=\"typography\"] > h3 {\n @apply scroll-m-20 text-2xl font-semibold tracking-tight;\n }\n\n [data-slot=\"typography\"] > h3:not(:first-child) {\n @apply mt-8;\n }\n\n [data-slot=\"typography\"] > h4 {\n @apply scroll-m-20 text-xl font-semibold tracking-tight;\n }\n\n [data-slot=\"typography\"] > h4:not(:first-child) {\n @apply mt-8;\n }\n\n [data-slot=\"typography\"]\n > :is(h1, h2, h3, h4)\n + :is(\n [data-slot=\"typography-lead\"],\n [data-slot=\"typography-table-container\"],\n div,\n section,\n article,\n aside,\n nav,\n figure,\n details,\n p,\n blockquote,\n pre,\n ul,\n ol,\n table,\n small,\n dl,\n img,\n picture,\n video,\n iframe\n ) {\n @apply mt-4;\n }\n\n [data-slot=\"typography\"] > p {\n @apply text-base leading-7;\n }\n\n [data-slot=\"typography\"] > p:not(:first-child) {\n @apply mt-6;\n }\n\n [data-slot=\"typography\"]\n > :is(h1, h2, h3, h4)\n + :is(p, [data-slot=\"typography-lead\"]):not(:first-child) {\n @apply mt-4;\n }\n\n [data-slot=\"typography\"] > a:not([data-slot]),\n [data-slot=\"typography\"]\n > :is(p, blockquote, ul, ol, dl, table)\n a:not([data-slot]) {\n @apply text-foreground font-medium underline underline-offset-4;\n }\n\n [data-slot=\"typography\"] > blockquote {\n @apply mt-6 border-l-2 pl-6 text-base italic;\n }\n\n [data-slot=\"typography\"] > hr {\n @apply border-border my-8;\n }\n\n [data-slot=\"typography\"] > pre {\n @apply border-border bg-muted/60 overflow-x-auto rounded-xl border p-4 text-sm;\n }\n\n [data-slot=\"typography\"] > .docs-code-block {\n @apply border-border bg-muted/60 relative overflow-hidden rounded-xl border;\n }\n\n [data-slot=\"typography\"] > .docs-code-block > pre,\n [data-slot=\"typography\"] > .docs-code-block > pre.astro-code {\n @apply m-0 rounded-none border-0 !bg-transparent p-4 pr-14 text-sm leading-[var(--text-sm--line-height)];\n font-family: var(--font-mono);\n }\n\n [data-slot=\"typography\"] > .docs-code-block > pre.astro-code code {\n @apply text-sm leading-[var(--text-sm--line-height)] !text-[var(--shiki-light,var(--foreground))];\n }\n\n .dark [data-slot=\"typography\"] > .docs-code-block > pre.astro-code code {\n @apply !text-[var(--shiki-dark,var(--foreground))];\n }\n\n .dark\n [data-slot=\"typography\"]\n > .docs-code-block\n > pre.astro-code\n span[style*=\"--shiki-dark\"] {\n @apply ![font-weight:var(--shiki-dark-font-weight,inherit)] !text-[var(--shiki-dark)] ![font-style:var(--shiki-dark-font-style,inherit)] ![text-decoration:var(--shiki-dark-text-decoration,inherit)];\n }\n\n [data-slot=\"typography\"] > .docs-code-block > .docs-code-copy {\n @apply border-border bg-background text-muted-foreground hover:bg-accent hover:text-accent-foreground absolute top-3 right-3 z-10 inline-flex size-8 items-center justify-center rounded-md border shadow-sm transition-colors;\n }\n\n [data-slot=\"typography\"] > .docs-code-block svg {\n @apply size-4;\n }\n\n [data-slot=\"typography\"] > ul,\n [data-slot=\"typography\"] > ol {\n @apply my-6 ml-6 text-base;\n }\n\n [data-slot=\"typography\"] > ul {\n @apply list-disc;\n }\n\n [data-slot=\"typography\"] > ol {\n @apply list-decimal;\n }\n\n [data-slot=\"typography\"] > ul > li,\n [data-slot=\"typography\"] > ol > li {\n @apply mt-2;\n }\n\n [data-slot=\"typography\"] > [data-slot=\"typography-lead\"] {\n @apply text-muted-foreground;\n }\n\n [data-slot=\"typography\"][data-size=\"sm\"] > [data-slot=\"typography-lead\"] {\n @apply text-base;\n }\n\n [data-slot=\"typography\"] > [data-slot=\"typography-lead\"],\n [data-slot=\"typography\"][data-size=\"default\"]\n > [data-slot=\"typography-lead\"] {\n @apply text-lg;\n }\n\n [data-slot=\"typography\"][data-size=\"lg\"] > [data-slot=\"typography-lead\"] {\n @apply text-xl;\n }\n\n [data-slot=\"typography\"] > small {\n @apply block leading-none font-medium;\n }\n\n [data-slot=\"typography\"] > small {\n @apply text-sm;\n }\n\n [data-slot=\"typography\"] > table {\n @apply border-border my-6 block w-full overflow-x-auto rounded-lg border;\n border-collapse: separate;\n border-spacing: 0;\n }\n\n [data-slot=\"typography\"] > table th,\n [data-slot=\"typography\"] > table td {\n @apply border-border border-b px-4 py-2 text-left align-top whitespace-nowrap;\n }\n\n [data-slot=\"typography\"] > table th {\n @apply text-foreground bg-muted/40 font-medium;\n }\n\n [data-slot=\"typography\"] > table tr:last-child td {\n @apply border-b-0;\n }\n\n [data-slot=\"typography\"] > table thead,\n [data-slot=\"typography\"] > table tbody,\n [data-slot=\"typography\"] > table tr {\n @apply w-full;\n }\n\n [data-slot=\"typography\"] > table tr {\n @apply grid grid-cols-[minmax(0,1fr)_minmax(0,1fr)_minmax(0,1fr)];\n }\n\n [data-slot=\"typography\"] > table tr {\n @apply even:bg-muted/40 m-0 border-t p-0 first:border-t-0;\n }\n\n [data-slot=\"typography\"] > table th {\n @apply border-r px-4 py-2 text-left font-bold last:border-r-0;\n }\n\n [data-slot=\"typography\"] > table th[align=\"center\"] {\n @apply text-center;\n }\n\n [data-slot=\"typography\"] > table th[align=\"right\"] {\n @apply text-right;\n }\n\n [data-slot=\"typography\"] > table td {\n @apply border-r px-4 py-2 text-left last:border-r-0;\n }\n\n [data-slot=\"typography\"] > table td[align=\"center\"] {\n @apply text-center;\n }\n\n [data-slot=\"typography\"] > table td[align=\"right\"] {\n @apply text-right;\n }\n\n [data-slot=\"typography\"] > table tbody tr:last-child td {\n @apply border-b-0;\n }\n\n [data-slot=\"typography\"] :not(pre) > code {\n @apply bg-muted relative rounded px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold;\n }\n\n [data-slot=\"typography\"] > table :not(pre) > code {\n @apply rounded-md text-sm leading-5 font-normal;\n }\n\n [data-slot=\"typography\"] > pre.astro-code {\n @apply border-border !bg-muted/60 rounded-xl border p-4 text-sm leading-[var(--text-sm--line-height)];\n }\n\n [data-slot=\"typography\"] > pre.astro-code code {\n @apply !text-inherit;\n }\n\n .dark [data-slot=\"typography\"] > pre.astro-code {\n @apply !text-[var(--shiki-dark,var(--foreground))];\n }\n\n .dark [data-slot=\"typography\"] > pre.astro-code span[style*=\"--shiki-dark\"] {\n @apply ![font-weight:var(--shiki-dark-font-weight,inherit)] !text-[var(--shiki-dark)] ![font-style:var(--shiki-dark-font-style,inherit)] ![text-decoration:var(--shiki-dark-text-decoration,inherit)];\n }\n</style>\n",
10
10
  "type": "registry:ui"
11
11
  },
12
12
  {
package/registry.json CHANGED
@@ -10,7 +10,7 @@
10
10
  "description": "A vertically stacked set of interactive headings that each reveal a section of content.",
11
11
  "categories": ["ui"],
12
12
  "docs": "https://ui.full.dev/components/accordion/",
13
- "dependencies": ["@data-slot/accordion", "@lucide/astro"],
13
+ "dependencies": ["@data-slot/accordion@^1.0.1", "@lucide/astro"],
14
14
  "files": [
15
15
  {
16
16
  "path": "src/components/ui/accordion/accordion.astro",
@@ -67,7 +67,7 @@
67
67
  "description": "A modal dialog for important confirmations that expects a response.",
68
68
  "categories": ["ui"],
69
69
  "docs": "https://ui.full.dev/components/alert-dialog/",
70
- "dependencies": ["@data-slot/alert-dialog"],
70
+ "dependencies": ["@data-slot/alert-dialog@^1.0.1"],
71
71
  "registryDependencies": ["@fulldev/button"],
72
72
  "files": [
73
73
  {
@@ -180,7 +180,6 @@
180
180
  "categories": ["ui"],
181
181
  "docs": "https://ui.full.dev/components/banner/",
182
182
  "dependencies": ["@lucide/astro"],
183
- "registryDependencies": ["@fulldev/button", "@fulldev/dropdown-menu"],
184
183
  "files": [
185
184
  {
186
185
  "path": "src/components/ui/banner/banner.astro",
@@ -328,7 +327,7 @@
328
327
  "description": "An interactive component which expands/collapses a panel.",
329
328
  "categories": ["ui"],
330
329
  "docs": "https://ui.full.dev/components/collapsible/",
331
- "dependencies": ["@data-slot/collapsible"],
330
+ "dependencies": ["@data-slot/collapsible@^1.0.1"],
332
331
  "files": [
333
332
  {
334
333
  "path": "src/components/ui/collapsible/collapsible.astro",
@@ -355,7 +354,11 @@
355
354
  "description": "Autocomplete input with a list of suggestions.",
356
355
  "categories": ["ui"],
357
356
  "docs": "https://ui.full.dev/components/combobox/",
358
- "dependencies": ["@data-slot/combobox", "@lucide/astro"],
357
+ "dependencies": [
358
+ "@data-slot/combobox@^1.0.1",
359
+ "@data-slot/core@^1.0.1",
360
+ "@lucide/astro"
361
+ ],
359
362
  "registryDependencies": ["@fulldev/input-group"],
360
363
  "files": [
361
364
  {
@@ -415,7 +418,11 @@
415
418
  "description": "Command menu for search and quick actions.",
416
419
  "categories": ["ui"],
417
420
  "docs": "https://ui.full.dev/components/command/",
418
- "dependencies": ["@data-slot/command", "@lucide/astro"],
421
+ "dependencies": [
422
+ "@data-slot/command@^1.0.1",
423
+ "@lucide/astro",
424
+ "@data-slot/core@^1.0.1"
425
+ ],
419
426
  "registryDependencies": ["@fulldev/dialog"],
420
427
  "files": [
421
428
  {
@@ -467,7 +474,7 @@
467
474
  "description": "A window overlaid on either the primary window or another dialog window, rendering the content underneath inert.",
468
475
  "categories": ["ui"],
469
476
  "docs": "https://ui.full.dev/components/dialog/",
470
- "dependencies": ["@data-slot/dialog", "@lucide/astro"],
477
+ "dependencies": ["@data-slot/dialog@^1.0.1", "@lucide/astro"],
471
478
  "registryDependencies": ["@fulldev/button"],
472
479
  "files": [
473
480
  {
@@ -523,7 +530,7 @@
523
530
  "description": "Displays a menu to the user, such as a set of actions or functions, triggered by a button.",
524
531
  "categories": ["ui"],
525
532
  "docs": "https://ui.full.dev/components/dropdown-menu/",
526
- "dependencies": ["@data-slot/dropdown-menu", "@lucide/astro"],
533
+ "dependencies": ["@data-slot/dropdown-menu@^1.0.1", "@lucide/astro"],
527
534
  "files": [
528
535
  {
529
536
  "path": "src/components/ui/dropdown-menu/dropdown-menu.astro",
@@ -717,7 +724,10 @@
717
724
  "description": "For sighted users to preview content available behind a link.",
718
725
  "categories": ["ui"],
719
726
  "docs": "https://ui.full.dev/components/hover-card/",
720
- "dependencies": ["@data-slot/hover-card", "@data-slot/core"],
727
+ "dependencies": [
728
+ "@data-slot/hover-card@^1.0.1",
729
+ "@data-slot/core@^1.0.1"
730
+ ],
721
731
  "files": [
722
732
  {
723
733
  "path": "src/components/ui/hover-card/hover-card.astro",
@@ -783,7 +793,6 @@
783
793
  "docs": "https://ui.full.dev/components/input-group/",
784
794
  "registryDependencies": [
785
795
  "@fulldev/button",
786
- "@fulldev/dropdown-menu",
787
796
  "@fulldev/input",
788
797
  "@fulldev/textarea"
789
798
  ],
@@ -1011,7 +1020,7 @@
1011
1020
  "description": "A collection of links for navigating websites.",
1012
1021
  "categories": ["ui"],
1013
1022
  "docs": "https://ui.full.dev/components/navigation-menu/",
1014
- "dependencies": ["@data-slot/navigation-menu", "@lucide/astro"],
1023
+ "dependencies": ["@data-slot/navigation-menu@^1.0.1", "@lucide/astro"],
1015
1024
  "files": [
1016
1025
  {
1017
1026
  "path": "src/components/ui/navigation-menu/navigation-menu.astro",
@@ -1089,7 +1098,7 @@
1089
1098
  "description": "Displays rich content in a floating layer, triggered by a button.",
1090
1099
  "categories": ["ui"],
1091
1100
  "docs": "https://ui.full.dev/components/popover/",
1092
- "dependencies": ["@data-slot/popover"],
1101
+ "dependencies": ["@data-slot/popover@^1.0.1"],
1093
1102
  "files": [
1094
1103
  {
1095
1104
  "path": "src/components/ui/popover/popover.astro",
@@ -1158,7 +1167,7 @@
1158
1167
  "description": "A set of checkable buttons, known as radio buttons, where no more than one of the buttons can be checked at a time.",
1159
1168
  "categories": ["ui"],
1160
1169
  "docs": "https://ui.full.dev/components/radio-group/",
1161
- "dependencies": ["@data-slot/radio-group"],
1170
+ "dependencies": ["@data-slot/radio-group@^1.0.1"],
1162
1171
  "files": [
1163
1172
  {
1164
1173
  "path": "src/components/ui/radio-group/radio-group.astro",
@@ -1200,7 +1209,7 @@
1200
1209
  "description": "Displays a list of options for the user to pick from, triggered by a button.",
1201
1210
  "categories": ["ui"],
1202
1211
  "docs": "https://ui.full.dev/components/select/",
1203
- "dependencies": ["@data-slot/select", "@lucide/astro"],
1212
+ "dependencies": ["@data-slot/select@^1.0.1", "@lucide/astro"],
1204
1213
  "files": [
1205
1214
  {
1206
1215
  "path": "src/components/ui/select/select.astro",
@@ -1295,7 +1304,7 @@
1295
1304
  "description": "A sliding panel component that appears from the edge of the screen.",
1296
1305
  "categories": ["ui"],
1297
1306
  "docs": "https://ui.full.dev/components/sheet/",
1298
- "dependencies": ["@data-slot/dialog", "@lucide/astro"],
1307
+ "dependencies": ["@data-slot/dialog@^1.0.1", "@lucide/astro"],
1299
1308
  "registryDependencies": ["@fulldev/button", "@fulldev/dialog"],
1300
1309
  "files": [
1301
1310
  {
@@ -1343,7 +1352,7 @@
1343
1352
  "description": "A composable, themeable, and customizable Astro sidebar component.",
1344
1353
  "categories": ["ui"],
1345
1354
  "docs": "https://ui.full.dev/components/sidebar/",
1346
- "dependencies": ["@data-slot/tooltip", "@lucide/astro"],
1355
+ "dependencies": ["@data-slot/tooltip@^1.0.1", "@lucide/astro"],
1347
1356
  "registryDependencies": [
1348
1357
  "@fulldev/layout",
1349
1358
  "@fulldev/button",
@@ -1459,7 +1468,7 @@
1459
1468
  "description": "An input where the user selects a value from within a given range.",
1460
1469
  "categories": ["ui"],
1461
1470
  "docs": "https://ui.full.dev/components/slider/",
1462
- "dependencies": ["@data-slot/slider"],
1471
+ "dependencies": ["@data-slot/slider@^1.0.1"],
1463
1472
  "files": [
1464
1473
  {
1465
1474
  "path": "src/components/ui/slider/slider.astro",
@@ -1515,7 +1524,7 @@
1515
1524
  "description": "A control that allows the user to toggle between checked and not checked.",
1516
1525
  "categories": ["ui"],
1517
1526
  "docs": "https://ui.full.dev/components/switch/",
1518
- "dependencies": ["@data-slot/switch"],
1527
+ "dependencies": ["@data-slot/switch@^1.0.1"],
1519
1528
  "files": [
1520
1529
  {
1521
1530
  "path": "src/components/ui/switch/switch.astro",
@@ -1580,7 +1589,7 @@
1580
1589
  "description": "A set of layered sections of content, known as tabs, that display one panel of content at a time.",
1581
1590
  "categories": ["ui"],
1582
1591
  "docs": "https://ui.full.dev/components/tabs/",
1583
- "dependencies": ["@data-slot/tabs"],
1592
+ "dependencies": ["@data-slot/tabs@^1.0.1"],
1584
1593
  "files": [
1585
1594
  {
1586
1595
  "path": "src/components/ui/tabs/tabs.astro",
@@ -1649,7 +1658,7 @@
1649
1658
  "description": "A two-state button that can be either on or off.",
1650
1659
  "categories": ["ui"],
1651
1660
  "docs": "https://ui.full.dev/components/toggle/",
1652
- "dependencies": ["@data-slot/toggle"],
1661
+ "dependencies": ["@data-slot/toggle@^1.0.1"],
1653
1662
  "files": [
1654
1663
  {
1655
1664
  "path": "src/components/ui/toggle/toggle.astro",
@@ -1690,7 +1699,7 @@
1690
1699
  "description": "Displays contextual information when a user hovers or focuses a trigger.",
1691
1700
  "categories": ["ui"],
1692
1701
  "docs": "https://ui.full.dev/components/tooltip/",
1693
- "dependencies": ["@data-slot/tooltip"],
1702
+ "dependencies": ["@data-slot/tooltip@^1.0.1"],
1694
1703
  "files": [
1695
1704
  {
1696
1705
  "path": "src/components/ui/tooltip/tooltip.astro",
@@ -1876,6 +1885,7 @@
1876
1885
  "description": "Page-shell primitives for the root html, head, body, and main structure.",
1877
1886
  "categories": ["ui"],
1878
1887
  "docs": "https://ui.full.dev/components/layout/",
1888
+ "dependencies": ["@lexingtonthemes/seo@^0.2.0"],
1879
1889
  "files": [
1880
1890
  {
1881
1891
  "path": "src/components/ui/layout/layout.astro",
@@ -21,19 +21,22 @@ const { class: className, title, description, buttons, ...props } = Astro.props
21
21
  <Banner
22
22
  variant="floating"
23
23
  storageKey="banner-2"
24
- class={cn("", className)}
24
+ class={cn("@container", className)}
25
25
  {...props}
26
26
  >
27
- <BannerContainer class="gap-4 py-1" showClose={false}>
27
+ <BannerContainer
28
+ class="flex-col items-start gap-4 py-1 @2xl:flex-row @2xl:items-center"
29
+ showClose={false}
30
+ >
28
31
  <div
29
- class="flex flex-1 flex-col gap-0.5 @5xl:flex-row @5xl:items-center @5xl:gap-x-4"
32
+ class="flex min-w-0 flex-1 flex-col gap-0.5 @5xl:flex-row @5xl:items-center @5xl:gap-x-4"
30
33
  >
31
34
  <p class="text-sm font-semibold">{title}</p>
32
35
  <p class="text-muted-foreground text-sm">{description}</p>
33
36
  </div>
34
37
  {
35
38
  buttons?.length && (
36
- <div class="flex shrink-0 items-center gap-2">
39
+ <div class="flex flex-wrap items-center gap-2">
37
40
  {buttons.map(({ href, label, ...button }, index) => (
38
41
  <Button
39
42
  as="a"
@@ -15,6 +15,7 @@ import { buttonVariants } from "@/components/ui/button/button-variants"
15
15
  import {
16
16
  DropdownMenu,
17
17
  DropdownMenuContent,
18
+ DropdownMenuItem,
18
19
  DropdownMenuTrigger,
19
20
  } from "@/components/ui/dropdown-menu"
20
21
  import { SectionContainer } from "@/components/ui/section"
@@ -129,6 +130,7 @@ const openLinks = markdownUrl
129
130
  variant="outline"
130
131
  size="xs"
131
132
  data-source={copyButton?.source}
133
+ data-blocks-copy
132
134
  aria-label={labels.copyMarkdown}
133
135
  >
134
136
  <Copy class="blocks-copy-icon size-3.5" />
@@ -148,11 +150,10 @@ const openLinks = markdownUrl
148
150
  </DropdownMenuTrigger>
149
151
  <DropdownMenuContent align="end" sideOffset={6} class="w-56">
150
152
  {openLinks.map((link) => (
151
- <a
153
+ <DropdownMenuItem
152
154
  href={link.href}
153
155
  target="_blank"
154
156
  rel="noreferrer noopener"
155
- class="hover:bg-accent hover:text-accent-foreground flex items-center gap-2 rounded-sm px-2 py-1.5 text-sm transition-colors outline-none"
156
157
  >
157
158
  {link.icon === "markdown" && <Markdown class="size-4" />}
158
159
  {link.icon === "chatgpt" && (
@@ -170,7 +171,7 @@ const openLinks = markdownUrl
170
171
  {link.icon === "cursor" && <Cursor class="size-4" />}
171
172
  <span>{link.label}</span>
172
173
  <ExternalLink class="text-muted-foreground ml-auto size-3.5" />
173
- </a>
174
+ </DropdownMenuItem>
174
175
  ))}
175
176
  </DropdownMenuContent>
176
177
  </DropdownMenu>
@@ -224,27 +225,26 @@ const openLinks = markdownUrl
224
225
  </div>
225
226
  </SectionContainer>
226
227
 
227
- <script is:inline define:vars={{ copyButtonId: copyButton?.id }}>
228
- const button = copyButtonId ? document.getElementById(copyButtonId) : null
228
+ <script>
229
+ document.addEventListener("click", async (event) => {
230
+ if (!(event.target instanceof Element)) return
231
+ const button = event.target.closest("[data-blocks-copy]")
232
+ if (!(button instanceof HTMLButtonElement)) return
229
233
 
230
- if (button instanceof HTMLButtonElement) {
231
- button.addEventListener("click", async () => {
232
- const source = button.dataset.source
234
+ const source = button.dataset.source
235
+ if (!source) return
233
236
 
234
- if (!source) return
237
+ try {
238
+ await navigator.clipboard.writeText(source)
239
+ button.querySelector(".blocks-copy-icon")?.classList.add("hidden")
240
+ button.querySelector(".blocks-check-icon")?.classList.remove("hidden")
235
241
 
236
- try {
237
- await navigator.clipboard.writeText(source)
238
- button.querySelector(".blocks-copy-icon")?.classList.add("hidden")
239
- button.querySelector(".blocks-check-icon")?.classList.remove("hidden")
240
-
241
- window.setTimeout(() => {
242
- button.querySelector(".blocks-copy-icon")?.classList.remove("hidden")
243
- button.querySelector(".blocks-check-icon")?.classList.add("hidden")
244
- }, 1200)
245
- } catch {
246
- // Ignore clipboard failures; the button remains available for retry.
247
- }
248
- })
249
- }
242
+ window.setTimeout(() => {
243
+ button.querySelector(".blocks-copy-icon")?.classList.remove("hidden")
244
+ button.querySelector(".blocks-check-icon")?.classList.add("hidden")
245
+ }, 1200)
246
+ } catch {
247
+ // Keep the copy state unchanged so the action can be retried.
248
+ }
249
+ })
250
250
  </script>
@@ -87,10 +87,11 @@ const formId = form.id ?? `contact-${crypto.randomUUID()}`
87
87
  </Button>
88
88
  ) : (
89
89
  <Button
90
+ as="span"
90
91
  variant="secondary"
91
92
  size="icon"
92
93
  class="text-primary"
93
- aria-label={item.title}
94
+ aria-hidden="true"
94
95
  >
95
96
  <Icon name={item.icon} />
96
97
  </Button>
@@ -142,10 +142,11 @@ const formId = form.id ?? `contact-${crypto.randomUUID()}`
142
142
  </Button>
143
143
  ) : (
144
144
  <Button
145
+ as="span"
145
146
  variant="secondary"
146
147
  size="icon"
147
148
  class="text-primary shrink-0"
148
- aria-label={item.title}
149
+ aria-hidden="true"
149
150
  >
150
151
  <Icon name={item.icon} />
151
152
  </Button>
@@ -91,10 +91,11 @@ const formId = form.id ?? `contact-${crypto.randomUUID()}`
91
91
  </Button>
92
92
  ) : (
93
93
  <Button
94
+ as="span"
94
95
  variant="secondary"
95
96
  size="icon"
96
97
  class="text-primary shrink-0"
97
- aria-label={item.title}
98
+ aria-hidden="true"
98
99
  >
99
100
  <Icon name={item.icon} />
100
101
  </Button>