package navigation
import (
"fmt"
// CHANGE TO WHATEVER DIRECTORY HAS YOUR TEMPLUI UTILS FOLDER
"blog/web/utils"
)
type Variant string
type Size string
const(
VariantDefault Variant = "default"
VariantOutline Variant = "outline"
VariantSecondary Variant = "secondary"
VariantGhost Variant = "ghost"
)
const(
SizeDefault Size = "default"
SizeSm Size = "sm"
SizeLg Size = "lg"
SizeIcon Size = "icon"
)
type Props struct {
ID string
Class string
Columns int
Attributes templ.Attributes
Variant Variant
Size Size
}
templ Navigation(props ...Props) {
{{ var p Props }}
{{ var cols string }}
if len(props) > 0 {
{{ p = props[0] }}
}
if p.Columns == 0 {
{{ cols = "grid-cols-1"}}
} else {
{{ cols = fmt.Sprintf("grid-cols-%d", p.Columns) }}
}
}
func (p Props) variantClasses() string {
switch p.Variant {
case VariantGhost:
return "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent"
case VariantOutline:
return "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50"
case VariantSecondary:
return "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80"
default:
return "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90"
}
}
func (b Props) sizeClasses() string {
switch b.Size {
case SizeSm:
return "h-8 rounded-full aspect-square gap-1.5 px-3 has-[>svg]:px-2.5"
case SizeLg:
return "h-10 rounded-full aspect-square px-6 has-[>svg]:px-4"
case SizeIcon:
return "size-9"
default: // SizeDefault
return "h-9 px-4 py-2 has-[>svg]:px-3"
}
}
// Theme change script
templ Script() {
}