Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 6 additions & 0 deletions src/app/AppRoutes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ import Landing from "../pages/Landing";
import Paper from "../pages/Paper";
import Guide from "../pages/Guide";
import Settings from "../pages/settings/Settings";
import Initiatives from "../pages/initiatives/Initiatives";
import Initiative from "../pages/initiatives/Initiative";
import InitiativeCreate from "../pages/initiatives/InitiativeCreate";

const AppRoutes: React.FC = () => {
return (
Expand Down Expand Up @@ -110,6 +113,9 @@ const AppRoutes: React.FC = () => {
<Route path="chambers" element={<Chambers />} />
<Route path="chambers/:id" element={<Chamber />} />
<Route path="formation" element={<Formation />} />
<Route path="initiatives" element={<Initiatives />} />
<Route path="initiatives/new" element={<InitiativeCreate />} />
<Route path="initiatives/:id" element={<Initiative />} />
<Route path="invision" element={<Invision />} />
<Route path="vortexopedia" element={<Vortexopedia />} />
<Route path="settings" element={<Settings />} />
Expand Down
2 changes: 2 additions & 0 deletions src/app/AppSidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
Gavel,
Landmark,
Lightbulb,
Network,
Rocket,
Scale,
Settings,
Expand Down Expand Up @@ -49,6 +50,7 @@ const AppSidebar: React.FC<React.PropsWithChildren> = ({ children }) => {
{ to: "/app/my-governance", label: "My governance", Icon: Gavel },
{ to: "/app/proposals", label: "Proposals", Icon: FileText },
{ to: "/app/formation", label: "Formation", Icon: Rocket },
{ to: "/app/initiatives", label: "Initiatives", Icon: Network },
],
},
{
Expand Down
13 changes: 13 additions & 0 deletions src/components/GlassyRecordCard.css
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,19 @@
overflow-wrap: anywhere;
}

.glassy-record-card__association {
align-self: flex-start;
max-width: 100%;
color: var(--record-meta-text);
background: var(--record-meta-bg);
}

.glassy-record-card__association > span {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}

.glassy-record-card__stage {
width: 100%;
min-width: 0;
Expand Down
7 changes: 7 additions & 0 deletions src/components/GlassyRecordCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import type { Stage } from "@/types/stages";
import "./GlassyRecordCard.css";

type GlassyRecordCardProps = {
association?: ReactNode;
children: ReactNode;
className?: string;
dateText?: ReactNode;
Expand All @@ -25,6 +26,7 @@ type GlassyRecordCardProps = {
};

export function GlassyRecordCard({
association,
children,
className,
dateText,
Expand Down Expand Up @@ -62,6 +64,11 @@ export function GlassyRecordCard({
<span className="glassy-record-card__title">{title}</span>
</span>
<span className="glassy-record-card__summary">{renderedSummary}</span>
{association ? (
<Chip className="glassy-record-card__association">
{association}
</Chip>
) : null}
</span>
<span className="glassy-record-card__aside">
{meta ? (
Expand Down
11 changes: 11 additions & 0 deletions src/components/ProposalPageHeader.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { useEffect, useMemo, useState, type ReactNode } from "react";
import { Link } from "react-router";

import { Chip } from "@/components/Chip";
import {
buildProposalStageLinks,
ProposalStageBar,
Expand Down Expand Up @@ -74,6 +76,15 @@ export function ProposalPageHeader({
return (
<section className="space-y-4">
<h1 className="text-center text-2xl font-semibold text-text">{title}</h1>
{status?.initiative ? (
<div className="flex justify-center">
<Link to={`/app/initiatives/${status.initiative.id}`}>
<Chip className="stage-chip stage-chip--system">
Initiative · {status.initiative.title}
</Chip>
</Link>
</div>
) : null}
<ProposalStageBar
current={stage}
liveStage={liveStage}
Expand Down
24 changes: 24 additions & 0 deletions src/components/StageChip.css
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,12 @@
--stage-chip-text: #9c3c7b;
}

.stage-chip--initiative {
--stage-chip-bg: #e6f7f4;
--stage-chip-border: rgba(30, 137, 122, 0.24);
--stage-chip-text: #197d70;
}

.stage-chip--system {
--stage-chip-bg: #eef2f6;
--stage-chip-border: rgba(75, 85, 99, 0.22);
Expand Down Expand Up @@ -141,6 +147,12 @@
--stage-chip-text: #933873;
}

:root[data-theme="light"] .stage-chip--initiative {
--stage-chip-bg: #e9f8f5;
--stage-chip-border: rgba(30, 137, 122, 0.28);
--stage-chip-text: #176f65;
}

:root[data-theme="light"] .stage-chip--system {
--stage-chip-bg: #f1f4f7;
--stage-chip-border: rgba(75, 85, 99, 0.24);
Expand Down Expand Up @@ -207,6 +219,12 @@
--stage-chip-text: #fbcfe8;
}

:root[data-theme="night"] .stage-chip--initiative {
--stage-chip-bg: rgba(74, 222, 190, 0.15);
--stage-chip-border: rgba(74, 222, 190, 0.34);
--stage-chip-text: #a7f3df;
}

:root[data-theme="night"] .stage-chip--system {
--stage-chip-bg: rgba(203, 213, 225, 0.14);
--stage-chip-border: rgba(203, 213, 225, 0.3);
Expand Down Expand Up @@ -273,6 +291,12 @@
--stage-chip-text: #ffc1ad;
}

:root[data-theme="fire"] .stage-chip--initiative {
--stage-chip-bg: rgba(255, 181, 71, 0.16);
--stage-chip-border: rgba(255, 181, 71, 0.38);
--stage-chip-text: #ffd39a;
}

:root[data-theme="fire"] .stage-chip--system {
--stage-chip-bg: rgba(255, 226, 194, 0.13);
--stage-chip-border: rgba(255, 226, 194, 0.3);
Expand Down
1 change: 1 addition & 0 deletions src/components/StageChip.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ const chipClasses: Record<StageChipKind, string> = {
thread: "stage-chip--thread",
courts: "stage-chip--courts",
faction: "stage-chip--faction",
initiative: "stage-chip--initiative",
system: "stage-chip--system",
};

Expand Down
18 changes: 18 additions & 0 deletions src/components/Textarea.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import * as React from "react";

import { cn } from "@/lib/utils";

export interface TextareaProps
extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}

const base =
"flex min-h-28 w-full rounded-xl border border-[color:var(--surface-glass-border)] bg-[color:var(--control-glass-bg)] px-3 py-2 text-sm text-[var(--text)] shadow-[var(--shadow-control)] transition supports-[backdrop-filter]:backdrop-blur-md " +
"placeholder:text-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[color:var(--primary-dim)] focus-visible:ring-offset-2 focus-visible:ring-offset-panel focus-visible:shadow-[var(--shadow-tile)] " +
"hover:border-[color:var(--surface-glass-hover-border)] hover:bg-[color:var(--control-glass-hover-bg)] disabled:cursor-not-allowed disabled:opacity-60";

export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
({ className, ...props }, ref) => {
return <textarea className={cn(base, className)} ref={ref} {...props} />;
},
);
Textarea.displayName = "Textarea";
35 changes: 35 additions & 0 deletions src/data/vortexopedia.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1795,4 +1795,39 @@ export const vortexopediaTerms: VortexopediaTerm[] = [
source: "App UX: Invision decentralization bands",
updated: "2026-06-26",
},
{
ref: 62,
id: "initiative",
name: "Initiative",
category: "governance",
short:
"A public coordination workspace where active Human Nodes organize board work, discussion, and proposals without gaining extra governance power.",
long: [
"An Initiative is created by an active Human Node and operated by an admin, steward, and member roster.",
"Its board, durable threads, and chat support work before, during, and after proposal creation.",
"Admins and stewards can associate a proposal with an active Initiative. The association records provenance only: it does not change voting eligibility, quorum weight, chamber membership, CM, MM, tier progress, or proposal lifecycle.",
"System-wide Initiatives are distinct from faction initiatives. A faction initiative coordinates work inside one faction; a system-wide Initiative is a public Vortex workspace.",
],
tags: [
"initiative",
"coordination",
"proposal",
"board",
"threads",
"provenance",
],
related: ["proposal-pools", "formation", "faction", "human_node"],
examples: [
"A research Initiative can coordinate evidence and then visibly associate the resulting policy proposal.",
],
stages: ["global", "pool", "chamber", "formation"],
links: [
{
label: "Initiatives",
url: "/app/initiatives",
},
],
source: "Vortex Simulator Phase 90",
updated: "2026-06-27",
},
];
Loading
Loading