@nadicodeai/ui 12.1.33 → 12.1.35

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.
@@ -7,7 +7,7 @@
7
7
  * the resolver from here; the orb comes from `@nadicodeai/ui/components/agent-orb`,
8
8
  * and neither module re-exports the other.
9
9
  */
10
- import type { AgentOrbFigure, AgentOrbForm } from "../internal/agent-orb.js";
10
+ import type { AgentOrbForm } from "../internal/agent-orb.js";
11
11
  export type { AgentOrbFigure, AgentOrbForm } from "../internal/agent-orb.js";
12
12
  /** What Nadia stores for an Agent's look, and reports to the Portal. Both may be absent or unknown. */
13
13
  export interface StoredAgentOrbAppearance {
@@ -62,7 +62,7 @@ export declare const defaultAgentOrbShape: string;
62
62
  export declare function resolveAgentOrb(stored: StoredAgentOrbAppearance, { root }?: {
63
63
  root?: boolean;
64
64
  }): {
65
- form: AgentOrbFigure;
65
+ form: AgentOrbForm | "nadia";
66
66
  color: AgentOrbColor | undefined;
67
67
  };
68
68
  //# sourceMappingURL=agent-orb-appearance.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-orb-appearance.d.ts","sourceRoot":"","sources":["../../src/components/agent-orb-appearance.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzE,uGAAuG;AACvG,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,8EAA8E;AAC9E,eAAO,MAAM,aAAa,+EAQkB,CAAC;AAE7C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,cAAc,0CAA2C,CAAC;AACvE,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAI7D,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAI7D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,0BAA0B;;CAAgC,CAAC;AAaxE,oDAAoD;AACpD,eAAO,MAAM,WAAW,GAAI,MAAM,YAAY,KAAG,MAAuB,CAAC;AAEzE,0DAA0D;AAC1D,eAAO,MAAM,mBAAmB,EAAE,YAAsB,CAAC;AACzD,eAAO,MAAM,oBAAoB,EAAE,MAAyC,CAAC;AAsB7E;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,wBAAwB,EAChC,EAAE,IAAY,EAAE,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GACxC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,aAAa,GAAG,SAAS,CAAA;CAAE,CAG5D"}
1
+ {"version":3,"file":"agent-orb-appearance.d.ts","sourceRoot":"","sources":["../../src/components/agent-orb-appearance.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzE,uGAAuG;AACvG,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,8EAA8E;AAC9E,eAAO,MAAM,aAAa,+EAQkB,CAAC;AAE7C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,cAAc,0CAA2C,CAAC;AACvE,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAI7D,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAI7D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,0BAA0B;;CAAgC,CAAC;AAaxE,oDAAoD;AACpD,eAAO,MAAM,WAAW,GAAI,MAAM,YAAY,KAAG,MAAuB,CAAC;AAEzE,0DAA0D;AAC1D,eAAO,MAAM,mBAAmB,EAAE,YAAsB,CAAC;AACzD,eAAO,MAAM,oBAAoB,EAAE,MAAyC,CAAC;AAsB7E;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,wBAAwB,EAChC,EAAE,IAAY,EAAE,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GACxC;IAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC;IAAC,KAAK,EAAE,aAAa,GAAG,SAAS,CAAA;CAAE,CAGpE"}
@@ -1 +1 @@
1
- {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../src/components/field.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGlE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG3C,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,+BAW1E;AAED,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAA;CAAE,+BAYnE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,+BAWvE;AAED,QAAA,MAAM,aAAa;;8EAajB,CAAC;AAEH,iBAAS,KAAK,CAAC,EACb,SAAS,EACT,WAAwB,EACxB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,+BAUlE;AAED,iBAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,+BAQzE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,KAAK,CAAC,+BAY9E;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,+BAWvE;AAED,iBAAS,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,+BAa3E;AAED,iBAAS,cAAc,CAAC,EACtB,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,+BAsBA;AAED,iBAAS,UAAU,CAAC,EAClB,SAAS,EACT,QAAQ,EACR,MAAM,EACN,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;CAClD,sCAuCA;AAED,OAAO,EACL,KAAK,EACL,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,WAAW,EACX,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,UAAU,GACX,CAAC"}
1
+ {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../src/components/field.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGlE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG3C,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,+BAW1E;AAED,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAA;CAAE,+BAYnE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,+BAWvE;AAED,QAAA,MAAM,aAAa;;8EAajB,CAAC;AAEH,iBAAS,KAAK,CAAC,EACb,SAAS,EACT,WAAwB,EACxB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,+BAUlE;AAKD,iBAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,+BAWzE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,KAAK,CAAC,+BAY9E;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,+BAWvE;AAED,iBAAS,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,+BAa3E;AAED,iBAAS,cAAc,CAAC,EACtB,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,+BAsBA;AAED,iBAAS,UAAU,CAAC,EAClB,SAAS,EACT,QAAQ,EACR,MAAM,EACN,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;CAClD,sCAuCA;AAED,OAAO,EACL,KAAK,EACL,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,WAAW,EACX,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,UAAU,GACX,CAAC"}
@@ -29,8 +29,11 @@ const fieldVariants = cva("group/field flex w-full gap-2 data-[invalid=true]:tex
29
29
  function Field({ className, orientation = "vertical", ...props }) {
30
30
  return (_jsx("div", { role: "group", "data-slot": "field", "data-orientation": orientation, className: cn(fieldVariants({ orientation }), className), ...props }));
31
31
  }
32
+ // A label here is a sentence beside its control, and may wrap or carry links,
33
+ // so it flows as one run of text with a readable line height instead of the
34
+ // single-line flex row a label has on its own.
32
35
  function FieldContent({ className, ...props }) {
33
- return (_jsx("div", { "data-slot": "field-content", className: cn("group/field-content flex flex-1 flex-col gap-0.5", className), ...props }));
36
+ return (_jsx("div", { "data-slot": "field-content", className: cn("group/field-content flex flex-1 flex-col gap-1 *:data-[slot=field-label]:block *:data-[slot=field-label]:leading-snug", className), ...props }));
34
37
  }
35
38
  function FieldLabel({ className, ...props }) {
36
39
  return (_jsx(Label, { "data-slot": "field-label", className: cn("group/field-label peer/field-label flex w-fit gap-2 group-data-[disabled=true]/field:opacity-50 has-data-checked:border-primary/30 has-data-checked:bg-primary/5 has-[>[data-slot=field]]:rounded-md has-[>[data-slot=field]]:border *:data-[slot=field]:p-2.5", "has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col", className), ...props }));
@@ -11,7 +11,10 @@
11
11
  * - a lucide icon inside a `Button` carries `data-icon`, the hook the button's
12
12
  * own spacing rules key on;
13
13
  * - a settings submit action uses SettingsSection's shared footer, so each
14
- * caller cannot rebuild its own divider, padding, and action position.
14
+ * caller cannot rebuild its own divider, padding, and action position;
15
+ * - the label and description beside a control in a `Field` sit in
16
+ * `FieldContent`, the slot a horizontal field keys on to align its checkbox
17
+ * with the first line of text rather than the middle of the block.
15
18
  *
16
19
  * Standard tool checked first: `jsx-a11y` covers roles and ARIA on
17
20
  * intrinsic elements and says nothing about these composed components;
@@ -77,6 +80,18 @@ function ancestorNames(node, sourceCode) {
77
80
  .filter(Boolean);
78
81
  }
79
82
 
83
+ /** A FieldLabel or FieldDescription grouped in a plain element directly inside a Field. */
84
+ function fieldTextOutsideContent(node) {
85
+ const tag = elementName(node);
86
+ if (tag !== "FieldLabel" && tag !== "FieldDescription") return false;
87
+ const group = node.parent?.parent;
88
+ if (group?.type !== "JSXElement") return false;
89
+ const groupName = elementName(group);
90
+ if (!groupName || groupName[0] !== groupName[0].toLowerCase()) return false;
91
+ const field = group.parent;
92
+ return field?.type === "JSXElement" && elementName(field) === "Field";
93
+ }
94
+
80
95
  function isIconTag(tagName) {
81
96
  return tagName === "Icon" || tagName.endsWith("Icon");
82
97
  }
@@ -129,6 +144,8 @@ export const shadcnComposition = {
129
144
  buttonIcon: "An icon inside Button must carry data-icon.",
130
145
  settingsFooter:
131
146
  "Put a SettingsSection submit action in its footer prop; the shared component owns the divider, spacing, and action position.",
147
+ fieldContent:
148
+ "Group a Field's label and description in FieldContent, not a plain element; a horizontal Field aligns its control to the text through that slot.",
132
149
  },
133
150
  },
134
151
  create(context) {
@@ -146,6 +163,10 @@ export const shadcnComposition = {
146
163
  context.report({ node, messageId: "settingsFooter" });
147
164
  }
148
165
 
166
+ if (fieldTextOutsideContent(node)) {
167
+ context.report({ node, messageId: "fieldContent" });
168
+ }
169
+
149
170
  const title = OVERLAY_TITLES[tag];
150
171
  if (title && !hasDescendant(element, title)) {
151
172
  context.report({ node, messageId: "overlayTitle", data: { tag, title } });
@@ -1 +1 @@
1
- {"version":3,"file":"agent-orb-motion.d.ts","sourceRoot":"","sources":["../../src/internal/agent-orb-motion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;AAa7F,wBAAgB,WAAW,CAAC,IAAI,EAAE,cAAc,UAE/C;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,UAGpE;AAKD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,UAIlE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM;;;;;;;;EA0CjF;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,wBAAwB,EACjC,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,KAAK,EAAE,MAAM,GAAG,OAAO;AACvB,mFAAmF;AACnF,GAAG,SAAI,QAgER"}
1
+ {"version":3,"file":"agent-orb-motion.d.ts","sourceRoot":"","sources":["../../src/internal/agent-orb-motion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;AAc7F,wBAAgB,WAAW,CAAC,IAAI,EAAE,cAAc,UAE/C;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,UAGpE;AAKD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,UAIlE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM;;;;;;;;EA0CjF;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,wBAAwB,EACjC,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,KAAK,EAAE,MAAM,GAAG,OAAO;AACvB,mFAAmF;AACnF,GAAG,SAAI,QAgER"}
@@ -1,6 +1,7 @@
1
1
  const personalities = {
2
2
  ribbon: { speed: 0.55, tilt: 0.15 },
3
3
  nadia: { speed: 0.55, tilt: 0.15 },
4
+ sofia: { speed: 0.55, tilt: -0.15 },
4
5
  lattice: { speed: 0.28, tilt: -0.12 },
5
6
  orbit: { speed: 0.7, tilt: 0.2 },
6
7
  globe: { speed: 0.35, tilt: -0.16 },
@@ -10,8 +10,11 @@ declare const agentOrbForms: {
10
10
  readonly morph: "shaping";
11
11
  };
12
12
  export type AgentOrbForm = keyof typeof agentOrbForms;
13
- /** A chosen form, or Nadia's own ribbon, which nobody chooses. */
14
- export type AgentOrbFigure = AgentOrbForm | "nadia";
13
+ /**
14
+ * A chosen form, or one of nadicode's own two Agents, whose figures nobody
15
+ * chooses: Nadia's ribbon, and Sofia's, the same ribbon facing hers.
16
+ */
17
+ export type AgentOrbFigure = AgentOrbForm | "nadia" | "sofia";
15
18
  export type AgentOrbSize = 20 | 24 | 32 | 40 | 64 | 96 | 160;
16
19
  /** How loudly one orb reads on its own ground. */
17
20
  export type AgentOrbPresence = "plain" | "over-picture";
@@ -1 +1 @@
1
- {"version":3,"file":"agent-orb.d.ts","sourceRoot":"","sources":["../../src/internal/agent-orb.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EAEb,KAAK,QAAQ,EAId,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,KAAK,aAAa,EAMnB,MAAM,oBAAoB,CAAC;AAE5B,QAAA,MAAM,aAAa;;;;;;;;CAQ0B,CAAC;AAE9C,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,aAAa,CAAC;AACtD,kEAAkE;AAClE,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,OAAO,CAAC;AACpD,MAAM,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;AAE7D,kDAAkD;AAClD,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,cAAc,CAAC;AACxD,+FAA+F;AAC/F,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,CAAC;AAiClD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAuDpF;AA4FD,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,cAAc,CAAC;IACrB;;;OAGG;IACH,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,GAClD,CAAC;IAAE,MAAM,CAAC,EAAE,QAAQ,CAAC;IAAC,KAAK,CAAC,EAAE,aAAa,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,CAAC;AAExF,wBAAgB,aAAa,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,oBAAoB;;sBAIzC,OAAO;qBAAuB,aAAa;EAmMvF"}
1
+ {"version":3,"file":"agent-orb.d.ts","sourceRoot":"","sources":["../../src/internal/agent-orb.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EAEb,KAAK,QAAQ,EAId,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,KAAK,aAAa,EAMnB,MAAM,oBAAoB,CAAC;AAE5B,QAAA,MAAM,aAAa;;;;;;;;CAQ0B,CAAC;AAE9C,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,aAAa,CAAC;AACtD;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,OAAO,GAAG,OAAO,CAAC;AAC9D,MAAM,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;AAE7D,kDAAkD;AAClD,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,cAAc,CAAC;AACxD,+FAA+F;AAC/F,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,CAAC;AAiDlD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAuDpF;AAoGD,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,cAAc,CAAC;IACrB;;;OAGG;IACH,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,GAClD,CAAC;IAAE,MAAM,CAAC,EAAE,QAAQ,CAAC;IAAC,KAAK,CAAC,EAAE,aAAa,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,CAAC;AAExF,wBAAgB,aAAa,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,oBAAoB;;sBAIzC,OAAO;qBAAuB,aAAa;EAmMvF"}
@@ -28,6 +28,20 @@ const presenceWeights = {
28
28
  const nadiaStripes = ["--nc-identity-azzurro", "--nc-identity-verde", null, "--nc-identity-rosso"];
29
29
  const celebrationTokens = ["--nc-chart-5", "--nc-chart-6", "--nc-warning", "--nc-chart-4"];
30
30
  const appearanceTokens = [...celebrationTokens, ...nadiaStripes.filter((token) => token !== null)];
31
+ /**
32
+ * Sofia's four stripes: cobalto, giallo, the orb's own pigment and arancio, the
33
+ * identity hues Nadia does not wear, so side by side the two carry all six.
34
+ */
35
+ const sofiaStripes = [
36
+ "--nc-identity-cobalto",
37
+ "--nc-identity-giallo",
38
+ null,
39
+ "--nc-identity-arancio",
40
+ ];
41
+ const figureStripes = {
42
+ nadia: nadiaStripes,
43
+ sofia: sofiaStripes,
44
+ };
31
45
  /** A stable direction on the unit sphere, the vendor's Fibonacci lattice. */
32
46
  function fibonacci(i, n) {
33
47
  const y = 1 - (2 * (i + 0.5)) / n;
@@ -92,13 +106,21 @@ export function stripedRibbonFrame(size, t, opts) {
92
106
  }
93
107
  return finalizeFrame(dots, [], opts.rMin);
94
108
  }
109
+ /** Sofia's ribbon faces Nadia's: the same frame, mirrored across the vertical axis. */
110
+ function facing(frame, size) {
111
+ for (const dot of frame.dots)
112
+ dot.x = size - dot.x;
113
+ return frame;
114
+ }
95
115
  function paintAgentOrb(context, input) {
96
116
  const { form, size, seconds, color, state, age, reduced, breath, celebrationColors, stripeColors, } = input;
97
117
  const presence = presenceWeights[input.presence];
98
- const preset = resolvePreset(agentOrbForms[form === "nadia" ? "ribbon" : form], size <= 32 ? 20 : 64);
118
+ const preset = resolvePreset(agentOrbForms[form === "nadia" || form === "sofia" ? "ribbon" : form], size <= 32 ? 20 : 64);
99
119
  const frame = form === "nadia"
100
120
  ? stripedRibbonFrame(size, seconds, preset.opts)
101
- : MODE_FRAMES[preset.mode](size, seconds, preset.opts);
121
+ : form === "sofia"
122
+ ? facing(stripedRibbonFrame(size, seconds, preset.opts), size)
123
+ : MODE_FRAMES[preset.mode](size, seconds, preset.opts);
102
124
  context.clearRect(0, 0, size, size);
103
125
  const pose = motionPose(form, input.motion === "ambient" ? "idle" : state, reduced ? (state === "done" ? 2 : 0.6) : age);
104
126
  const gestureSeconds = reduced ? 0.8 : age / (state === "done" ? 0.575 : 0.2875);
@@ -269,7 +291,7 @@ export function mountAgentOrb(canvas, options) {
269
291
  appearanceKey = readAppearanceKey(appearance, painted);
270
292
  color = appearance.color;
271
293
  celebrationColors = celebrationTokens.map((token) => computedColor(`color-mix(in oklch, ${appearance.getPropertyValue(token).trim() || color} 75%, white)`));
272
- stripeColors = nadiaStripes.map((token) => (token && appearance.getPropertyValue(token).trim()) || color);
294
+ stripeColors = (figureStripes[form] ?? []).map((token) => (token && appearance.getPropertyValue(token).trim()) || color);
273
295
  play();
274
296
  }
275
297
  const visibility = new IntersectionObserver(([entry]) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nadicodeai/ui",
3
- "version": "12.1.33",
3
+ "version": "12.1.35",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -77,7 +77,7 @@
77
77
  "@assistant-ui/react": "0.15.21",
78
78
  "@assistant-ui/react-markdown": "0.14.16",
79
79
  "@base-ui/react": "^1.8.0",
80
- "@nadicodeai/design-system": "12.1.33",
80
+ "@nadicodeai/design-system": "12.1.35",
81
81
  "class-variance-authority": "^0.7.1",
82
82
  "clsx": "^2.1.1",
83
83
  "cmdk": "^1.1.1",