@nyuccl/smile 0.2.0-beta.4 → 0.2.0-beta.41

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 (310) hide show
  1. package/dist/module.json +1 -1
  2. package/dist/module.mjs +109 -21
  3. package/dist/runtime/components/builtins/AdvertisementView.d.vue.ts +13 -1
  4. package/dist/runtime/components/builtins/AdvertisementView.vue +7 -3
  5. package/dist/runtime/components/builtins/AdvertisementView.vue.d.ts +13 -1
  6. package/dist/runtime/components/builtins/DebriefView.vue +3 -1
  7. package/dist/runtime/components/builtins/DemographicSurveyView.vue +8 -6
  8. package/dist/runtime/components/builtins/DeviceSurveyView.vue +5 -3
  9. package/dist/runtime/components/builtins/ExpView.vue +4 -2
  10. package/dist/runtime/components/builtins/ExperimentStatusBar.vue +3 -0
  11. package/dist/runtime/components/builtins/FavoriteColor.vue +3 -1
  12. package/dist/runtime/components/builtins/FavoriteNumber.vue +3 -1
  13. package/dist/runtime/components/builtins/InformedConsentModal.vue +5 -3
  14. package/dist/runtime/components/builtins/InformedConsentView.vue +3 -2
  15. package/dist/runtime/components/builtins/InstructionsQuiz.vue +7 -5
  16. package/dist/runtime/components/builtins/InstructionsView.vue +5 -3
  17. package/dist/runtime/components/builtins/LocalDevBanner.vue +16 -0
  18. package/dist/runtime/components/builtins/MTurkRecruitView.vue +4 -3
  19. package/dist/runtime/components/builtins/PresentationModeView.vue +9 -8
  20. package/dist/runtime/components/builtins/StatusBar.vue +7 -4
  21. package/dist/runtime/components/builtins/StudyPreviewText.vue +12 -10
  22. package/dist/runtime/components/builtins/TaskFeedbackSurveyView.vue +3 -1
  23. package/dist/runtime/components/builtins/ThanksView.vue +22 -21
  24. package/dist/runtime/components/builtins/WindowSizerView.vue +5 -3
  25. package/dist/runtime/components/builtins/WithdrawModal.vue +9 -7
  26. package/dist/runtime/components/builtins/WithdrawView.vue +4 -2
  27. package/dist/runtime/components/dev/RecruitmentChooserView.vue +532 -224
  28. package/dist/runtime/components/dev/ResponsiveDeviceContainer.vue +17 -8
  29. package/dist/runtime/components/dev/SmileDevPresentationView.vue +83 -0
  30. package/dist/runtime/components/dev/console/ConfigList.vue +14 -11
  31. package/dist/runtime/components/dev/console/ConsoleConfigPanel.vue +28 -7
  32. package/dist/runtime/components/dev/console/ConsoleDatabaseBrowsePanel.vue +6 -4
  33. package/dist/runtime/components/dev/console/ConsoleLogPanel.vue +68 -23
  34. package/dist/runtime/components/dev/console/DatabaseList.vue +9 -7
  35. package/dist/runtime/components/dev/console/SmileDevConsole.vue +7 -5
  36. package/dist/runtime/components/dev/devicePresets.d.ts +4 -4
  37. package/dist/runtime/components/dev/devicePresets.js +4 -4
  38. package/dist/runtime/components/dev/menu/DevConfigPanel.vue +3 -1
  39. package/dist/runtime/components/dev/menu/ResponsiveDeviceSelect.vue +1 -0
  40. package/dist/runtime/components/dev/menu/SmileDevAppMenu.vue +27 -24
  41. package/dist/runtime/components/dev/navbar/ColorModeButton.vue +5 -3
  42. package/dist/runtime/components/dev/navbar/DatabaseButtonGroup.vue +8 -6
  43. package/dist/runtime/components/dev/navbar/FullScreenButton.vue +4 -2
  44. package/dist/runtime/components/dev/navbar/KeyCommandNotification.vue +1 -1
  45. package/dist/runtime/components/dev/navbar/PanelButtonGroup.d.vue.ts +3 -0
  46. package/dist/runtime/components/dev/navbar/PanelButtonGroup.vue +79 -0
  47. package/dist/runtime/components/dev/navbar/PanelButtonGroup.vue.d.ts +3 -0
  48. package/dist/runtime/components/dev/navbar/ReloadButton.vue +3 -1
  49. package/dist/runtime/components/dev/navbar/ResetButton.vue +3 -1
  50. package/dist/runtime/components/dev/navbar/RouteJumper.vue +9 -5
  51. package/dist/runtime/components/dev/navbar/SmileDevNavBar.vue +19 -27
  52. package/dist/runtime/components/dev/navbar/StepInfoButtonGroup.vue +5 -3
  53. package/dist/runtime/components/dev/navbar/ViewInfoButtonGroup.vue +13 -10
  54. package/dist/runtime/components/dev/presentation/DarkModeButton.vue +5 -3
  55. package/dist/runtime/components/dev/presentation/LogoutButton.vue +2 -1
  56. package/dist/runtime/components/dev/presentation/PresentationModeResetButton.vue +11 -2
  57. package/dist/runtime/components/dev/presentation/PresentationNavBar.d.vue.ts +13 -1
  58. package/dist/runtime/components/dev/presentation/PresentationNavBar.vue +13 -6
  59. package/dist/runtime/components/dev/presentation/PresentationNavBar.vue.d.ts +13 -1
  60. package/dist/runtime/components/dev/presentation/QRCodeButton.vue +4 -2
  61. package/dist/runtime/components/dev/sidebar/AppProgressPanel.vue +23 -21
  62. package/dist/runtime/components/dev/sidebar/ConfigurationVariablesPanel.vue +7 -5
  63. package/dist/runtime/components/dev/sidebar/DatabaseStatusInfoPanel.vue +27 -7
  64. package/dist/runtime/components/dev/sidebar/RandomizationSidebarPanel.vue +9 -5
  65. package/dist/runtime/components/dev/sidebar/SmileDevSideBar.vue +12 -5
  66. package/dist/runtime/components/dev/sidebar/StepDataViewer.d.vue.ts +2 -2
  67. package/dist/runtime/components/dev/sidebar/StepDataViewer.vue +1 -1
  68. package/dist/runtime/components/dev/sidebar/StepDataViewer.vue.d.ts +2 -2
  69. package/dist/runtime/components/dev/sidebar/StepExplorerPanel.vue +13 -8
  70. package/dist/runtime/components/dev/sidebar/StepNode.vue +7 -5
  71. package/dist/runtime/components/dev/sidebar/StudyInfoPanel.vue +3 -2
  72. package/dist/runtime/components/forms/MonthYearDayPicker.vue +1 -0
  73. package/dist/runtime/components/layouts/ConstrainedPage.d.vue.ts +1 -1
  74. package/dist/runtime/components/layouts/ConstrainedPage.vue.d.ts +1 -1
  75. package/dist/runtime/components/layouts/ConstrainedTaskWindow.d.vue.ts +2 -2
  76. package/dist/runtime/components/layouts/ConstrainedTaskWindow.vue +1 -1
  77. package/dist/runtime/components/layouts/ConstrainedTaskWindow.vue.d.ts +2 -2
  78. package/dist/runtime/components/layouts/TitleTwoCol.d.vue.ts +1 -1
  79. package/dist/runtime/components/layouts/TitleTwoCol.vue.d.ts +1 -1
  80. package/dist/runtime/components/layouts/TwoCol.d.vue.ts +1 -1
  81. package/dist/runtime/components/layouts/TwoCol.vue.d.ts +1 -1
  82. package/dist/runtime/components/ui/avatar/Avatar.vue +1 -0
  83. package/dist/runtime/components/ui/avatar/AvatarFallback.vue +1 -0
  84. package/dist/runtime/components/ui/badge/Badge.vue +1 -0
  85. package/dist/runtime/components/ui/badge/index.d.ts +1 -1
  86. package/dist/runtime/components/ui/breadcrumb/BreadcrumbEllipsis.vue +1 -0
  87. package/dist/runtime/components/ui/breadcrumb/BreadcrumbItem.vue +1 -0
  88. package/dist/runtime/components/ui/breadcrumb/BreadcrumbLink.vue +1 -0
  89. package/dist/runtime/components/ui/breadcrumb/BreadcrumbList.vue +1 -0
  90. package/dist/runtime/components/ui/breadcrumb/BreadcrumbPage.vue +1 -0
  91. package/dist/runtime/components/ui/breadcrumb/BreadcrumbSeparator.vue +1 -0
  92. package/dist/runtime/components/ui/button/Button.vue +1 -0
  93. package/dist/runtime/components/ui/button/index.d.ts +2 -2
  94. package/dist/runtime/components/ui/button-group/ButtonGroup.vue +1 -0
  95. package/dist/runtime/components/ui/button-group/ButtonGroupItem.vue +1 -0
  96. package/dist/runtime/components/ui/calendar/Calendar.vue +1 -0
  97. package/dist/runtime/components/ui/calendar/CalendarCell.vue +1 -0
  98. package/dist/runtime/components/ui/calendar/CalendarCellTrigger.vue +1 -0
  99. package/dist/runtime/components/ui/calendar/CalendarGrid.vue +1 -0
  100. package/dist/runtime/components/ui/calendar/CalendarGridRow.vue +1 -0
  101. package/dist/runtime/components/ui/calendar/CalendarHeadCell.vue +1 -0
  102. package/dist/runtime/components/ui/calendar/CalendarHeader.vue +1 -0
  103. package/dist/runtime/components/ui/calendar/CalendarHeading.vue +1 -0
  104. package/dist/runtime/components/ui/calendar/CalendarNextButton.vue +1 -0
  105. package/dist/runtime/components/ui/calendar/CalendarPrevButton.vue +1 -0
  106. package/dist/runtime/components/ui/card/Card.vue +1 -0
  107. package/dist/runtime/components/ui/card/CardAction.vue +1 -0
  108. package/dist/runtime/components/ui/card/CardContent.vue +1 -0
  109. package/dist/runtime/components/ui/card/CardDescription.vue +1 -0
  110. package/dist/runtime/components/ui/card/CardFooter.vue +1 -0
  111. package/dist/runtime/components/ui/card/CardHeader.vue +1 -0
  112. package/dist/runtime/components/ui/card/CardTitle.vue +1 -0
  113. package/dist/runtime/components/ui/checkbox/Checkbox.d.vue.ts +6 -6
  114. package/dist/runtime/components/ui/checkbox/Checkbox.vue +1 -0
  115. package/dist/runtime/components/ui/checkbox/Checkbox.vue.d.ts +6 -6
  116. package/dist/runtime/components/ui/checkbox/index.d.ts +2 -2
  117. package/dist/runtime/components/ui/dropdown-menu/DropdownMenuCheckboxItem.d.vue.ts +4 -4
  118. package/dist/runtime/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +1 -0
  119. package/dist/runtime/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue.d.ts +4 -4
  120. package/dist/runtime/components/ui/dropdown-menu/DropdownMenuContent.d.vue.ts +3 -3
  121. package/dist/runtime/components/ui/dropdown-menu/DropdownMenuContent.vue +1 -0
  122. package/dist/runtime/components/ui/dropdown-menu/DropdownMenuContent.vue.d.ts +3 -3
  123. package/dist/runtime/components/ui/dropdown-menu/DropdownMenuItem.d.vue.ts +1 -1
  124. package/dist/runtime/components/ui/dropdown-menu/DropdownMenuItem.vue +1 -0
  125. package/dist/runtime/components/ui/dropdown-menu/DropdownMenuItem.vue.d.ts +1 -1
  126. package/dist/runtime/components/ui/dropdown-menu/DropdownMenuLabel.vue +1 -0
  127. package/dist/runtime/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +1 -0
  128. package/dist/runtime/components/ui/dropdown-menu/DropdownMenuSeparator.vue +1 -0
  129. package/dist/runtime/components/ui/dropdown-menu/DropdownMenuShortcut.vue +1 -0
  130. package/dist/runtime/components/ui/dropdown-menu/DropdownMenuSubContent.d.vue.ts +3 -3
  131. package/dist/runtime/components/ui/dropdown-menu/DropdownMenuSubContent.vue +1 -0
  132. package/dist/runtime/components/ui/dropdown-menu/DropdownMenuSubContent.vue.d.ts +3 -3
  133. package/dist/runtime/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +1 -0
  134. package/dist/runtime/components/ui/input/Input.d.vue.ts +4 -4
  135. package/dist/runtime/components/ui/input/Input.vue +1 -0
  136. package/dist/runtime/components/ui/input/Input.vue.d.ts +4 -4
  137. package/dist/runtime/components/ui/label/Label.vue +1 -0
  138. package/dist/runtime/components/ui/multiselect/MultiSelect.d.vue.ts +1 -1
  139. package/dist/runtime/components/ui/multiselect/MultiSelect.vue +1 -0
  140. package/dist/runtime/components/ui/multiselect/MultiSelect.vue.d.ts +1 -1
  141. package/dist/runtime/components/ui/pagination/Pagination.vue +1 -0
  142. package/dist/runtime/components/ui/pagination/PaginationContent.vue +1 -0
  143. package/dist/runtime/components/ui/pagination/PaginationEllipsis.vue +1 -0
  144. package/dist/runtime/components/ui/pagination/PaginationFirst.vue +1 -0
  145. package/dist/runtime/components/ui/pagination/PaginationItem.vue +1 -0
  146. package/dist/runtime/components/ui/pagination/PaginationLast.vue +1 -0
  147. package/dist/runtime/components/ui/pagination/PaginationNext.vue +1 -0
  148. package/dist/runtime/components/ui/pagination/PaginationPrevious.vue +1 -0
  149. package/dist/runtime/components/ui/popover/PopoverContent.d.vue.ts +2 -2
  150. package/dist/runtime/components/ui/popover/PopoverContent.vue +1 -0
  151. package/dist/runtime/components/ui/popover/PopoverContent.vue.d.ts +2 -2
  152. package/dist/runtime/components/ui/progress/Progress.vue +1 -0
  153. package/dist/runtime/components/ui/resizable/ResizableHandle.vue +1 -0
  154. package/dist/runtime/components/ui/resizable/ResizablePanel.d.vue.ts +1 -1
  155. package/dist/runtime/components/ui/resizable/ResizablePanel.vue.d.ts +1 -1
  156. package/dist/runtime/components/ui/resizable/ResizablePanelGroup.vue +1 -0
  157. package/dist/runtime/components/ui/select/Select.d.vue.ts +1 -1
  158. package/dist/runtime/components/ui/select/Select.vue.d.ts +1 -1
  159. package/dist/runtime/components/ui/select/SelectContent.d.vue.ts +2 -2
  160. package/dist/runtime/components/ui/select/SelectContent.vue +1 -0
  161. package/dist/runtime/components/ui/select/SelectContent.vue.d.ts +2 -2
  162. package/dist/runtime/components/ui/select/SelectItem.vue +1 -0
  163. package/dist/runtime/components/ui/select/SelectLabel.vue +1 -0
  164. package/dist/runtime/components/ui/select/SelectScrollDownButton.vue +1 -0
  165. package/dist/runtime/components/ui/select/SelectScrollUpButton.vue +1 -0
  166. package/dist/runtime/components/ui/select/SelectSeparator.vue +1 -0
  167. package/dist/runtime/components/ui/select/SelectTrigger.vue +1 -0
  168. package/dist/runtime/components/ui/separator/Separator.vue +1 -0
  169. package/dist/runtime/components/ui/sheet/SheetContent.d.vue.ts +1 -1
  170. package/dist/runtime/components/ui/sheet/SheetContent.vue +1 -0
  171. package/dist/runtime/components/ui/sheet/SheetContent.vue.d.ts +1 -1
  172. package/dist/runtime/components/ui/sheet/SheetDescription.vue +1 -0
  173. package/dist/runtime/components/ui/sheet/SheetFooter.vue +1 -0
  174. package/dist/runtime/components/ui/sheet/SheetHeader.vue +1 -0
  175. package/dist/runtime/components/ui/sheet/SheetOverlay.vue +1 -0
  176. package/dist/runtime/components/ui/sheet/SheetTitle.vue +1 -0
  177. package/dist/runtime/components/ui/sidebar/Sidebar.d.vue.ts +1 -1
  178. package/dist/runtime/components/ui/sidebar/Sidebar.vue +1 -0
  179. package/dist/runtime/components/ui/sidebar/Sidebar.vue.d.ts +1 -1
  180. package/dist/runtime/components/ui/sidebar/SidebarContent.vue +1 -0
  181. package/dist/runtime/components/ui/sidebar/SidebarFooter.vue +1 -0
  182. package/dist/runtime/components/ui/sidebar/SidebarGroup.vue +1 -0
  183. package/dist/runtime/components/ui/sidebar/SidebarGroupAction.vue +1 -0
  184. package/dist/runtime/components/ui/sidebar/SidebarGroupContent.vue +1 -0
  185. package/dist/runtime/components/ui/sidebar/SidebarGroupLabel.vue +1 -0
  186. package/dist/runtime/components/ui/sidebar/SidebarHeader.vue +1 -0
  187. package/dist/runtime/components/ui/sidebar/SidebarInput.vue +1 -0
  188. package/dist/runtime/components/ui/sidebar/SidebarInset.vue +1 -0
  189. package/dist/runtime/components/ui/sidebar/SidebarMenu.vue +1 -0
  190. package/dist/runtime/components/ui/sidebar/SidebarMenuAction.vue +1 -0
  191. package/dist/runtime/components/ui/sidebar/SidebarMenuBadge.vue +1 -0
  192. package/dist/runtime/components/ui/sidebar/SidebarMenuButton.d.vue.ts +1 -1
  193. package/dist/runtime/components/ui/sidebar/SidebarMenuButton.vue.d.ts +1 -1
  194. package/dist/runtime/components/ui/sidebar/SidebarMenuButtonChild.d.vue.ts +1 -1
  195. package/dist/runtime/components/ui/sidebar/SidebarMenuButtonChild.vue +1 -0
  196. package/dist/runtime/components/ui/sidebar/SidebarMenuButtonChild.vue.d.ts +1 -1
  197. package/dist/runtime/components/ui/sidebar/SidebarMenuItem.vue +1 -0
  198. package/dist/runtime/components/ui/sidebar/SidebarMenuSkeleton.vue +1 -0
  199. package/dist/runtime/components/ui/sidebar/SidebarMenuSub.vue +1 -0
  200. package/dist/runtime/components/ui/sidebar/SidebarMenuSubButton.vue +1 -0
  201. package/dist/runtime/components/ui/sidebar/SidebarMenuSubItem.vue +1 -0
  202. package/dist/runtime/components/ui/sidebar/SidebarProvider.vue +1 -0
  203. package/dist/runtime/components/ui/sidebar/SidebarRail.vue +1 -0
  204. package/dist/runtime/components/ui/sidebar/SidebarSeparator.vue +1 -0
  205. package/dist/runtime/components/ui/sidebar/SidebarTrigger.vue +1 -0
  206. package/dist/runtime/components/ui/sidebar/index.d.ts +1 -1
  207. package/dist/runtime/components/ui/skeleton/Skeleton.vue +1 -0
  208. package/dist/runtime/components/ui/sonner/Sonner.d.vue.ts +4 -4
  209. package/dist/runtime/components/ui/sonner/Sonner.vue.d.ts +4 -4
  210. package/dist/runtime/components/ui/stepper/Stepper.vue +1 -0
  211. package/dist/runtime/components/ui/stepper/StepperDescription.vue +1 -0
  212. package/dist/runtime/components/ui/stepper/StepperIndicator.vue +1 -0
  213. package/dist/runtime/components/ui/stepper/StepperItem.d.vue.ts +1 -1
  214. package/dist/runtime/components/ui/stepper/StepperItem.vue +1 -0
  215. package/dist/runtime/components/ui/stepper/StepperItem.vue.d.ts +1 -1
  216. package/dist/runtime/components/ui/stepper/StepperSeparator.vue +1 -0
  217. package/dist/runtime/components/ui/stepper/StepperTitle.vue +1 -0
  218. package/dist/runtime/components/ui/stepper/StepperTrigger.vue +1 -0
  219. package/dist/runtime/components/ui/switch/Switch.d.vue.ts +2 -2
  220. package/dist/runtime/components/ui/switch/Switch.vue +1 -0
  221. package/dist/runtime/components/ui/switch/Switch.vue.d.ts +2 -2
  222. package/dist/runtime/components/ui/switch/index.d.ts +2 -2
  223. package/dist/runtime/components/ui/table/Table.vue +1 -0
  224. package/dist/runtime/components/ui/table/TableBody.vue +1 -0
  225. package/dist/runtime/components/ui/table/TableCaption.vue +1 -0
  226. package/dist/runtime/components/ui/table/TableCell.vue +1 -0
  227. package/dist/runtime/components/ui/table/TableEmpty.vue +1 -0
  228. package/dist/runtime/components/ui/table/TableFooter.vue +1 -0
  229. package/dist/runtime/components/ui/table/TableHead.vue +1 -0
  230. package/dist/runtime/components/ui/table/TableHeader.vue +1 -0
  231. package/dist/runtime/components/ui/table/TableRow.vue +1 -0
  232. package/dist/runtime/components/ui/tabs/Tabs.vue +1 -0
  233. package/dist/runtime/components/ui/tabs/TabsContent.d.vue.ts +2 -2
  234. package/dist/runtime/components/ui/tabs/TabsContent.vue +1 -0
  235. package/dist/runtime/components/ui/tabs/TabsContent.vue.d.ts +2 -2
  236. package/dist/runtime/components/ui/tabs/TabsList.d.vue.ts +1 -1
  237. package/dist/runtime/components/ui/tabs/TabsList.vue +1 -0
  238. package/dist/runtime/components/ui/tabs/TabsList.vue.d.ts +1 -1
  239. package/dist/runtime/components/ui/tabs/TabsTrigger.d.vue.ts +2 -2
  240. package/dist/runtime/components/ui/tabs/TabsTrigger.vue +1 -0
  241. package/dist/runtime/components/ui/tabs/TabsTrigger.vue.d.ts +2 -2
  242. package/dist/runtime/components/ui/tags-input/TagsInput.d.vue.ts +3 -3
  243. package/dist/runtime/components/ui/tags-input/TagsInput.vue +1 -0
  244. package/dist/runtime/components/ui/tags-input/TagsInput.vue.d.ts +3 -3
  245. package/dist/runtime/components/ui/tags-input/TagsInputInput.vue +1 -0
  246. package/dist/runtime/components/ui/tags-input/TagsInputItem.d.vue.ts +2 -2
  247. package/dist/runtime/components/ui/tags-input/TagsInputItem.vue +1 -0
  248. package/dist/runtime/components/ui/tags-input/TagsInputItem.vue.d.ts +2 -2
  249. package/dist/runtime/components/ui/tags-input/TagsInputItemDelete.vue +1 -0
  250. package/dist/runtime/components/ui/tags-input/TagsInputItemText.vue +1 -0
  251. package/dist/runtime/components/ui/textarea/Textarea.d.vue.ts +4 -4
  252. package/dist/runtime/components/ui/textarea/Textarea.vue +1 -0
  253. package/dist/runtime/components/ui/textarea/Textarea.vue.d.ts +4 -4
  254. package/dist/runtime/components/ui/toggle/Toggle.d.vue.ts +2 -2
  255. package/dist/runtime/components/ui/toggle/Toggle.vue +1 -0
  256. package/dist/runtime/components/ui/toggle/Toggle.vue.d.ts +2 -2
  257. package/dist/runtime/components/ui/toggle/index.d.ts +1 -1
  258. package/dist/runtime/components/ui/toggle-group/ToggleGroup.d.vue.ts +2 -2
  259. package/dist/runtime/components/ui/toggle-group/ToggleGroup.vue +1 -0
  260. package/dist/runtime/components/ui/toggle-group/ToggleGroup.vue.d.ts +2 -2
  261. package/dist/runtime/components/ui/toggle-group/ToggleGroupItem.vue +1 -0
  262. package/dist/runtime/components/ui/tooltip/TooltipContent.d.vue.ts +2 -2
  263. package/dist/runtime/components/ui/tooltip/TooltipContent.vue +1 -0
  264. package/dist/runtime/components/ui/tooltip/TooltipContent.vue.d.ts +2 -2
  265. package/dist/runtime/composables/useAPI.d.ts +2 -2
  266. package/dist/runtime/composables/useAPI.js +6 -11
  267. package/dist/runtime/composables/useViewAPI.d.ts +1 -0
  268. package/dist/runtime/composables/useViewAPI.js +20 -4
  269. package/dist/runtime/composables/useWindowSizer.d.ts +14 -0
  270. package/dist/runtime/composables/useWindowSizer.js +48 -0
  271. package/dist/runtime/core/config.d.ts +78 -48
  272. package/dist/runtime/core/config.js +21 -27
  273. package/dist/runtime/core/stepper/Stepper.d.ts +13 -10
  274. package/dist/runtime/core/stepper/Stepper.js +70 -55
  275. package/dist/runtime/core/stepper/StepperSerializer.js +32 -14
  276. package/dist/runtime/core/timeline/Timeline.js +1 -2
  277. package/dist/runtime/css/main.css +1 -1
  278. package/dist/runtime/css/smile.css +1 -1
  279. package/dist/runtime/layouts/development.vue +38 -78
  280. package/dist/runtime/layouts/experiment.d.vue.ts +7 -10
  281. package/dist/runtime/layouts/experiment.vue +13 -0
  282. package/dist/runtime/layouts/experiment.vue.d.ts +7 -10
  283. package/dist/runtime/layouts/presentation.vue +24 -3
  284. package/dist/runtime/middleware/timeline.global.js +2 -4
  285. package/dist/runtime/pages/[...slug].vue +2 -0
  286. package/dist/runtime/pages/dev/[...slug].vue +2 -0
  287. package/dist/runtime/pages/dev-login.vue +5 -3
  288. package/dist/runtime/pages/presentation/[...slug].vue +2 -0
  289. package/dist/runtime/plugins/dev-sync.client.js +0 -2
  290. package/dist/runtime/plugins/seed.client.js +1 -3
  291. package/dist/runtime/plugins/store-sync.client.js +8 -10
  292. package/dist/runtime/public/images/helpus.png +0 -0
  293. package/dist/runtime/public/images/smile.svg +78 -0
  294. package/dist/runtime/public/images/universitylogo.png +0 -0
  295. package/dist/runtime/server/api/auth/login.post.js +11 -2
  296. package/dist/runtime/server/api/db-info.get.d.ts +5 -0
  297. package/dist/runtime/server/api/db-info.get.js +10 -0
  298. package/dist/runtime/server/api/qr.get.js +1 -2
  299. package/dist/runtime/server/middleware/dev-auth.js +10 -5
  300. package/dist/runtime/stores/log.js +4 -7
  301. package/dist/runtime/stores/smilestore.d.ts +161 -1014
  302. package/dist/runtime/stores/smilestore.js +39 -7
  303. package/dist/runtime/utils/utils.js +7 -0
  304. package/package.json +5 -3
  305. package/dist/runtime/components/dev/navbar/ViewButton.vue +0 -159
  306. package/dist/runtime/pages/info.vue +0 -462
  307. /package/dist/runtime/components/{dev/navbar/ViewButton.d.vue.ts → builtins/LocalDevBanner.d.vue.ts} +0 -0
  308. /package/dist/runtime/components/{dev/navbar/ViewButton.vue.d.ts → builtins/LocalDevBanner.vue.d.ts} +0 -0
  309. /package/dist/runtime/{pages/info.d.vue.ts → components/dev/SmileDevPresentationView.d.vue.ts} +0 -0
  310. /package/dist/runtime/{pages/info.vue.d.ts → components/dev/SmileDevPresentationView.vue.d.ts} +0 -0
@@ -1,53 +1,39 @@
1
1
  declare namespace _default {
2
- let mode: any;
3
- let smileVersion: any;
4
- let projectName: any;
5
- let projectRef: any;
6
- let codeName: any;
7
- let codeNameURL: any;
8
- let localStorageKey: string;
9
- let devLocalStorageKey: string;
10
- namespace github {
11
- let repoName: any;
12
- let owner: any;
13
- let branch: any;
14
- let lastCommitMsg: any;
15
- let lastCommitHash: any;
16
- let commitURL: string;
2
+ export let mode: any;
3
+ export let smileVersion: any;
4
+ export let projectName: any;
5
+ export { projectRef };
6
+ export { codeName };
7
+ export let codeNameURL: any;
8
+ export let localStorageKey: string;
9
+ export let devLocalStorageKey: string;
10
+ export namespace github {
11
+ export { repoName };
12
+ export { owner };
13
+ export { branch };
14
+ export let lastCommitMsg: any;
15
+ export { hash as lastCommitHash };
16
+ export let commitURL: string;
17
17
  }
18
- let allowRepeats: boolean;
19
- let autoSave: any;
20
- let maxWrites: any;
21
- let minWriteInterval: any;
22
- let maxSteps: any;
23
- let randomSeed: any;
24
- let deployURL: any;
25
- let labURL: any;
26
- let brandLogoFn: any;
27
- let colorMode: any;
28
- let responsiveUI: boolean;
29
- let googleAnalyticsID: any;
30
- let windowsizerRequest: object;
31
- let windowsizerAggressive: boolean;
32
- let anonymousMode: boolean;
33
- let unpaidStudy: boolean;
34
- namespace sona {
35
- let url: any;
36
- let experimentId: any;
37
- let creditToken: any;
38
- }
39
- namespace sonaPaid {
40
- let url_1: any;
41
- export { url_1 as url };
42
- let experimentId_1: any;
43
- export { experimentId_1 as experimentId };
44
- let creditToken_1: any;
45
- export { creditToken_1 as creditToken };
46
- }
47
- namespace spark {
48
- let completionUrl: string;
49
- }
50
- namespace firebaseConfig {
18
+ export let allowRepeats: boolean;
19
+ export let autoSave: any;
20
+ export let maxWrites: any;
21
+ export let minWriteInterval: any;
22
+ export let maxSteps: any;
23
+ export let randomSeed: any;
24
+ export let deployURL: any;
25
+ export let labURL: any;
26
+ export let brandLogoFn: any;
27
+ export let advertisementImageFn: string;
28
+ export let advertisementImageInvertDark: boolean;
29
+ export let colorMode: any;
30
+ export let responsiveUI: boolean;
31
+ export let googleAnalyticsID: any;
32
+ export let windowsizerRequest: object;
33
+ export let windowsizerAggressive: boolean;
34
+ export let anonymousMode: boolean;
35
+ export let unpaidStudy: boolean;
36
+ export namespace firebaseConfig {
51
37
  let apiKey: any;
52
38
  let authDomain: any;
53
39
  let projectId: any;
@@ -164,3 +150,47 @@ export type Config = {
164
150
  appId: string;
165
151
  };
166
152
  };
153
+ declare const projectRef: any;
154
+ /**
155
+ * Global configuration object for the Smile application
156
+ * @typedef {object} Config
157
+ * @property {string} mode - Application mode ('development', 'production', 'testing')
158
+ * @property {string} projectName - Name of the project
159
+ * @property {string} projectRef - Project reference derived from deploy base path
160
+ * @property {string} codeName - Project code name
161
+ * @property {string} codeNameURL - Deploy URL for code name
162
+ * @property {string} localStorageKey - Key for storing data in localStorage
163
+ * @property {string} devLocalStorageKey - Key for storing dev data in localStorage
164
+ * @property {object} github - GitHub repository information
165
+ * @property {string} github.repoName - Repository name
166
+ * @property {string} github.owner - Repository owner
167
+ * @property {string} github.branch - Current branch name
168
+ * @property {string} github.lastCommitMsg - Last commit message
169
+ * @property {string} github.lastCommitHash - Last commit hash
170
+ * @property {string} github.commitURL - URL to last commit
171
+ * @property {boolean} allowRepeats - Whether to allow repeat participants
172
+ * @property {boolean} autoSave - Whether to auto-save data
173
+ * @property {number} maxWrites - Maximum number of writes allowed
174
+ * @property {number} minWriteInterval - Minimum interval between writes
175
+ * @property {number} maxSteps - Maximum rows in stepper tables
176
+ * @property {string} randomSeed - Seed for random number generation
177
+ * @property {string} deployURL - URL where app is deployed
178
+ * @property {string} labURL - URL of the lab website
179
+ * @property {string} brandLogoFn - Function name for brand logo
180
+ * @property {string} googleAnalyticsID - Google Analytics tracking ID
181
+ * @property {object} windowsizerRequest - Requested window dimensions
182
+ * @property {boolean} windowsizerAggressive - Whether to force window sizing
183
+ * @property {boolean} anonymousMode - Whether to enable anonymous mode
184
+ * @property {object} firebaseConfig - Firebase configuration object
185
+ * @property {string} firebaseConfig.apiKey - Firebase API key
186
+ * @property {string} firebaseConfig.authDomain - Firebase auth domain
187
+ * @property {string} firebaseConfig.projectId - Firebase project ID
188
+ * @property {string} firebaseConfig.storageBucket - Firebase storage bucket
189
+ * @property {string} firebaseConfig.messagingSenderId - Firebase messaging sender ID
190
+ * @property {string} firebaseConfig.appId - Firebase app ID
191
+ */
192
+ declare const codeName: any;
193
+ declare const repoName: any;
194
+ declare const owner: any;
195
+ declare const branch: any;
196
+ declare const hash: any;
@@ -58,24 +58,29 @@ function parseWidthHeight(value) {
58
58
  * @property {string} firebaseConfig.messagingSenderId - Firebase messaging sender ID
59
59
  * @property {string} firebaseConfig.appId - Firebase app ID
60
60
  */
61
+ const codeName = import.meta.env.VITE_CODE_NAME || 'unnamed-experiment'
62
+ const projectRef = (import.meta.env.VITE_DEPLOY_BASE_PATH || '/local/experiment/main/').slice(1, -1).replace(/\//g, '-')
63
+ const owner = import.meta.env.VITE_GIT_OWNER || 'local'
64
+ const repoName = import.meta.env.VITE_GIT_REPO_NAME || 'experiment'
65
+ const branch = import.meta.env.VITE_GIT_BRANCH_NAME || 'main'
66
+ const hash = import.meta.env.VITE_GIT_HASH || '0000000'
67
+
61
68
  export default {
62
69
  mode: import.meta.env.MODE,
63
- smileVersion: import.meta.env.VITE_SMILE_VERSION,
64
- projectName: import.meta.env.VITE_PROJECT_NAME, // autocompute this on intitialization
65
- projectRef: (import.meta.env.VITE_DEPLOY_BASE_PATH || '/').slice(1, -1).replace(/\//g, '-'),
66
- codeName: import.meta.env.VITE_CODE_NAME,
70
+ smileVersion: import.meta.env.VITE_SMILE_VERSION || '(unknown)',
71
+ projectName: import.meta.env.VITE_PROJECT_NAME || 'experiment',
72
+ projectRef,
73
+ codeName,
67
74
  codeNameURL: import.meta.env.VITE_CODE_NAME_DEPLOY_URL,
68
- localStorageKey: `smilestore-${import.meta.env.VITE_CODE_NAME}`,
69
- devLocalStorageKey: `smilestore-${import.meta.env.VITE_CODE_NAME}_dev`,
75
+ localStorageKey: `smilestore-${codeName}`,
76
+ devLocalStorageKey: `smilestore-${codeName}_dev`,
70
77
  github: {
71
- repoName: import.meta.env.VITE_GIT_REPO_NAME,
72
- owner: import.meta.env.VITE_GIT_OWNER,
73
- branch: import.meta.env.VITE_GIT_BRANCH_NAME,
74
- lastCommitMsg: import.meta.env.VITE_GIT_LAST_MSG,
75
- lastCommitHash: import.meta.env.VITE_GIT_HASH, // autocompute this all the time
76
- commitURL: `https://github.com/${import.meta.env.VITE_GIT_OWNER}/${import.meta.env.VITE_GIT_REPO_NAME}/commit/${
77
- import.meta.env.VITE_GIT_HASH
78
- }`,
78
+ repoName,
79
+ owner,
80
+ branch,
81
+ lastCommitMsg: import.meta.env.VITE_GIT_LAST_MSG || '(no commits yet)',
82
+ lastCommitHash: hash,
83
+ commitURL: `https://github.com/${owner}/${repoName}/commit/${hash}`,
79
84
  },
80
85
  // browser_exclude: import.meta.env.VITE_BROWSER_EXCLUDE,
81
86
  allowRepeats: import.meta.env.VITE_ALLOW_REPEATS === 'true',
@@ -87,6 +92,8 @@ export default {
87
92
  deployURL: import.meta.env.VITE_DEPLOY_URL, // auto compute this
88
93
  labURL: import.meta.env.VITE_LAB_URL,
89
94
  brandLogoFn: import.meta.env.VITE_BRAND_LOGO_FN,
95
+ advertisementImageFn: '/_smile/images/helpus.png',
96
+ advertisementImageInvertDark: false,
90
97
  colorMode: import.meta.env.VITE_COLOR_MODE, // 'light' or 'dark' or 'system'
91
98
  responsiveUI: import.meta.env.VITE_RESPONSIVE_UI === 'true',
92
99
  googleAnalyticsID: import.meta.env.VITE_GOOGLE_ANALYTICS,
@@ -94,19 +101,6 @@ export default {
94
101
  windowsizerAggressive: import.meta.env.VITE_WINDOWSIZER_AGGRESSIVE === 'true',
95
102
  anonymousMode: import.meta.env.VITE_ANONYMOUS_MODE === 'true',
96
103
  unpaidStudy: import.meta.env.VITE_UNPAID_STUDY === 'true',
97
- sona: {
98
- url: import.meta.env.VITE_SONA_URL,
99
- experimentId: import.meta.env.VITE_SONA_EXPERIMENT_ID,
100
- creditToken: import.meta.env.VITE_SONA_CREDIT_TOKEN,
101
- },
102
- sonaPaid: {
103
- url: import.meta.env.VITE_SONA_PAID_URL,
104
- experimentId: import.meta.env.VITE_SONA_PAID_EXPERIMENT_ID,
105
- creditToken: import.meta.env.VITE_SONA_PAID_CREDIT_TOKEN,
106
- },
107
- spark: {
108
- completionUrl: 'https://spark.hartleylab.org/completed',
109
- },
110
104
  firebaseConfig: {
111
105
  apiKey: import.meta.env.VITE_FIREBASE_APIKEY,
112
106
  authDomain: import.meta.env.VITE_FIREBASE_AUTHDOMAIN,
@@ -32,6 +32,7 @@ export class Stepper extends StepState {
32
32
  _shuffled: boolean;
33
33
  _onModify: Function | null;
34
34
  _needsWrite: boolean;
35
+ _componentRegistry: Map<any, any>;
35
36
  /**
36
37
  * Sets a callback to be called when the stepper is modified
37
38
  * @param {Function} callback - The callback function to call on modification
@@ -42,6 +43,14 @@ export class Stepper extends StepState {
42
43
  * @private
43
44
  */
44
45
  private _markForWrite;
46
+ /**
47
+ * Scans an item's data for Vue component references and registers them
48
+ * in the component registry. This ensures components can be resolved
49
+ * after deserialization even when the item itself is skipped as a duplicate.
50
+ * @private
51
+ * @param {object} item - The item data to scan
52
+ */
53
+ private _registerComponentsFromData;
45
54
  /**
46
55
  * Creates a new state instance. Overridden to return Stepper instances.
47
56
  * @protected
@@ -51,18 +60,12 @@ export class Stepper extends StepState {
51
60
  */
52
61
  protected _createNew(id: any, parent: StepState): Stepper;
53
62
  /**
54
- * Checks if any of the given items would create duplicate paths in the tree
63
+ * Creates a reusable duplicate checker that builds the existing path/data
64
+ * sets once and updates them incrementally as items are accepted.
55
65
  * @private
56
- * @param {object | Array<object>} items - Single object or array of objects to check for duplicates
57
- * @param {string} [items[].id] - Optional path property on each item
58
- * @returns {boolean} True if any items would create duplicate paths, false otherwise
59
- * @description
60
- * This method checks for duplicates in two ways:
61
- * 1. Checks for duplicate paths among the input items themselves
62
- * 2. Checks if any new items would create paths that already exist in the tree
63
- * 3. Checks if any new items have the same data content as existing items
66
+ * @returns {{ isDuplicate: (item: object) => boolean }} Object with an isDuplicate method
64
67
  */
65
- private _hasDuplicatePaths;
68
+ private _buildDuplicateChecker;
66
69
  /**
67
70
  * Creates a new state and assigns data to it
68
71
  * @private
@@ -3,9 +3,7 @@ import config from '../config.js'
3
3
  import { StepperSerializer } from './StepperSerializer.js'
4
4
  import StepperProxy from './StepperProxy.js'
5
5
  import useLog from '../../stores/log.js'
6
- import * as _seedrandom from 'seedrandom'
7
-
8
- const seedrandom = _seedrandom.default || _seedrandom
6
+ import seedrandom from 'seedrandom'
9
7
 
10
8
  // to be implemented functions
11
9
 
@@ -52,6 +50,7 @@ export class Stepper extends StepState {
52
50
  this._shuffled = false // Add shuffled property
53
51
  this._onModify = null // Add callback property
54
52
  this._needsWrite = false // Track if we need to write
53
+ this._componentRegistry = new Map() // Registry for Vue components encountered in step data
55
54
 
56
55
  // If serialized state is provided, load it
57
56
  if (serializedState !== null) {
@@ -81,6 +80,22 @@ export class Stepper extends StepState {
81
80
  }
82
81
  }
83
82
 
83
+ /**
84
+ * Scans an item's data for Vue component references and registers them
85
+ * in the component registry. This ensures components can be resolved
86
+ * after deserialization even when the item itself is skipped as a duplicate.
87
+ * @private
88
+ * @param {object} item - The item data to scan
89
+ */
90
+ _registerComponentsFromData(item) {
91
+ if (!this._componentRegistry || !item || typeof item !== 'object') return
92
+ for (const value of Object.values(item)) {
93
+ if (value && typeof value === 'object' && value.name && (value.template || value.render)) {
94
+ this._componentRegistry.set(value.name, value)
95
+ }
96
+ }
97
+ }
98
+
84
99
  /**
85
100
  * Creates a new state instance. Overridden to return Stepper instances.
86
101
  * @protected
@@ -93,61 +108,44 @@ export class Stepper extends StepState {
93
108
  }
94
109
 
95
110
  /**
96
- * Checks if any of the given items would create duplicate paths in the tree
111
+ * Creates a reusable duplicate checker that builds the existing path/data
112
+ * sets once and updates them incrementally as items are accepted.
97
113
  * @private
98
- * @param {object | Array<object>} items - Single object or array of objects to check for duplicates
99
- * @param {string} [items[].id] - Optional path property on each item
100
- * @returns {boolean} True if any items would create duplicate paths, false otherwise
101
- * @description
102
- * This method checks for duplicates in two ways:
103
- * 1. Checks for duplicate paths among the input items themselves
104
- * 2. Checks if any new items would create paths that already exist in the tree
105
- * 3. Checks if any new items have the same data content as existing items
114
+ * @returns {{ isDuplicate: (item: object) => boolean }} Object with an isDuplicate method
106
115
  */
107
- _hasDuplicatePaths(items) {
108
- // Convert single item to array if needed
109
- const itemsToCheck = Array.isArray(items) ? items : [items]
116
+ _buildDuplicateChecker() {
117
+ // Build existing id set from current children (O(n) once)
118
+ const existingIds = new Set(this._states.map(state => state.id))
119
+ // Build existing data set from current children (O(n) once)
120
+ const existingData = new Set(this._states.map(state => JSON.stringify(state.data)))
110
121
 
111
- // First check for duplicates among the input items
112
- const seenPaths = new Set()
113
- const seenData = new Set()
114
- for (const item of itemsToCheck) {
115
- // Check for explicit path duplicates
116
- if (item.id !== undefined) {
117
- if (seenPaths.has(item.id)) {
122
+ return {
123
+ /**
124
+ * Checks if a single item is a duplicate, and if not, records it so
125
+ * subsequent calls will detect it as existing.
126
+ * @param {object} item - The item to check
127
+ * @returns {boolean} True if the item is a duplicate
128
+ */
129
+ isDuplicate: (item) => {
130
+ // Check explicit id duplicates
131
+ if (item.id !== undefined && existingIds.has(item.id)) {
118
132
  return true
119
133
  }
120
- seenPaths.add(item.id)
121
- }
122
134
 
123
- // Check for data content duplicates
124
- const dataStr = JSON.stringify(item)
125
- if (seenData.has(dataStr)) {
126
- return true
127
- }
128
- seenData.add(dataStr)
129
- }
130
-
131
- // Get all existing paths in the tree
132
- const existingPaths = this.existingPaths
133
- const existingData = new Set(this._states.map(state => JSON.stringify(state.data)))
134
-
135
- // Check if any new items would create duplicate paths with existing ones
136
- return itemsToCheck.some((item) => {
137
- // Create a temporary state to get its path
138
- let state
139
- if (item.id !== undefined) {
140
- state = new Stepper({ id: item.id, parent: this })
141
- }
142
- else {
143
- state = new Stepper({ parent: this })
144
- }
145
- state.data = item
146
- const newPath = state.pathString
135
+ // Check data content duplicates
136
+ const dataStr = JSON.stringify(item)
137
+ if (existingData.has(dataStr)) {
138
+ return true
139
+ }
147
140
 
148
- // Check both path and data content
149
- return existingPaths.has(newPath) || existingData.has(JSON.stringify(item))
150
- })
141
+ // Not a duplicate record it for future checks
142
+ if (item.id !== undefined) {
143
+ existingIds.add(item.id)
144
+ }
145
+ existingData.add(dataStr)
146
+ return false
147
+ },
148
+ }
151
149
  }
152
150
 
153
151
  /**
@@ -192,10 +190,18 @@ export class Stepper extends StepState {
192
190
  throw new Error(`Cannot append ${itemsToAdd.length} rows as it exceeds the safety limit of ${config.maxSteps}`)
193
191
  }
194
192
 
193
+ // Build duplicate checker once for the entire batch
194
+ const { isDuplicate } = this._buildDuplicateChecker()
195
+
195
196
  // Try to add each item individually
196
197
  itemsToAdd.forEach((item) => {
198
+ // Register any Vue component references from the item data so they
199
+ // can be resolved after deserialization (even if the item is skipped
200
+ // as a duplicate — the component objects are still needed for rendering)
201
+ this._registerComponentsFromData(item)
202
+
197
203
  // Check if this specific item would create a duplicate path
198
- if (this._hasDuplicatePaths(item)) {
204
+ if (isDuplicate(item)) {
199
205
  this._log.warn(`Warning: Skipping item that would create duplicate path`)
200
206
  }
201
207
  else {
@@ -260,6 +266,9 @@ export class Stepper extends StepState {
260
266
 
261
267
  const outerRows = generateCombinations(processedColumns)
262
268
 
269
+ // Build duplicate checker once for the entire batch
270
+ const { isDuplicate } = this._buildDuplicateChecker()
271
+
263
272
  // Try to add each combination individually
264
273
  outerRows.forEach((row) => {
265
274
  // If an idGenerator function is provided, use it to generate the ID
@@ -268,7 +277,7 @@ export class Stepper extends StepState {
268
277
  }
269
278
 
270
279
  // Check if this specific combination would create a duplicate path
271
- if (this._hasDuplicatePaths(row)) {
280
+ if (isDuplicate(row)) {
272
281
  this._log.warn(`Warning: Skipping combination that would create duplicate path`)
273
282
  }
274
283
  else {
@@ -385,6 +394,9 @@ export class Stepper extends StepState {
385
394
  return row
386
395
  })
387
396
 
397
+ // Build duplicate checker once for the entire batch
398
+ const { isDuplicate } = this._buildDuplicateChecker()
399
+
388
400
  // Try to add each combination individually
389
401
  zippedRows.forEach((row) => {
390
402
  // If an idGenerator function is provided, use it to generate the ID
@@ -393,7 +405,7 @@ export class Stepper extends StepState {
393
405
  }
394
406
 
395
407
  // Check if this specific combination would create a duplicate path
396
- if (this._hasDuplicatePaths(row)) {
408
+ if (isDuplicate(row)) {
397
409
  this._log.warn(`Warning: Skipping combination that would create duplicate path`)
398
410
  }
399
411
  else {
@@ -467,6 +479,9 @@ export class Stepper extends StepState {
467
479
  * @returns {Stepper} The current instance for chaining
468
480
  */
469
481
  forEach(callback) {
482
+ // Build duplicate checker once for the entire forEach pass
483
+ const { isDuplicate } = this._buildDuplicateChecker()
484
+
470
485
  this._states.forEach((item, index) => {
471
486
  // Call the callback and check if it returns a new value
472
487
  const result = callback(item, index)
@@ -493,7 +508,7 @@ export class Stepper extends StepState {
493
508
  })
494
509
 
495
510
  // Check for duplicate paths before updating
496
- if (this._hasDuplicatePaths(newData)) {
511
+ if (isDuplicate(newData)) {
497
512
  throw new Error('Cannot update item: would create duplicate paths')
498
513
  }
499
514
 
@@ -38,11 +38,21 @@ export class StepperSerializer {
38
38
  // Extract the faker function name and parameters
39
39
  const match = funcStr.match(/api\.faker\.(\w+)\((.*)\)/)
40
40
  if (match) {
41
- const [, fakerName, params] = match
41
+ const [, fakerName, paramsStr] = match
42
+ let params
43
+ try {
44
+ // Parse params preserving types (numbers, arrays, strings)
45
+ const jsonStr = '[' + paramsStr.replace(/'/g, '"') + ']'
46
+ params = JSON.parse(jsonStr)
47
+ }
48
+ catch {
49
+ // Fallback to string splitting for unparseable params
50
+ params = paramsStr.split(',').map(p => p.trim())
51
+ }
42
52
  cleaned[key] = {
43
53
  __fakerFunction: true,
44
54
  name: fakerName,
45
- params: params.split(',').map(p => p.trim()),
55
+ params,
46
56
  }
47
57
  }
48
58
  }
@@ -50,8 +60,21 @@ export class StepperSerializer {
50
60
  continue
51
61
  }
52
62
 
53
- // Check if it's a Vue component
63
+ // Preserve existing __vueComponent markers (from previous serialization round-trips)
64
+ if (value && typeof value === 'object' && value.__vueComponent && value.componentName) {
65
+ cleaned[key] = {
66
+ __vueComponent: true,
67
+ componentName: value.componentName,
68
+ }
69
+ continue
70
+ }
71
+
72
+ // Check if it's a Vue component (has name + template or render function)
54
73
  if (value && typeof value === 'object' && value.name && (value.template || value.render)) {
74
+ // Register the component so it can be resolved during deserialization
75
+ if (Stepper._componentRegistry) {
76
+ Stepper._componentRegistry.set(value.name, value)
77
+ }
55
78
  cleaned[key] = {
56
79
  __vueComponent: true,
57
80
  componentName: value.name,
@@ -61,6 +84,9 @@ export class StepperSerializer {
61
84
 
62
85
  // Handle data objects that might contain component references
63
86
  if (key === 'type' && value?.name && (value.template || value.render)) {
87
+ if (Stepper._componentRegistry) {
88
+ Stepper._componentRegistry.set(value.name, value)
89
+ }
64
90
  cleaned[key] = {
65
91
  __vueComponent: true,
66
92
  componentName: value.name,
@@ -194,24 +220,16 @@ export class StepperSerializer {
194
220
  console.warn(`Faker function ${value.name} not found during reconstruction`)
195
221
  return null
196
222
  }
197
- // Convert string parameters to appropriate types
198
- const convertedParams = value.params.map((param) => {
199
- // Convert empty string to undefined
200
- if (param === '') return undefined
201
- // Try to convert to number if it looks like a number
202
- const num = Number(param)
203
- return Number.isNaN(num) ? param : num
204
- })
205
- return fakerFunc(...convertedParams)
223
+ return fakerFunc(...value.params).val
206
224
  }
207
225
  continue
208
226
  }
209
227
 
210
- // Handle Vue components
228
+ // Handle Vue components — preserve the serialized format
211
229
  if (value.__vueComponent) {
212
230
  reconstructed[key] = {
213
- name: value.componentName,
214
231
  __vueComponent: true,
232
+ componentName: value.componentName,
215
233
  }
216
234
  continue
217
235
  }
@@ -3,9 +3,8 @@
3
3
  * @module timeline
4
4
  */
5
5
 
6
- import * as _lodash from 'lodash'
6
+ import _ from 'lodash'
7
7
 
8
- const _ = _lodash.default || _lodash
9
8
  // NOTE: RecruitmentChooser and PresentationMode views are handled via
10
9
  // route-based modes (/dev/, /presentation/) in Nuxt, not registered here.
11
10
  // See runtime/pages/dev/ and runtime/pages/presentation/
@@ -1 +1 @@
1
- @import url("https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap");@import "tailwindcss";@import "tw-animate-css";@import "./smile.css";@source "../components/**/*.vue";@source "../components/**/*.js";@source "../layouts/**/*.vue";@source "../lib/**/*.js";@source "../pages/**/*.vue";@custom-variant dark (&:is(.dark *));@theme inline{--color-background:var(--background);--color-foreground:var(--foreground);--color-card:var(--card);--color-card-foreground:var(--card-foreground);--color-popover:var(--popover);--color-popover-foreground:var(--popover-foreground);--color-primary:var(--primary);--color-primary-foreground:var(--primary-foreground);--color-secondary:var(--secondary);--color-secondary-foreground:var(--secondary-foreground);--color-muted:var(--muted);--color-muted-foreground:var(--muted-foreground);--color-accent:var(--accent);--color-accent-foreground:var(--accent-foreground);--color-destructive:var(--destructive);--color-destructive-foreground:var(--destructive-foreground);--color-border:var(--border);--color-input:var(--input);--color-ring:var(--ring);--color-chart-1:var(--chart-1);--color-chart-2:var(--chart-2);--color-chart-3:var(--chart-3);--color-chart-4:var(--chart-4);--color-chart-5:var(--chart-5);--radius-sm:calc(var(--radius) - 4px);--radius-md:calc(var(--radius) - 2px);--radius-lg:var(--radius);--radius-xl:calc(var(--radius) + 4px);--color-sidebar:var(--sidebar);--color-sidebar-foreground:var(--sidebar-foreground);--color-sidebar-primary:var(--sidebar-primary);--color-sidebar-primary-foreground:var(--sidebar-primary-foreground);--color-sidebar-accent:var(--sidebar-accent);--color-sidebar-accent-foreground:var(--sidebar-accent-foreground);--color-sidebar-border:var(--sidebar-border);--color-sidebar-ring:var(--sidebar-ring);--color-primary-button:var(--primary-button);--color-primary-button-foreground:var(--primary-button-foreground);--color-primary-button-light:var(--primary-button-light);--color-primary-button-light-foreground:var(--primary-button-light-foreground);--color-link-button:var(--link-button);--color-link-button-foreground:var(--link-button-foreground);--color-link-button-light:var(--link-button-light);--color-link-button-light-foreground:var(--link-button-light-foreground);--color-info-button:var(--info-button);--color-info-button-foreground:var(--info-button-foreground);--color-info-button-light:var(--info-button-light);--color-info-button-light-foreground:var(--info-button-light-foreground);--color-success-button:var(--success-button);--color-success-button-foreground:var(--success-button-foreground);--color-success-button-light:var(--success-button-light);--color-success-button-light-foreground:var(--success-button-light-foreground);--color-warning-button:var(--warning-button);--color-warning-button-foreground:var(--warning-button-foreground);--color-warning-button-light:var(--warning-button-light);--color-warning-button-light-foreground:var(--warning-button-light-foreground);--color-danger-button:var(--danger-button);--color-danger-button-foreground:var(--danger-button-foreground);--color-danger-button-light:var(--danger-button-light);--color-danger-button-light-foreground:var(--danger-button-light-foreground);--color-window-sizer-bg:var(--window-sizer-bg);--color-window-sizer-text:var(--window-sizer-text);--color-window-sizer-border:var(--window-sizer-border);--color-window-sizer-input:var(--window-sizer-input);--color-window-sizer-ring:var(--window-sizer-ring);--color-withdraw-bg:var(--withdraw-bg);--color-withdraw-text:var(--withdraw-text);--color-withdraw-border:var(--withdraw-border);--color-withdraw-ring:var(--withdraw-ring);--color-warning-bg:var(--warning-bg);--color-warning-text:var(--warning-text);--color-warning-border:var(--warning-border);--color-warning-ring:var(--warning-ring);--dev-bar-bg:var(--dev-bg);--dev-bar-text:var(--dev-text);--dev-bar-lines:var(--dev-lines);--page-bg-color:var(--background);--page-text-color:var(--foreground)}:root{--font-family-base:"Inter",ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-mono:ui-monospace,"Menlo","Monaco","Consolas","Liberation Mono","Courier New",monospace;font-optical-sizing:auto}.light,:root{--background:oklch(1 0 0);--foreground:oklch(0.141 0.005 285.823);--card:oklch(1 0 0);--card-foreground:oklch(0.141 0.005 285.823);--popover:oklch(1 0 0);--popover-foreground:oklch(0.141 0.005 285.823);--primary:oklch(0.21 0.006 285.885);--primary-foreground:oklch(0.985 0 0);--secondary:oklch(0.967 0.001 286.375);--secondary-foreground:oklch(0.21 0.006 285.885);--muted:oklch(0.967 0.001 286.375);--muted-foreground:oklch(0.552 0.016 285.938);--accent:oklch(0.967 0.001 286.375);--accent-foreground:oklch(0.21 0.006 285.885);--destructive:oklch(0.577 0.245 27.325);--destructive-foreground:oklch(0.577 0.245 27.325);--border:oklch(0.92 0.004 286.32);--input:oklch(0.92 0.004 286.32);--ring:oklch(0.705 0.015 286.067);--chart-1:oklch(0.646 0.222 41.116);--chart-2:oklch(0.6 0.118 184.704);--chart-3:oklch(0.398 0.07 227.392);--chart-4:oklch(0.828 0.189 84.429);--chart-5:oklch(0.769 0.188 70.08);--radius:0.625rem;--sidebar:oklch(0.985 0 0);--sidebar-2:oklch(0.947 0 0);--sidebar-foreground:oklch(0.141 0.005 285.823);--sidebar-primary:oklch(0.21 0.006 285.885);--sidebar-primary-foreground:oklch(0.985 0 0);--sidebar-accent:oklch(0.967 0.001 286.375);--sidebar-accent-foreground:oklch(0.21 0.006 285.885);--sidebar-border:oklch(0.92 0.004 286.32);--sidebar-ring:oklch(0.705 0.015 286.067);--primary-button:oklch(0.396 0.141 264.376);--primary-button-foreground:oklch(0.985 0 0);--primary-button-light:oklch(0.85 0.05 264.376);--primary-button-light-foreground:oklch(0.396 0.141 264.376);--link-button:oklch(0.396 0.141 264.376);--link-button-foreground:oklch(0.396 0.141 264.376);--link-button-light:oklch(0.85 0.05 264.376);--link-button-light-foreground:oklch(0.396 0.141 264.376);--info-button:oklch(0.5 0.2 220);--info-button-foreground:oklch(0.985 0 0);--info-button-light:oklch(0.85 0.08 220);--info-button-light-foreground:oklch(0.5 0.2 220);--success-button:oklch(0.7 0.18 142);--success-button-foreground:oklch(0.985 0 0);--success-button-light:oklch(0.85 0.07 142);--success-button-light-foreground:oklch(0.5 0.18 142);--warning-button:oklch(0.7 0.2 70);--warning-button-foreground:oklch(0.141 0.005 285.823);--warning-button-light:oklch(0.9 0.08 70);--warning-button-light-foreground:oklch(0.7 0.2 70);--danger-button:oklch(0.577 0.245 27.325);--danger-button-foreground:oklch(0.985 0 0);--danger-button-light:oklch(0.85 0.1 27.325);--danger-button-light-foreground:oklch(0.577 0.245 27.325);--window-sizer-bg:#c2e9f4;--window-sizer-text:#025a72;--window-sizer-border:#0f96bb;--window-sizer-ring:#0f96bb;--withdraw-bg:#f8d7da;--withdraw-text:#721c24;--withdraw-border:#f5c6cb;--withdraw-ring:#f1aeb5;--warning-bg:#fff3cd;--warning-text:#856404;--warning-border:#ffeeba;--warning-ring:#ffe8a1;--dev-bg:var(--sidebar);--dev-bg-contrast:var(--sidebar-2);--dev-text:#141414;--dev-lines:0.01em solid #b5b5b5;--dev-contrast-text:#4d4d4d;--pinned-route:#ffd050;--hover-table-row:var(--muted);--log-yellow:oklch(0.985 0 0);--log-red:oklch(0.985 0 0);--log-green:oklch(0.985 0 0);--scrollbar-track:#f1f1f1;--scrollbar-thumb:#c1c1c1;--scrollbar-thumb-hover:#a8a8a8}.dark{--background:oklch(0.141 0.005 285.823);--foreground:oklch(0.985 0 0);--card:oklch(0.261 0.005 285.823);--card-foreground:oklch(0.985 0 0);--popover:oklch(0.141 0.005 285.823);--popover-foreground:oklch(0.985 0 0);--primary:oklch(0.985 0 0);--primary-foreground:oklch(0.21 0.006 285.885);--secondary:oklch(0.274 0.006 286.033);--secondary-foreground:oklch(0.985 0 0);--muted:oklch(0.274 0.006 286.033);--muted-foreground:oklch(0.705 0.015 286.067);--accent:oklch(0.274 0.006 286.033);--accent-foreground:oklch(0.985 0 0);--destructive:oklch(0.396 0.141 25.723);--destructive-foreground:oklch(0.637 0.237 25.331);--border:oklch(0.274 0.006 286.033);--input:oklch(0.374 0.006 286.033);--ring:oklch(0.442 0.017 285.786);--chart-1:oklch(0.488 0.243 264.376);--chart-2:oklch(0.696 0.17 162.48);--chart-3:oklch(0.769 0.188 70.08);--chart-4:oklch(0.627 0.265 303.9);--chart-5:oklch(0.645 0.246 16.439);--sidebar:oklch(0.21 0.006 285.885);--sidebar-2:oklch(0.31 0.006 285.885);--sidebar-foreground:oklch(0.985 0 0);--sidebar-primary:oklch(0.574 0.006 286.033);--sidebar-primary-foreground:oklch(0.985 0 0);--sidebar-accent:oklch(0.274 0.006 286.033);--sidebar-accent-foreground:oklch(0.985 0 0);--sidebar-border:oklch(0.574 0.006 286.033);--sidebar-ring:oklch(0.442 0.017 285.786);--primary-button:oklch(0.488 0.243 264.376);--primary-button-foreground:oklch(0.985 0 0);--primary-button-light:oklch(0.3 0.1 264.376);--primary-button-light-foreground:oklch(0.8 0.15 264.376);--link-button:oklch(0.488 0.243 264.376);--link-button-foreground:oklch(0.488 0.243 264.376);--link-button-light:oklch(0.3 0.1 264.376);--link-button-light-foreground:oklch(0.8 0.15 264.376);--info-button:oklch(0.6 0.25 220);--info-button-foreground:oklch(0.985 0 0);--info-button-light:oklch(0.3 0.12 220);--info-button-light-foreground:oklch(0.75 0.2 220);--success-button:oklch(0.7 0.22 142);--success-button-foreground:oklch(0.985 0 0);--success-button-light:oklch(0.3 0.1 142);--success-button-light-foreground:oklch(0.75 0.18 142);--warning-button:oklch(0.8 0.25 70);--warning-button-foreground:oklch(0.141 0.005 285.823);--warning-button-light:oklch(0.35 0.12 70);--warning-button-light-foreground:oklch(0.85 0.2 70);--danger-button:oklch(0.6 0.25 27.325);--danger-button-foreground:oklch(0.985 0 0);--danger-button-light:oklch(0.3 0.12 27.325);--danger-button-light-foreground:oklch(0.8 0.2 27.325);--window-sizer-bg:#5c818c;--window-sizer-text:#174957;--window-sizer-border:#3c575f;--window-sizer-ring:#0f96bb;--withdraw-bg:#f8d7da;--withdraw-text:#721c24;--withdraw-border:#f5c6cb;--withdraw-ring:#f1aeb5;--warning-bg:#fff3cd;--warning-text:#856404;--warning-border:#ffeeba;--warning-ring:#ffe8a1;--dev-bg:var(--sidebar);--dev-bg-contrast:var(--sidebar-2);--dev-text:#cecece;--dev-lines:0.01em solid #b5b5b5;--dev-contrast-text:#4d4d4d;--pinned-route:#ffd050;--hover-table-row:var(--muted);--log-yellow:#adaa5b;--log-red:#976464;--log-green:#6c9659;--scrollbar-track:#2a2a2a;--scrollbar-thumb:#555;--scrollbar-thumb-hover:#777}.dark-aware-img{filter:invert(0)}.dark .dark-aware-img{filter:invert(1)}.dark .light .dark-aware-img{filter:invert(0)!important}.light .dark .dark-aware-img{filter:invert(1)!important}@layer base{*{@apply border-border outline-ring/50}body{@apply bg-background text-foreground;font-family:var(--font-family-base);font-synthesis:auto;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}}::-webkit-scrollbar{height:8px;width:8px}::-webkit-scrollbar-track{background:var(--scrollbar-track);border-radius:4px}::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-hover)}::-webkit-scrollbar-corner{background:var(--scrollbar-track)}*{scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track);scrollbar-width:thin}
1
+ @import url("https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap");@import "tailwindcss";@import "tw-animate-css";@import "./smile.css";@source "../components/**/*.vue";@source "../components/**/*.js";@source "../layouts/**/*.vue";@source "../lib/**/*.js";@source "../pages/**/*.vue";@custom-variant dark (&:is(.dark *));@theme inline{--color-background:var(--background);--color-foreground:var(--foreground);--color-card:var(--card);--color-card-foreground:var(--card-foreground);--color-popover:var(--popover);--color-popover-foreground:var(--popover-foreground);--color-primary:var(--primary);--color-primary-foreground:var(--primary-foreground);--color-secondary:var(--secondary);--color-secondary-foreground:var(--secondary-foreground);--color-muted:var(--muted);--color-muted-foreground:var(--muted-foreground);--color-accent:var(--accent);--color-accent-foreground:var(--accent-foreground);--color-destructive:var(--destructive);--color-destructive-foreground:var(--destructive-foreground);--color-border:var(--border);--color-input:var(--input);--color-ring:var(--ring);--color-chart-1:var(--chart-1);--color-chart-2:var(--chart-2);--color-chart-3:var(--chart-3);--color-chart-4:var(--chart-4);--color-chart-5:var(--chart-5);--radius-sm:calc(var(--radius) - 4px);--radius-md:calc(var(--radius) - 2px);--radius-lg:var(--radius);--radius-xl:calc(var(--radius) + 4px);--color-sidebar:var(--sidebar);--color-sidebar-foreground:var(--sidebar-foreground);--color-sidebar-primary:var(--sidebar-primary);--color-sidebar-primary-foreground:var(--sidebar-primary-foreground);--color-sidebar-accent:var(--sidebar-accent);--color-sidebar-accent-foreground:var(--sidebar-accent-foreground);--color-sidebar-border:var(--sidebar-border);--color-sidebar-ring:var(--sidebar-ring);--color-primary-button:var(--primary-button);--color-primary-button-foreground:var(--primary-button-foreground);--color-primary-button-light:var(--primary-button-light);--color-primary-button-light-foreground:var(--primary-button-light-foreground);--color-link-button:var(--link-button);--color-link-button-foreground:var(--link-button-foreground);--color-link-button-light:var(--link-button-light);--color-link-button-light-foreground:var(--link-button-light-foreground);--color-info-button:var(--info-button);--color-info-button-foreground:var(--info-button-foreground);--color-info-button-light:var(--info-button-light);--color-info-button-light-foreground:var(--info-button-light-foreground);--color-success-button:var(--success-button);--color-success-button-foreground:var(--success-button-foreground);--color-success-button-light:var(--success-button-light);--color-success-button-light-foreground:var(--success-button-light-foreground);--color-warning-button:var(--warning-button);--color-warning-button-foreground:var(--warning-button-foreground);--color-warning-button-light:var(--warning-button-light);--color-warning-button-light-foreground:var(--warning-button-light-foreground);--color-danger-button:var(--danger-button);--color-danger-button-foreground:var(--danger-button-foreground);--color-danger-button-light:var(--danger-button-light);--color-danger-button-light-foreground:var(--danger-button-light-foreground);--color-window-sizer-bg:var(--window-sizer-bg);--color-window-sizer-text:var(--window-sizer-text);--color-window-sizer-border:var(--window-sizer-border);--color-window-sizer-input:var(--window-sizer-input);--color-window-sizer-ring:var(--window-sizer-ring);--color-withdraw-bg:var(--withdraw-bg);--color-withdraw-text:var(--withdraw-text);--color-withdraw-border:var(--withdraw-border);--color-withdraw-ring:var(--withdraw-ring);--color-warning-bg:var(--warning-bg);--color-warning-text:var(--warning-text);--color-warning-border:var(--warning-border);--color-warning-ring:var(--warning-ring);--dev-bar-bg:var(--dev-bg);--dev-bar-text:var(--dev-text);--dev-bar-lines:var(--dev-lines);--color-dev-lines:var(--dev-lines);--color-dev-text:var(--dev-text);--color-dev-bg:var(--dev-bg);--color-dev-bg-contrast:var(--dev-bg-contrast);--color-status-green-bg:var(--status-green-bg);--color-status-green-text:var(--status-green-text);--color-status-green-fill:var(--status-green-fill);--color-status-yellow-bg:var(--status-yellow-bg);--color-status-yellow-text:var(--status-yellow-text);--color-status-yellow-fill:var(--status-yellow-fill);--color-status-red-text:var(--status-red-text);--page-bg-color:var(--background);--page-text-color:var(--foreground)}:root{--font-family-base:"Inter",ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-mono:ui-monospace,"Menlo","Monaco","Consolas","Liberation Mono","Courier New",monospace;font-optical-sizing:auto}.light,:root{--background:oklch(1 0 0);--foreground:oklch(0.141 0.005 285.823);--card:oklch(1 0 0);--card-foreground:oklch(0.141 0.005 285.823);--popover:oklch(1 0 0);--popover-foreground:oklch(0.141 0.005 285.823);--primary:oklch(0.21 0.006 285.885);--primary-foreground:oklch(0.985 0 0);--secondary:oklch(0.967 0.001 286.375);--secondary-foreground:oklch(0.21 0.006 285.885);--muted:oklch(0.967 0.001 286.375);--muted-foreground:oklch(0.552 0.016 285.938);--accent:oklch(0.967 0.001 286.375);--accent-foreground:oklch(0.21 0.006 285.885);--destructive:oklch(0.577 0.245 27.325);--destructive-foreground:oklch(0.577 0.245 27.325);--border:oklch(0.92 0.004 286.32);--input:oklch(0.92 0.004 286.32);--ring:oklch(0.705 0.015 286.067);--chart-1:oklch(0.646 0.222 41.116);--chart-2:oklch(0.6 0.118 184.704);--chart-3:oklch(0.398 0.07 227.392);--chart-4:oklch(0.828 0.189 84.429);--chart-5:oklch(0.769 0.188 70.08);--radius:0.625rem;--sidebar:oklch(0.985 0 0);--sidebar-2:oklch(0.947 0 0);--sidebar-foreground:oklch(0.141 0.005 285.823);--sidebar-primary:oklch(0.21 0.006 285.885);--sidebar-primary-foreground:oklch(0.985 0 0);--sidebar-accent:oklch(0.967 0.001 286.375);--sidebar-accent-foreground:oklch(0.21 0.006 285.885);--sidebar-border:oklch(0.92 0.004 286.32);--sidebar-ring:oklch(0.705 0.015 286.067);--primary-button:oklch(0.396 0.141 264.376);--primary-button-foreground:oklch(0.985 0 0);--primary-button-light:oklch(0.85 0.05 264.376);--primary-button-light-foreground:oklch(0.396 0.141 264.376);--link-button:oklch(0.58 0.12 195);--link-button-foreground:oklch(0.58 0.12 195);--link-button-light:oklch(0.85 0.05 264.376);--link-button-light-foreground:oklch(0.396 0.141 264.376);--info-button:oklch(0.5 0.2 220);--info-button-foreground:oklch(0.985 0 0);--info-button-light:oklch(0.85 0.08 220);--info-button-light-foreground:oklch(0.5 0.2 220);--success-button:oklch(0.7 0.18 142);--success-button-foreground:oklch(0.985 0 0);--success-button-light:oklch(0.85 0.07 142);--success-button-light-foreground:oklch(0.5 0.18 142);--warning-button:oklch(0.7 0.2 70);--warning-button-foreground:oklch(0.141 0.005 285.823);--warning-button-light:oklch(0.9 0.08 70);--warning-button-light-foreground:oklch(0.7 0.2 70);--danger-button:oklch(0.577 0.245 27.325);--danger-button-foreground:oklch(0.985 0 0);--danger-button-light:oklch(0.85 0.1 27.325);--danger-button-light-foreground:oklch(0.577 0.245 27.325);--window-sizer-bg:#c2e9f4;--window-sizer-text:#025a72;--window-sizer-border:#0f96bb;--window-sizer-ring:#0f96bb;--withdraw-bg:#f8d7da;--withdraw-text:#721c24;--withdraw-border:#f5c6cb;--withdraw-ring:#f1aeb5;--warning-bg:#fff3cd;--warning-text:#856404;--warning-border:#ffeeba;--warning-ring:#ffe8a1;--dev-bg:var(--sidebar);--dev-bg-contrast:var(--sidebar-2);--dev-text:#141414;--dev-lines:var(--border);--dev-contrast-text:#4d4d4d;--pinned-route:#ffd050;--hover-table-row:var(--muted);--spinner-track:oklch(0.95 0 0);--spinner-active:var(--primary-button);--dev-banner-stripe-1:oklch(0.87 0.17 85);--dev-banner-stripe-2:oklch(0.84 0.16 85);--dev-banner-text:oklch(0.15 0 0);--dev-brand-bg:oklch(0.85 0.06 210);--dev-brand-text:var(--foreground);--status-green-bg:oklch(0.93 0.06 175);--status-green-text:oklch(0.55 0.12 175);--status-green-fill:oklch(0.65 0.12 175);--status-yellow-bg:oklch(0.93 0.08 85);--status-yellow-text:oklch(0.65 0.18 70);--status-yellow-fill:oklch(0.72 0.2 70);--status-red-text:var(--destructive);--resize-handle:oklch(0.6 0 0);--resize-handle-hover:oklch(0.65 0.1 230);--data-key-color:oklch(0.6 0.15 200);--data-value-color:oklch(0.65 0.15 80);--step-path-color:oklch(0.45 0.1 175);--step-selected-bg:oklch(0.94 0.06 170);--step-selected-bg-hover:oklch(0.9 0.05 170);--step-index-color:oklch(0.65 0.15 70);--step-label-color:oklch(0.55 0.12 175);--step-leaf-color:oklch(0.75 0.18 142);--step-home-color:oklch(0.6 0.15 200);--error-notif-bg:oklch(0.97 0.02 25);--error-notif-bg-end:oklch(0.94 0.04 25);--error-notif-border:oklch(0.88 0.08 25);--error-notif-text:oklch(0.577 0.245 27.325);--log-yellow:oklch(0.97 0.04 85);--log-red:oklch(0.96 0.03 25);--log-green:oklch(0.96 0.03 175);--recruit-blue:oklch(0.78 0.1 220);--recruit-red:oklch(0.68 0.18 15);--recruit-yellow:oklch(0.8 0.16 80);--recruit-yellow-light:oklch(0.88 0.1 85);--recruit-pink:oklch(0.82 0.08 350);--recruit-green:oklch(0.8 0.14 160);--recruit-orange:oklch(0.8 0.12 60);--recruit-teal:oklch(0.8 0.1 185);--recruit-coral:oklch(0.75 0.12 25);--recruit-purple:oklch(0.82 0.12 310);--recruit-text:oklch(0.25 0 0);--scrollbar-track:#f1f1f1;--scrollbar-thumb:#c1c1c1;--scrollbar-thumb-hover:#a8a8a8}.dark{--background:oklch(0.141 0.005 285.823);--foreground:oklch(0.985 0 0);--card:oklch(0.261 0.005 285.823);--card-foreground:oklch(0.985 0 0);--popover:oklch(0.141 0.005 285.823);--popover-foreground:oklch(0.985 0 0);--primary:oklch(0.985 0 0);--primary-foreground:oklch(0.21 0.006 285.885);--secondary:oklch(0.274 0.006 286.033);--secondary-foreground:oklch(0.985 0 0);--muted:oklch(0.274 0.006 286.033);--muted-foreground:oklch(0.705 0.015 286.067);--accent:oklch(0.274 0.006 286.033);--accent-foreground:oklch(0.985 0 0);--destructive:oklch(0.396 0.141 25.723);--destructive-foreground:oklch(0.637 0.237 25.331);--border:oklch(0.274 0.006 286.033);--input:oklch(0.374 0.006 286.033);--ring:oklch(0.442 0.017 285.786);--chart-1:oklch(0.488 0.243 264.376);--chart-2:oklch(0.696 0.17 162.48);--chart-3:oklch(0.769 0.188 70.08);--chart-4:oklch(0.627 0.265 303.9);--chart-5:oklch(0.645 0.246 16.439);--sidebar:oklch(0.21 0.006 285.885);--sidebar-2:oklch(0.31 0.006 285.885);--sidebar-foreground:oklch(0.985 0 0);--sidebar-primary:oklch(0.574 0.006 286.033);--sidebar-primary-foreground:oklch(0.985 0 0);--sidebar-accent:oklch(0.274 0.006 286.033);--sidebar-accent-foreground:oklch(0.985 0 0);--sidebar-border:oklch(0.574 0.006 286.033);--sidebar-ring:oklch(0.442 0.017 285.786);--primary-button:oklch(0.65 0.15 200);--primary-button-foreground:oklch(0.985 0 0);--primary-button-light:oklch(0.3 0.1 200);--primary-button-light-foreground:oklch(0.8 0.15 200);--link-button:oklch(0.7 0.15 195);--link-button-foreground:oklch(0.7 0.15 195);--link-button-light:oklch(0.3 0.1 264.376);--link-button-light-foreground:oklch(0.8 0.15 264.376);--info-button:oklch(0.6 0.25 220);--info-button-foreground:oklch(0.985 0 0);--info-button-light:oklch(0.3 0.12 220);--info-button-light-foreground:oklch(0.75 0.2 220);--success-button:oklch(0.7 0.22 142);--success-button-foreground:oklch(0.985 0 0);--success-button-light:oklch(0.3 0.1 142);--success-button-light-foreground:oklch(0.75 0.18 142);--warning-button:oklch(0.8 0.25 70);--warning-button-foreground:oklch(0.141 0.005 285.823);--warning-button-light:oklch(0.35 0.12 70);--warning-button-light-foreground:oklch(0.85 0.2 70);--danger-button:oklch(0.6 0.25 27.325);--danger-button-foreground:oklch(0.985 0 0);--danger-button-light:oklch(0.3 0.12 27.325);--danger-button-light-foreground:oklch(0.8 0.2 27.325);--window-sizer-bg:#5c818c;--window-sizer-text:#174957;--window-sizer-border:#3c575f;--window-sizer-ring:#0f96bb;--withdraw-bg:#f8d7da;--withdraw-text:#721c24;--withdraw-border:#f5c6cb;--withdraw-ring:#f1aeb5;--warning-bg:#fff3cd;--warning-text:#856404;--warning-border:#ffeeba;--warning-ring:#ffe8a1;--dev-bg:var(--sidebar);--dev-bg-contrast:var(--sidebar-2);--dev-text:#cecece;--dev-lines:oklch(0.32 0.005 286);--dev-contrast-text:#4d4d4d;--pinned-route:#ffd050;--hover-table-row:var(--muted);--spinner-track:oklch(0.3 0 0);--spinner-active:var(--primary-button);--dev-banner-stripe-1:oklch(0.38 0 0);--dev-banner-stripe-2:oklch(0.33 0 0);--dev-banner-text:oklch(0.82 0 0);--dev-brand-bg:oklch(0.7 0.1 142);--dev-brand-text:oklch(0.15 0 0);--status-green-bg:oklch(0.3 0.08 175);--status-green-text:oklch(0.7 0.12 175);--status-green-fill:oklch(0.65 0.12 175);--status-yellow-bg:oklch(0.35 0.1 70);--status-yellow-text:oklch(0.8 0.2 70);--status-yellow-fill:oklch(0.75 0.2 70);--status-red-text:var(--destructive-foreground);--resize-handle:oklch(0.5 0 0);--resize-handle-hover:oklch(0.6 0.1 230);--data-key-color:oklch(0.7 0.15 200);--data-value-color:oklch(0.75 0.15 80);--step-path-color:oklch(0.65 0.1 175);--step-selected-bg:oklch(0.35 0.1 170);--step-selected-bg-hover:oklch(0.3 0.08 170);--step-index-color:oklch(0.75 0.15 70);--step-label-color:oklch(0.65 0.12 175);--step-leaf-color:oklch(0.7 0.18 142);--step-home-color:oklch(0.7 0.15 200);--error-notif-bg:oklch(0.25 0.06 25);--error-notif-bg-end:oklch(0.22 0.08 25);--error-notif-border:oklch(0.35 0.1 25);--error-notif-text:oklch(0.637 0.237 25.331);--log-yellow:oklch(0.25 0.04 85);--log-red:oklch(0.25 0.04 25);--log-green:oklch(0.22 0.03 175);--recruit-blue:oklch(0.55 0.12 220);--recruit-red:oklch(0.5 0.15 15);--recruit-yellow:oklch(0.6 0.14 80);--recruit-yellow-light:oklch(0.45 0.08 85);--recruit-pink:oklch(0.55 0.1 350);--recruit-green:oklch(0.55 0.12 160);--recruit-orange:oklch(0.55 0.1 60);--recruit-teal:oklch(0.55 0.1 185);--recruit-coral:oklch(0.5 0.1 25);--recruit-purple:oklch(0.55 0.1 310);--recruit-text:oklch(0.95 0 0);--scrollbar-track:#2a2a2a;--scrollbar-thumb:#555;--scrollbar-thumb-hover:#777}.dark-aware-img{filter:invert(0)}.dark .dark-aware-img{filter:invert(1)}.dark .light .dark-aware-img{filter:invert(0)!important}.light .dark .dark-aware-img{filter:invert(1)!important}@layer base{*{@apply border-border outline-ring/50}body{@apply bg-background text-foreground;font-family:var(--font-family-base);font-synthesis:auto;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}}::-webkit-scrollbar{height:8px;width:8px}::-webkit-scrollbar-track{background:var(--scrollbar-track);border-radius:4px}::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-hover)}::-webkit-scrollbar-corner{background:var(--scrollbar-track)}*{scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track);scrollbar-width:thin}
@@ -1 +1 @@
1
- :root{--purple:#8a4d76;--pink:#e88f9e;--brown:#84e69c;--light-grey:#6c6c6c;--darker-grey:#323232;--beige-light:#d0d1cd;--beige-lighter:#eff0eb;--code:#040404;--code-background:#fbfbfb;--status-green:#23d160;--status-yellow:#dab830;--status-red:#ea0808;--pinned-route:#ffdd57;--dev-bar-light-grey:#f7f7f7;--dev-bar-mild-grey:#eee;--dev-bar-strong-grey:#dbdbdb;--dev-bar-text:#000;--dev-bar-lines:0.01em solid #b5b5b5;--page-bg-color:"#fff";--page-text-color:"#000";--status-bar-bg-color:"#fff";--status-bar-text-color:"#000"}.table-cell-small{font-size:.8em}.table-cell-base{padding:.5rem .85rem}.table-row-base{border-top:1px solid var(--border);transition:background-color .2s}.table-row-base-bottom{border-bottom:1px solid var(--dev-bar-lines)}.table-row-odd{background-color:var(--dev-bg)}.table-row-odd:hover{background-color:var(--hover-table-row)}.table-row-even{background-color:var(--dev-bg-contrast)}.table-row-even:hover{background-color:var(--hover-table-row)}.table-cell-left{text-align:left}.table-cell-center{text-align:center}.table-cell-mono{font-family:ui-monospace,SFMono-Regular,SF Mono,Consolas,Liberation Mono,Menlo,monospace}.table-border-top{border-top:1px solid var(--border)}.table-border-bottom{border-bottom:1px solid var(--border)}
1
+ :root{--purple:#8a4d76;--pink:#e88f9e;--brown:#84e69c;--light-grey:#6c6c6c;--darker-grey:#323232;--beige-light:#d0d1cd;--beige-lighter:#eff0eb;--code:#040404;--code-background:#fbfbfb;--status-green:#23d160;--status-yellow:#dab830;--status-red:#ea0808;--pinned-route:#ffdd57;--dev-bar-light-grey:#f7f7f7;--dev-bar-mild-grey:#eee;--dev-bar-strong-grey:#dbdbdb;--dev-bar-text:#000;--dev-bar-lines:0.01em solid #b5b5b5;--page-bg-color:"#fff";--page-text-color:"#000";--status-bar-bg-color:"#fff";--status-bar-text-color:"#000"}.table-cell-small{font-size:.8em}.table-cell-base{padding:.5rem .85rem}.table-row-base{transition:background-color .2s}.table-row-base-bottom{border-bottom:1px solid var(--dev-lines)}.table-row-odd{background-color:var(--dev-bg)}.table-row-odd:hover{background-color:var(--hover-table-row)}.table-row-even{background-color:var(--dev-bg-contrast)}.table-row-even:hover{background-color:var(--hover-table-row)}.table-cell-left{text-align:left}.table-cell-center{text-align:center}.table-cell-mono{font-family:ui-monospace,SFMono-Regular,SF Mono,Consolas,Liberation Mono,Menlo,monospace}.table-border-top{border-top:1px solid var(--border)}.table-border-bottom{border-bottom:1px solid var(--border)}