| <script lang="ts"> |
| import { type IconName, type IconSize } from "@graphite/utility-functions/icons"; |
|
|
| import IconLabel from "@graphite/components/widgets/labels/IconLabel.svelte"; |
|
|
| export let icon: IconName; |
| export let hoverIcon: IconName | undefined = undefined; |
| export let size: IconSize; |
| export let disabled = false; |
| export let active = false; |
| export let tooltip: string | undefined = undefined; |
| |
| export let action: (e?: MouseEvent) => void; |
|
|
| let className = ""; |
| export { className as class }; |
| export let classes: Record<string, boolean> = {}; |
|
|
| $: extraClasses = Object.entries(classes) |
| .flatMap(([className, stateName]) => (stateName ? [className] : [])) |
| .join(" "); |
| </script> |
|
|
| <button |
| class={`icon-button size-${size} ${className} ${extraClasses}`.trim()} |
| class:hover-icon={hoverIcon && !disabled} |
| class:disabled |
| class:active |
| on:click={action} |
| {disabled} |
| title={tooltip} |
| tabindex={active ? -1 : 0} |
| {...$$restProps} |
| > |
| <IconLabel {icon} /> |
| {#if hoverIcon && !disabled} |
| <IconLabel icon={hoverIcon} /> |
| {/if} |
| </button> |
|
|
| <style lang="scss" global> |
| .icon-button { |
| display: flex; |
| justify-content: center; |
| align-items: center; |
| flex: 0 0 auto; |
| margin: 0; |
| padding: 0; |
| border: none; |
| border-radius: 2px; |
| background: none; |
| |
| svg { |
| fill: var(--color-e-nearwhite); |
| } |
| |
| // The `where` pseudo-class does not contribtue to specificity |
| & + :where(.icon-button) { |
| margin-left: 0; |
| } |
| |
| &:hover { |
| background: var(--color-5-dullgray); |
| } |
| |
| &.hover-icon { |
| &:not(:hover) .icon-label:nth-of-type(2) { |
| display: none; |
| } |
| |
| &:hover .icon-label:nth-of-type(1) { |
| display: none; |
| } |
| } |
| |
| &.disabled { |
| background: none; |
| |
| svg { |
| fill: var(--color-8-uppergray); |
| } |
| } |
| |
| &.active { |
| background: var(--color-e-nearwhite); |
| |
| svg { |
| fill: var(--color-2-mildblack); |
| } |
| } |
| |
| &.size-12 { |
| width: 12px; |
| height: 12px; |
| } |
| |
| &.size-16 { |
| width: 16px; |
| height: 16px; |
| } |
| |
| &.size-24 { |
| width: 24px; |
| height: 24px; |
| } |
| |
| &.size-32 { |
| width: 32px; |
| height: 32px; |
| } |
| } |
| </style> |
|
|