AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
UECA-React Showcase - some fifty components built on UECA-React with plain HTML and CSS: a live Showcase and a Playground, in light and dark themes.
Developer toolsTypeScript · CSSGitHub @nekutuzovOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
UECA-React 2.0 demo: Framework replacing React hooks with message bus, automatic events, property bindings, and black-box components. Vite + TypeScript + React + MobX.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A working application built with UECA-React: a component library of some fifty components on plain HTML, CSS and SVG, a live Showcase of every one of them, and a Playground where a component's properties and its source change together. It runs in a light and a dark theme, and every screen, service and control in it follows the same UECA component shape.Read the full README ↗A working application built with UECA-React: a component library of some fifty components on plain HTML, CSS and SVG, a live Showcase of every one of them, and a Playground where a component's properties and its source change together. It runs in a light and a dark theme, and every screen, service and control in it follows the same UECA component shape.
Live demo: https://nekutuzov.github.io/ueca-react-app-demo2/
UECA-React gives every React component the same explicit structure: props, children, methods, events, messages and a View, in that order. On top of that it adds stable component IDs, automatic change events for every property, one- and two-way property bindings, lifecycle hooks and a typed message bus. State is reactive (MobX, abstracted away): you assign to a property and the views that read it update.
node_modules/ueca-react/docs/raw/index.mdnpm install
npm run dev
Then open http://localhost:5001/ueca-react-app-demo2/.
| Script | What it does |
|---|---|
npm run dev | Vite dev server on port 5001 |
npm run build | Type-check and production build into dist/ |
npm run lint | ESLint |
npm test | Run the test suite once |
npm run test:watch | Run the tests in watch mode |
npm run coverage | Run the tests with a coverage report in coverage/ |
npm run preview | Serve the production build |
npm run deploy | Build, then publish dist/ to the gh-pages branch with the gh-pages package |
The UECA agent skills shipped with ueca-react are installed by npx ueca-react-skills. A plain npm install runs it through the postinstall; a targeted npm install ueca-react@… does not, so run it yourself after an upgrade.
src/
├── main.tsx # Entry point: global settings, error handler, render
├── tokens.css # Non-colour design tokens: type, spacing, radii, motion, z-index
├── themes.css # Colour tokens per theme (ueca-light, ueca-dark) and the control voice
├── theme.css # Page surface, markdown and code highlighting
├── test/ # Test setup and helpers (mount, settle, stubMessages, browser stubs)
├── integration/ # Whole-application tests: sign-in, routing, history, theme, services
├── api/ # REST client and MSW mocks
├── components/ # The component library
│ ├── base/ # useBase → useUIBase → useEditBase / useScreenBase
│ ├── buttons/ # Button, IconButton, toolbar shorthands
│ ├── data/ # Table, VirtualList, FilterableList
│ ├── flyouts/ # Alert, Snackbar, AlertToast, Drawer, EditDrawer, AlertDrawer
│ ├── inputs/ # TextField, NumberField, SearchField, Select, Checkbox, Switch, RadioGroup
│ ├── layout/ # Block, Row, Col, Grid, GridCell, Card
│ ├── menus/ # Menu, MenuItem
│ ├── misc/ # Icon, StatusLabel, ProgressBar, Spinner, MarkdownPreview, DropZone, …
│ ├── navigation/ # Router, NavLink, NavItem, NavItemExpandable, Breadcrumbs
│ ├── panels/ # Panel
│ ├── popups/ # Dialog, AlertDialog, Popover
│ └── tabs/ # TabsContainer, Tab
├── core/ # The application shell and its services
│ ├── infrastructure/ # Application, AppUI, router, routes, browsing history, security,
│ │ # dialogs, alerts, tooltip, busy display, theme manager, message contract
│ ├── appLayout/ # Sidebar, menu, layouts
│ ├── screenLayout/ # Screen frame: top bar, breadcrumbs, CRUD and tabbed screens
│ ├── appComponents/ # CodeSample, ThemeToggle, UECAContacts
│ └── misc/ # Icon set and role registry, overlay positioning and stacking
└── screens/
├── home/ # Landing page
├── common/ # ScreenPage: the shared eyebrow / title / lead / pager frame
├── showcase/ # One screen per topic; showcaseTopics.tsx lists them
└── playground/ # Button, Text field and Table editors; playgroundTopics.tsx lists them
showcaseTopics.tsx and playgroundTopics.tsx are the single source for each page's route, menu entry, title, lead and previous/next links. Adding a page means adding an entry there and a route in appRoutes.tsx.
Tests run on Vitest with jsdom and Testing Library. Each component, service and screen has its tests beside it (button.tsx → button.test.tsx), and src/integration/ drives the whole application: signing in, deep links, navigation, Back and Forward, the theme and the app services.
A UECA component draws nothing on its first render, so a test mounts it and waits:
const { model } = await mount(Button, { id: "save", contentView: "Save", onClick });
await userEvent.click(screen.getByRole("button", { name: "Save" }));
expect(onClick).toHaveBeenCalledWith(model);
model.disabled = true;
await settle();
expect(screen.getByRole("button")).toBeDisabled();
stubMessages stands in for a service on the message bus, and any error UECA would otherwise swallow — a View that throws, a failing hook — fails the test. Known defects are recorded as it.fails tests marked // BUG:.
tokens.css holds everything that is not colour; themes.css holds one colour block per theme, selected by <html data-theme>. A theme is added by adding a block there and an entry in core/infrastructure/appTheme.ts.themes.css, so every control in a form changes together.<Icon name="delete" />); core/misc/iconRegistry.ts decides which glyph backs it.import * as UECA from "ueca-react";
import { UIBaseModel, UIBaseParams, UIBaseStruct, useUIBase } from "@components";
type CounterStruct = UIBaseStruct<{
props: { count: number };
methods: { increment: () => void };
}>;
type CounterParams = UIBaseParams<CounterStruct>;
type CounterModel = UIBaseModel<CounterStruct>;
function useCounter(params?: CounterParams): CounterModel {
const struct: CounterStruct = {
props: {
id: useCounter.name,
count: 0
},
methods: {
increment: () => {
model.count++;
}
},
View: () => (
<button id={model.htmlId()} onClick={() => model.increment()}>
Clicked {model.count} times
</button>
)
};
const model = useUIBase(struct, params);
return model;
}
const Counter = UECA.getFC(useCounter);
export { CounterParams, CounterModel, useCounter, Counter };
Services are components too: they declare messages handlers and render nothing, and the rest of the app reaches them over the bus.
await model.bus.unicast("Alert.Success", { message: "Saved" });
const ok = await model.bus.unicast("Dialog.Confirmation", { title: "Delete", message: "Are you sure?" });
await model.bus.unicast("App.Router.GoToRoute", { path: "/playground/table" });
Every message is declared in core/infrastructure/appMessage.ts.
@components → src/components@core → src/core@api → src/api@screens → src/screensISC