|
15 | 15 |
|
16 | 16 | export let leadingicon: GoAIconType | null = null; |
17 | 17 | export let trailingicon: GoAIconType | null = null; |
18 | | - export let color: "interactive" | "light" = "interactive"; |
| 18 | + export let color: "interactive" | "dark" | "light" = "interactive"; |
| 19 | + export let size: "xsmall" | "small" | "medium" | "large" = "medium"; |
19 | 20 |
|
20 | 21 | export let action: string = ""; |
21 | 22 | export let actionArg: string = ""; |
|
30 | 31 |
|
31 | 32 | let _rootEl: HTMLElement; |
32 | 33 |
|
| 34 | + $: _iconSize = { |
| 35 | + xsmall: "2xsmall", // 12px |
| 36 | + small: "xsmall", // 16px |
| 37 | + medium: "small", // 18px |
| 38 | + large: "medium", // 20px |
| 39 | + }[size]; |
| 40 | +
|
33 | 41 | onMount(() => { |
34 | 42 | if (action) { |
35 | 43 | _rootEl.addEventListener("click", handleClick); |
|
45 | 53 | <div |
46 | 54 | class="link" |
47 | 55 | class:interactive={color === "interactive"} |
| 56 | + class:dark={color === "dark"} |
48 | 57 | class:light={color === "light"} |
| 58 | + class:xsmall={size === "xsmall"} |
| 59 | + class:small={size === "small"} |
| 60 | + class:medium={size === "medium"} |
| 61 | + class:large={size === "large"} |
49 | 62 | bind:this={_rootEl} |
50 | 63 | style={styles(calculateMargin(mt, mr, mb, ml))} |
51 | 64 | data-testid={testid} |
52 | 65 | > |
53 | | - {#if leadingicon}<goa-icon data-testid="leading-icon" type={leadingicon} />{/if} |
| 66 | + {#if leadingicon}<goa-icon data-testid="leading-icon" type={leadingicon} size={_iconSize} />{/if} |
54 | 67 | <slot /> |
55 | | - {#if trailingicon}<goa-icon data-testid="trailing-icon" type={trailingicon} />{/if} |
| 68 | + {#if trailingicon}<goa-icon data-testid="trailing-icon" type={trailingicon} size={_iconSize} />{/if} |
56 | 69 | </div> |
57 | 70 |
|
58 | 71 | <style> |
59 | | - :global(::slotted(a)) { |
60 | | - color: var(--goa-color-interactive-default); |
61 | | - } |
62 | | -
|
| 72 | + /* Base link styles */ |
63 | 73 | .link { |
64 | 74 | display: inline-flex; |
65 | 75 | align-items: center; |
66 | 76 | padding: 0; |
67 | 77 | border: none; |
68 | 78 | background: none; |
69 | 79 | cursor: pointer; |
70 | | - font: var(--goa-typography-body-m); |
71 | 80 | text-decoration: underline; |
72 | | - gap: 8px; |
| 81 | + /* V1: Default gap fallback (4px) */ |
| 82 | + gap: var(--goa-link-gap, 0.25rem); |
| 83 | + /* V2: Size-specific gaps override below */ |
| 84 | + } |
| 85 | +
|
| 86 | + /* Size variants - Typography and Gap */ |
| 87 | + .link.xsmall { |
| 88 | + font: var(--goa-link-typography-xsmall); |
| 89 | + gap: var(--goa-link-gap-xsmall, 0.125rem); |
| 90 | + } |
| 91 | +
|
| 92 | + .link.small { |
| 93 | + font: var(--goa-link-typography-small); |
| 94 | + gap: var(--goa-link-gap-small, 0.1875rem); |
| 95 | + } |
| 96 | +
|
| 97 | + .link.medium { |
| 98 | + font: var(--goa-link-typography-medium); |
| 99 | + gap: var(--goa-link-gap-medium, 0.25rem); |
73 | 100 | } |
74 | 101 |
|
| 102 | + .link.large { |
| 103 | + font: var(--goa-link-typography-large); |
| 104 | + gap: var(--goa-link-gap-large, 0.3125rem); |
| 105 | + } |
| 106 | +
|
| 107 | + /* Color variant: Interactive (Blue) */ |
75 | 108 | .link.interactive { |
76 | | - color: var(--goa-color-interactive-default); |
| 109 | + color: var(--goa-link-color-interactive-default, var(--goa-color-interactive-default)); |
77 | 110 | } |
| 111 | +
|
| 112 | + .link.interactive :global(::slotted(a)) { |
| 113 | + color: var(--goa-link-color-interactive-default, var(--goa-color-interactive-default)) !important; |
| 114 | + } |
| 115 | +
|
78 | 116 | .link.interactive:hover { |
79 | | - color: var(--goa-color-interactive-hover); |
| 117 | + color: var(--goa-link-color-interactive-hover, var(--goa-color-interactive-hover)); |
| 118 | + } |
| 119 | +
|
| 120 | + .link.interactive:hover :global(::slotted(a)) { |
| 121 | + color: var(--goa-link-color-interactive-hover, var(--goa-color-interactive-hover)) !important; |
| 122 | + } |
| 123 | +
|
| 124 | + .link.interactive :global(::slotted(a:visited)) { |
| 125 | + color: var(--goa-link-color-interactive-visited, var(--goa-color-interactive-visited)) !important; |
80 | 126 | } |
81 | 127 |
|
| 128 | + .link.interactive:has(:global(::slotted(a:visited))) { |
| 129 | + color: var(--goa-link-color-interactive-visited, var(--goa-color-interactive-visited)); |
| 130 | + } |
| 131 | +
|
| 132 | + /* Color variant: Dark (Black) */ |
| 133 | + .link.dark { |
| 134 | + color: var(--goa-link-color-dark-default, var(--goa-color-greyscale-black)); |
| 135 | + } |
| 136 | +
|
| 137 | + .link.dark :global(::slotted(a)) { |
| 138 | + color: var(--goa-link-color-dark-default, var(--goa-color-greyscale-black)) !important; |
| 139 | + } |
| 140 | +
|
| 141 | + .link.dark:hover { |
| 142 | + color: var(--goa-link-color-dark-hover, var(--goa-color-greyscale-700)); |
| 143 | + } |
| 144 | +
|
| 145 | + .link.dark:hover :global(::slotted(a)) { |
| 146 | + color: var(--goa-link-color-dark-hover, var(--goa-color-greyscale-700)) !important; |
| 147 | + } |
| 148 | +
|
| 149 | + .link.dark :global(::slotted(a:visited)) { |
| 150 | + color: var(--goa-link-color-dark-visited, var(--goa-color-interactive-visited)) !important; |
| 151 | + } |
| 152 | +
|
| 153 | + .link.dark:has(:global(::slotted(a:visited))) { |
| 154 | + color: var(--goa-link-color-dark-visited, var(--goa-color-interactive-visited)); |
| 155 | + } |
| 156 | +
|
| 157 | + /* Color variant: Light (White) */ |
82 | 158 | .link.light { |
83 | | - color: var(--goa-color-text-light); |
| 159 | + color: var(--goa-link-color-light-default, var(--goa-color-text-light)); |
| 160 | + } |
| 161 | +
|
| 162 | + .link.light :global(::slotted(a)) { |
| 163 | + color: var(--goa-link-color-light-default, var(--goa-color-text-light)) !important; |
84 | 164 | } |
| 165 | +
|
85 | 166 | .link.light:hover { |
86 | | - color: var(--goa-color-text-light); |
| 167 | + color: var(--goa-link-color-light-hover, var(--goa-color-greyscale-200)); |
| 168 | + } |
| 169 | +
|
| 170 | + .link.light:hover :global(::slotted(a)) { |
| 171 | + color: var(--goa-link-color-light-hover, var(--goa-color-greyscale-200)) !important; |
| 172 | + } |
| 173 | +
|
| 174 | + .link.light :global(::slotted(a:visited)) { |
| 175 | + color: var(--goa-link-color-light-visited, #9D8EBB) !important; |
| 176 | + } |
| 177 | +
|
| 178 | + .link.light:has(:global(::slotted(a:visited))) { |
| 179 | + color: var(--goa-link-color-light-visited, #9D8EBB); |
| 180 | + } |
| 181 | +
|
| 182 | + /* Focus */ |
| 183 | + .link:focus-within { |
| 184 | + border-radius: var(--goa-link-border-radius-focus, var(--goa-border-radius-s)); |
| 185 | + outline: var(--goa-link-border-focus, var(--goa-border-width-l) solid var(--goa-color-interactive-focus)); |
| 186 | + outline-offset: var(--goa-link-focus-offset, var(--goa-space-3xs)); |
| 187 | + } |
| 188 | +
|
| 189 | + .link :global(::slotted(a:focus-visible)) { |
| 190 | + outline: none; |
87 | 191 | } |
88 | 192 | </style> |
0 commit comments