@equal-experts/kuat-vue 0.15.1 → 0.15.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-docs/AGENTS.md +1 -1
- package/agent-docs/README.md +1 -1
- package/agent-docs/external/kuat-agent-rules/reference/design-language/borders.md +49 -36
- package/agent-docs/external/kuat-agent-rules/reference/media-types/web-marketing/emails.md +97 -34
- package/agent-docs/external/kuat-agent-rules/reference/media-types/web-product/design.md +174 -3
- package/agent-docs/external/kuat-agent-rules/reference/media-types/web-product/emails.md +98 -32
- package/agent-docs/external/kuat-agent-rules/reference/media-types/web-product/figma-build-checklist.md +13 -0
- package/agent-docs/external/kuat-agent-rules/reference/media-types/web-product/patterns/README.md +4 -0
- package/agent-docs/external/kuat-agent-rules/reference/media-types/web-product/patterns/browse-and-filter.md +226 -0
- package/agent-docs/external/kuat-agent-rules/reference/media-types/web-product/patterns/complete-a-form.md +1 -1
- package/agent-docs/external/kuat-agent-rules/reference/media-types/web-product/patterns/dashboard.md +14 -53
- package/agent-docs/external/kuat-agent-rules/reference/media-types/web-product/patterns/detail-page.md +196 -0
- package/agent-docs/external/kuat-agent-rules/reference/media-types/web-product/patterns/give-feedback-on-an-action.md +184 -0
- package/agent-docs/external/kuat-agent-rules/reference/media-types/web-product/patterns/section-hub.md +174 -0
- package/agent-docs/external/kuat-agent-rules/reference/media-types/web-product/patterns/sign-in.md +1 -1
- package/agent-docs/manifest.json +3 -3
- package/agent-docs/rules/LOADING-consumer.md +1 -1
- package/dist/{AlertDialogTrigger.vue_vue_type_script_setup_true_lang-DosgAcSM.js → AlertDialogTrigger.vue_vue_type_script_setup_true_lang-Ccs_lGKx.js} +1 -1
- package/dist/alert-dialog.js +1 -1
- package/dist/index.js +1 -1
- package/dist/style.css +1 -1
- package/package.json +1 -1
|
@@ -1,65 +1,131 @@
|
|
|
1
1
|
# Product Email Rules
|
|
2
2
|
|
|
3
|
-
Guidelines for Equal Experts transactional and
|
|
3
|
+
Guidelines for Equal Experts transactional and system emails sent from web applications.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
## Overview
|
|
8
8
|
|
|
9
|
-
Product emails are
|
|
9
|
+
Product emails are triggered by something the user did or something the system needs to tell them: confirmations, notifications, and system messages. The reader didn't ask for this specific message, but they are expecting the application to send it — the bar is trust and clarity, not persuasion.
|
|
10
10
|
|
|
11
11
|
---
|
|
12
12
|
|
|
13
13
|
## Key Principles
|
|
14
14
|
|
|
15
|
-
1. **
|
|
16
|
-
2. **
|
|
17
|
-
3. **
|
|
18
|
-
4. **
|
|
15
|
+
1. **Clean and content-first** — minimal decoration; the message leads and design supports it. Follow the design system's [clarity principle](../../design-language/design-language.md#4-clarity): never decorate at the expense of getting the information across.
|
|
16
|
+
2. **Trustworthy** — instantly recognisable as coming from the product, and clear about exactly which service sent it — no surprises in sender, subject, or content.
|
|
17
|
+
3. **Single-purpose** — one transaction, one message. Don't fold marketing content into a transactional email.
|
|
18
|
+
4. **Timely** — sent as close to the triggering event as the system allows.
|
|
19
|
+
5. **Actionable** — the reader knows what happened, whether they need to do anything, and how.
|
|
20
|
+
6. **Accessible** — works with images blocked, with a screen reader, and at 200% zoom.
|
|
19
21
|
|
|
20
22
|
---
|
|
21
23
|
|
|
22
24
|
## Email Types
|
|
23
25
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
| Type | Examples |
|
|
27
|
+
|------|----------|
|
|
28
|
+
| Confirmation | Account created, payment received, booking made |
|
|
29
|
+
| Notification | New activity, status change, mention or assignment |
|
|
30
|
+
| System / security | Password reset, email verification, security alert, new-device sign-in |
|
|
31
|
+
| Digest | Periodic roll-up of activity |
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Design Guidelines
|
|
36
|
+
|
|
37
|
+
### Layout
|
|
38
|
+
|
|
39
|
+
- Content-first: strip the design back to what the message needs. No decorative imagery, banners, or flourishes competing with the information itself.
|
|
40
|
+
- Single column, mobile-first, roughly 600–640px wide.
|
|
41
|
+
- Generous whitespace between sections — follow the [spacing](../../design-language/spacing.md) scale.
|
|
42
|
+
- One primary CTA. Use a secondary text link only when a genuine second action exists (e.g. "or view your account").
|
|
43
|
+
|
|
44
|
+
### Colour
|
|
45
|
+
|
|
46
|
+
- Use brand [colour](../../design-language/colours.md) roles, not raw hex values: primary for the CTA, `--destructive` for error/security-alert framing.
|
|
47
|
+
- Never rely on colour alone to signal status — pair with wording ("Error:", "Action needed") as described in [accessibility](../../accessibility/accessibility.md#colour-usage).
|
|
48
|
+
- Avoid full-colour backgrounds behind body copy; they don't survive client dark-mode inversion reliably. Keep the body on a light background with a small brand accent (header bar, logo lockup).
|
|
49
|
+
|
|
50
|
+
### Typography
|
|
51
|
+
|
|
52
|
+
- Use the brand typeface with a web-safe fallback stack — many email clients can't load custom webfonts. See [typography](../../design-language/typography.md).
|
|
53
|
+
- Minimum 14–16px body text, 1.5 line height, per [accessibility](../../accessibility/accessibility.md#typography-accessibility).
|
|
54
|
+
|
|
55
|
+
### Imagery and logo
|
|
56
|
+
|
|
57
|
+
- Small header logo per [logo guidelines](../../brand/logo.md).
|
|
58
|
+
- Alt text is mandatory on every image. Many clients block images by default, so never put essential information (amounts, dates, codes) only in an image — set it as live text.
|
|
59
|
+
- Use live HTML text for buttons and headlines, not text baked into an image.
|
|
60
|
+
|
|
61
|
+
### Service identity
|
|
62
|
+
|
|
63
|
+
Kuat covers many EE-built services, so the reader needs to know at a glance which one sent this email — particularly if they use more than one. That identification doesn't have to sit in the main header lockup: a small label near the header (e.g. "Timesheets", "Expenses") or a clear line in the footer ("This email was sent by [Service], part of Equal Experts") both work. Pick one clear place for it — don't rely on the sender address alone, since many clients hide or truncate it by default.
|
|
64
|
+
|
|
65
|
+
### Buttons / CTA
|
|
66
|
+
|
|
67
|
+
- One primary CTA: filled, high-contrast, minimum 44×44px tap target, live text (a "bulletproof" button, not an image).
|
|
68
|
+
- Sentence case, verb-led label — see [buttons](../../content/formatting.md#buttons).
|
|
69
|
+
|
|
70
|
+
### Footer
|
|
71
|
+
|
|
72
|
+
- Recognisable sender name, the sending service named per [service identity](#service-identity) above, and a way to reach support.
|
|
73
|
+
- If the email carries any promotional content alongside the transactional message, it needs an unsubscribe/preferences link and the same legal footer as a [marketing email](../web-marketing/emails.md#footer-legalcompliance-minimum) — keep pure transactional email free of that content instead.
|
|
28
74
|
|
|
29
75
|
---
|
|
30
76
|
|
|
31
77
|
## Content Guidelines
|
|
32
78
|
|
|
33
|
-
Follow [
|
|
79
|
+
Follow [writing style](../../content/writing-style.md) and [formatting](../../content/formatting.md) for tone, voice, and conventions.
|
|
80
|
+
|
|
81
|
+
### Subject line
|
|
82
|
+
|
|
83
|
+
- Name the specific outcome, not a generic label: "Your password has been reset", not "Notification".
|
|
84
|
+
- Include identifying details where they help the reader confirm it's theirs (order number, invoice number).
|
|
85
|
+
- No marketing language, hype, or artificial urgency in a system email.
|
|
86
|
+
|
|
87
|
+
### Preheader
|
|
88
|
+
|
|
89
|
+
- Extend the subject with the next useful detail; don't waste it on boilerplate.
|
|
90
|
+
|
|
91
|
+
### Body
|
|
92
|
+
|
|
93
|
+
- Lead with the outcome or status — skip a greeting preamble.
|
|
94
|
+
- State what happened, why the reader is getting this email, and what to do next (or that nothing is needed).
|
|
95
|
+
- For security-sensitive emails: state any expiry window, and reassure the reader with next steps if they didn't request the action.
|
|
96
|
+
- Use real data the reader will recognise (their name, order number); don't personalise with data you don't actually have.
|
|
97
|
+
- Short paragraphs, one idea each, written for a first-read scan.
|
|
98
|
+
|
|
99
|
+
---
|
|
34
100
|
|
|
35
|
-
|
|
36
|
-
- Be specific about the content
|
|
37
|
-
- Include relevant details (order number, etc.)
|
|
38
|
-
- Keep concise
|
|
101
|
+
## Common Scenarios
|
|
39
102
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
103
|
+
| Scenario | Must include | Tone |
|
|
104
|
+
|----------|---------------|------|
|
|
105
|
+
| **Password reset** | Reset link/button, expiry window, "didn't request this?" reassurance and next step | Calm, reassuring, no urgency beyond the real expiry |
|
|
106
|
+
| **Welcome / account activation** | What the account gives access to, the activation action, a first next step | Warm, brief, sets expectations for what's next |
|
|
107
|
+
| **Payment / booking confirmation** | What was purchased/booked, amount, date/reference, what happens next | Clear, itemised, confidence-building |
|
|
108
|
+
| **Activity notification** | What happened, who/what triggered it, link to view in the product | Brief, factual, one glance should be enough |
|
|
109
|
+
| **Security alert** | What was detected, when, device/location if known, how to secure the account if it wasn't them | Direct, non-alarmist, action-first |
|
|
110
|
+
| **Digest / summary** | Time period covered, the handful of most relevant items, link to see more | Scannable, prioritised — not a full activity log |
|
|
45
111
|
|
|
46
112
|
---
|
|
47
113
|
|
|
48
|
-
##
|
|
114
|
+
## Accessibility Checklist
|
|
49
115
|
|
|
50
|
-
-
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
-
|
|
54
|
-
-
|
|
55
|
-
-
|
|
56
|
-
- Mobile-first design requirements
|
|
57
|
-
- Accessibility requirements
|
|
116
|
+
- Alt text on every image; decorative images marked as such.
|
|
117
|
+
- Colour contrast meets [accessibility](../../accessibility/accessibility.md#colour-contrast) minimums; status never conveyed by colour alone.
|
|
118
|
+
- All critical information and CTAs exist as live text, not images.
|
|
119
|
+
- Semantic HTML structure (proper headings, real buttons/links) so screen readers and layout tables (marked `role="presentation"`) don't confuse assistive tech.
|
|
120
|
+
- A plain-text version accompanies the HTML email.
|
|
121
|
+
- No auto-playing or flashing content.
|
|
58
122
|
|
|
59
123
|
---
|
|
60
124
|
|
|
61
125
|
## Related Documentation
|
|
62
126
|
|
|
63
|
-
- [Reference home](../../README.md)
|
|
64
|
-
- [
|
|
65
|
-
- [
|
|
127
|
+
- [Reference home](../../README.md) — brand and design language
|
|
128
|
+
- [Writing style](../../content/writing-style.md) · [Formatting](../../content/formatting.md) — copy conventions
|
|
129
|
+
- [Accessibility](../../accessibility/accessibility.md) · [Web-product accessibility](./accessibility.md) — technical implementation
|
|
130
|
+
- [Colours](../../design-language/colours.md) · [Typography](../../design-language/typography.md)
|
|
131
|
+
- [Marketing emails](../web-marketing/emails.md) — for the compliance footer required once any promotional content is present
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Figma Build Verification
|
|
2
|
+
|
|
3
|
+
Figma builds are verified against a procedure, not a passive reference — the checklist itself lives
|
|
4
|
+
with the skill that runs it: `skills/create-design/figma-build-checklist.md`.
|
|
5
|
+
|
|
6
|
+
That checklist covers the design-system context gate (Kuat vs. a different client's own system),
|
|
7
|
+
live component/variable discovery, token binding, component fidelity, and a pre-handoff self-audit.
|
|
8
|
+
|
|
9
|
+
## Related
|
|
10
|
+
|
|
11
|
+
- [Product Design](./design.md) - Kuat layout templates and regions
|
|
12
|
+
- [Component Decision Tree](./component-decision-tree.md) - Kuat-specific component selection
|
|
13
|
+
- [Patterns](./patterns/) - page-type patterns Figma builds should match
|
package/agent-docs/external/kuat-agent-rules/reference/media-types/web-product/patterns/README.md
CHANGED
|
@@ -10,6 +10,8 @@ web-product implementation live together in one document.
|
|
|
10
10
|
|---------|-----|-------------|
|
|
11
11
|
| [Sign in](./sign-in.md) | Login, registration, password flows, MFA | Single column |
|
|
12
12
|
| [Complete a form](./complete-a-form.md) | Settings, multi-step forms, data entry | Varies |
|
|
13
|
+
| [Browse and filter](./browse-and-filter.md) | Record lists, directories, search results | Sidebar navigation |
|
|
14
|
+
| [Know the outcome of their action](./give-feedback-on-an-action.md) | Post-action feedback: confirmations, errors, toasts, system status | Varies |
|
|
13
15
|
|
|
14
16
|
## Pages
|
|
15
17
|
|
|
@@ -17,3 +19,5 @@ web-product implementation live together in one document.
|
|
|
17
19
|
|---------|-----|-------------|
|
|
18
20
|
| [Dashboard](./dashboard.md) | Analytics, data tables, metrics, reporting | Sidebar navigation |
|
|
19
21
|
| [Documentation](./documentation.md) | Docs sites, knowledge bases, API reference | Sidebar + split |
|
|
22
|
+
| [Section hub](./section-hub.md) | Category landing pages, navigation hubs | Sidebar navigation |
|
|
23
|
+
| [Detail page](./detail-page.md) | Profiles, business units, single-record views | Sidebar navigation |
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
# Browse and filter
|
|
2
|
+
|
|
3
|
+
**User goal:** Find a specific item — or a small relevant subset — inside a larger collection, by
|
|
4
|
+
narrowing with search terms and filters rather than scanning everything.
|
|
5
|
+
|
|
6
|
+
> **Pattern:** *Help users to…* · single-medium (web-product) — concept and implementation together.
|
|
7
|
+
> Covers record lists, admin directories, search results, and any table/list fronted by search and
|
|
8
|
+
> filter controls.
|
|
9
|
+
|
|
10
|
+
## Context
|
|
11
|
+
|
|
12
|
+
Users arrive with a question ("which of these match?") rather than a fixed target. They want to narrow
|
|
13
|
+
a large set quickly, understand how many results their filters produced, refine without losing their
|
|
14
|
+
place, and move from a result straight into the record itself.
|
|
15
|
+
|
|
16
|
+
## Principles
|
|
17
|
+
|
|
18
|
+
| Principle | Implementation |
|
|
19
|
+
|-----------|-----------------|
|
|
20
|
+
| Filters are visible, not buried | Show active filters as removable chips, not just inside a menu |
|
|
21
|
+
| Results confirm the query | Show a result count alongside the applied filters |
|
|
22
|
+
| Narrowing is reversible | "Clear filters" always available; query state survives back/forward |
|
|
23
|
+
| No dead ends | Empty result sets explain why and offer a way out |
|
|
24
|
+
|
|
25
|
+
Success shows up as: time to find a specific record, filter usage patterns, zero-result-query rate, and
|
|
26
|
+
click-through rate from result to detail.
|
|
27
|
+
|
|
28
|
+
## Solution in web-product
|
|
29
|
+
|
|
30
|
+
### Layout
|
|
31
|
+
|
|
32
|
+
**Base Layout:** Sidebar Navigation (or Single Column full-width, for a standalone search page)
|
|
33
|
+
|
|
34
|
+
#### Structure
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
┌──────┬──────────────────────────────────┐
|
|
38
|
+
│ │ Header: Title + Actions │
|
|
39
|
+
│ Side ├──────────────────────────────────┤
|
|
40
|
+
│ bar │ Search + Filter Bar │
|
|
41
|
+
│ │ [Search input] [Filter▼][Filter▼]│
|
|
42
|
+
│ │ Active filters: [Tag ×][Tag ×] │
|
|
43
|
+
│ ├──────────────────────────────────┤
|
|
44
|
+
│ │ Results count: "128 results" │
|
|
45
|
+
│ ├──────────────────────────────────┤
|
|
46
|
+
│ │ ┌─────────────────────────────┐ │
|
|
47
|
+
│ │ │ │ │
|
|
48
|
+
│ │ │ Results Table / List │ │
|
|
49
|
+
│ │ │ (scrollable) │ │
|
|
50
|
+
│ │ │ │ │
|
|
51
|
+
│ │ └─────────────────────────────┘ │
|
|
52
|
+
│ ├──────────────────────────────────┤
|
|
53
|
+
│ │ Pagination │
|
|
54
|
+
└──────┴──────────────────────────────────┘
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
For 10+ filter dimensions, move filters into a left-hand panel inside the content area instead of a bar:
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
┌──────┬────────┬─────────────────────────┐
|
|
61
|
+
│ │ Filter │ Header: Title + Actions │
|
|
62
|
+
│ Side │ Panel ├─────────────────────────┤
|
|
63
|
+
│ bar │ │ Results count │
|
|
64
|
+
│ │ [ ] A ├─────────────────────────┤
|
|
65
|
+
│ │ [ ] B │ Results Table / List │
|
|
66
|
+
│ │ [ ] C │ (scrollable) │
|
|
67
|
+
│ │ Apply ├─────────────────────────┤
|
|
68
|
+
│ │ Clear │ Pagination │
|
|
69
|
+
└──────┴────────┴─────────────────────────┘
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
#### Specifications
|
|
73
|
+
|
|
74
|
+
| Element | Value |
|
|
75
|
+
|---------|-------|
|
|
76
|
+
| Sidebar width | 240-280px (collapsible to 64px) |
|
|
77
|
+
| Filter panel width | 240-280px, when used |
|
|
78
|
+
| Content padding | 24-32px |
|
|
79
|
+
| Filter bar height | 48-56px |
|
|
80
|
+
|
|
81
|
+
### Design
|
|
82
|
+
|
|
83
|
+
#### Colour Tokens
|
|
84
|
+
|
|
85
|
+
| Element | Token |
|
|
86
|
+
|---------|-------|
|
|
87
|
+
| Filter bar background | `bg-muted/50` or transparent |
|
|
88
|
+
| Active filter chip | `bg-secondary`, `text-secondary-foreground` |
|
|
89
|
+
| Results table | `bg-card`, `border` |
|
|
90
|
+
| Result count text | `text-sm text-muted-foreground` |
|
|
91
|
+
|
|
92
|
+
#### Filter Bar Pattern
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
┌─────────────────────────────────────────────────────┐
|
|
96
|
+
│ [Search...] [Category ▼] [Status ▼] [Clear all] │
|
|
97
|
+
└─────────────────────────────────────────────────────┘
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
- Search input leftmost
|
|
101
|
+
- Dropdown/select filters follow, left to right in priority order
|
|
102
|
+
- "Clear all" right-aligned, shown only when a filter is active
|
|
103
|
+
|
|
104
|
+
#### Filter Panel Pattern (10+ options)
|
|
105
|
+
|
|
106
|
+
- Collapsible sections per filter group
|
|
107
|
+
- Checkbox groups, range sliders as needed
|
|
108
|
+
- "Apply" and "Clear" actions pinned at the bottom of the panel
|
|
109
|
+
|
|
110
|
+
#### Results Table/List Pattern
|
|
111
|
+
|
|
112
|
+
| Element | Implementation |
|
|
113
|
+
|---------|-----------------|
|
|
114
|
+
| Sortable columns | Click header to sort, show arrow direction |
|
|
115
|
+
| Row selection | Checkbox in first column, when bulk actions exist |
|
|
116
|
+
| Row click target | Whole row navigates to detail — see [detail page](./detail-page.md) |
|
|
117
|
+
| Row actions | Overflow menu or icon buttons, right-aligned |
|
|
118
|
+
| Pagination | Bottom of table, with a page-size selector |
|
|
119
|
+
| List view (alternative to table) | Card-per-row, for records with more visual content (avatar, thumbnail) |
|
|
120
|
+
|
|
121
|
+
### Content
|
|
122
|
+
|
|
123
|
+
#### Active Filter Chips
|
|
124
|
+
|
|
125
|
+
**Structure:** Filter label + value, with a remove (×) affordance.
|
|
126
|
+
|
|
127
|
+
**Example:** `Status: Active ×` `Region: EMEA ×`
|
|
128
|
+
|
|
129
|
+
#### Result Count
|
|
130
|
+
|
|
131
|
+
| Scenario | Message |
|
|
132
|
+
|----------|---------|
|
|
133
|
+
| Results found | "128 results" |
|
|
134
|
+
| Single result | "1 result" |
|
|
135
|
+
| Filtered | "12 results for "database migration" in Engineering" |
|
|
136
|
+
|
|
137
|
+
#### Empty States
|
|
138
|
+
|
|
139
|
+
| Scenario | Message |
|
|
140
|
+
|----------|---------|
|
|
141
|
+
| No results for query | "No results match your filters" + "Clear filters" button |
|
|
142
|
+
| No records exist yet | "No [records] yet" + guidance to create the first one |
|
|
143
|
+
|
|
144
|
+
#### Loading States
|
|
145
|
+
|
|
146
|
+
- Filter bar stays interactive while results load
|
|
147
|
+
- Table: 5-10 skeleton rows
|
|
148
|
+
- Show a loading indicator on re-query; never swap in stale results silently
|
|
149
|
+
|
|
150
|
+
### Accessibility
|
|
151
|
+
|
|
152
|
+
**Base requirements:** See [accessibility foundations](../../../accessibility/accessibility.md) and
|
|
153
|
+
[web accessibility](../accessibility.md)
|
|
154
|
+
|
|
155
|
+
**Scenario-specific:**
|
|
156
|
+
|
|
157
|
+
| Requirement | Implementation |
|
|
158
|
+
|--------------|------------------|
|
|
159
|
+
| Filter state announced | Screen reader announces the result count after each filter change (`aria-live`) |
|
|
160
|
+
| Keyboard filter removal | Chips removable via keyboard (Delete/Backspace when focused, or a focusable × button) |
|
|
161
|
+
| Table semantics | Use a native `<table>` with `<th scope="col">`; never a div grid for tabular data |
|
|
162
|
+
| Focus order | Search → filters → result count → table → pagination |
|
|
163
|
+
|
|
164
|
+
### Implementation
|
|
165
|
+
|
|
166
|
+
#### State Management
|
|
167
|
+
|
|
168
|
+
| State | Handling |
|
|
169
|
+
|-------|----------|
|
|
170
|
+
| Loading | Show skeleton rows, keep filters interactive |
|
|
171
|
+
| Error | Show error message with retry, preserve entered filters |
|
|
172
|
+
| Empty (no matches) | Contextual empty state with "Clear filters" |
|
|
173
|
+
| Empty (no records) | Contextual empty state with a create action |
|
|
174
|
+
|
|
175
|
+
#### Responsive Behaviour
|
|
176
|
+
|
|
177
|
+
| Breakpoint | Filter bar | Filter panel | Table |
|
|
178
|
+
|------------|-------------|----------------|-------|
|
|
179
|
+
| Mobile | Collapses to a single "Filters" button opening a sheet | Sheet/drawer | Card view or horizontal scroll |
|
|
180
|
+
| Tablet | Wraps to two rows | Collapsible, default collapsed | Horizontal scroll |
|
|
181
|
+
| Desktop | Single row | Persistent | Full table |
|
|
182
|
+
|
|
183
|
+
## Best Practices
|
|
184
|
+
|
|
185
|
+
### Do's
|
|
186
|
+
|
|
187
|
+
1. **Show active filters as chips** - Users shouldn't have to reopen a menu to see what's applied
|
|
188
|
+
2. **Confirm the result count** - Alongside the filters that produced it
|
|
189
|
+
3. **Preserve query state** - In the URL, so results are shareable and survive back/forward
|
|
190
|
+
4. **Debounce search input** - Query as the user types, without firing on every keystroke
|
|
191
|
+
|
|
192
|
+
### Don'ts
|
|
193
|
+
|
|
194
|
+
1. **Don't hide active filters** - Inside a closed dropdown with no visible indicator
|
|
195
|
+
2. **Don't reset filters** - On pagination or sort
|
|
196
|
+
3. **Don't block the whole page** - While results reload, only the table region should show loading
|
|
197
|
+
|
|
198
|
+
### Common Mistakes
|
|
199
|
+
|
|
200
|
+
| Mistake | Solution |
|
|
201
|
+
|---------|----------|
|
|
202
|
+
| Filters and results feel disconnected | Show result count next to active filters |
|
|
203
|
+
| Losing place after navigating back | Persist filters and page in the URL |
|
|
204
|
+
| No indication a query is slow | Add a loading indicator on the results region |
|
|
205
|
+
|
|
206
|
+
### Edge Cases
|
|
207
|
+
|
|
208
|
+
| Case | Handling |
|
|
209
|
+
|------|----------|
|
|
210
|
+
| Zero results | Explain why, offer "Clear filters" |
|
|
211
|
+
| Very large result sets | Paginate or virtualise; never render all rows |
|
|
212
|
+
| Ambiguous search term | Show "Did you mean…" or broaden automatically with a note |
|
|
213
|
+
|
|
214
|
+
## Examples
|
|
215
|
+
|
|
216
|
+
The sidebar-navigation frame above is the canonical instance: a search-and-filter bar above a scrollable
|
|
217
|
+
results table, with pagination beneath. [Dashboard](./dashboard.md)'s data-table variant is this pattern
|
|
218
|
+
applied inside a metrics-first page — same filter bar and table, reached from a dashboard rather than a
|
|
219
|
+
standalone directory.
|
|
220
|
+
|
|
221
|
+
## Related
|
|
222
|
+
|
|
223
|
+
- [Product Design](../design.md) - Sidebar Navigation layout
|
|
224
|
+
- [Dashboard](./dashboard.md) - Metrics-first pages that also use this pattern's table/filter structure
|
|
225
|
+
- [Detail page](./detail-page.md) - Where a result row leads
|
|
226
|
+
- [Accessibility foundations](../../../accessibility/accessibility.md) - Colour and contrast
|
|
@@ -89,7 +89,7 @@ Success shows up as: form completion rate, time to complete, error rate and reco
|
|
|
89
89
|
| Input border | `border-input` |
|
|
90
90
|
| Input focus | `ring-ring` |
|
|
91
91
|
| Error state | `border-destructive`, `text-destructive` |
|
|
92
|
-
| Success indicator | `text-
|
|
92
|
+
| Success indicator | `text-success` |
|
|
93
93
|
|
|
94
94
|
#### Typography
|
|
95
95
|
|
package/agent-docs/external/kuat-agent-rules/reference/media-types/web-product/patterns/dashboard.md
CHANGED
|
@@ -53,24 +53,12 @@ Dashboards benefit from persistent navigation and maximum content width.
|
|
|
53
53
|
└──────┴──────────────────────────────────┘
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
-
#### Data Table
|
|
56
|
+
#### Data Table Variant
|
|
57
57
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
│ bar │ Filters Bar │
|
|
63
|
-
│ ├──────────────────────────────────┤
|
|
64
|
-
│ │ ┌─────────────────────────────┐ │
|
|
65
|
-
│ │ │ │ │
|
|
66
|
-
│ │ │ Data Table │ │
|
|
67
|
-
│ │ │ (scrollable) │ │
|
|
68
|
-
│ │ │ │ │
|
|
69
|
-
│ │ └─────────────────────────────┘ │
|
|
70
|
-
│ ├──────────────────────────────────┤
|
|
71
|
-
│ │ Pagination │
|
|
72
|
-
└──────┴──────────────────────────────────┘
|
|
73
|
-
```
|
|
58
|
+
For a data-table-first dashboard, swap the KPI/chart body for the
|
|
59
|
+
[browse and filter](./browse-and-filter.md) pattern — same sidebar-navigation shell, with a
|
|
60
|
+
search/filter bar above a scrollable table and pagination below. See that pattern for the filter-bar,
|
|
61
|
+
filter-panel, and table specifications; they aren't repeated here.
|
|
74
62
|
|
|
75
63
|
#### Specifications
|
|
76
64
|
|
|
@@ -91,7 +79,7 @@ Dashboards benefit from persistent navigation and maximum content width.
|
|
|
91
79
|
| Card background | `bg-card` |
|
|
92
80
|
| Card border | `border` |
|
|
93
81
|
| Sidebar | `bg-sidebar` |
|
|
94
|
-
| Positive trend | `text-
|
|
82
|
+
| Positive trend | `text-success` |
|
|
95
83
|
| Negative trend | `text-destructive` |
|
|
96
84
|
| Neutral | `text-muted-foreground` |
|
|
97
85
|
|
|
@@ -199,40 +187,11 @@ Dashboards benefit from persistent navigation and maximum content width.
|
|
|
199
187
|
|
|
200
188
|
### Implementation
|
|
201
189
|
|
|
202
|
-
#### Filter Patterns
|
|
203
|
-
|
|
204
|
-
**Filter Bar (above content):**
|
|
205
|
-
|
|
206
|
-
```
|
|
207
|
-
┌─────────────────────────────────────────────────────┐
|
|
208
|
-
│ [Date Range ▼] [Category ▼] [Status ▼] [Search] │
|
|
209
|
-
└─────────────────────────────────────────────────────┘
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
- Horizontal layout
|
|
213
|
-
- Date range picker left
|
|
214
|
-
- Category filters middle
|
|
215
|
-
- Search right
|
|
216
|
-
- Background: `bg-muted/50` or transparent
|
|
217
|
-
|
|
218
|
-
**Filter Sidebar (within content):**
|
|
219
|
-
|
|
220
|
-
Use for complex filtering (10+ filter options):
|
|
221
|
-
|
|
222
|
-
- Collapsible sections
|
|
223
|
-
- Checkbox groups
|
|
224
|
-
- Range sliders
|
|
225
|
-
- "Apply" and "Clear" actions at bottom
|
|
226
|
-
|
|
227
|
-
#### Data Table Patterns
|
|
190
|
+
#### Filter and Table Patterns
|
|
228
191
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
| Row selection | Checkbox in first column |
|
|
233
|
-
| Row actions | Overflow menu or icon buttons |
|
|
234
|
-
| Pagination | Bottom of table with page size selector |
|
|
235
|
-
| Empty state | Centered message in table body |
|
|
192
|
+
Filter bar/panel and data table implementation live in
|
|
193
|
+
[browse and filter](./browse-and-filter.md) — this dashboard's data-table variant uses that pattern
|
|
194
|
+
directly rather than a separate spec.
|
|
236
195
|
|
|
237
196
|
#### State Management
|
|
238
197
|
|
|
@@ -295,10 +254,12 @@ Use for complex filtering (10+ filter options):
|
|
|
295
254
|
|
|
296
255
|
The sidebar-navigation frame above is the canonical mid-fidelity dashboard: a row of KPI cards across the
|
|
297
256
|
top (4 columns on desktop), a primary chart below, and secondary charts beneath that. The data-table
|
|
298
|
-
variant swaps the chart stack for
|
|
299
|
-
content body.
|
|
257
|
+
variant swaps the chart stack for the [browse and filter](./browse-and-filter.md) pattern — same shell,
|
|
258
|
+
different content body.
|
|
300
259
|
|
|
301
260
|
## Related
|
|
302
261
|
|
|
303
262
|
- [Product Design](../design.md) - Sidebar Navigation layout
|
|
263
|
+
- [Browse and filter](./browse-and-filter.md) - Filter bar/panel and table specification, used by the data-table variant
|
|
264
|
+
- [Detail page](./detail-page.md) - Also reuses this pattern's Chart Container Pattern
|
|
304
265
|
- [Accessibility foundations](../../../accessibility/accessibility.md) - Color and contrast
|