agent-zero/webui/components/projects/project-edit-basic-data.html
frdel 93d1131ce1 Unify WebUI icons and fix message collapsing
Introduce the x-icon custom element and migrate first-party WebUI and bundled plugin markup while retaining legacy Material icon compatibility. Defer icon-font readiness until the splash-installed document is parsed so Firefox does not leave icons transparent. Centralize chat message collapse handling, avoid false Show More controls on short user messages, and align grouped-message pagination styling. Update DOX and add regression coverage for the icon and collapse behavior.
2026-07-31 13:32:41 +00:00

372 lines
No EOL
13 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<html>
<head>
<title>Project basic data</title>
<script type="module">
import { store } from "/components/projects/projects-store.js";
</script>
</head>
<body>
<div x-data>
<template x-if="$store.projects && $store.projects.selectedProject">
<div>
<template x-if="!$store.projects.selectedProject._meta.creating">
<div class="projects-form-group">
<label class="projects-form-label">Folder name</label>
<span class="projects-form-description">Project files and settings are located in
<strong><span
x-text="$store.projects.getSelectedAbsPath()"></span></strong></span>
<div class="projects-input-with-button-wrapper">
<input class="projects-form-input projects-disabled" type="text" x-model="$store.projects.selectedProject.name" disabled>
<button class="button icon-button" @click="$store.projects.browseSelected()">
<x-icon class="icon" name="folder"></x-icon>
<span>Browse</span>
</button>
</div>
</div>
</template>
<div class="projects-form-group">
<label class="projects-form-label">Title</label>
<span class="projects-form-description">Title and description are visible to both you and the agent
and can help it understand the project.</span>
<input class="projects-form-input" type="text" x-model="$store.projects.selectedProject.title"
placeholder="Optional title">
</div>
<!-- <div class="projects-form-group">
<label class="projects-form-label">Description</label>
<textarea class="projects-form-textarea" x-model="$store.projects.selectedProject.description"
rows="5" placeholder="Optional description"></textarea>
</div> -->
<div class="projects-form-group">
<label class="projects-form-label">Color</label>
<div class="projects-color-row">
<div class="projects-color-ball projects-color-none"
:class="{'selected': !$store.projects.selectedProject.color}"
@click="$store.projects.selectedProject.color = ''">
<span class="projects-color-x">×</span>
</div>
<template x-for="c in $store.projects.colors" :key="c">
<div class="projects-color-ball" :style="`background:${c}`"
:class="{'selected': $store.projects.selectedProject.color === c}"
@click="$store.projects.selectedProject.color = c">
</div>
</template>
</div>
</div>
<!-- Git Status Section -->
<template x-if="!$store.projects.selectedProject._meta.creating && $store.projects.selectedProject.git_status?.is_git_repo">
<div class="projects-form-group git-status-section">
<label class="projects-form-label">
<x-icon class="git-icon" name="commit"></x-icon>
Git Status
</label>
<div class="git-status-card">
<!-- Repository URL -->
<template x-if="$store.projects.selectedProject.git_status.remote_url">
<div class="git-status-row">
<span class="git-status-label">
<x-icon name="link"></x-icon>
Repository
</span>
<div class="git-status-value-with-action">
<span class="git-status-value git-url" x-text="$store.projects.selectedProject.git_status.remote_url"></span>
<a class="git-action-link" :href="$store.projects.selectedProject.git_status.remote_url" target="_blank" rel="noopener noreferrer" title="Open in browser">
<x-icon name="open_in_new"></x-icon>
</a>
</div>
</div>
</template>
<!-- Branch -->
<div class="git-status-row">
<span class="git-status-label">
<x-icon name="fork_right"></x-icon>
Branch
</span>
<span class="git-status-value git-branch" x-text="$store.projects.selectedProject.git_status.current_branch"></span>
</div>
<!-- Status -->
<div class="git-status-row">
<span class="git-status-label">
<x-icon name="info"></x-icon>
Status
</span>
<span class="git-status-value"
:class="$store.projects.selectedProject.git_status.is_dirty ? 'git-dirty' : 'git-clean'">
<template x-if="!$store.projects.selectedProject.git_status.is_dirty">
<span>✓ Clean</span>
</template>
<template x-if="$store.projects.selectedProject.git_status.is_dirty">
<span>
● Has uncommitted changes
<template x-if="$store.projects.selectedProject.git_status.untracked_count > 0">
<span x-text="'(' + $store.projects.selectedProject.git_status.untracked_count + ' untracked)'"></span>
</template>
</span>
</template>
</span>
</div>
<!-- Last Commit -->
<template x-if="$store.projects.selectedProject.git_status.last_commit">
<div class="git-status-row">
<span class="git-status-label">
<x-icon name="history"></x-icon>
Last Commit
</span>
<div class="git-commit-info">
<span class="git-commit-hash" x-text="$store.projects.selectedProject.git_status.last_commit.hash"></span>
<span class="git-commit-message" x-text="$store.projects.selectedProject.git_status.last_commit.message"></span>
<span class="git-commit-meta">
by <span x-text="$store.projects.selectedProject.git_status.last_commit.author"></span>
on <span x-text="$store.projects.selectedProject.git_status.last_commit.date"></span>
</span>
</div>
</div>
</template>
</div>
</div>
</template>
</div>
</template>
</div>
</body>
<style>
.project-path {
font-size: 0.8em;
opacity: 0.7;
margin-top: 0.25em;
word-break: break-all;
}
.projects-form-group {
display: flex;
flex-direction: column;
gap: 0.35em;
margin-bottom: 0.8em;
}
.projects-form-label {
font-size: 1em;
font-weight: bolder;
opacity: 1;
margin-bottom: var(--spacing-sm);
}
.projects-form-description {
font-size: 0.8em;
margin-bottom: var(--spacing-xs);
}
.projects-form-input,
.projects-form-textarea,
.projects-form-select {
background: var(--color-input);
color: var(--color-text);
border: 1px solid var(--color-border);
border-radius: 0.375em;
padding: 0.5em 0.6em;
outline: none;
}
.projects-form-input:focus,
.projects-form-textarea:focus,
.projects-form-select:focus {
border-color: var(--color-primary);
background: var(--color-input-focus);
}
.projects-form-select {
cursor: pointer;
}
.projects-color-row {
display: flex;
gap: 0.5em;
align-items: center;
flex-wrap: wrap;
background: var(--color-input);
border: 1px solid var(--color-border);
border-radius: 0.5em;
padding: 0.75em 1em;
}
.projects-color-ball {
width: 24px;
height: 24px;
border-radius: 50%;
/* border: 2px solid var(--color-border); */
cursor: pointer;
box-shadow: none;
background-clip: padding-box;
transition: opacity 0.15s ease;
}
.projects-color-ball:hover {
opacity: 0.9;
}
.projects-color-ball.selected {
box-shadow: 0 0 0 2px var(--color-panel), 0 0 0 4px var(--color-primary);
}
.projects-color-none {
background: repeating-linear-gradient(45deg, transparent 0 6px, rgba(127, 127, 127, 0.12) 6px 12px);
display: flex;
align-items: center;
justify-content: center;
position: relative;
}
.projects-color-x {
font-size: 16px;
line-height: 1;
color: var(--color-text);
opacity: 0.7;
}
.projects-disabled {
opacity: 0.7;
}
.projects-input-with-button-wrapper {
display: flex;
gap: 0.5em;
align-items: center;
}
.projects-input-with-button-wrapper input {
flex-grow: 1;
}
@media (max-width: 640px) {
.projects-input-with-button-wrapper {
flex-direction: column;
align-items: stretch;
}
}
/* Git Status Styles */
.git-status-section .projects-form-label {
display: flex;
align-items: center;
gap: 0.5em;
}
.git-status-section .git-icon {
font-size: 1.2em;
color: var(--color-primary);
}
.git-status-card {
background: var(--color-input);
border: 1px solid var(--color-border);
border-radius: 0.5em;
padding: 0.75em 1em;
}
.git-status-row {
display: flex;
align-items: flex-start;
gap: 1em;
padding: 0.5em 0;
border-bottom: 1px solid var(--color-border);
}
.git-status-row:last-child {
border-bottom: none;
}
.git-status-label {
display: flex;
align-items: center;
gap: 0.4em;
min-width: 100px;
font-size: 0.85em;
color: var(--color-text-secondary, #888);
}
.git-status-label .material-symbols-outlined {
font-size: 1.1em;
}
.git-status-value {
flex: 1;
font-size: 0.9em;
word-break: break-all;
}
.git-status-value-with-action {
flex: 1;
display: flex;
align-items: center;
gap: 0.5em;
}
.git-action-link {
color: var(--color-primary);
opacity: 0.7;
transition: opacity 0.15s;
}
.git-action-link:hover {
opacity: 1;
}
.git-action-link .material-symbols-outlined {
font-size: 1.1em;
}
.git-url {
font-family: monospace;
font-size: 0.85em;
opacity: 0.9;
}
.git-branch {
font-family: monospace;
color: var(--color-primary);
font-weight: 500;
}
.git-clean {
color: #22c55e;
}
.git-dirty {
color: #f59e0b;
}
.git-commit-info {
display: flex;
flex-direction: column;
gap: 0.2em;
}
.git-commit-hash {
font-family: monospace;
color: var(--color-primary);
font-size: 0.9em;
}
.git-commit-message {
font-size: 0.9em;
}
.git-commit-meta {
font-size: 0.8em;
opacity: 0.7;
}
</style>
</html>