Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
b9f9653
docs: synchronize canonical NikaS UI v2.2 mirror
NikaSir Sep 3, 2026
2107a9c
docs: synchronize navigation contract v1.2
NikaSir Sep 3, 2026
a0440db
docs: synchronize NikaS frontend delivery v2.2
NikaSir Sep 3, 2026
3966b2d
docs: point legacy standard name to NikaS UI v2.2
NikaSir Sep 3, 2026
f43ee92
docs: advertise NikaS UI v2.2 as current standard
NikaSir Sep 3, 2026
d2f9fad
docs: align integration template with NikaS UI v2.2
NikaSir Sep 3, 2026
0efcb1a
chore: publish NikaS UI v2.2 mirror profile
NikaSir Sep 3, 2026
e3655d1
test: enforce NikaS UI v2.2 mirror consistency
NikaSir Sep 3, 2026
ffea6eb
ci: validate synchronized NikaS UI v2.2 mirror
NikaSir Sep 3, 2026
57a752b
test: correct NikaS UI v2.2 validation messages
NikaSir Sep 3, 2026
ef44428
docs: archive obsolete pre-v2 panel reference
NikaSir Sep 3, 2026
b599589
docs: retire obsolete panel contract example
NikaSir Sep 3, 2026
bd36ae6
docs: mark obsolete panel shell implementation as archived
NikaSir Sep 3, 2026
f18ed45
docs: preserve v2.2 peer-lamp contract in synchronized mirror
NikaSir Sep 3, 2026
35eece4
docs: synchronize v2.2 frontend delivery guidance
NikaSir Sep 3, 2026
a7a3a3b
chore: align v2.2 mirror profile with canonical registry
NikaSir Sep 3, 2026
ab4c6a8
test: enforce complete NikaS UI v2.2 mirror contract
NikaSir Sep 3, 2026
3ab4bfd
Align frontend delivery icon geometry with NikaS UI v2.2
NikaSir Sep 3, 2026
e0cf6cf
Declare frontend delivery document in NikaS profile
NikaSir Sep 3, 2026
bf2d080
Guard frontend delivery icon geometry in CI
NikaSir Sep 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 3 additions & 53 deletions .github/workflows/standards-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,58 +13,8 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- uses: actions/setup-python@v5
with:
node-version: "22"
- name: Validate copy/adapt JavaScript
run: |
node --check reference/integration-panel-template/zoom-controller-reference.js
node --check reference/integration-panel-template/panel-shell.js
- name: Enforce NikaS UI standard v1.9
python-version: "3.13"
- name: Enforce synchronized NikaS UI v2.2 mirror
run: python scripts/check_nikas_ui_standard.py
- name: Validate v1.9 contract
run: |
python - <<'PY'
import json
from pathlib import Path

root = Path(".")
standard = (root / "NIKAS_SPECIALIZED_PANEL_UI_STANDARD.md").read_text(encoding="utf-8")
shell = (root / "reference/integration-panel-template/panel-shell.js").read_text(encoding="utf-8")
readme = (root / "reference/integration-panel-template/README.md").read_text(encoding="utf-8")
zoom = (root / "reference/integration-panel-template/zoom-controller-reference.js").read_text(encoding="utf-8")
navigation = (root / "docs/NIKAS_PANEL_NAVIGATION_CONTRACT.md").read_text(encoding="utf-8")
contract = json.loads((root / "reference/integration-panel-template/panel-contract.example.json").read_text(encoding="utf-8"))

for token in ("v1.9", "hass-toggle-menu", "12–25px", "Локально", "Данные актуальны", "GitHub Releases are not used", "exact form `UI vX.Y.Z`", "Focus-visible", "same click/keyboard handler"):
assert token in standard, token
for token in ('icon="mdi:menu"', "font-size:23px", "font-size:14px", "--mdc-icon-size:28px", 'class="canvas-viewport"', ".header-title:focus-visible", ".header-title:active", 'uiVersion: "1.0.0"', "uiVersionLine", "nikas.specialized.source_route_at.v1"):
assert token in shell, token
assert 'subtitle: "Device model · UI v' not in shell
assert "history.back(" not in shell
assert "second line is only `UI vX.Y.Z`" in readme
assert "<type/model> · UI" not in readme
assert "mdi:arrow-left" not in shell
assert shell.count('class="canvas-viewport"') == 1
assert "const DEFAULT_MIN = 0.75" in zoom
assert "const DEFAULT_MAX = 2.0" in zoom
assert "this.host?._selectedDeviceId || this.host?._selectedDevice" in zoom
assert contract["header"]["left_event"] == "hass-toggle-menu"
assert contract["header"]["title_action"] == "return_to_source_base_panel"
assert contract["header"]["browser_history_back_allowed"] is False
assert contract["header"]["title_second_line"] == "UI vX.Y.Z"
assert contract["header"]["title_plaque"]["reference"] == "LIDER"
assert contract["header"]["title_plaque"]["pressed_background_primary_mix_percent"] == 13
assert contract["header"]["title_plaque"]["pressed_border_primary_mix_percent"] == 42
assert contract["header"]["source_route_timestamp_key"] == "nikas.specialized.source_route_at.v1"
assert contract["header"]["allowed_source_routes"] == [
"/dashboard-house-v11/home",
"/dashboard-actions/home",
"/dashboard-infrastructure/overview",
]
assert contract["zoom"]["range_percent"] == [75, 200]
assert contract["rendering"]["routine_shadow_root_replacement"] is False
assert contract["connection_indicator"]["enabled"] is False
for token in ("/starline", "nikas.specialized.source_route_at.v1", "same click/keyboard handler", "blocking defect"):
assert token in navigation, token
PY
71 changes: 52 additions & 19 deletions .nikas-ui-standard.json
Original file line number Diff line number Diff line change
@@ -1,23 +1,34 @@
{
"version": "1.9",
"navigation_contract_version": "1.1",
"version": "2.2",
"navigation_contract_version": "1.2",
"canonical_repository": "NikaSir/ha-contract-generated-ui",
"standard_path": "NIKAS_SPECIALIZED_PANEL_UI_STANDARD.md",
"standard_sha256": "a31dc45499443f8fa43eaea1906fe3a793dffcb411b10cebcd3a3a205fbcef27",
"standard_sha256": "3b6cc750b08aa0d2a375d1430ea04ac68c90525a527d197b014abd96728d23d1",
"navigation_contract_path": "docs/NIKAS_PANEL_NAVIGATION_CONTRACT.md",
"navigation_contract_sha256": "c87dc760c0900701f6a807a35aba40e790f68f52c39f4579583598f697997e52",
"role": "specialized",
"artifact_kind": "reference",
"runtime_files": ["reference/integration-panel-template/panel-shell.js"],
"header_return": {
"button_marker": "id=\"return-source\"",
"version_marker": "`UI v${normalized}`",
"focus_marker": ".header-title:focus-visible",
"pressed_marker": ".header-title:active",
"explicit_precedence_marker": "safeReturnRoute(current.searchParams.get(\"return_to\")) || safeReturnRoute(current.searchParams.get(\"from\"))",
"capture_once_marker": "this._returnRoute = resolveReturnRoute(this)",
"timestamp_required_marker": "handedOffRaw !== null && handedOffAtRaw !== null",
"future_timestamp_rejection_marker": "age >= 0"
"navigation_contract_sha256": "d495eca80345b96976c168029a96146803f3d8195b6f6fc723827b601ffb578e",
"role": "mirror",
"shell_contract": {
"version": "2.1",
"host_boundary": "ha-panel",
"header_body_px": 60,
"peer_selector_px": 52,
"bottom_nav_body_px": 64,
"content_max_width_px": 1280,
"coordinate_tolerance_px": 2,
"scroll_boundary_guard": "capture-non-passive-touchmove",
"specialized_tab_range": [
3,
5
],
"viewport_matrix": {
"phone_portrait": "430x932",
"phone_landscape": "932x430",
"tablet_portrait": "768x1024",
"tablet_landscape": "1024x768",
"desktop": "1440x900"
}
},
"runtime_files": [],
"header_reference": {
"implementation": "S8 OMNI",
"implementation_source": "NikaSir/ha-s8-omni",
Expand All @@ -33,8 +44,8 @@
"title_plaque_reference": {
"implementation": "S8 OMNI",
"implementation_source": "NikaSir/ha-s8-omni",
"min_width": "min(290px,100%)",
"min_height_px": 44,
"width": "min(360px,100%)",
"height_px": 52,
"padding_px": "5 14",
"radius_px": 16,
"primary_background_mix_percent": 5,
Expand All @@ -57,5 +68,27 @@
"status_border_mix_percent": 30,
"neutral_border_mix_percent": 28,
"shadow": "0 4px 14px rgba(0,0,0,.055)"
}
},
"peer_device_status_lamp_reference": {
"implementation": "Stark SolarPower",
"visual_lineage": "StarLine",
"diameter_px": 9,
"halo_px": 3,
"states": {
"good": "green",
"warning": "orange",
"fault": "red",
"unknown": "gray"
},
"state_priority": [
"fault",
"warning",
"good",
"unknown"
],
"selection_is_independent": true,
"update_mode": "point-patch",
"accessible_status_required": true
},
"frontend_delivery_path": "SPECIALIZED_PANEL_FRONTEND_RELEASE_STANDARD.md"
}
20 changes: 10 additions & 10 deletions NIKAS_INTEGRATION_PANEL_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# NikaS Integration Panel Template v1.9
# NikaS Integration Panel Template v2.2

> **SUPERSEDED FOR SHELL GEOMETRY, HEADER NAVIGATION AND GESTURES:** use `NIKAS_SPECIALIZED_PANEL_UI_STANDARD.md` v1.9 and `NIKAS_PANEL_NAVIGATION_CONTRACT.md`. Domain composition guidance remains valid only when compatible with those documents.
> **SUPERSEDED FOR SHELL GEOMETRY, HEADER NAVIGATION AND GESTURES:** use `NIKAS_SPECIALIZED_PANEL_UI_STANDARD.md` v2.2 and `NIKAS_PANEL_NAVIGATION_CONTRACT.md`. Domain composition guidance remains valid only when compatible with those documents.

**Status:** Required reference implementation
**Primary target:** iPhone Pro Max, portrait
Expand Down Expand Up @@ -55,7 +55,7 @@ Rules:
- title is geometrically centered on the viewport;
- first line is the human application name;
- second line contains only `UI vX.Y.Z`; type, model and context text are prohibited there;
- the whole title is the sole standard return button and copies the exact LIDER plaque geometry, surface, pressed and focus-visible states from the v1.9 standard;
- the whole title is the sole standard return button and copies the exact LIDER plaque geometry, surface, pressed and focus-visible states from the v2.2 standard;
- first/second lines are `23/14px`; narrow fallback is `21/13px`;
- decorative brand/device icon is not placed next to the title;
- right zone contains at most one primary global action, normally Refresh, plus overflow only when genuinely needed.
Expand All @@ -64,8 +64,9 @@ Rules:

| Application | Parent |
| --- | --- |
| ZONT | `/dashboard-house-v11/home` |
| StarLine | `/dashboard-house-v11/home` |
| Access | `/dashboard-house-v13/home` |
| ZONT | `/dashboard-house-v13/home` |
| StarLine | `/dashboard-house-v13/home` |
| HO-SC-8W irrigation | `/dashboard-actions/home` |
| S8 OMNI | `/dashboard-actions/home` |
| Keenetic Hero 4G+ | `/dashboard-infrastructure/overview` |
Expand Down Expand Up @@ -181,7 +182,7 @@ Primary navigation is always:
- outside the content scroll region;
- 3–5 primary destinations;
- icon + short label;
- `ha-icon` MDI glyph at 28 px and label at 12 px/700;
- `ha-icon` MDI glyph at 26 px and label at 12 px/700;
- active state highlighted inside its shared cell.

Floating/pill navigation with side or bottom gaps is non-conforming.
Expand Down Expand Up @@ -240,16 +241,15 @@ No specialized panel may import this repository or another integration at runtim

## 14. Reference implementation

The code template lives under:
The canonical build-time source kit lives in `NikaSir/ha-contract-generated-ui` under:

```text
templates/integration-panel-v1/
templates/shell_v2/nikas-specialized-shell.js
```

It provides:

- `panel-shell-reference.js` — stable shell/reference component designed to be concatenated with the copied v1.9 zoom controller into one autonomous bundle;
- `zoom-controller-reference.js` — the copy/adapt v1.9 gesture controller; concatenate it into the integration-owned production bundle;
- `nikas-specialized-shell.js` — canonical host-bound Shell v2.2 source kit, vendored at build time into the integration-owned production bundle;
- `panel-contract.example.json` — machine-readable metadata example;
- `README.md` — adoption checklist.

Expand Down
Loading
Loading