Refine item form and preview

- Item form: subtitle + fields grouped into hairline-separated labeled
  sections (Basics / Alerts / Schedule and marketplaces / Filters /
  Advanced) instead of one flat card; refined Advanced summary.
- Preview: refined headings; best-price hero keeps a 160px product image;
  Other results becomes a thumbnailed feed via the shared components.
- New .v-form-section-title helper.
This commit is contained in:
prosolis
2026-06-20 12:52:25 -07:00
parent 3760571d84
commit 90a74967e0
6 changed files with 209 additions and 206 deletions

View File

@@ -136,13 +136,16 @@ func newCategory(v string, known []string) string {
templ itemFormBody(d ItemFormData) {
<div>
<h1 class="v-page-title mb-6">
if d.IsEdit {
Edit { d.Item.Name }
} else {
Add item
}
</h1>
<div class="mb-6">
<h1 class="v-page-title">
if d.IsEdit {
Edit { d.Item.Name }
} else {
Add item
}
</h1>
<p class="v-page-sub">What to watch, where to look, and when to alert.</p>
</div>
if len(d.Errors) > 0 {
<div class="v-flash-error">
<ul class="list-disc pl-5">
@@ -167,9 +170,10 @@ templ itemFormInner(d ItemFormData) {
hx-indicator="#preview-loading"
hx-disabled-elt="find button[type='submit']"
}
class="v-card p-6 space-y-4 max-w-3xl"
class="v-card p-6 space-y-5 max-w-3xl"
>
@CSRFInput(d.CSRFToken)
<div class="v-form-section-title">Basics</div>
<div class="grid md:grid-cols-2 gap-4">
<div>
<label class="v-label">Name</label>
@@ -196,6 +200,8 @@ templ itemFormInner(d ItemFormData) {
<input class="v-input" name="url" value={ d.Item.URL }/>
<div class="v-muted text-xs mt-1">At least one of search queries or URL is required.</div>
</div>
<hr class="v-rule"/>
<div class="v-form-section-title">Alerts</div>
<div class="grid md:grid-cols-3 gap-4">
<div>
<label class="v-label">Target Price</label>
@@ -215,6 +221,8 @@ templ itemFormInner(d ItemFormData) {
</select>
</div>
</div>
<hr class="v-rule"/>
<div class="v-form-section-title">Schedule and marketplaces</div>
<div class="grid md:grid-cols-3 gap-4">
<div>
<label class="v-label">Poll Interval</label>
@@ -251,6 +259,8 @@ templ itemFormInner(d ItemFormData) {
</select>
</div>
</div>
<hr class="v-rule"/>
<div class="v-form-section-title">Filters</div>
<div class="grid md:grid-cols-2 gap-4">
<div>
<label class="v-label">Minimum Price</label>
@@ -287,8 +297,9 @@ templ itemFormInner(d ItemFormData) {
<input type="checkbox" name="include_out_of_stock" checked?={ d.Item.IncludeOutOfStock } value="1"/>
<span>Include out-of-stock results</span>
</label>
<hr class="v-rule"/>
<details class="v-card-flat p-4">
<summary class="cursor-pointer font-semibold">Advanced</summary>
<summary class="cursor-pointer v-form-section-title">Advanced</summary>
<div class="v-muted text-sm mt-2">Leave blank to use the configured default for the selected marketplace.</div>
<div class="grid md:grid-cols-2 gap-4 mt-3">
<div>