diff --git a/src/app/shared/blocks-list/blocks-list.css b/src/app/shared/blocks-list/blocks-list.css
index 773c7cb..56156db 100644
--- a/src/app/shared/blocks-list/blocks-list.css
+++ b/src/app/shared/blocks-list/blocks-list.css
@@ -185,50 +185,42 @@
cursor: text;
}
-.blocks-list-kinds {
- display: flex;
- flex-wrap: wrap;
- gap: 6px;
- padding: 0 2px 8px;
-}
-
-.blocks-list-kind-chip {
+.blocks-list-filter-btn {
+ position: relative;
display: inline-flex;
align-items: center;
- gap: 4px;
- padding: 2px 8px;
- border: 1px solid #cbd5e1;
- border-radius: 999px;
- background: #ffffff;
- color: #334155;
- font-size: 11px;
- font-weight: 600;
- cursor: pointer;
-}
-
-.blocks-list-kind-chip:hover {
- border-color: #94a3b8;
-}
-
-.blocks-list-kind-chip--on {
- border-color: #2563eb;
- background: #eff6ff;
- color: #1d4ed8;
-}
-
-.blocks-list-kind-chip .blocks-list-card-kind {
- font-size: 13px;
- width: 13px;
- height: 13px;
- line-height: 13px;
-}
-
-.blocks-list-kind-clear {
+ justify-content: center;
+ width: 32px;
+ height: 32px;
+ margin-right: 4px;
border: none;
- background: none;
+ border-radius: 8px;
+ background: transparent;
color: #64748b;
- font-size: 11px;
- font-weight: 600;
cursor: pointer;
- text-decoration: underline;
+}
+
+.blocks-list-filter-btn:hover {
+ background: #f1f5f9;
+}
+
+.blocks-list-filter-btn--on {
+ color: #1d4ed8;
+ background: #eff6ff;
+}
+
+.blocks-list-filter-count {
+ position: absolute;
+ top: 1px;
+ right: 1px;
+ min-width: 14px;
+ height: 14px;
+ padding: 0 3px;
+ border-radius: 999px;
+ background: #2563eb;
+ color: #ffffff;
+ font-size: 9px;
+ font-weight: 700;
+ line-height: 14px;
+ text-align: center;
}
diff --git a/src/app/shared/blocks-list/blocks-list.html b/src/app/shared/blocks-list/blocks-list.html
index ccaa462..e94ef06 100644
--- a/src/app/shared/blocks-list/blocks-list.html
+++ b/src/app/shared/blocks-list/blocks-list.html
@@ -15,28 +15,44 @@
Search blocks
+ @if (availableKinds().length > 1) {
+
+ }
+
- @if (availableKinds().length > 1) {
-
- @for (kind of availableKinds(); track kind.label) {
-
- }
- @if (selectedKinds().size > 0) {
-
- }
-
- }
-
@if (filteredBlocks().length === 0) {
No blocks found
diff --git a/src/app/shared/blocks-list/blocks-list.ts b/src/app/shared/blocks-list/blocks-list.ts
index 70e2316..c5627f1 100644
--- a/src/app/shared/blocks-list/blocks-list.ts
+++ b/src/app/shared/blocks-list/blocks-list.ts
@@ -10,6 +10,7 @@ import { MatCardModule } from '@angular/material/card';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatIconModule } from '@angular/material/icon';
import { MatInputModule } from '@angular/material/input';
+import { MatMenuModule } from '@angular/material/menu';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatTooltipModule } from '@angular/material/tooltip';
import { BLOCK_TYPE_DRAG_MIME } from './block-drag';
@@ -28,7 +29,7 @@ export type BlockKind = { icon: string; label: string; modifier: string };
export function blockKind(block: Pick): BlockKind {
const capabilities = block.capabilities;
const decides = capabilities?.visualRole === 'DECISION' || capabilities?.routesExclusively === true;
- if (capabilities?.visualRole === 'RESOURCE') return { icon: 'database', label: 'Resource', modifier: 'resource' };
+ if (capabilities?.visualRole === 'RESOURCE') return { icon: 'storage', label: 'Resource', modifier: 'resource' };
if (block.userInteractive) {
return decides
? { icon: 'touch_app', label: 'Human decision', modifier: 'interactive' }
@@ -42,7 +43,7 @@ export function blockKind(block: Pick {
this.selectedKinds.set(new Set());
}
+ /** For the filter button's tooltip, in the order the menu lists them. */
+ selectedKindLabels(): string {
+ const selected = this.selectedKinds();
+ return this.availableKinds().filter((kind) => selected.has(kind.label)).map((kind) => kind.label).join(', ');
+ }
+
readonly showLoading = computed(() => this.loading() || this.serviceLoading());
kindOf(block: BlockType): BlockKind {
diff --git a/src/styles.css b/src/styles.css
index 5953060..448af17 100644
--- a/src/styles.css
+++ b/src/styles.css
@@ -654,3 +654,24 @@ body.node-focus-modal-open {
.inner-nav {
@apply flex flex-wrap justify-center gap-4 items-center max-w-7xl;
}
+
+/* The palette's kind filter: its menu lives in the overlay, outside the palette's own styles. */
+.blocks-list-kind-menu {
+ --mat-menu-item-label-text-font: var(--font-body);
+ --mat-menu-item-label-text-size: 13px;
+ --mat-menu-item-label-text-weight: 500;
+}
+
+.blocks-list-kind-menu .mat-mdc-menu-item {
+ min-height: 36px;
+ font-family: var(--font-body);
+}
+
+.blocks-list-kind-menu .mat-mdc-menu-item .mat-mdc-menu-item-text {
+ font-family: var(--font-body);
+ font-size: 13px;
+}
+
+.blocks-list-kind-menu .mat-mdc-menu-item .mat-icon {
+ margin-right: 8px;
+}