diff --git a/.gitignore b/.gitignore index f20655a9ea..7f2f621c98 100644 --- a/.gitignore +++ b/.gitignore @@ -28,4 +28,4 @@ go.work.sum .claude/* !.claude/skills/ .sisyphus/* -.omc \ No newline at end of file +.omc diff --git a/src/lib/components/deployments/deployment-table-row.svelte b/src/lib/components/deployments/deployment-table-row.svelte index d090057bb8..fed7d2c5a7 100644 --- a/src/lib/components/deployments/deployment-table-row.svelte +++ b/src/lib/components/deployments/deployment-table-row.svelte @@ -47,7 +47,7 @@ {#each columns as { label } (label)} - {#if label === translate('deployments.name')} + {#if label === translate('deployments.deployment')} e.billableActions + acc, 0).toString(), + $fullEventHistory + .reduce((acc, e) => (e?.billableActions ?? 0) + acc, 0) + .toString(), ); - const workflowCompletedTasks = $derived( - $fullEventHistory.filter(isWorkflowTaskCompletedEvent), - ); - - const { sdk, version: sdkVersion } = $derived( - getSDKandVersion(workflowCompletedTasks), - ); + const { sdk, version: sdkVersion } = $derived($sdkInfo); const fetchLatestRun = async () => { const result = await fetchWorkflow({ @@ -173,18 +167,20 @@ href={routeForWorkflowsWithQuery({ namespace, query: `WorkflowType="${workflow?.name}"`, - })} + }) ?? ''} iconName="filter" /> - {translate('common.task-queue')} - + {#if workflow?.taskQueue} + {translate('common.task-queue')} + + {/if} {#if workflow?.priority} {@const { priorityKey, fairnessKey } = workflow.priority} @@ -221,11 +217,11 @@ copyableText={versioningBuildId} text={versioningBuildId} href={deploymentVersion - ? routeForWorkflowsWithQuery({ + ? (routeForWorkflowsWithQuery({ namespace, query: `TemporalWorkerDeploymentVersion="${deploymentVersion}"`, - }) - : undefined} + }) ?? '') + : ''} iconName={deploymentVersion ? 'filter' : undefined} /> {/if} @@ -241,7 +237,7 @@ href={routeForWorkflowsWithQuery({ namespace, query: `TemporalWorkflowVersioningBehavior="${versioningBehavior}"`, - })} + }) ?? ''} iconName="filter" /> {/if} @@ -259,15 +255,15 @@ })} /> {/if} - {#if parent} + {#if parent?.workflowId && parent?.runId} {translate('workflows.parent-workflow')} {/if} @@ -312,7 +308,7 @@ {/if} {#if sdk && sdkVersion} - SDK + {translate('workflows.sdk')} diff --git a/src/lib/components/shared-search-attribute-filter/filter-bar.svelte b/src/lib/components/shared-search-attribute-filter/filter-bar.svelte new file mode 100644 index 0000000000..58a219142b --- /dev/null +++ b/src/lib/components/shared-search-attribute-filter/filter-bar.svelte @@ -0,0 +1,72 @@ + + +
+
+
+ + +
+
+ +
+
+ {#if viewManualQuery} + + {/if} +
diff --git a/src/lib/components/shared-search-attribute-filter/filter-list.svelte b/src/lib/components/shared-search-attribute-filter/filter-list.svelte new file mode 100644 index 0000000000..e36bbb5a70 --- /dev/null +++ b/src/lib/components/shared-search-attribute-filter/filter-list.svelte @@ -0,0 +1,131 @@ + + +{#if visibleFilters.length > 0} +
+ {#each visibleFilters as filterItem, i (filterItem.id)} + {#if statusAttribute && isStatusFilter(filterItem) && i === firstExecutionStatusIndex} + + updateStatusFilters(i, updatedStatusFilters)} + /> + {:else if !isStatusFilter(filterItem) && filterItem.attribute} + updateFilter(i, updatedFilter)} + onRemove={() => removeFilter(i)} + /> + {/if} + {/each} + + {#if hasMoreFilters} + + {/if} +
+{/if} diff --git a/src/lib/components/standalone-activities/activities-summary-filter-bar/filter.svelte b/src/lib/components/shared-search-attribute-filter/filter.svelte similarity index 52% rename from src/lib/components/standalone-activities/activities-summary-filter-bar/filter.svelte rename to src/lib/components/shared-search-attribute-filter/filter.svelte index 2b85cb82d4..12030b21be 100644 --- a/src/lib/components/standalone-activities/activities-summary-filter-bar/filter.svelte +++ b/src/lib/components/shared-search-attribute-filter/filter.svelte @@ -1,29 +1,53 @@
- - + +
diff --git a/src/lib/components/standalone-activities/activities-summary-filter-bar/manual-query.svelte b/src/lib/components/shared-search-attribute-filter/manual-query.svelte similarity index 68% rename from src/lib/components/standalone-activities/activities-summary-filter-bar/manual-query.svelte rename to src/lib/components/shared-search-attribute-filter/manual-query.svelte index 1221aa6f23..fb52eae196 100644 --- a/src/lib/components/standalone-activities/activities-summary-filter-bar/manual-query.svelte +++ b/src/lib/components/shared-search-attribute-filter/manual-query.svelte @@ -1,4 +1,5 @@
-
-{/if} diff --git a/src/lib/components/standalone-activities/activities-summary-filter-bar/filter-bar.svelte b/src/lib/components/standalone-activities/activities-summary-filter-bar/filter-bar.svelte index d46b7a3e58..bc964c9fc1 100644 --- a/src/lib/components/standalone-activities/activities-summary-filter-bar/filter-bar.svelte +++ b/src/lib/components/standalone-activities/activities-summary-filter-bar/filter-bar.svelte @@ -1,40 +1,20 @@ -{#snippet actionToggleButtons()} -
- -
-{/snippet} - -
-
-
- - -
- {@render actionToggleButtons()} -
- {#if viewManualQuery} - - {/if} -
+ diff --git a/src/lib/components/standalone-activities/activity-header.svelte b/src/lib/components/standalone-activities/activity-header.svelte index 7bfdb40bb1..9667fbdcef 100644 --- a/src/lib/components/standalone-activities/activity-header.svelte +++ b/src/lib/components/standalone-activities/activity-header.svelte @@ -2,10 +2,7 @@ import Copyable from '$lib/holocene/copyable/index.svelte'; import { translate } from '$lib/i18n/translate'; import type { ActivityExecutionInfo } from '$lib/types/activity-execution'; - import { - routeForStandaloneActivitiesWithQuery, - routeForTaskQueue, - } from '$lib/utilities/route-for'; + import { routeForStandaloneActivitiesWithQuery } from '$lib/utilities/route-for'; import type { StandaloneActivityPoller } from '$lib/utilities/standalone-activity-poller.svelte'; import { fromSeconds } from '$lib/utilities/to-duration'; @@ -36,6 +33,12 @@ `ActivityType="${activityType}"`, ), ); + const taskQueueFilterLink = $derived( + routeForStandaloneActivitiesWithQuery( + { namespace }, + `TaskQueue="${activityExecutionInfo.taskQueue}"`, + ), + );
@@ -57,20 +60,28 @@
- Scheduled Time + {translate('standalone-activities.scheduled-time')} - Last Started Time + {translate('standalone-activities.last-started-time')} - Close Time + {translate('standalone-activities.close-time')} - Duration + {translate('standalone-activities.duration')} - Run ID - - Activity Type + {translate('standalone-activities.run-id')} + \ + {#if activityType} + {translate('standalone-activities.activity-type')} + + {/if} + {translate('standalone-activities.task-queue')} - Task Queue - diff --git a/src/lib/components/standalone-activities/standalone-activities-disabled.svelte b/src/lib/components/standalone-activities/standalone-activities-disabled.svelte index 838cf7b673..71d3a71648 100644 --- a/src/lib/components/standalone-activities/standalone-activities-disabled.svelte +++ b/src/lib/components/standalone-activities/standalone-activities-disabled.svelte @@ -36,6 +36,7 @@ activity.enableStandalone:

{translate('standalone-activities.standalone-activities-enablement')}

diff --git a/src/lib/components/worker-table.svelte b/src/lib/components/worker-table.svelte index 52737720ca..2af0455b96 100644 --- a/src/lib/components/worker-table.svelte +++ b/src/lib/components/worker-table.svelte @@ -178,7 +178,7 @@ {:else} - + {/each} diff --git a/src/lib/components/workers/no-workers-polling-alert.svelte b/src/lib/components/workers/no-workers-polling-alert.svelte new file mode 100644 index 0000000000..691d68ce66 --- /dev/null +++ b/src/lib/components/workers/no-workers-polling-alert.svelte @@ -0,0 +1,32 @@ + + + diff --git a/src/lib/components/workers/worker-details/skeleton.svelte b/src/lib/components/workers/worker-details/skeleton.svelte new file mode 100644 index 0000000000..20ec1912c0 --- /dev/null +++ b/src/lib/components/workers/worker-details/skeleton.svelte @@ -0,0 +1,122 @@ + + +
+ {@render breadcrumb()} + + +
+ +
+
+ + +
+ +
+ {#each Array(3) as _, i (i)} +
+ + + + +
+ {/each} +
+ +
+
+ {#each Array(4) as _, i (i)} + + +
+
+ + + + +
+
+ + +
+
+ + + +
+
+
+ {/each} +
+ + +
+
diff --git a/src/lib/components/workers/worker-details/worker-details.svelte b/src/lib/components/workers/worker-details/worker-details.svelte new file mode 100644 index 0000000000..4a49a5d9d9 --- /dev/null +++ b/src/lib/components/workers/worker-details/worker-details.svelte @@ -0,0 +1,478 @@ + + +
+ {@render breadcrumb()} + {#if heartbeat?.workerInstanceKey} + + {heartbeat.workerInstanceKey} + {/if} +
+ +
+
+ +

+ +

+
+ + + + + + {translate('workflows.last-heartbeat')} + + {translate('common.start')} + + + + + {#if heartbeat?.taskQueue} + {translate('common.task-queue')} + + {/if} + {translate('workers.sdk')} + + + + + + + + {translate('deployments.build-id')} + {@const buildId = heartbeat?.deploymentVersion?.buildId} + + + + {#if heartbeat?.deploymentVersion?.deploymentName} + {translate('deployments.deployment')} + + {/if} + + + +
+
+ {@render taskSlotCard( + translate('common.workflows-plural', { count: 1 }), + heartbeat?.workflowTaskSlotsInfo, + heartbeat?.workflowPollerInfo, + )} + {@render taskSlotCard( + translate('common.activities-plural', { count: 1 }), + heartbeat?.activityTaskSlotsInfo, + heartbeat?.activityPollerInfo, + )} + {@render taskSlotCard( + translate('workers.nexus-tasks'), + heartbeat?.nexusTaskSlotsInfo, + heartbeat?.nexusPollerInfo, + )} + {@render taskSlotCard( + translate('workers.local-activities'), + heartbeat?.localActivitySlotsInfo, + null, + )} +
+ + +
+
+ +{#snippet taskSlotCard( + title: string, + slots: WorkerSlotsInfo | null | undefined, + poller: WorkerPollerInfo | null | undefined, +)} + +
+

{title}

+
+ +
+
+
+ {translate('workers.slots')} + {#if slots?.slotSupplierKind} + {@const tooltipText = + SupplierKindTooltipText[slots.slotSupplierKind]} + + {slots.slotSupplierKind} + + {/if} +
+
+
+
+

+ {slots?.currentUsedSlots ?? 0} +

+

{translate('workers.used')}

+
+
+

+ {#if slots?.currentAvailableSlots} + {slots.currentAvailableSlots - (slots?.currentUsedSlots ?? 0)} + {:else} + - + {/if} +

+

+ {#if slots?.currentAvailableSlots} + {translate('workers.available-out-of', { + count: slots.currentAvailableSlots, + })} + {:else} + {translate('workers.none-available')} + {/if} +

+
+
+
+
+ +
+
+ {translate('workers.tasks-processed')} +
+
+ {(slots?.totalProcessedTasks ?? 0).toLocaleString()} +
+
+ + {#if poller} +
+
+ {translate('workers.poller')} + + + {poller.isAutoscaling ? 'Autoscaling' : 'Manual'} + + +
+
+

+ {poller.currentPollers ?? 0} +

+

+ {#if poller.lastSuccessfulPollTime} + {translate('workers.last-poll')} + + {:else} + {translate('workers.no-activity')} + {/if} +

+
+
+ {/if} +
+
+{/snippet} + +{#snippet meterBar(labelledby: string, value: number, maxValue: number = 100)} +
+
+
+{/snippet} + +{#snippet goDependencyWarning()} + +

{translate('workers.go-dependency-warning-description')}

+ + {translate('workers.learn-more-link')} + +
+{/snippet} + +{#snippet hostUsage()} + {@const cpuUsage = (heartbeat?.hostInfo?.currentHostCpuUsage ?? 0) * 100} + {@const memUsage = (heartbeat?.hostInfo?.currentHostMemUsage ?? 0) * 100} + +
+
+ + + {translate('workers.cpu-usage')} + + {cpuUsage.toFixed(0)}% +
+ {@render meterBar('cpu-label', cpuUsage)} +
+
+
+ + + {translate('workers.memory-usage')} + + {memUsage.toFixed(0)}% +
+ {@render meterBar('memory-label', memUsage)} +
+ {#if goDependencyPotentiallyMissing} + {@render goDependencyWarning()} + {/if} +
+{/snippet} + +{#snippet hostInfo()} +
+ +

+ {translate('workers.host-info')} +

+
+
{translate('workers.host-name')}
+
{heartbeat?.hostInfo?.hostName ?? '-'}
+ +
{translate('workers.process-id')}
+
{heartbeat?.hostInfo?.processId ?? '-'}
+
+
+ {@render hostUsage()} +
+{/snippet} + +{#snippet workflowCache()} + +

+ {translate('workers.workflow-cache')} +

+
+
+
+ {currentStickyCacheSize.toLocaleString()} +
+
+ {translate('workers.cache-size')} +
+
+
+
+ {cacheHitRate}% +
+
+ {translate('workers.cache-hits')} +
+
+
+ + {translate('workers.learn-more-link')} + +
+{/snippet} + +{#snippet diagnostics()} + +

+ {translate('workers.diagnostics')} +

+
+
{taskFailureRate}%
+
+ {translate('workers.task-failure-rate')} +
+
+
+{/snippet} diff --git a/src/lib/components/workers/worker-heartbeats-disabled.svelte b/src/lib/components/workers/worker-heartbeats-disabled.svelte new file mode 100644 index 0000000000..30a7a1d430 --- /dev/null +++ b/src/lib/components/workers/worker-heartbeats-disabled.svelte @@ -0,0 +1,35 @@ + + + +
+ + + +
+
+ {translate('workers.worker-heartbeats-disabled')} +
+

+ {translate('workers.worker-heartbeats-enablement')} +

+
+ +
+
diff --git a/src/lib/components/workers/worker-status.svelte b/src/lib/components/workers/worker-status.svelte new file mode 100644 index 0000000000..d35e9d1490 --- /dev/null +++ b/src/lib/components/workers/worker-status.svelte @@ -0,0 +1,46 @@ + + +
+ + {label[status]} + {#if isRunning} + + {/if} + +
diff --git a/src/lib/components/workers/workers-table/task-queue-workers-table.svelte b/src/lib/components/workers/workers-table/task-queue-workers-table.svelte new file mode 100644 index 0000000000..94c8fcb234 --- /dev/null +++ b/src/lib/components/workers/workers-table/task-queue-workers-table.svelte @@ -0,0 +1,50 @@ + + +{#snippet fallback()} + {#await getPollers({ queue: taskQueue, namespace })} + + + {:then workers} + + {:catch error} + + {/await} +{/snippet} + +{#if useFallback} + {@render fallback()} +{:else} + +{/if} diff --git a/src/lib/components/workers/workers-table/worker-heartbeats-sdk-warning.svelte b/src/lib/components/workers/workers-table/worker-heartbeats-sdk-warning.svelte new file mode 100644 index 0000000000..89ba228669 --- /dev/null +++ b/src/lib/components/workers/workers-table/worker-heartbeats-sdk-warning.svelte @@ -0,0 +1,79 @@ + + +
+ + + +
+
{translate('workers.no-worker-heartbeats')}
+ {#if currentSdk} + {@const { href, sdk, version } = currentSdk} + {#if !minimumVersionRequired(version, $sdkInfo.version)} +

+ {translate('workers.worker-heartbeats-sdk-link-preface')} + + + + {translate('workers.worker-heartbeats-sdk-link-postface')} +

+ {/if} + {:else} +

+ {translate('workers.worker-heartbeats-sdk-list-preface')} +

+
+ {#each supportedVersions as { href, sdk, version } (`${sdk}:${version}`)} + + + + {/each} +
+ {/if} +
+
diff --git a/src/lib/components/workers/workers-table/workers-query-empty-state.svelte b/src/lib/components/workers/workers-table/workers-query-empty-state.svelte new file mode 100644 index 0000000000..a0834f7e87 --- /dev/null +++ b/src/lib/components/workers/workers-table/workers-query-empty-state.svelte @@ -0,0 +1,19 @@ + + +
+
+

+ {translate('workers.empty-state-title')} +

+

+ {translate('workers.worker-query-empty-state-description')} +

+
+ +
diff --git a/src/lib/components/workers/workers-table/workers-table-cell.svelte b/src/lib/components/workers/workers-table/workers-table-cell.svelte new file mode 100644 index 0000000000..8aef0aecc1 --- /dev/null +++ b/src/lib/components/workers/workers-table/workers-table-cell.svelte @@ -0,0 +1,129 @@ + + + + {#if attribute === 'BuildId' || attribute === 'WorkerInstanceKey'} + {#if href} + + {truncate(value)} + + {:else} + + {truncate(value)} + + {/if} + {:else if href} + {value} + {:else if children} + {@render children?.()} + {:else} + {value} + {/if} + {#if value || (filters && filters.length > 0)} + + {/if} + diff --git a/src/lib/components/workers/workers-table/workers-table-row.svelte b/src/lib/components/workers/workers-table/workers-table-row.svelte new file mode 100644 index 0000000000..def5ada1c5 --- /dev/null +++ b/src/lib/components/workers/workers-table/workers-table-row.svelte @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + diff --git a/src/lib/components/workers/workers-table/workers-table.svelte b/src/lib/components/workers/workers-table/workers-table.svelte new file mode 100644 index 0000000000..2f3e142cd5 --- /dev/null +++ b/src/lib/components/workers/workers-table/workers-table.svelte @@ -0,0 +1,75 @@ + + + + + {translate('workers.workers')} + + + + {#each columns as { label } (label)} + {label} + {/each} + + {#each visibleItems as worker, i (worker?.workerInstanceKey ?? i)} + + {/each} + + + {#if hasQuery} + + {:else if runningWithNoWorkers} + + {:else} + + {/if} + + diff --git a/src/lib/components/workflow/filter-bar/dropdown-filter-chip.svelte b/src/lib/components/workflow/filter-bar/dropdown-filter-chip.svelte index 1f1a7b2e24..1bd804b11b 100644 --- a/src/lib/components/workflow/filter-bar/dropdown-filter-chip.svelte +++ b/src/lib/components/workflow/filter-bar/dropdown-filter-chip.svelte @@ -3,8 +3,12 @@ import { addHours, addMinutes, addSeconds, startOfDay } from 'date-fns'; import { zonedTimeToUtc } from 'date-fns-tz'; - import { untrack } from 'svelte'; + import { getContext, untrack } from 'svelte'; + import { + SEARCH_ATTRIBUTE_FILTER_CONTEXT, + type SearchAttributeFilterContext, + } from '$lib/components/shared-search-attribute-filter/filter.svelte'; import { timestamp } from '$lib/components/timestamp.svelte'; import Button from '$lib/holocene/button.svelte'; import DatePicker from '$lib/holocene/date-picker.svelte'; @@ -55,7 +59,7 @@ onUpdate: (updatedFilter: SearchAttributeFilter) => void; onRemove: () => void; index?: number; - openIndex?: number; + openIndex?: number | null; }; let { @@ -66,6 +70,10 @@ openIndex = null, }: Props = $props(); + const { includeNullConditions = true } = + getContext(SEARCH_ATTRIBUTE_FILTER_CONTEXT) ?? + {}; + const open = writable(false); let localFilter = $state({ ...filter }); @@ -81,12 +89,16 @@ const isTimeRange = $derived(localFilter.conditional === 'BETWEEN'); const selectedTime = $derived(getSelectedTimezone($timeFormat)); - const defaultConditionOptions = [ - { value: 'is', label: translate('common.is-null') }, - { value: 'is not', label: translate('common.is-not-null') }, - ]; + const defaultConditionOptions = $derived( + includeNullConditions + ? [ + { value: 'is', label: translate('common.is-null') }, + { value: 'is not', label: translate('common.is-not-null') }, + ] + : [], + ); - const conditionalOptions = [ + const conditionalOptions = $derived([ { value: '=', label: translate('common.equal-to'), id: 'equal-to' }, { value: '!=', @@ -99,16 +111,16 @@ id: 'starts-with', }, ...defaultConditionOptions, - ]; + ]); - const dateConditionalOptions = [ + const dateConditionalOptions = $derived([ { value: '<=', label: translate('common.before') }, { value: 'BETWEEN', label: translate('common.between') }, { value: '>=', label: translate('common.after') }, ...defaultConditionOptions, - ]; + ]); - const numberConditionalOptions = [ + const numberConditionalOptions = $derived([ { value: '>', label: '>', id: 'greater-than' }, { value: '>=', @@ -132,14 +144,14 @@ }, { value: '<', label: '<', id: 'less-than' }, ...defaultConditionOptions, - ]; + ]); - const listConditionalOptions = [ + const listConditionalOptions = $derived([ { value: 'in', label: 'In' }, { value: '=', label: translate('common.equal-to') }, { value: '!=', label: translate('common.not-equal-to') }, ...defaultConditionOptions, - ]; + ]); function getDisplayKeyWithConditional(filter: SearchAttributeFilter): string { const { attribute, conditional } = filter; @@ -179,7 +191,7 @@ } if (isDateTimeFilter(filter)) { - if (filter.customDate) return value.split('BETWEEN')[1]; + if (filter.customDate) return value?.split('BETWEEN')[1]; return $timestamp(value, { format: 'short' }); } @@ -190,7 +202,7 @@ return value; } - function applyChanges(e) { + function applyChanges(e: SubmitEvent) { e.preventDefault(); if (isInConditional(localFilter.conditional)) { diff --git a/src/lib/components/workflow/workflow-call-stack-error.svelte b/src/lib/components/workflow/workflow-call-stack-error.svelte deleted file mode 100644 index 9cb6992968..0000000000 --- a/src/lib/components/workflow/workflow-call-stack-error.svelte +++ /dev/null @@ -1,27 +0,0 @@ - - -{#if runningWithNoWorkers} -
- - {translate('workflows.workflow-error-no-workers-description', { - taskQueue: workflow?.taskQueue ?? '', - })} - -
-{/if} diff --git a/src/lib/components/workflow/workflows-summary-configurable-table/table-empty-state.svelte b/src/lib/components/workflow/workflows-summary-configurable-table/table-empty-state.svelte index 3937c5b533..8f27c419cd 100644 --- a/src/lib/components/workflow/workflows-summary-configurable-table/table-empty-state.svelte +++ b/src/lib/components/workflow/workflows-summary-configurable-table/table-empty-state.svelte @@ -3,6 +3,8 @@ import { page } from '$app/state'; + import NoQueryResults from '$lib/components/empty-states/no-query-results.svelte'; + import NoWorkflowTaskFailures from '$lib/components/empty-states/no-workflow-task-failures.svelte'; import Alert from '$lib/holocene/alert.svelte'; import Link from '$lib/holocene/link.svelte'; import { translate } from '$lib/i18n/translate'; @@ -10,9 +12,6 @@ import { TASK_FAILURES_QUERY } from '$lib/utilities/workflow-task-failures'; import noResultsImages from '$lib/vendor/empty-state.svg'; - import NoWorkflowTaskFailures from './empty-states/no-workflow-task-failures.svelte'; - import NoWorkflows from './empty-states/no-workflows.svelte'; - interface Props { cloud?: Snippet; } @@ -65,7 +64,7 @@ {#if hasTaskFailuresQuery} {:else} - + {/if}
diff --git a/src/lib/holocene/badge.svelte b/src/lib/holocene/badge.svelte index 949160f488..11f8744a52 100644 --- a/src/lib/holocene/badge.svelte +++ b/src/lib/holocene/badge.svelte @@ -12,6 +12,7 @@ danger: 'bg-red-200', count: 'h-6 w-6 min-w-max rounded-full bg-blue-300', subtle: 'surface-subtle dark:text-white font-normal select-all', + ghost: 'surface-primary text-primary border border-subtle', }; const types = cva( diff --git a/src/lib/holocene/filter-or-copy-buttons.svelte b/src/lib/holocene/filter-or-copy-buttons.svelte index c5c7d5b774..f43fcc977c 100644 --- a/src/lib/holocene/filter-or-copy-buttons.svelte +++ b/src/lib/holocene/filter-or-copy-buttons.svelte @@ -52,11 +52,11 @@