@nadicodeai/design-system 12.1.116 → 12.1.118
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.
- package/DESIGN.md +14 -14
- package/package.json +1 -1
package/DESIGN.md
CHANGED
|
@@ -613,10 +613,10 @@ Every chart and KPI card is a stock shadcn registry component owned by `@nadicod
|
|
|
613
613
|
- The tooltip prints the exact figure in the surface's units; the axis prints a scale (`1.6B`, `800M`).
|
|
614
614
|
- The value axis is always drawn, with five ticks on a 1, 2, 2.5, 5 or 10 step.
|
|
615
615
|
- Bars are capped in width, the grid is dashed in both directions, and plot heights are fixed.
|
|
616
|
-
- A multi-series chart has a legend below the plot, left-aligned and wrapping: a round dot and the entity name, in series order.
|
|
616
|
+
- A multi-series chart has a legend below the plot, left-aligned and wrapping: a round dot and the entity name, in series order. A usage summary instead identifies its series through the adjacent ranking's identity labels and coloured share bars, without dots.
|
|
617
617
|
- A signed comparison keeps a visible zero line so losses and gains share one baseline, and colours each bar by its consequence: `success` where the value is favourable, `destructive` where it is not.
|
|
618
618
|
- A chart is a named section: its card title is the heading that names the plot.
|
|
619
|
-
- Every chart card has one header and footer
|
|
619
|
+
- Every chart card has one header and footer: `ChartCard`, whose usage page holds them. A usage summary keeps its period and metric selectors beside its title; other period choices sit on the page's title row where the page has one. A daily axis labels every second day from the first, fewer in a half-width card. `ChartRanking` owns a usage summary's ranking and complete-list disclosure; other compact rankings remain one line per entity. A category axis is as wide as its longest name up to 128 px, a longer name wrapping to a second line; a short window's activity calendar draws larger cells and shares its row with a sibling card, never a lone narrow card.
|
|
620
620
|
|
|
621
621
|
No pie, donut, radar or dual-axis chart, and no mark or logo inside a legend. The one ring is `Gauge`, a control for a single ratio out of 100 against a fixed maximum, not a chart.
|
|
622
622
|
|
|
@@ -629,7 +629,7 @@ The order is the colour-blind safety for marks drawn in slot order, as a stack,
|
|
|
629
629
|
Rosso enters at slot 6 and verde at slot 8, so a surface whose map holds five entities or fewer never shows a red or a green that reads as error or success; past five, the legend's words carry the meaning and the hue only tells series apart.
|
|
630
630
|
|
|
631
631
|
- **One series**: `{colors.chart-1}`, titled, with no legend.
|
|
632
|
-
- **Two to ten**: the slots in order,
|
|
632
|
+
- **Two to ten**: the slots in order, identified by the legend or the usage summary's ranking.
|
|
633
633
|
- **More than ten**: the eleventh entity and every later one fold into one neutral "Everything else" in `{colors.muted}`; the page lists its entities largest first, so the tail is the smallest.
|
|
634
634
|
|
|
635
635
|
A hue follows its entity, never its rank or position: one assignment per surface, the same in a chart and its table, stable under filtering and sorting.
|
|
@@ -752,15 +752,15 @@ The Portal, Nadia and Alveare are product shells: persistent navigation on the l
|
|
|
752
752
|
| --- | --- | --- | --- | --- |
|
|
753
753
|
| Where I can go | The sidebar | Groups by viewer, one selected row | Find, Scheduled tasks, the company's Wiki and Skills, then the Agents | Inbox, Channels, Direct messages |
|
|
754
754
|
| An object's sections | The sidebar, swapped | Back link, the object, its sections | Two swaps only: ⋯ → Edit and Settings | The channel's own panels |
|
|
755
|
-
| The path | The top bar |
|
|
755
|
+
| The path | The top bar | Customer or Partner switcher on the left and the current section centred; other paths centred | The window header: the Agent's orb and name, then the chat switcher | The channel header names the channel |
|
|
756
756
|
| Find, ⌘K | The top of the sidebar | An outlined field | At the top of the list | Buzz's search, in its sidebar |
|
|
757
757
|
| The account | The sidebar's foot | With the bell | Under the update card | The package's `AccountMenu` |
|
|
758
758
|
| Getting the app | Above the account | Downloads, an outlined row | The update card, only when there is one | The update card |
|
|
759
759
|
| The page's actions | The page's title row | Secondary, primary, the three dots | The window header's trailing edge: the Agent's three dots, after the chat switcher | The channel header's trailing edge |
|
|
760
760
|
|
|
761
|
-
- **The sidebar swaps, and is never joined by a second.** Inside an object, the same column shows a back link, what you are in (its identity mark at 24 px and its name) and its sections, and the top bar keeps
|
|
761
|
+
- **The sidebar swaps, and is never joined by a second.** Inside an object, the same column shows a back link, what you are in (its identity mark at 24 px and its name) and its sections, and the top bar keeps navigation (`SidebarSections`). No rail, second column or tab row of an object's sections appears beside it. In the Portal an Agent is the exception, because she is a deployment: the sidebar stays on the places, and her sections stand as the `TabsNav` band under the top bar, as Vercel draws a deployment's tabs, at most six (Overview, Scheduled tasks, Usage, Capabilities, Messaging, Settings); a tab that holds several sections opens on the first and shows them as line tabs at the top of its content.
|
|
762
762
|
- **An area whose pages are siblings opens as a sub-menu, as Vercel's sidebar does.** Vercel marks such a row with a › at its end ("Logs", "Observability", "Firewall", "Settings"), and its press replaces the places with one row, a ‹ at its start and the area's name centred, above the area's pages as words alone, the open one filled like a selected row; a row that only opens a page has no ›. In the Portal these areas are Settings (nadicode), Company (whoever manages a company) and Library (everyone who sees it: Agent templates, Skills, Plugins), each with its › row, and Account, opened from the account menu; their pages are never tabs (`SidebarSections` without an identity, its row ending in `SidebarMenuChevron`). “Tabs imply the views share scope, URL parent, and data model” (https://vercel.com/geist/tabs): Library's pages hold different objects with different lists and different ways to add, so they are a sub-menu, as Vercel's AI Gateway is. A destination whose pages are views of one reading, Analytics, keeps its tabs, as Vercel's Analytics and OpenRouter's Activity do. The ‹ returns to where the person opened the area from.
|
|
763
|
-
- **The top bar holds
|
|
763
|
+
- **The top bar holds navigation, never the page's actions.** Customer and Partner collections and their object sections use `ScopeSwitcher`'s navigation variant on the left: the company's mark and name, a searchable list with the current company checked, and a close link back to the originating collection. The current section is centred, below the switcher on phones so the company name and status remain visible. Other pages keep the centred path, ending at the place or the object. An object's own status sits beside its name in the path and nowhere else on the page.
|
|
764
764
|
- **Find goes to places.** It opens from the outlined field at the top of the sidebar and on ⌘K, and names every sidebar place, chat and settings page; it never runs a command. Its field names what it searches, never a bare "Search"; ⌘K or Ctrl+K opens it and no other field takes that binding; a shortcut on a row is a `CommandShortcut`; and a polite live region reads how many results remain as the person types.
|
|
765
765
|
- **The account lives at the sidebar's foot.** `AccountMenu` names who is signed in and for whom, opens the account's settings from its gear, and holds Theme, Language and Sign out; the offer to get or update the app stands just above it.
|
|
766
766
|
- **Navigation names stable destinations.** An object opened from search or a link still shows its parent in the path; a return link remembers a visit and never replaces the parent. A scope selector keeps the current section when the next object has it, and otherwise opens its overview.
|
|
@@ -776,7 +776,7 @@ A product page is one of five page compositions, each answering one question fir
|
|
|
776
776
|
| Composition | Owner | First answer | Structure |
|
|
777
777
|
| --- | --- | --- | --- |
|
|
778
778
|
| Overview | `OverviewPage` | What needs attention? | The period, the figures, the chart cards, then the exceptions that need a person. Never a stack of previews of every section. |
|
|
779
|
-
| Collection | `CollectionPage` | Which record? | The title and the page's actions, the sibling collections as line tabs, one toolbar, then one line per record ("Tables and missing values"); one row is one hover and one open target.
|
|
779
|
+
| Collection | `CollectionPage` | Which record? | The title and the page's actions, the sibling collections as line tabs, one toolbar, then one line per record ("Tables and missing values"); one row is one hover and one open target. Actionable attention stands above the toolbar when present; business summaries belong to Dashboard and Analytics. A `rail` carries context intrinsic to the collection, such as the selected Library hub. The Portal's Agents are its exception, a `DataTable` of entity rows, as Vercel's Deployments list. |
|
|
780
780
|
| Object | `ObjectPage` | What is this, what can I do? | The parent in the path and its sections in the sidebar, then the object card, then its sections, each a card only where it owns a decision. An Agent's first section, Profile, opens with her `AgentProfileCard`, the same in every product. |
|
|
781
781
|
| Settings | `SettingsPage` | What can I change? | Section cards, each saving its own fields; the danger zone closes the page. |
|
|
782
782
|
| Library | `LibraryShelf` for Agent templates; `CollectionPage` for Skills and Plugins | What reusable thing can I use? | Agent templates as Vercel's Templates gallery; Skills and Plugins as an entity collection, with staff's hub as its rail. |
|
|
@@ -914,7 +914,7 @@ Every example and consuming surface covers its reachable populated, empty, loadi
|
|
|
914
914
|
| [Avatar](https://vercel.com/geist/avatar) | The `Avatar` family; a record's mark is `IdentityMark`, and an Agent is her `AgentOrb` |
|
|
915
915
|
| [Badge](https://vercel.com/geist/badge) | `Badge`; `StatusBadge` for state, `Tag` for a categorical fact |
|
|
916
916
|
| [Banner](https://vercel.com/geist/banner) | `NoticeBanner` |
|
|
917
|
-
| [Book](https://vercel.com/geist/book) | `Card`
|
|
917
|
+
| [Book](https://vercel.com/geist/book) | `Card` + `AspectRatio` and cover artwork; no book-frame export |
|
|
918
918
|
| [Breadcrumbs](https://vercel.com/geist/breadcrumbs) | The `Breadcrumb` family |
|
|
919
919
|
| [Browser](https://vercel.com/geist/browser) | `Card` + `AspectRatio` and decorative browser chrome; `DesktopShell` stays real product chrome |
|
|
920
920
|
| [Button](https://vercel.com/geist/button) | `Button`, `ButtonLink` and `buttonVariants` |
|
|
@@ -1112,16 +1112,16 @@ One wait gets one indicator. A request waiting for a person is not a wait: queue
|
|
|
1112
1112
|
|
|
1113
1113
|
### Failure surfaces
|
|
1114
1114
|
|
|
1115
|
-
A page that cannot show what was asked for opens with a picture, the way a Portal email does: one whole cut-out in art direction's editorial register, centred above the words, whose idea says what happened.
|
|
1115
|
+
A page that cannot show what was asked for opens with a picture, the way a Portal email does: one whole cut-out in art direction's editorial register, centred above the words, whose idea says what happened. Decorative artwork has no gallery caption, title, materials or year. Below the picture, on the same centre line, stand a mono eyebrow naming the situation, the page's one heading, one plain sentence, and the recovery action, which leads. The cut-out's transparent ground takes the page's own, so one file serves light and dark, and it stays whole at every width: it scales down with the column and is never cropped by the viewport. No orb turns on a failure page.
|
|
1116
1116
|
|
|
1117
1117
|
A Portal email, whether the Portal or Knock sends it, follows the same order under its picture, in one structure: the picture, the eyebrow and a short heading keep the centre line; one sentence of consequence, a list between hairlines when the email is about several things (each a semibold heading over its one sentence), a table of its facts between hairlines when it has facts, one to-do sentence, the fallback link and the footer stand flush left; the button stays centred.
|
|
1118
1118
|
|
|
1119
|
-
The not-found page and the fault page are one composition, in that order: the picture
|
|
1119
|
+
The not-found page and the fault page are one composition, in that order: the picture, the eyebrow, the title, one sentence, then the recovery first. Only a fault carries its code, and no orb turns on either. Two registers share it:
|
|
1120
1120
|
|
|
1121
|
-
- **An absence** is an address or a record that is not there. Its picture
|
|
1122
|
-
- **A fault** is a request the product stopped. Its picture
|
|
1121
|
+
- **An absence** is an address or a record that is not there. Its picture carries the joke of the missing address. Nothing went wrong, so nothing takes a feedback role, no glyph stands in for the failure and no code is printed.
|
|
1122
|
+
- **A fault** is a request the product stopped. Its picture is calm and never a joke about lost work. Below the actions stands the evidence: the diagnostic code, the word that names it and one line saying what to do with it. The error pair marks the eyebrow.
|
|
1123
1123
|
|
|
1124
|
-
An absence inside a product's own chrome, such as an address or a record the Portal cannot open, keeps its picture
|
|
1124
|
+
An absence inside a product's own chrome, such as an address or a record the Portal cannot open, keeps its picture, centred in the content region with the chrome around it. A fault inside the chrome keeps the words alone. Identity hue reaches a product failure surface only through the picture. The words never apologize and never name the mechanism ("Product messages" in `product-design`). On the website a failure surface is an ordinary full-bleed section and takes a section ground like any other.
|
|
1125
1125
|
|
|
1126
1126
|
### Agent orbs
|
|
1127
1127
|
|
|
@@ -1222,7 +1222,7 @@ The clear space is one stroke width of the rendered logo on every side. The mini
|
|
|
1222
1222
|
- Do open a failure page with one whole cut-out whose idea says what happened, labelled like a work in a museum, above the words on one centre line, with the recovery action leading and the diagnostic code only for a request that stopped. Don't apologise, don't crop the picture, don't joke about lost work, and don't put an orb on a failure page.
|
|
1223
1223
|
- Do use the dotted field only on a canvas where things are arranged. Don't put it behind lists, dashboards, settings or website sections.
|
|
1224
1224
|
- Do build a page from its composition. Don't assemble a page's header, toolbar, rows or menus by hand.
|
|
1225
|
-
- Do put
|
|
1225
|
+
- Do put navigation in the top bar and the page's actions on its title row. Don't put an action in the top bar or a second sidebar beside the first.
|
|
1226
1226
|
- Do add a shared rule here, and a component's own rule to its usage page, before a product needs it. Don't restate a rule in another document; link to it.
|
|
1227
1227
|
|
|
1228
1228
|
## Token extension
|