refactor(ui): replace Tailwind utilities with local styles
This commit is contained in:
@@ -29,18 +29,16 @@ label: string = "Learn more"
|
||||
data-size='{size}'
|
||||
data-color='{color}'
|
||||
data-variant='{variant}'
|
||||
class='inline-flex min-w-0 {class}'
|
||||
class='wire-text-link {class}'
|
||||
>
|
||||
{#if disabled}
|
||||
<span
|
||||
aria-disabled="true"
|
||||
class="inline-flex cursor-not-allowed items-center gap-2 font-semibold opacity-50"
|
||||
class:text-sm='size === "sm" || size === "default"'
|
||||
class:text-base='size === "md"'
|
||||
class:text-lg='size === "lg"'
|
||||
class="wire-text-link__control"
|
||||
data-size='{size}'
|
||||
>
|
||||
{#if icon && iconPosition === "start"}
|
||||
<span class='{icon + " size-4 shrink-0"}' aria-hidden="true"></span>
|
||||
<span class='{icon + " wire-text-link__icon"}' aria-hidden="true"></span>
|
||||
{/if}
|
||||
<span>{label}</span>
|
||||
</span>
|
||||
@@ -49,42 +47,82 @@ label: string = "Learn more"
|
||||
href='{href}'
|
||||
target='{target}'
|
||||
rel='{external ? (rel || "noopener noreferrer") : rel}'
|
||||
class="group inline-flex items-center gap-2 rounded-md font-semibold outline-none transition focus-visible:ring-2 focus-visible:ring-[var(--wire-color-focus)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--wire-color-background)]"
|
||||
class:text-sm='size === "sm" || size === "default"'
|
||||
class:text-base='size === "md"'
|
||||
class:text-lg='size === "lg"'
|
||||
class:text-[var(--wire-color-primary)]='color === "primary"'
|
||||
class:hover:text-[var(--wire-color-primary-hover)]='color === "primary"'
|
||||
class:text-[var(--wire-color-secondary)]='color === "secondary"'
|
||||
class:text-[var(--wire-color-success)]='color === "success"'
|
||||
class:text-[var(--wire-color-warning-text)]='color === "warning"'
|
||||
class:text-[var(--wire-color-danger)]='color === "danger"'
|
||||
class:text-[var(--wire-color-info)]='color === "info"'
|
||||
class:text-[var(--wire-color-text)]='color === "neutral"'
|
||||
class:underline='underline'
|
||||
class:underline-offset-4='underline'
|
||||
class:rounded-lg='variant === "button"'
|
||||
class:bg-[var(--wire-color-primary-soft)]='variant === "button" && color === "primary"'
|
||||
class:px-3='variant === "button"'
|
||||
class:py-2='variant === "button"'
|
||||
class="wire-text-link__control"
|
||||
data-size='{size}'
|
||||
data-color='{color}'
|
||||
data-variant='{variant}'
|
||||
data-underline='{underline ? "true" : "false"}'
|
||||
>
|
||||
{#if icon && iconPosition === "start"}
|
||||
<span class='{icon + " size-4 shrink-0"}' aria-hidden="true"></span>
|
||||
<span class='{icon + " wire-text-link__icon"}' aria-hidden="true"></span>
|
||||
{/if}
|
||||
|
||||
<span>{label}</span>
|
||||
|
||||
{#if icon && iconPosition === "end"}
|
||||
<span class='{icon + " size-4 shrink-0"}' aria-hidden="true"></span>
|
||||
<span class='{icon + " wire-text-link__icon"}' aria-hidden="true"></span>
|
||||
{/if}
|
||||
|
||||
{#if external}
|
||||
<span class="icon-[lucide--external-link] size-4 shrink-0" aria-hidden="true"></span>
|
||||
<span class="icon-[lucide--external-link] wire-text-link__icon" aria-hidden="true"></span>
|
||||
{:else if showArrow}
|
||||
<span class="icon-[lucide--arrow-right] size-4 shrink-0 transition-transform group-hover:translate-x-1" aria-hidden="true"></span>
|
||||
<span class="icon-[lucide--arrow-right] wire-text-link__icon wire-text-link__arrow" aria-hidden="true"></span>
|
||||
{/if}
|
||||
</a>
|
||||
{/if}
|
||||
</span>
|
||||
}
|
||||
|
||||
style {
|
||||
.wire-text-link {
|
||||
display: inline-flex;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.wire-text-link__control {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
border-radius: var(--wire-radius-sm);
|
||||
color: var(--wire-color-primary);
|
||||
font-weight: 600;
|
||||
outline: none;
|
||||
transition: color var(--wire-motion-base) var(--wire-ease-standard);
|
||||
}
|
||||
|
||||
span.wire-text-link__control {
|
||||
cursor: not-allowed;
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.wire-text-link__control[data-size="sm"],
|
||||
.wire-text-link__control[data-size="default"] { font-size: 0.875rem; }
|
||||
.wire-text-link__control[data-size="md"] { font-size: 1rem; }
|
||||
.wire-text-link__control[data-size="lg"] { font-size: 1.125rem; }
|
||||
.wire-text-link__control[data-color="secondary"] { color: var(--wire-color-secondary); }
|
||||
.wire-text-link__control[data-color="success"] { color: var(--wire-color-success); }
|
||||
.wire-text-link__control[data-color="warning"] { color: var(--wire-color-warning-text); }
|
||||
.wire-text-link__control[data-color="danger"] { color: var(--wire-color-danger); }
|
||||
.wire-text-link__control[data-color="info"] { color: var(--wire-color-info); }
|
||||
.wire-text-link__control[data-color="neutral"] { color: var(--wire-color-text); }
|
||||
.wire-text-link__control[data-color="primary"]:hover { color: var(--wire-color-primary-hover); }
|
||||
.wire-text-link__control[data-underline="true"] {
|
||||
text-decoration: underline;
|
||||
text-underline-offset: 0.25rem;
|
||||
}
|
||||
.wire-text-link__control[data-variant="button"] {
|
||||
padding: 0.5rem 0.75rem;
|
||||
border-radius: var(--wire-radius);
|
||||
}
|
||||
.wire-text-link__control[data-variant="button"][data-color="primary"] {
|
||||
background: var(--wire-color-primary-soft);
|
||||
}
|
||||
.wire-text-link__control:focus-visible {
|
||||
outline: 2px solid var(--wire-color-focus);
|
||||
outline-offset: 2px;
|
||||
}
|
||||
.wire-text-link__icon { width: 1rem; height: 1rem; flex: none; }
|
||||
.wire-text-link__arrow { transition: transform var(--wire-motion-base) var(--wire-ease-standard); }
|
||||
.wire-text-link__control:hover .wire-text-link__arrow { transform: translateX(0.25rem); }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user