mirror of
https://github.com/tabler/tabler.git
synced 2026-10-12 13:17:00 +04:00
68 lines
2.6 KiB
Plaintext
68 lines
2.6 KiB
Plaintext
---
|
|
// TODO: spinner param (needs Spinner.astro).
|
|
// TODO: provider param (unused in markup).
|
|
// TODO: color=false special case — pass no color prop instead.
|
|
import Icon from './Icon.astro'
|
|
|
|
/** core/scss/ui/_buttons.scss `.btn-{size}` modifier classes — 'md' is the default (no class emitted) */
|
|
type ButtonSize = 'sm' | 'md' | 'lg' | 'xl'
|
|
|
|
interface Props {
|
|
text?: string
|
|
href?: string
|
|
/** raw href + target="_blank" rel="noreferrer" */
|
|
external?: boolean
|
|
element?: 'a' | 'button'
|
|
type?: 'button' | 'reset' | 'submit'
|
|
id?: string
|
|
color?: string | undefined
|
|
outline?: boolean
|
|
ghost?: boolean
|
|
size?: ButtonSize | undefined
|
|
block?: boolean
|
|
disabled?: boolean
|
|
class?: string
|
|
icon?: string
|
|
iconColor?: string
|
|
iconEnd?: string
|
|
iconOnly?: boolean
|
|
/** data-bs-toggle="modal" data-bs-target="#modal-{modalId}" (modal-id param) */
|
|
modalId?: string
|
|
/** data-bs-toggle="toast" data-bs-target="#toast-{toastId}" (toast-id param) */
|
|
toastId?: string
|
|
/** data-bs-dismiss="modal" */
|
|
dismiss?: boolean
|
|
/** data-bs-toggle="dropdown" */
|
|
dropdown?: boolean
|
|
}
|
|
|
|
const { text = 'Button', href, external, element, type, id, color, outline, ghost, size, block, disabled, class: className, icon, iconColor, iconEnd, iconOnly, modalId, toastId, dismiss, dropdown } = Astro.props
|
|
|
|
// Actions (dropdown/modal/toast/dismiss) and bare buttons use <button>. Real URLs use <a>,
|
|
// with internal hrefs prefixed with '/'.
|
|
const isAction = Boolean(dropdown || modalId || toastId || dismiss)
|
|
const Element = element ?? (href && !isAction ? 'a' : 'button')
|
|
const resolvedHref = Element === 'a' ? (href ? (external ? href : `/${href}`) : undefined) : undefined
|
|
const resolvedType = Element === 'button' ? (type ?? 'button') : undefined
|
|
|
|
const classes = ['btn', color && `btn-${outline ? 'outline-' : ghost ? 'ghost-' : ''}${color}`, size && size !== 'md' && `btn-${size}`, className, block && 'w-100', iconOnly && 'btn-icon']
|
|
---
|
|
|
|
<Element
|
|
href={resolvedHref}
|
|
type={resolvedType}
|
|
id={id}
|
|
class:list={classes}
|
|
target={external ? '_blank' : undefined}
|
|
rel={external ? 'noreferrer' : undefined}
|
|
data-bs-toggle={dropdown ? 'dropdown' : modalId ? 'modal' : toastId ? 'toast' : undefined}
|
|
data-bs-target={!dropdown && modalId ? `#modal-${modalId}` : !dropdown && toastId ? `#toast-${toastId}` : undefined}
|
|
aria-label={iconOnly ? text : undefined}
|
|
data-bs-dismiss={dismiss ? 'modal' : undefined}
|
|
disabled={Element === 'button' && disabled ? true : undefined}
|
|
>
|
|
{icon && <Icon name={icon} color={iconColor} />}
|
|
{!iconOnly && text}
|
|
{!iconOnly && iconEnd && <Icon name={iconEnd} class="icon-end" />}
|
|
</Element>
|