main
html 84 lines 4.1 KB
Raw
1 <html>
2
3 <head>
4 <script type="module">
5 import { store as projectsStore } from "/components/projects/projects-store.js";
6 import { store as chatsStore } from "/components/sidebar/chats/chats-store.js";
7 </script>
8 </head>
9
10 <body>
11 <div x-data="{ open: false }" @click.outside="open = false" @keydown.escape.window="open = false" class="dropdown project-dropdown-container">
12 <template x-if="$store.projects && $store.chats && $store.chats.selectedContext">
13 <div>
14 <template x-if="$store.chats.selectedContext.project?.name">
15 <button @click="open = !open" type="button" class="button project-dropdown-button">
16 <span class="project-color-ball" :style="$store.chats.selectedContext.project.color ? { backgroundColor: $store.chats.selectedContext.project.color } : { border: '1px solid var(--color-border)' }"></span>
17 <span x-text="$store.chats.selectedContext.project.title"></span>
18 <x-icon class="icon" name="arrow_drop_down"></x-icon>
19 </button>
20 </template>
21 <template x-if="!$store.chats.selectedContext.project?.name">
22 <button @click="open = !open" type="button" class="button project-dropdown-button">
23 No project
24 <x-icon class="icon" name="arrow_drop_down"></x-icon>
25 </button>
26 </template>
27
28 <div x-show="open" x-init="$store.projects.loadProjectsList()" class="dropdown-menu" style="display: none;" x-transition>
29 <button type="button" @click="$store.projects.openProjectsModal(); open = false;" class="dropdown-item">
30 <x-icon class="icon" name="snippet_folder"></x-icon>
31 <span>Projects</span>
32 </button>
33
34 <button type="button" x-show="$store.chats.selectedContext.project?.name" @click="$store.projects.editActiveProject(); open = false;" class="dropdown-item">
35 <x-icon class="icon" name="edit"></x-icon>
36 <span>Edit <span x-text="$store.chats.selectedContext.project?.title"></span></span>
37 </button>
38
39 <button type="button" x-show="$store.chats.selectedContext.project?.name" @click="$store.projects.deactivateProject(); open = false;" class="dropdown-item">
40 <x-icon class="icon" name="close"></x-icon>
41 <span>Deactivate</span>
42 </button>
43
44 <div x-show="$store.projects.projectList.length > 0" class="dropdown-separator"></div>
45 <div x-show="$store.projects.projectList.length > 0" class="dropdown-header">Switch Project</div>
46
47 <template x-for="project in $store.projects.projectList" :key="project.name">
48 <button type="button" @click="$store.projects.activateProject(project.name); open = false;" class="dropdown-item">
49 <span class="project-color-ball" :style="project.color ? { backgroundColor: project.color } : { border: '1px solid var(--color-border)' }"></span>
50 <span x-text="project.title"></span>
51 </button>
52 </template>
53 </div>
54 </div>
55 </template>
56 </div>
57 </body>
58
59 <style>
60 .project-dropdown-container {
61 position: relative;
62 }
63
64 .project-dropdown-button {
65 display: inline-flex;
66 align-items: center;
67 gap: 0.3em;
68 padding-left: 0.5em;
69 padding-right: 0.5em;
70 }
71
72 /* Keep the menu flush with the trigger so the pointer does not cross a tiny hover gap. */
73 .project-dropdown-container .dropdown-menu {
74 margin-top: 0;
75 top: calc(100% - 1px);
76 }
77
78 /* Override shared dropdown opacity here so project items do not look muted while hovering edges. */
79 .project-dropdown-container .dropdown-item,
80 .project-dropdown-container .dropdown-item .material-symbols-outlined {
81 opacity: 1;
82 }
83 </style>
84 </html>