Files
WRNexusJS/packages/ui/components/TextLink.wrn
Clintchiz 2c960fc1dc
Quality / quality (ubuntu-latest) (push) Failing after 9m49s
Quality / quality (windows-latest) (push) Canceled after 0s
refactor: migrate legacy wire namespace to wrn
2026-08-12 18:51:15 +05:30

129 lines
4.3 KiB
Plaintext

component TextLink {
outputs {
click(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object })
focus(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object })
blur(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object })
}
props {
label: string = "Learn more"
href: string = "#"
target: string = ""
rel: string = ""
external: boolean = false
icon: string = ""
iconPosition: string = "start"
showArrow: boolean = true
underline: boolean = false
size: string = "default"
color: string = "primary"
variant: string = "default"
disabled: boolean = false
class: string = ""
}
view {
<span
{...attrs}
data-ui-component="TextLink"
data-size='{size}'
data-color='{color}'
data-variant='{variant}'
class='wrn-text-link {class}'
>
{#if disabled}
<span
aria-disabled="true"
class="wrn-text-link__control"
data-size='{size}'
>
{#if icon && iconPosition === "start"}
<span class='{icon + " wrn-text-link__icon"}' aria-hidden="true"></span>
{/if}
<span>{label}</span>
</span>
{:else}
<a
href='{href}'
target='{target}'
rel='{external ? (rel || "noopener noreferrer") : rel}'
class="wrn-text-link__control"
data-size='{size}'
data-color='{color}'
data-variant='{variant}'
data-underline='{underline ? "true" : "false"}'
>
{#if icon && iconPosition === "start"}
<span class='{icon + " wrn-text-link__icon"}' aria-hidden="true"></span>
{/if}
<span>{label}</span>
{#if icon && iconPosition === "end"}
<span class='{icon + " wrn-text-link__icon"}' aria-hidden="true"></span>
{/if}
{#if external}
<span class="icon-[lucide--external-link] wrn-text-link__icon" aria-hidden="true"></span>
{:else if showArrow}
<span class="icon-[lucide--arrow-right] wrn-text-link__icon wrn-text-link__arrow" aria-hidden="true"></span>
{/if}
</a>
{/if}
</span>
}
style {
.wrn-text-link {
display: inline-flex;
min-width: 0;
}
.wrn-text-link__control {
display: inline-flex;
align-items: center;
gap: 0.5rem;
border-radius: var(--wrn-radius-sm);
color: var(--wrn-color-primary);
font-weight: 600;
outline: none;
transition: color var(--wrn-motion-base) var(--wrn-ease-standard);
}
span.wrn-text-link__control {
cursor: not-allowed;
opacity: 0.5;
}
.wrn-text-link__control[data-size="sm"],
.wrn-text-link__control[data-size="default"] { font-size: 0.875rem; }
.wrn-text-link__control[data-size="md"] { font-size: 1rem; }
.wrn-text-link__control[data-size="lg"] { font-size: 1.125rem; }
.wrn-text-link__control[data-color="secondary"] { color: var(--wrn-color-secondary); }
.wrn-text-link__control[data-color="success"] { color: var(--wrn-color-success); }
.wrn-text-link__control[data-color="warning"] { color: var(--wrn-color-warning-text); }
.wrn-text-link__control[data-color="danger"] { color: var(--wrn-color-danger); }
.wrn-text-link__control[data-color="info"] { color: var(--wrn-color-info); }
.wrn-text-link__control[data-color="neutral"] { color: var(--wrn-color-text); }
.wrn-text-link__control[data-color="primary"]:hover { color: var(--wrn-color-primary-hover); }
.wrn-text-link__control[data-underline="true"] {
text-decoration: underline;
text-underline-offset: 0.25rem;
}
.wrn-text-link__control[data-variant="button"] {
padding: 0.5rem 0.75rem;
border-radius: var(--wrn-radius);
}
.wrn-text-link__control[data-variant="button"][data-color="primary"] {
background: var(--wrn-color-primary-soft);
}
.wrn-text-link__control:focus-visible {
outline: 2px solid var(--wrn-color-focus);
outline-offset: 2px;
}
.wrn-text-link__icon { width: 1rem; height: 1rem; flex: none; }
.wrn-text-link__arrow { transition: transform var(--wrn-motion-base) var(--wrn-ease-standard); }
.wrn-text-link__control:hover .wrn-text-link__arrow { transform: translateX(0.25rem); }
}
}