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,197 @@
1
+ import * as React from 'react';
2
+ import Box from '@mui/material/Box';
3
+ import Typography from '@mui/material/Typography';
4
+ import ToggleButton from '@mui/material/ToggleButton';
5
+ import ToggleButtonGroup from '@mui/material/ToggleButtonGroup';
6
+ import Divider from '@mui/material/Divider';
7
+ import TextField from '@mui/material/TextField';
8
+ import InputAdornment from '@mui/material/InputAdornment';
9
+ export type HighLightsFilterMode = 'all' | 'byColor';
10
+ export type HighLightsDrawerProps = {
11
+ colors: string[];
12
+ selectedColor?: string;
13
+ defaultSelectedColor?: string;
14
+ onSelectedColorChange?: (color: string) => void;
15
+ query?: string;
16
+ defaultQuery?: string;
17
+ onQueryChange?: (query: string) => void;
18
+ mode?: HighLightsFilterMode;
19
+ defaultMode?: HighLightsFilterMode;
20
+ onModeChange?: (mode: HighLightsFilterMode) => void;
21
+ title?: React.ReactNode;
22
+ };
23
+
24
+ function clampPalette(colors: string[]): string[] {
25
+ const next = (colors?.length ? colors : []).slice(0, 8);
26
+ return next;
27
+ }
28
+
29
+ function useControlled<T>({
30
+ value,
31
+ defaultValue,
32
+ }: {
33
+ value?: T;
34
+ defaultValue: T;
35
+ }) {
36
+ const [uncontrolled, setUncontrolled] = React.useState<T>(defaultValue);
37
+ const isControlled = value !== undefined;
38
+ const state = (isControlled ? value : uncontrolled) as T;
39
+ const setState = React.useCallback(
40
+ (next: T) => {
41
+ if (!isControlled) setUncontrolled(next);
42
+ },
43
+ [isControlled],
44
+ );
45
+ return { state, setState, isControlled };
46
+ }
47
+
48
+ export default function HighLightsDrawer(props: HighLightsDrawerProps) {
49
+ const {
50
+ colors: colorsProp,
51
+ selectedColor,
52
+ defaultSelectedColor,
53
+ onSelectedColorChange,
54
+ query,
55
+ defaultQuery,
56
+ onQueryChange,
57
+ mode,
58
+ defaultMode = 'all',
59
+ onModeChange,
60
+ title = 'Highlights',
61
+ } = props;
62
+
63
+ const colors = React.useMemo(() => clampPalette(colorsProp), [colorsProp]);
64
+
65
+ const { state: modeState, setState: setModeState } = useControlled<HighLightsFilterMode>({
66
+ value: mode,
67
+ defaultValue: defaultMode,
68
+ });
69
+
70
+ const { state: colorState, setState: setColorState } = useControlled<string>({
71
+ value: selectedColor,
72
+ defaultValue: defaultSelectedColor ?? colors[0] ?? '#FDE047',
73
+ });
74
+
75
+ const { state: queryState, setState: setQueryState } = useControlled<string>({
76
+ value: query,
77
+ defaultValue: defaultQuery ?? '',
78
+ });
79
+
80
+ const handleMode = React.useCallback(
81
+ (_: unknown, next: HighLightsFilterMode | null) => {
82
+ if (!next) return;
83
+ setModeState(next);
84
+ onModeChange?.(next);
85
+ },
86
+ [onModeChange, setModeState],
87
+ );
88
+
89
+ const handlePickColor = React.useCallback(
90
+ (c: string) => {
91
+ setColorState(c);
92
+ onSelectedColorChange?.(c);
93
+ },
94
+ [onSelectedColorChange, setColorState],
95
+ );
96
+
97
+ const handleQuery = React.useCallback(
98
+ (next: string) => {
99
+ setQueryState(next);
100
+ onQueryChange?.(next);
101
+ },
102
+ [onQueryChange, setQueryState],
103
+ );
104
+
105
+ return (
106
+ <Box sx={{ width: 360, display: 'flex', flexDirection: 'column' }}>
107
+ <Box sx={{ p: 2, pb: 1.5 }}>
108
+ <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 2 }}>
109
+ <Typography variant="h6" sx={{ fontWeight: 800, letterSpacing: -0.2 }}>
110
+ {title}
111
+ </Typography>
112
+ <ToggleButtonGroup
113
+ size="small"
114
+ exclusive
115
+ value={modeState}
116
+ onChange={handleMode}
117
+ aria-label="Highlights filter mode"
118
+ >
119
+ <ToggleButton value="all" aria-label="All highlights">
120
+ All
121
+ </ToggleButton>
122
+ <ToggleButton value="byColor" aria-label="Filter by color">
123
+ By Color
124
+ </ToggleButton>
125
+ </ToggleButtonGroup>
126
+ </Box>
127
+
128
+ <Box sx={{ mt: 1.5 }}>
129
+ <TextField
130
+ value={queryState}
131
+ onChange={(e) => handleQuery(e.target.value)}
132
+ size="small"
133
+ fullWidth
134
+ placeholder="Search highlights"
135
+ inputProps={{ 'aria-label': 'Search highlights' }}
136
+ InputProps={{
137
+ startAdornment: (
138
+ <InputAdornment position="start">
139
+ <span style={{ opacity: 0.65 }}>⌕</span>
140
+ </InputAdornment>
141
+ ),
142
+ }}
143
+ />
144
+ </Box>
145
+
146
+ {modeState === 'byColor' ? (
147
+ <Box sx={{ mt: 1.5, display: 'flex', alignItems: 'center', gap: 1, flexWrap: 'wrap' }}>
148
+ {colors.map((c) => {
149
+ const selected = c.toLowerCase() === String(colorState).toLowerCase();
150
+ return (
151
+ <Box
152
+ key={c}
153
+ role="button"
154
+ tabIndex={0}
155
+ aria-label={`Filter highlights by ${c}`}
156
+ onClick={() => handlePickColor(c)}
157
+ onKeyDown={(e) => {
158
+ if (e.key === 'Enter' || e.key === ' ') {
159
+ e.preventDefault();
160
+ handlePickColor(c);
161
+ }
162
+ }}
163
+ sx={{
164
+ width: 18,
165
+ height: 18,
166
+ borderRadius: 999,
167
+ bgcolor: c,
168
+ cursor: 'pointer',
169
+ border: selected ? '2px solid' : '1px solid',
170
+ borderColor: selected ? 'text.primary' : 'divider',
171
+ boxShadow: selected ? 1 : 0,
172
+ transform: selected ? 'scale(1.08)' : 'none',
173
+ transition: 'transform 120ms ease',
174
+ }}
175
+ />
176
+ );
177
+ })}
178
+ <Typography variant="caption" sx={{ ml: 0.5, opacity: 0.75 }}>
179
+ Select a color to filter.
180
+ </Typography>
181
+ </Box>
182
+ ) : null}
183
+ </Box>
184
+
185
+ <Divider />
186
+
187
+ {/* Content area: will be implemented next */}
188
+ <Box sx={{ p: 2, pt: 1.5 }}>
189
+ <Typography variant="body2" sx={{ opacity: 0.7 }}>
190
+ Drawer content coming next…
191
+ </Typography>
192
+ </Box>
193
+ </Box>
194
+ );
195
+ }
196
+
197
+ (HighLightsDrawer as any).displayName = 'Gui.HighLightsDrawer';
@@ -0,0 +1,312 @@
1
+ /**
2
+ * This.GUI — FaceRecognition (organism)
3
+ *
4
+ * What it is
5
+ * - A camera + face-landmarks UI that can run in two modes:
6
+ * 1) `variant="modal"` : renders inside a `Modal` (default)
7
+ * 2) `variant="inline"`: renders a square camera surface that can live inside any layout
8
+ *
9
+ * Core ideas
10
+ * - The component uses `react-webcam` for camera capture.
11
+ * - When `showLandmarks` is enabled, it attempts to lazy-load MediaPipe Tasks Vision (`@mediapipe/tasks-vision`).
12
+ * - If the model fails to load, it falls back to a lightweight placeholder landmark set.
13
+ * - The overlay and HUD are mirrored by default (`mirrorPreview=true`) so the mesh matches a mirrored selfie preview.
14
+ *
15
+ * Verification (Option A)
16
+ * - When landmarks are available, the component extracts a stable `FaceTemplate` (a number[]).
17
+ * - It does this by collecting a short burst of templates, then computing a per-dimension median.
18
+ * - Once stable, it can automatically call `verifyUrl` (default: `/api/face/verify`) when `autoVerify=true`.
19
+ *
20
+ * Externally-driven status (Triad-friendly)
21
+ * - Parent apps can drive the HUD badge via:
22
+ * - `verifyHttpStatus` and `verifyMessage` (to show 404, ERR, etc.)
23
+ * - `verifyPayload` (to trigger verification using a parent-provided template)
24
+ * - This lets a parent (like Triad) show a badge even if verification happens elsewhere.
25
+ *
26
+ * Events / callbacks
27
+ * - `onCapture(imageDataUrl)` is used in Capture mode (when `showLandmarks=false`).
28
+ * - `onTemplate(template)` emits the latest stable template (or null when clearing).
29
+ * - `onVerify(result)` emits verification JSON from `verifyUrl`.
30
+ * - `onStatus({ httpStatus, message, busy })` emits status as verification progresses.
31
+ *
32
+ * Browser notes
33
+ * - Storybook will request camera permission when these stories render.
34
+ * - Some browsers (Safari) may not support `navigator.permissions` for camera; the component handles that.
35
+ */
36
+ import type { Meta, StoryObj } from '@storybook/react';
37
+ import React from 'react';
38
+ import FaceRecognition from './FaceRecognition';
39
+
40
+ const meta: Meta<typeof FaceRecognition> = {
41
+ title: 'Identity Noise/FaceRecognition',
42
+ component: FaceRecognition,
43
+ tags: ['autodocs'],
44
+ decorators: [
45
+ (Story) => (
46
+ <div style={{ padding: 16, minHeight: 520, display: 'grid', placeItems: 'center', backgroundColor: '#f5f5f5' }}>
47
+ <Story />
48
+ </div>
49
+ ),
50
+ ],
51
+ parameters: {
52
+ layout: 'centered',
53
+ docs: {
54
+ description: {
55
+ component: `
56
+ # FaceRecognition
57
+
58
+ ## Overview
59
+
60
+ FaceRecognition is a versatile camera and face landmarks organism designed for React applications. It supports two distinct modes:
61
+
62
+ - \`modal\`: Renders inside a modal dialog, suitable for workflows requiring user focus.
63
+ - \`inline\`: Renders a square camera surface that can be embedded anywhere in your layout.
64
+
65
+ ## Features
66
+
67
+ - Uses \`react-webcam\` for camera capture.
68
+ - Lazy-loads MediaPipe Tasks Vision for face landmark detection when \`showLandmarks\` is enabled.
69
+ - Falls back to a lightweight placeholder landmark set if the model fails to load.
70
+ - Mirrored preview and overlays by default for a natural selfie experience.
71
+ - Extracts stable face templates for verification workflows.
72
+ - Supports automatic verification via a configurable API endpoint.
73
+ - Allows external status control for integration with parent applications like Triad.
74
+
75
+ ## Key Props
76
+
77
+ - \`variant\` (\"modal\" | \"inline\"): Determines rendering mode.
78
+ - \`showLandmarks\` (boolean): Enables face landmark detection and mesh overlay.
79
+ - \`autoVerify\` (boolean): Automatically triggers verification when a stable template is extracted.
80
+ - \`verifyUrl\` (string): URL endpoint for face verification requests.
81
+ - \`mirrorPreview\` (boolean): Mirrors the camera preview and overlays.
82
+ - \`meshStep\` (number): Controls the detail level of the face mesh (1-6).
83
+ - \`verifyHttpStatus\` (number): External HTTP status to drive the HUD badge.
84
+ - \`verifyMessage\` (string): External message to display in the HUD badge.
85
+ - \`verifyPayload\` (any): External template payload to trigger verification.
86
+
87
+ ## Basic usage (React)
88
+
89
+ \`\`\`jsx
90
+ <FaceRecognition
91
+ open={true}
92
+ variant="modal"
93
+ showLandmarks={true}
94
+ autoVerify={true}
95
+ verifyUrl="/api/face/verify"
96
+ onCapture={(imageDataUrl) => { /* handle capture */ }}
97
+ onTemplate={(template) => { /* handle template */ }}
98
+ onVerify={(result) => { /* handle verification result */ }}
99
+ onStatus={({ httpStatus, message, busy }) => { /* handle status updates */ }}
100
+ />
101
+ \`\`\`
102
+
103
+ ## Triad / external status usage
104
+
105
+ Parent applications can control the HUD badge externally by setting \`verifyHttpStatus\` and \`verifyMessage\` props, allowing verification state to be displayed even if performed outside this component.
106
+
107
+ ## Notes
108
+
109
+ - Storybook will request camera permission when these stories render.
110
+ - Some browsers (e.g., Safari) may not support \`navigator.permissions\` for camera; the component handles this gracefully.
111
+ `,
112
+ },
113
+ },
114
+ },
115
+ args: {
116
+ open: true,
117
+ title: 'Face Scan',
118
+ variant: 'modal',
119
+ showLandmarks: false,
120
+ autoVerify: true,
121
+ includeBlendshapes: false,
122
+ meshStep: 1,
123
+ mirrorPreview: true,
124
+ },
125
+ argTypes: {
126
+ open: { control: 'boolean', description: 'Controls whether the modal or inline camera surface is open/visible.' },
127
+ title: { control: 'text', description: 'Title text shown in the modal header.' },
128
+ variant: {
129
+ control: { type: 'radio' },
130
+ options: ['modal', 'inline'],
131
+ description: 'Determines the rendering mode: "modal" for dialog or "inline" for embedded camera surface.',
132
+ },
133
+ showLandmarks: {
134
+ control: 'boolean',
135
+ description: 'Enables face landmark detection, mesh overlay, and template extraction.',
136
+ },
137
+ verifyUrl: {
138
+ control: 'text',
139
+ description: 'URL endpoint used for face verification requests when autoVerify is enabled.',
140
+ },
141
+ autoVerify: {
142
+ control: 'boolean',
143
+ description: 'Automatically triggers verification when a stable template is available.',
144
+ },
145
+ includeBlendshapes: {
146
+ control: 'boolean',
147
+ description: 'Includes blendshape coefficients in the extracted face template data.',
148
+ },
149
+ showMeshConnections: {
150
+ control: 'boolean',
151
+ description: 'Shows connections between face landmarks in the mesh overlay.',
152
+ },
153
+ meshStep: {
154
+ control: { type: 'number', min: 1, max: 6, step: 1 },
155
+ description: 'Controls the detail level of the face mesh; lower values show more points.',
156
+ },
157
+ mirrorPreview: {
158
+ control: 'boolean',
159
+ description: 'Mirrors the camera preview and overlays to match a selfie view.',
160
+ },
161
+ verifyPayload: {
162
+ control: false,
163
+ description: 'External face template payload to trigger verification externally.',
164
+ },
165
+ verifyHttpStatus: {
166
+ control: { type: 'number' },
167
+ description: 'Externally-driven HTTP status code to display HUD badge accordingly.',
168
+ },
169
+ verifyMessage: {
170
+ control: 'text',
171
+ description: 'Externally-driven message to display in the HUD badge.',
172
+ },
173
+ onClose: { action: 'onClose', description: 'Callback fired when the modal or camera surface is closed.' },
174
+ onCapture: { action: 'onCapture', description: 'Callback fired with captured image data URL in capture mode.' },
175
+ onVerify: { action: 'onVerify', description: 'Callback fired with verification result JSON.' },
176
+ onTemplate: { action: 'onTemplate', description: 'Callback fired with the latest stable face template.' },
177
+ onStatus: { action: 'onStatus', description: 'Callback fired with verification status updates.' },
178
+ },
179
+ };
180
+
181
+ export default meta;
182
+
183
+ type Story = StoryObj<typeof FaceRecognition>;
184
+
185
+ export const Playground: Story = {
186
+ name: 'Playground',
187
+ render: (args) => {
188
+ if (args.variant === 'inline') {
189
+ return (
190
+ <div style={{ width: 360, border: '1px solid #ddd', borderRadius: 8, overflow: 'hidden' }}>
191
+ <FaceRecognition {...args} />
192
+ </div>
193
+ );
194
+ }
195
+ return <FaceRecognition {...args} />;
196
+ },
197
+ };
198
+
199
+ export const ModalCapture: Story = {
200
+ name: 'Modal / Capture',
201
+ args: {
202
+ variant: 'modal',
203
+ showLandmarks: false,
204
+ open: true,
205
+ },
206
+ render: (args) => <FaceRecognition {...args} />,
207
+ parameters: {
208
+ docs: { description: { story: 'Capture-only mode. Uses react-webcam screenshot (jpeg) and calls onCapture(imageDataUrl). Landmarks are OFF.' } },
209
+ },
210
+ };
211
+
212
+ export const ModalLandmarksVerify: Story = {
213
+ name: 'Modal / Landmarks + Verify',
214
+ args: {
215
+ variant: 'modal',
216
+ showLandmarks: true,
217
+ autoVerify: true,
218
+ open: true,
219
+ },
220
+ render: (args) => <FaceRecognition {...args} />,
221
+ parameters: {
222
+ docs: { description: { story: 'Landmarks ON. Loads MediaPipe, draws mesh, extracts a stable template, and can auto-verify via verifyUrl.' } },
223
+ },
224
+ };
225
+
226
+ export const InlineLandmarks: Story = {
227
+ name: 'Inline / Landmarks HUD',
228
+ args: {
229
+ variant: 'inline',
230
+ showLandmarks: true,
231
+ open: true,
232
+ },
233
+ render: (args) => (
234
+ <div style={{ width: 360, border: '1px solid #ddd', borderRadius: 8, overflow: 'hidden' }}>
235
+ <FaceRecognition {...args} />
236
+ </div>
237
+ ),
238
+ parameters: {
239
+ layout: 'padded',
240
+ docs: { description: { story: 'Inline surface intended for embedding in layouts. Shows the live mesh overlay + HUD badge when status is available.' } },
241
+ },
242
+ };
243
+
244
+ export const InlineNoLandmarks: Story = {
245
+ name: 'Inline / Camera Only',
246
+ args: {
247
+ variant: 'inline',
248
+ showLandmarks: false,
249
+ open: true,
250
+ },
251
+ render: (args) => (
252
+ <div style={{ width: 360, border: '1px solid #ddd', borderRadius: 8, overflow: 'hidden' }}>
253
+ <FaceRecognition {...args} />
254
+ </div>
255
+ ),
256
+ parameters: {
257
+ layout: 'padded',
258
+ docs: { description: { story: 'Inline camera surface without landmarks. Useful for simple preview / capture flows.' } },
259
+ },
260
+ };
261
+
262
+ export const ExternalStatusBadge404: Story = {
263
+ name: 'External Status / 404',
264
+ args: {
265
+ variant: 'inline',
266
+ showLandmarks: true,
267
+ verifyHttpStatus: 404,
268
+ verifyMessage: '404 (Face Not Found)',
269
+ open: true,
270
+ },
271
+ render: (args) => (
272
+ <div style={{ width: 360, border: '1px solid #ddd', borderRadius: 8, overflow: 'hidden' }}>
273
+ <FaceRecognition {...args} />
274
+ </div>
275
+ ),
276
+ parameters: {
277
+ layout: 'padded',
278
+ docs: { description: { story: 'Demonstrates externally-driven HUD badge (404). Parent can set verifyHttpStatus/verifyMessage without relying on internal fetch.' } },
279
+ },
280
+ };
281
+
282
+ export const ExternalStatusBadgeMatch: Story = {
283
+ name: 'External Status / Match',
284
+ args: {
285
+ variant: 'inline',
286
+ showLandmarks: true,
287
+ verifyHttpStatus: 200,
288
+ verifyMessage: 'Match',
289
+ verifyPayload: undefined,
290
+ open: true,
291
+ },
292
+ render: (args) => (
293
+ <div style={{ width: 360, border: '1px solid #ddd', borderRadius: 8, overflow: 'hidden' }}>
294
+ <FaceRecognition {...args} />
295
+ </div>
296
+ ),
297
+ parameters: {
298
+ layout: 'padded',
299
+ docs: { description: { story: 'Demonstrates externally-driven HUD badge (200/Match). Useful when verification happens in a parent module.' } },
300
+ },
301
+ };
302
+
303
+ export const Closed: Story = {
304
+ name: 'Closed',
305
+ args: {
306
+ open: false,
307
+ },
308
+ render: (args) => <FaceRecognition {...args} />,
309
+ parameters: {
310
+ docs: { description: { story: 'Closed state. In modal variant, nothing is shown when open=false.' } },
311
+ },
312
+ };