diff --git a/frontend/src/lib/components/dashboard/customs_brokers/data-table-actions.svelte b/frontend/src/lib/components/dashboard/customs_brokers/data-table-actions.svelte
index d32046fc..2d529e05 100644
--- a/frontend/src/lib/components/dashboard/customs_brokers/data-table-actions.svelte
+++ b/frontend/src/lib/components/dashboard/customs_brokers/data-table-actions.svelte
@@ -1,16 +1,16 @@
-
+
Clase: *
@@ -569,18 +710,21 @@
? 'border-red-500 focus-visible:ring-red-500'
: ''}"
maxlength={10}
- onblur={() => validateField('material_key')}
+ onblur={handleMaterialKeyBlur}
/>
-
- {formData.material_description || ''}
-
- {#if validationErrors.material_key}
-
{validationErrors.material_key}
- {/if}
+
+ {#if validationErrors.material_key}
+
{validationErrors.material_key}
+ {:else if formData.material_description}
+
+ {formData.material_description}
+
+ {/if}
+
@@ -629,18 +773,21 @@
? 'border-red-500 focus-visible:ring-red-500'
: ''}"
maxlength={5}
- onblur={() => validateField('unit_of_measure')}
+ onblur={handleUnitOfMeasureBlur}
/>
-
- {formData.unit_of_measure_description || ''}
-
- {#if validationErrors.unit_of_measure}
- {validationErrors.unit_of_measure}
- {/if}
+
+ {#if validationErrors.unit_of_measure}
+
{validationErrors.unit_of_measure}
+ {:else if formData.unit_of_measure_description}
+
+ {formData.unit_of_measure_description}
+
+ {/if}
+
@@ -656,15 +803,21 @@
? 'border-red-500 focus-visible:ring-red-500'
: ''}"
maxlength={10}
- onblur={() => validateField('fraction')}
+ onblur={handleFractionBlur}
/>
- {#if validationErrors.fraction}
- {validationErrors.fraction}
- {/if}
+
+ {#if validationErrors.fraction}
+
{validationErrors.fraction}
+ {:else if formData.fraction_description}
+
+ {formData.fraction_description}
+
+ {/if}
+
@@ -677,13 +830,21 @@
id="us_fraction"
bind:value={formData.us_fraction}
placeholder="Fracción americana"
- class="flex-1"
- maxlength={16}
+ class="flex-1 uppercase"
+ maxlength={10}
+ onblur={handleUSFractionBlur}
/>
+
+ {#if formData.us_fraction_description}
+
+ {formData.us_fraction_description}
+
+ {/if}
+
diff --git a/frontend/src/lib/components/help/HelpDrawer.svelte b/frontend/src/lib/components/help/HelpDrawer.svelte
index e2de2644..6f543bdf 100644
--- a/frontend/src/lib/components/help/HelpDrawer.svelte
+++ b/frontend/src/lib/components/help/HelpDrawer.svelte
@@ -121,13 +121,16 @@
-
-
-
-
+
+ {#snippet child({ props })}
+
+
+
+ {/snippet}
diff --git a/frontend/src/lib/components/keyboard/ShortcutsHelpModal.svelte b/frontend/src/lib/components/keyboard/ShortcutsHelpModal.svelte
index 3a9be85d..07a6d8bf 100644
--- a/frontend/src/lib/components/keyboard/ShortcutsHelpModal.svelte
+++ b/frontend/src/lib/components/keyboard/ShortcutsHelpModal.svelte
@@ -49,8 +49,9 @@
role="dialog"
aria-modal="true"
>
+
Global Navigation (Alt)
+
+
Active Actions (Alt+Shift)
{#if localShortcuts.length === 0}
-
No specific actions for this view.
+
No specific actions for this view.
{:else}
+
+
- import * as Collapsible from "$lib/components/ui/collapsible/index.js";
- import * as Sidebar from "$lib/components/ui/sidebar/index.js";
- import * as DropdownMenu from "$lib/components/ui/dropdown-menu/index.js";
- import { useSidebar } from "$lib/components/ui/sidebar/context.svelte.js";
- import ChevronRight from "@lucide/svelte/icons/chevron-right";
+ import * as Collapsible from '$lib/components/ui/collapsible/index.js';
+ import * as Sidebar from '$lib/components/ui/sidebar/index.js';
+ import * as DropdownMenu from '$lib/components/ui/dropdown-menu/index.js';
+ import { useSidebar } from '$lib/components/ui/sidebar/context.svelte.js';
+ import ChevronRight from '@lucide/svelte/icons/chevron-right';
let {
- items,
+ items
}: {
items: {
title: string;
@@ -37,30 +37,30 @@
}
function handleTriggerEnter(title: string) {
- if (sidebar.state !== "collapsed") return;
+ if (sidebar.state !== 'collapsed') return;
activeTitle = title;
}
function handleTriggerLeave(event: PointerEvent, title: string) {
- if (sidebar.state !== "collapsed") return;
-
+ if (sidebar.state !== 'collapsed') return;
+
// Si nos movemos al contenido (o nos quedamos en el trigger), no cerramos
if (shouldKeepOpen(event, title)) return;
-
+
activeTitle = null;
}
function handleContentEnter(title: string) {
- if (sidebar.state !== "collapsed") return;
+ if (sidebar.state !== 'collapsed') return;
activeTitle = title;
}
function handleContentLeave(event: PointerEvent, title: string) {
- if (sidebar.state !== "collapsed") return;
-
+ if (sidebar.state !== 'collapsed') return;
+
// Si nos movemos de vuelta al trigger (o dentro del contenido), no cerramos
if (shouldKeepOpen(event, title)) return;
-
+
activeTitle = null;
}
@@ -81,23 +81,26 @@
{#each items as item (item.title)}
{#if item.items && item.items.length > 0}
- {#if sidebar.state === "collapsed"}
+ {#if sidebar.state === 'collapsed'}
onOpenChange(v, item.title)}
- modal={false}
>
-
+
{#snippet child({ props })}
handleTriggerEnter(item.title)}
onpointerleave={(e) => handleTriggerLeave(e, item.title)}
>
-
+
{#if item.icon}
{:else}
@@ -113,7 +116,7 @@
side="right"
align="start"
sideOffset={0}
- class="z-50 w-64 rounded-lg p-0 shadow-lg overflow-visible"
+ class="z-50 w-64 overflow-visible rounded-lg p-0 shadow-lg"
id={`content-${item.title}`}
onpointerenter={() => handleContentEnter(item.title)}
onpointerleave={(e) => handleContentLeave(e, item.title)}
@@ -123,7 +126,9 @@
Posicionado con right-full para estar exactamente donde el trigger termina (offset 0).
Usamos w-8 h-8 para coincidir con un botón de tamaño estándar de sidebar.
-->
-
+
{#if item.icon}
{:else}
@@ -134,19 +139,28 @@
-