@nadicodeai/design-system 12.1.162 → 12.1.164

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 CHANGED
@@ -786,7 +786,7 @@ A product page is one of five page compositions, each answering one question fir
786
786
  | --- | --- | --- | --- |
787
787
  | 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. |
788
788
  | 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. |
789
- | Object | `ObjectPage` | What is this, what can I do? | The parent in the path and its product’s section navigation, 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. |
789
+ | Object | `ObjectPage` | What is this, what can I do? | The parent in the path and its product’s section navigation, then the object card, then its sections, each a card only where it owns a decision. In the Portal an Agent is an `ObjectPage` whose first tab, Agent, holds her settings as rows; in Nadia's window her Edit page opens on Profile with her `AgentProfileCard`. |
790
790
  | Settings | `SettingsPage` | What can I change? | Section cards, each saving its own fields; the danger zone closes the page. |
791
791
  | 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. |
792
792
 
@@ -1208,7 +1208,7 @@ The company is **nadicode**, lowercase. Its logo is the n, and the name drawn in
1208
1208
 
1209
1209
  1. **Mark.** The n, the logo itself, as tall as it is wide, with nothing added. It stands for the company wherever the company is recognised by its sign: app headers and compact navigation, the corner of a slide, a sticker, a stamp.
1210
1210
  2. **Wordmark.** nadicode in one geometric line with one dot over the i. The dot is the only colour in the logo, where an Agent sits. Use it wherever the company is named: the website's header, documents, proposals, invoices, email signatures, a first slide.
1211
- 3. **Icon.** The mark on a tile with rounded corners, in one of three fields. The brand tile, the white n on `{colors.identity-cobalto}`, is for favicons, avatars and the website's app icon, and is the one place the brand colour fills a logo's field. The light tile, the `{colors.ink}` n on white, is a desktop app's icon, which keeps it in the system's dark appearance. The dark tile, the white n on `{colors.identity-ink}`, is the icon wherever else it sits on a dark ground: a dark slide, a dark profile, an app's own dark screen.
1211
+ 3. **Icon.** The mark on a tile with rounded corners, in one of three fields. The brand tile, the white n on `{colors.identity-cobalto}`, is for favicons, avatars and the website's app icon, and is the one place the brand colour fills a logo's field. Where the platform crops the picture itself, a profile picture cut to a circle or a square and a phone's home screen, the tile has square corners and the platform draws its shape: the avatar is the brand tile, or the light or dark tile where a profile wants white or black, with the n across 46% of the side, so a circle cut keeps it whole with its clear space. The mark is never a profile picture: it has no field, and its n runs to the edges a crop cuts. The light tile, the `{colors.ink}` n on white, is a desktop app's icon, which keeps it in the system's dark appearance. The dark tile, the white n on `{colors.identity-ink}`, is the icon wherever else it sits on a dark ground: a dark slide, an app's own dark screen.
1212
1212
  4. **Signature form.** The light tile with its construction guides in `{colors.logo-guide}`: a dotted circle around the arch whose radius is the golden section of the n's width, the two centre axes, and the n's width and height, each measured 1.000. It is drawn from 128 px up, on light grounds: Nadia's desktop icon, a cover or closing slide, a poster, print; on a dark ground the dark tile stands in for it. Below 128 px a guide is a fraction of a pixel, so the icon drops them; drawn on a screen as a logo, such as at the top of an entry scene, it drops them at any size. Alveare draws its own mark's desktop icon the same way.
1213
1213
 
1214
1214
  The mark and the wordmark never stand side by side: the wordmark already begins with the n, so together they read "n nadicode". Each place takes one of them.
package/README.md CHANGED
@@ -26,8 +26,8 @@ Individual font files are also exposed under `@nadicodeai/design-system/assets/f
26
26
 
27
27
  [Brand media authority](DESIGN.md#brand-media-authority) says what each form
28
28
  is and where it goes, and [`examples/logo.html`](./examples/logo.html) shows
29
- them all. This table is the file behind each, with transparent PNG fallbacks
30
- for software that cannot place SVG.
29
+ them all. This table is the file behind each, with PNG fallbacks for software
30
+ that cannot place SVG.
31
31
 
32
32
  | Form | On white or a soft neutral | On black or another dark ground |
33
33
  | --- | --- | --- |
@@ -37,14 +37,18 @@ for software that cannot place SVG.
37
37
  | Icon, brand tile | `assets/app-icon` | `assets/app-icon` |
38
38
  | Icon, light and dark tiles | `assets/app-icon-light` | `assets/app-icon-dark` |
39
39
  | Signature form, from 128 px | `assets/app-icon-signature` | `assets/app-icon-dark` |
40
+ | Avatar, brand tile | `assets/avatar` | `assets/avatar` |
41
+ | Avatar, light and dark tiles | `assets/avatar-light` | `assets/avatar-dark` |
40
42
 
41
43
  The one-ink files exist for embossing, stamps and one-colour print, where a
42
44
  second colour cannot be laid down. The brand tile carries its own field, so
43
- one file serves both grounds.
45
+ one file serves both grounds. The avatars are the three tiles with square
46
+ corners, for any place that crops the picture to a circle or a square, and
47
+ their PNGs are opaque.
44
48
 
45
49
  Prefix each route with `@nadicodeai/design-system/`. Append `.png` for the
46
- transparent PNG fallback, for example
47
- `@nadicodeai/design-system/assets/wordmark-white.png`.
50
+ PNG fallback, for example `@nadicodeai/design-system/assets/wordmark-white.png`.
51
+ Every PNG but the avatars is transparent outside its drawing.
48
52
 
49
53
  ```ts
50
54
  import wordmarkUrl from "@nadicodeai/design-system/assets/wordmark";
Binary file
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="1024" height="1024" role="img" aria-label="nadicode"><rect width="1024" height="1024" rx="0" fill="#000000"/><path d="M9 150V100A41 41 0 0 1 91 100V150" transform="translate(276.48 40.96) scale(4.71)" fill="none" stroke="#ffffff" stroke-width="18"/></svg>
Binary file
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="1024" height="1024" role="img" aria-label="nadicode"><rect width="1024" height="1024" rx="0" fill="#ffffff"/><path d="M9 150V100A41 41 0 0 1 91 100V150" transform="translate(276.48 40.96) scale(4.71)" fill="none" stroke="#111111" stroke-width="18"/></svg>
Binary file
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="1024" height="1024" role="img" aria-label="nadicode"><rect width="1024" height="1024" rx="0" fill="#1e3cff"/><path d="M9 150V100A41 41 0 0 1 91 100V150" transform="translate(276.48 40.96) scale(4.71)" fill="none" stroke="#ffffff" stroke-width="18"/></svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nadicodeai/design-system",
3
- "version": "12.1.162",
3
+ "version": "12.1.164",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -97,6 +97,30 @@
97
97
  "types": "./src/assets/logo-asset.d.ts",
98
98
  "default": "./dist/assets/app-icon-signature.png"
99
99
  },
100
+ "./assets/avatar": {
101
+ "types": "./src/assets/logo-asset.d.ts",
102
+ "default": "./dist/assets/avatar.svg"
103
+ },
104
+ "./assets/avatar.png": {
105
+ "types": "./src/assets/logo-asset.d.ts",
106
+ "default": "./dist/assets/avatar.png"
107
+ },
108
+ "./assets/avatar-light": {
109
+ "types": "./src/assets/logo-asset.d.ts",
110
+ "default": "./dist/assets/avatar-light.svg"
111
+ },
112
+ "./assets/avatar-light.png": {
113
+ "types": "./src/assets/logo-asset.d.ts",
114
+ "default": "./dist/assets/avatar-light.png"
115
+ },
116
+ "./assets/avatar-dark": {
117
+ "types": "./src/assets/logo-asset.d.ts",
118
+ "default": "./dist/assets/avatar-dark.svg"
119
+ },
120
+ "./assets/avatar-dark.png": {
121
+ "types": "./src/assets/logo-asset.d.ts",
122
+ "default": "./dist/assets/avatar-dark.png"
123
+ },
100
124
  "./assets/empty/agents": {
101
125
  "types": "./src/assets/logo-asset.d.ts",
102
126
  "default": "./src/assets/empty/agents.webp"
@@ -25,6 +25,7 @@ export declare const logoWordmarkGeometry: LogoGeometry;
25
25
  export declare const APP_ICON_MARK_RATIO: number;
26
26
  export declare const FAVICON_MARK_RATIO: number;
27
27
  export declare function logoIconGeometry(size: number, markRatio: number): LogoGeometry;
28
+ export declare function logoSquareIconGeometry(size: number): LogoGeometry;
28
29
  export declare function logoSignatureGeometry(size: number): LogoGeometry;
29
30
  export declare function resolveLogoGeometry(
30
31
  geometry: LogoGeometry,
@@ -119,12 +119,12 @@ const markTransform = (size, markRatio) => {
119
119
  return `translate(${round2(inset)} ${round2(inset - N_TOP * scale)}) scale(${round2(scale)})`;
120
120
  };
121
121
 
122
- const tileNode = (size) => ({
122
+ const tileNode = (size, radiusRatio = TILE_RADIUS_RATIO) => ({
123
123
  element: "rect",
124
124
  attributes: {
125
125
  width: String(size),
126
126
  height: String(size),
127
- rx: String(Math.round(size * TILE_RADIUS_RATIO)),
127
+ rx: String(Math.round(size * radiusRatio)),
128
128
  fill: "{paint:tile}",
129
129
  },
130
130
  });
@@ -151,6 +151,20 @@ export const logoIconGeometry = (size, markRatio) =>
151
151
  nodes: [tileNode(size), placedMarkNode(markTransform(size, markRatio))],
152
152
  });
153
153
 
154
+ /**
155
+ * The icon with square corners, for a place that crops or masks the picture
156
+ * itself: a profile picture, which WhatsApp, Telegram and Google cut to a
157
+ * circle and Slack and LinkedIn to a square, and the iOS and Android home
158
+ * screens. A rounded tile there would show its transparent corners inside the
159
+ * crop. The n stays the app icon's, so a circle cut inside the square keeps
160
+ * the letter whole.
161
+ */
162
+ export const logoSquareIconGeometry = (size) =>
163
+ freezeGeometry({
164
+ viewBox: `0 0 ${size} ${size}`,
165
+ nodes: [tileNode(size, 0), placedMarkNode(markTransform(size, APP_ICON_MARK_RATIO))],
166
+ });
167
+
154
168
  const ONE_POINT_ZERO_OUTLINE =
155
169
  "M0.86 0L0.86 -3.04L0 -3.04L0 -3.47L0.35 -3.47Q0.57 -3.47 0.71 -3.53Q0.85 -3.59 0.91 -3.73Q0.96 -3.87 0.96 -4.11L1.36 -4.11L1.36 0ZM2.25 0L2.25 -0.66L2.9 -0.66L2.9 0ZM5.07 0.09Q4.58 0.09 4.21 -0.17Q3.85 -0.43 3.65 -0.91Q3.45 -1.39 3.45 -2.05Q3.45 -2.71 3.65 -3.19Q3.85 -3.68 4.21 -3.94Q4.58 -4.2 5.07 -4.2Q5.58 -4.2 5.94 -3.94Q6.31 -3.68 6.51 -3.19Q6.71 -2.72 6.71 -2.05Q6.71 -1.39 6.51 -0.91Q6.31 -0.43 5.94 -0.17Q5.58 0.09 5.07 0.09ZM5.07 -0.39Q5.61 -0.39 5.9 -0.82Q6.19 -1.26 6.19 -2.05Q6.19 -2.58 6.06 -2.96Q5.92 -3.33 5.68 -3.52Q5.43 -3.72 5.07 -3.72Q4.72 -3.72 4.47 -3.52Q4.23 -3.33 4.1 -2.96Q3.97 -2.58 3.97 -2.05Q3.97 -1.26 4.26 -0.82Q4.55 -0.39 5.07 -0.39ZM8.97 0.09Q8.47 0.09 8.11 -0.17Q7.74 -0.43 7.54 -0.91Q7.34 -1.39 7.34 -2.05Q7.34 -2.71 7.54 -3.19Q7.74 -3.68 8.11 -3.94Q8.47 -4.2 8.97 -4.2Q9.47 -4.2 9.84 -3.94Q10.2 -3.68 10.4 -3.19Q10.6 -2.72 10.6 -2.05Q10.6 -1.39 10.4 -0.91Q10.2 -0.43 9.84 -0.17Q9.47 0.09 8.97 0.09ZM8.97 -0.39Q9.5 -0.39 9.79 -0.82Q10.08 -1.26 10.08 -2.05Q10.08 -2.58 9.95 -2.96Q9.82 -3.33 9.57 -3.52Q9.33 -3.72 8.97 -3.72Q8.62 -3.72 8.37 -3.52Q8.12 -3.33 8 -2.96Q7.86 -2.58 7.86 -2.05Q7.86 -1.26 8.15 -0.82Q8.44 -0.39 8.97 -0.39ZM12.87 0.09Q12.37 0.09 12 -0.17Q11.64 -0.43 11.44 -0.91Q11.24 -1.39 11.24 -2.05Q11.24 -2.71 11.44 -3.19Q11.64 -3.68 12 -3.94Q12.37 -4.2 12.87 -4.2Q13.37 -4.2 13.74 -3.94Q14.1 -3.68 14.3 -3.19Q14.5 -2.72 14.5 -2.05Q14.5 -1.39 14.3 -0.91Q14.1 -0.43 13.74 -0.17Q13.37 0.09 12.87 0.09ZM12.87 -0.39Q13.4 -0.39 13.69 -0.82Q13.98 -1.26 13.98 -2.05Q13.98 -2.58 13.85 -2.96Q13.72 -3.33 13.47 -3.52Q13.22 -3.72 12.87 -3.72Q12.51 -3.72 12.27 -3.52Q12.02 -3.33 11.89 -2.96Q11.76 -2.58 11.76 -2.05Q11.76 -1.26 12.05 -0.82Q12.34 -0.39 12.87 -0.39Z";
156
170