@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.
- package/dist/module.json +1 -1
- package/dist/module.mjs +109 -21
- package/dist/runtime/components/builtins/AdvertisementView.d.vue.ts +13 -1
- package/dist/runtime/components/builtins/AdvertisementView.vue +7 -3
- package/dist/runtime/components/builtins/AdvertisementView.vue.d.ts +13 -1
- package/dist/runtime/components/builtins/DebriefView.vue +3 -1
- package/dist/runtime/components/builtins/DemographicSurveyView.vue +8 -6
- package/dist/runtime/components/builtins/DeviceSurveyView.vue +5 -3
- package/dist/runtime/components/builtins/ExpView.vue +4 -2
- package/dist/runtime/components/builtins/ExperimentStatusBar.vue +3 -0
- package/dist/runtime/components/builtins/FavoriteColor.vue +3 -1
- package/dist/runtime/components/builtins/FavoriteNumber.vue +3 -1
- package/dist/runtime/components/builtins/InformedConsentModal.vue +5 -3
- package/dist/runtime/components/builtins/InformedConsentView.vue +3 -2
- package/dist/runtime/components/builtins/InstructionsQuiz.vue +7 -5
- package/dist/runtime/components/builtins/InstructionsView.vue +5 -3
- package/dist/runtime/components/builtins/LocalDevBanner.vue +16 -0
- package/dist/runtime/components/builtins/MTurkRecruitView.vue +4 -3
- package/dist/runtime/components/builtins/PresentationModeView.vue +9 -8
- package/dist/runtime/components/builtins/StatusBar.vue +7 -4
- package/dist/runtime/components/builtins/StudyPreviewText.vue +12 -10
- package/dist/runtime/components/builtins/TaskFeedbackSurveyView.vue +3 -1
- package/dist/runtime/components/builtins/ThanksView.vue +22 -21
- package/dist/runtime/components/builtins/WindowSizerView.vue +5 -3
- package/dist/runtime/components/builtins/WithdrawModal.vue +9 -7
- package/dist/runtime/components/builtins/WithdrawView.vue +4 -2
- package/dist/runtime/components/dev/RecruitmentChooserView.vue +532 -224
- package/dist/runtime/components/dev/ResponsiveDeviceContainer.vue +17 -8
- package/dist/runtime/components/dev/SmileDevPresentationView.vue +83 -0
- package/dist/runtime/components/dev/console/ConfigList.vue +14 -11
- package/dist/runtime/components/dev/console/ConsoleConfigPanel.vue +28 -7
- package/dist/runtime/components/dev/console/ConsoleDatabaseBrowsePanel.vue +6 -4
- package/dist/runtime/components/dev/console/ConsoleLogPanel.vue +68 -23
- package/dist/runtime/components/dev/console/DatabaseList.vue +9 -7
- package/dist/runtime/components/dev/console/SmileDevConsole.vue +7 -5
- package/dist/runtime/components/dev/devicePresets.d.ts +4 -4
- package/dist/runtime/components/dev/devicePresets.js +4 -4
- package/dist/runtime/components/dev/menu/DevConfigPanel.vue +3 -1
- package/dist/runtime/components/dev/menu/ResponsiveDeviceSelect.vue +1 -0
- package/dist/runtime/components/dev/menu/SmileDevAppMenu.vue +27 -24
- package/dist/runtime/components/dev/navbar/ColorModeButton.vue +5 -3
- package/dist/runtime/components/dev/navbar/DatabaseButtonGroup.vue +8 -6
- package/dist/runtime/components/dev/navbar/FullScreenButton.vue +4 -2
- package/dist/runtime/components/dev/navbar/KeyCommandNotification.vue +1 -1
- package/dist/runtime/components/dev/navbar/PanelButtonGroup.d.vue.ts +3 -0
- package/dist/runtime/components/dev/navbar/PanelButtonGroup.vue +79 -0
- package/dist/runtime/components/dev/navbar/PanelButtonGroup.vue.d.ts +3 -0
- package/dist/runtime/components/dev/navbar/ReloadButton.vue +3 -1
- package/dist/runtime/components/dev/navbar/ResetButton.vue +3 -1
- package/dist/runtime/components/dev/navbar/RouteJumper.vue +9 -5
- package/dist/runtime/components/dev/navbar/SmileDevNavBar.vue +19 -27
- package/dist/runtime/components/dev/navbar/StepInfoButtonGroup.vue +5 -3
- package/dist/runtime/components/dev/navbar/ViewInfoButtonGroup.vue +13 -10
- package/dist/runtime/components/dev/presentation/DarkModeButton.vue +5 -3
- package/dist/runtime/components/dev/presentation/LogoutButton.vue +2 -1
- package/dist/runtime/components/dev/presentation/PresentationModeResetButton.vue +11 -2
- package/dist/runtime/components/dev/presentation/PresentationNavBar.d.vue.ts +13 -1
- package/dist/runtime/components/dev/presentation/PresentationNavBar.vue +13 -6
- package/dist/runtime/components/dev/presentation/PresentationNavBar.vue.d.ts +13 -1
- package/dist/runtime/components/dev/presentation/QRCodeButton.vue +4 -2
- package/dist/runtime/components/dev/sidebar/AppProgressPanel.vue +23 -21
- package/dist/runtime/components/dev/sidebar/ConfigurationVariablesPanel.vue +7 -5
- package/dist/runtime/components/dev/sidebar/DatabaseStatusInfoPanel.vue +27 -7
- package/dist/runtime/components/dev/sidebar/RandomizationSidebarPanel.vue +9 -5
- package/dist/runtime/components/dev/sidebar/SmileDevSideBar.vue +12 -5
- package/dist/runtime/components/dev/sidebar/StepDataViewer.d.vue.ts +2 -2
- package/dist/runtime/components/dev/sidebar/StepDataViewer.vue +1 -1
- package/dist/runtime/components/dev/sidebar/StepDataViewer.vue.d.ts +2 -2
- package/dist/runtime/components/dev/sidebar/StepExplorerPanel.vue +13 -8
- package/dist/runtime/components/dev/sidebar/StepNode.vue +7 -5
- package/dist/runtime/components/dev/sidebar/StudyInfoPanel.vue +3 -2
- package/dist/runtime/components/forms/MonthYearDayPicker.vue +1 -0
- package/dist/runtime/components/layouts/ConstrainedPage.d.vue.ts +1 -1
- package/dist/runtime/components/layouts/ConstrainedPage.vue.d.ts +1 -1
- package/dist/runtime/components/layouts/ConstrainedTaskWindow.d.vue.ts +2 -2
- package/dist/runtime/components/layouts/ConstrainedTaskWindow.vue +1 -1
- package/dist/runtime/components/layouts/ConstrainedTaskWindow.vue.d.ts +2 -2
- package/dist/runtime/components/layouts/TitleTwoCol.d.vue.ts +1 -1
- package/dist/runtime/components/layouts/TitleTwoCol.vue.d.ts +1 -1
- package/dist/runtime/components/layouts/TwoCol.d.vue.ts +1 -1
- package/dist/runtime/components/layouts/TwoCol.vue.d.ts +1 -1
- package/dist/runtime/components/ui/avatar/Avatar.vue +1 -0
- package/dist/runtime/components/ui/avatar/AvatarFallback.vue +1 -0
- package/dist/runtime/components/ui/badge/Badge.vue +1 -0
- package/dist/runtime/components/ui/badge/index.d.ts +1 -1
- package/dist/runtime/components/ui/breadcrumb/BreadcrumbEllipsis.vue +1 -0
- package/dist/runtime/components/ui/breadcrumb/BreadcrumbItem.vue +1 -0
- package/dist/runtime/components/ui/breadcrumb/BreadcrumbLink.vue +1 -0
- package/dist/runtime/components/ui/breadcrumb/BreadcrumbList.vue +1 -0
- package/dist/runtime/components/ui/breadcrumb/BreadcrumbPage.vue +1 -0
- package/dist/runtime/components/ui/breadcrumb/BreadcrumbSeparator.vue +1 -0
- package/dist/runtime/components/ui/button/Button.vue +1 -0
- package/dist/runtime/components/ui/button/index.d.ts +2 -2
- package/dist/runtime/components/ui/button-group/ButtonGroup.vue +1 -0
- package/dist/runtime/components/ui/button-group/ButtonGroupItem.vue +1 -0
- package/dist/runtime/components/ui/calendar/Calendar.vue +1 -0
- package/dist/runtime/components/ui/calendar/CalendarCell.vue +1 -0
- package/dist/runtime/components/ui/calendar/CalendarCellTrigger.vue +1 -0
- package/dist/runtime/components/ui/calendar/CalendarGrid.vue +1 -0
- package/dist/runtime/components/ui/calendar/CalendarGridRow.vue +1 -0
- package/dist/runtime/components/ui/calendar/CalendarHeadCell.vue +1 -0
- package/dist/runtime/components/ui/calendar/CalendarHeader.vue +1 -0
- package/dist/runtime/components/ui/calendar/CalendarHeading.vue +1 -0
- package/dist/runtime/components/ui/calendar/CalendarNextButton.vue +1 -0
- package/dist/runtime/components/ui/calendar/CalendarPrevButton.vue +1 -0
- package/dist/runtime/components/ui/card/Card.vue +1 -0
- package/dist/runtime/components/ui/card/CardAction.vue +1 -0
- package/dist/runtime/components/ui/card/CardContent.vue +1 -0
- package/dist/runtime/components/ui/card/CardDescription.vue +1 -0
- package/dist/runtime/components/ui/card/CardFooter.vue +1 -0
- package/dist/runtime/components/ui/card/CardHeader.vue +1 -0
- package/dist/runtime/components/ui/card/CardTitle.vue +1 -0
- package/dist/runtime/components/ui/checkbox/Checkbox.d.vue.ts +6 -6
- package/dist/runtime/components/ui/checkbox/Checkbox.vue +1 -0
- package/dist/runtime/components/ui/checkbox/Checkbox.vue.d.ts +6 -6
- package/dist/runtime/components/ui/checkbox/index.d.ts +2 -2
- package/dist/runtime/components/ui/dropdown-menu/DropdownMenuCheckboxItem.d.vue.ts +4 -4
- package/dist/runtime/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +1 -0
- package/dist/runtime/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue.d.ts +4 -4
- package/dist/runtime/components/ui/dropdown-menu/DropdownMenuContent.d.vue.ts +3 -3
- package/dist/runtime/components/ui/dropdown-menu/DropdownMenuContent.vue +1 -0
- package/dist/runtime/components/ui/dropdown-menu/DropdownMenuContent.vue.d.ts +3 -3
- package/dist/runtime/components/ui/dropdown-menu/DropdownMenuItem.d.vue.ts +1 -1
- package/dist/runtime/components/ui/dropdown-menu/DropdownMenuItem.vue +1 -0
- package/dist/runtime/components/ui/dropdown-menu/DropdownMenuItem.vue.d.ts +1 -1
- package/dist/runtime/components/ui/dropdown-menu/DropdownMenuLabel.vue +1 -0
- package/dist/runtime/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +1 -0
- package/dist/runtime/components/ui/dropdown-menu/DropdownMenuSeparator.vue +1 -0
- package/dist/runtime/components/ui/dropdown-menu/DropdownMenuShortcut.vue +1 -0
- package/dist/runtime/components/ui/dropdown-menu/DropdownMenuSubContent.d.vue.ts +3 -3
- package/dist/runtime/components/ui/dropdown-menu/DropdownMenuSubContent.vue +1 -0
- package/dist/runtime/components/ui/dropdown-menu/DropdownMenuSubContent.vue.d.ts +3 -3
- package/dist/runtime/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +1 -0
- package/dist/runtime/components/ui/input/Input.d.vue.ts +4 -4
- package/dist/runtime/components/ui/input/Input.vue +1 -0
- package/dist/runtime/components/ui/input/Input.vue.d.ts +4 -4
- package/dist/runtime/components/ui/label/Label.vue +1 -0
- package/dist/runtime/components/ui/multiselect/MultiSelect.d.vue.ts +1 -1
- package/dist/runtime/components/ui/multiselect/MultiSelect.vue +1 -0
- package/dist/runtime/components/ui/multiselect/MultiSelect.vue.d.ts +1 -1
- package/dist/runtime/components/ui/pagination/Pagination.vue +1 -0
- package/dist/runtime/components/ui/pagination/PaginationContent.vue +1 -0
- package/dist/runtime/components/ui/pagination/PaginationEllipsis.vue +1 -0
- package/dist/runtime/components/ui/pagination/PaginationFirst.vue +1 -0
- package/dist/runtime/components/ui/pagination/PaginationItem.vue +1 -0
- package/dist/runtime/components/ui/pagination/PaginationLast.vue +1 -0
- package/dist/runtime/components/ui/pagination/PaginationNext.vue +1 -0
- package/dist/runtime/components/ui/pagination/PaginationPrevious.vue +1 -0
- package/dist/runtime/components/ui/popover/PopoverContent.d.vue.ts +2 -2
- package/dist/runtime/components/ui/popover/PopoverContent.vue +1 -0
- package/dist/runtime/components/ui/popover/PopoverContent.vue.d.ts +2 -2
- package/dist/runtime/components/ui/progress/Progress.vue +1 -0
- package/dist/runtime/components/ui/resizable/ResizableHandle.vue +1 -0
- package/dist/runtime/components/ui/resizable/ResizablePanel.d.vue.ts +1 -1
- package/dist/runtime/components/ui/resizable/ResizablePanel.vue.d.ts +1 -1
- package/dist/runtime/components/ui/resizable/ResizablePanelGroup.vue +1 -0
- package/dist/runtime/components/ui/select/Select.d.vue.ts +1 -1
- package/dist/runtime/components/ui/select/Select.vue.d.ts +1 -1
- package/dist/runtime/components/ui/select/SelectContent.d.vue.ts +2 -2
- package/dist/runtime/components/ui/select/SelectContent.vue +1 -0
- package/dist/runtime/components/ui/select/SelectContent.vue.d.ts +2 -2
- package/dist/runtime/components/ui/select/SelectItem.vue +1 -0
- package/dist/runtime/components/ui/select/SelectLabel.vue +1 -0
- package/dist/runtime/components/ui/select/SelectScrollDownButton.vue +1 -0
- package/dist/runtime/components/ui/select/SelectScrollUpButton.vue +1 -0
- package/dist/runtime/components/ui/select/SelectSeparator.vue +1 -0
- package/dist/runtime/components/ui/select/SelectTrigger.vue +1 -0
- package/dist/runtime/components/ui/separator/Separator.vue +1 -0
- package/dist/runtime/components/ui/sheet/SheetContent.d.vue.ts +1 -1
- package/dist/runtime/components/ui/sheet/SheetContent.vue +1 -0
- package/dist/runtime/components/ui/sheet/SheetContent.vue.d.ts +1 -1
- package/dist/runtime/components/ui/sheet/SheetDescription.vue +1 -0
- package/dist/runtime/components/ui/sheet/SheetFooter.vue +1 -0
- package/dist/runtime/components/ui/sheet/SheetHeader.vue +1 -0
- package/dist/runtime/components/ui/sheet/SheetOverlay.vue +1 -0
- package/dist/runtime/components/ui/sheet/SheetTitle.vue +1 -0
- package/dist/runtime/components/ui/sidebar/Sidebar.d.vue.ts +1 -1
- package/dist/runtime/components/ui/sidebar/Sidebar.vue +1 -0
- package/dist/runtime/components/ui/sidebar/Sidebar.vue.d.ts +1 -1
- package/dist/runtime/components/ui/sidebar/SidebarContent.vue +1 -0
- package/dist/runtime/components/ui/sidebar/SidebarFooter.vue +1 -0
- package/dist/runtime/components/ui/sidebar/SidebarGroup.vue +1 -0
- package/dist/runtime/components/ui/sidebar/SidebarGroupAction.vue +1 -0
- package/dist/runtime/components/ui/sidebar/SidebarGroupContent.vue +1 -0
- package/dist/runtime/components/ui/sidebar/SidebarGroupLabel.vue +1 -0
- package/dist/runtime/components/ui/sidebar/SidebarHeader.vue +1 -0
- package/dist/runtime/components/ui/sidebar/SidebarInput.vue +1 -0
- package/dist/runtime/components/ui/sidebar/SidebarInset.vue +1 -0
- package/dist/runtime/components/ui/sidebar/SidebarMenu.vue +1 -0
- package/dist/runtime/components/ui/sidebar/SidebarMenuAction.vue +1 -0
- package/dist/runtime/components/ui/sidebar/SidebarMenuBadge.vue +1 -0
- package/dist/runtime/components/ui/sidebar/SidebarMenuButton.d.vue.ts +1 -1
- package/dist/runtime/components/ui/sidebar/SidebarMenuButton.vue.d.ts +1 -1
- package/dist/runtime/components/ui/sidebar/SidebarMenuButtonChild.d.vue.ts +1 -1
- package/dist/runtime/components/ui/sidebar/SidebarMenuButtonChild.vue +1 -0
- package/dist/runtime/components/ui/sidebar/SidebarMenuButtonChild.vue.d.ts +1 -1
- package/dist/runtime/components/ui/sidebar/SidebarMenuItem.vue +1 -0
- package/dist/runtime/components/ui/sidebar/SidebarMenuSkeleton.vue +1 -0
- package/dist/runtime/components/ui/sidebar/SidebarMenuSub.vue +1 -0
- package/dist/runtime/components/ui/sidebar/SidebarMenuSubButton.vue +1 -0
- package/dist/runtime/components/ui/sidebar/SidebarMenuSubItem.vue +1 -0
- package/dist/runtime/components/ui/sidebar/SidebarProvider.vue +1 -0
- package/dist/runtime/components/ui/sidebar/SidebarRail.vue +1 -0
- package/dist/runtime/components/ui/sidebar/SidebarSeparator.vue +1 -0
- package/dist/runtime/components/ui/sidebar/SidebarTrigger.vue +1 -0
- package/dist/runtime/components/ui/sidebar/index.d.ts +1 -1
- package/dist/runtime/components/ui/skeleton/Skeleton.vue +1 -0
- package/dist/runtime/components/ui/sonner/Sonner.d.vue.ts +4 -4
- package/dist/runtime/components/ui/sonner/Sonner.vue.d.ts +4 -4
- package/dist/runtime/components/ui/stepper/Stepper.vue +1 -0
- package/dist/runtime/components/ui/stepper/StepperDescription.vue +1 -0
- package/dist/runtime/components/ui/stepper/StepperIndicator.vue +1 -0
- package/dist/runtime/components/ui/stepper/StepperItem.d.vue.ts +1 -1
- package/dist/runtime/components/ui/stepper/StepperItem.vue +1 -0
- package/dist/runtime/components/ui/stepper/StepperItem.vue.d.ts +1 -1
- package/dist/runtime/components/ui/stepper/StepperSeparator.vue +1 -0
- package/dist/runtime/components/ui/stepper/StepperTitle.vue +1 -0
- package/dist/runtime/components/ui/stepper/StepperTrigger.vue +1 -0
- package/dist/runtime/components/ui/switch/Switch.d.vue.ts +2 -2
- package/dist/runtime/components/ui/switch/Switch.vue +1 -0
- package/dist/runtime/components/ui/switch/Switch.vue.d.ts +2 -2
- package/dist/runtime/components/ui/switch/index.d.ts +2 -2
- package/dist/runtime/components/ui/table/Table.vue +1 -0
- package/dist/runtime/components/ui/table/TableBody.vue +1 -0
- package/dist/runtime/components/ui/table/TableCaption.vue +1 -0
- package/dist/runtime/components/ui/table/TableCell.vue +1 -0
- package/dist/runtime/components/ui/table/TableEmpty.vue +1 -0
- package/dist/runtime/components/ui/table/TableFooter.vue +1 -0
- package/dist/runtime/components/ui/table/TableHead.vue +1 -0
- package/dist/runtime/components/ui/table/TableHeader.vue +1 -0
- package/dist/runtime/components/ui/table/TableRow.vue +1 -0
- package/dist/runtime/components/ui/tabs/Tabs.vue +1 -0
- package/dist/runtime/components/ui/tabs/TabsContent.d.vue.ts +2 -2
- package/dist/runtime/components/ui/tabs/TabsContent.vue +1 -0
- package/dist/runtime/components/ui/tabs/TabsContent.vue.d.ts +2 -2
- package/dist/runtime/components/ui/tabs/TabsList.d.vue.ts +1 -1
- package/dist/runtime/components/ui/tabs/TabsList.vue +1 -0
- package/dist/runtime/components/ui/tabs/TabsList.vue.d.ts +1 -1
- package/dist/runtime/components/ui/tabs/TabsTrigger.d.vue.ts +2 -2
- package/dist/runtime/components/ui/tabs/TabsTrigger.vue +1 -0
- package/dist/runtime/components/ui/tabs/TabsTrigger.vue.d.ts +2 -2
- package/dist/runtime/components/ui/tags-input/TagsInput.d.vue.ts +3 -3
- package/dist/runtime/components/ui/tags-input/TagsInput.vue +1 -0
- package/dist/runtime/components/ui/tags-input/TagsInput.vue.d.ts +3 -3
- package/dist/runtime/components/ui/tags-input/TagsInputInput.vue +1 -0
- package/dist/runtime/components/ui/tags-input/TagsInputItem.d.vue.ts +2 -2
- package/dist/runtime/components/ui/tags-input/TagsInputItem.vue +1 -0
- package/dist/runtime/components/ui/tags-input/TagsInputItem.vue.d.ts +2 -2
- package/dist/runtime/components/ui/tags-input/TagsInputItemDelete.vue +1 -0
- package/dist/runtime/components/ui/tags-input/TagsInputItemText.vue +1 -0
- package/dist/runtime/components/ui/textarea/Textarea.d.vue.ts +4 -4
- package/dist/runtime/components/ui/textarea/Textarea.vue +1 -0
- package/dist/runtime/components/ui/textarea/Textarea.vue.d.ts +4 -4
- package/dist/runtime/components/ui/toggle/Toggle.d.vue.ts +2 -2
- package/dist/runtime/components/ui/toggle/Toggle.vue +1 -0
- package/dist/runtime/components/ui/toggle/Toggle.vue.d.ts +2 -2
- package/dist/runtime/components/ui/toggle/index.d.ts +1 -1
- package/dist/runtime/components/ui/toggle-group/ToggleGroup.d.vue.ts +2 -2
- package/dist/runtime/components/ui/toggle-group/ToggleGroup.vue +1 -0
- package/dist/runtime/components/ui/toggle-group/ToggleGroup.vue.d.ts +2 -2
- package/dist/runtime/components/ui/toggle-group/ToggleGroupItem.vue +1 -0
- package/dist/runtime/components/ui/tooltip/TooltipContent.d.vue.ts +2 -2
- package/dist/runtime/components/ui/tooltip/TooltipContent.vue +1 -0
- package/dist/runtime/components/ui/tooltip/TooltipContent.vue.d.ts +2 -2
- package/dist/runtime/composables/useAPI.d.ts +2 -2
- package/dist/runtime/composables/useAPI.js +6 -11
- package/dist/runtime/composables/useViewAPI.d.ts +1 -0
- package/dist/runtime/composables/useViewAPI.js +20 -4
- package/dist/runtime/composables/useWindowSizer.d.ts +14 -0
- package/dist/runtime/composables/useWindowSizer.js +48 -0
- package/dist/runtime/core/config.d.ts +78 -48
- package/dist/runtime/core/config.js +21 -27
- package/dist/runtime/core/stepper/Stepper.d.ts +13 -10
- package/dist/runtime/core/stepper/Stepper.js +70 -55
- package/dist/runtime/core/stepper/StepperSerializer.js +32 -14
- package/dist/runtime/core/timeline/Timeline.js +1 -2
- package/dist/runtime/css/main.css +1 -1
- package/dist/runtime/css/smile.css +1 -1
- package/dist/runtime/layouts/development.vue +38 -78
- package/dist/runtime/layouts/experiment.d.vue.ts +7 -10
- package/dist/runtime/layouts/experiment.vue +13 -0
- package/dist/runtime/layouts/experiment.vue.d.ts +7 -10
- package/dist/runtime/layouts/presentation.vue +24 -3
- package/dist/runtime/middleware/timeline.global.js +2 -4
- package/dist/runtime/pages/[...slug].vue +2 -0
- package/dist/runtime/pages/dev/[...slug].vue +2 -0
- package/dist/runtime/pages/dev-login.vue +5 -3
- package/dist/runtime/pages/presentation/[...slug].vue +2 -0
- package/dist/runtime/plugins/dev-sync.client.js +0 -2
- package/dist/runtime/plugins/seed.client.js +1 -3
- package/dist/runtime/plugins/store-sync.client.js +8 -10
- package/dist/runtime/public/images/helpus.png +0 -0
- package/dist/runtime/public/images/smile.svg +78 -0
- package/dist/runtime/public/images/universitylogo.png +0 -0
- package/dist/runtime/server/api/auth/login.post.js +11 -2
- package/dist/runtime/server/api/db-info.get.d.ts +5 -0
- package/dist/runtime/server/api/db-info.get.js +10 -0
- package/dist/runtime/server/api/qr.get.js +1 -2
- package/dist/runtime/server/middleware/dev-auth.js +10 -5
- package/dist/runtime/stores/log.js +4 -7
- package/dist/runtime/stores/smilestore.d.ts +161 -1014
- package/dist/runtime/stores/smilestore.js +39 -7
- package/dist/runtime/utils/utils.js +7 -0
- package/package.json +5 -3
- package/dist/runtime/components/dev/navbar/ViewButton.vue +0 -159
- package/dist/runtime/pages/info.vue +0 -462
- /package/dist/runtime/components/{dev/navbar/ViewButton.d.vue.ts → builtins/LocalDevBanner.d.vue.ts} +0 -0
- /package/dist/runtime/components/{dev/navbar/ViewButton.vue.d.ts → builtins/LocalDevBanner.vue.d.ts} +0 -0
- /package/dist/runtime/{pages/info.d.vue.ts → components/dev/SmileDevPresentationView.d.vue.ts} +0 -0
- /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 {
|
|
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:
|
|
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
|
-
<
|
|
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
|
-
<
|
|
150
|
-
<
|
|
151
|
-
<
|
|
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
|
-
<
|
|
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
|
|
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
|
|
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 (
|
|
30
|
-
|
|
31
|
-
|
|
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-
|
|
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
|
-
<
|
|
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-
|
|
88
|
-
'focus:outline-none focus:ring-1 focus:ring-
|
|
89
|
-
key === props.selected ? 'bg-
|
|
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
|
-
<
|
|
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
|
|
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-
|
|
89
|
+
<Breadcrumb class="bg-muted border-b border-dev-lines px-3 py-2 font-mono">
|
|
72
90
|
<BreadcrumbList>
|
|
73
|
-
<template
|
|
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
|
-
<
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
<
|
|
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-
|
|
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-
|
|
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-
|
|
35
|
+
return "log-bg-warn";
|
|
33
36
|
case "error":
|
|
34
|
-
return "bg-
|
|
37
|
+
return "log-bg-error";
|
|
35
38
|
case "debug":
|
|
36
39
|
return "bg-muted text-muted-foreground";
|
|
37
40
|
case "success":
|
|
38
|
-
return "bg-
|
|
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-
|
|
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
|
|
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-
|
|
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
|
-
<
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
<
|
|
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="/
|
|
182
|
+
:src="'/firebase-bw.svg'"
|
|
162
183
|
width="15"
|
|
163
184
|
>
|
|
164
|
-
<
|
|
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
|
|
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-
|
|
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
|
-
<
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
<
|
|
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="/
|
|
244
|
+
:src="'/firebase-bw.svg'"
|
|
203
245
|
width="15"
|
|
204
246
|
>
|
|
205
|
-
<
|
|
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-
|
|
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-
|
|
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
|
-
<
|
|
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-
|
|
92
|
-
'focus:outline-none focus:ring-1 focus:ring-
|
|
93
|
-
key === props.selected ? 'bg-
|
|
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
|
-
<
|
|
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
|
|
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-
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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 {
|
|
21
|
-
* @property {
|
|
22
|
-
* @property {
|
|
23
|
-
* @property {
|
|
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: {
|