From 4f85f7364d053a1e27b180bf7da87ab05fab1c39 Mon Sep 17 00:00:00 2001 From: Doug Horner Date: Sat, 5 Sep 2026 18:06:02 -0400 Subject: [PATCH 1/3] docs: harmonize onboarding and contribution guidance --- .storybook/public/dashboard-preview.png | Bin 0 -> 118841 bytes CONTRIBUTING.md | 200 +++- README.md | 901 ++++------------- agent/mieweb-ui.instructions.md | 21 +- src/Introduction.mdx | 1178 +---------------------- 5 files changed, 365 insertions(+), 1935 deletions(-) create mode 100644 .storybook/public/dashboard-preview.png diff --git a/.storybook/public/dashboard-preview.png b/.storybook/public/dashboard-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..acbd2587a3999bf0a9b025930785f01535e6633a GIT binary patch literal 118841 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

!-k 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. - `package.json` `sideEffects` is `["**/*.css"]` — CSS is intentionally side-effectful so it isn't tree-shaken away. Keep JS/TS modules side-effect - free (the AGGrid `ModuleRegistry` call is a deliberate, documented exception). + free (the deprecated AGGrid integration's `ModuleRegistry` call is a legacy + exception, not a pattern for new components). ## Build & bundle - **Bundler:** [tsup](tsup.config.ts) → dual **ESM + CJS**, `target: es2022`, `.d.ts` emitted, sourcemaps, `treeshake` + `splitting` on. JSX is `automatic`. Types build against [tsconfig.build.json](tsconfig.build.json). -- **External:** `react`, `react-dom`, `ag-grid-*`, `datavis-ace`, `@esheet/*` - are never bundled (they're peers). +- **External:** `react`, `react-dom`, `datavis-ace`, and `@esheet/*` are never + bundled (they're peers). Legacy `ag-grid-*` peers remain external for compatibility. - **CSS:** `pnpm build:css` compiles `src/styles/base.css` → `dist/styles.css` via the Tailwind CLI; brand CSS is copied into `dist/brands/`. - **Submodule builds:** `prebuild` runs `build:esheet`, which builds the @@ -196,15 +253,16 @@ If a submodule-backed component fails to resolve, run ## Optional peer dependencies `react` / `react-dom` are required peers. Everything else heavy is **optional**: -`ag-grid-community`, `ag-grid-react`, `datavis-ace`, `@mieweb/datavis`, +`datavis-ace`, `@mieweb/datavis`, `@esheet/builder`, `@esheet/renderer`, `wavesurfer.js`. Components that need them must live behind a subpath entry (not the main barrel) so consumers who don't use them aren't forced to install them. -> **Grids: AGGrid is deprecated — use NITRO DataVis.** `ag-grid-*` is heavy and -> [AGGrid](src/components/AGGrid/MAINTAINERS.md) is deprecated with no new usages -> allowed. Use [DataVisNITRO](src/components/DataVisNITRO/MAINTAINERS.md) -> (`@mieweb/ui/datavis`) for all tables. See those notes for details. +> **Grids: use DataVis NITRO for new work.** The `@mieweb/ui` AGGrid integration +> is deprecated; `ag-grid-community` and `ag-grid-react` remain optional peers +> only for existing consumers. Its source and maintainer notes document legacy +> maintenance, not a recommended choice. Use +> [DataVisNITRO](src/components/DataVisNITRO/MAINTAINERS.md) (`@mieweb/ui/datavis`). ## Per-component maintainer notes @@ -216,14 +274,14 @@ submodule, a module-level side effect, or a non-obvious extension point. Current notes: -| Module | Why it has notes | -| -------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | -| [AI](src/components/AI/MAINTAINERS.md) | `renderTextContent` extension point; host owns sanitization; reuses the Messaging composer | -| [AGGrid](src/components/AGGrid/MAINTAINERS.md) | Registers AG Grid modules at import; optional peers; brand theming; base vs. enhanced split | -| [ESheet](src/components/ESheet/MAINTAINERS.md) | Implementation is a submodule (nx); needs `build:esheet`; Storybook-only `src` | -| [DataVisNITRO](src/components/DataVisNITRO/MAINTAINERS.md) | Wraps `datavis-ace` + the `@mieweb/datavis` npm package; context/source/grid wiring | -| [FloatingWindow](src/components/FloatingWindow/MAINTAINERS.md) | Manual drag/resize math; modal vs. floating modes; fully controlled | -| [YChart](src/components/YChart/MAINTAINERS.md) | Vanilla editor in a submodule, dynamically imported; not in the public API | +| Module | Why it has notes | +| -------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| [AI](src/components/AI/MAINTAINERS.md) | `renderTextContent` extension point; host owns sanitization; reuses the Messaging composer | +| [AGGrid (deprecated)](src/components/AGGrid/MAINTAINERS.md) | Legacy maintenance only; retained for existing consumers. Use [DataVis NITRO](src/components/DataVisNITRO/MAINTAINERS.md) for new work. | +| [ESheet](src/components/ESheet/MAINTAINERS.md) | Implementation is a submodule (nx); needs `build:esheet`; Storybook-only `src` | +| [DataVisNITRO](src/components/DataVisNITRO/MAINTAINERS.md) | Wraps `datavis-ace` + the `@mieweb/datavis` npm package; context/source/grid wiring | +| [FloatingWindow](src/components/FloatingWindow/MAINTAINERS.md) | Manual drag/resize math; modal vs. floating modes; fully controlled | +| [YChart](src/components/YChart/MAINTAINERS.md) | Vanilla editor in a submodule, dynamically imported; not in the public API | ## Commits, versioning & releases @@ -234,8 +292,104 @@ Current notes: - `prepublishOnly` runs a full build. Never publish from a dirty/un-built tree. - **Never publish without explicit confirmation.** +### Release channels + +| Channel | Install | Source | +| ------------------- | ----------------------------- | --------------------------------------------- | +| Stable (`latest`) | `npm install @mieweb/ui` | Stable version tags | +| Prerelease (`next`) | `npm install @mieweb/ui@next` | Eligible pushes to `main` and prerelease tags | + +The [release workflow](.github/workflows/release.yml) defines the triggers and +path exclusions. In particular, Markdown-only changes do not currently trigger +a `main` prerelease, so an updated README reaches npm with the next release. + +For a stable release, use GitHub Actions' **Create Stable Release** workflow and +select the semantic version bump. It updates the package version and creates the +tag that triggers publishing. Maintainers can also publish through a deliberate +`v*` tag; inspect the workflow and obtain approval before creating or pushing one. + +## Developing Components From a Consuming Application + +Before proposing a new component, read this guide and audit the component +catalog, related examples, and existing composition patterns. Evaluate candidates +by behavior and user need, not only by name. Document why using, configuring, +composing, or extending existing components does not adequately solve the problem. +Present the gap and supporting evidence before implementation. + +When a reusable gap remains, develop the component so it can be contributed +upstream. Follow the [component checklist](#adding-a-new-component-checklist), +including documentation, accessibility, internationalization, theming, and tests. +Keep application-specific data access and business rules in the consuming +application; expose reusable behavior through a clear public API. Do not invent a +generic abstraction solely to make project-specific code contributable. + +### Coordinated Development With a Submodule + +1. Obtain approval before introducing a submodule or changing the consuming + project's dependency strategy. Reuse an existing checkout when available; + otherwise add `mieweb/ui` as a Git submodule using the project's vendor-directory + convention and an upstream repository or fork accessible to collaborators. +2. Create a focused feature branch in the submodule for development and the + upstream PR. A submodule pins an **exact commit**, not a branch; branch tracking + does not replace the commit recorded by the consuming repository. +3. Configure the application to consume the submodule checkout through its + established build and dependency tooling. Adding a submodule alone does not + replace an installed npm dependency. Verify that the application actually uses + the changed build and does not load a second React runtime. +4. Implement and test the reusable change in the submodule, then verify its + integration in the consuming application. With the required approvals, commit + and push the submodule change before recording its tested revision in the + consumer. The pinned commit must be fetchable by collaborators and CI. +5. Open the upstream and consumer PRs using the process below. After upstream + release, update the consumer to the released package or corresponding submodule + commit according to its dependency policy, removing temporary overrides. + +### Opening the Pull Requests + +Follow each repository's approval requirements for commits, pushes, and PR +creation. This guide is not authorization to publish changes. + +1. Run the [quality gates](#quality-gates-must-pass-before-opening-a-pr) and the + integration checks relevant to the change. Record results and known gaps. +2. Push the feature branch to the upstream repository, or your fork if you lack + write access. Open a PR targeting `mieweb/ui`'s `main` branch using GitHub's + **Compare & pull request** flow or `gh pr create`. For a fork, select + `mieweb/ui:main` as the base and your fork's feature branch as the head. +3. Supply the rationale and evidence below. Use a draft PR while the API, examples, + or required checks are incomplete. Request maintainer review. +4. Open a separate consumer PR for the integration and pinned submodule revision. + Link the two PRs in both directions and state any merge or release dependency. + Do not include application-specific code or private data in the upstream PR. + +### Component PR Rationale and Evidence + +Every new or materially extended reusable component PR must explain: + +- **Problem:** the user need and why it belongs in a shared library. +- **Alternatives:** existing components considered and why reuse, composition, + or extension was insufficient. +- **Relationships:** what it complements, overlaps with, or replaces, with links + and selection guidance discoverable from the affected component pages. +- **Boundaries:** when not to use it, known limitations, and application-owned + responsibilities. +- **Evidence:** a realistic composition example and verification of interactions, + mobile and desktop layouts, light and dark themes, brand switching, + accessibility, translated text expansion, and RTL behavior. Explain any + inapplicable checks or unverified requirements. +- **Compatibility:** API impact, dependencies, and migration guidance where needed. + +Put enduring guidance in the component documentation and link to it from the PR. +Use the PR description for change-specific reasoning and verification evidence, +not a second copy of the documentation. Reviewers should be able to understand +why to choose the component, when to choose something else, and how it fits with +the rest of the library without reading its implementation. + ## Adding a new component (checklist) +First complete the [alternatives audit and contribution workflow](#developing-components-from-a-consuming-application). +For work directly in this repository, the consumer submodule steps apply only +when a consuming application is involved; the audit and PR requirements still apply. + 1. `src/components//` with `index.ts`, `.tsx`, `.stories.tsx`. 2. Follow the [anatomy](#anatomy-of-a-component) conventions (CVA, `cn`, `forwardRef`, theme tokens, a11y). diff --git a/README.md b/README.md index 4aea150df..1bd32836d 100644 --- a/README.md +++ b/README.md @@ -1,619 +1,136 @@ # @mieweb/ui -A themeable, accessible React component library built with Tailwind CSS 4. - -## Features - -- 🎨 **Fully Themeable** - Customize colors, fonts, border radius, and more using CSS variables -- 🏢 **Multi-Brand Support** - Pre-configured themes for BlueHive, Enterprise Health, WebChart, Waggleline, and MIE -- ♿ **Accessible** - Built with WCAG guidelines in mind, including proper ARIA attributes and keyboard navigation -- 🌳 **Tree-Shakeable** - Import only the components you need -- 🌙 **Dark Mode** - Built-in dark mode support with system preference detection -- 📦 **Dual Format** - ESM and CommonJS support -- 🎯 **TypeScript** - Full TypeScript support with comprehensive type definitions -- 📚 **Storybook** - Interactive documentation and component playground - -## Table of Contents - -- [Installation](#installation) -- [Quick Start](#quick-start) -- [Development](#development) -- [Date & Time Standard](#date--time-standard) -- [Storybook](#storybook) -- [Using in Other Projects](#using-in-other-projects) -- [Brand System](#brand-system) -- [Theming](#theming) -- [Components](#components) -- [Hooks](#hooks) -- [Utilities](#utilities) -- [Releases](#releases) -- [Contributing](#contributing) - -## Installation +**Build applications that feel familiar from the first interaction.** -```bash -npm install @mieweb/ui -# or -yarn add @mieweb/ui -# or -pnpm add @mieweb/ui -``` - -### Peer Dependencies - -This library requires React 18+ and React DOM 18+: - -```bash -npm install react react-dom -``` - -### Optional Add-ons - -Heavy or specialized dependencies are kept in separate entry points so they don't bloat the core bundle. Install the peer dependencies for the add-ons you need: - -| Entry point | Install | Import path | -| ------------------------ | --------------------------------------------- | -------------------- | -| **AG Grid** (deprecated) | `npm install ag-grid-community ag-grid-react` | `@mieweb/ui/ag-grid` | -| **DataVis** | `npm install @mieweb/datavis datavis-ace` | `@mieweb/ui/datavis` | - -> ⚠️ **AGGrid is deprecated.** Use DataVis NITRO (`@mieweb/ui/datavis`) for all -> tables. The `@mieweb/ui/ag-grid` entry remains available for existing -> consumers but will be removed in a future major release. - -### AI Agent Rules - -Working with AI coding agents (Copilot, Claude Code, Cursor, …)? Install -@mieweb/ui's agent rules into your repo so agents use library components -(DataVis NITRO for tables, `Button`/`Badge`/`Modal`/… instead of raw HTML): - -```bash -npx @mieweb/ui init-agent -``` - -This writes `.github/instructions/mieweb-ui.instructions.md` (auto-applied by -VS Code Copilot) and a marked block in `AGENTS.md` (the cross-tool convention). -Idempotent — rerun after upgrading to refresh the rules. See [agent/](agent/). - -## Quick Start - -### Option 1: With Tailwind CSS (Recommended) - -If your project uses Tailwind CSS 4, you can use the library's Tailwind preset for the best experience: - -1. Add the preset to your `tailwind.config.js`: - -```js -// tailwind.config.js -module.exports = { - presets: [require('@mieweb/ui/tailwind-preset')], - content: [ - // ... your content - './node_modules/@mieweb/ui/dist/**/*.js', - ], - // Override theme values to match your brand - theme: { - extend: { - colors: { - primary: { - 500: '#your-brand-color', - }, - }, - }, - }, -}; -``` +People should not have to relearn how to navigate, fill out a form, or recover +from an error every time they open another application. Clean, consistent +interfaces let users carry what they already know from one task to the next. +Predictable controls and clear feedback reduce hesitation and leave more +attention for the work that matters. -2. Import and use components: +That consistency should extend beyond appearance. A coherent experience adapts +from mobile to desktop, remains legible in light and dark mode, accommodates +different languages and right-to-left layouts, and supports keyboard and +assistive-technology users. Responsive design, internationalization (i18n), and +accessibility (a11y) belong in the foundation, not on a finishing checklist. -```tsx -import { Button, Card, Input } from '@mieweb/ui'; +`@mieweb/ui` brings that approach to your browser interface through reusable +controls, navigation, forms, feedback, and data displays. Shared interaction +patterns provide familiarity; theme and brand tokens give you room to make the +application your own. Developed at MIE, the library is available for applications +in any domain under its [license terms](#license), not just MIE products. -function App() { - return ( - - - - - ); -} -``` +The components are built with React, but your application does not have to be. +Use them throughout a React application or embed them in selected areas of +Bootstrap-based, server-rendered, or other non-React pages. Adopt a component or +a workflow at a time without rewriting the rest of your interface. -### Option 2: Pre-compiled CSS +Start with a common foundation and spend more time on what makes your application +valuable. The components support inclusive design; they do not automatically +translate your content or guarantee accessibility. Validate their composition, +language, and behavior with the people and devices your application serves. -If you're not using Tailwind CSS, you can import the pre-compiled stylesheet: +**The library is `@mieweb/ui`. Storybook is its documentation and experimentation +environment**, where you can explore those components without building an app +first. This introduction is shared by GitHub, npm, and Storybook. -```tsx -import '@mieweb/ui/styles.css'; -import { Button } from '@mieweb/ui'; -``` +- [See it in action](#see-it-in-action), no installation needed. +- [Get started](#get-started), with or without an AI coding agent. +- [Explore and compose components](#explore-and-compose-components). +- [Contribute or run locally](#contribute-or-run-locally). -## Development +## See It In Action -### Getting Started +[![Open the interactive dashboard demo: navigation, summary cards, recent orders, and activity](https://ui.mieweb.org/dashboard-preview.png)](https://ui.mieweb.org/?path=/story/product-feature-modules-dashboard--dashboard) -1. **Clone the repository (including submodules):** +**[Open the interactive dashboard](https://ui.mieweb.org/?path=/story/product-feature-modules-dashboard--dashboard)** +to see navigation, headers, cards, and data displays working together in an +application layout. Try the brand and theme switchers to see how the same +components adapt. No installation required. -```bash -git clone --recurse-submodules https://github.com/mieweb/ui.git -cd ui -``` +## Get Started -> `--recurse-submodules` is strongly recommended for first clone so the `packages/esheet` and `packages/ychart` submodules are populated immediately. Without them, the eSheet and YChart stories will not work. DataVis NITRO is not a submodule — it ships as the published `@mieweb/datavis` npm package. +### Install in Your Application -If you already cloned without submodules, run: - -```bash -git submodule update --init --recursive -``` - -2. **Install dependencies:** - -```bash -npm install -``` - -Use one package manager consistently per clone. The commands below use npm. - -3. **eSheet packages build automatically.** A `prestorybook` hook runs `npm run build:esheet` before Storybook starts, so the `@esheet/*` packages are compiled on first run with no manual step. It's a near-instant no-op on later runs once the artifacts exist. - -If `packages/esheet` is updated later (submodule update, branch switch, or pull) and you need to force a fresh rebuild, remove the built artifacts and run the build again: - -```bash -rm -f packages/esheet/packages/core/dist/index.d.ts packages/esheet/packages/renderer/src/index.output.css -npm run build:esheet -``` - -4. **Start Storybook:** - -```bash -npm run storybook -``` - -This starts the Storybook development server at [http://localhost:6006](http://localhost:6006) with all components, including eSheet, DataVis NITRO, and YChart. - -### How the Sub-Packages Are Wired - -Storybook integrates three sibling MIE projects, each sourced differently: - -- **DataVis NITRO** — npm package `@mieweb/datavis`. No build step; consumed as a published package (no submodule needed). -- **eSheet** — git submodule `packages/esheet`. Built automatically by the `prestorybook` hook; rebuilds only when its artifacts are missing. -- **YChart** — git submodule `packages/ychart`. No build step; the story imports it directly from source via a relative dynamic import, and Storybook's Vite config adds a `virtual:git-info` plugin, a `__YCHART_VERSION__` define, and dependency pre-bundling (`optimizeDeps`). - -### Library Development (watch mode) - -To rebuild the library on file changes (for consumers that link this repo locally): - -```bash -npm run dev -``` - -This watches for source changes and rebuilds automatically. It does **not** start Storybook. - -### Available Scripts - -| Script | Description | -| ------------------------- | ------------------------------------------------------------------------------------------------- | -| `npm run dev` | Watch & rebuild the library (for local consumers, not Storybook) | -| `npm run build:esheet` | Build eSheet submodule packages (auto-run by `prestorybook`/`prebuild`; skips when already built) | -| `npm run build` | Build the library for production | -| `npm run storybook` | Start Storybook development server | -| `npm run build-storybook` | Build Storybook for static hosting | -| `npm run typecheck` | Run TypeScript type checking | -| `npm run lint` | Run ESLint | -| `npm run lint:fix` | Run ESLint with auto-fix | -| `npm run format` | Check code formatting with Prettier | -| `npm run format:fix` | Fix code formatting with Prettier | -| `npm run test` | Run tests | -| `npm run test:watch` | Run tests in watch mode | - -## Date & Time Standard - -For UI/UX date and time behavior, this project uses **Luxon** as the preferred library. - -### Guidelines - -- Use `DateTime` from `luxon` for all new date/time parsing, formatting, and comparisons. -- Keep timezone explicit when logic depends on business rules (for example: office hours, “open now”, appointment windows). -- Use IANA timezone identifiers (for example: `America/New_York`) instead of abbreviations. -- Prefer storing/transmitting ISO-8601 values and convert for display at the component edge. -- Avoid adding new date logic with raw `Date` math unless there is a clear performance or compatibility reason. - -### Examples - -```ts -import { DateTime } from 'luxon'; - -const localDisplay = DateTime.fromISO(timestamp).toFormat('LLL d, yyyy h:mm a'); - -const inProviderZone = DateTime.fromISO(timestamp, { - zone: 'America/New_York', -}); - -const isOpen = - DateTime.now().setZone('America/New_York') < - inProviderZone.plus({ hours: 1 }); -``` - -## Storybook - -Storybook provides interactive documentation and a component playground where you can explore all components with different props and themes. - -### Running Storybook - -```bash -npm run storybook -``` - -This starts the Storybook development server at [http://localhost:6006](http://localhost:6006). - -### Features in Storybook - -- **Component Explorer**: Browse all components with live examples -- **Props Documentation**: See all available props for each component -- **Theme Switcher**: Toggle between light and dark modes -- **Brand Switcher**: Preview components with different brand themes (BlueHive, Enterprise Health, WebChart, Waggleline, MIE) -- **Accessibility Panel**: Check accessibility compliance for each component -- **Controls**: Interactively modify component props - -### Building Storybook - -To build a static version of Storybook for deployment: - -```bash -npm run build-storybook -``` - -The output will be in the `storybook-static` directory. - -### Configuring the Ozwell API (AI stories) - -The AI stories (AIChat, Hands-Free Chat, and the DataVis NITRO **Ozwell Assistant** -story) call the real Ozwell backend when a key is configured and fall back to a -canned reply when it isn't. Set the key and endpoint from the browser console: - -```js -// Recommended — survives reloads and is shared with the story iframe: -localStorage.setItem( - 'ozwellConfig', - JSON.stringify({ apiKey: 'YOUR_KEY', baseURL: 'https://your-ozwell-host' }) -); -``` - -`baseURL` is optional (defaults to `https://api.ozwell.ai`); other optional keys are -`model`, `system`, and `temperature`. Never commit a key — see -[src/components/AI/OZWELL-BACKEND.md](src/components/AI/OZWELL-BACKEND.md) for full -details, including why `window.__ozwell` is unreliable inside Storybook iframes and -how to proxy the key for public deploys. - -## Using in Other Projects - -### Method 1: NPM Package (Recommended) - -Once published, install the package in your project: +The components require React 18+ and React DOM 18+ to render, including when +embedded in a non-React page. If your project already has those dependencies: ```bash npm install @mieweb/ui ``` -Then import components: - -```tsx -import { Button, Card, Input, ThemeProvider } from '@mieweb/ui'; -import '@mieweb/ui/styles.css'; // or use a brand CSS file - -function App() { - return ( - - - - Welcome - - - - - - - - ); -} -``` - -### Method 2: Local Development (npm link) - -For local development across projects: +Use `pnpm add @mieweb/ui` or `yarn add @mieweb/ui` if that is your project's +package manager. You do not need to clone this repository or run Storybook to use +the library. -1. **In the @mieweb/ui directory:** +For a project without React, install the rendering dependencies: ```bash -cd /path/to/mieweb-ui -npm run build -npm link +npm install react react-dom ``` -2. **In your consuming project:** - -```bash -cd /path/to/your-project -npm link @mieweb/ui -``` +Using an AI coding agent? [Set up its instructions](#set-up-your-ai-coding-agent) +and [read the component-selection and integration rules](https://github.com/mieweb/ui/blob/main/agent/mieweb-ui.instructions.md) +before asking it to add components to your application. -3. **Import and use components:** +Mount components into a dedicated DOM element with React DOM's `createRoot`, leaving the rest of +the page under its existing framework's control. Unmount the React root when the +host removes that area. This requires a JavaScript build that supports React; +the components are not framework-free HTML widgets. -```tsx -import { Button } from '@mieweb/ui'; -import '@mieweb/ui/dist/styles.css'; -``` +When embedding alongside Bootstrap or other stylesheets, check CSS resets, +global selectors, and theme styles for conflicts. Mounting into a separate DOM +element does not isolate CSS. -### Method 3: Direct Path Import +### Set Up Your AI Coding Agent -For monorepo setups or when you want to reference the source directly: +From your application's repository root, run: -```tsx -// In your consuming project's package.json -{ - "dependencies": { - "@mieweb/ui": "file:../mieweb-ui" - } -} +```bash +npx @mieweb/ui init-agent ``` -Then run `npm install` and import as usual. +This installs component-selection, composition, theming, and accessibility rules +so your agent can start with existing library components. It writes +`mieweb-ui.instructions.md` in `.github/instructions/` for VS Code Copilot and +updates a managed block in `AGENTS.md` for agents that read that file. Rerun after upgrading +`@mieweb/ui` to refresh the rules. -### Using with Different Frameworks - -#### Next.js - -```tsx -// app/layout.tsx or pages/_app.tsx -import '@mieweb/ui/brands/bluehive.css'; -import { ThemeProvider } from '@mieweb/ui'; +Read the [agent setup guide and rules](https://github.com/mieweb/ui/tree/main/agent). +These are instructions for coding agents, not an automatic PR reviewer or merge +gate. Agent-assisted and manual development use the same library and setup below. -export default function RootLayout({ children }) { - return ( - - - {children} - - - ); -} -``` - -#### Vite - -```tsx -// main.tsx -import React from 'react'; -import ReactDOM from 'react-dom/client'; -import '@mieweb/ui/brands/enterprise-health.css'; -import { ThemeProvider } from '@mieweb/ui'; -import App from './App'; - -ReactDOM.createRoot(document.getElementById('root')!).render( - - - - - -); -``` +### Render Your First Component -#### Meteor +Import the precompiled stylesheet once in your application's entry point or root +layout. Import a brand stylesheet after it when you want that brand's tokens: ```tsx -// client/main.tsx -import { Meteor } from 'meteor/meteor'; -import React from 'react'; -import { createRoot } from 'react-dom/client'; +import '@mieweb/ui/styles.css'; import '@mieweb/ui/brands/bluehive.css'; -import { ThemeProvider } from '@mieweb/ui'; -import App from '/imports/ui/App'; - -Meteor.startup(() => { - const container = document.getElementById('react-target'); - const root = createRoot(container!); - root.render( - - - - ); -}); -``` - -## Brand System - -The library includes pre-configured themes for multiple brands. Each brand has its own design system with unique colors, typography, border radius, and shadows. - -### Available Brands - -| Brand | Primary Color | Font | Description | -| --------------------- | -------------------- | ------ | ------------------------------------------------- | -| **BlueHive** | `#27AAE1` (Blue) | Nunito | DOT Physical scheduling and healthcare compliance | -| **Enterprise Health** | `#6E2B68` (Burgundy) | Jost | Employee health and occupational medicine | -| **WebChart** | `#F5841F` (Orange) | Inter | Future-ready electronic health record system | -| **Waggleline** | `#17AEED` (Blue) | Inter | Experience visualization and orchestration | -| **MIE** | `#27AE60` (Green) | Inter | Healthcare software and services | - -### Using a Brand Theme - -#### Method 1: Import the brand CSS file - -```tsx -// Import the brand's CSS file -import '@mieweb/ui/brands/enterprise-health.css'; - -import { Button, Card } from '@mieweb/ui'; ``` -#### Method 2: Use the ThemeProvider with brand +This CSS path does not require Tailwind in your application. For a first interactive +example, render a theme switcher inside the provider: ```tsx -import { ThemeProvider } from '@mieweb/ui'; -import { enterpriseHealthBrand } from '@mieweb/ui/brands'; - -function App() { - return ( - - - - ); -} -``` - -#### Method 3: Tailwind CSS preset - -```js -// tailwind.config.js -const { enterpriseHealthBrand } = require('@mieweb/ui/brands'); -const { createBrandPreset } = require('@mieweb/ui/brands/types'); - -module.exports = { - presets: [createBrandPreset(enterpriseHealthBrand)], - // ... -}; -``` - -### Brand Design Tokens - -Each brand defines the following design tokens: - -#### Enterprise Health - -Extracted from [enterprisehealth.com](https://enterprisehealth.com): - -```css -/* Primary: Burgundy/Purple */ ---mieweb-primary-600: #6e2b68; - -/* Secondary: Deep Teal Blue (for gradients) */ ---mieweb-secondary: #00497a; - -/* Accent: Gold/Yellow (logo) */ ---mieweb-accent: #f8b700; - -/* Brand Gradient */ ---mieweb-gradient: linear-gradient(111.02deg, #00497a, #6e2b68); - -/* Typography */ ---mieweb-font-sans: 'Jost', ui-sans-serif, system-ui, sans-serif; - -/* Border Radius (larger, more rounded) */ ---mieweb-radius-sm: 0.375rem; /* 6px - badges */ ---mieweb-radius-md: 0.625rem; /* 10px - buttons */ ---mieweb-radius-lg: 0.75rem; /* 12px - inputs */ ---mieweb-radius-2xl: 1.5rem; /* 24px - cards */ - -/* Shadows (subtle, layered) */ ---mieweb-shadow-card: - 0 16px 32px 0 rgba(34, 35, 38, 0.05), 0 8px 16px 0 rgba(34, 35, 38, 0.05); -``` - -#### BlueHive - -```css -/* Primary: Blue */ ---mieweb-primary-500: #27aae1; - -/* Typography */ ---mieweb-font-sans: 'Nunito', ui-sans-serif, system-ui, sans-serif; -``` - -### Creating a Custom Brand - -You can create your own brand configuration: - -```ts -import type { BrandConfig } from '@mieweb/ui/brands/types'; - -export const myBrand: BrandConfig = { - name: 'my-brand', - displayName: 'My Brand', - description: 'Custom brand for my application', - - colors: { - primary: { - 50: '#f0f9ff', - // ... full color scale 50-950 - 600: '#0284c7', // Main brand color - // ... - }, - light: { - background: '#ffffff', - foreground: '#171717', - // ... semantic colors - }, - dark: { - background: '#171717', - foreground: '#fafafa', - // ... semantic colors - }, - }, - - typography: { - fontFamily: { - sans: ['Your Font', 'ui-sans-serif', 'system-ui', 'sans-serif'], - mono: ['ui-monospace', 'SFMono-Regular', 'Menlo', 'monospace'], - }, - }, - - borderRadius: { - none: '0', - sm: '0.25rem', - md: '0.5rem', - lg: '0.75rem', - xl: '1rem', - '2xl': '1.5rem', - full: '9999px', - }, - - boxShadow: { - card: '0 1px 3px 0 rgb(0 0 0 / 0.1)', - dropdown: '0 4px 6px -1px rgb(0 0 0 / 0.1)', - modal: '0 10px 15px -3px rgb(0 0 0 / 0.1)', - }, -}; -``` - -## Theming - -The library uses CSS custom properties for theming. Override these variables to customize the appearance: - -```css -:root { - /* Primary color scale */ - --mieweb-primary-500: #27aae1; - - /* Semantic colors */ - --mieweb-background: hsl(0 0% 100%); - --mieweb-foreground: hsl(222.2 84% 4.9%); - - /* Border radius */ - --mieweb-radius-md: 0.5rem; - - /* Font */ - --mieweb-font-sans: 'Your Font', sans-serif; -} -``` - -### Dark Mode - -The library supports dark mode via the `.dark` class or `data-theme="dark"` attribute on a parent element: - -```tsx -import { ThemeProvider, useThemeContext, Button } from '@mieweb/ui'; +import { Button, ThemeProvider, useThemeContext } from '@mieweb/ui'; function ThemeToggle() { const { resolvedTheme, setTheme } = useThemeContext(); + return ( ); } -function App() { +export default function App() { return ( @@ -622,186 +139,92 @@ function App() { } ``` -## Components - -### Primitives - -- `Button` - Multi-variant button with loading state -- `Input` - Text input with label, error, and helper text -- `Card` - Container component with header, content, and footer -- `Text` - Typography component with variants -- `Badge` - Status indicators and labels -- `Alert` - Feedback messages - -### Specialized Inputs - -- `PhoneInput` - US phone number formatting -- `DateInput` - Date input with validation modes (DOB, expiration, etc.) - -### Overlays - -- `Tooltip` - Accessible tooltip with multiple placements -- `Dropdown` - Dropdown menu with items, separators, and labels - -### Utilities - -- `VisuallyHidden` - Screen reader only content -- `ThemeProvider` - Theme context provider - -## Hooks - -- `useTheme()` - Theme state management -- `useClickOutside()` - Detect clicks outside an element -- `useEscapeKey()` - Handle escape key press -- `useFocusTrap()` - Trap focus within a container -- `usePrefersReducedMotion()` - Detect reduced motion preference - -## Utilities - -### Class Names - -```tsx -import { cn } from '@mieweb/ui/utils'; - -// Merge classes with Tailwind conflict resolution -cn('px-4 py-2', isActive && 'bg-primary-500', className); -``` - -### Phone Utilities - -```tsx -import { formatPhoneNumber, isValidPhoneNumber } from '@mieweb/ui/utils'; - -formatPhoneNumber('5551234567'); // "(555) 123-4567" -isValidPhoneNumber('5551234567'); // true -``` - -### Date Utilities - -```tsx -import { formatDateValue, calculateAge, isValidDate } from '@mieweb/ui/utils'; - -formatDateValue('01152024'); // "01/15/2024" -calculateAge('01/15/1990'); // 34 -isValidDate('01/15/2024'); // true -``` - -## Tree-Shaking - -Import components directly for optimal bundle size: - -```tsx -// Import only what you need -import { Button } from '@mieweb/ui/components/Button'; -import { useTheme } from '@mieweb/ui/hooks'; -import { cn } from '@mieweb/ui/utils'; -``` - -## TypeScript - -All components are fully typed. Import types as needed: - -```tsx -import type { ButtonProps, InputProps, Theme } from '@mieweb/ui'; -``` - -## Releases - -This package uses automated releases via GitHub Actions. There are two release channels: - -### Release Channels - -| Channel | npm Tag | Install Command | Description | -| -------------- | -------- | ----------------------------- | ------------------------- | -| **Stable** | `latest` | `npm install @mieweb/ui` | Production-ready releases | -| **Prerelease** | `next` | `npm install @mieweb/ui@next` | Latest from `main` branch | - -### Prerelease (Automatic) - -Every push to the `main` branch automatically publishes a prerelease version to npm: - -- **Version format:** `x.y.z-dev.{run_number}` (e.g., `0.1.0-dev.45`) -- **npm tag:** `next` -- **Install:** `npm install @mieweb/ui@next` - -This allows consumers to test the latest changes before a stable release. - -### Stable Release (Manual) - -To create a stable release: - -1. Go to the repository on GitHub -2. Navigate to **Actions** → **Create Stable Release** -3. Click **Run workflow** -4. Select the version bump type: - - `patch` - Bug fixes (0.1.0 → 0.1.1) - - `minor` - New features (0.1.0 → 0.2.0) - - `major` - Breaking changes (0.1.0 → 1.0.0) -5. Click **Run workflow** - -The workflow will: - -1. Bump the version in `package.json` -2. Commit and push the change -3. Create a git tag (e.g., `v0.2.0`) -4. Trigger the release workflow which publishes to npm and creates a GitHub Release - -### Manual Tag Release - -You can also create a release by pushing a version tag directly: - -```bash -# Create and push a tag -git tag v1.0.0 -git push origin v1.0.0 -``` - -The release workflow will automatically: - -- Run tests and build -- Publish to npm with the appropriate tag (`latest` for stable, `next` for prereleases like `v1.0.0-beta.1`) -- Create a GitHub Release with auto-generated release notes - -### Version Guidelines - -We follow [Semantic Versioning](https://semver.org/): - -- **MAJOR** version for incompatible API changes -- **MINOR** version for backwards-compatible functionality additions -- **PATCH** version for backwards-compatible bug fixes - -## Contributing - -We welcome contributions! This README and the [Storybook](https://ui.mieweb.org) -are the **consumer** docs (how to _use_ the library). If you want to _build or -change_ the library itself, the **provider / maintainer** guide is -**[CONTRIBUTING.md](CONTRIBUTING.md)** — it covers repo layout, the component -anatomy and conventions, the autodocs story pattern, exports & tree-shaking, -build, testing (unit + visual baselines), submodules, brands, and the release -process. - -Quick start for contributors: - -```bash -git clone --recurse-submodules https://github.com/mieweb/ui.git -cd ui && pnpm install -pnpm storybook # http://localhost:6006 -# before opening a PR: -pnpm typecheck && pnpm lint && pnpm format && pnpm test -``` - -Non-trivial modules also carry a `MAINTAINERS.md` next to the code with internals, -invariants, and gotchas for that module — see the table in -[CONTRIBUTING.md](CONTRIBUTING.md#per-component-maintainer-notes). +In production, supply translated labels through your application's i18n system. +In Next.js App Router, put this interactive example in a client component and +import global styles from the root layout. + +Already using Tailwind? Follow the +[Tailwind 4 integration guide](https://github.com/mieweb/ui/blob/main/lessons/tailwind4-integration.md) +for CSS-first configuration, `@source`, and theme tokens. Tailwind 3 consumers can +use `@mieweb/ui/tailwind-preset`. Do not apply a Tailwind 3 configuration as a +Tailwind 4 setup. + +### Add Specialized Capabilities When Needed + +Heavy integrations use separate entry points and optional peer dependencies so +you only install what you need: + +- **Data grids:** [DataVis NITRO](https://ui.mieweb.org/?path=/docs/components-text-data-display-datavis-nitro--docs), imported from `@mieweb/ui/datavis`. +- **Form authoring and rendering:** [eSheet integration](https://github.com/mieweb/ui/blob/main/src/components/ESheet/MAINTAINERS.md), imported from `@mieweb/ui/esheet`. +- **Rich text and code editing:** [Kerebron editor setup](https://github.com/mieweb/ui/tree/main/src/components/RichEditor), imported from `@mieweb/ui/kerebron`. + +Check the selected integration's dependencies before importing its entry point. +AGGrid is deprecated for new work; start with DataVis NITRO for tabular data. + +## Explore and Compose Components + +Open [the component explorer](https://ui.mieweb.org/). Storybook is the wrapper +around the examples: its sidebar selects components, a **story** demonstrates a +particular configuration, and **Docs** presents guidance and the API. **Controls** +change example props; theme and brand tools let you inspect different appearances. +Those tools belong to Storybook, not to the component you install. + +Start with the user's task, then compare components before choosing an API: + +- **Browse and work with records:** start with [DataVis NITRO](https://ui.mieweb.org/?path=/docs/components-text-data-display-datavis-nitro--docs) + and compare [Table](https://ui.mieweb.org/?path=/docs/components-layout-structure-table--docs). + NITRO provides integrated data tooling; Table provides lower-level markup. + Consider the behavior your application would need to supply and consult the + selection rules before choosing an exception. +- **Navigate a long document:** compare [TableOfContents](https://ui.mieweb.org/?path=/docs/components-navigation-tableofcontents--docs) + and [ReadingProgressBar](https://ui.mieweb.org/?path=/docs/components-feedback-readingprogressbar--docs). + A TOC provides named destinations and navigation. A reading bar is a decorative + document-scroll cue, not navigation or proof of reading. They can complement + each other; neither may be needed for short content. +- **Assemble an application view:** explore the [Dashboard example](https://ui.mieweb.org/?path=/story/product-feature-modules-dashboard--dashboard). + Inspect how navigation, headers, and content fit together, then adapt the + composition to your workflow rather than copying the layout indiscriminately. + +For each choice, ask why it fits, when an alternative would be better, what state +your application owns, and how it behaves alongside neighboring components. +Exercise loading, empty, error, keyboard, and narrow-screen states in the actual +application, not only the isolated story. + +The catalog is still being improved: not every component has comparison or +composition guidance yet. Do not treat an isolated example as evidence that no +related component exists. Use the +[component policy](https://github.com/mieweb/ui/blob/main/lessons/component-policy.md) +and flag missing or conflicting guidance in a +[documentation issue](https://github.com/mieweb/ui/issues/new). + +### Go Deeper + +- [Branding](https://ui.mieweb.org/?path=/docs/branding--docs): the brand system and visual tokens. +- [Adoption guides](https://github.com/mieweb/ui/blob/main/lessons/README.md): integration pitfalls and migration paths for existing applications. +- [AI-assisted migration plan](https://github.com/mieweb/ui/blob/main/lessons/execution-plan.md): an ordered approach to adopting the library. +- [Meteor migration](https://github.com/mieweb/ui/blob/main/lessons/migration-meteor-blaze-to-react.md): framework-specific migration guidance. + +## Contribute or Run Locally + +To change the library, improve its guidance, or run your own Storybook, follow +[CONTRIBUTING.md](https://github.com/mieweb/ui/blob/main/CONTRIBUTING.md). It covers +repository setup, local development, tests, component conventions, and releases. +Those steps are not required to consume the npm package. + +Found unclear selection advice or an undocumented relationship? Documentation +contributions are welcome alongside component fixes. +[Edit this introduction](https://github.com/mieweb/ui/edit/main/README.md) to +improve the shared GitHub, npm, and Storybook content. Published copies update +when the package is released or the documentation site is deployed. ## License Copyright © 2026 Medical Informatics Engineering, Inc. All rights reserved. -This software is **source available** with the following terms: +This software is **source available**: -- ✅ **Free for open source projects** - Use, modify, and distribute freely in open source projects with attribution -- ✅ **Free for non-commercial use** - Personal projects, education, research -- 💼 **Commercial license required** - For proprietary products or commercial use, contact [licensing@mieweb.com](mailto:licensing@mieweb.com) +- **Free for open source projects:** use, modify, and distribute in open source projects with attribution. +- **Free for non-commercial use:** personal projects, education, and research. +- **Commercial license required:** for proprietary products or commercial use, contact [licensing@mieweb.com](mailto:licensing@mieweb.com). -See the [LICENSE](LICENSE) file for full details. +See the [LICENSE](https://github.com/mieweb/ui/blob/main/LICENSE) for full terms. diff --git a/agent/mieweb-ui.instructions.md b/agent/mieweb-ui.instructions.md index d0772cfe0..326030f95 100644 --- a/agent/mieweb-ui.instructions.md +++ b/agent/mieweb-ui.instructions.md @@ -164,6 +164,21 @@ Tailwind: on Tailwind 4, add an `@source` for `@mieweb/ui` so library classes ar If JSDoc, the console, or the docs mark something deprecated (`AGGrid` today), do not use it in new code and do not suppress the warning. Use the documented replacement. -## Rule 14: When no component exists - -First verify it truly doesn't exist — check https://ui.mieweb.org (Storybook) rather than guessing. Then build it locally, but in `@mieweb/ui` style: Tailwind utility classes with the library's design tokens, ARIA labels on interactive elements, and externalized user-facing text. Prefer composing existing primitives (`Card`, `Text`, `Badge`) over new bespoke markup. If the pattern is generic, propose contributing it upstream to `@mieweb/ui`. +## Rule 14: When existing components do not meet the need + +Before creating or materially extending a reusable component, read the +[upstream contribution guide](https://github.com/mieweb/ui/blob/main/CONTRIBUTING.md) +and follow its +[Developing Components From a Consuming Application](https://github.com/mieweb/ui/blob/main/CONTRIBUTING.md#developing-components-from-a-consuming-application) +process, including the alternatives audit, contribution-ready implementation, +submodule workflow, and PR requirements. If the guide is unavailable, report that +limitation and obtain it before proceeding with the contribution workflow. + +Present the gap and supporting evidence before implementation. Obtain approval +before introducing a submodule or changing the consuming project's dependency +strategy. Keep project-specific behavior local, and do not create a generic +abstraction solely to make it contributable. + +Follow the repository's permissions and approval requirements for commits, +pushes, and PR creation. Do not treat these instructions as authorization to +publish changes. diff --git a/src/Introduction.mdx b/src/Introduction.mdx index 433958d48..244d72266 100644 --- a/src/Introduction.mdx +++ b/src/Introduction.mdx @@ -1,1173 +1,11 @@ -import { Meta } from '@storybook/addon-docs/blocks'; -import { ArrowRight } from 'lucide-react'; -import { Button } from './components/Button'; +import { Markdown, Meta } from '@storybook/addon-docs/blocks'; +import readme from '../README.md?raw'; -# MIE Web UI - -

- npm version - React 18+ - Tailwind CSS 4 - TypeScript -
- -A **themeable, accessible React component library** built with Tailwind CSS 4. Designed for MIE's suite of healthcare applications including BlueHive, Enterprise Health, WebChart, and Waggleline. - ---- - -## 🎯 See It In Action - -
-
- - 🚀 Full Dashboard Example - - - Want to see how all the components work together? Check out a complete - dashboard implementation featuring Sidebar navigation, AppHeader, Cards, - Data tables, and more. - -
- -
- ---- - -## 📚 What is Storybook? - -This documentation site is built with **Storybook** — an interactive component explorer that lets you browse, test, and understand each component in isolation. - -
-
- 📁 Sidebar (Left Panel) - - Browse all available components organized by category. Click on any - component to see its documentation, interactive examples, and all - available variants. - -
-
- 🎮 Controls Panel - - Interact with component props in real-time. Adjust sizes, colors, states, - and content to see how components behave with different configurations. - -
-
- 🔧 Toolbar (Top) - - Switch between brand themes, toggle dark/light mode, adjust viewport - sizes, and access accessibility testing tools. - -
-
- ---- - -## ✨ Features - -
-
- 🎨 Fully Themeable - - Customize colors, fonts, border radius, and more using CSS variables - -
-
- 🏢 Multi-Brand Support - - Pre-configured themes for BlueHive, Enterprise Health, WebChart, - Waggleline, and MIE - -
-
- ♿ Accessible - - Built with WCAG guidelines, proper ARIA attributes, and keyboard - navigation - -
-
- 🌙 Dark Mode - - Built-in dark mode support with system preference detection - -
-
- 🌳 Tree-Shakeable - - Import only the components you need for optimal bundle size - -
-
- 📦 TypeScript - - Full TypeScript support with comprehensive type definitions - -
-
- ---- - -## 🚀 Quick Start - -### Installation - -```bash -npm install @mieweb/ui -# or -yarn add @mieweb/ui -# or -pnpm add @mieweb/ui -``` - -### Basic Usage - -```tsx -import { Button, Card, Input, ThemeProvider } from '@mieweb/ui'; -import '@mieweb/ui/styles.css'; - -function App() { - return ( - - - - Welcome - - - - - - - - ); -} -``` - -### With Tailwind CSS (Recommended) - -If your project uses Tailwind CSS 4, add the library's preset: - -```js -// tailwind.config.js -module.exports = { - presets: [require('@mieweb/ui/tailwind-preset')], - content: [ - // ... your content - './node_modules/@mieweb/ui/dist/**/*.js', - ], -}; -``` - ---- - -## 🎨 Brand Themes - -This library includes pre-built themes for MIE's product suite. Use the **Brand** selector in the toolbar above to preview components with different brand styles. - -
-
- BlueHive -
- #27aae1 -
- - DOT Physical scheduling platform - -
-
- Enterprise Health -
- #2563eb -
- - Occupational health management - -
-
- WebChart -
- #16a34a -
- - Electronic health records - -
-
- Waggleline -
- #17aeed -
- - Experience visualization platform - -
-
- MIE -
- #6366f1 -
- - Medical Informatics Engineering - -
-
- -### Using a Brand Theme - -```tsx -// Import the brand CSS -import '@mieweb/ui/brands/bluehive.css'; - -// Or apply programmatically -import { bluehiveBrand } from '@mieweb/ui/brands/bluehive'; -``` - ---- - -## 📖 Exploring Components - -Use the **sidebar on the left** to browse available components. Each component page includes: - -- **Interactive examples** — Live preview with real-time prop controls -- **Props documentation** — Full API reference with types and defaults -- **Accessibility notes** — Keyboard shortcuts and ARIA information -- **Code snippets** — Copy-paste ready implementation examples - -### Component Categories - -| Category | Components | -| ---------------- | ----------------------------------------------------------------------- | -| **Forms** | Input, Select, Checkbox, Radio, Switch, Textarea, DateInput, PhoneInput | -| **Buttons** | Button, Dropdown | -| **Layout** | Card, Modal, Sidebar, AppHeader, CommandPalette | -| **Feedback** | Alert, Progress, Toast, Spinner, Skeleton, Tooltip | -| **Navigation** | Breadcrumb, Pagination | -| **Data Display** | Table, Badge, Avatar | - -
- 💡 Pro Tip: Use{' '} - - ⌘ - {' '} - +{' '} - - K - {' '} - to quickly search for any component in Storybook. -
- ---- - -## 📝 eSheet — Form Builder & Renderer - -`@mieweb/ui` includes optional support for **eSheet**, a modular form builder and renderer toolkit. eSheet components are exported from a **separate entry point** (`@mieweb/ui/esheet`) so they stay out of your main bundle unless you need them. - -### What You Get - -| Export | Description | -| ---------------------- | ----------------------------------------------------------------------------------- | -| `EsheetBuilder` | Visual drag-and-drop form builder for creating and editing form definitions | -| `EsheetRenderer` | Lightweight form renderer for end-users to fill out forms | -| `FormDefinition` | TypeScript type for the form schema (from `@esheet/core`) | -| `EsheetBuilderProps` | Props type for the builder component | -| `EsheetRendererProps` | Props type for the renderer component | -| `EsheetRendererHandle` | Ref handle type for imperative renderer control (`getResponse`, `getValidResponse`) | - -### Installation - -eSheet packages are **optional peer dependencies** of `@mieweb/ui`. Install only what you need: - -```bash -# Builder + Renderer (most common) -npm install @esheet/builder @esheet/renderer - -# Renderer only (form fill-out, no editing UI) -npm install @esheet/renderer - -# Builder only (form authoring, no fill-out UI) -npm install @esheet/builder -``` - -> `@esheet/core` and `@esheet/fields` are included transitively — no need to install them separately. - -### Usage - -```tsx -import { - EsheetBuilder, - EsheetRenderer, - type FormDefinition, - type EsheetRendererHandle, -} from '@mieweb/ui/esheet'; -import '@mieweb/ui/styles.css'; -import { useRef, useState } from 'react'; - -function FormEditor() { - const [form, setForm] = useState({ - id: 'my-form', - title: 'My Form', - fields: [], - }); - - return ; -} - -function FormFillOut({ form }: { form: FormDefinition }) { - const rendererRef = useRef(null); - - const handleSubmit = () => { - if (!rendererRef.current) return; - const result = rendererRef.current.getValidResponse(); - if (result.errors.length > 0) { - console.warn('Validation errors:', result.errors); - } else { - console.log('Form response:', result.response); - } - }; - - return ( - <> - - - - ); -} -``` - -### Key Points - -- **Import path**: Always import from `@mieweb/ui/esheet`, not from `@esheet/*` directly. This ensures proper theme integration with `@mieweb/ui` brand CSS. -- **Styles**: eSheet components use `@mieweb/ui` design tokens automatically. No additional CSS import is needed beyond `@mieweb/ui/styles.css`. -- **Theming**: eSheet respects your active brand theme (BlueHive, Enterprise Health, WebChart, etc.) and dark/light mode — no extra configuration. -- **Bundle impact**: The `@mieweb/ui/esheet` entry point is tree-shaken separately from the main `@mieweb/ui` export. If you don't import it, it adds zero bytes to your bundle. - -### Full eSheet Documentation - -For advanced usage — custom field types, conditional logic, standalone/Blaze renderers, and the full API reference — see the [eSheet documentation](https://esheet-docs.os.mieweb.org). - ---- - -## 🛠️ Running Storybook Locally - -Want to develop components, browse the full library on your machine, or contribute? Getting this Storybook running locally is a two-command flow. - -### Prerequisites - -- **Node.js** ≥ 20 -- **pnpm** 10.29.1 — pinned via the repo's `packageManager` field. Enable it with `corepack enable`. -- **Git** with submodule support - -### Setup - -```bash -# 1. Clone with submodules (esheet and ychart are git submodules) -git clone --recurse-submodules https://github.com/mieweb/ui.git -cd ui - -# 2. Install dependencies -# A preinstall hook auto-inits/updates submodules — so even if you -# forgot --recurse-submodules above, this step pulls them in. -pnpm install - -# 3. Start Storybook on http://localhost:6006 -pnpm storybook -``` - -That's the whole flow — `pnpm install && pnpm storybook`. A `prestorybook` hook builds the eSheet packages automatically on first run, so the eSheet stories work out of the box with no manual build step (it's a near-instant no-op on later runs once the artifacts exist). - -
- Already cloned without submodules? - - Run git submodule update --init --recursive — or just{' '} - pnpm install, which does it for you. - -
- -### How the Sub-Packages Are Wired - -`@mieweb/ui`'s Storybook integrates three sibling MIE projects, each sourced differently: - -- **DataVis NITRO** — npm package `@mieweb/datavis`. _No build step:_ consumed as a published package (not a submodule). Powers the DataVis NITRO data-grid stories. -- **eSheet** — git submodule `packages/esheet`. _Built automatically_ by the `prestorybook` hook (nx) before Storybook starts; rebuilds only when its artifacts are missing. The form builder/renderer toolkit. -- **YChart** — git submodule `packages/ychart`. _No build step:_ the story imports it directly from source via a relative dynamic import; Storybook's Vite config supplies a `virtual:git-info` plugin, a `__YCHART_VERSION__` define, and dependency pre-bundling (`optimizeDeps`). Org-chart / visualization toolkit. - -> **Heads up:** DataVis NITRO is consumed from the published `@mieweb/datavis` npm package — it is not a git submodule, and a fresh clone does not build DataVis from source. - -### Common Commands - -- `pnpm storybook` — Run Storybook in dev mode on port 6006 -- `pnpm build-storybook` — Build the static Storybook site -- `pnpm build` — Build the publishable `@mieweb/ui` library -- `pnpm test` — Run the unit test suite (Vitest) -- `pnpm test:visual` — Run Playwright visual regression tests -- `pnpm typecheck` — Type-check without emitting -- `pnpm lint` — Lint `src/**` - ---- - -## 🔗 Resources - -- [GitHub Repository](https://github.com/mieweb/ui) — Source code and issue tracker -- [NPM Package](https://www.npmjs.com/package/@mieweb/ui) — Package registry -- [Changelog](https://github.com/mieweb/ui/releases) — Version history - ---- - -## 🤖 Migrating Your App to MIE Web UI - -Have an existing React + Tailwind project and want to adopt `@mieweb/ui`? We've built a **10-step execution plan** designed for AI agents (like GitHub Copilot, Claude, etc.) and human developers alike. Feed your AI the plan and it will systematically convert your app — replacing local/shadcn components, wiring up brand theming, cleaning up dead dependencies, and producing a structured migration report. - -This process has been **iteratively tested and validated** across 5 test cycles to achieve 100% single-pass completion. - -### How It Works - -
- - 📋 Feed these 3 files to your AI agent — in this order: - -
-
- - 1. - -
- - tailwind4-integration.md - - - Full @theme block with all CSS variable mappings and hex - fallbacks. Critical — Step 2 cannot be completed - without it. - -
-
-
- - 2. - -
- - component-policy.md - - - Complete list of 126+ available @mieweb/ui components. - Needed for Steps 4–5 to know what replacements exist. - -
-
-
- - 3. - -
- - execution-plan.md - - - The 10-step procedure. Must come last so the reference data from files - 1–2 is in context when the AI starts executing. - -
-
-
-
- Order matters — AI models lose attention on earlier content as the prompt - grows. Reference data before procedure ensures the best results. -
-
- - Then send this prompt: - - - Migrate this project to @mieweb/ui following the execution plan. Work step - by step, create the migration report first, and update it after each step. - -
-
- -Once the AI has all 3 files, it will audit your project, identify your framework, existing components, and theme system, then proceed through the migration step by step — validating each step before the next begins. - -### The 10 Steps - -
-
- Step 1 — Install - - Add @mieweb/ui as a dependency using your project's package - manager. - -
-
- Step 2 — CSS Foundation - - Wire up the brand CSS, Tailwind 4 theme block, dark mode variant, and - PostCSS configuration — the foundation everything else depends on. - -
-
- Step 3 — Brand Switching - - Set up runtime brand switching with a useBrand hook and{' '} - BrandInitializer so users can change themes on the fly. - -
-
- Step 4 — Component Swap - - Replace local or shadcn/ui components with @mieweb/ui{' '} - equivalents — Buttons first, then Modals, Forms, Data Display, Feedback, - Navigation, and Overlays. - -
-
- Step 5 — Icon Migration - - Standardize on lucide-react icons, replacing any other icon - libraries or inline SVGs. - -
-
- Step 6 — Clean Up - - Migrate cn() imports to @mieweb/ui, remove - unused dependencies (Radix, clsx, cva), and delete empty wrapper files. - -
-
- Step 7 — Accessibility Pass - - Audit interactive elements for missing ARIA labels, verify keyboard - navigation, and ensure screen reader compatibility. - -
-
- Step 8 — Testing & Verification - - Visual smoke tests across light/dark/brand combinations, responsive - checks, build verification, and a compliance audit. - -
-
- Step 9 — Gap Detection - - Identify components without @mieweb/ui equivalents, document - remaining local components, and flag candidates for upstream contribution. - -
-
- Step 10 — Migration Report - - Generate a structured MIEWEB-UI-MIGRATION.md documenting - everything: wrapper audit, compliance metrics, import map, files changed, - known gaps, and variant mappings. - -
-
- -### What You'll Get - -
- - 📄 A complete MIEWEB-UI-MIGRATION.md report including: - -
- - ✅ Project profile & framework details - - ✅ Export availability matrix - - ✅ Full wrapper file audit (every file) - - - ✅ Pattern audit (raw HTML, badges, cards) - - ✅ Post-migration import map - ✅ Before/after compliance metrics - ✅ Known gaps & kept components - - ✅ Files modified, created, and deleted - -
- - This report serves as the permanent record for PR reviewers, future - maintainers, and cross-project comparison. - -
- -### Additional Guides - -The [`lessons/`](https://github.com/mieweb/ui/tree/main/lessons) directory also includes optional reference guides: - -| Guide | Purpose | -| --------------------------------------------------------------------------------------------- | --------------------------------------------------- | -| [adopting-mieweb-ui.md](https://github.com/mieweb/ui/blob/main/lessons/adopting-mieweb-ui.md) | Audit methodology and component mapping | -| [compliance-prompt.md](https://github.com/mieweb/ui/blob/main/lessons/compliance-prompt.md) | Copy-paste AI prompt for a single-session migration | - -### Framework Support - -The plan works across frameworks — **Next.js**, **Vite**, **Remix**, **Meteor**, and more. Each step includes framework-specific notes where setup differs. - ---- - -
- 💡 Tip: Use the toolbar above to toggle dark mode and switch - between brand themes while browsing components. -
+ + {readme.replace( + 'https://ui.mieweb.org/dashboard-preview.png', + './dashboard-preview.png' + )} + From 72349b2df6bc22a1851f717a6576081e893aacb6 Mon Sep 17 00:00:00 2001 From: Doug Horner Date: Sat, 5 Sep 2026 18:17:16 -0400 Subject: [PATCH 2/3] fix(ci): align Node 24 and clarify release filters --- .github/workflows/ci.yml | 12 ++++++------ .github/workflows/create-release.yml | 2 +- CONTRIBUTING.md | 7 +++++-- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b732badc4..b42fe4533 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '24' cache: 'pnpm' - name: Install dependencies @@ -62,7 +62,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '24' cache: 'pnpm' - name: Install dependencies @@ -98,7 +98,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '24' cache: 'pnpm' - name: Install dependencies @@ -146,7 +146,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '24' cache: 'pnpm' - name: Install dependencies @@ -188,7 +188,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '24' cache: 'pnpm' - name: Install dependencies @@ -245,7 +245,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '24' cache: 'pnpm' - name: Run security audit diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index cdc0f0fb2..8b4f0b10c 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -33,7 +33,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '24' cache: 'pnpm' - name: Configure Git diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b07348bcd..ffffe9fec 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -300,8 +300,11 @@ Current notes: | Prerelease (`next`) | `npm install @mieweb/ui@next` | Eligible pushes to `main` and prerelease tags | The [release workflow](.github/workflows/release.yml) defines the triggers and -path exclusions. In particular, Markdown-only changes do not currently trigger -a `main` prerelease, so an updated README reaches npm with the next release. +path exclusions. A push changing only root-level Markdown files (such as +`README.md`) does not trigger a `main` prerelease, so a README-only update reaches +npm with the next release. Markdown in subdirectories, such as `lessons/`, is not +excluded by `*.md` and can trigger a prerelease. Changes under `.github/` are also +excluded, except for the release workflow itself. For a stable release, use GitHub Actions' **Create Stable Release** workflow and select the semantic version bump. It updates the package version and creates the From a2f1148072a5cf31c5bafdd68001df36a6c345f6 Mon Sep 17 00:00:00 2001 From: Doug Horner Date: Sat, 5 Sep 2026 18:28:56 -0400 Subject: [PATCH 3/3] docs: guide Copilot reviews on component rationale --- .github/copilot-instructions.md | 10 +++++++ CONTRIBUTING.md | 48 +++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 207bd7377..00a665f55 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -1,3 +1,13 @@ +## Copilot Code Review + +When performing a code review, read [CONTRIBUTING.md](../CONTRIBUTING.md), apply +its [Component PR Rationale and Evidence](../CONTRIBUTING.md#component-pr-rationale-and-evidence) +requirements, and follow its [Reviewing Component Guidance](../CONTRIBUTING.md#reviewing-component-guidance) +procedure. Treat missing or misleading selection guidance and crosslinks as +review findings, not merely optional prose improvements. Scope findings to new +or materially changed components and guidance affected by the PR; do not demand +a catalog-wide documentation rewrite for an unrelated change. + ## Code Quality Principles diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ffffe9fec..f4917c41e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -387,6 +387,54 @@ not a second copy of the documentation. Reviewers should be able to understand why to choose the component, when to choose something else, and how it fits with the rest of the library without reading its implementation. +### Reviewing Component Guidance + +Human and Copilot reviewers should apply the +[rationale and evidence requirements](#component-pr-rationale-and-evidence), +not just check for section headings: + +1. Identify the new or materially changed components. Read their implementation, + consumer-facing docs, stories, and relevant alternatives. Check whether the + stated rationale is supported by actual behavior; props documentation alone + does not explain why to choose a component or when not to use it. +2. Follow related-component links and verify their targets. Each relationship + should explain the choice or composition, not just say "see also." Check that + the guidance is discoverable from both affected component pages, either through + reciprocal links or a shared comparison linked from each. Do not require + arbitrary links when no meaningful relationship exists; assess the author's + explanation of the alternatives considered. +3. Check that examples support the claimed composition, including state ownership + and limitations. Similar appearance does not establish duplication: for example, + ReadingProgressBar and TableOfContents may serve complementary needs. Do not + invent a replacement recommendation or deprecation without evidence. +4. Report each actionable gap with a file or story reference, the unmet requirement, + its effect on a developer's choice, and a concrete correction. Distinguish + verified findings from questions and unavailable evidence. Keep enduring + guidance in component docs, with links from the PR rather than copied prose. + +Apply these checks to the change and affected relationships, not all historical +documentation debt. A documentation-only PR should be checked for inaccurate +guidance and broken links without requiring a new component or composition story. + +### Requesting Copilot Review + +Our [repository instructions](.github/copilot-instructions.md) direct Copilot code +review to the requirements above. On the GitHub PR, request **Copilot** under +**Reviewers**, alongside a human maintainer. After addressing feedback, request a +re-review; new pushes are not automatically reviewed unless that option is enabled. +See [Using GitHub Copilot code review](https://docs.github.com/en/copilot/how-tos/use-copilot-agents/request-a-code-review/use-code-review). + +Repository administrators can configure +[automatic reviews and Review new pushes](https://docs.github.com/en/copilot/how-tos/copilot-on-github/set-up-copilot/configure-automatic-review). +Instruction files alone do not enable automatic review or block merging. Use +repository rulesets for required checks and approvals, and retain human judgment +for component selection and documented exceptions. Copilot comments alone are +not proof that the contribution requirements have been satisfied. + +GitHub currently reads custom review instructions from the PR's head branch, so +instruction changes can be tested in the same PR. Review changes to these rules +and this guide explicitly; they are not a tamper-proof enforcement boundary. + ## Adding a new component (checklist) First complete the [alternatives audit and contribution workflow](#developing-components-from-a-consuming-application).