PROFORMAS UDPATE

This commit is contained in:
David Arranz 2026-04-10 10:05:45 +02:00
parent 89ab94bb95
commit 2eab047e90
9 changed files with 304 additions and 269 deletions

View File

@ -176,9 +176,15 @@
"description": "Create a new customer proforma", "description": "Create a new customer proforma",
"back_to_list": "Back to the list" "back_to_list": "Back to the list"
}, },
"edit": { "update": {
"title": "Edit customer proforma", "title": "Edit customer proforma",
"description": "Edit the selected customer proforma" "description": "Edit the selected customer proforma",
"load_error.message": "Please try again later",
"load_error.title": "Unable to load the proforma",
"not_found_msg": "Check the identifier or go back to the list",
"not_found_title": "Proforma not found",
"error_msg": "Check the data and try again.",
"error_title": "Unable to save the changes"
}, },
"delete": { "delete": {
"title": "Delete customer proforma", "title": "Delete customer proforma",
@ -222,137 +228,141 @@
} }
}, },
"form_groups": { "form_groups": {
"customer": { "proformas": {
"title": "Customer", "customer": {
"description": "Select the customer for this proforma." "title": "Customer",
}, "description": "Select the customer for this proforma."
"items": { },
"title": "Proforma details", "items": {
"description": "" "title": "Proforma details",
}, "description": ""
"basic_info": { },
"title": "Proforma information", "basic_info": {
"description": "Basic proforma information" "title": "Proforma information",
}, "description": "Basic proforma information"
"totals": { },
"title": "Proforma totals", "totals": {
"description": "Breakdown of proforma amounts with discounts and taxes." "title": "Proforma totals",
}, "description": "Breakdown of proforma amounts with discounts and taxes."
"tax_resume": { },
"title": "Resumen de impuestos", "tax_resume": {
"description": "" "title": "Resumen de impuestos",
}, "description": ""
"preferences": { },
"title": "Preferences", "preferences": {
"description": "Additional proforma settings" "title": "Preferences",
"description": "Additional proforma settings"
}
} }
}, },
"form_fields": { "form_fields": {
"status": { "proformas": {
"label": "Estado", "status": {
"placeholder": "", "label": "Estado",
"description": ""
},
"invoice_number": {
"label": "Proforma number",
"placeholder": "",
"description": ""
},
"invoice_date": {
"label": "Proforma date",
"placeholder": "Select a date",
"description": "Proforma date"
},
"series": {
"label": "Serie",
"placeholder": "",
"description": "Proforma serie"
},
"operation_date": {
"label": "Operation date",
"placeholder": "Select a date",
"description": "Proforma operation date"
},
"reference": {
"label": "Reference",
"placeholder": "Reference of the proforma",
"description": "Reference of the proforma"
},
"description": {
"label": "Description",
"placeholder": "Description of the proforma",
"description": "General description of the proforma"
},
"subtotal_amount": {
"label": "Subtotal",
"placeholder": "",
"desc": "Proforma subtotal"
},
"discount": {
"label": "Discount (%)",
"placeholder": "",
"desc": "Percentage discount"
},
"discount_amount": {
"label": "Discount price",
"placeholder": "",
"desc": "Percentage discount price"
},
"total_amount": {
"label": "Total price",
"placeholder": "",
"desc": "Proforma total price"
},
"notes": {
"label": "Notes",
"placeholder": "Additional notes about the proforma",
"description": "Additional notes that can be included in the proforma"
},
"item": {
"quantity": {
"label": "Quantity",
"placeholder": "", "placeholder": "",
"description": "" "description": ""
}, },
"invoice_number": {
"label": "Proforma number",
"placeholder": "",
"description": ""
},
"invoice_date": {
"label": "Proforma date",
"placeholder": "Select a date",
"description": "Proforma date"
},
"series": {
"label": "Serie",
"placeholder": "",
"description": "Proforma serie"
},
"operation_date": {
"label": "Operation date",
"placeholder": "Select a date",
"description": "Proforma operation date"
},
"reference": {
"label": "Reference",
"placeholder": "Reference of the proforma",
"description": "Reference of the proforma"
},
"description": { "description": {
"label": "Description", "label": "Description",
"placeholder": "", "placeholder": "Description of the proforma",
"description": "" "description": "General description of the proforma"
}, },
"unit_amount": { "subtotal_amount": {
"label": "Unit price", "label": "Subtotal",
"placeholder": "", "placeholder": "",
"description": "Item unit price" "desc": "Proforma subtotal"
}, },
"discount_percentage": { "discount": {
"label": "Dto (%)", "label": "Discount (%)",
"placeholder": "", "placeholder": "",
"description": "Percentage discount" "desc": "Percentage discount"
}, },
"discount_amount": { "discount_amount": {
"label": "Discount amount", "label": "Discount price",
"placeholder": "", "placeholder": "",
"description": "Percentage discount amount" "desc": "Percentage discount price"
},
"taxable_amount": {
"label": "Taxable amount",
"placeholder": "",
"description": ""
},
"tax_codes": {
"label": "Taxes",
"placeholder": "",
"description": "Taxes"
},
"taxes_amount": {
"label": "Taxes amount",
"placeholder": "",
"description": "Percentage taxes amount"
}, },
"total_amount": { "total_amount": {
"label": "Total amount", "label": "Total price",
"placeholder": "", "placeholder": "",
"description": "Proforma line total" "desc": "Proforma total price"
},
"notes": {
"label": "Notes",
"placeholder": "Additional notes about the proforma",
"description": "Additional notes that can be included in the proforma"
},
"item": {
"quantity": {
"label": "Quantity",
"placeholder": "",
"description": ""
},
"description": {
"label": "Description",
"placeholder": "",
"description": ""
},
"unit_amount": {
"label": "Unit price",
"placeholder": "",
"description": "Item unit price"
},
"discount_percentage": {
"label": "Dto (%)",
"placeholder": "",
"description": "Percentage discount"
},
"discount_amount": {
"label": "Discount amount",
"placeholder": "",
"description": "Percentage discount amount"
},
"taxable_amount": {
"label": "Taxable amount",
"placeholder": "",
"description": ""
},
"tax_codes": {
"label": "Taxes",
"placeholder": "",
"description": "Taxes"
},
"taxes_amount": {
"label": "Taxes amount",
"placeholder": "",
"description": "Percentage taxes amount"
},
"total_amount": {
"label": "Total amount",
"placeholder": "",
"description": "Proforma line total"
}
} }
} }
}, },

View File

@ -177,9 +177,15 @@
"description": "Crear una nueva proforma", "description": "Crear una nueva proforma",
"back_to_list": "Volver al listado" "back_to_list": "Volver al listado"
}, },
"edit": { "update": {
"title": "Editar proforma", "title": "Editar proforma",
"description": "Editar la proforma seleccionada" "description": "Editar la proforma seleccionada",
"load_error.message": "Inténtalo de nuevo más tarde",
"load_error.title": "No se pudo cargar la proforma",
"not_found_msg": "Revisa el identificador o vuelve al listado",
"not_found_title": "Proforma no encontrada",
"error_msg": "Revisa los datos e inténtalo de nuevo.",
"error_title": "No se pudo guardar los cambios"
}, },
"delete": { "delete": {
"title": "Eliminar proforma", "title": "Eliminar proforma",
@ -223,128 +229,132 @@
} }
}, },
"form_groups": { "form_groups": {
"customer": { "proformas": {
"title": "Cliente", "customer": {
"description": "Selecciona el cliente para esta proforma" "title": "Cliente",
}, "description": "Selecciona el cliente para esta proforma"
"items": { },
"title": "Detalles de la proforma", "items": {
"description": "" "title": "Detalles de la proforma",
}, "description": ""
"basic_info": { },
"title": "Información de la proforma", "basic_info": {
"description": "Información básica de la proforma" "title": "Información de la proforma",
}, "description": "Información básica de la proforma"
"totals": { },
"title": "Totales de la proforma", "totals": {
"description": "Desglose de los importes de la proforma con descuentos e impuestos." "title": "Totales de la proforma",
}, "description": "Desglose de los importes de la proforma con descuentos e impuestos."
"preferences": { },
"title": "Preferencias", "preferences": {
"description": "Configuraciones adicionales de la proforma" "title": "Preferencias",
"description": "Configuraciones adicionales de la proforma"
}
} }
}, },
"form_fields": { "form_fields": {
"invoice_number": { "proformas": {
"label": "Número de proforma", "invoice_number": {
"placeholder": "", "label": "Número de proforma",
"description": ""
},
"invoice_date": {
"label": "Fecha",
"placeholder": "Selecciona una fecha",
"description": "Fecha de emisión de la proforma"
},
"series": {
"label": "Serie",
"placeholder": "",
"description": ""
},
"operation_date": {
"label": "Fecha de operación",
"placeholder": "Selecciona una fecha",
"description": "Fecha de la operación de la proforma"
},
"reference": {
"label": "Referencia",
"placeholder": "Referencia de la proforma",
"description": "Referencia de la proforma"
},
"description": {
"label": "Descripción",
"placeholder": "Descripción de la proforma",
"description": "Descripción general de la proforma"
},
"subtotal_amount": {
"label": "Subtotal",
"placeholder": "",
"desc": "Subtotal de la proforma"
},
"discount": {
"label": "Descuento (%)",
"placeholder": "",
"desc": "Porcentaje de descuento"
},
"discount_amount": {
"label": "Importe del descuento",
"placeholder": "",
"desc": "Importe del descuento porcentual"
},
"total_amount": {
"label": "Precio total",
"placeholder": "",
"desc": "Precio total de la proforma"
},
"notes": {
"label": "Notas",
"placeholder": "Notas adicionales sobre la proforma",
"description": "Notas adicionales que se pueden incluir en la proforma"
},
"item": {
"quantity": {
"label": "Cantidad",
"placeholder": "", "placeholder": "",
"description": "" "description": ""
}, },
"invoice_date": {
"label": "Fecha",
"placeholder": "Selecciona una fecha",
"description": "Fecha de emisión de la proforma"
},
"series": {
"label": "Serie",
"placeholder": "",
"description": ""
},
"operation_date": {
"label": "Fecha de operación",
"placeholder": "Selecciona una fecha",
"description": "Fecha de la operación de la proforma"
},
"reference": {
"label": "Referencia",
"placeholder": "Referencia de la proforma",
"description": "Referencia de la proforma"
},
"description": { "description": {
"label": "Descripción", "label": "Descripción",
"placeholder": "", "placeholder": "Descripción de la proforma",
"description": "" "description": "Descripción general de la proforma"
}, },
"unit_amount": { "subtotal_amount": {
"label": "Precio unitario", "label": "Subtotal",
"placeholder": "", "placeholder": "",
"description": "Precio unitario del producto" "desc": "Subtotal de la proforma"
}, },
"discount_percentage": { "discount": {
"label": "Dto (%)", "label": "Descuento (%)",
"placeholder": "", "placeholder": "",
"description": "Porcentaje de descuento" "desc": "Porcentaje de descuento"
}, },
"discount_amount": { "discount_amount": {
"label": "Importe del descuento", "label": "Importe del descuento",
"placeholder": "", "placeholder": "",
"description": "Importe del descuento porcentual" "desc": "Importe del descuento porcentual"
},
"taxable_amount": {
"label": "Subtotal",
"placeholder": "",
"description": ""
},
"tax_codes": {
"label": "Impuestos",
"placeholder": "",
"description": "Impuestos"
},
"taxes_amount": {
"label": "Importe impuestos",
"placeholder": "",
"description": "Importe porcentual de los impuestos"
}, },
"total_amount": { "total_amount": {
"label": "Precio total", "label": "Precio total",
"placeholder": "", "placeholder": "",
"description": "Precio total con descuento porcentual" "desc": "Precio total de la proforma"
},
"notes": {
"label": "Notas",
"placeholder": "Notas adicionales sobre la proforma",
"description": "Notas adicionales que se pueden incluir en la proforma"
},
"item": {
"quantity": {
"label": "Cantidad",
"placeholder": "",
"description": ""
},
"description": {
"label": "Descripción",
"placeholder": "",
"description": ""
},
"unit_amount": {
"label": "Precio unitario",
"placeholder": "",
"description": "Precio unitario del producto"
},
"discount_percentage": {
"label": "Dto (%)",
"placeholder": "",
"description": "Porcentaje de descuento"
},
"discount_amount": {
"label": "Importe del descuento",
"placeholder": "",
"description": "Importe del descuento porcentual"
},
"taxable_amount": {
"label": "Subtotal",
"placeholder": "",
"description": ""
},
"tax_codes": {
"label": "Impuestos",
"placeholder": "",
"description": "Impuestos"
},
"taxes_amount": {
"label": "Importe impuestos",
"placeholder": "",
"description": "Importe porcentual de los impuestos"
},
"total_amount": {
"label": "Precio total",
"placeholder": "",
"description": "Precio total con descuento porcentual"
}
} }
} }
}, },

View File

@ -2,4 +2,3 @@ export * from "./proforma-form-field-shell";
export * from "./proforma-header-fields-card"; export * from "./proforma-header-fields-card";
export * from "./proforma-header-form-grid"; export * from "./proforma-header-form-grid";
export * from "./proforma-section-card"; export * from "./proforma-section-card";
export * from "./proforma-update-editor-form";

View File

@ -1 +1,2 @@
export * from "./proforma-update-editor-form";
export * from "./proforma-update-header-editor"; export * from "./proforma-update-header-editor";

View File

@ -3,11 +3,11 @@
import { Button } from "@repo/shadcn-ui/components"; import { Button } from "@repo/shadcn-ui/components";
import { cn } from "@repo/shadcn-ui/lib/utils"; import { cn } from "@repo/shadcn-ui/lib/utils";
import { ProformaUpdateHeaderEditor } from ".";
import { useTranslation } from "../../../../i18n"; import { useTranslation } from "../../../../i18n";
import type { Proforma } from "../../../shared/entities"; import type { Proforma } from "../../../shared/entities";
import { ProformaUpdateHeaderEditor } from "../editors"; import { ProformaHeaderFieldsCard } from "../blocks/proforma-header-fields-card";
import { ProformaHeaderFieldsCard } from "./proforma-header-fields-card";
type ProformaUpdateEditorProps = { type ProformaUpdateEditorProps = {
formId: string; formId: string;
@ -37,6 +37,7 @@ export const ProformaUpdateEditorForm = ({
paymentMethodOptions={[]} paymentMethodOptions={[]}
priceListOptions={[]} priceListOptions={[]}
salesPersonOptions={[]} salesPersonOptions={[]}
serieOptions={[]}
statusOptions={[]} statusOptions={[]}
warehouseOptions={[]} warehouseOptions={[]}
/> />

View File

@ -1,4 +1,4 @@
import { DatePickerField, TextField } from "@repo/rdx-ui/components"; import { DatePickerField, SelectField, TextField } from "@repo/rdx-ui/components";
import { import {
Input, Input,
Select, Select,
@ -21,6 +21,7 @@ interface SelectOption {
interface ProformaUpdateHeaderEditorProps { interface ProformaUpdateHeaderEditorProps {
statusOptions: SelectOption[]; statusOptions: SelectOption[];
serieOptions: SelectOption[];
customerOptions: SelectOption[]; customerOptions: SelectOption[];
currencyOptions: SelectOption[]; currencyOptions: SelectOption[];
paymentMethodOptions: SelectOption[]; paymentMethodOptions: SelectOption[];
@ -33,6 +34,7 @@ interface ProformaUpdateHeaderEditorProps {
export const ProformaUpdateHeaderEditor = ({ export const ProformaUpdateHeaderEditor = ({
statusOptions, statusOptions,
serieOptions,
customerOptions, customerOptions,
currencyOptions, currencyOptions,
paymentMethodOptions, paymentMethodOptions,
@ -55,46 +57,46 @@ export const ProformaUpdateHeaderEditor = ({
return ( return (
<div className="space-y-6"> <div className="space-y-6">
<ProformaSectionCard <ProformaSectionCard
description={t("proformas.update.sections.document_description")} description={t("form_groups.proformas.basic_info.description")}
title={t("proformas.update.sections.document")} title={t("form_groups.proformas.basic_info.title")}
> >
<ProformaHeaderFormGrid> <ProformaHeaderFormGrid>
<TextField <SelectField
className="md:col-span-2" className="md:col-span-2"
label={t("form_fields.series.label")} label={t("form_fields.proformas.series.label")}
name="series" name="series"
placeholder={t("form_fields.series.placeholder")} placeholder={t("form_fields.proformas.series.placeholder")}
/> />
<DatePickerField <DatePickerField
className="md:col-span-3" className="md:col-span-3"
label={t("form_fields.invoice_date.label")} label={t("form_fields.proformas.invoice_date.label")}
name="invoice_date" name="invoice_date"
placeholder={t("form_fields.invoice_date.placeholder")} placeholder={t("form_fields.proformas.invoice_date.placeholder")}
required required
/> />
<DatePickerField <DatePickerField
className="md:col-span-3" className="md:col-span-3"
label={t("form_fields.operation_date.label")} label={t("form_fields.proformas.operation_date.label")}
name="operation_date" name="operation_date"
placeholder={t("form_fields.operation_date.placeholder")} placeholder={t("form_fields.proformas.operation_date.placeholder")}
/> />
<TextField <TextField
className="md:col-span-4" className="md:col-span-4"
label={t("form_fields.reference.label")} label={t("form_fields.proformas.reference.label")}
maxLength={256} maxLength={256}
name="reference" name="reference"
placeholder={t("form_fields.reference.placeholder")} placeholder={t("form_fields.proformas.reference.placeholder")}
/> />
<TextField <TextField
className="md:col-span-12" className="md:col-span-12"
label={t("form_fields.description.label")} label={t("form_fields.proformas.description.label")}
maxLength={256} maxLength={256}
name="description" name="description"
placeholder={t("form_fields.description.placeholder")} placeholder={t("form_fields.proformas.description.placeholder")}
/> />
</ProformaHeaderFormGrid> </ProformaHeaderFormGrid>
</ProformaSectionCard> </ProformaSectionCard>

View File

@ -8,8 +8,8 @@ import { FormProvider } from "react-hook-form";
import { useTranslation } from "../../../../i18n"; import { useTranslation } from "../../../../i18n";
import { useUpdateProformaPageController } from "../../controllers/use-update-proforma-page-controller"; import { useUpdateProformaPageController } from "../../controllers/use-update-proforma-page-controller";
import { ProformaUpdateEditorForm } from "../blocks";
import { ProformaUpdateSkeleton } from "../components"; import { ProformaUpdateSkeleton } from "../components";
import { ProformaUpdateEditorForm } from "../editors";
export const ProformaUpdatePage = () => { export const ProformaUpdatePage = () => {
const { t } = useTranslation(); const { t } = useTranslation();
@ -28,9 +28,9 @@ export const ProformaUpdatePage = () => {
message={ message={
updateCtrl.loadError instanceof Error updateCtrl.loadError instanceof Error
? updateCtrl.loadError.message ? updateCtrl.loadError.message
: t("proformas.update.load_error.message", "Inténtalo de nuevo más tarde") : t("pages.proformas.update.load_error.message", "Inténtalo de nuevo más tarde")
} }
title={t("proformas.update.load_error.title", "No se pudo cargar la proforma")} title={t("pages.proformas.update.load_error.title", "No se pudo cargar la proforma")}
/> />
<div className="flex items-center justify-end"> <div className="flex items-center justify-end">
@ -45,8 +45,11 @@ export const ProformaUpdatePage = () => {
<> <>
<AppContent> <AppContent>
<NotFoundCard <NotFoundCard
message={t("pages.update.notFoundMsg", "Revisa el identificador o vuelve al listado.")} message={t(
title={t("pages.update.notFoundTitle", "Proforma no encontrada")} "pages.proformas.update.not_found_msg",
"Revisa el identificador o vuelve al listado."
)}
title={t("pages.proformas.update.not_found_title", "Proforma no encontrada")}
/> />
</AppContent> </AppContent>
</> </>
@ -57,7 +60,7 @@ export const ProformaUpdatePage = () => {
<AppHeader className="space-y-4 max-w-5xl mx-auto"> <AppHeader className="space-y-4 max-w-5xl mx-auto">
<PageHeader <PageHeader
backIcon backIcon
description={t("pages.update.description")} description={t("pages.proformas.update.description")}
rightSlot={ rightSlot={
<UpdateCommitButtonGroup <UpdateCommitButtonGroup
cancel={{ cancel={{
@ -74,7 +77,7 @@ export const ProformaUpdatePage = () => {
}} }}
/> />
} }
title={t("pages.update.title")} title={t("pages.proformas.update.title")}
/> />
</AppHeader> </AppHeader>
<AppContent className="space-y-4 max-w-5xl mx-auto"> <AppContent className="space-y-4 max-w-5xl mx-auto">
@ -83,9 +86,9 @@ export const ProformaUpdatePage = () => {
<ErrorAlert <ErrorAlert
message={ message={
(updateCtrl.updateError as Error)?.message ?? (updateCtrl.updateError as Error)?.message ??
t("pages.update.errorMsg", "Revisa los datos e inténtalo de nuevo.") t("pages.proformas.update.error_msg", "Revisa los datos e inténtalo de nuevo.")
} }
title={t("pages.update.errorTitle", "No se pudo guardar los cambios")} title={t("pages.proformas.update.error_title", "No se pudo guardar los cambios")}
/> />
)} )}

View File

@ -31,7 +31,7 @@ type SelectFieldProps<TFormValues extends FieldValues> = {
readOnly?: boolean; readOnly?: boolean;
placeholder?: string; placeholder?: string;
items: SelectFieldItem[]; items?: SelectFieldItem[];
orientation?: "vertical" | "horizontal" | "responsive"; orientation?: "vertical" | "horizontal" | "responsive";
@ -50,7 +50,7 @@ export function SelectField<TFormValues extends FieldValues>({
readOnly = false, readOnly = false,
placeholder, placeholder,
items, items = [],
orientation = "vertical", orientation = "vertical",
@ -66,6 +66,13 @@ export function SelectField<TFormValues extends FieldValues>({
control={control} control={control}
name={name} name={name}
render={({ field, fieldState }) => { render={({ field, fieldState }) => {
const fieldValue = typeof field.value === "string" ? field.value.trim() : "";
const normalizedItems =
fieldValue && !items.some((item) => item.value === fieldValue)
? [{ value: fieldValue, label: fieldValue }, ...items]
: items;
return ( return (
<Field <Field
className={cn("gap-1", className)} className={cn("gap-1", className)}
@ -103,7 +110,7 @@ export function SelectField<TFormValues extends FieldValues>({
</SelectTrigger> </SelectTrigger>
</FormControl> </FormControl>
<SelectContent> <SelectContent>
{items.map((item) => ( {normalizedItems.map((item) => (
<SelectItem key={`key-${item.value}`} value={item.value}> <SelectItem key={`key-${item.value}`} value={item.value}>
{item.label} {item.label}
</SelectItem> </SelectItem>

View File

@ -15,9 +15,9 @@ export function SiteHeader() {
fill="none" fill="none"
height="24" height="24"
stroke="currentColor" stroke="currentColor"
stroke-linecap="round" strokeLinecap="round"
stroke-linejoin="round" strokeLinejoin="round"
stroke-width="2" strokeWidth="2"
viewBox="0 0 24 24" viewBox="0 0 24 24"
width="24" width="24"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
@ -39,9 +39,9 @@ export function SiteHeader() {
fill="none" fill="none"
height="24" height="24"
stroke="currentColor" stroke="currentColor"
stroke-linecap="round" strokeLinecap="round"
stroke-linejoin="round" strokeLinejoin="round"
stroke-width="2" strokeWidth="2"
viewBox="0 0 24 24" viewBox="0 0 24 24"
width="24" width="24"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
@ -57,6 +57,7 @@ export function SiteHeader() {
data-size="icon" data-size="icon"
data-slot="button" data-slot="button"
data-variant="ghost" data-variant="ghost"
type="button"
> >
<svg <svg
aria-hidden="true" aria-hidden="true"
@ -64,9 +65,9 @@ export function SiteHeader() {
fill="none" fill="none"
height="24" height="24"
stroke="currentColor" stroke="currentColor"
stroke-linecap="round" strokeLinecap="round"
stroke-linejoin="round" strokeLinejoin="round"
stroke-width="2" strokeWidth="2"
viewBox="0 0 24 24" viewBox="0 0 24 24"
width="24" width="24"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
@ -139,9 +140,9 @@ export function SiteHeader() {
fill="none" fill="none"
height="24" height="24"
stroke="currentColor" stroke="currentColor"
stroke-linecap="round" strokeLinecap="round"
stroke-linejoin="round" strokeLinejoin="round"
stroke-width="2" strokeWidth="2"
viewBox="0 0 24 24" viewBox="0 0 24 24"
width="24" width="24"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
@ -156,6 +157,7 @@ export function SiteHeader() {
data-size="icon-sm" data-size="icon-sm"
data-slot="button" data-slot="button"
data-variant="ghost" data-variant="ghost"
type="button"
> >
<svg <svg
aria-hidden="true" aria-hidden="true"
@ -163,9 +165,9 @@ export function SiteHeader() {
fill="none" fill="none"
height="24" height="24"
stroke="currentColor" stroke="currentColor"
stroke-linecap="round" strokeLinecap="round"
stroke-linejoin="round" strokeLinejoin="round"
stroke-width="2" strokeWidth="2"
viewBox="0 0 24 24" viewBox="0 0 24 24"
width="24" width="24"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
@ -191,9 +193,9 @@ export function SiteHeader() {
fill="none" fill="none"
height="24" height="24"
stroke="currentColor" stroke="currentColor"
stroke-linecap="round" strokeLinecap="round"
stroke-linejoin="round" strokeLinejoin="round"
stroke-width="2" strokeWidth="2"
viewBox="0 0 24 24" viewBox="0 0 24 24"
width="24" width="24"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
@ -211,7 +213,7 @@ export function SiteHeader() {
data-slot="separator" data-slot="separator"
role="none" role="none"
/> />
<span <button
aria-expanded="false" aria-expanded="false"
aria-haspopup="menu" aria-haspopup="menu"
className="group/avatar relative flex size-8 shrink-0 overflow-hidden rounded-full select-none data-[size=lg]:size-10 data-[size=sm]:size-6" className="group/avatar relative flex size-8 shrink-0 overflow-hidden rounded-full select-none data-[size=lg]:size-10 data-[size=sm]:size-6"
@ -227,7 +229,7 @@ export function SiteHeader() {
data-slot="avatar-image" data-slot="avatar-image"
src="/images/avatars/01.png" src="/images/avatars/01.png"
/> />
</span> </button>
</div> </div>
</div> </div>
</header> </header>