@nadicodeai/ui 12.1.32 → 12.1.34

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 (196) hide show
  1. package/README.md +6 -0
  2. package/dist/assets/brand/aionlabs.svg +1 -1
  3. package/dist/assets/brand/airtable.svg +1 -1
  4. package/dist/assets/brand/apple.svg +1 -1
  5. package/dist/assets/brand/arcee.svg +1 -1
  6. package/dist/assets/brand/asana.svg +1 -1
  7. package/dist/assets/brand/atlassian.svg +1 -1
  8. package/dist/assets/brand/baidu.svg +1 -1
  9. package/dist/assets/brand/bytedance.svg +1 -1
  10. package/dist/assets/brand/claude.svg +1 -1
  11. package/dist/assets/brand/cohere.svg +1 -1
  12. package/dist/assets/brand/datadog.svg +1 -1
  13. package/dist/assets/brand/deepseek.svg +1 -1
  14. package/dist/assets/brand/discord.svg +1 -1
  15. package/dist/assets/brand/dolphin.svg +1 -1
  16. package/dist/assets/brand/dotsstudio.svg +1 -1
  17. package/dist/assets/brand/figma.svg +1 -1
  18. package/dist/assets/brand/gemini.svg +1 -1
  19. package/dist/assets/brand/github.svg +1 -1
  20. package/dist/assets/brand/gitlab.svg +1 -1
  21. package/dist/assets/brand/gmail.svg +1 -1
  22. package/dist/assets/brand/google-calendar.svg +1 -1
  23. package/dist/assets/brand/google-drive.svg +1 -1
  24. package/dist/assets/brand/grok.svg +1 -1
  25. package/dist/assets/brand/huggingface.svg +1 -1
  26. package/dist/assets/brand/ibm.svg +1 -1
  27. package/dist/assets/brand/inception.svg +1 -1
  28. package/dist/assets/brand/inference.svg +1 -1
  29. package/dist/assets/brand/intercom.svg +1 -1
  30. package/dist/assets/brand/jira.svg +1 -1
  31. package/dist/assets/brand/kwaipilot.svg +1 -1
  32. package/dist/assets/brand/linear.svg +1 -1
  33. package/dist/assets/brand/linux.svg +1 -1
  34. package/dist/assets/brand/liquid.svg +1 -1
  35. package/dist/assets/brand/longcat.svg +1 -1
  36. package/dist/assets/brand/mattermost.svg +1 -1
  37. package/dist/assets/brand/meta.svg +1 -1
  38. package/dist/assets/brand/microsoft.svg +1 -1
  39. package/dist/assets/brand/minimax.svg +1 -1
  40. package/dist/assets/brand/mistral.svg +1 -1
  41. package/dist/assets/brand/moonshot.svg +1 -1
  42. package/dist/assets/brand/morph.svg +1 -1
  43. package/dist/assets/brand/n8n.svg +1 -1
  44. package/dist/assets/brand/netlify.svg +1 -1
  45. package/dist/assets/brand/nexagi.svg +1 -1
  46. package/dist/assets/brand/notion.svg +1 -1
  47. package/dist/assets/brand/nousresearch.svg +1 -1
  48. package/dist/assets/brand/nova.svg +1 -1
  49. package/dist/assets/brand/nvidia.svg +1 -1
  50. package/dist/assets/brand/openai.svg +1 -1
  51. package/dist/assets/brand/openrouter.svg +1 -1
  52. package/dist/assets/brand/paypal.svg +1 -1
  53. package/dist/assets/brand/perceptron.svg +1 -1
  54. package/dist/assets/brand/perplexity.svg +1 -1
  55. package/dist/assets/brand/poolside.svg +1 -1
  56. package/dist/assets/brand/postgresql.svg +1 -1
  57. package/dist/assets/brand/qwen.svg +1 -1
  58. package/dist/assets/brand/reka.svg +1 -1
  59. package/dist/assets/brand/relace.svg +1 -1
  60. package/dist/assets/brand/sakana.svg +1 -1
  61. package/dist/assets/brand/sentry.svg +1 -1
  62. package/dist/assets/brand/signal.svg +1 -1
  63. package/dist/assets/brand/slack.svg +1 -1
  64. package/dist/assets/brand/spotify.svg +1 -1
  65. package/dist/assets/brand/square.svg +1 -1
  66. package/dist/assets/brand/stepfun.svg +1 -1
  67. package/dist/assets/brand/stripe.svg +1 -1
  68. package/dist/assets/brand/supabase.svg +1 -1
  69. package/dist/assets/brand/telegram.svg +1 -1
  70. package/dist/assets/brand/tencent.svg +1 -1
  71. package/dist/assets/brand/the-drummer.svg +1 -1
  72. package/dist/assets/brand/todoist.svg +1 -1
  73. package/dist/assets/brand/unreal-engine.svg +1 -1
  74. package/dist/assets/brand/upstage.svg +1 -1
  75. package/dist/assets/brand/vercel.svg +1 -1
  76. package/dist/assets/brand/webflow.svg +1 -1
  77. package/dist/assets/brand/whatsapp.svg +1 -1
  78. package/dist/assets/brand/windows.svg +1 -1
  79. package/dist/assets/brand/xiaomimimo.svg +1 -1
  80. package/dist/assets/brand/youtube.svg +1 -1
  81. package/dist/assets/brand/yuanbao.svg +1 -1
  82. package/dist/assets/brand/zai.svg +1 -1
  83. package/dist/assets/brand/zapier.svg +1 -1
  84. package/dist/components/agent-orb-appearance.d.ts +2 -2
  85. package/dist/components/agent-orb-appearance.d.ts.map +1 -1
  86. package/dist/components/app-mark-frame.d.ts +34 -0
  87. package/dist/components/app-mark-frame.d.ts.map +1 -0
  88. package/dist/components/app-mark-frame.js +37 -0
  89. package/dist/components/app-mark-lazy/server.d.ts +4 -0
  90. package/dist/components/app-mark-lazy/server.d.ts.map +1 -0
  91. package/dist/components/app-mark-lazy/server.js +8 -0
  92. package/dist/components/app-mark-lazy.d.ts +16 -0
  93. package/dist/components/app-mark-lazy.d.ts.map +1 -0
  94. package/dist/components/app-mark-lazy.js +84 -0
  95. package/dist/components/app-mark.d.ts +6 -15
  96. package/dist/components/app-mark.d.ts.map +1 -1
  97. package/dist/components/app-mark.js +7 -21
  98. package/dist/components/brand-icons/aionlabs.d.ts.map +1 -1
  99. package/dist/components/brand-icons/aionlabs.js +1 -1
  100. package/dist/components/brand-icons/airtable.js +1 -1
  101. package/dist/components/brand-icons/apple.js +1 -1
  102. package/dist/components/brand-icons/arcee.js +1 -1
  103. package/dist/components/brand-icons/asana.js +1 -1
  104. package/dist/components/brand-icons/atlassian.js +1 -1
  105. package/dist/components/brand-icons/baidu.js +1 -1
  106. package/dist/components/brand-icons/bytedance.js +1 -1
  107. package/dist/components/brand-icons/claude.js +1 -1
  108. package/dist/components/brand-icons/cohere.js +1 -1
  109. package/dist/components/brand-icons/datadog.js +1 -1
  110. package/dist/components/brand-icons/deepseek.js +1 -1
  111. package/dist/components/brand-icons/discord.js +1 -1
  112. package/dist/components/brand-icons/dolphin.js +1 -1
  113. package/dist/components/brand-icons/dotsstudio.js +1 -1
  114. package/dist/components/brand-icons/figma.d.ts.map +1 -1
  115. package/dist/components/brand-icons/figma.js +1 -1
  116. package/dist/components/brand-icons/gemini.js +1 -1
  117. package/dist/components/brand-icons/github.js +1 -1
  118. package/dist/components/brand-icons/gitlab.js +1 -1
  119. package/dist/components/brand-icons/gmail.js +1 -1
  120. package/dist/components/brand-icons/google-calendar.js +1 -1
  121. package/dist/components/brand-icons/google-drive.js +1 -1
  122. package/dist/components/brand-icons/grok.js +1 -1
  123. package/dist/components/brand-icons/huggingface.js +1 -1
  124. package/dist/components/brand-icons/ibm.js +1 -1
  125. package/dist/components/brand-icons/inception.js +1 -1
  126. package/dist/components/brand-icons/inference.js +1 -1
  127. package/dist/components/brand-icons/intercom.js +1 -1
  128. package/dist/components/brand-icons/jira.js +1 -1
  129. package/dist/components/brand-icons/kwaipilot.js +1 -1
  130. package/dist/components/brand-icons/linear.js +1 -1
  131. package/dist/components/brand-icons/linux.js +1 -1
  132. package/dist/components/brand-icons/liquid.js +1 -1
  133. package/dist/components/brand-icons/longcat.js +1 -1
  134. package/dist/components/brand-icons/mattermost.js +1 -1
  135. package/dist/components/brand-icons/meta.js +1 -1
  136. package/dist/components/brand-icons/microsoft.js +1 -1
  137. package/dist/components/brand-icons/minimax.js +1 -1
  138. package/dist/components/brand-icons/mistral.d.ts.map +1 -1
  139. package/dist/components/brand-icons/mistral.js +1 -1
  140. package/dist/components/brand-icons/moonshot.js +1 -1
  141. package/dist/components/brand-icons/morph.js +1 -1
  142. package/dist/components/brand-icons/n8n.js +1 -1
  143. package/dist/components/brand-icons/netlify.js +1 -1
  144. package/dist/components/brand-icons/nexagi.js +1 -1
  145. package/dist/components/brand-icons/notion.js +1 -1
  146. package/dist/components/brand-icons/nousresearch.js +1 -1
  147. package/dist/components/brand-icons/nova.js +1 -1
  148. package/dist/components/brand-icons/nvidia.js +1 -1
  149. package/dist/components/brand-icons/openai.js +1 -1
  150. package/dist/components/brand-icons/openrouter.js +1 -1
  151. package/dist/components/brand-icons/paypal.js +1 -1
  152. package/dist/components/brand-icons/perceptron.js +1 -1
  153. package/dist/components/brand-icons/perplexity.js +1 -1
  154. package/dist/components/brand-icons/poolside.js +1 -1
  155. package/dist/components/brand-icons/postgresql.js +1 -1
  156. package/dist/components/brand-icons/qwen.js +1 -1
  157. package/dist/components/brand-icons/reka.js +1 -1
  158. package/dist/components/brand-icons/relace.js +1 -1
  159. package/dist/components/brand-icons/sakana.js +1 -1
  160. package/dist/components/brand-icons/sentry.js +1 -1
  161. package/dist/components/brand-icons/signal.js +1 -1
  162. package/dist/components/brand-icons/slack.js +1 -1
  163. package/dist/components/brand-icons/spotify.js +1 -1
  164. package/dist/components/brand-icons/square.js +1 -1
  165. package/dist/components/brand-icons/stepfun.js +1 -1
  166. package/dist/components/brand-icons/stripe.js +1 -1
  167. package/dist/components/brand-icons/supabase.js +1 -1
  168. package/dist/components/brand-icons/telegram.js +1 -1
  169. package/dist/components/brand-icons/tencent.js +1 -1
  170. package/dist/components/brand-icons/the-drummer.js +2 -2
  171. package/dist/components/brand-icons/todoist.js +1 -1
  172. package/dist/components/brand-icons/unreal-engine.js +1 -1
  173. package/dist/components/brand-icons/upstage.js +1 -1
  174. package/dist/components/brand-icons/vercel.js +1 -1
  175. package/dist/components/brand-icons/webflow.js +1 -1
  176. package/dist/components/brand-icons/whatsapp.js +1 -1
  177. package/dist/components/brand-icons/windows.js +1 -1
  178. package/dist/components/brand-icons/xiaomimimo.js +1 -1
  179. package/dist/components/brand-icons/youtube.js +1 -1
  180. package/dist/components/brand-icons/yuanbao.js +1 -1
  181. package/dist/components/brand-icons/zai.js +1 -1
  182. package/dist/components/brand-icons/zapier.js +1 -1
  183. package/dist/components/chart-date-range-control.d.ts.map +1 -1
  184. package/dist/components/chart-date-range-control.js +7 -2
  185. package/dist/components/field.d.ts.map +1 -1
  186. package/dist/components/field.js +4 -1
  187. package/dist/eslint/rules/shadcn-composition.js +22 -1
  188. package/dist/index.d.ts +2 -0
  189. package/dist/index.d.ts.map +1 -1
  190. package/dist/index.js +2 -0
  191. package/dist/internal/agent-orb-motion.d.ts.map +1 -1
  192. package/dist/internal/agent-orb-motion.js +1 -0
  193. package/dist/internal/agent-orb.d.ts +5 -2
  194. package/dist/internal/agent-orb.d.ts.map +1 -1
  195. package/dist/internal/agent-orb.js +46 -8
  196. package/package.json +8 -2
package/dist/index.js CHANGED
@@ -8,6 +8,8 @@ export * from "./components/agent-orb.js";
8
8
  export * from "./components/alert.js";
9
9
  export * from "./components/alert-dialog.js";
10
10
  export * from "./components/app-mark.js";
11
+ export * from "./components/app-mark-frame.js";
12
+ export * from "./components/app-mark-lazy.js";
11
13
  export * from "./components/aspect-ratio.js";
12
14
  export * from "./components/avatar.js";
13
15
  export * from "./components/automation-section.js";
@@ -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;AA+BlD;;;;;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;EAqLvF"}
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"}
@@ -26,6 +26,22 @@ const presenceWeights = {
26
26
  * tricolore stays visible on a white ground as ink.
27
27
  */
28
28
  const nadiaStripes = ["--nc-identity-azzurro", "--nc-identity-verde", null, "--nc-identity-rosso"];
29
+ const celebrationTokens = ["--nc-chart-5", "--nc-chart-6", "--nc-warning", "--nc-chart-4"];
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
+ };
29
45
  /** A stable direction on the unit sphere, the vendor's Fibonacci lattice. */
30
46
  function fibonacci(i, n) {
31
47
  const y = 1 - (2 * (i + 0.5)) / n;
@@ -90,13 +106,21 @@ export function stripedRibbonFrame(size, t, opts) {
90
106
  }
91
107
  return finalizeFrame(dots, [], opts.rMin);
92
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
+ }
93
115
  function paintAgentOrb(context, input) {
94
116
  const { form, size, seconds, color, state, age, reduced, breath, celebrationColors, stripeColors, } = input;
95
117
  const presence = presenceWeights[input.presence];
96
- 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);
97
119
  const frame = form === "nadia"
98
120
  ? stripedRibbonFrame(size, seconds, preset.opts)
99
- : 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);
100
124
  context.clearRect(0, 0, size, size);
101
125
  const pose = motionPose(form, input.motion === "ambient" ? "idle" : state, reduced ? (state === "done" ? 2 : 0.6) : age);
102
126
  const gestureSeconds = reduced ? 0.8 : age / (state === "done" ? 0.575 : 0.2875);
@@ -159,6 +183,7 @@ export function mountAgentOrb(canvas, options) {
159
183
  let color = getComputedStyle(canvas).color;
160
184
  let celebrationColors = [color];
161
185
  let stripeColors = [color];
186
+ let appearanceKey = "";
162
187
  /**
163
188
  * The box the orb is displayed at, in CSS pixels. A canvas stretched by
164
189
  * layout reads as pixels unless the engine paints at that size, so the box
@@ -244,6 +269,18 @@ export function mountAgentOrb(canvas, options) {
244
269
  probe.remove();
245
270
  return resolved || color;
246
271
  }
272
+ function readAppearanceKey(appearance, side) {
273
+ return [
274
+ side,
275
+ window.devicePixelRatio || 1,
276
+ appearance.color,
277
+ ...appearanceTokens.map((token) => appearance.getPropertyValue(token)),
278
+ ].join("|");
279
+ }
280
+ function refreshIfChanged() {
281
+ if (readAppearanceKey(getComputedStyle(canvas), measure()) !== appearanceKey)
282
+ refresh();
283
+ }
247
284
  function refresh() {
248
285
  painted = measure();
249
286
  const backing = Math.max(1, Math.round(painted * Math.min(window.devicePixelRatio || 1, 2)));
@@ -251,9 +288,10 @@ export function mountAgentOrb(canvas, options) {
251
288
  canvas.height = backing;
252
289
  ratio = backing / painted;
253
290
  const appearance = getComputedStyle(canvas);
291
+ appearanceKey = readAppearanceKey(appearance, painted);
254
292
  color = appearance.color;
255
- celebrationColors = ["--nc-chart-5", "--nc-chart-6", "--nc-warning", "--nc-chart-4"].map((token) => computedColor(`color-mix(in oklch, ${appearance.getPropertyValue(token).trim() || color} 75%, white)`));
256
- stripeColors = nadiaStripes.map((token) => (token && appearance.getPropertyValue(token).trim()) || color);
293
+ celebrationColors = celebrationTokens.map((token) => computedColor(`color-mix(in oklch, ${appearance.getPropertyValue(token).trim() || color} 75%, white)`));
294
+ stripeColors = (figureStripes[form] ?? []).map((token) => (token && appearance.getPropertyValue(token).trim()) || color);
257
295
  play();
258
296
  }
259
297
  const visibility = new IntersectionObserver(([entry]) => {
@@ -261,7 +299,7 @@ export function mountAgentOrb(canvas, options) {
261
299
  play();
262
300
  });
263
301
  visibility.observe(canvas);
264
- const appearance = new MutationObserver(refresh);
302
+ const appearance = new MutationObserver(refreshIfChanged);
265
303
  for (let ancestor = canvas; ancestor; ancestor = ancestor.parentElement) {
266
304
  appearance.observe(ancestor, {
267
305
  attributes: true,
@@ -283,12 +321,12 @@ export function mountAgentOrb(canvas, options) {
283
321
  if (event.propertyName === "color" &&
284
322
  event.target instanceof Node &&
285
323
  event.target.contains(canvas))
286
- refresh();
324
+ refreshIfChanged();
287
325
  }
288
326
  document.addEventListener("transitionend", settle, true);
289
327
  motion.addEventListener("change", play);
290
328
  document.addEventListener("visibilitychange", play);
291
- window.addEventListener("resize", refresh);
329
+ window.addEventListener("resize", refreshIfChanged);
292
330
  refresh();
293
331
  return {
294
332
  setState(value) {
@@ -310,7 +348,7 @@ export function mountAgentOrb(canvas, options) {
310
348
  document.removeEventListener("transitionend", settle, true);
311
349
  motion.removeEventListener("change", play);
312
350
  document.removeEventListener("visibilitychange", play);
313
- window.removeEventListener("resize", refresh);
351
+ window.removeEventListener("resize", refreshIfChanged);
314
352
  },
315
353
  };
316
354
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nadicodeai/ui",
3
- "version": "12.1.32",
3
+ "version": "12.1.34",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -40,6 +40,11 @@
40
40
  "types": "./dist/lib/format-token-count.d.ts",
41
41
  "import": "./dist/lib/format-token-count.js"
42
42
  },
43
+ "./components/app-mark-lazy": {
44
+ "types": "./dist/components/app-mark-lazy.d.ts",
45
+ "browser": "./dist/components/app-mark-lazy.js",
46
+ "import": "./dist/components/app-mark-lazy/server.js"
47
+ },
43
48
  "./components/*": {
44
49
  "types": "./dist/components/*.d.ts",
45
50
  "import": "./dist/components/*.js"
@@ -72,7 +77,7 @@
72
77
  "@assistant-ui/react": "0.15.21",
73
78
  "@assistant-ui/react-markdown": "0.14.16",
74
79
  "@base-ui/react": "^1.8.0",
75
- "@nadicodeai/design-system": "12.1.32",
80
+ "@nadicodeai/design-system": "12.1.34",
76
81
  "class-variance-authority": "^0.7.1",
77
82
  "clsx": "^2.1.1",
78
83
  "cmdk": "^1.1.1",
@@ -118,6 +123,7 @@
118
123
  "react": "19.3.0",
119
124
  "react-dom": "19.3.0",
120
125
  "shadcn": "4.21.0",
126
+ "svgo": "^4.1.0",
121
127
  "tailwindcss": "^4.3.3",
122
128
  "typescript": "^6",
123
129
  "vitest": "^5.0.0"