@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,11 +1,20 @@
1
1
  <script setup>
2
- import { ref, computed } from "vue";
2
+ import { Maximize, Moon, RotateCcw, Sun, SunMoon } from "lucide-vue-next";
3
+ import { ref, computed, watch } from "vue";
3
4
  import ResponsiveDeviceSelect from "./menu/ResponsiveDeviceSelect.vue";
4
5
  import { useElementSize } from "@vueuse/core";
5
6
  import { devicePresets } from "./devicePresets.js";
7
+ import useAPI from "../../composables/useAPI";
8
+ import { useSmileColorMode } from "../../composables/useColorMode";
6
9
  const api = useAPI();
7
10
  const fullScreenDiv = ref(null);
8
- const { width: _fullScreenWidth, height: _fullScreenHeight } = useElementSize(fullScreenDiv);
11
+ const { width: fullScreenWidth, height: fullScreenHeight } = useElementSize(fullScreenDiv);
12
+ watch([fullScreenWidth, fullScreenHeight], ([w, h]) => {
13
+ if (api.store.dev.isFullscreen && w > 0 && h > 0) {
14
+ api.store.dev.deviceWidth = Math.round(w);
15
+ api.store.dev.deviceHeight = Math.round(h);
16
+ }
17
+ });
9
18
  const {
10
19
  state: experimentColorMode,
11
20
  mode: experimentColorModeRaw,
@@ -123,7 +132,7 @@ const colorMode = computed(() => {
123
132
  size="xs"
124
133
  @click="toggleRotation"
125
134
  >
126
- <i-carbon-rotate-counterclockwise-filled :class="{ 'text-blue-400': api.store.dev.isRotated }" />
135
+ <RotateCcw :class="{ 'text-link-button-foreground': api.store.dev.isRotated }" />
127
136
  </Button>
128
137
  </TooltipTrigger>
129
138
  <TooltipContent side="bottom">
@@ -146,9 +155,9 @@ const colorMode = computed(() => {
146
155
  size="xs"
147
156
  @click="toggleColorMode"
148
157
  >
149
- <i-lucide-moon v-if="experimentColorModeRaw === 'light'" />
150
- <i-lucide-sun-moon v-else-if="experimentColorModeRaw === 'dark'" />
151
- <i-lucide-sun v-else />
158
+ <Moon v-if="experimentColorModeRaw === 'light'" />
159
+ <SunMoon v-else-if="experimentColorModeRaw === 'dark'" />
160
+ <Sun v-else />
152
161
  </Button>
153
162
  </TooltipTrigger>
154
163
  <TooltipContent side="bottom">
@@ -173,7 +182,7 @@ const colorMode = computed(() => {
173
182
  size="xs"
174
183
  @click="toggleFullscreen"
175
184
  >
176
- <i-ic-outline-fullscreen />
185
+ <Maximize />
177
186
  </Button>
178
187
  </TooltipTrigger>
179
188
  <TooltipContent side="bottom">
@@ -211,5 +220,5 @@ const colorMode = computed(() => {
211
220
  </template>
212
221
 
213
222
  <style scoped>
214
- .device-container-wrapper,.fullscreen-container{height:100%;position:relative;width:100%}.device-container-wrapper{background-image:linear-gradient(color-mix(in srgb,var(--border) 70%,transparent) 1px,transparent 1px),linear-gradient(90deg,color-mix(in srgb,var(--border) 70%,transparent) 1px,transparent 1px);background-position:-1px 0;background-size:20px 20px;container-type:inline-size;max-width:100%;min-height:100%;overflow-x:auto;overflow-y:auto}.device-content-wrapper{align-items:center;background-color:var(--test-background);display:flex;flex-direction:column;justify-content:flex-start;padding:20px}@container (min-width: 800px){.device-content-wrapper{align-items:center;padding:20px}.device-wrapper{justify-content:center;margin-left:15px}}@container (max-width: 799px){.device-content-wrapper{align-items:flex-start;margin-left:0}.device-wrapper{justify-content:flex-start}.device-info,.device-wrapper{margin-left:15px}}.device-info{background-color:var(--background);border:1px solid var(--border);border-radius:10px;font-family:monospace;font-size:14px;margin-bottom:10px;padding:5px;text-align:center}.device-controls{align-items:center;display:flex;flex-direction:row;gap:8px}.device-controls>*{align-items:center;display:flex;gap:16px}.device-dimensions{color:var(--muted-foreground);font-family:monospace;font-size:.8em}.device-controls :deep(.select-small){font-size:12px!important;height:28px!important;padding:4px 8px!important}.device-controls :deep(.select-small svg){height:12px!important;width:12px!important}.device-wrapper{align-items:center;background-color:var(--background);display:flex;justify-content:flex-start;position:relative}.device-container{border:2px solid var(--border);border-radius:12px;box-shadow:0 6px 20px rgba(0,0,0,.15),0 3px 8px rgba(0,0,0,.1);display:inline-block;height:var(--device-height);overflow-x:auto;overflow-y:auto;width:var(--device-width)}.resize-handle{background:#8f8f8f;border-radius:20px;box-shadow:0 2px 4px rgba(0,0,0,.2);position:absolute;transform-origin:center;transition:all .2s}.resize-handle:hover{background:#90b7e5;transform:scale(1.1)}.resize-handle:active{background:#90b7e5;transform:scale(1.05)}.resize-handle-left{cursor:ew-resize;height:40px;left:-15px;top:50%;transform:translateY(-50%);width:8px}.resize-handle-left:hover{transform:translateY(-50%) scale(1.1)}.resize-handle-left:active{transform:translateY(-50%) scale(1.05)}.resize-handle-right{cursor:ew-resize;height:40px;right:-15px;top:50%;transform:translateY(-50%);width:8px}.resize-handle-right:hover{transform:translateY(-50%) scale(1.1)}.resize-handle-right:active{transform:translateY(-50%) scale(1.05)}.resize-handle-bottom{bottom:-15px;cursor:ns-resize;height:8px;left:50%;transform:translateX(-50%);width:40px}.resize-handle-bottom:hover{transform:translateX(-50%) scale(1.1)}.resize-handle-bottom:active{transform:translateX(-50%) scale(1.05)}
223
+ .device-container-wrapper,.fullscreen-container{height:100%;position:relative;width:100%}.device-container-wrapper{background-image:linear-gradient(color-mix(in srgb,var(--border) 70%,transparent) 1px,transparent 1px),linear-gradient(90deg,color-mix(in srgb,var(--border) 70%,transparent) 1px,transparent 1px);background-position:-1px 0;background-size:20px 20px;container-type:inline-size;max-width:100%;min-height:100%;overflow-x:auto;overflow-y:auto}.device-content-wrapper{align-items:center;background-color:var(--test-background);display:flex;flex-direction:column;justify-content:flex-start;padding:20px}@container (min-width: 800px){.device-content-wrapper{align-items:center;padding:20px}.device-wrapper{justify-content:center;margin-left:15px}}@container (max-width: 799px){.device-content-wrapper{align-items:flex-start;margin-left:0}.device-wrapper{justify-content:flex-start}.device-info,.device-wrapper{margin-left:15px}}.device-info{background-color:var(--background);border:1px solid var(--border);border-radius:10px;font-family:monospace;font-size:14px;margin-bottom:10px;padding:5px;text-align:center}.device-controls{align-items:center;display:flex;flex-direction:row;gap:8px}.device-controls>*{align-items:center;display:flex;gap:16px}.device-dimensions{color:var(--muted-foreground);font-family:monospace;font-size:.8em}.device-controls :deep(.select-small){font-size:12px!important;height:28px!important;padding:4px 8px!important}.device-controls :deep(.select-small svg){height:12px!important;width:12px!important}.device-wrapper{align-items:center;background-color:var(--background);display:flex;justify-content:flex-start;position:relative}.device-container{border:2px solid var(--border);border-radius:12px;box-shadow:0 6px 20px rgba(0,0,0,.15),0 3px 8px rgba(0,0,0,.1);display:inline-block;height:var(--device-height);overflow-x:auto;overflow-y:auto;width:var(--device-width)}.resize-handle{background:var(--resize-handle);border-radius:20px;box-shadow:0 2px 4px rgba(0,0,0,.2);position:absolute;transform-origin:center;transition:all .2s}.resize-handle:hover{background:var(--resize-handle-hover);transform:scale(1.1)}.resize-handle:active{background:var(--resize-handle-hover);transform:scale(1.05)}.resize-handle-left{cursor:ew-resize;height:40px;left:-15px;top:50%;transform:translateY(-50%);width:8px}.resize-handle-left:hover{transform:translateY(-50%) scale(1.1)}.resize-handle-left:active{transform:translateY(-50%) scale(1.05)}.resize-handle-right{cursor:ew-resize;height:40px;right:-15px;top:50%;transform:translateY(-50%);width:8px}.resize-handle-right:hover{transform:translateY(-50%) scale(1.1)}.resize-handle-right:active{transform:translateY(-50%) scale(1.05)}.resize-handle-bottom{bottom:-15px;cursor:ns-resize;height:8px;left:50%;transform:translateX(-50%);width:40px}.resize-handle-bottom:hover{transform:translateX(-50%) scale(1.1)}.resize-handle-bottom:active{transform:translateX(-50%) scale(1.05)}
215
224
  </style>
@@ -0,0 +1,83 @@
1
+ <script setup>
2
+ import { ref, computed, onMounted } from "vue";
3
+ import { useNuxtApp } from "#imports";
4
+ import PresentationNavBar from "#smile-dev/presentation/PresentationNavBar.vue";
5
+ import PresentationModeView from "../builtins/PresentationModeView.vue";
6
+ import useSmileStore from "../../stores/smilestore";
7
+ import useAPI from "../../composables/useAPI";
8
+ import { useSmileColorMode } from "../../composables/useColorMode";
9
+ const nuxtApp = useNuxtApp();
10
+ const store = useSmileStore();
11
+ useAPI();
12
+ useSmileColorMode("global");
13
+ const timelineReady = ref(false);
14
+ const presentationHome = computed(() => {
15
+ if (!timelineReady.value) return null;
16
+ return store.config.global_app_components?.presentation_home || PresentationModeView;
17
+ });
18
+ const presentationHomeProps = computed(() => {
19
+ if (!timelineReady.value) return {};
20
+ return store.config.global_app_components?.presentation_home_props || {};
21
+ });
22
+ const presentationPath = ref("/");
23
+ const viewConfig = computed(() => {
24
+ if (!timelineReady.value) return void 0;
25
+ const timeline = nuxtApp.$timeline;
26
+ if (!timeline) return void 0;
27
+ return timeline.getViewForPath(presentationPath.value);
28
+ });
29
+ const isLoading = computed(() => {
30
+ return !timelineReady.value;
31
+ });
32
+ onMounted(() => {
33
+ timelineReady.value = true;
34
+ });
35
+ </script>
36
+
37
+ <template>
38
+ <div class="presentation-container bg-background">
39
+ <LocalDevBanner />
40
+ <!-- Top toolbar with presentation navigation -->
41
+ <div class="toolbar">
42
+ <PresentationNavBar hide-dark-mode />
43
+ </div>
44
+
45
+ <!-- Content area -->
46
+ <div class="content-wrapper">
47
+ <div class="content-and-console">
48
+ <div class="main-content @container bg-background text-foreground">
49
+ <!-- Loading state -->
50
+ <div
51
+ v-if="isLoading"
52
+ class="loading-container"
53
+ >
54
+ <div class="loading-spinner" />
55
+ <p>Loading...</p>
56
+ </div>
57
+ <!-- Presentation home (root view) -->
58
+ <template v-else>
59
+ <component
60
+ :is="presentationHome"
61
+ v-if="presentationPath === '/' && timelineReady"
62
+ v-bind="presentationHomeProps"
63
+ />
64
+ <!-- Normal timeline view resolution -->
65
+ <component
66
+ :is="viewConfig.component"
67
+ v-else-if="viewConfig && viewConfig.component"
68
+ v-bind="viewConfig.props"
69
+ />
70
+ <div v-else-if="viewConfig === null && timelineReady">
71
+ <h1>Page not found</h1>
72
+ <p>No view registered for path: {{ presentationPath }}</p>
73
+ </div>
74
+ </template>
75
+ </div>
76
+ </div>
77
+ </div>
78
+ </div>
79
+ </template>
80
+
81
+ <style scoped>
82
+ .presentation-container{display:flex;flex:1;flex-direction:column;height:100%;width:100%}.toolbar{background-color:var(--dev-bar-bg);height:36px;margin-bottom:auto;margin-top:auto;width:full}.content-wrapper{display:flex;flex:1;overflow:hidden;width:100%}.content-and-console{flex-direction:column;overflow:hidden}.content-and-console,.main-content{display:flex;flex:1;min-height:0;min-width:0}.main-content{flex-direction:column;overflow-x:auto;overflow-y:auto}.loading-container{align-items:center;display:flex;flex-direction:column;height:100%;justify-content:center;min-height:200px}.loading-spinner{animation:spin 1s linear infinite;border-top:4px solid var(--spinner-track);border:4px solid var(--spinner-track);border-radius:50%;border-top-color:var(--spinner-active);height:40px;margin-bottom:16px;width:40px}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}
83
+ </style>
@@ -1,5 +1,7 @@
1
1
  <script setup>
2
+ import { ChevronRight, House } from "lucide-vue-next";
2
3
  import { computed } from "vue";
4
+ import useAPI from "../../../composables/useAPI";
3
5
  const props = defineProps(["data", "selected"]);
4
6
  const api = useAPI();
5
7
  const emit = defineEmits(["selected"]);
@@ -16,7 +18,7 @@ const data_field = computed(() => {
16
18
  const pieces = props.data.split(".");
17
19
  let view_data = api.all_config;
18
20
  for (let i = 0; i < pieces.length; i++) {
19
- if (view_data[pieces[i]]) {
21
+ if (view_data != null && typeof view_data === "object" && pieces[i] in view_data) {
20
22
  view_data = view_data[pieces[i]];
21
23
  }
22
24
  }
@@ -26,9 +28,10 @@ const data_field = computed(() => {
26
28
  }
27
29
  });
28
30
  function truncateText(text, maxLength = 30) {
29
- if (!text) return text;
30
- if (text.length <= maxLength) return text;
31
- return text.substring(0, maxLength) + "...";
31
+ if (text === null || text === void 0) return text;
32
+ const str = String(text);
33
+ if (str.length <= maxLength) return str;
34
+ return str.substring(0, maxLength) + "...";
32
35
  }
33
36
  function option_selected(option) {
34
37
  emit("selected", option);
@@ -41,10 +44,10 @@ function option_selected(option) {
41
44
  <!-- Header section with navigation title -->
42
45
  <div
43
46
  v-if="header"
44
- class="bg-muted text-dev-text px-3 py-2 text-xs font-medium border-b border-dev-lines"
47
+ class="bg-background text-dev-text px-3 text-xs font-medium border-b border-dev-lines h-8 flex items-center"
45
48
  >
46
49
  <template v-if="header == '/'">
47
- <i-fa6-solid-house class="mr-1" />
50
+ <House class="mr-1 size-3.5" />
48
51
  </template>
49
52
  <template v-else>
50
53
  <span class="font-mono">{{ header }}</span>
@@ -84,15 +87,15 @@ function option_selected(option) {
84
87
  v-else
85
88
  :class="[
86
89
  'w-full text-left px-2 py-1.5 text-xs font-mono rounded transition-colors duration-150 object-item',
87
- 'hover:bg-ring hover:text-blue-700',
88
- 'focus:outline-none focus:ring-1 focus:ring-blue-300 focus:bg-blue-50',
89
- key === props.selected ? 'bg-blue-100 text-blue-800 border border-muted' : 'text-gray-700',
90
+ 'hover:bg-accent hover:text-accent-foreground',
91
+ 'focus:outline-none focus:ring-1 focus:ring-ring',
92
+ key === props.selected ? 'bg-accent text-accent-foreground border border-dev-lines' : 'text-foreground',
90
93
  ]"
91
94
  @click="option_selected(key)"
92
95
  >
93
96
  <div class="flex items-center justify-between">
94
97
  <span class="font-semibold text-foreground item-key">{{ truncateText(key) }}</span>
95
- <i-fa6-solid-angle-right class="text-gray-400 text-xs" />
98
+ <ChevronRight class="text-muted-foreground size-3.5" />
96
99
  </div>
97
100
  </button>
98
101
  </li>
@@ -102,5 +105,5 @@ function option_selected(option) {
102
105
  </template>
103
106
 
104
107
  <style scoped>
105
- .overflow-y-auto::-webkit-scrollbar{width:6px}.overflow-y-auto::-webkit-scrollbar-track{background:var(--scrollbar-track);border-radius:3px}.overflow-y-auto::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);border-radius:3px}.overflow-y-auto::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-hover)}.item-key{color:#0baac3;font-weight:400}.primitive-item .item-value{color:#dda814;font-weight:400}.object-item .item-key,.object-item .item-value{color:#0baac3;font-weight:400}.config-list-container .bg-blue-100{background-color:var(--accent)}.config-list-container .text-blue-800{color:var(--accent-foreground)}.config-list-container .border-blue-200{border-color:var(--accent)}
108
+ .overflow-y-auto::-webkit-scrollbar{width:6px}.overflow-y-auto::-webkit-scrollbar-track{background:var(--scrollbar-track);border-radius:3px}.overflow-y-auto::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);border-radius:3px}.overflow-y-auto::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-hover)}.item-key{color:var(--data-key-color);font-weight:400}.primitive-item .item-value{color:var(--data-value-color);font-weight:400}.object-item .item-key,.object-item .item-value{color:var(--data-key-color);font-weight:400}
106
109
  </style>
@@ -1,6 +1,8 @@
1
1
  <script setup>
2
+ import { House } from "lucide-vue-next";
2
3
  import { reactive, computed, onMounted } from "vue";
3
4
  import ConfigList from "./ConfigList.vue";
5
+ import useAPI from "../../../composables/useAPI";
4
6
  const api = useAPI();
5
7
  const browse_panels = reactive({ path: ["/", null, null] });
6
8
  onMounted(() => {
@@ -49,6 +51,22 @@ function panel2_select(option) {
49
51
  save_path();
50
52
  }
51
53
  function panel3_select(option) {
54
+ const currentPath = panel_path(0);
55
+ if (currentPath) {
56
+ const pieces = currentPath.split(".");
57
+ let view_data = api.all_config;
58
+ for (let i = 0; i < pieces.length; i++) {
59
+ if (view_data != null && typeof view_data === "object" && pieces[i] in view_data) {
60
+ view_data = view_data[pieces[i]];
61
+ }
62
+ }
63
+ if (view_data != null && typeof view_data === "object" && option in view_data) {
64
+ const child = view_data[option];
65
+ if (child == null || typeof child !== "object") {
66
+ return;
67
+ }
68
+ }
69
+ }
52
70
  browse_panels.path.push(String(option));
53
71
  save_path();
54
72
  }
@@ -68,9 +86,12 @@ function _resetDevState() {
68
86
  <!-- Configuration panel with breadcrumb navigation and three-panel layout -->
69
87
  <div class="h-full m-0 p-0 flex flex-col">
70
88
  <!-- Breadcrumb navigation bar -->
71
- <Breadcrumb class="bg-muted border-b border-t border-dev-lines px-3 py-2 font-mono">
89
+ <Breadcrumb class="bg-muted border-b border-dev-lines px-3 py-2 font-mono">
72
90
  <BreadcrumbList>
73
- <template v-for="(option, index) in browse_panels.path" :key="index">
91
+ <template
92
+ v-for="(option, index) in browse_panels.path"
93
+ :key="index"
94
+ >
74
95
  <template v-if="option !== null">
75
96
  <BreadcrumbItem>
76
97
  <BreadcrumbLink
@@ -79,7 +100,7 @@ function _resetDevState() {
79
100
  @click="panel_jump(index)"
80
101
  >
81
102
  <template v-if="option == '/'">
82
- <i-fa6-solid-house />
103
+ <House class="size-3.5" />
83
104
  </template>
84
105
  <template v-else>
85
106
  {{ option }}
@@ -95,17 +116,17 @@ function _resetDevState() {
95
116
  <!-- Main content area with sidebar and three-panel layout -->
96
117
  <div class="flex flex-row flex-1 overflow-hidden">
97
118
  <!-- Left sidebar with documentation link -->
98
- <div class="flex flex-col w-1/6 min-w-[120px] border-r border-l border-dev-lines bg-muted p-2 gap-2">
119
+ <div class="flex flex-col w-1/6 min-w-[120px] border-r border-dev-lines bg-muted p-2 gap-2">
99
120
  <div class="text-xs text-left mb-2 font-mono">
100
121
  Read more about configuration options
101
122
  <a
102
123
  href="https://smile.gureckislab.org/configuration.html"
103
- class="text-blue-600 underline ml-1"
124
+ class="text-link-button-foreground underline ml-1"
104
125
  >in the docs</a>.
105
126
  </div>
106
127
  </div>
107
128
  <!-- Three-panel configuration browser -->
108
- <div class="flex-1 grid grid-cols-3 gap-0 bg-gray-50 overflow-hidden">
129
+ <div class="flex-1 grid grid-cols-3 gap-0 bg-background overflow-hidden">
109
130
  <!-- Left panel -->
110
131
  <div class="border-r border-dev-lines h-full overflow-hidden">
111
132
  <ConfigList
@@ -123,7 +144,7 @@ function _resetDevState() {
123
144
  />
124
145
  </div>
125
146
  <!-- Right panel -->
126
- <div class="bg-gray-50 h-full overflow-hidden">
147
+ <div class="bg-background h-full overflow-hidden">
127
148
  <ConfigList
128
149
  :data="panel_path(0)"
129
150
  @selected="panel3_select"
@@ -1,6 +1,8 @@
1
1
  <script setup>
2
+ import { House } from "lucide-vue-next";
2
3
  import { reactive, computed, onMounted } from "vue";
3
4
  import DatabaseList from "./DatabaseList.vue";
5
+ import useAPI from "../../../composables/useAPI";
4
6
  const api = useAPI();
5
7
  const browse_panels = reactive({ path: ["/", null, null] });
6
8
  onMounted(() => {
@@ -64,7 +66,7 @@ function panel_jump(index) {
64
66
  <!-- Database browsing panel with breadcrumb navigation and three-panel layout -->
65
67
  <div class="h-full p-0 m-0 flex flex-col">
66
68
  <!-- Breadcrumb navigation bar -->
67
- <Breadcrumb class="bg-muted border-b border-t border-dev-lines px-3 py-2 font-mono">
69
+ <Breadcrumb class="bg-muted border-b border-dev-lines px-3 py-2 font-mono">
68
70
  <BreadcrumbList>
69
71
  <template
70
72
  v-for="(option, index) in browse_panels.path"
@@ -78,7 +80,7 @@ function panel_jump(index) {
78
80
  @click="panel_jump(index)"
79
81
  >
80
82
  <template v-if="option == '/'">
81
- <i-fa6-solid-house />
83
+ <House class="size-3.5" />
82
84
  </template>
83
85
  <template v-else>
84
86
  {{ option }}
@@ -103,7 +105,7 @@ function panel_jump(index) {
103
105
  />
104
106
  </div>
105
107
  <!-- Middle panel - 25% width -->
106
- <div class="w-1/4 h-full border-r border-dev-lines p-0 m-0 bg-gray-50">
108
+ <div class="w-1/4 h-full border-r border-dev-lines p-0 m-0 bg-background">
107
109
  <!-- one from end -->
108
110
  <DatabaseList
109
111
  :data="panel_path(1)"
@@ -112,7 +114,7 @@ function panel_jump(index) {
112
114
  />
113
115
  </div>
114
116
  <!-- Right panel - 50% width -->
115
- <div class="w-1/2 h-full p-0 m-0 bg-gray-50">
117
+ <div class="w-1/2 h-full p-0 m-0 bg-background">
116
118
  <!-- zero from end -->
117
119
  <DatabaseList
118
120
  :data="panel_path(0)"
@@ -1,5 +1,8 @@
1
1
  <script setup>
2
+ import { ChevronRight, Clock, Database, GitBranch, Settings, Timer } from "lucide-vue-next";
2
3
  import { computed } from "vue";
4
+ import useLog from "../../../stores/log";
5
+ import useAPI from "../../../composables/useAPI";
3
6
  const api = useAPI();
4
7
  const log = useLog();
5
8
  const height_pct = computed(() => `${api.store.dev.consoleBarHeight - 55}px`);
@@ -29,13 +32,13 @@ function getBgClass(msg) {
29
32
  case "log":
30
33
  return "bg-background";
31
34
  case "warn":
32
- return "bg-yellow-100";
35
+ return "log-bg-warn";
33
36
  case "error":
34
- return "bg-red-100";
37
+ return "log-bg-error";
35
38
  case "debug":
36
39
  return "bg-muted text-muted-foreground";
37
40
  case "success":
38
- return "bg-green-100";
41
+ return "log-bg-success";
39
42
  default:
40
43
  return "bg-background";
41
44
  }
@@ -46,7 +49,7 @@ function getBgClass(msg) {
46
49
  <!-- Console log panel with controls and log display -->
47
50
  <div class="h-full p-0 m-0 overflow-hidden">
48
51
  <!-- Control bar with filters and search -->
49
- <div class="bg-muted border-b border-t border-dev-lines px-3 py-2 font-mono">
52
+ <div class="bg-muted border-b border-dev-lines px-3 py-2 font-mono">
50
53
  <div class="flex items-center justify-end gap-4 text-xs">
51
54
  <!-- Since last view toggle -->
52
55
  <div class="flex items-center gap-2">
@@ -140,28 +143,49 @@ function getBgClass(msg) {
140
143
  v-if="api.store.dev.lastViewLimit"
141
144
  class="w-full min-w-0"
142
145
  >
143
- <template v-for="(msg, idx) in log.page_history" :key="idx">
146
+ <template
147
+ v-for="(msg, idx) in log.page_history"
148
+ :key="idx"
149
+ >
144
150
  <li
145
151
  v-if="filter_log(msg)"
146
152
  :class="[
147
153
  getBgClass(msg),
148
- 'text-xs font-mono p-2 pr-0 border-b border-border whitespace-pre-wrap break-words break-all min-w-0 w-full',
154
+ 'text-xs font-mono p-2 pr-0 border-b border-dev-lines whitespace-pre-wrap break-words break-all min-w-0 w-full',
149
155
  ]"
150
156
  >
151
157
  <div class="flex items-start gap-1 min-w-0">
152
158
  <!-- Icon indicator based on message content -->
153
159
  <div class="flex-shrink-0 mt-0.5">
154
- <i-fa6-solid-code-branch v-if="msg.message.includes('ROUTER GUARD')" />
155
- <i-fa6-solid-database v-else-if="msg.message.includes('SMILESTORE')" />
156
- <i-fa6-solid-gear v-else-if="msg.message.includes('DEV MODE')" />
157
- <i-fa6-solid-clock v-else-if="msg.message.includes('TIMELINE STEPPER')" />
158
- <i-fa6-regular-clock v-else-if="msg.message.includes('TRIAL STEPPER')" />
160
+ <GitBranch
161
+ v-if="msg.message.includes('ROUTER GUARD')"
162
+ class="size-3.5"
163
+ />
164
+ <Database
165
+ v-else-if="msg.message.includes('SMILESTORE')"
166
+ class="size-3.5"
167
+ />
168
+ <Settings
169
+ v-else-if="msg.message.includes('DEV MODE')"
170
+ class="size-3.5"
171
+ />
172
+ <Clock
173
+ v-else-if="msg.message.includes('TIMELINE STEPPER')"
174
+ class="size-3.5"
175
+ />
176
+ <Timer
177
+ v-else-if="msg.message.includes('TRIAL STEPPER')"
178
+ class="size-3.5"
179
+ />
159
180
  <img
160
181
  v-else-if="msg.message.includes('FIRESTORE')"
161
- src="/src/assets/dev/firebase-bw.svg"
182
+ :src="'/firebase-bw.svg'"
162
183
  width="15"
163
184
  >
164
- <i-fa6-solid-angle-right v-else />
185
+ <ChevronRight
186
+ v-else
187
+ class="size-3.5"
188
+ />
165
189
  </div>
166
190
  <!-- Message content -->
167
191
  <div class="min-w-0 flex-1">
@@ -181,28 +205,49 @@ function getBgClass(msg) {
181
205
  v-else
182
206
  class="w-full min-w-0"
183
207
  >
184
- <template v-for="(msg, idx) in log.history" :key="idx">
208
+ <template
209
+ v-for="(msg, idx) in log.history"
210
+ :key="idx"
211
+ >
185
212
  <li
186
213
  v-if="filter_log(msg)"
187
214
  :class="[
188
215
  getBgClass(msg),
189
- 'text-xs font-mono p-2 pr-0 border-b border-border whitespace-pre-wrap break-words break-all min-w-0 w-full',
216
+ 'text-xs font-mono p-2 pr-0 border-b border-dev-lines whitespace-pre-wrap break-words break-all min-w-0 w-full',
190
217
  ]"
191
218
  >
192
219
  <div class="flex items-start gap-1 min-w-0">
193
220
  <!-- Icon indicator based on message content -->
194
221
  <div class="flex-shrink-0 mt-0.5">
195
- <i-fa6-solid-code-branch v-if="msg.message.includes('ROUTER GUARD')" />
196
- <i-fa6-solid-database v-else-if="msg.message.includes('SMILESTORE')" />
197
- <i-fa6-solid-gear v-else-if="msg.message.includes('DEV MODE')" />
198
- <i-fa6-solid-clock v-else-if="msg.message.includes('TIMELINE STEPPER')" />
199
- <i-fa6-regular-clock v-else-if="msg.message.includes('TRIAL STEPPER')" />
222
+ <GitBranch
223
+ v-if="msg.message.includes('ROUTER GUARD')"
224
+ class="size-3.5"
225
+ />
226
+ <Database
227
+ v-else-if="msg.message.includes('SMILESTORE')"
228
+ class="size-3.5"
229
+ />
230
+ <Settings
231
+ v-else-if="msg.message.includes('DEV MODE')"
232
+ class="size-3.5"
233
+ />
234
+ <Clock
235
+ v-else-if="msg.message.includes('TIMELINE STEPPER')"
236
+ class="size-3.5"
237
+ />
238
+ <Timer
239
+ v-else-if="msg.message.includes('TRIAL STEPPER')"
240
+ class="size-3.5"
241
+ />
200
242
  <img
201
243
  v-else-if="msg.message.includes('FIRESTORE')"
202
- src="/src/assets/dev/firebase-bw.svg"
244
+ :src="'/firebase-bw.svg'"
203
245
  width="15"
204
246
  >
205
- <i-fa6-solid-angle-right v-else />
247
+ <ChevronRight
248
+ v-else
249
+ class="size-3.5"
250
+ />
206
251
  </div>
207
252
  <!-- Message content -->
208
253
  <div class="min-w-0 flex-1">
@@ -223,5 +268,5 @@ function getBgClass(msg) {
223
268
  </template>
224
269
 
225
270
  <style scoped>
226
- .overflow-y-scroll::-webkit-scrollbar{width:6px}.overflow-y-scroll::-webkit-scrollbar-track{background:var(--scrollbar-track);border-radius:3px}.overflow-y-scroll::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);border-radius:3px}.overflow-y-scroll::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-hover)}.bg-background{background-color:var(--background)}.bg-muted{background-color:var(--muted)}.text-muted-foreground{color:var(--muted-foreground)}.border-border{border-color:var(--border)}.bg-yellow-100{background-color:var(--log-yellow)}.bg-red-100{background-color:var(--log-red)}.bg-green-100{background-color:var(--log-green)}
271
+ .overflow-y-scroll::-webkit-scrollbar{width:6px}.overflow-y-scroll::-webkit-scrollbar-track{background:var(--scrollbar-track);border-radius:3px}.overflow-y-scroll::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);border-radius:3px}.overflow-y-scroll::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-hover)}.bg-background{background-color:var(--background)}.bg-muted{background-color:var(--muted)}.text-muted-foreground{color:var(--muted-foreground)}.border-dev-lines{border-color:var(--dev-lines)}.log-bg-warn{background-color:var(--log-yellow)}.log-bg-error{background-color:var(--log-red)}.log-bg-success{background-color:var(--log-green)}
227
272
  </style>
@@ -1,5 +1,7 @@
1
1
  <script setup>
2
+ import { ChevronRight, House } from "lucide-vue-next";
2
3
  import { computed } from "vue";
4
+ import useAPI from "../../../composables/useAPI";
3
5
  const props = defineProps(["data", "selected"]);
4
6
  const api = useAPI();
5
7
  const emit = defineEmits(["selected"]);
@@ -45,10 +47,10 @@ function option_selected(option) {
45
47
  <!-- Header section with navigation title -->
46
48
  <div
47
49
  v-if="header"
48
- class="bg-muted text-dev-text px-3 py-2 text-xs font-medium border-b border-dev-lines"
50
+ class="bg-background text-dev-text px-3 text-xs font-medium border-b border-dev-lines h-8 flex items-center"
49
51
  >
50
52
  <template v-if="header == '/'">
51
- <i-fa6-solid-house class="mr-1" />
53
+ <House class="size-3.5" />
52
54
  </template>
53
55
  <template v-else>
54
56
  <span class="font-mono">{{ header }}</span>
@@ -88,15 +90,15 @@ function option_selected(option) {
88
90
  v-else
89
91
  :class="[
90
92
  'w-full text-left px-2 py-1.5 text-xs font-mono rounded transition-colors duration-150 object-item',
91
- 'hover:bg-ring hover:text-blue-700',
92
- 'focus:outline-none focus:ring-1 focus:ring-blue-300 focus:bg-blue-50',
93
- key === props.selected ? 'bg-blue-100 text-blue-800 border border-muted' : 'text-gray-700',
93
+ 'hover:bg-accent hover:text-accent-foreground',
94
+ 'focus:outline-none focus:ring-1 focus:ring-ring',
95
+ key === props.selected ? 'bg-accent text-accent-foreground border border-dev-lines' : 'text-foreground',
94
96
  ]"
95
97
  @click="option_selected(key)"
96
98
  >
97
99
  <div class="flex items-center justify-between">
98
100
  <span class="font-semibold text-foreground item-key">{{ truncateText(key) }}</span>
99
- <i-fa6-solid-angle-right class="text-gray-400 text-xs" />
101
+ <ChevronRight class="text-muted-foreground size-3.5" />
100
102
  </div>
101
103
  </button>
102
104
  </li>
@@ -106,5 +108,5 @@ function option_selected(option) {
106
108
  </template>
107
109
 
108
110
  <style scoped>
109
- .overflow-y-auto::-webkit-scrollbar{width:6px}.overflow-y-auto::-webkit-scrollbar-track{background:var(--scrollbar-track);border-radius:3px}.overflow-y-auto::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);border-radius:3px}.overflow-y-auto::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-hover)}.item-key{color:#0baac3;font-weight:400}.primitive-item .item-value{color:#dda814;font-weight:400}.object-item .item-key,.object-item .item-value{color:#0baac3;font-weight:400}.database-list-container .bg-blue-100{background-color:var(--accent)}.database-list-container .text-blue-800{color:var(--accent-foreground)}.database-list-container .border-blue-200{border-color:var(--accent)}
111
+ .overflow-y-auto::-webkit-scrollbar{width:6px}.overflow-y-auto::-webkit-scrollbar-track{background:var(--scrollbar-track);border-radius:3px}.overflow-y-auto::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);border-radius:3px}.overflow-y-auto::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-hover)}.item-key{color:var(--data-key-color);font-weight:400}.primitive-item .item-value{color:var(--data-value-color);font-weight:400}.object-item .item-key,.object-item .item-value{color:var(--data-key-color);font-weight:400}
110
112
  </style>
@@ -1,13 +1,15 @@
1
1
  <script setup>
2
+ import { ChevronDown, Database, Settings, Terminal } from "lucide-vue-next";
2
3
  import ConsoleDatabaseBrowsePanel from "./ConsoleDatabaseBrowsePanel.vue";
3
4
  import ConsoleLogPanel from "./ConsoleLogPanel.vue";
4
5
  import ConsoleConfigPanel from "./ConsoleConfigPanel.vue";
6
+ import useAPI from "../../../composables/useAPI";
5
7
  const api = useAPI();
6
8
  </script>
7
9
 
8
10
  <template>
9
11
  <!-- Main console container with left sidebar and right content area -->
10
- <div class="w-full h-full flex border-t border-border overflow-hidden">
12
+ <div class="w-full h-full flex overflow-hidden border-t border-dev-lines">
11
13
  <!-- Left sidebar - 36px wide with tab navigation -->
12
14
  <div
13
15
  class="w-9 h-full bg-muted border-dev-lines border-r flex flex-col items-center justify-between pt-1 pb-1 flex-shrink-0"
@@ -28,7 +30,7 @@ const api = useAPI();
28
30
  }"
29
31
  @click="api.store.dev.consoleBarTab = 'browse'"
30
32
  >
31
- <i-tdesign-data-base-filled />
33
+ <Database class="w-4 h-4" />
32
34
  </Button>
33
35
  </TooltipTrigger>
34
36
  <TooltipContent side="right">
@@ -51,7 +53,7 @@ const api = useAPI();
51
53
  }"
52
54
  @click="api.store.dev.consoleBarTab = 'log'"
53
55
  >
54
- <i-mdi-console-line class="w-4 h-4" />
56
+ <Terminal class="w-4 h-4" />
55
57
  </Button>
56
58
  </TooltipTrigger>
57
59
  <TooltipContent side="right">
@@ -74,7 +76,7 @@ const api = useAPI();
74
76
  }"
75
77
  @click="api.store.dev.consoleBarTab = 'config'"
76
78
  >
77
- <i-fa6-solid-gear class="w-4 h-4" />
79
+ <Settings class="w-4 h-4" />
78
80
  </Button>
79
81
  </TooltipTrigger>
80
82
  <TooltipContent side="right">
@@ -94,7 +96,7 @@ const api = useAPI();
94
96
  class="w-8 h-8 hover:!bg-sidebar-border"
95
97
  @click="api.store.dev.showConsoleBar = false"
96
98
  >
97
- <i-uil-down-arrow class="w-4 h-4" />
99
+ <ChevronDown class="w-4 h-4" />
98
100
  </Button>
99
101
  </TooltipTrigger>
100
102
  <TooltipContent side="right">
@@ -17,10 +17,10 @@
17
17
  * @property {object} 'ipad-13' iPad 13-inch dimensions
18
18
  * @property {object} desktop1 800x600 desktop resolution
19
19
  * @property {object} desktop2 1024x768 desktop resolution
20
- * @property {Object} desktop3 1280x1024 desktop resolution
21
- * @property {Object} desktop4 1440x900 desktop resolution
22
- * @property {Object} desktop5 1600x1200 desktop resolution
23
- * @property {Object} desktop16 1920x1080 desktop resolution
20
+ * @property {object} desktop3 1280x1024 desktop resolution
21
+ * @property {object} desktop4 1440x900 desktop resolution
22
+ * @property {object} desktop5 1600x1200 desktop resolution
23
+ * @property {object} desktop16 1920x1080 desktop resolution
24
24
  */
25
25
  export const devicePresets: {
26
26
  iphone: {