This is an automated email from the ASF dual-hosted git repository.

rfellows pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new 8603aa88cb2 NIFI-16096 DESIGN.md standard for agents (#11412)
8603aa88cb2 is described below

commit 8603aa88cb2afdd1e2baf5d62351c14adb018441
Author: Scott Aslan <[email protected]>
AuthorDate: Tue Jul 14 16:26:18 2026 -0400

    NIFI-16096 DESIGN.md standard for agents (#11412)
    
    * NIFI-16096 DESIGN.md standard for agents
    
    * remove DESIGN.md from RAT check
---
 nifi-frontend/pom.xml                           |   1 +
 nifi-frontend/src/main/frontend/.prettierignore |   5 +
 nifi-frontend/src/main/frontend/DESIGN.md       | 375 ++++++++++++++++++++++++
 3 files changed, 381 insertions(+)

diff --git a/nifi-frontend/pom.xml b/nifi-frontend/pom.xml
index b1e5de0584a..5ecdcbfdc42 100644
--- a/nifi-frontend/pom.xml
+++ b/nifi-frontend/pom.xml
@@ -430,6 +430,7 @@
                         <exclude>src/main/frontend/.editorconfig</exclude>
                         <exclude>src/main/frontend/.build.env</exclude>
                         <exclude>src/main/frontend/README.md</exclude>
+                        <exclude>src/main/frontend/DESIGN.md</exclude>
                         <exclude>src/main/frontend/.prettierrc</exclude>
                         <exclude>src/main/frontend/.prettierignore</exclude>
                         <exclude>src/main/frontend/.npmrc</exclude>
diff --git a/nifi-frontend/src/main/frontend/.prettierignore 
b/nifi-frontend/src/main/frontend/.prettierignore
index 15e28a75355..74e9a9f9a9d 100644
--- a/nifi-frontend/src/main/frontend/.prettierignore
+++ b/nifi-frontend/src/main/frontend/.prettierignore
@@ -29,6 +29,11 @@ npm-debug.log
 **/nfel.ts
 **/nfel.terms.ts
 
+# Markdown files with YAML front matter — prettier corrupts indentation in
+# the YAML block (--- delimiters are not recognized as code fences).
+DESIGN.md
+.cursor/**/*.md
+
 # Theme
 src/assets/themes/*
 src/styles.scss
diff --git a/nifi-frontend/src/main/frontend/DESIGN.md 
b/nifi-frontend/src/main/frontend/DESIGN.md
new file mode 100644
index 00000000000..4fa760e2e1e
--- /dev/null
+++ b/nifi-frontend/src/main/frontend/DESIGN.md
@@ -0,0 +1,375 @@
+# Regenerate when the NiFi color palette or component theming changes.
+# Color values sourced from libs/shared/src/assets/themes/material.scss.
+# Structural values (component radii) from 
libs/shared/src/assets/themes/components/_*.scss.
+---
+name: Apache NiFi
+description: >
+  Default Angular Material MD3 with NiFi-specific teal palette and canvas 
tokens.
+  Values sourced from libs/shared/src/assets/themes/material.scss and
+  components/_*.scss.
+
+colors:
+  primary: "#004849"
+  primary_container: "#e3e3e3"
+  on_primary: "#ffffff"
+  secondary: "#abbdc5"
+  secondary_container: "#cbd8dd"
+  background: "#fafafa"
+  surface: "#ffffff"
+  surface_dim: "#e3e3e3"
+  surface_low: "#fafafa"
+  surface_container: "#f4f4f4"
+  surface_high: "#e3e3e3"
+  surface_highest: "#e3e3e3"
+  text_primary: "#303030"
+  text_secondary: "#666666"
+  text_on_primary: "#ffffff"
+  border: "#d8d8d8"
+  border_variant: "#d8d8d8"
+  success: "#31975b"
+  success_bg: "#bdf8e9"
+  error: "#ba554a"
+  error_variant: "#eb7071"
+  caution: "#cf9338"
+  neutral: "#666666"
+  disabled: "#d8d8d8"
+  canvas_bg: "#e5ebed"
+  canvas_banner: "#12121214"
+  canvas_odd_row: "#12121206"
+  canvas_even_row: "#fafafa"
+
+typography:
+  body-sm:
+    fontFamily: Inter
+    fontSize: 12px
+    fontWeight: 400
+  body:
+    fontFamily: Inter
+    fontSize: 14px
+    fontWeight: 400
+  body-lg:
+    fontFamily: Inter
+    fontSize: 16px
+    fontWeight: 400
+  title:
+    fontFamily: Inter
+    fontSize: 16px
+    fontWeight: 500
+  headline:
+    fontFamily: Inter
+    fontSize: 24px
+    fontWeight: 400
+
+spacing:
+  xs: 4px
+  sm: 8px
+  md: 12px
+  lg: 16px
+  xl: 24px
+  "2xl": 32px
+
+rounded:
+  sm: 4px
+  md: 6px
+  lg: 12px
+
+components:
+  button:
+    backgroundColor: "{colors.primary}"
+    textColor: "{colors.text_on_primary}"
+    rounded: "{rounded.sm}"
+  form-field:
+    rounded: "{rounded.sm}"
+  dialog:
+    rounded: "{rounded.md}"
+  card:
+    rounded: "{rounded.lg}"
+  canvas:
+    backgroundColor: "{colors.canvas_bg}"
+---
+
+# Apache NiFi Frontend — Design System Reference
+
+> **Repository**: `nifi` (Apache NiFi)  
+> **Design spec**: Angular Material MD3 + NiFi-specific canvas tokens  
+> **Implementation stack**: Angular + Angular Material (MD3) + Tailwind CSS v4 
+ Font Awesome 4.7
+
+This document describes the visual identity and design language of the Apache 
NiFi frontend. It is the source of truth for AI coding agents performing UI 
work in this repository.
+
+---
+
+## Overview
+
+The NiFi frontend implements **Angular Material Design 3** with a custom color 
palette tuned to the NiFi brand: a teal primary (`#004849`), grey neutrals, and 
a distinct canvas environment for the flow designer.
+
+Theming is done by mapping NiFi's palette hex values to Angular Material's 
`--md-ref-palette-*` system in `libs/shared/src/assets/themes/material.scss`, 
then calling `mat.theme-overrides()`. On top of this, NiFi-specific `--nf-*` 
CSS custom properties carry canvas and status semantics that have no Angular 
Material equivalent.
+
+---
+
+## Design Language
+
+### Brand Voice (Visual)
+- **Information-dense**: The flow canvas is the primary interface; every 
chrome element should feel subordinate to the flow graph.
+- **Functional clarity**: Teal (`#004849`) communicates action; greys 
communicate structure; status colors are strictly semantic.
+- **Professional, minimal**: Standard MD3 interaction patterns (ripples, state 
layers) are preserved throughout.
+
+### Visual Principles
+- **Teal-on-white primary palette** — `#004849` teal drives all primary 
actions against white/near-white surfaces.
+- **Grey neutrals for structure** — borders (`#d8d8d8`), surfaces (`#f4f4f4`), 
and disabled states use the neutral scale.
+- **Canvas vs chrome** — the flow canvas uses `#e5ebed` background and 
`--nf-*` CSS variables distinct from the app chrome.
+
+---
+
+## Colors
+
+### MD3 Palette
+
+All component colors come from Angular Material's MD3 system token layer 
(`--mat-sys-*`), populated by `mat.theme-overrides()` in `material.scss` using 
the palette values defined on `:root`. The palette is fully overridden under 
`.darkMode {}` on `<body>`.
+
+### Light Mode Key Values
+
+| Semantic role | CSS variable | Hex value |
+|---------------|-------------|-----------|
+| Primary | `--mat-sys-primary` | `#004849` |
+| Primary container | `--mat-sys-primary-container` | `#e3e3e3` |
+| Background | `--mat-sys-background` | `#fafafa` |
+| Surface | `--mat-sys-surface` | `#ffffff` |
+| On-surface | `--mat-sys-on-surface` | `#303030` |
+| Outline | `--mat-sys-outline` | `#d8d8d8` |
+| Error | `--mat-sys-error` | `#ba554a` |
+
+### NiFi-Specific Tokens
+
+Canvas and status colors use `--nf-*` variables defined in `material.scss`. 
Use these for all canvas and status work:
+
+| Token | Light value | Purpose |
+|-------|------------|---------|
+| `--nf-canvas-background` | `#e5ebed` | Flow canvas drawing surface |
+| `--nf-success-default` | `#31975b` | Running processor / success state |
+| `--nf-success-default-background` | `#bdf8e9` | Success state background |
+| `--nf-caution-default` | `#cf9338` | Caution / warning state |
+| `--nf-error-variant` | `#eb7071` | Stopped-run status color |
+| `--nf-neutral` | `#666666` | Neutral status |
+| `--nf-disabled` | `#d8d8d8` | Disabled elements |
+| `--nf-odd` | `#12121206` | Alternating table row (odd) |
+| `--nf-even` | `#fafafa` | Alternating table row (even) |
+| `--nf-banner` | `#12121214` | Banner / highlighted row |
+
+### Dark Mode
+
+Under `.darkMode {}` on `<body>`, the palette variables are fully overridden:
+
+| Role | Dark value |
+|------|-----------|
+| Primary | `#cbd8dd` |
+| Background | `#121212` |
+| Surface | `#303030` |
+| On-surface | `#e3e3e3` |
+| Canvas bg | `#0d1411` |
+
+---
+
+## Typography
+
+**Font family**: Inter (declared via `--md-ref-typeface-plain: Inter` and 
`--md-ref-typeface-brand: Inter`).
+
+NiFi uses Angular Material's MD3 default type scale:
+
+| MD3 role | Size | Weight | NiFi use |
+|----------|------|--------|---------|
+| `body-medium` | 14px | 400 | Default text, property values |
+| `body-large` | 16px | 400 | Form inputs |
+| `label-medium` | 12px | 500 | Table headers, labels |
+| `title-medium` | 16px | 500 | Card titles, dialog headings |
+| `headline-small` | 24px | 400 | Page headings |
+
+Access via Angular Material typography system — do not hardcode font sizes.
+
+---
+
+## Layout
+
+NiFi uses **Tailwind CSS v4** for layout and spacing in templates:
+
+| Tailwind class | Value | Common use |
+|---------------|-------|-----------|
+| `gap-1` | 4px | Tight icon-label gap |
+| `gap-2` | 8px | Standard item gap |
+| `gap-3` | 12px | Form field spacing |
+| `gap-4` | 16px | Section padding |
+| `gap-6` | 24px | Dialog / card padding |
+| `p-2` | 8px | Button padding |
+| `p-4` | 16px | Panel padding |
+
+### Layout Rules
+- Use Tailwind flex/grid utilities — avoid custom spacing SCSS.
+- Host element layout via `@Component host: { class: '...' }` — never `:host { 
display: }`.
+- Fill height with `flex-1 min-h-0` — never `height: calc(100vh - Npx)`.
+
+---
+
+## Shapes
+
+| Surface type | Radius | Source |
+|-------------|--------|--------|
+| Buttons | 4px | `filled-container-shape: 4px` in `_button.scss` |
+| Inputs | 4px | MD3 default extra-small (no override in `_form-field.scss`) |
+| Dialogs | 6px | `container-shape: 6px` in `_dialog.scss` |
+| Cards | 12px | MD3 default medium (no override in `_card.scss`) |
+
+---
+
+## Components
+
+### Buttons
+
+NiFi uses the full Angular Material button directive set:
+
+| Directive | NiFi use |
+|-----------|---------|
+| `mat-flat-button` | Primary / confirm actions (filled teal) |
+| `mat-button` | Cancel / dismiss / secondary text actions |
+| `mat-stroked-button` | Outlined secondary actions |
+| `mat-icon-button` | Icon-only actions |
+
+```html
+<!-- Primary -->
+<button mat-flat-button color="primary">Start</button>
+
+<!-- Cancel -->
+<button mat-button mat-dialog-close>Cancel</button>
+
+<!-- Icon-only -->
+<button mat-icon-button>
+  <i class="fa fa-pencil"></i>
+</button>
+```
+
+### Icons
+
+NiFi uses **Font Awesome 4.7** (`<i class="fa fa-*">`).
+
+```html
+<i class="fa fa-play"></i>    <!-- start -->
+<i class="fa fa-stop"></i>    <!-- stop -->
+<i class="fa fa-trash"></i>   <!-- delete -->
+<i class="fa fa-search"></i>  <!-- search -->
+<i class="fa fa-cog"></i>     <!-- settings -->
+```
+
+### Spinner
+
+Use `NifiSpinnerDirective` (from `@nifi/shared`):
+
+```html
+<div [nifiSpinner]="isLoading">content</div>
+```
+
+### Forms
+
+Angular Material form fields with `appearance="outline"`:
+
+```html
+<mat-form-field appearance="outline">
+  <mat-label>Label</mat-label>
+  <input matInput />
+</mat-form-field>
+```
+
+Style via `mat.form-field-overrides()` in `_app.scss` using `--nf-*` and 
`--mat-sys-*` tokens — never with hardcoded hex in component SCSS.
+
+---
+
+## Code Editor Colors
+
+NiFi includes CodeMirror 6 for property expression editing. Editor theme 
tokens are defined in `material.scss`.
+
+### Light mode syntax highlighting
+
+| Token | Value | Language role |
+|-------|-------|--------------|
+| `--editor-keyword` | `#085bd7` | Keywords |
+| `--editor-string` | `#860112` | String literals |
+| `--editor-function` | `#087959` | Functions |
+| `--editor-comment` | `#5d6a85` | Comments |
+| `--editor-type` | `#b67901` | Types / control |
+| `--editor-variable-name` | `#002c6e` | Variables |
+| `--editor-selected-background` | `#d6e6ff` | Selection |
+
+---
+
+## Implementation Notes (Angular)
+
+### Technology Stack
+
+| Concern | Technology | Notes |
+|---------|-----------|-------|
+| Framework | Angular (NgModule + standalone) | Mix of NgModule feature 
modules and standalone components |
+| Component library | Angular Material MD3 | Standard MD3 palette |
+| Icons | Font Awesome 4.7 | `<i class="fa fa-*">` |
+| CSS | Tailwind CSS v4 + Angular Material SASS | No third-party token 
packages |
+| State management | NgRx | Actions, effects, selectors, reducers |
+| Build | Nx monorepo | `nx run <project>:<target>` |
+| Routing | Hash routing (`useHash: true`) | |
+
+### Key File Locations
+
+| File | Purpose |
+|------|---------|
+| `libs/shared/src/assets/themes/material.scss` | MD3 palette + 
`mat.theme-overrides()` + `--nf-*` definitions |
+| `libs/shared/src/assets/styles/_app.scss` | Global styles, 
`generate-material-theme()` mixin |
+| `apps/nifi/src/app/` | Main app — pages, state, services |
+| `libs/shared/src/` | Shared library (`@nifi/shared`) |
+
+### Import Alias
+
+Always use `@nifi/shared` — never a relative path to the shared library:
+
+```typescript
+import { NifiSpinnerDirective } from '@nifi/shared';
+```
+
+### Theming Pattern
+
+```scss
+// material.scss
+:root {
+  --md-ref-palette-primary-40: #004849;
+
+  @include mat.theme-overrides((
+    primary: var(--md-ref-palette-primary-40),
+    // ...
+  ));
+}
+
+.darkMode {
+  --md-ref-palette-primary-40: #cbd8dd;
+
+  @include mat.theme-overrides((
+    primary: var(--md-ref-palette-primary-40),
+    // ...
+  ));
+}
+```
+
+Component-specific overrides go in `_app.scss` via `mat.*-overrides()` mixins:
+
+```scss
+@include mat.button-overrides((
+  filled-container-color: var(--mat-sys-primary),
+));
+```
+
+### No Hardcoded Colors in Components
+
+Use `--mat-sys-*` and `--nf-*` CSS custom properties in component SCSS — never 
hardcode hex values:
+
+```scss
+// ✅ Correct
+color: var(--mat-sys-on-surface);
+background-color: var(--nf-canvas-background);
+
+// ❌ Wrong
+color: #303030;
+background-color: #e5ebed;
+```

Reply via email to