neuron-explorer
Qwen3.5‑4B 전용 조향형 뉴런 탐색기, 모든 MLP 뉴런을 밀어 결과를 보관·탐색
UECA-React Showcase: UECA-React 기반 순수 HTML·CSS로 제작된 약 50개 컴포넌트
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.
개발 도구TypeScript · CSSGitHub @nekutuzov온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기UECA-React 2.0 demo: Framework replacing React hooks with message bus, automatic events, property bindings, and black-box components. Vite + TypeScript + React + MobX.
저장소 README에서 가져옴
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.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