Release 2025-05-25-ELtG
This commit is contained in:
@@ -2,13 +2,15 @@
|
||||
import { Icon } from 'astro-icon/components'
|
||||
import { tv, type VariantProps } from 'tailwind-variants'
|
||||
|
||||
import { cn } from '../lib/cn'
|
||||
|
||||
import type { HTMLAttributes, Polymorphic } from 'astro/types'
|
||||
|
||||
type Props<Tag extends 'a' | 'button' | 'label' = 'button'> = Polymorphic<
|
||||
Required<Pick<HTMLAttributes<'label'>, Tag extends 'label' ? 'for' : never>> &
|
||||
VariantProps<typeof button> & {
|
||||
as: Tag
|
||||
label?: string
|
||||
label: string
|
||||
icon?: string
|
||||
endIcon?: string
|
||||
classNames?: {
|
||||
@@ -55,6 +57,7 @@ const button = tv({
|
||||
iconOnly: {
|
||||
true: {
|
||||
base: 'p-0',
|
||||
label: 'sr-only',
|
||||
},
|
||||
},
|
||||
color: {
|
||||
@@ -137,49 +140,49 @@ const button = tv({
|
||||
color: 'black',
|
||||
variant: 'faded',
|
||||
class: {
|
||||
base: 'border-night-300/30 bg-night-800/30 hover:bg-night-700/50 text-white/70 hover:text-white/90 focus-visible:ring-white/50',
|
||||
base: 'bg2night-800/15 hover:bg-night-700/30 border-current/30 text-white/70 hover:text-white/90 focus-visible:ring-white/50',
|
||||
},
|
||||
},
|
||||
{
|
||||
color: 'white',
|
||||
variant: 'faded',
|
||||
class: {
|
||||
base: 'border-day-300/30 bg-day-100/30 hover:bg-day-200/50 text-white/70 hover:text-white/90 focus-visible:ring-white/50',
|
||||
base: 'b2-day-100/15 hover:bg-day-200/30 border-current/30 text-white/70 hover:text-white/90 focus-visible:ring-white/50',
|
||||
},
|
||||
},
|
||||
{
|
||||
color: 'gray',
|
||||
variant: 'faded',
|
||||
class: {
|
||||
base: 'border-day-500/30 bg-day-400/30 hover:bg-day-500/50 text-day-300 hover:text-day-100 focus-visible:ring-white/50',
|
||||
base: 'b2-day-400/15 hover:bg-day-500/30 text-day-300 hover:text-day-100 border-current/30 focus-visible:ring-white/50',
|
||||
},
|
||||
},
|
||||
{
|
||||
color: 'success',
|
||||
variant: 'faded',
|
||||
class: {
|
||||
base: 'border-green-600/30 bg-green-500/30 text-green-300 hover:bg-green-500/50 hover:text-green-100',
|
||||
base: 'border-current/20 bg-green-500/15 text-green-300 hover:bg-green-500/30 hover:text-green-100',
|
||||
},
|
||||
},
|
||||
{
|
||||
color: 'danger',
|
||||
variant: 'faded',
|
||||
class: {
|
||||
base: 'border-red-600/30 bg-red-500/30 text-red-300 hover:bg-red-500/50 hover:text-red-100',
|
||||
base: 'border-current/20 bg-red-500/15 text-red-300 hover:bg-red-500/30 hover:text-red-100',
|
||||
},
|
||||
},
|
||||
{
|
||||
color: 'warning',
|
||||
variant: 'faded',
|
||||
class: {
|
||||
base: 'border-yellow-600/30 bg-yellow-500/30 text-yellow-300 hover:bg-yellow-500/50 hover:text-yellow-100',
|
||||
base: 'border-current/20 bg-yellow-500/15 text-yellow-300 hover:bg-yellow-500/30 hover:text-yellow-100',
|
||||
},
|
||||
},
|
||||
{
|
||||
color: 'info',
|
||||
variant: 'faded',
|
||||
class: {
|
||||
base: 'border-blue-600/30 bg-blue-500/30 text-blue-300 hover:bg-blue-500/50 hover:text-blue-100',
|
||||
base: 'border-current/20 bg-blue-500/15 text-blue-300 hover:bg-blue-500/30 hover:text-blue-100',
|
||||
},
|
||||
},
|
||||
// Shadow variants
|
||||
@@ -260,6 +263,7 @@ const {
|
||||
dataAstroReload,
|
||||
disabled,
|
||||
inlineIcon,
|
||||
iconOnly,
|
||||
...htmlProps
|
||||
} = Astro.props
|
||||
|
||||
@@ -268,13 +272,20 @@ const {
|
||||
icon: iconSlot,
|
||||
label: labelSlot,
|
||||
endIcon: endIconSlot,
|
||||
} = button({ size, color, variant, shadow, disabled, iconOnly: !label && !(!!icon && !!endIcon) })
|
||||
} = button({
|
||||
size,
|
||||
color,
|
||||
variant,
|
||||
shadow,
|
||||
disabled,
|
||||
iconOnly: iconOnly ?? (!label && !(!!icon && !!endIcon)),
|
||||
})
|
||||
|
||||
const ActualTag = disabled && Tag === 'a' ? 'span' : Tag
|
||||
---
|
||||
|
||||
<ActualTag
|
||||
class={base({ class: className })}
|
||||
class={base({ class: cn({ 'opacity-20 hover:opacity-50': disabled }, className) })}
|
||||
role={role ??
|
||||
(ActualTag === 'button' || ActualTag === 'label' || ActualTag === 'span' ? undefined : 'button')}
|
||||
aria-disabled={disabled}
|
||||
@@ -282,7 +293,7 @@ const ActualTag = disabled && Tag === 'a' ? 'span' : Tag
|
||||
{...htmlProps}
|
||||
>
|
||||
{!!icon && <Icon name={icon} class={iconSlot({ class: classNames?.icon })} is:inline={inlineIcon} />}
|
||||
{!!label && <span class={labelSlot({ class: classNames?.label })}>{label}</span>}
|
||||
<span class={labelSlot({ class: classNames?.label })}>{label}</span>
|
||||
{
|
||||
!!endIcon && (
|
||||
<Icon name={endIcon} class={endIconSlot({ class: classNames?.endIcon })} is:inline={inlineIcon}>
|
||||
|
||||
@@ -52,7 +52,7 @@ const { class: className, ...htmlProps } = Astro.props
|
||||
href={href}
|
||||
target={external ? '_blank' : undefined}
|
||||
rel={external ? 'noopener noreferrer' : undefined}
|
||||
class="text-day-500 dark:text-day-400 dark:hover:text-day-300 flex items-center gap-1 text-sm transition-colors hover:text-gray-700"
|
||||
class="text-day-500 flex items-center gap-1 text-sm transition-colors hover:text-gray-200 hover:underline"
|
||||
>
|
||||
<Icon name={icon} class="h-4 w-4" />
|
||||
{label}
|
||||
|
||||
@@ -40,6 +40,7 @@ const {
|
||||
hx-select={`#${searchResultsId}`}
|
||||
hx-push-url="true"
|
||||
hx-indicator="#search-indicator"
|
||||
hx-swap="outerHTML"
|
||||
data-services-filters-form
|
||||
data-default-verification-filter={options.verification
|
||||
.filter((verification) => verification.default)
|
||||
@@ -107,7 +108,7 @@ const {
|
||||
{
|
||||
options.categories?.map((category) => (
|
||||
<li data-show-always={category.showAlways ? '' : undefined}>
|
||||
<label class="flex cursor-pointer items-center space-x-2 text-sm text-white">
|
||||
<label class="flex cursor-pointer items-center gap-2 text-sm text-white">
|
||||
<input
|
||||
type="checkbox"
|
||||
class="peer text-green-500"
|
||||
@@ -116,6 +117,7 @@ const {
|
||||
checked={category.checked}
|
||||
data-trigger-on-change
|
||||
/>
|
||||
<Icon name={category.icon} class="size-4" />
|
||||
<span class="peer-checked:font-bold">
|
||||
{category.name}
|
||||
<span class="text-day-500 font-normal">{category._count.services}</span>
|
||||
|
||||
@@ -205,6 +205,13 @@ const urlIfIncludingCommunity = urlWithParams(Astro.url, {
|
||||
inlineIcon={inlineIcons}
|
||||
/>
|
||||
)}
|
||||
<Button
|
||||
as="a"
|
||||
href="/service-suggestion/new"
|
||||
label="Add service"
|
||||
icon="ri:add-line"
|
||||
inlineIcon={inlineIcons}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
) : (
|
||||
@@ -241,14 +248,18 @@ const urlIfIncludingCommunity = urlWithParams(Astro.url, {
|
||||
</>
|
||||
)
|
||||
}
|
||||
<div class="mt-4 text-center">
|
||||
<Button
|
||||
as="a"
|
||||
href="/service-suggestion/new"
|
||||
label="Add service"
|
||||
icon="ri:add-line"
|
||||
inlineIcon={inlineIcons}
|
||||
class="mx-auto"
|
||||
/>
|
||||
</div>
|
||||
{
|
||||
services && services.length > 0 && (
|
||||
<div class="mt-4 text-center">
|
||||
<Button
|
||||
as="a"
|
||||
href="/service-suggestion/new"
|
||||
label="Add service"
|
||||
icon="ri:add-line"
|
||||
inlineIcon={inlineIcons}
|
||||
class="mx-auto"
|
||||
/>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user