@kerfjs/ui 5.0.0-beta.18 → 5.0.0-beta.21
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/README.md +114 -3
- package/ai/application-ui-diagnostic-ids-v1.json +92 -0
- package/ai/application-ui-profile-sync.cjs +529 -0
- package/ai/application-ui-profile.d.mts +1 -0
- package/ai/application-ui-profile.d.ts +102 -0
- package/ai/application-ui-profile.defaults.json +41 -0
- package/ai/application-ui-profile.mjs +626 -0
- package/ai/application-ui-profile.schema.json +130 -0
- package/ai/catalog-authoring.json +25 -0
- package/ai/catalog-authoring.schema.json +61 -0
- package/ai/compile-time-contracts-v1.json +101 -0
- package/ai/compile-time-contracts-v1.schema.json +49 -0
- package/ai/component-catalog-extension-v2.d.ts +7 -0
- package/ai/component-catalog-extension-v2.schema.json +7 -0
- package/ai/component-catalog-v2-overrides.json +326 -0
- package/ai/component-catalog-v2.d.ts +67 -0
- package/ai/component-catalog-v2.json +4441 -0
- package/ai/component-catalog-v2.schema.json +246 -0
- package/ai/component-catalog.json +150 -6
- package/ai/public-api-signatures-v1.md +294 -64
- package/ai/skill.md +41 -5
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/analyzer/cli.mjs +46 -0
- package/analyzer/index.d.mts +45 -0
- package/analyzer/index.mjs +743 -0
- package/analyzer/report.schema.json +66 -0
- package/dist/browser/pane.js +3 -0
- package/dist/browser/sunken-panel.js +3 -0
- package/dist/catalog-resources.d.ts +34 -0
- package/dist/catalog-resources.js +22 -0
- package/dist/catalog-resources.js.map +1 -0
- package/dist/catalog.d.ts +21 -3
- package/dist/catalog.js +239 -210
- package/dist/catalog.js.map +1 -1
- package/dist/{chunk-ZK2G3VR5.js → chunk-5VTB2BKP.js} +1 -1
- package/dist/chunk-5VTB2BKP.js.map +1 -0
- package/dist/{chunk-S3HKPI7I.js → chunk-7KEUJIIC.js} +1 -1
- package/dist/chunk-7KEUJIIC.js.map +1 -0
- package/dist/{chunk-NVWXKU37.js → chunk-AASLYRGE.js} +1 -1
- package/dist/chunk-AASLYRGE.js.map +1 -0
- package/dist/{chunk-ENVTNLYC.js → chunk-CN2XNTAM.js} +6 -6
- package/dist/chunk-CN2XNTAM.js.map +1 -0
- package/dist/{chunk-QIRXYKCE.js → chunk-DSNIYOZ3.js} +3 -2
- package/dist/chunk-DSNIYOZ3.js.map +1 -0
- package/dist/chunk-JRKSK2HX.js +79 -0
- package/dist/chunk-JRKSK2HX.js.map +1 -0
- package/dist/{chunk-U5IFGQCD.js → chunk-K57KRAOV.js} +1 -1
- package/dist/chunk-K57KRAOV.js.map +1 -0
- package/dist/{chunk-ZVI5YST2.js → chunk-M7JBER5U.js} +1 -1
- package/dist/chunk-M7JBER5U.js.map +1 -0
- package/dist/{chunk-43FUQH35.js → chunk-OHU6CI22.js} +2 -2
- package/dist/{chunk-43FUQH35.js.map → chunk-OHU6CI22.js.map} +1 -1
- package/dist/{chunk-4TRDV6RL.js → chunk-OZWU5ZPZ.js} +1 -1
- package/dist/chunk-OZWU5ZPZ.js.map +1 -0
- package/dist/{chunk-JTHUXDN2.js → chunk-RYRIFZCT.js} +3 -3
- package/dist/chunk-RYRIFZCT.js.map +1 -0
- package/dist/{chunk-6ETZKKAE.js → chunk-VLYV65LK.js} +1 -1
- package/dist/chunk-VLYV65LK.js.map +1 -0
- package/dist/chunk-W4CXQYSG.js +23 -0
- package/dist/chunk-W4CXQYSG.js.map +1 -0
- package/dist/{chunk-S3PCZ7NV.js → chunk-W7YD6E4N.js} +1 -1
- package/dist/chunk-W7YD6E4N.js.map +1 -0
- package/dist/index.d.ts +6 -4
- package/dist/index.js +14 -12
- package/dist/list-header.d.ts +29 -8
- package/dist/list-header.js +1 -1
- package/dist/nav-stack.js +1 -1
- package/dist/pane.d.ts +49 -0
- package/dist/pane.js +4 -0
- package/dist/pane.js.map +1 -0
- package/dist/panel-header.d.ts +9 -3
- package/dist/panel-header.js +1 -1
- package/dist/segmented-control.d.ts +6 -6
- package/dist/segmented-control.js +1 -1
- package/dist/select.d.ts +10 -4
- package/dist/select.js +1 -1
- package/dist/split-view.js +2 -2
- package/dist/state-banner.d.ts +3 -2
- package/dist/state-banner.js +1 -1
- package/dist/styles/catalog.css +6 -6
- package/dist/styles/layout.css +2 -20
- package/dist/styles/pane.css +62 -0
- package/dist/styles/segmented-control.css +3 -7
- package/dist/styles/sunken-panel.css +18 -0
- package/dist/sunken-panel.d.ts +16 -0
- package/dist/sunken-panel.js +3 -0
- package/dist/sunken-panel.js.map +1 -0
- package/dist/tab-bar.d.ts +3 -2
- package/dist/tab-bar.js +1 -1
- package/dist/tab-scaffold.d.ts +6 -6
- package/dist/tab-scaffold.js.map +1 -1
- package/dist/token-search-field.d.ts +25 -9
- package/dist/token-search-field.js +1 -1
- package/dist/toolbar-control-group.d.ts +9 -5
- package/dist/toolbar-control-group.js +1 -1
- package/dist/toolbar-text.d.ts +10 -11
- package/dist/toolbar-text.js +1 -1
- package/dist/wire-tab-bars.d.ts +5 -2
- package/dist/wire-tab-bars.js +1 -1
- package/dist/wire-token-search-fields.d.ts +11 -6
- package/dist/wire-token-search-fields.js +1 -1
- package/docs/catalog.md +186 -67
- package/docs/component-contract.md +102 -5
- package/docs/component-selection.md +9 -5
- package/docs/design-philosophy.md +2 -4
- package/docs/examples/application-ui-profile.json +60 -0
- package/docs/examples/component-catalog-extension-v2.json +81 -0
- package/docs/layout.md +42 -23
- package/docs/sunken-panel.md +43 -0
- package/docs/type-contracts.md +99 -0
- package/docs/ui-analyzer.md +81 -0
- package/docs/ui-doctor.md +77 -0
- package/docs/ui-evaluator.md +122 -0
- package/doctor/cli.mjs +115 -0
- package/doctor/config.schema.json +68 -0
- package/doctor/index.d.mts +116 -0
- package/doctor/index.mjs +1256 -0
- package/doctor/report.schema.json +118 -0
- package/evaluator/cli.mjs +89 -0
- package/evaluator/index.d.mts +90 -0
- package/evaluator/index.mjs +1138 -0
- package/evaluator/report.schema.json +152 -0
- package/llms.txt +40 -3
- package/package.json +66 -8
- package/ux-demo/recipes/compact-toolbar.tsx +2 -2
- package/ux-demo/recipes/composer-form.tsx +1 -1
- package/dist/chunk-4TRDV6RL.js.map +0 -1
- package/dist/chunk-6ETZKKAE.js.map +0 -1
- package/dist/chunk-ENVTNLYC.js.map +0 -1
- package/dist/chunk-JTHUXDN2.js.map +0 -1
- package/dist/chunk-NVWXKU37.js.map +0 -1
- package/dist/chunk-QIRXYKCE.js.map +0 -1
- package/dist/chunk-S3HKPI7I.js.map +0 -1
- package/dist/chunk-S3PCZ7NV.js.map +0 -1
- package/dist/chunk-U5IFGQCD.js.map +0 -1
- package/dist/chunk-ZK2G3VR5.js.map +0 -1
- package/dist/chunk-ZVI5YST2.js.map +0 -1
package/ai/skill.md
CHANGED
|
@@ -7,11 +7,17 @@ kerf-ui-skill-version: 1.36.0
|
|
|
7
7
|
# Building with @kerfjs/ui
|
|
8
8
|
|
|
9
9
|
Read `../docs/component-selection.md` first, then `./component-catalog.json`,
|
|
10
|
-
`./
|
|
10
|
+
`./component-catalog-v2.json`,
|
|
11
|
+
`./public-api-signatures-v1.md`, `./compile-time-contracts-v1.json`,
|
|
12
|
+
`./webawesome-jsx-signatures-v1.md`,
|
|
11
13
|
`../docs/recipes.md`, `../README.md`,
|
|
12
14
|
`../docs/component-contract.md`, and `../docs/accessibility.md` before changing
|
|
13
15
|
a consuming interface. Use the signature snapshot for exact props, callbacks,
|
|
14
16
|
return values, and supported import paths; do not infer them from examples.
|
|
17
|
+
Treat each `KUI-T###` contract as an exact declaration guarantee, including its
|
|
18
|
+
documented dynamic-data widening. Do not extend those diagnostics to child
|
|
19
|
+
markup, live DOM relationships, disposer invocation, or other conditions that
|
|
20
|
+
TypeScript cannot prove from one call.
|
|
15
21
|
Read `../docs/webawesome-theme.md` when using Web Awesome components or changing
|
|
16
22
|
shared theme tokens.
|
|
17
23
|
|
|
@@ -20,9 +26,32 @@ conforms to `./component-catalog-extension.schema.json`. Treat its entries as a
|
|
|
20
26
|
second, package-qualified input beside `./component-catalog.json`: search both,
|
|
21
27
|
preserve their source identity, and use the shared `geometry` vocabulary across
|
|
22
28
|
their composition boundary. When a consuming project has reusable visual
|
|
23
|
-
components
|
|
24
|
-
|
|
25
|
-
|
|
29
|
+
components, prefer its generated `component-catalog-v2.json`. A package
|
|
30
|
+
scaffolded by `create-kerf-component` owns the decisions in
|
|
31
|
+
`kerf.components.json`; run `npm run catalog:check` before using its output. If
|
|
32
|
+
no generated extension exists, start from the checked examples and require the
|
|
33
|
+
author to supply missing semantic and geometry decisions; never infer them from
|
|
34
|
+
rendered appearance.
|
|
35
|
+
|
|
36
|
+
Use v1 for selection, delivery, and compatibility. Use v2 when evaluating
|
|
37
|
+
composition. Join catalogs by `key` (`package:id`), never bare `id`. Treat
|
|
38
|
+
`generated-permissive-default` composition provenance as unknown/allowed, not
|
|
39
|
+
as a prohibition. Emit a diagnostic only after mechanically establishing its
|
|
40
|
+
exact `when` condition; subjective guidance stays prose. App entries use the
|
|
41
|
+
v2 extension schema and retain their own package identity across Kerf edges.
|
|
42
|
+
|
|
43
|
+
Before selecting for an application, call the Node-side discovery API in
|
|
44
|
+
`./application-ui-profile.mjs` (or implement its documented filename/order)
|
|
45
|
+
from the workspace root and target directory. Apply package defaults first,
|
|
46
|
+
then workspace policy, then directory-local profiles parent-to-child. Honor the
|
|
47
|
+
resolved profile's preferences, theme/density allowlists, tokens, layout, and
|
|
48
|
+
responsive policy. Treat only its exact, narrow exception targets as waived;
|
|
49
|
+
never generalize an exception to siblings or infer product data into a profile.
|
|
50
|
+
Surface every returned source file + JSON-path diagnostic before generating UI.
|
|
51
|
+
Each layer is checked against its then-effective catalogs; later overrides do
|
|
52
|
+
not excuse broken catalogs or stale references in a parent layer. Synchronous
|
|
53
|
+
ESLint integrations use `./application-ui-profile-sync.cjs` and surface any
|
|
54
|
+
failure as `KUI-L090`.
|
|
26
55
|
|
|
27
56
|
Choose from the need, not from visual resemblance:
|
|
28
57
|
|
|
@@ -54,6 +83,13 @@ primitives and semantic ownership; replace application state, policy, and copy.
|
|
|
54
83
|
|
|
55
84
|
The concise human decision matrix is in [`component-selection.md`](../docs/component-selection.md). For exhaustive tool retrieval, load [`component-catalog.json`](./component-catalog.json), the canonical metadata for every public component/helper, composition, and supported Web Awesome entry. Its `geometry` object identifies who owns margin, border, and padding; use that contract to avoid double-insetting or wrapping an already complete surface. Use its linked current recipes instead of inferring behavior from CSS.
|
|
56
85
|
|
|
86
|
+
Before presenting an integration as complete, run `kerf-ui-analyze --root <workspace>`.
|
|
87
|
+
Treat its error diagnostics as required fixes and review each review-level finding
|
|
88
|
+
against the resolved application profile. Use `--format sarif` in code-scanning
|
|
89
|
+
workflows and `--fail-on-review` when the project requires a zero-review budget.
|
|
90
|
+
Do not suppress a finding in source; add only a narrowly targeted, justified
|
|
91
|
+
profile exception when the deviation is deliberate.
|
|
92
|
+
|
|
57
93
|
Hard rules:
|
|
58
94
|
|
|
59
95
|
1. Import visual components from explicit JavaScript subpaths. In CSS-aware browser builds each subpath brings in its own reachable CSS, including UI subcomponents, while unrelated CSS remains out. The root barrel and `@kerfjs/ui/unstyled` are CSS-free; pair the root barrel with `styles.css` only when the complete layer is intentional. Manual CSS subpaths remain available for custom pipelines.
|
|
@@ -67,7 +103,7 @@ Hard rules:
|
|
|
67
103
|
9. Use controlled `SegmentedControl` for a small exclusive choice set. Select `appearance="toolbar"` when nesting it inside `ToolbarControlGroup`; use rounded or pill shapes for standalone contexts. Handle its action, update `value`, keep meaningful choice labels, and preserve every enabled native button in sequential Tab order.
|
|
68
104
|
10. Compose `AppTab` inside controlled `TabBar`; call `wireTabBars()` once and retain its disposer. It owns same-bar drag mechanics, including proximity-based horizontal edge autoscroll, while the app applies `onReorder` and owns order, selection, panels, close policy, routing, and persistence. Arrow/Home/End select on move by default; pass `activation: 'manual'` (or `TabBar activation="manual"` per strip) so arrow keys move focus only and the user selects with Enter/Space/click — use it when selecting a tab is a heavy action. Use runtime-filtered `rootAttributes` for domain metadata and keep an optional `closeIcon` decorative and noninteractive.
|
|
69
105
|
11. Use token-controlled `TokenSearchField` when free text and removable structured filters share one editor. Editable text stays DOM-owned between token changes. The leading icon, first text line, clear action, and trailing slot share one fixed row when content wraps. The app owns parsing and suggestions; call `readTokenSearchField()` on input, empty `textContent` on clear, use `placeTokenSearchCaret()` after explicit controlled focus changes, and call `wireTokenSearchFields()` once so Enter submits without inserting a line break and keyboard chip deletion restores focus plus the text-relative caret after controlled replacement. Enable `collapsible` for an animated iconic closed state, standalone or inside `ToolbarControlGroup`; the field keeps text or tokens expanded, and `wireTokenSearchFields()` manages the transient expand/collapse/focus by default (activate to reveal + focus, Escape or empty blur to collapse). Bind the field's `expanded` to the returned handle's `expanded(id)` signal or adopt your own via `collapsible.signals`; opt a behavior out only when the app must own it. Do not hand-roll the open handler, the focusout collapse, or a clear-button mousedown guard — the helper owns them. For real-app adoption it also provides a focusout keep-open exception (`data-token-search-keep-open` regions or `collapsible.keepOpenOn(target)`, so a sibling suggestions/date/help surface does not collapse an empty field), opt-in atomic-chip keyboard (`keyboard`: Backspace/Delete remove the adjacent chip via `onRemoveToken`, ArrowRight moves the caret past a trailing chip), and an `onEdit({id, editor, event})` input callback (the `InputEvent` lets you gate on `inputType`/`data`) — reach for these instead of re-adding hand-rolled keydown/input handlers around the field.
|
|
70
|
-
12. Demo work uses public production component subpaths and their browser-selected CSS. Give every public visual component its own category-grouped catalog route; list themed third-party components under a clearly labeled collapsible ecosystem section, with a focused route for each. Project
|
|
106
|
+
12. Demo work uses public production component subpaths and their browser-selected CSS. Give every public visual component its own category-grouped catalog route; list themed third-party components under a clearly labeled collapsible ecosystem section, with a focused route for each. For the complete focused/composition decision, `CatalogExample` / `CatalogExampleStack` row/group nesting, exact specimen selection, geometry-overlay legend and exclusions, skip-marker behavior, and metadata ownership, follow the single [Catalog demo authoring contract](../docs/catalog.md#catalog-demo-authoring-contract), discovered machine-readably through [`catalog-authoring.json`](./catalog-authoring.json). Never infer structure from private `kui-catalog-*` classes. Project each component's deterministic repository-relative demo source and existing documentation path so the detail can expose `View demo source` and `Read guidance` links without a runtime export; also derive first-party component implementation paths from their canonical browser imports, and label Web Awesome documentation as Kerf integration guidance. Declare direct `uses` relationships so `Used by` stays derivable, and theme shell chrome through the same semantic tokens as the stage instead of drawing a substitute. Enable `wireCatalog({ revealSelection: true })` for long desktop sidebars so controlled selections remain visible without moving focus; keep its default compact media guard unless compact scrolling is an explicit product behavior, and use `revealCatalogEntry` for an initial deep link.
|
|
71
107
|
13. The Web Awesome theme makes Tooltip and Popover arrowless by default. Keep that default unless a pointer materially clarifies the anchor; opt back in with `--wa-tooltip-arrow-size`, `--kui-wa-popover-arrow-size`, or a popover's public `--arrow-size`, and use `without-arrow` when local no-arrow intent should survive theme changes. Its non-field chrome uses `--kui-wa-control-inset` (8px controls/items), `--kui-wa-surface-margin` / `--kui-wa-surface-inset` (8px around/inside Accordion, Card, Details, Callout, and Include), and `--kui-wa-container-inset` (16px Tab Panel content); override those tiers instead of restyling individual parts. Checkbox and Radio Group option regions, the Color Picker trigger, and Slider's complete interactive region receive the shared 8px logical inline outer inset because those controls have no bordered field shell. Known Date field captions and bordered text-like field hints align with values at the 9px border-plus-padding inset. OTP Input's label uses the same uppercase xs/650 treatment as other field labels, and both its label and hint use that 9px inset.
|
|
72
108
|
14. Treat the complete Web Awesome catalog as support coverage, not a recommendation list. Its UX sidebar marks superseded and exceptional entries `Discouraged`. Consider Popup when it replaces custom anchored positioning. Prefer Kerf `Select` over direct Dropdown/Dropdown Item/Select/Option composition, `SegmentedControl` over Button Group, `TabBar` or `SegmentedControl` over Web Awesome Tabs, `LucideIcon` over Web Awesome Icon, and `ResizableRegion` over Split Panel. Use Tree/Tree Item, Animated Image, and Comparison only for a specific required behavior; avoid Zoomable Frame.
|
|
73
109
|
15. Build sidebars, main areas, inspectors, and dialogs from `@kerfjs/ui/layout.css`: an unpadded `.kui-pane`, optional `.kui-pane__toolbar`, one scrolling `.kui-pane__content`, and optional `.kui-pane__footer`. Add `.kui-content` for 24px major vertical separation and `.kui-content-item` for a child-owned 8px inline margin, 1px transparent-or-visible border, 8px padding, and 12px radius. Use the pill modifier for 22px. Do not pad pane shells or duplicate item geometry in wrappers.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Web Awesome JSX signatures for the UI authoring corpus
|
|
2
2
|
|
|
3
|
-
Generated from the emitted `@kerfjs/ui@5.0.0-beta.
|
|
3
|
+
Generated from the emitted `@kerfjs/ui@5.0.0-beta.21` declaration boundary. Import `@kerfjs/ui/webawesome` for type effects when authoring direct `wa-*` JSX. The module emits no runtime behavior and does not register custom elements.
|
|
4
4
|
|
|
5
5
|
```ts
|
|
6
6
|
import { KerfCustomElement } from 'kerfjs/jsx-runtime';
|
package/analyzer/cli.mjs
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import console from 'node:console';
|
|
4
|
+
import { writeFile } from 'node:fs/promises';
|
|
5
|
+
import { resolve } from 'node:path';
|
|
6
|
+
import process from 'node:process';
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
analyzeUiProject,
|
|
10
|
+
formatUiAnalysisSarif,
|
|
11
|
+
formatUiAnalysisText,
|
|
12
|
+
} from './index.mjs';
|
|
13
|
+
|
|
14
|
+
const args = process.argv.slice(2);
|
|
15
|
+
const take = (name) => {
|
|
16
|
+
const index = args.indexOf(name);
|
|
17
|
+
if (index < 0) return undefined;
|
|
18
|
+
const value = args[index + 1];
|
|
19
|
+
args.splice(index, 2);
|
|
20
|
+
return value;
|
|
21
|
+
};
|
|
22
|
+
const root = resolve(take('--root') ?? process.cwd());
|
|
23
|
+
const format = take('--format') ?? 'text';
|
|
24
|
+
const output = take('--output');
|
|
25
|
+
const profile = take('--profile');
|
|
26
|
+
const failOnReview = args.includes('--fail-on-review');
|
|
27
|
+
const paths = args.filter((argument) => !argument.startsWith('--'));
|
|
28
|
+
|
|
29
|
+
if (!['text', 'json', 'sarif'].includes(format)) {
|
|
30
|
+
console.error(`Unknown --format ${format}; expected text, json, or sarif.`);
|
|
31
|
+
process.exitCode = 2;
|
|
32
|
+
} else {
|
|
33
|
+
const report = await analyzeUiProject({ root, paths, profile });
|
|
34
|
+
const rendered =
|
|
35
|
+
format === 'text'
|
|
36
|
+
? formatUiAnalysisText(report)
|
|
37
|
+
: JSON.stringify(
|
|
38
|
+
format === 'sarif' ? formatUiAnalysisSarif(report) : report,
|
|
39
|
+
null,
|
|
40
|
+
2,
|
|
41
|
+
);
|
|
42
|
+
if (output) await writeFile(resolve(root, output), `${rendered}\n`);
|
|
43
|
+
else console.log(rendered);
|
|
44
|
+
if (report.summary.errors || (failOnReview && report.summary.review))
|
|
45
|
+
process.exitCode = 1;
|
|
46
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export type UiAnalysisSeverity = 'error' | 'review';
|
|
2
|
+
|
|
3
|
+
export interface UiAnalysisDiagnostic {
|
|
4
|
+
ruleId: `KUI-L${string}`;
|
|
5
|
+
severity: UiAnalysisSeverity;
|
|
6
|
+
message: string;
|
|
7
|
+
location: { file: string; line: number; column: number };
|
|
8
|
+
evidence?: unknown;
|
|
9
|
+
chain?: unknown;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface UiAnalysisProfileDiagnostic {
|
|
13
|
+
code: `KUI-P${string}`;
|
|
14
|
+
source?: string;
|
|
15
|
+
path: string;
|
|
16
|
+
message: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface UiAnalysisReport {
|
|
20
|
+
schemaVersion: 1;
|
|
21
|
+
tool: { name: string; version: 1 };
|
|
22
|
+
root: '.';
|
|
23
|
+
files: string[];
|
|
24
|
+
profile: {
|
|
25
|
+
files?: string[];
|
|
26
|
+
diagnostics: UiAnalysisProfileDiagnostic[];
|
|
27
|
+
};
|
|
28
|
+
diagnostics: UiAnalysisDiagnostic[];
|
|
29
|
+
summary: { errors: number; review: number; suppressed: number };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export const UI_ANALYSIS_SCHEMA_VERSION: 1;
|
|
33
|
+
export const UI_ANALYSIS_RULES: Readonly<
|
|
34
|
+
Record<`KUI-L${string}`, { severity: UiAnalysisSeverity; title: string }>
|
|
35
|
+
>;
|
|
36
|
+
|
|
37
|
+
export function analyzeUiProject(options?: {
|
|
38
|
+
root?: string;
|
|
39
|
+
paths?: string[];
|
|
40
|
+
profile?: string;
|
|
41
|
+
knownRules?: Iterable<string>;
|
|
42
|
+
}): Promise<UiAnalysisReport>;
|
|
43
|
+
|
|
44
|
+
export function formatUiAnalysisText(report: UiAnalysisReport): string;
|
|
45
|
+
export function formatUiAnalysisSarif(report: UiAnalysisReport): object;
|