this.gui 1.3.40 → 1.3.42

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 (319) hide show
  1. package/dist/init/index.html +27 -0
  2. package/dist/init/package-lock.json +5779 -0
  3. package/dist/init/package.json +24 -0
  4. package/dist/init/src/App.tsx +40 -0
  5. package/dist/init/src/index.css +16 -0
  6. package/dist/init/src/main.tsx +13 -0
  7. package/dist/init/src/router/DerivableRouter.tsx +36 -0
  8. package/dist/init/tsconfig.json +17 -0
  9. package/dist/init/vite.config.ts +11 -0
  10. package/package.json +5 -3
  11. package/src/GUI.tsx +46 -0
  12. package/src/QRouter/QRegistry.tsx +53 -0
  13. package/src/QRouter/QRouter.stories.tsx +31 -0
  14. package/src/QRouter/QRouter.tsx +57 -0
  15. package/src/gui/Theme/GuiProvider.tsx +111 -0
  16. package/src/gui/Theme/Icon/Icon.resolver.tsx +29 -0
  17. package/src/gui/Theme/Icon/Icon.tsx +43 -0
  18. package/src/gui/Theme/Layout/Content/Content.resolver.tsx +0 -0
  19. package/src/gui/Theme/Layout/Content/Content.stories.tsx +88 -0
  20. package/src/gui/Theme/Layout/Content/Content.tsx +53 -0
  21. package/src/gui/Theme/Layout/Content/Content.types.tsx +40 -0
  22. package/src/gui/Theme/Layout/Footer/Footer.resolver.tsx +45 -0
  23. package/src/gui/Theme/Layout/Footer/Footer.stories.tsx +205 -0
  24. package/src/gui/Theme/Layout/Footer/Footer.tsx +337 -0
  25. package/src/gui/Theme/Layout/Footer/Footer.types.ts +40 -0
  26. package/src/gui/Theme/Layout/Layout/Layout.resolver.tsx +37 -0
  27. package/src/gui/Theme/Layout/Layout/Layout.stories.tsx +289 -0
  28. package/src/gui/Theme/Layout/Layout/Layout.tsx +117 -0
  29. package/src/gui/Theme/Layout/Layout/Layout.types.ts +57 -0
  30. package/src/gui/Theme/Layout/Layout/useLayoutBreakpoints.ts +9 -0
  31. package/src/gui/Theme/Layout/Namespace/Namespace.stories.tsx +105 -0
  32. package/src/gui/Theme/Layout/Namespace/Namespace.tsx +26 -0
  33. package/src/gui/Theme/Layout/Sidebars/LeftSidebar/LeftSidebar.resolver.tsx +87 -0
  34. package/src/gui/Theme/Layout/Sidebars/LeftSidebar/LeftSidebar.stories.tsx +199 -0
  35. package/src/gui/Theme/Layout/Sidebars/LeftSidebar/LeftSidebar.tsx +311 -0
  36. package/src/gui/Theme/Layout/Sidebars/LeftSidebar/LeftSidebar.types.ts +41 -0
  37. package/src/gui/Theme/Layout/Sidebars/LeftSidebar/SidebarToggleButton.tsx +53 -0
  38. package/src/gui/Theme/Layout/Sidebars/LeftSidebar/components/LeftSidebarAction/LeftSidebarAction.resolver.tsx +19 -0
  39. package/src/gui/Theme/Layout/Sidebars/LeftSidebar/components/LeftSidebarAction/LeftSidebarAction.tsx +107 -0
  40. package/src/gui/Theme/Layout/Sidebars/LeftSidebar/components/LeftSidebarLink/LeftSidebarLink.resolver.tsx +0 -0
  41. package/src/gui/Theme/Layout/Sidebars/LeftSidebar/components/LeftSidebarLink/LeftSidebarLink.tsx +134 -0
  42. package/src/gui/Theme/Layout/Sidebars/LeftSidebar/components/LeftSidebarLink/LeftSidebarLink.types.ts +15 -0
  43. package/src/gui/Theme/Layout/Sidebars/LeftSidebar/components/LeftSidebarMenu/LeftSidebarMenu.tsx +142 -0
  44. package/src/gui/Theme/Layout/Sidebars/LeftSidebar/components/LeftSidebarToggleButton/LeftSidebarToggleButton.tsx +23 -0
  45. package/src/gui/Theme/Layout/Sidebars/RightSidebar/RightSidebar.resolver.tsx +35 -0
  46. package/src/gui/Theme/Layout/Sidebars/RightSidebar/RightSidebar.stories.tsx +239 -0
  47. package/src/gui/Theme/Layout/Sidebars/RightSidebar/RightSidebar.tsx +319 -0
  48. package/src/gui/Theme/Layout/Sidebars/RightSidebar/RightSidebar.types.ts +17 -0
  49. package/src/gui/Theme/Layout/Sidebars/RightSidebar/components/RightSidebarAction/RightSidebarAction.tsx +102 -0
  50. package/src/gui/Theme/Layout/Sidebars/RightSidebar/components/RightSidebarLink/RightSidebarLink.tsx +132 -0
  51. package/src/gui/Theme/Layout/Sidebars/RightSidebar/components/RightSidebarMenu/RightSidebarMenu.tsx +140 -0
  52. package/src/gui/Theme/Layout/Sidebars/RightSidebar/components/RightSidebarToggleButton/RightSidebarToggleButton.tsx +22 -0
  53. package/src/gui/Theme/Layout/StickyOptions/StickyOptionsTop.stories.tsx +469 -0
  54. package/src/gui/Theme/Layout/StickyOptions/StickyOptionsTop.tsx +489 -0
  55. package/src/gui/Theme/Layout/TopBar/TopBar.resolver.tsx +86 -0
  56. package/src/gui/Theme/Layout/TopBar/TopBar.stories.tsx +350 -0
  57. package/src/gui/Theme/Layout/TopBar/TopBar.tsx +292 -0
  58. package/src/gui/Theme/Layout/TopBar/TopBar.types.ts +39 -0
  59. package/src/gui/Theme/Layout/TopBar/components/TopBarAction/TopBarAction.stories.tsx +83 -0
  60. package/src/gui/Theme/Layout/TopBar/components/TopBarAction/TopBarAction.tsx +18 -0
  61. package/src/gui/Theme/Layout/TopBar/components/TopBarAction/TopBarAction.types.ts +4 -0
  62. package/src/gui/Theme/Layout/TopBar/components/TopBarLink/TopBarLink.stories.tsx +189 -0
  63. package/src/gui/Theme/Layout/TopBar/components/TopBarLink/TopBarLink.tsx +30 -0
  64. package/src/gui/Theme/Layout/TopBar/components/TopBarLink/TopBarLink.types.ts +9 -0
  65. package/src/gui/Theme/Layout/TopBar/components/TopBarMenu/TopBarMenu.resolver.tsx +14 -0
  66. package/src/gui/Theme/Layout/TopBar/components/TopBarMenu/TopBarMenu.stories.tsx +56 -0
  67. package/src/gui/Theme/Layout/TopBar/components/TopBarMenu/TopBarMenu.tsx +123 -0
  68. package/src/gui/Theme/Layout/TopBar/components/TopBarMenu/TopBarMenu.types.ts +44 -0
  69. package/src/gui/Theme/catalog/CherryByte/CherryByte.png +0 -0
  70. package/src/gui/Theme/catalog/CherryByte/dark.tokens.ts +47 -0
  71. package/src/gui/Theme/catalog/CherryByte/light.tokens.ts +47 -0
  72. package/src/gui/Theme/catalog/CherryByte/manifest.ts +24 -0
  73. package/src/gui/Theme/catalog/GhostShell/dark.tokens.ts +43 -0
  74. package/src/gui/Theme/catalog/GhostShell/ghost.png +0 -0
  75. package/src/gui/Theme/catalog/GhostShell/light.tokens.ts +39 -0
  76. package/src/gui/Theme/catalog/GhostShell/manifest.ts +24 -0
  77. package/src/gui/Theme/catalog/LunaHex/LunaHex.png +0 -0
  78. package/src/gui/Theme/catalog/LunaHex/dark.tokens.ts +34 -0
  79. package/src/gui/Theme/catalog/LunaHex/light.tokens.ts +74 -0
  80. package/src/gui/Theme/catalog/LunaHex/manifest.ts +24 -0
  81. package/src/gui/Theme/catalog/MUI/MUI.png +0 -0
  82. package/src/gui/Theme/catalog/MUI/dark.tokens.ts +58 -0
  83. package/src/gui/Theme/catalog/MUI/light.tokens.ts +74 -0
  84. package/src/gui/Theme/catalog/MUI/manifest.ts +24 -0
  85. package/src/gui/Theme/catalog/PrinceOfDarkness/dark.tokens.ts +48 -0
  86. package/src/gui/Theme/catalog/PrinceOfDarkness/light.tokens.ts +47 -0
  87. package/src/gui/Theme/catalog/PrinceOfDarkness/manifest.ts +24 -0
  88. package/src/gui/Theme/catalog/PrinceOfDarkness/prince.png +0 -0
  89. package/src/gui/Theme/catalog/PrinceOfDarkness/princeOfDarkness.png +0 -0
  90. package/src/gui/Theme/catalog/Seafoam/dark.tokens.ts +49 -0
  91. package/src/gui/Theme/catalog/Seafoam/light.tokens.ts +47 -0
  92. package/src/gui/Theme/catalog/Seafoam/manifest.ts +24 -0
  93. package/src/gui/Theme/catalog/Seafoam/seaFoam.png +0 -0
  94. package/src/gui/Theme/catalog/neurons/dark.tokens.ts +58 -0
  95. package/src/gui/Theme/catalog/neurons/light.tokens.ts +74 -0
  96. package/src/gui/Theme/catalog/neurons/manifest.ts +24 -0
  97. package/src/gui/Theme/catalog/neurons/neurons.me.png +0 -0
  98. package/src/gui/Theme/fromTokens.ts +272 -0
  99. package/src/gui/Theme/gui.css +31 -0
  100. package/src/gui/Theme/index.ts +17 -0
  101. package/src/gui/Theme/styles/buildShadows.ts +83 -0
  102. package/src/gui/Theme/styles/theme.tokens.ts +108 -0
  103. package/src/gui/Theme/utils/catalog.ts +61 -0
  104. package/src/gui/Theme/utils/persistence.ts +66 -0
  105. package/src/gui/Theme/utils/themeUtils.ts +34 -0
  106. package/src/gui/components/atoms/AppBar/AppBar.resolver.tsx +46 -0
  107. package/src/gui/components/atoms/AppBar/AppBar.stories.tsx +251 -0
  108. package/src/gui/components/atoms/AppBar/AppBar.tsx +107 -0
  109. package/src/gui/components/atoms/AppBar/AppBar.types.ts +28 -0
  110. package/src/gui/components/atoms/Avatar/Avatar.resolver.tsx +61 -0
  111. package/src/gui/components/atoms/Avatar/Avatar.stories.tsx +36 -0
  112. package/src/gui/components/atoms/Avatar/Avatar.tsx +14 -0
  113. package/src/gui/components/atoms/Box/Box.resolver.tsx +171 -0
  114. package/src/gui/components/atoms/Box/Box.stories.tsx +263 -0
  115. package/src/gui/components/atoms/Box/Box.tsx +15 -0
  116. package/src/gui/components/atoms/Button/Button.resolver.tsx +103 -0
  117. package/src/gui/components/atoms/Button/Button.stories.tsx +219 -0
  118. package/src/gui/components/atoms/Button/Button.tsx +40 -0
  119. package/src/gui/components/atoms/Card/Card.resolver.tsx +63 -0
  120. package/src/gui/components/atoms/Card/Card.stories.tsx +54 -0
  121. package/src/gui/components/atoms/Card/Card.tsx +13 -0
  122. package/src/gui/components/atoms/CardActions/CardActions.resolver.tsx +59 -0
  123. package/src/gui/components/atoms/CardActions/CardActions.stories.tsx +32 -0
  124. package/src/gui/components/atoms/CardActions/CardActions.tsx +14 -0
  125. package/src/gui/components/atoms/CardContent/CardContent.resolver.tsx +60 -0
  126. package/src/gui/components/atoms/CardContent/CardContent.stories.tsx +34 -0
  127. package/src/gui/components/atoms/CardContent/CardContent.tsx +13 -0
  128. package/src/gui/components/atoms/CardHeader/CardHeader.resolver.tsx +68 -0
  129. package/src/gui/components/atoms/CardHeader/CardHeader.stories.tsx +40 -0
  130. package/src/gui/components/atoms/CardHeader/CardHeader.tsx +12 -0
  131. package/src/gui/components/atoms/Collapse/Collapse.resolver.tsx +85 -0
  132. package/src/gui/components/atoms/Collapse/Collapse.stories.tsx +130 -0
  133. package/src/gui/components/atoms/Collapse/Collapse.tsx +17 -0
  134. package/src/gui/components/atoms/Divider/Divider.resolver.tsx +95 -0
  135. package/src/gui/components/atoms/Divider/Divider.stories.tsx +108 -0
  136. package/src/gui/components/atoms/Divider/Divider.tsx +14 -0
  137. package/src/gui/components/atoms/Drawer/Drawer.resolver.tsx +116 -0
  138. package/src/gui/components/atoms/Drawer/Drawer.stories.tsx +223 -0
  139. package/src/gui/components/atoms/Drawer/Drawer.tsx +25 -0
  140. package/src/gui/components/atoms/Grid/Grid.resolver.tsx +33 -0
  141. package/src/gui/components/atoms/Grid/Grid.stories.tsx +136 -0
  142. package/src/gui/components/atoms/Grid/Grid.tsx +15 -0
  143. package/src/gui/components/atoms/Grid/Grid.types.ts +9 -0
  144. package/src/gui/components/atoms/IconButton/IconButton.resolver.tsx +137 -0
  145. package/src/gui/components/atoms/IconButton/IconButton.stories.tsx +134 -0
  146. package/src/gui/components/atoms/IconButton/IconButton.tsx +22 -0
  147. package/src/gui/components/atoms/Link/Link.resolver.tsx +74 -0
  148. package/src/gui/components/atoms/Link/Link.stories.tsx +157 -0
  149. package/src/gui/components/atoms/Link/Link.tsx +36 -0
  150. package/src/gui/components/atoms/List/List.resolver.tsx +94 -0
  151. package/src/gui/components/atoms/List/List.stories.tsx +137 -0
  152. package/src/gui/components/atoms/List/List.tsx +20 -0
  153. package/src/gui/components/atoms/ListItem/ListItem.resolver.tsx +88 -0
  154. package/src/gui/components/atoms/ListItem/ListItem.stories.tsx +151 -0
  155. package/src/gui/components/atoms/ListItem/ListItem.tsx +19 -0
  156. package/src/gui/components/atoms/ListItemButton/ListItemButton.resolver.tsx +214 -0
  157. package/src/gui/components/atoms/ListItemButton/ListItemButton.stories.tsx +155 -0
  158. package/src/gui/components/atoms/ListItemButton/ListItemButton.tsx +15 -0
  159. package/src/gui/components/atoms/ListItemIcon/ListItemIcon.resolver.tsx +102 -0
  160. package/src/gui/components/atoms/ListItemIcon/ListItemIcon.stories.tsx +132 -0
  161. package/src/gui/components/atoms/ListItemIcon/ListItemIcon.tsx +11 -0
  162. package/src/gui/components/atoms/ListItemText/ListItemText.resolver.tsx +112 -0
  163. package/src/gui/components/atoms/ListItemText/ListItemText.stories.tsx +156 -0
  164. package/src/gui/components/atoms/ListItemText/ListItemText.tsx +15 -0
  165. package/src/gui/components/atoms/Menu/Menu.resolver.tsx +112 -0
  166. package/src/gui/components/atoms/Menu/Menu.stories.tsx +162 -0
  167. package/src/gui/components/atoms/Menu/Menu.tsx +17 -0
  168. package/src/gui/components/atoms/MenuItem/MenuItem.resolver.tsx +183 -0
  169. package/src/gui/components/atoms/MenuItem/MenuItem.stories.tsx +134 -0
  170. package/src/gui/components/atoms/MenuItem/MenuItem.tsx +14 -0
  171. package/src/gui/components/atoms/Paper/Paper.resolver.tsx +98 -0
  172. package/src/gui/components/atoms/Paper/Paper.stories.tsx +184 -0
  173. package/src/gui/components/atoms/Paper/Paper.tsx +15 -0
  174. package/src/gui/components/atoms/Section/Section.resolver.tsx +10 -0
  175. package/src/gui/components/atoms/Section/Section.stories.tsx +189 -0
  176. package/src/gui/components/atoms/Section/Section.tsx +76 -0
  177. package/src/gui/components/atoms/Section/Section.types.tsx +24 -0
  178. package/src/gui/components/atoms/Stack/Stack.resolver.tsx +94 -0
  179. package/src/gui/components/atoms/Stack/Stack.stories.tsx +160 -0
  180. package/src/gui/components/atoms/Stack/Stack.tsx +15 -0
  181. package/src/gui/components/atoms/Surface/Surface.resolver.tsx +37 -0
  182. package/src/gui/components/atoms/Surface/Surface.tsx +49 -0
  183. package/src/gui/components/atoms/Surface/Surface.types.ts +20 -0
  184. package/src/gui/components/atoms/Switch/Switch.resolver.tsx +53 -0
  185. package/src/gui/components/atoms/Switch/Switch.stories.tsx +236 -0
  186. package/src/gui/components/atoms/Switch/Switch.tsx +22 -0
  187. package/src/gui/components/atoms/Table/Body/TableBody.tsx +7 -0
  188. package/src/gui/components/atoms/Table/Cell/TableCell.tsx +18 -0
  189. package/src/gui/components/atoms/Table/Head/TableHead.tsx +9 -0
  190. package/src/gui/components/atoms/Table/Row/TableRow.tsx +20 -0
  191. package/src/gui/components/atoms/Table/Table.resolver.tsx +77 -0
  192. package/src/gui/components/atoms/Table/Table.stories.tsx +173 -0
  193. package/src/gui/components/atoms/Table/Table.tsx +20 -0
  194. package/src/gui/components/atoms/TextField/TextField.stories.tsx +25 -0
  195. package/src/gui/components/atoms/TextField/TextField.tsx +15 -0
  196. package/src/gui/components/atoms/Toolbar/Toolbar.resolver.tsx +60 -0
  197. package/src/gui/components/atoms/Toolbar/Toolbar.stories.tsx +155 -0
  198. package/src/gui/components/atoms/Toolbar/Toolbar.tsx +16 -0
  199. package/src/gui/components/atoms/Tooltip/Tooltip.resolver.tsx +142 -0
  200. package/src/gui/components/atoms/Tooltip/Tooltip.stories.tsx +117 -0
  201. package/src/gui/components/atoms/Tooltip/Tooltip.tsx +70 -0
  202. package/src/gui/components/atoms/Typography/Typography.resolver.tsx +158 -0
  203. package/src/gui/components/atoms/Typography/Typography.stories.tsx +222 -0
  204. package/src/gui/components/atoms/Typography/Typography.tsx +27 -0
  205. package/src/gui/components/atoms/Window/Nodes/node.ts +0 -0
  206. package/src/gui/components/atoms/Window/code/block/node.tsx +0 -0
  207. package/src/gui/components/atoms/Window/code/hugging.face.api.ts +11 -0
  208. package/src/gui/components/atoms/Window/connectors/index.ts +19 -0
  209. package/src/gui/components/atoms/Window/window.stories.tsx +20 -0
  210. package/src/gui/components/atoms/Window/window.tsx +636 -0
  211. package/src/gui/components/atoms/atoms.tsx +151 -0
  212. package/src/gui/components/atoms/index.ts +2 -0
  213. package/src/gui/components/generics/Cards/Gridme.jsx +52 -0
  214. package/src/gui/components/generics/Cards/LilBox.jsx +65 -0
  215. package/src/gui/components/generics/Cards/ModuleCard.jsx +106 -0
  216. package/src/gui/components/generics/Chats/FullChatBot.jsx +223 -0
  217. package/src/gui/components/generics/Code/CodeBlock.jsx +33 -0
  218. package/src/gui/components/generics/EmojiCursor/EmojiCursor.stories.tsx +153 -0
  219. package/src/gui/components/generics/EmojiCursor/EmojiCursor.tsx +23 -0
  220. package/src/gui/components/generics/Feedback/Callout.jsx +92 -0
  221. package/src/gui/components/generics/Layout/GridX.jsx +29 -0
  222. package/src/gui/components/generics/Layout/Hero2.jsx +132 -0
  223. package/src/gui/components/generics/Layout/PageContainer.jsx +29 -0
  224. package/src/gui/components/generics/Layout/PageDivider.jsx +20 -0
  225. package/src/gui/components/generics/Layout/Section.jsx +43 -0
  226. package/src/gui/components/generics/Layout/SectionHeader.jsx +21 -0
  227. package/src/gui/components/generics/Media/Img.jsx +58 -0
  228. package/src/gui/components/generics/Media/VideoEmbed.jsx +51 -0
  229. package/src/gui/components/generics/Organization/TableOfContents.jsx +51 -0
  230. package/src/gui/components/generics/Organization/Tabs.jsx +45 -0
  231. package/src/gui/components/generics/Text/TextList.jsx +41 -0
  232. package/src/gui/components/generics/Text/TextParagraph.jsx +28 -0
  233. package/src/gui/components/generics/Text/TextQuote.jsx +23 -0
  234. package/src/gui/components/generics/Text/TextTitle.jsx +44 -0
  235. package/src/gui/components/molecules/Dialog/Dialog.stories.tsx +18 -0
  236. package/src/gui/components/molecules/Dialog/Dialog.tsx +5 -0
  237. package/src/gui/components/molecules/Hero/Hero.stories.tsx +140 -0
  238. package/src/gui/components/molecules/Hero/Hero.tsx +152 -0
  239. package/src/gui/components/molecules/Hero/Hero.types.tsx +18 -0
  240. package/src/gui/components/molecules/Modal/Modal.resolver.tsx +38 -0
  241. package/src/gui/components/molecules/Modal/Modal.stories.tsx +82 -0
  242. package/src/gui/components/molecules/Modal/Modal.tsx +110 -0
  243. package/src/gui/components/molecules/Modal/Modal.types.ts +29 -0
  244. package/src/gui/components/molecules/Page/Page.stories.tsx +135 -0
  245. package/src/gui/components/molecules/Page/Page.tsx +94 -0
  246. package/src/gui/components/molecules/Theme/ThemeModeToggle/ThemeModeToggle.resolver.tsx +58 -0
  247. package/src/gui/components/molecules/Theme/ThemeModeToggle/ThemeModeToggle.stories.tsx +133 -0
  248. package/src/gui/components/molecules/Theme/ThemeModeToggle/ThemeModeToggle.tsx +101 -0
  249. package/src/gui/components/molecules/Theme/ThemeModeToggle/ThemeModeToggle.types.ts +29 -0
  250. package/src/gui/components/molecules/Theme/ThemesCatalog/ThemesCatalog.resolver.tsx +15 -0
  251. package/src/gui/components/molecules/Theme/ThemesCatalog/ThemesCatalog.stories.tsx +88 -0
  252. package/src/gui/components/molecules/Theme/ThemesCatalog/ThemesCatalog.tsx +167 -0
  253. package/src/gui/components/molecules/Theme/ThemesCatalog/ThemesCatalog.types.ts +34 -0
  254. package/src/gui/components/molecules/molecules.ts +49 -0
  255. package/src/gui/components/organisms/Blockchain/Blocks/BlocksTable.tsx +119 -0
  256. package/src/gui/components/organisms/Blockchain/Usernames/Identities.stories.tsx +20 -0
  257. package/src/gui/components/organisms/Blockchain/Usernames/QR.tsx +566 -0
  258. package/src/gui/components/organisms/Blockchain/Usernames/Usernames.tsx +448 -0
  259. package/src/gui/components/organisms/Blockchain/Usernames/identities.tsx +710 -0
  260. package/src/gui/components/organisms/Blockchain/blockchain.stories.tsx +17 -0
  261. package/src/gui/components/organisms/Blockchain/blockchain.tsx +368 -0
  262. package/src/gui/components/organisms/Blockchain/scripts/connection.ts +82 -0
  263. package/src/gui/components/organisms/Blockchain/scripts/match_face.ts +143 -0
  264. package/src/gui/components/organisms/HighLighter/HighLighter.stories.tsx +168 -0
  265. package/src/gui/components/organisms/HighLighter/HighLighter.tsx +420 -0
  266. package/src/gui/components/organisms/HighLighter/HighLightsDrawer.tsx +197 -0
  267. package/src/gui/components/organisms/IdentityNoise/FaceRecognition/FaceRecognition.stories.tsx +312 -0
  268. package/src/gui/components/organisms/IdentityNoise/FaceRecognition/FaceRecognition.tsx +765 -0
  269. package/src/gui/components/organisms/IdentityNoise/FaceRecognition/modules/useFaceCameraPermission.ts +70 -0
  270. package/src/gui/components/organisms/IdentityNoise/FaceRecognition/modules/useFaceLandmarker.ts +106 -0
  271. package/src/gui/components/organisms/IdentityNoise/FaceRecognition/modules/useFaceOverlay.ts +489 -0
  272. package/src/gui/components/organisms/IdentityNoise/FaceRecognition/modules/useFaceTemplate.ts +32 -0
  273. package/src/gui/components/organisms/IdentityNoise/FaceRecognition/modules/useFaceTemplateBurst.ts +178 -0
  274. package/src/gui/components/organisms/IdentityNoise/FaceRecognition/modules/verifyTemplate.ts +136 -0
  275. package/src/gui/components/organisms/IdentityNoise/IdentityNoise.tsx +403 -0
  276. package/src/gui/components/organisms/IdentityNoise/IndentityNoise.stories.tsx +15 -0
  277. package/src/gui/components/organisms/IdentityNoise/Noise/Noise.stories.tsx +206 -0
  278. package/src/gui/components/organisms/IdentityNoise/Noise/Noise.tsx +394 -0
  279. package/src/gui/components/organisms/IdentityNoise/Triad/QR.tsx +566 -0
  280. package/src/gui/components/organisms/IdentityNoise/Triad/Tiad.stories.tsx +6 -0
  281. package/src/gui/components/organisms/IdentityNoise/Triad/Triad.tsx +917 -0
  282. package/src/gui/components/organisms/IdentityNoise/Triad/handleCleak.ts +0 -0
  283. package/src/gui/components/organisms/IdentityNoise/Triad/identity.ts +31 -0
  284. package/src/gui/components/organisms/IdentityNoise/Triad/me/fundamentals/vectors/vectors.tsx +252 -0
  285. package/src/gui/components/organisms/IdentityNoise/Triad/me/me.stories.tsx +314 -0
  286. package/src/gui/components/organisms/IdentityNoise/Triad/me/me.tsx +0 -0
  287. package/src/gui/components/organisms/organisms.ts +15 -0
  288. package/src/gui/contexts/InsetsContext.tsx +40 -0
  289. package/src/gui/contexts/LeftSidebarContext.tsx +20 -0
  290. package/src/gui/contexts/RightSidebarContext.tsx +25 -0
  291. package/src/gui/contexts/ThemeContext.ts +34 -0
  292. package/src/gui/contexts/index.ts +4 -0
  293. package/src/gui/hooks/index.ts +11 -0
  294. package/src/gui/hooks/resolveColorToken.ts +39 -0
  295. package/src/gui/hooks/useCodeGen.ts +12 -0
  296. package/src/gui/hooks/useGuiMediaQuery.ts +18 -0
  297. package/src/gui/hooks/useGuiTheme.ts +18 -0
  298. package/src/gui/hooks/useInsets.ts +26 -0
  299. package/src/gui/hooks/useIsMobile.ts +13 -0
  300. package/src/gui/hooks/useIsTouchDevice.ts +25 -0
  301. package/src/gui/hooks/useLeftSidebar.ts +10 -0
  302. package/src/gui/hooks/useRightSidebar.ts +12 -0
  303. package/src/gui/hooks/useViewportKey.ts +19 -0
  304. package/src/gui/hooks/useViewportProp.ts +17 -0
  305. package/src/gui/registry/GuiRegistry.ts +19 -0
  306. package/src/gui/registry/factory.ts +12 -0
  307. package/src/gui/registry/index.ts +3 -0
  308. package/src/gui/registry/types.ts +6 -0
  309. package/src/gui/utils/nodeID.ts +11 -0
  310. package/src/registry/GuiRegistry.ts +19 -0
  311. package/src/stories/01.Home.mdx +22 -0
  312. package/src/stories/02.Understanding.This.GUI.mdx +149 -0
  313. package/src/stories/Theme/Palette.stories.tsx +86 -0
  314. package/src/stories/Theme/ThemeViewer.stories.tsx +91 -0
  315. package/src/stories/Theme/Typography.stories.jsx +211 -0
  316. package/src/stories/assets/this.GUI.png +0 -0
  317. package/src/types/gui.d.ts +67 -0
  318. package/src/types/theme.d.ts +191 -0
  319. package/src/types/viewport.ts +132 -0
@@ -0,0 +1,710 @@
1
+ import React, { useMemo } from "react";
2
+ import Box from "@/gui/atoms/Box/Box";
3
+ import { useGuiTheme } from "@/gui/hooks";
4
+
5
+ type DerivationRow = {
6
+ step: string;
7
+ domain: "client" | "wire" | "ledger" | "union";
8
+ input: string;
9
+ op: string;
10
+ output: string;
11
+ storedWhere: string;
12
+ matchWhen: string;
13
+ rotates: string;
14
+ };
15
+
16
+ function Badge({ tone, children }: { tone: "neutral" | "info" | "success" | "warn" | "error"; children: React.ReactNode }) {
17
+ const theme = useGuiTheme();
18
+ const bg =
19
+ tone === "success"
20
+ ? "rgba(0, 200, 120, 0.18)"
21
+ : tone === "warn"
22
+ ? "rgba(255, 200, 0, 0.18)"
23
+ : tone === "error"
24
+ ? "rgba(255, 60, 60, 0.18)"
25
+ : tone === "info"
26
+ ? "rgba(0, 180, 255, 0.14)"
27
+ : theme.palette.mode === "dark"
28
+ ? "rgba(255,255,255,0.06)"
29
+ : "rgba(0,0,0,0.05)";
30
+
31
+ const fg =
32
+ tone === "success"
33
+ ? theme.palette.success.main
34
+ : tone === "warn"
35
+ ? theme.palette.warning.main
36
+ : tone === "error"
37
+ ? theme.palette.error.main
38
+ : tone === "info"
39
+ ? theme.palette.info.main
40
+ : theme.palette.text.secondary;
41
+
42
+ return (
43
+ <Box
44
+ sx={{
45
+ display: "inline-flex",
46
+ alignItems: "center",
47
+ justifyContent: "center",
48
+ px: 0.8,
49
+ py: 0.25,
50
+ borderRadius: "999px",
51
+ fontSize: "10px",
52
+ lineHeight: "12px",
53
+ fontWeight: 800,
54
+ letterSpacing: 0.2,
55
+ background: bg,
56
+ color: fg,
57
+ border: `1px solid ${theme.palette.divider}`,
58
+ userSelect: "none",
59
+ whiteSpace: "nowrap",
60
+ }}
61
+ >
62
+ {children}
63
+ </Box>
64
+ );
65
+ }
66
+
67
+ function DomainBadge(domain: "client" | "wire" | "ledger" | "union") {
68
+ switch (domain) {
69
+ case "client":
70
+ return <Badge tone="neutral">CLIENT</Badge>;
71
+ case "wire":
72
+ return <Badge tone="info">WIRE</Badge>;
73
+ case "ledger":
74
+ return <Badge tone="success">LEDGER</Badge>;
75
+ case "union":
76
+ return <Badge tone="warn">UNION</Badge>;
77
+ }
78
+ }
79
+
80
+ function Cell({ children, mono, dim }: { children: React.ReactNode; mono?: boolean; dim?: boolean }) {
81
+ const theme = useGuiTheme();
82
+ return (
83
+ <Box
84
+ sx={{
85
+ px: 1,
86
+ py: 0.75,
87
+ borderBottom: `1px solid ${theme.palette.divider}`,
88
+ fontSize: "11px",
89
+ lineHeight: "14px",
90
+ color: dim ? theme.palette.text.secondary : theme.palette.text.primary,
91
+ fontFamily: mono ? "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace" : "inherit",
92
+ wordBreak: "break-word",
93
+ }}
94
+ >
95
+ {children}
96
+ </Box>
97
+ );
98
+ }
99
+
100
+ function HeaderCell({ children }: { children: React.ReactNode }) {
101
+ const theme = useGuiTheme();
102
+ return (
103
+ <Box
104
+ sx={{
105
+ px: 1,
106
+ py: 0.6,
107
+ fontSize: "10px",
108
+ lineHeight: "12px",
109
+ fontWeight: 900,
110
+ letterSpacing: 0.4,
111
+ textTransform: "uppercase",
112
+ color: theme.palette.text.secondary,
113
+ borderBottom: `1px solid ${theme.palette.divider}`,
114
+ background: theme.palette.mode === "dark" ? "rgba(255,255,255,0.04)" : "rgba(0,0,0,0.03)",
115
+ userSelect: "none",
116
+ }}
117
+ >
118
+ {children}
119
+ </Box>
120
+ );
121
+ }
122
+
123
+ export type IdentityDerivationTableProps = {
124
+ username?: string;
125
+ secret?: string;
126
+ /** Optional: if you already computed the local identityRoot (e.g., hash(username+secret)). */
127
+ identityRoot?: string;
128
+ /** Optional: the ledger/host (chainId). */
129
+ chainId?: string;
130
+ /** Optional: what the server has stored for this username (e.g., users.identityHash). */
131
+ serverIdentityHash?: string;
132
+ /** Optional: if you are in face flow, show whether the face is enrolled or not. */
133
+ faceStatus?: "idle" | "checking" | "not_enrolled" | "enrolled_match" | "enrolled_no_match";
134
+ };
135
+
136
+ /**
137
+ * identities.tsx
138
+ *
139
+ * Visual table for the AUTH + derivation chain into the blockchain identity.
140
+ *
141
+ * This does not perform crypto; it's purely a UI visualization.
142
+ */
143
+ export default function IdentityDerivationTable(props: IdentityDerivationTableProps) {
144
+ const theme = useGuiTheme();
145
+ const {
146
+ username = "",
147
+ secret = "",
148
+ identityRoot,
149
+ chainId = "(host/chain)",
150
+ serverIdentityHash,
151
+ faceStatus = "idle",
152
+ } = props;
153
+
154
+ const usernameNorm = String(username || "").trim().toLowerCase();
155
+ const hasUsername = Boolean(usernameNorm);
156
+ const hasSecret = Boolean(secret);
157
+
158
+ // The UI idea: username+secret => k_unlock / identityRoot-ish
159
+ // For display, we treat identityRoot as the derived value.
160
+ const localDerived = String(identityRoot || "").trim();
161
+
162
+ const usernameExistsOnServer = Boolean(String(serverIdentityHash || "").trim());
163
+ const secretMatchesServer = useMemo(() => {
164
+ if (!usernameExistsOnServer) return null; // unknown
165
+ if (!localDerived) return false;
166
+ return String(serverIdentityHash).trim() === localDerived;
167
+ }, [usernameExistsOnServer, serverIdentityHash, localDerived]);
168
+
169
+ const faceBadge = useMemo(() => {
170
+ if (faceStatus === "checking") return <Badge tone="info">FACE • VERIFYING</Badge>;
171
+ if (faceStatus === "not_enrolled") return <Badge tone="warn">FACE • NOT ENROLLED</Badge>;
172
+ if (faceStatus === "enrolled_match") return <Badge tone="success">FACE • MATCH</Badge>;
173
+ if (faceStatus === "enrolled_no_match") return <Badge tone="error">FACE • NO MATCH</Badge>;
174
+ return <Badge tone="neutral">FACE • IDLE</Badge>;
175
+ }, [faceStatus]);
176
+
177
+ const authBadge = useMemo(() => {
178
+ if (!hasUsername) return <Badge tone="neutral">AUTH • ENTER USERNAME</Badge>;
179
+ if (!hasSecret) return <Badge tone="neutral">AUTH • ENTER SECRET</Badge>;
180
+
181
+ if (!usernameExistsOnServer) {
182
+ // Available-to-claim scenario
183
+ return <Badge tone="info">AUTH • AVAILABLE TO CLAIM</Badge>;
184
+ }
185
+
186
+ if (secretMatchesServer === true) return <Badge tone="success">AUTH • SECRET MATCH</Badge>;
187
+ if (secretMatchesServer === false) return <Badge tone="error">AUTH • SECRET MISMATCH</Badge>;
188
+
189
+ return <Badge tone="neutral">AUTH • UNKNOWN</Badge>;
190
+ }, [hasUsername, hasSecret, usernameExistsOnServer, secretMatchesServer]);
191
+
192
+ // New lane cards section
193
+ const laneCards = (
194
+ <Box
195
+ sx={{
196
+ px: 1.25,
197
+ py: 1,
198
+ display: "flex",
199
+ gap: 1,
200
+ borderBottom: `1px solid ${theme.palette.divider}`,
201
+ background: theme.palette.mode === "dark" ? "rgba(0,0,0,0.10)" : "rgba(255,255,255,0.85)",
202
+ flexWrap: "wrap",
203
+ justifyContent: "center",
204
+ }}
205
+ >
206
+ <Box
207
+ sx={{
208
+ flex: "1 1 160px",
209
+ border: `1px solid ${theme.palette.divider}`,
210
+ borderRadius: "12px",
211
+ p: 1,
212
+ background: theme.palette.mode === "dark" ? "rgba(255,255,255,0.04)" : "rgba(0,0,0,0.04)",
213
+ fontSize: "11px",
214
+ lineHeight: 1.3,
215
+ }}
216
+ >
217
+ <Box sx={{ fontWeight: 900, mb: 0.5, letterSpacing: 0.4 }}>CLIENT</Box>
218
+ <Box>• Local key derivation & secrets</Box>
219
+ <Box>• Unlock stable anchors</Box>
220
+ <Box>• Key rotations & signing</Box>
221
+ </Box>
222
+ <Box
223
+ sx={{
224
+ flex: "1 1 160px",
225
+ border: `1px solid ${theme.palette.divider}`,
226
+ borderRadius: "12px",
227
+ p: 1,
228
+ background: theme.palette.mode === "dark" ? "rgba(255,255,255,0.04)" : "rgba(0,0,0,0.04)",
229
+ fontSize: "11px",
230
+ lineHeight: 1.3,
231
+ }}
232
+ >
233
+ <Box sx={{ fontWeight: 900, mb: 0.5, letterSpacing: 0.4 }}>WIRE</Box>
234
+ <Box>• Encrypted data in transit</Box>
235
+ <Box>• Challenges and signatures</Box>
236
+ <Box>• Temporary proofs</Box>
237
+ </Box>
238
+ <Box
239
+ sx={{
240
+ flex: "1 1 160px",
241
+ border: `1px solid ${theme.palette.divider}`,
242
+ borderRadius: "12px",
243
+ p: 1,
244
+ background: theme.palette.mode === "dark" ? "rgba(255,255,255,0.04)" : "rgba(0,0,0,0.04)",
245
+ fontSize: "11px",
246
+ lineHeight: 1.3,
247
+ }}
248
+ >
249
+ <Box sx={{ fontWeight: 900, mb: 0.5, letterSpacing: 0.4 }}>LEDGER</Box>
250
+ <Box>• Server & blockchain state</Box>
251
+ <Box>• Stored anchors & mappings</Box>
252
+ <Box>• Public keys & registry</Box>
253
+ </Box>
254
+ <Box
255
+ sx={{
256
+ flex: "0 0 200px",
257
+ border: `1px solid ${theme.palette.divider}`,
258
+ borderRadius: "12px",
259
+ p: 1,
260
+ background: theme.palette.mode === "dark" ? "rgba(255,255,255,0.04)" : "rgba(0,0,0,0.04)",
261
+ fontSize: "10px",
262
+ lineHeight: 1.3,
263
+ fontWeight: 700,
264
+ textAlign: "center",
265
+ alignSelf: "center",
266
+ letterSpacing: 0.3,
267
+ }}
268
+ >
269
+ UNION<br />
270
+ <Box sx={{ fontWeight: 400, mt: 0.5, fontSize: "9px", lineHeight: 1.2 }}>
271
+ where client proofs meet ledger state (binding, pubkeys, signatures, challenges)
272
+ </Box>
273
+ </Box>
274
+ </Box>
275
+ );
276
+
277
+ const rows: DerivationRow[] = useMemo(() => {
278
+ const u = usernameNorm || "(username)";
279
+
280
+ return [
281
+ {
282
+ step: "L0",
283
+ domain: "client",
284
+ input: "username + secret",
285
+ op: "KDF / derive",
286
+ output: "k_unlock (or identityRoot fingerprint)",
287
+ storedWhere: "client only (derived)",
288
+ matchWhen: "—",
289
+ rotates: "username ✅, secret ✅",
290
+ },
291
+ {
292
+ step: "L1",
293
+ domain: "client",
294
+ input: "k_unlock + encNoise",
295
+ op: "decrypt",
296
+ output: "identityNoise (stable anchor seed)",
297
+ storedWhere: "encNoise in DB; identityNoise stays client",
298
+ matchWhen: "decrypt succeeds",
299
+ rotates: "secret ✅ (re-encrypt encNoise)",
300
+ },
301
+ {
302
+ step: "L2",
303
+ domain: "ledger",
304
+ input: "identityNoise",
305
+ op: "hash",
306
+ output: "anchorId = H(identityNoise)",
307
+ storedWhere: "server DB + chain blocks",
308
+ matchWhen: "anchorId equals server anchorId for this username",
309
+ rotates: "no ❌ (stable)",
310
+ },
311
+ {
312
+ step: "L3",
313
+ domain: "client",
314
+ input: "identityNoise + chainId",
315
+ op: "KDF",
316
+ output: "sk_chain (signing key for this chain)",
317
+ storedWhere: "client only (derived)",
318
+ matchWhen: "—",
319
+ rotates: "key rotation ✅ (derive v2 / counter)",
320
+ },
321
+ {
322
+ step: "L4",
323
+ domain: "union",
324
+ input: "sk_chain",
325
+ op: "pubkey",
326
+ output: "pk_chain",
327
+ storedWhere: "server DB (users.publicKey) / chain registry",
328
+ matchWhen: "pk_chain equals stored publicKey (or accepted rotation)",
329
+ rotates: "✅ (with signed rotation)",
330
+ },
331
+ {
332
+ step: "L5",
333
+ domain: "union",
334
+ input: "challenge + sk_chain",
335
+ op: "sign",
336
+ output: "sig",
337
+ storedWhere: "wire only",
338
+ matchWhen: "Verify(pk_chain, challenge, sig) == true",
339
+ rotates: "—",
340
+ },
341
+ {
342
+ step: "L6",
343
+ domain: "union",
344
+ input: `username '${u}'`,
345
+ op: "bind mapping",
346
+ output: "username -> anchorId",
347
+ storedWhere: "server DB (usernames/users)",
348
+ matchWhen: "signature from anchor approves binding",
349
+ rotates: "username ✅ (transfer)",
350
+ },
351
+ ];
352
+ }, [usernameNorm]);
353
+
354
+ const derivedPreview = useMemo(() => {
355
+ if (!localDerived) return "(waiting for local identityRoot / derived hash)";
356
+ if (localDerived.length <= 14) return localDerived;
357
+ return `${localDerived.slice(0, 8)}…${localDerived.slice(-6)}`;
358
+ }, [localDerived]);
359
+
360
+ const serverPreview = useMemo(() => {
361
+ const s = String(serverIdentityHash || "").trim();
362
+ if (!s) return "(server: none)";
363
+ if (s.length <= 14) return s;
364
+ return `${s.slice(0, 8)}…${s.slice(-6)}`;
365
+ }, [serverIdentityHash]);
366
+
367
+ return (
368
+ <Box
369
+ sx={{
370
+ width: "100%",
371
+ maxWidth: 980,
372
+ mx: "auto",
373
+ mt: 2,
374
+ borderRadius: "14px",
375
+ border: `1px solid ${theme.palette.divider}`,
376
+ overflow: "hidden",
377
+ background: theme.palette.mode === "dark" ? theme.palette.section.default : theme.palette.section.subtle,
378
+ }}
379
+ >
380
+ <Box
381
+ sx={{
382
+ px: 1.25,
383
+ py: 1,
384
+ display: "flex",
385
+ alignItems: "center",
386
+ justifyContent: "space-between",
387
+ gap: 1,
388
+ borderBottom: `1px solid ${theme.palette.divider}`,
389
+ background: theme.palette.mode === "dark" ? "rgba(0,0,0,0.18)" : "rgba(255,255,255,0.55)",
390
+ }}
391
+ >
392
+ <Box sx={{ display: "flex", flexDirection: "column", gap: 0.25, minWidth: 0 }}>
393
+ <Box sx={{ fontSize: "12px", fontWeight: 900, letterSpacing: 0.2, color: theme.palette.text.primary }}>
394
+ Blockchain Auth • Derivation Chain
395
+ </Box>
396
+ <Box
397
+ sx={{
398
+ fontSize: "11px",
399
+ color: theme.palette.text.secondary,
400
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace",
401
+ overflow: "hidden",
402
+ textOverflow: "ellipsis",
403
+ whiteSpace: "nowrap",
404
+ }}
405
+ title={`${usernameNorm || ""}`}
406
+ >
407
+ {usernameNorm ? `@${usernameNorm}` : "@…"} • chain: {chainId}
408
+ </Box>
409
+ </Box>
410
+
411
+ <Box sx={{ display: "flex", alignItems: "center", gap: 0.75, flexWrap: "wrap", justifyContent: "flex-end" }}>
412
+ {authBadge}
413
+ {faceBadge}
414
+ </Box>
415
+ </Box>
416
+
417
+ {laneCards}
418
+
419
+ <Box
420
+ sx={{
421
+ display: "grid",
422
+ gridTemplateColumns: "64px 92px 1.3fr 1fr 1.4fr 1.2fr 1.4fr 0.9fr",
423
+ }}
424
+ >
425
+ <HeaderCell>Step</HeaderCell>
426
+ <HeaderCell>Domain</HeaderCell>
427
+ <HeaderCell>Input</HeaderCell>
428
+ <HeaderCell>Op</HeaderCell>
429
+ <HeaderCell>Output</HeaderCell>
430
+ <HeaderCell>Stored where</HeaderCell>
431
+ <HeaderCell>Match when</HeaderCell>
432
+ <HeaderCell>Rotates</HeaderCell>
433
+
434
+ {rows.map((r) => (
435
+ <React.Fragment key={r.step}>
436
+ <Cell mono dim>
437
+ {r.step}
438
+ </Cell>
439
+ <Cell>{DomainBadge(r.domain)}</Cell>
440
+ <Cell mono>{r.input}</Cell>
441
+ <Cell mono dim>
442
+ {r.op}
443
+ </Cell>
444
+ <Cell mono>{r.output}</Cell>
445
+ <Cell dim>{r.storedWhere}</Cell>
446
+ <Cell dim>{r.matchWhen}</Cell>
447
+ <Cell dim>{r.rotates}</Cell>
448
+ </React.Fragment>
449
+ ))}
450
+ </Box>
451
+
452
+ <Box
453
+ sx={{
454
+ px: 1.25,
455
+ py: 1,
456
+ display: "grid",
457
+ gridTemplateColumns: "1fr 1fr",
458
+ gap: 1,
459
+ borderTop: `1px solid ${theme.palette.divider}`,
460
+ background: theme.palette.mode === "dark" ? "rgba(255,255,255,0.03)" : "rgba(0,0,0,0.02)",
461
+ }}
462
+ >
463
+ <Box
464
+ sx={{
465
+ border: `1px solid ${theme.palette.divider}`,
466
+ borderRadius: "12px",
467
+ p: 1,
468
+ background: theme.palette.mode === "dark" ? "rgba(0,0,0,0.18)" : "rgba(255,255,255,0.6)",
469
+ }}
470
+ >
471
+ <Box sx={{ fontSize: "10px", letterSpacing: 0.4, fontWeight: 900, textTransform: "uppercase", color: theme.palette.text.secondary }}>
472
+ Local (derived)
473
+ </Box>
474
+ <Box
475
+ sx={{
476
+ mt: 0.35,
477
+ fontSize: "12px",
478
+ fontWeight: 900,
479
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace",
480
+ color: theme.palette.text.primary,
481
+ }}
482
+ title={localDerived || ""}
483
+ >
484
+ {hasUsername && hasSecret ? derivedPreview : "(enter username + secret)"}
485
+ </Box>
486
+ <Box sx={{ mt: 0.35, fontSize: "11px", color: theme.palette.text.secondary }}>
487
+ This represents your <b>k_unlock</b> / <b>identityRoot fingerprint</b> used to unlock the stable anchor.
488
+ </Box>
489
+ </Box>
490
+
491
+ <Box
492
+ sx={{
493
+ border: `1px solid ${theme.palette.divider}`,
494
+ borderRadius: "12px",
495
+ p: 1,
496
+ background: theme.palette.mode === "dark" ? "rgba(0,0,0,0.18)" : "rgba(255,255,255,0.6)",
497
+ }}
498
+ >
499
+ <Box sx={{ fontSize: "10px", letterSpacing: 0.4, fontWeight: 900, textTransform: "uppercase", color: theme.palette.text.secondary }}>
500
+ Server (claimed)
501
+ </Box>
502
+ <Box
503
+ sx={{
504
+ mt: 0.35,
505
+ fontSize: "12px",
506
+ fontWeight: 900,
507
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace",
508
+ color: theme.palette.text.primary,
509
+ }}
510
+ title={String(serverIdentityHash || "").trim()}
511
+ >
512
+ {usernameExistsOnServer ? serverPreview : "(username not claimed)"}
513
+ </Box>
514
+ <Box sx={{ mt: 0.35, fontSize: "11px", color: theme.palette.text.secondary }}>
515
+ What the ledger has stored for <b>@{usernameNorm || "username"}</b> (e.g., users.identityHash / anchor mapping).
516
+ </Box>
517
+ </Box>
518
+
519
+ <Box sx={{ gridColumn: "1 / -1", display: "flex", alignItems: "center", justifyContent: "space-between", gap: 1, flexWrap: "wrap" }}>
520
+ <Box sx={{ fontSize: "11px", color: theme.palette.text.secondary }}>
521
+ Union happens when a client proof (derived key or signature) is accepted against ledger state (stored mapping / public key).
522
+ </Box>
523
+ <Box>
524
+ {usernameExistsOnServer ? (
525
+ secretMatchesServer ? (
526
+ <Badge tone="success">LOCAL == SERVER</Badge>
527
+ ) : (
528
+ <Badge tone="error">LOCAL ≠ SERVER</Badge>
529
+ )
530
+ ) : (
531
+ <Badge tone="info">NO SERVER CLAIM</Badge>
532
+ )}
533
+ </Box>
534
+ </Box>
535
+ </Box>
536
+
537
+ {/*
538
+ Parts table (conceptual): breaks down what belongs to username vs blockchain,
539
+ and where the binding (“union”) happens.
540
+ */}
541
+ <Box
542
+ sx={{
543
+ mt: 1,
544
+ borderTop: `1px solid ${theme.palette.divider}`,
545
+ background: theme.palette.mode === "dark" ? "rgba(0,0,0,0.12)" : "rgba(255,255,255,0.45)",
546
+ }}
547
+ >
548
+ <Box
549
+ sx={{
550
+ px: 1.25,
551
+ py: 1,
552
+ display: "flex",
553
+ alignItems: "center",
554
+ justifyContent: "space-between",
555
+ gap: 1,
556
+ flexWrap: "wrap",
557
+ }}
558
+ >
559
+ <Box sx={{ display: "flex", flexDirection: "column", gap: 0.2, minWidth: 0 }}>
560
+ <Box sx={{ fontSize: "12px", fontWeight: 900, letterSpacing: 0.2, color: theme.palette.text.primary }}>
561
+ Parts • Username × Blockchain
562
+ </Box>
563
+ <Box sx={{ fontSize: "11px", color: theme.palette.text.secondary }}>
564
+ What is mutable vs stable, and what each side must store.
565
+ </Box>
566
+ </Box>
567
+
568
+ <Box sx={{ display: "flex", alignItems: "center", gap: 0.75, flexWrap: "wrap" }}>
569
+ {DomainBadge("client")}
570
+ {DomainBadge("ledger")}
571
+ {DomainBadge("union")}
572
+ </Box>
573
+ </Box>
574
+
575
+ <Box
576
+ sx={{
577
+ display: "grid",
578
+ gridTemplateColumns: "160px 1fr 1fr 1fr",
579
+ }}
580
+ >
581
+ <HeaderCell>Part</HeaderCell>
582
+ <HeaderCell>Username side</HeaderCell>
583
+ <HeaderCell>Blockchain side</HeaderCell>
584
+ <HeaderCell>Union / Binding</HeaderCell>
585
+
586
+ <Cell mono dim>
587
+ alias
588
+ </Cell>
589
+ <Cell>
590
+ <Box sx={{ display: "flex", alignItems: "center", gap: 0.5, flexWrap: "wrap" }}>
591
+ <Badge tone="neutral">mutable</Badge>
592
+ <span>@{usernameNorm || "(username)"}</span>
593
+ </Box>
594
+ </Cell>
595
+ <Cell dim>
596
+ <Box sx={{ display: "flex", alignItems: "center", gap: 0.5, flexWrap: "wrap" }}>
597
+ <Badge tone="success">stored</Badge>
598
+ <span>users.username</span>
599
+ </Box>
600
+ </Cell>
601
+ <Cell dim>
602
+ Transfer requires proof from the anchor (signature) to rebind to a new alias.
603
+ </Cell>
604
+
605
+ <Cell mono dim>
606
+ secret
607
+ </Cell>
608
+ <Cell>
609
+ <Box sx={{ display: "flex", alignItems: "center", gap: 0.5, flexWrap: "wrap" }}>
610
+ <Badge tone="neutral">in head</Badge>
611
+ <span>(never stored)</span>
612
+ </Box>
613
+ </Cell>
614
+ <Cell dim>
615
+ <Box sx={{ display: "flex", alignItems: "center", gap: 0.5, flexWrap: "wrap" }}>
616
+ <Badge tone="success">never</Badge>
617
+ <span>no plaintext secret</span>
618
+ </Box>
619
+ </Cell>
620
+ <Cell dim>
621
+ Used to derive keys and produce signatures; ledger only verifies.
622
+ </Cell>
623
+
624
+ <Cell mono dim>
625
+ k_unlock
626
+ </Cell>
627
+ <Cell mono>
628
+ {hasUsername && hasSecret ? derivedPreview : "(derive from username+secret)"}
629
+ </Cell>
630
+ <Cell dim>
631
+ Not stored (ledger only keeps the anchor mapping / public key).
632
+ </Cell>
633
+ <Cell dim>
634
+ Must reproduce the same proof that matches ledger state.
635
+ </Cell>
636
+
637
+ <Cell mono dim>
638
+ identityNoise
639
+ </Cell>
640
+ <Cell>
641
+ <Box sx={{ display: "flex", alignItems: "center", gap: 0.5, flexWrap: "wrap" }}>
642
+ <Badge tone="neutral">stable</Badge>
643
+ <span>root seed (client)</span>
644
+ </Box>
645
+ </Cell>
646
+ <Cell dim>
647
+ <Box sx={{ display: "flex", alignItems: "center", gap: 0.5, flexWrap: "wrap" }}>
648
+ <Badge tone="success">stored</Badge>
649
+ <span>anchorId = H(noise)</span>
650
+ </Box>
651
+ </Cell>
652
+ <Cell dim>
653
+ Binding happens by proving you control the noise-derived signing key.
654
+ </Cell>
655
+
656
+ <Cell mono dim>
657
+ public key
658
+ </Cell>
659
+ <Cell dim>
660
+ Derived from noise/chain (never needs to be secret).
661
+ </Cell>
662
+ <Cell>
663
+ <Box sx={{ display: "flex", alignItems: "center", gap: 0.5, flexWrap: "wrap" }}>
664
+ <Badge tone="success">stored</Badge>
665
+ <span>users.publicKey</span>
666
+ </Box>
667
+ </Cell>
668
+ <Cell dim>
669
+ Ledger verifies signatures; rotations require signed updates.
670
+ </Cell>
671
+
672
+ <Cell mono dim>
673
+ face template
674
+ </Cell>
675
+ <Cell dim>
676
+ Captured locally; only a template vector should be transmitted.
677
+ </Cell>
678
+ <Cell dim>
679
+ Stored as templateHash + encrypted template (optional), linked to identityHash.
680
+ </Cell>
681
+ <Cell dim>
682
+ Face check gates claiming / login UX, but the anchor proof is the real membership.
683
+ </Cell>
684
+ </Box>
685
+
686
+ <Box
687
+ sx={{
688
+ px: 1.25,
689
+ py: 1,
690
+ borderTop: `1px solid ${theme.palette.divider}`,
691
+ display: "flex",
692
+ alignItems: "center",
693
+ justifyContent: "space-between",
694
+ gap: 1,
695
+ flexWrap: "wrap",
696
+ }}
697
+ >
698
+ <Box sx={{ fontSize: "11px", color: theme.palette.text.secondary }}>
699
+ Quick mental model: <b>username</b> is the label, <b>blockchain</b> stores the mapping, and <b>union</b> is the signature-proof that binds them.
700
+ </Box>
701
+ <Box sx={{ display: "flex", gap: 0.75, flexWrap: "wrap" }}>
702
+ <Badge tone="neutral">mutable alias</Badge>
703
+ <Badge tone="warn">union = proof</Badge>
704
+ <Badge tone="success">stable anchor</Badge>
705
+ </Box>
706
+ </Box>
707
+ </Box>
708
+ </Box>
709
+ );
710
+ }