component LegendIndicator { outputs { toggle(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object }) select(payload: { value?: string | number | boolean | null; values?: Array; sourceEvent?: Event; [key: string]: string | number | boolean | null | object } | string | number | boolean | null) } props { size: string = "default" color: string = "primary" title: string = "Legend Indicator" description: string = "" items: unknown[] = [] variant: string = "default" class: string = "" } state hiddenItems = [] functions { client function toggleItem(item, index, sourceEvent) { hiddenItems = hiddenItems.includes(index) ? hiddenItems.filter(function (value) { return value !== index }) : hiddenItems.concat(index) output.toggle({ item: item, index: index, hidden: hiddenItems.includes(index), sourceEvent: sourceEvent }) output.select({ value: item.value || item.label, sourceEvent: sourceEvent }) } } view {
{#if title}{title}{/if} {#if description}

{description}

{/if}
{#each items as item, index}{/each}
} style { .wrn-legend { display:grid; gap:.65rem; } .wrn-legend p { margin:0; color:var(--wrn-color-muted); } .wrn-legend__items { display:flex; flex-wrap:wrap; gap:.75rem; } .wrn-legend button { display: flex; align-items: center; gap: .45rem; padding: 0.25rem 0.5rem; border: 1px solid transparent; border-radius: 999px; background: transparent; color: var(--wrn-color-text); font: inherit; font-size: .8125rem; font-weight: 550; cursor: pointer; transition: background-color 120ms ease, opacity 120ms ease; } .wrn-legend i { width: .625rem; height: .625rem; border-radius: 3px; box-shadow: inset 0 0 0 1px rgb(0 0 0 / 0.1); } .wrn-legend button[aria-pressed="false"] { opacity:.45; text-decoration:line-through; } .wrn-next--legend-indicator { display: grid; gap: 0.75rem; padding: 1rem; border: 1px solid var(--wrn-color-border); border-radius: var(--wrn-radius); color: var(--wrn-color-text); background: var(--wrn-color-surface); box-shadow: var(--wrn-shadow-1); } .wrn-next--legend-indicator > p { margin: 0; color: var(--wrn-color-muted); } .wrn-next--legend-indicator > .wrn-next__items { display: flex; flex-wrap: wrap; gap: 0.5rem; } .wrn-next--legend-indicator > .wrn-next__items > span { padding: 0.35rem 0.6rem; border-radius: var(--wrn-radius-sm); background: var(--wrn-color-surface-2); } /* Shared component foundation. */ .wrn-component { --wrn-component-color: var(--wrn-color-primary); --wrn-component-scale: 1; margin: 0; color: var(--wrn-color-text); font-family: var(--wrn-font-sans, inherit); } .wrn-component--color-primary { --wrn-component-color: var(--wrn-color-primary); } .wrn-component--color-secondary { --wrn-component-color: var(--wrn-color-secondary); } .wrn-component--color-success { --wrn-component-color: var(--wrn-color-success); } .wrn-component--color-warning { --wrn-component-color: var(--wrn-color-warning); } .wrn-component--color-danger { --wrn-component-color: var(--wrn-color-danger); } .wrn-component--color-info { --wrn-component-color: var(--wrn-color-info); } .wrn-component--size-xs { --wrn-component-scale: 0.78; } .wrn-component--size-sm { --wrn-component-scale: 0.88; } .wrn-component--size-default, .wrn-component--size-md { --wrn-component-scale: 1; } .wrn-component--size-lg { --wrn-component-scale: 1.14; } .wrn-component--size-xl { --wrn-component-scale: 1.28; } .wrn-component:not(.wrn-btn) { font-size: calc(1em * var(--wrn-component-scale)); } .wrn-component :is(a, button, input, select, textarea):focus-visible { outline-color: var(--wrn-component-color); } .wrn-component p { margin: 0; color: var(--wrn-color-text-muted, var(--wrn-color-muted)); line-height: 1.6; } } }