@nadicodeai/ui 10.1.0 → 12.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/AGENTS.md +39 -24
  2. package/README.md +58 -124
  3. package/dist/agent-orb.d.ts +1 -1
  4. package/dist/agent-orb.d.ts.map +1 -1
  5. package/dist/assets/brand/index.json +1 -1
  6. package/dist/components/action-menu.js +1 -1
  7. package/dist/components/agent-card.d.ts.map +1 -1
  8. package/dist/components/agent-card.js +2 -4
  9. package/dist/components/agent-orb.d.ts +11 -5
  10. package/dist/components/agent-orb.d.ts.map +1 -1
  11. package/dist/components/agent-orb.js +8 -6
  12. package/dist/components/alert.js +3 -3
  13. package/dist/components/badge.js +6 -6
  14. package/dist/components/brand-field.d.ts +2 -0
  15. package/dist/components/brand-field.d.ts.map +1 -1
  16. package/dist/components/brand-field.js +3 -1
  17. package/dist/components/button.d.ts +1 -1
  18. package/dist/components/button.d.ts.map +1 -1
  19. package/dist/components/button.js +4 -5
  20. package/dist/components/carousel.js +2 -2
  21. package/dist/components/chart-bar-horizontal.js +1 -1
  22. package/dist/components/chart.js +1 -1
  23. package/dist/components/command.js +1 -1
  24. package/dist/components/context-menu.js +1 -1
  25. package/dist/components/diff-count.js +1 -1
  26. package/dist/components/dropdown-menu.js +3 -3
  27. package/dist/components/footer.d.ts +4 -7
  28. package/dist/components/footer.d.ts.map +1 -1
  29. package/dist/components/footer.js +1 -4
  30. package/dist/components/item.js +1 -1
  31. package/dist/components/kpi-card.js +2 -2
  32. package/dist/components/label-system.d.ts +1 -5
  33. package/dist/components/label-system.d.ts.map +1 -1
  34. package/dist/components/label-system.js +2 -6
  35. package/dist/components/menu-choice-row.js +1 -1
  36. package/dist/components/menubar.js +1 -1
  37. package/dist/components/object-workspace.js +1 -1
  38. package/dist/components/progress.js +1 -1
  39. package/dist/components/scope-switcher.d.ts +24 -0
  40. package/dist/components/scope-switcher.d.ts.map +1 -0
  41. package/dist/components/scope-switcher.js +34 -0
  42. package/dist/components/settings-section.d.ts +2 -1
  43. package/dist/components/settings-section.d.ts.map +1 -1
  44. package/dist/components/settings-section.js +2 -2
  45. package/dist/components/status-dot.js +1 -1
  46. package/dist/components/status-row.js +1 -1
  47. package/dist/components/table.d.ts.map +1 -1
  48. package/dist/components/table.js +1 -1
  49. package/dist/components/tabs.d.ts +11 -5
  50. package/dist/components/tabs.d.ts.map +1 -1
  51. package/dist/components/tabs.js +37 -5
  52. package/dist/components/tooltip.js +1 -1
  53. package/dist/components/trend-badge.d.ts.map +1 -1
  54. package/dist/components/trend-badge.js +1 -2
  55. package/dist/eslint/index.js +4 -0
  56. package/dist/eslint/rules/jsx-class-utility.js +1 -1
  57. package/dist/eslint/rules/no-shadcn-appearance-override.js +3 -3
  58. package/dist/eslint/rules/one-control-height.js +94 -0
  59. package/dist/eslint/rules/settings-section-description.js +45 -0
  60. package/dist/index.d.ts +1 -1
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +1 -1
  63. package/dist/internal/agent-orb-motion.d.ts +1 -0
  64. package/dist/internal/agent-orb-motion.d.ts.map +1 -1
  65. package/dist/internal/agent-orb-motion.js +6 -3
  66. package/dist/internal/agent-orb.d.ts +10 -2
  67. package/dist/internal/agent-orb.d.ts.map +1 -1
  68. package/dist/internal/agent-orb.js +19 -9
  69. package/dist/internal/assistant-ui/attachment.js +4 -4
  70. package/dist/internal/assistant-ui/follow-up-suggestions.js +1 -1
  71. package/dist/internal/assistant-ui/markdown-text.js +4 -4
  72. package/dist/internal/assistant-ui/reasoning.js +2 -2
  73. package/dist/internal/assistant-ui/thread.d.ts.map +1 -1
  74. package/dist/internal/assistant-ui/thread.js +11 -9
  75. package/dist/internal/assistant-ui/tool-group.js +2 -2
  76. package/dist/styles/components.css +9 -5
  77. package/dist/styles/globals.css +43 -0
  78. package/package.json +3 -4
  79. package/dist/components/handoff-banner.d.ts +0 -9
  80. package/dist/components/handoff-banner.d.ts.map +0 -1
  81. package/dist/components/handoff-banner.js +0 -6
  82. package/docs/activity.md +0 -113
  83. package/docs/agent-orb.md +0 -168
  84. package/docs/component-classification.md +0 -45
  85. package/docs/consuming-cross-repo.md +0 -116
  86. package/docs/contract.md +0 -388
  87. package/docs/icon-assets.md +0 -106
  88. package/docs/migration/1.0.0.md +0 -75
  89. package/docs/migration/10.0.0.md +0 -144
  90. package/docs/migration/2.0.0.md +0 -69
  91. package/docs/migration/6.0.0.md +0 -30
  92. package/docs/migration/9.0.0.md +0 -35
  93. package/docs/migration/base-ui-migration.md +0 -62
  94. package/docs/model-identity.md +0 -18
  95. package/docs/product-compositions.md +0 -96
  96. package/docs/product-sections.md +0 -200
@@ -1,144 +0,0 @@
1
- # Migrating to `@nadicodeai/ui` 10.0.0
2
-
3
- This release carries the nadicode design system settled in
4
- [the ADR](https://github.com/nadicodeai/nadicodeai/blob/main/docs/adr/2026-09-23-the-nadicode-design-system.md):
5
- the new logo and name, twelve type tokens named by role, two greens, one motion
6
- law, activity without spinners, the stepped dark ring, three Agent colours, and
7
- the website's page grammar retired. `@nadicodeai/ui` 10.0.0 requires
8
- `@nadicodeai/design-system` 10.0.0; the two packages are released in lockstep.
9
- The type renames are the largest break for consumers; start there.
10
-
11
- ## Type tokens
12
-
13
- Twelve sizes named by the role they play, Geist and Geist Mono only. Strong is
14
- a weight, not a token: a 500 run of body copy is `body-md` with
15
- `font-weight: 500`. Rename the `.nc-type-*` class and the `--nc-type-*` tokens
16
- at every call site.
17
-
18
- | Removed | Use instead |
19
- | --- | --- |
20
- | `title-lg` | `display-md` |
21
- | `title-md` | `heading-lg` |
22
- | `title-sm` | `heading-md` |
23
- | `display-md` | `heading-md` |
24
- | `display-sm` | `heading-sm` |
25
- | `body-md-strong` | `body-md` plus `font-weight: 500` |
26
- | `body-sm-strong` | `body-sm` plus `font-weight: 500` |
27
- | `caption-strong` | `caption` plus `font-weight: 500` |
28
- | `button-lg` | `body-md` plus `font-weight: 500` |
29
- | `button-md` | `body-sm` plus `font-weight: 500` |
30
- | `caption-mono` | `label-mono` |
31
-
32
- `display-xl`, `display-lg`, `body-lg`, `body-md`, `body-sm`, `caption` and
33
- `code` keep their names. `display-md` is now 40/42 rather than 24/32, so a call
34
- site that used the old small display tier moves to `heading-md`. Tracking is a
35
- display-tier exception and nothing else: the three display sizes run from
36
- -0.035em at 72px to -0.025em at 40px, and every other tier is `0px`.
37
-
38
- ## Colour tokens
39
-
40
- Two greens, and only two: `link` carries text, identity verde carries marks.
41
-
42
- | Removed | Use instead |
43
- | --- | --- |
44
- | `--nc-primary` | `--nc-identity-cobalto` for a brand mark, `--nc-link` for text, or the shadcn `--primary` role for the neutral action |
45
- | `--nc-dark-primary` | as above; the mode layer maps `--nc-identity-cobalto` in both themes |
46
- | `--nc-verde-vivo` | `--nc-identity-verde` |
47
- | `--nc-dark-verde-vivo` | `--nc-identity-verde` |
48
-
49
- The shadcn `primary` role is unchanged and still resolves to the neutral action
50
- family. `success` and `state-complete` are unchanged.
51
-
52
- ## Motion tokens
53
-
54
- | Removed | Use instead |
55
- | --- | --- |
56
- | `--nc-duration-spin` | nothing; a busy spinner is not an Agent |
57
- | `--nc-duration-typing` | nothing; the typewriter line is retired |
58
- | `--nc-duration-shimmer` | nothing; the shimmer systems are retired |
59
- | `--nc-duration-pulse` | `--nc-duration-wait`, for the one waiting line |
60
- | `.nc-anim-typing`, `.nc-anim-pulse`, `.nc-anim-shimmer` | nothing; only Agents move on their own |
61
-
62
- One default transition in every product, `confirm` on `out-strong`, is declared
63
- once in the shipped `motion.css`. One reduced-motion policy replaces the
64
- per-component switches: movement stops and paint continues, so an overlay keeps
65
- its fade and only the transform or scale it would have travelled is dropped. A
66
- component that answered reduced motion with `motion-reduce:transition-none` on a
67
- paint-only transition should drop that class; one on a mixed transition should
68
- narrow to `motion-reduce:transition-opacity` instead.
69
-
70
- ## Elevation
71
-
72
- In dark mode the four rungs step their ring: resting 12%, raised 16%, floating
73
- 22%, modal 28% white, in place of one 18% ring on every rung. Light mode and the
74
- shadow falloff are unchanged, and the `nc-elevation-*` utilities are unchanged,
75
- so a consumer that uses the rung by name needs no edit.
76
-
77
- ## Agent colours
78
-
79
- `agentOrbColors` is `cobalto`, `verde` and `arancio`, beside the inherited
80
- default. Rosso left the picker because it is exactly the error red, and a red
81
- Agent beside a red status badge read as a broken Agent. `agentOrbColorValues`
82
- and `agentOrbColorTokens` lose their `rosso` entry with it, so a caller that
83
- indexed either by a stored string must go through `resolveAgentOrb`, which maps
84
- a stored rosso, by name or by the `#d3302f` hex, to arancio. The retired
85
- spelling is exported as `retiredAgentOrbColorValues` for fixtures and tests.
86
- Nadia's ribbon keeps its rosso stripe.
87
-
88
- ## Removed components
89
-
90
- | Removed | Use instead |
91
- | --- | --- |
92
- | `components/brand` (`BrandLockup`) | `BrandWordmark` |
93
-
94
- There is no lockup any more. The wordmark names the company in full and the n
95
- is already inside it, so a placement carrying `BrandMark` and `BrandWordmark`
96
- together draws the letter twice; pick the one form the space allows.
97
- `BrandMark` and `BrandWordmark` keep their props, and their default accessible
98
- name is now `nadicode`.
99
-
100
- ## Removed assets
101
-
102
- The design system publishes seven files, as SVG and as transparent PNG, under
103
- the names the ADR gives them. Append `.png` to any route for the raster.
104
-
105
- | Removed | Use instead |
106
- | --- | --- |
107
- | `assets/logo-lockup`, `assets/logo-wordmark` | `assets/logo` |
108
- | `assets/logo-lockup-inverse`, `assets/logo-wordmark-inverse` | `assets/logo-white` |
109
- | `assets/logo-lockup-mono`, `assets/logo-wordmark-mono` | `assets/logo-one-ink` |
110
- | `assets/logo-mark` | `assets/mark` |
111
- | `assets/logo-mark-inverse` | `assets/mark-white` |
112
- | `assets/logo-mark-mono` | `assets/mark`; the n is one ink already |
113
- | `assets/logo-lockup-on-verde`, `assets/logo-mark-on-verde`, `assets/logo-wordmark-on-verde` | No replacement. The logo is never mounted on a verde field. |
114
-
115
- Added: `assets/logo-one-ink-white`, the one-ink wordmark on a dark ground, and
116
- `assets/app-icon`, the white n on the cobalto tile at 1024 for an application
117
- icon slot. The one-ink files exist for embossing, stamps and one-colour print,
118
- where a second colour cannot be laid down.
119
-
120
- `assets/logo-geometry` keeps its route and changes shape. `LogoPaints` is now a
121
- record of paint roles, `ink` for every stroked letter, `dot` for the dot over
122
- the i and `tile` for the icon's field, and a geometry that names a role the
123
- caller did not supply throws instead of rendering an unpainted shape.
124
- `resolveLogoGeometry` no longer takes `idPrefix`: the geometry emits no DOM id,
125
- so two logos on a page cannot collide. `logoLockupGeometry` is removed;
126
- `logoWordmarkGeometry` and `logoMarkGeometry` remain and `logoIconGeometry`
127
- is added.
128
-
129
- ## Tokens
130
-
131
- | Added | Why |
132
- | --- | --- |
133
- | `--nc-logo-dot` | The dot's colour, #1e3cff, and the only token a consumer paints it with. |
134
- | `--nc-logo-dot` under `.dark` | #4d6bff, so the dot does not sink into black. |
135
-
136
- A consumer that painted the logo with `--nc-primary` moves to `--nc-logo-dot`.
137
- The generated mode layer flips it under any dark ancestor, so one rendered form
138
- serves both grounds.
139
-
140
- ## The name
141
-
142
- The company is nadicode, lowercase. Package names and domains are unchanged;
143
- the accessible name of every shipped logo file and both React adapters is now
144
- `nadicode`.
@@ -1,69 +0,0 @@
1
- # Migrating to `@nadicodeai/ui` 2.0.0
2
-
3
- This release makes elevation package-owned. `shadow-plugin` is gone from the
4
- dependency tree, and `@nadicodeai/ui/globals.css` declares the four elevation
5
- utilities itself over the `--nc-elevation-*` tokens that
6
- `@nadicodeai/design-system` 2.0.0 generates. The recipes are the plugin's own
7
- values, copied byte for byte, so nothing renders differently in either mode.
8
-
9
- `@nadicodeai/ui` 2.0.0 requires `@nadicodeai/design-system` 2.0.0; the two
10
- packages are released in lockstep.
11
-
12
- ## Elevation utilities
13
-
14
- Rename every call site by the rung's role. Each utility paints the same
15
- `box-shadow` its predecessor did, with two differences in mechanics: the vendor
16
- utilities carried `!important` and tinted the falloff through
17
- `--tw-shadow-color`; `nc-elevation-*` are plain `box-shadow`, so a `shadow-*`
18
- or `hover:shadow-*` on the same element now wins where it used to lose, and no
19
- colour tints the falloff.
20
-
21
- | 1.x | 2.0.0 | Role |
22
- | --- | --- | --- |
23
- | `smooth-shadow-ring-md` | `nc-elevation-resting` | The card that sits on the page |
24
- | `smooth-shadow-ring-lg` | `nc-elevation-raised` | Active or selected work |
25
- | `smooth-shadow-ring-xl` | `nc-elevation-floating` | Menu, popover, tooltip, toast |
26
- | `smooth-shadow-ring-2xl` | `nc-elevation-modal` | Dialog, drawer, sheet |
27
-
28
- The plugin's other utilities have no replacement. `smooth-ring-*` and the
29
- `--smooth-ring-color` override are gone: each rung's optical ring is the last
30
- layer of its own recipe, black at 5% in light and white at 18% in dark, and a
31
- call site never repaints it. `nadicodeai/no-elevated-edge` still rejects a
32
- `border-*` or a second `ring-*` on the same target as an elevation.
33
-
34
- Consumers stop installing `shadow-plugin`. It was never a documented direct
35
- dependency; drop it if it was added anyway.
36
-
37
- ## DTCG token paths
38
-
39
- The generated token file nests every group under a `core` or a `register`
40
- parent. A consumer reading
41
- `@nadicodeai/design-system/tokens/dtcg` by path changes
42
- `nadicode.<group>` to `nadicode.core.<group>`:
43
-
44
- | 1.x path | 2.0.0 path |
45
- | --- | --- |
46
- | `nadicode.color` | `nadicode.core.color` |
47
- | `nadicode.spacing` | `nadicode.core.spacing` |
48
- | `nadicode.rounded` | `nadicode.core.rounded` |
49
- | `nadicode.typography` | `nadicode.core.typography` |
50
-
51
- `nadicode.core` also gains `material`, `elevation`, and `motion`, and
52
- `nadicode.register` holds the per-surface data. The emitted CSS custom property
53
- and Tailwind `@theme` names are unchanged: only the authoring path moved. The
54
- `./tailwind` JSON export's `spacing` map now holds core only; the website's
55
- page-grammar geometry and the Portal's chip density are read from
56
- `nadicode.register.website.layout` and `nadicode.register.portal.density`.
57
-
58
- ## Removed easing aliases
59
-
60
- `--nc-ease-bounce` and `--nc-ease-out` are removed. They were aliases of two
61
- curves that ship under their own names:
62
-
63
- | Removed | Use |
64
- | --- | --- |
65
- | `--nc-ease-bounce` | `--nc-ease-in-out-strong` |
66
- | `--nc-ease-out` | `--nc-ease-out-strong` |
67
-
68
- React call sites can also write the Tailwind form, `ease-nc-in-out-strong` and
69
- `ease-nc-out-strong`.
@@ -1,30 +0,0 @@
1
- # Migrating to `@nadicodeai/ui` 6.0.0
2
-
3
- This release removes contract entries that nothing rendered. `@nadicodeai/ui`
4
- 6.0.0 requires `@nadicodeai/design-system` 6.0.0; the two packages are
5
- released in lockstep.
6
-
7
- ## Removed colour tokens
8
-
9
- | Removed | Use instead |
10
- | --- | --- |
11
- | `--nc-flag-red` | `--nc-identity-rosso` for the identity red, `--nc-error` for validation feedback. Same hex as both. |
12
- | `--nc-background-100`, `--nc-background-200` | `--nc-canvas`, `--nc-canvas-soft`. Same hex. |
13
- | `--nc-dark-cyan`, `--nc-dark-cyan-soft`, `--nc-dark-cyan-deep` | No replacement; the family had no light counterpart, no prose, and no consumer. |
14
- | `register.nadia.color.*.medallion` | No replacement; the first-run medallion no longer exists. |
15
-
16
- `register.nadia.color.dark.destructive` now aliases `dark-error` with
17
- `dark-on-primary` text, the same pair the foundation's `.dark` shadcn map
18
- already resolves `destructive` to. It aliased the removed `flag-red` with
19
- white text.
20
-
21
- ## Removed Nadia asset routes
22
-
23
- `./assets/nadia-ordered-points`, `./assets/nadia-triangulated-wire` and
24
- `./assets/nadia-irregular-particles` are gone. `./assets/nadia-solid-surface`
25
- is the one approved master and the one route. The authored files stay in
26
- `brand/visual-design/images/nadia/material-states/transparent/`.
27
-
28
- ## Removed layout entry
29
-
30
- `article-frame` is no longer documented; it never had CSS.
@@ -1,35 +0,0 @@
1
- # Migrating to `@nadicodeai/ui` 9.0.0
2
-
3
- Every Agent is now an `AgentOrb`, Nadia included. This release removes the
4
- other Agent identities. `@nadicodeai/ui` 9.0.0 requires
5
- `@nadicodeai/design-system` 9.0.0; the two packages are released in lockstep.
6
-
7
- ## Removed components
8
-
9
- | Removed | Use instead |
10
- | --- | --- |
11
- | `components/forma-avatar` (`FormaAvatar`) | `components/agent-orb` (`AgentOrb`). Nadia is `form="nadia"`. |
12
- | `components/forma-appearance` (`resolveAppearance`, `shapeFor`, `defaultShape`, `formaColorValues`) | `components/agent-orb-appearance` (`resolveAgentOrb`, `shapeForOrb`, `defaultAgentOrbShape`, `agentOrbColorValues`, `agentOrbColorTokens`) |
13
- | `components/agent-visual` (`AgentVisual`) | `AgentOrb` |
14
-
15
- `resolveAgentOrb` reads every stored `forma:` spelling, the five launch role
16
- names included, as a distinct orb, so a stored look keeps drawing until
17
- someone changes it. Stored colours map to cobalto, verde, rosso and arancio;
18
- giallo, avorio and unknown values draw the inherited text colour. Store new
19
- choices as `orb:<form>` and the colour's hex, as
20
- [`agent-orb.md`](../agent-orb.md#stored-appearance) specifies.
21
-
22
- ## Added
23
-
24
- `AgentOrb` takes `form="nadia"`: her ribbon, striped azzurro, verde, the orb's
25
- pigment and rosso. `--nc-identity-azzurro` is the design-system token for her
26
- azzurro stripe.
27
-
28
- ## Removed tokens and assets
29
-
30
- | Removed | Use instead |
31
- | --- | --- |
32
- | `--nc-forma-visor`, `--nc-forma-bezel`, `--nc-forma-eye`, `--nc-forma-avorio`, `--nc-forma-sabbia` | No replacement; only Forma painted them. |
33
- | `@nadicodeai/design-system/assets/nadia-solid-surface` | `<AgentOrb form="nadia" />`. The portrait is retired as Nadia's look; the file stays in the brand archive. |
34
-
35
- The package no longer depends on `@paper-design/shaders`.
@@ -1,62 +0,0 @@
1
- # Base UI Migration
2
-
3
- `@nadicodeai/ui` now uses Base UI as its active shadcn primitive base.
4
-
5
- Current invariants:
6
-
7
- - `components.json` uses `base-nova`, and `npx shadcn@latest info --json` should report `base: "base"`.
8
- - Package source must not import `radix-ui`, `@radix-ui/*`, or `vaul`.
9
- - `cmdk` is allowed only for the stock shadcn Command component while the current `base-nova` registry declares it.
10
- - `packages/ui/package.json` must not depend on `radix-ui`, `@radix-ui/react-use-controllable-state`, or `vaul`.
11
- - Website and portal Next config must optimize `@base-ui/react`, not `radix-ui`.
12
- - Public shadcn primitive usage follows the current Base UI registry API. Base UI composition uses `render`; do not add package-local `asChild` adapters for registry-owned primitives.
13
-
14
- ## Migration Catalog
15
-
16
- Direct Base-backed shadcn replacements:
17
-
18
- - `accordion`, `alert-dialog`, `aspect-ratio`, `avatar`, `checkbox`, `collapsible`, `context-menu`, `dialog`, `drawer`, `dropdown-menu`, `hover-card`, `label`, `menubar`, `navigation-menu`, `popover`, `progress`, `radio-group`, `scroll-area`, `select`, `separator`, `sheet`, `slider`, `switch`, `tabs`, `toggle`, `toggle-group`, and `tooltip`.
19
-
20
- Package-owned helpers:
21
-
22
- - Wrapper-only components (`badge`, `breadcrumb`, `button-group`, `item`, `sidebar`, `form`) compose through Base UI's `useRender`/`mergeProps` directly; the transitional `src/lib/slot.tsx` and `src/lib/base-render.tsx` shims are removed.
23
-
24
- Removed non-shadcn Radix carriers:
25
-
26
- - `command` stays backed by shadcn's stock `cmdk` implementation while the `base-nova` registry declares that dependency.
27
- - `drawer` replaces `vaul` with Base UI Drawer.
28
-
29
- ## Breaking in 0.5.0
30
-
31
- `@nadicodeai/ui@0.5.0` removes the Radix-era compatibility layer that 0.4.x
32
- carried. Consumers upgrading from 0.4.x must migrate:
33
-
34
- - `asChild` is removed on every primitive (Button, triggers, closes, menu
35
- items). Use Base UI's `render` prop instead; when the rendered element is
36
- not a native `<button>`, also pass `nativeButton={false}` (for example
37
- `<Button nativeButton={false} render={<a href="…" />}>`).
38
- - `DropdownMenuItem` / `ContextMenuItem` / `MenubarItem` no longer accept
39
- `onSelect`. Use `onClick`, and `closeOnClick={false}` to keep the menu open
40
- (replaces the `onSelect` + `event.preventDefault()` pattern).
41
- - `PromptInputActionAddScreenshot`'s `onSelect` prop is renamed `onClick`.
42
- - `Accordion` and `ToggleGroup` drop `type="single" | "multiple"` and string
43
- values. Values are always arrays; pass `multiple` for multi-select.
44
- - `TooltipProvider` drops the `delayDuration` alias — use `delay`. HoverCard
45
- open/close delays live on `HoverCardTrigger` (`delay` / `closeDelay`), not
46
- the root.
47
- - `Drawer` drops the vaul-era `direction` / `activeSnapPoint` /
48
- `setActiveSnapPoint` aliases — use Base UI's `swipeDirection` /
49
- `snapPoint` / `onSnapPointChange`.
50
- - `DirectionProvider` drops the `dir` alias — use `direction`.
51
- - `NavigationMenuViewport` and `PopoverAnchor` are no longer exported; they
52
- have no stock base-nova equivalent.
53
- - `CollapsibleContent` / disclosure panels drop the `forceMount` alias — use
54
- Base UI's `keepMounted`.
55
-
56
- Verification:
57
-
58
- ```bash
59
- npm run build -w @nadicodeai/ui
60
- npm run test -w @nadicodeai/ui
61
- rg 'radix-ui|@radix-ui|vaul' packages/ui/src packages/ui/package.json apps/website/next.config.ts apps/portal/next.config.ts
62
- ```
@@ -1,18 +0,0 @@
1
- # Model identity compatibility adapter
2
-
3
- `ModelIdentity` is a compatibility adapter for consumers that still pass one
4
- `provider/model` string. It derives the author prefix and delegates all visual
5
- rendering to the canonical `ModelMark`; it has no provider registry, generated
6
- artwork, or presentation of its own. Unknown authors therefore receive the
7
- same neutral tile as every other `ModelMark` consumer.
8
-
9
- ```tsx
10
- import { ModelIdentity } from "@nadicodeai/ui/components/model-identity";
11
-
12
- <ModelIdentity model="anthropic/claude-sonnet-5" />;
13
- ```
14
-
15
- New consumers should import `ModelMark` and pass its `author` and `name`
16
- properties directly. The adapter keeps the older `model`, `label`, and
17
- `markSize` call shape while consumers migrate; a string `label` becomes the
18
- canonical model name, otherwise the model segment after the slash is shown.
@@ -1,96 +0,0 @@
1
- # Product Compositions
2
-
3
- Shared product compositions own repeatable presentation and interaction. Consumers bind routing, persistence, permissions, and product copy. See the [component contract](contract.md) for each family's ownership.
4
-
5
- Check first-party shadcn or assistant-ui registry patterns before adding a
6
- composition. Once adapted, reuse its maintained owner; do not assemble the same
7
- registry example again for each page.
8
-
9
- Import components through the wildcard component subpath after build:
10
-
11
- ```tsx
12
- import { SettingsSection } from "@nadicodeai/ui/components/settings-section"
13
- ```
14
-
15
- Fixtures live in:
16
-
17
- - [`../tests/guards/product-compositions.test.ts`](../tests/guards/product-compositions.test.ts)
18
- - [`../tests/guards/product-compositions-ssr.test.ts`](../tests/guards/product-compositions-ssr.test.ts)
19
- - [`../src/components/settings-section.test.tsx`](../src/components/settings-section.test.tsx)
20
-
21
- ## Boundaries
22
-
23
- | Component | Package owns | Consumer owns |
24
- | --- | --- | --- |
25
- | `SettingsSection` / `SettingsField` | Header, divided save footer, field layout, labels, descriptions, errors, and control associations. | Form state, validation, submission, persistence, settings taxonomy, and save/cancel behavior. |
26
- | `FeedbackState` | Shared empty, loading, saving, error, permission, offline, no-results, and fatal state presentation. | Recovery actions, retry behavior, permission escalation, app-specific state language. |
27
-
28
- ## Collection and command recipes
29
-
30
- Portal's [`DataTable`](../../../apps/portal/src/components/kit/data-table.tsx) is
31
- the existing app owner for collection interaction, URL state, and registry
32
- behavior. It composes the shared `Table` and `TableDetailRow` with TanStack
33
- Table, following the [shadcn Data Table guide](https://ui.shadcn.com/docs/components/base/data-table)
34
- and the `@shadcn/dashboard-01` table block. The shared row owns compact fact
35
- geometry; a caller supplies its labels and values. Keep Portal's adapter for
36
- its existing consumers instead of introducing a second package table API.
37
-
38
- The shared [`command`](../src/components/command.tsx) component includes
39
- `CommandDialog`, as the [shadcn Command guide](https://ui.shadcn.com/docs/components/base/command)
40
- documents. A product composes its commands there and owns search data,
41
- selection effects, shortcuts, routing, and permission checks. The Portal
42
- command dialog is the current app owner for Portal navigation commands.
43
-
44
- ## SettingsSection
45
-
46
- Use `SettingsSection` and `SettingsField` for horizontal settings rows that need consistent label, description, error, and control alignment.
47
-
48
- ```tsx
49
- <SettingsSection
50
- title="Workspace defaults"
51
- description="Shared defaults for agent work."
52
- footer={<Button type="submit">Save</Button>}
53
- >
54
- <SettingsField
55
- id="review-window"
56
- label="Review window"
57
- description="How long approvals stay visible."
58
- error={reviewWindowError}
59
- invalid={Boolean(reviewWindowError)}
60
- >
61
- {({ controlProps }) => (
62
- <Input {...controlProps} value={reviewWindow} onChange={onReviewWindowChange} />
63
- )}
64
- </SettingsField>
65
- </SettingsSection>
66
- ```
67
-
68
- | Prop | Purpose |
69
- | --- | --- |
70
- | `title` / `description` / `actions` | Section header content and right-side action slot. |
71
- | `footer` | Local Save/Cancel controls and completion feedback. The owning form wraps the section. |
72
- | `id` / `label` | Required field identity and accessible label. |
73
- | `description` / `error` / `invalid` | Field helper text, error text, and invalid state. |
74
- | `children` | A render function receives `controlProps` for the real control in server and client components. |
75
-
76
- Spread `controlProps` onto the real control. SettingsField invokes the callback
77
- before rendered children cross any client boundary; it does not forward the
78
- callback to a client component. The [contract](contract.md) owns the field's
79
- accessibility and state guarantees.
80
-
81
- ## FeedbackState
82
-
83
- Use `FeedbackState` when a surface needs a standard state panel outside an app-owned shadcn table adaptation.
84
-
85
- ```tsx
86
- <FeedbackState
87
- status="offline"
88
- title="Connection paused"
89
- description="Reconnect before continuing with this agent session."
90
- actions={<ReconnectButton />}
91
- />
92
- ```
93
-
94
- Supported statuses: `empty`, `loading`, `saving`, `error`, `permission`, `offline`, `no-results`, and `fatal`.
95
-
96
- Accessibility: loading and saving states render with polite status semantics. Error, permission, offline, and fatal states render as alerts.
@@ -1,200 +0,0 @@
1
- # Product Sections
2
-
3
- U5 adds shared shell skeletons, plugin containment, installer states, and automation/settings sections. These components are presentational only. Consumers own routing, persistence, server actions, runtime adapters, permission decisions, retries, plugin trust, installer side effects, analytics, and product-specific page copy.
4
-
5
- Import components through the existing component subpath after build:
6
-
7
- ```tsx
8
- import { DashboardShell } from "@nadicodeai/ui/components/dashboard-shell"
9
- import { PluginSlotBoundary } from "@nadicodeai/ui/components/plugin-slot-boundary"
10
- ```
11
-
12
- Fixtures live in:
13
-
14
- - [`../tests/guards/product-sections.test.ts`](../tests/guards/product-sections.test.ts)
15
- - [`../tests/guards/product-sections-ssr.test.ts`](../tests/guards/product-sections-ssr.test.ts)
16
-
17
- ## Boundaries
18
-
19
- | Component | Package owns | Consumer owns |
20
- | --- | --- | --- |
21
- | `DashboardShell` | Responsive slot layout, sidebar/header/content/inspector regions, mobile sidebar trigger, focusable shell structure, overflow containment. | Route state, nav definitions, page data, permission filtering, tenant/workspace context, page-specific copy. |
22
- | `DesktopAppShell` | Titlebar/statusbar framing, activity rail, primary/secondary/inspector panes, resizable panel composition, overflow containment. | Desktop runtime, window controls, route selection, IPC, command execution, local persistence. |
23
- | `InstallerShell` | Welcome/progress/success/failure presentation, progress display, step list, feedback-state composition. | Installer state machine, platform checks, downloads, retries, recovery behavior, logs. |
24
- | `PluginSlotBoundary` | Visible plugin content boundary, permission badges, warning/error alerts, contained overflow, redaction guidance. | Plugin runtime, trust decisions, install/remove actions, grants, sandbox policy, secrets. |
25
- | `AutomationSection` | Automation row layout, status badges, enable switch placement, empty state. | Automation definitions, scheduling, execution, persistence, permission rules. |
26
- | `ProviderSettings` | Provider setting rows built on `SettingsSection` and `SettingsField`. | Provider list, validation, saving, rate limits, billing or policy behavior. |
27
- | `McpServerSettings` | MCP server rows, status badges, enable switch placement, field semantics. | Server discovery, connection checks, grants, persistence, tool execution. |
28
- | `EnvironmentVariablesSettings` | Variable name rows and redacted state display. | Secret storage, reveal controls, value validation, rotation, syncing. |
29
-
30
- ## DashboardShell
31
-
32
- Use `DashboardShell` when a web/admin surface needs shared app chrome without the package owning navigation.
33
-
34
- ```tsx
35
- <DashboardShell
36
- sidebar={<WorkspaceNav />}
37
- sidebarHeader={<WorkspaceSwitcher />}
38
- sidebarFooter={<AccountMenu />}
39
- header={<PageHeading />}
40
- headerActions={<RunAction />}
41
- inspector={<PermissionSummary />}
42
- >
43
- <AgentQueue />
44
- </DashboardShell>
45
- ```
46
-
47
- | Prop | Purpose |
48
- | --- | --- |
49
- | `sidebar` | Sidebar content slot. Consumers pass nav items or any compatible sidebar content. |
50
- | `header` / `headerActions` | Top chrome slots. The package adds the mobile navigation trigger. |
51
- | `children` | Main content region. |
52
- | `inspector` | Optional right-side inspector that stacks below content on smaller screens. |
53
- | `sidebarHeader` / `sidebarFooter` | Optional sidebar framing slots. |
54
- | `sidebarSide` / `sidebarVariant` / `sidebarCollapsible` | Pass-through shell options over the existing sidebar primitive. |
55
-
56
- Accessibility: the shell exposes labeled content and inspector regions. The mobile trigger has an accessible label and the underlying sidebar primitive preserves keyboard access and collapsed labels.
57
-
58
- ## DesktopAppShell
59
-
60
- Use `DesktopAppShell` for desktop-shaped layouts where the consumer owns runtime behavior.
61
-
62
- ```tsx
63
- <DesktopAppShell
64
- title="Nadia desktop"
65
- activityRail={<ActivityButtons />}
66
- secondaryPane={<RunContext />}
67
- inspectorRail={<Inspector />}
68
- statusbar={<StatusLine />}
69
- >
70
- <Workspace />
71
- </DesktopAppShell>
72
- ```
73
-
74
- | Prop | Purpose |
75
- | --- | --- |
76
- | `title` / `titlebar` / `titlebarActions` | Titlebar slots. `titlebar` can replace the default title row. |
77
- | `activityRail` | Left rail slot for mode buttons or app tools. |
78
- | `children` | Primary pane. |
79
- | `secondaryPane` | Optional resizable middle pane. |
80
- | `inspectorRail` | Optional resizable inspector pane. |
81
- | `statusbar` | Bottom status slot. |
82
- | `primaryPaneSize` / `secondaryPaneSize` / `inspectorPaneSize` | Initial resizable panel sizes. |
83
-
84
- The component does not assume browser routing, desktop IPC, or command execution.
85
-
86
- ## InstallerShell
87
-
88
- Use `InstallerShell` for installer or setup flows with an app-owned state machine.
89
-
90
- ```tsx
91
- <InstallerShell
92
- state="progress"
93
- title="Installing"
94
- description="Preparing the local workspace."
95
- progressValue={62}
96
- steps={[
97
- { id: "package", label: "Prepare package", status: "complete" },
98
- { id: "settings", label: "Apply settings", status: "running" },
99
- ]}
100
- actions={<CancelButton />}
101
- />
102
- ```
103
-
104
- Supported states: `welcome`, `progress`, `success`, and `failure`.
105
-
106
- Step statuses: `pending`, `running`, `complete`, and `error`.
107
-
108
- The shell uses `FeedbackState` for the primary state message. Consumers provide the installer state, recovery actions, and side effects.
109
-
110
- ## PluginSlotBoundary
111
-
112
- Use `PluginSlotBoundary` around extension or plugin-rendered content. It makes the plugin boundary visible and keeps overflow contained.
113
-
114
- ```tsx
115
- <PluginSlotBoundary
116
- title="Planner plugin"
117
- status="warning"
118
- permissions={[
119
- { id: "files", label: "Read files", level: "review" },
120
- { id: "network", label: "Network blocked", level: "denied" },
121
- ]}
122
- warning="Review plugin scope before granting access."
123
- >
124
- <PluginPreview />
125
- </PluginSlotBoundary>
126
- ```
127
-
128
- Supported statuses: `ready`, `warning`, `error`, and `disabled`.
129
-
130
- Permission levels: `safe`, `review`, `risk`, and `denied`.
131
-
132
- Redaction rule: package fixtures and examples may show synthetic names, variable names, and redacted placeholders only. They must not include secret values, environment variable values, raw terminal output, user memory, or hidden reasoning.
133
-
134
- ## AutomationSection
135
-
136
- Use `AutomationSection` for a list of app-owned automations.
137
-
138
- ```tsx
139
- <AutomationSection
140
- title="Automation runs"
141
- automations={[
142
- {
143
- id: "briefing",
144
- title: "Briefing preparation",
145
- description: "Drafts a review packet.",
146
- status: "running",
147
- enabled: true,
148
- toggleLabel: "Toggle briefing preparation",
149
- },
150
- ]}
151
- onAutomationEnabledChange={setAutomationEnabled}
152
- />
153
- ```
154
-
155
- Supported statuses: `ready`, `running`, `paused`, `error`, and `disabled`.
156
-
157
- The callback reports a requested toggle. It does not save, schedule, retry, or execute anything.
158
-
159
- ## Settings Patterns
160
-
161
- `ProviderSettings`, `McpServerSettings`, and `EnvironmentVariablesSettings` compose `SettingsSection` and `SettingsField` so settings rows share label, description, error, invalid, disabled, and control alignment behavior.
162
-
163
- ```tsx
164
- <ProviderSettings
165
- fields={[
166
- {
167
- id: "provider",
168
- label: "Provider",
169
- description: "Displayed provider label.",
170
- value: "Nadia synthetic provider",
171
- },
172
- ]}
173
- />
174
-
175
- <McpServerSettings
176
- servers={[
177
- {
178
- id: "docs",
179
- label: "Docs server",
180
- description: "Read-only documentation context.",
181
- status: "connected",
182
- enabled: true,
183
- },
184
- ]}
185
- />
186
-
187
- <EnvironmentVariablesSettings
188
- variables={[
189
- {
190
- id: "model-key",
191
- name: "NADIA_MODEL_KEY",
192
- description: "Configured by the consuming app.",
193
- state: "configured",
194
- required: true,
195
- },
196
- ]}
197
- />
198
- ```
199
-
200
- Environment variable rows intentionally render names and redacted state only. They do not accept or display actual values.