← Back

Gallery

One generic structure. Six frameworks. One axis of difference.

Every implementation below was shaped the same way: a domain-agnostic runtime/ layer, generic components/, and domain-specific features/ — reading the exact same repo, meeting, and workspace plugins frompolaris-gallery. The only thing that changes between them is each framework's own reactivity syntax.

The only difference

Same shape, different reactivity primitive

React

useState + useEffect

Vue

ref + computed

Angular

signal + computed

Svelte

$state + $derived (runes)

Solid

createSignal + createMemo

Vanilla JS

manual pub-sub store (no primitive)

Verify it yourself

Same structure, file by file

Click any badge below to open that exact file on GitHub — no need to take this claim on faith.

Runtime entry

The only file allowed to register plugins.

WorkflowActionBar

The generic component — it never knows what "meeting" means.

meeting.config.ts

The only place meeting-specific business rules actually live.

MeetingDetail

The page that ties actions, notes, and history together.

Browse the shape

Full file tree, one framework at a time

src/
├─ types/
│  └─ meeting.ts
├─ runtime/
│  ├─ polaris.ts
│  ├─ useWorkflow.ts
│  ├─ useCanExecute.ts
│  ├─ useGlobalContext.ts
│  └─ WorkflowTrace.tsx
├─ components/
│  ├─ Button.tsx
│  ├─ StatusBadge.tsx
│  ├─ WorkflowActionBar.tsx
│  ├─ FormModal.tsx
│  └─ PromptModalProvider.tsx
├─ features/
│  ├─ auth/
│  │  ├─ mock-users.ts
│  │  ├─ Login.tsx
│  │  └─ RequireAuth.tsx
│  └─ meeting/
│     ├─ meeting.config.ts
│     ├─ history.ts
│     ├─ MeetingList.tsx
│     ├─ MeetingDetail.tsx
│     ├─ MeetingForm.tsx
│     ├─ NotePanel.tsx
│     └─ HistoryLog.tsx
└─ App.tsx
View the full repo on GitHub →