Rafael Lopez

debounce

...@@ -19,6 +19,9 @@ ...@@ -19,6 +19,9 @@
19 let isLoadingMore = false; 19 let isLoadingMore = false;
20 let allHits = []; 20 let allHits = [];
21 21
22 + // Navegación por teclado
23 + let selectedResultIndex = -1;
24 +
22 // Tracking para evitar re-animaciones 25 // Tracking para evitar re-animaciones
23 let seenHitIds = new Set(); 26 let seenHitIds = new Set();
24 let lastSearchKey = ''; 27 let lastSearchKey = '';
...@@ -122,6 +125,8 @@ ...@@ -122,6 +125,8 @@
122 } else { 125 } else {
123 selectedClassifiers = [...selectedClassifiers, id]; 126 selectedClassifiers = [...selectedClassifiers, id];
124 } 127 }
128 + // Mantener foco en el buscador
129 + setTimeout(() => searchInput?.focus(), 10);
125 } 130 }
126 131
127 function setMode(mode) { 132 function setMode(mode) {
...@@ -165,7 +170,7 @@ ...@@ -165,7 +170,7 @@
165 let debounceTimer; 170 let debounceTimer;
166 let hintTimer; 171 let hintTimer;
167 let showMinLengthHint = false; 172 let showMinLengthHint = false;
168 - const DEBOUNCE_MS = 450; 173 + const DEBOUNCE_MS = 300;
169 const HINT_DELAY_MS = 1500; 174 const HINT_DELAY_MS = 1500;
170 175
171 const POBLACION = 12000000; 176 const POBLACION = 12000000;
...@@ -303,7 +308,9 @@ ...@@ -303,7 +308,9 @@
303 308
304 if (searchVal.length < 3) { 309 if (searchVal.length < 3) {
305 results = null; 310 results = null;
311 + allHits = [];
306 error = null; 312 error = null;
313 + selectedResultIndex = -1;
307 if (searchVal.length > 0) { 314 if (searchVal.length > 0) {
308 hintTimer = setTimeout(() => { showMinLengthHint = true; }, HINT_DELAY_MS); 315 hintTimer = setTimeout(() => { showMinLengthHint = true; }, HINT_DELAY_MS);
309 } 316 }
...@@ -379,7 +386,51 @@ ...@@ -379,7 +386,51 @@
379 } 386 }
380 387
381 function handleKeydown(e) { 388 function handleKeydown(e) {
382 - if (e.key === 'Escape') { clearSearch(); searchInput?.blur(); } 389 + if (e.key === 'Escape') {
390 + clearSearch();
391 + searchInput?.blur();
392 + selectedResultIndex = -1;
393 + }
394 +
395 + // Navegación por resultados
396 + if (sortedHits.length > 0) {
397 + if (e.key === 'ArrowDown') {
398 + e.preventDefault();
399 + selectedResultIndex = Math.min(selectedResultIndex + 1, sortedHits.length - 1);
400 + scrollToSelectedResult();
401 + } else if (e.key === 'ArrowUp') {
402 + e.preventDefault();
403 + selectedResultIndex = Math.max(selectedResultIndex - 1, -1);
404 + scrollToSelectedResult();
405 + } else if (e.key === 'Enter' && selectedResultIndex >= 0) {
406 + e.preventDefault();
407 + navigateToResult(sortedHits[selectedResultIndex]);
408 + }
409 + }
410 + }
411 +
412 + function scrollToSelectedResult() {
413 + if (selectedResultIndex >= 0) {
414 + const el = document.querySelector(`[data-result-index="${selectedResultIndex}"]`);
415 + el?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });
416 + }
417 + }
418 +
419 + function navigateToResult(hit) {
420 + const meta = parseMetadatos(hit.document.metadatos);
421 + const isEntidadClass = hit.document.class_ === 'entidad';
422 + const isClassResult = hit.document.is_class === true;
423 +
424 + let url;
425 + if (isEntidadClass) {
426 + url = `/entidad/${meta.entidad}`;
427 + } else if (isClassResult) {
428 + url = `/clasificador/${hit.document.class_}/${hit.document.id}`;
429 + } else {
430 + url = `/proyecto/${generateCodigo(hit)}`;
431 + }
432 +
433 + window.location.href = url;
383 } 434 }
384 435
385 function clearSearch() { 436 function clearSearch() {
...@@ -389,6 +440,7 @@ ...@@ -389,6 +440,7 @@
389 currentPage = 1; 440 currentPage = 1;
390 error = null; 441 error = null;
391 showMinLengthHint = false; 442 showMinLengthHint = false;
443 + selectedResultIndex = -1;
392 clearTimeout(debounceTimer); 444 clearTimeout(debounceTimer);
393 clearTimeout(hintTimer); 445 clearTimeout(hintTimer);
394 searchInput?.focus(); 446 searchInput?.focus();
...@@ -425,13 +477,19 @@ ...@@ -425,13 +477,19 @@
425 isClassifier: true, isEntidad, classType: hits[0]?.document?.class_ || null }; 477 isClassifier: true, isEntidad, classType: hits[0]?.document?.class_ || null };
426 } else { 478 } else {
427 const entidadesSet = new Set(); 479 const entidadesSet = new Set();
428 - hits.forEach(h => { const m = parseMetadatos(h.document.metadatos); if (m.entidad) entidadesSet.add(m.entidad); }); 480 + const allYears = [];
429 - const years = hits.map(h => h.document.gestion).filter(Boolean); 481 + hits.forEach(h => {
430 - const minYear = Math.min(...years); 482 + const m = parseMetadatos(h.document.metadatos);
431 - const maxYear = Math.max(...years); 483 + if (m.entidad) entidadesSet.add(m.entidad);
484 + if (m.gestion) {
485 + const years = m.gestion.split(',').map(y => parseInt(y.trim())).filter(y => !isNaN(y));
486 + allYears.push(...years);
487 + }
488 + });
489 + const yearRange = allYears.length > 0 ? formatYearsArray(allYears) : null;
432 return { found: totalFound, montoTotal, perCapita: montoTotal / POBLACION, 490 return { found: totalFound, montoTotal, perCapita: montoTotal / POBLACION,
433 numEntidades: entidadesSet.size, 491 numEntidades: entidadesSet.size,
434 - yearRange: minYear === maxYear ? `${minYear}` : `${minYear} – ${maxYear}`, 492 + yearRange,
435 isClassifier: false }; 493 isClassifier: false };
436 } 494 }
437 } 495 }
...@@ -447,6 +505,36 @@ ...@@ -447,6 +505,36 @@
447 return `${num.toLocaleString('es-BO', { minimumFractionDigits: 0, maximumFractionDigits: 0 })} Bs`; 505 return `${num.toLocaleString('es-BO', { minimumFractionDigits: 0, maximumFractionDigits: 0 })} Bs`;
448 } 506 }
449 507
508 + function formatYearsArray(years) {
509 + if (!years || years.length === 0) return '';
510 + const sorted = [...new Set(years)].sort((a, b) => a - b);
511 + if (sorted.length === 1) return sorted[0].toString();
512 +
513 + // Group into continuous ranges
514 + const groups = [];
515 + let start = sorted[0];
516 + let end = sorted[0];
517 +
518 + for (let i = 1; i < sorted.length; i++) {
519 + if (sorted[i] === end + 1) {
520 + end = sorted[i];
521 + } else {
522 + groups.push(start === end ? `${start}` : `${start}-${end}`);
523 + start = sorted[i];
524 + end = sorted[i];
525 + }
526 + }
527 + groups.push(start === end ? `${start}` : `${start}-${end}`);
528 +
529 + return groups.join(', ');
530 + }
531 +
532 + function formatYears(yearsStr) {
533 + if (!yearsStr) return '';
534 + const years = yearsStr.split(',').map(y => parseInt(y.trim())).filter(y => !isNaN(y));
535 + return formatYearsArray(years);
536 + }
537 +
450 function generateCodigo(hit) { 538 function generateCodigo(hit) {
451 const m = parseMetadatos(hit.document.metadatos); 539 const m = parseMetadatos(hit.document.metadatos);
452 return `${m.entidad}-${m.programa}-${m.proyecto}-${m.actividad}-${hit.document.gestion}`; 540 return `${m.entidad}-${m.programa}-${m.proyecto}-${m.actividad}-${hit.document.gestion}`;
...@@ -462,7 +550,7 @@ ...@@ -462,7 +550,7 @@
462 clearTimeout(debounceTimer); 550 clearTimeout(debounceTimer);
463 const needsClassifiers = _mode === 'ingresos' || (_mode === 'gastos' && _submode === 'clasificadores'); 551 const needsClassifiers = _mode === 'ingresos' || (_mode === 'gastos' && _submode === 'clasificadores');
464 if (!needsClassifiers || _classifiers.length > 0) { 552 if (!needsClassifiers || _classifiers.length > 0) {
465 - debounceTimer = setTimeout(() => performSearch(searchVal), 150); 553 + debounceTimer = setTimeout(() => performSearch(searchVal), DEBOUNCE_MS);
466 } else { 554 } else {
467 // No hay clasificadores seleccionados - limpiar resultados 555 // No hay clasificadores seleccionados - limpiar resultados
468 results = null; 556 results = null;
...@@ -507,7 +595,7 @@ ...@@ -507,7 +595,7 @@
507 </div> 595 </div>
508 596
509 <button class="nav-menu-btn" aria-label="Menú"> 597 <button class="nav-menu-btn" aria-label="Menú">
510 - <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"> 598 + <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round">
511 <line x1="3" y1="6" x2="21" y2="6"/> 599 <line x1="3" y1="6" x2="21" y2="6"/>
512 <line x1="3" y1="12" x2="21" y2="12"/> 600 <line x1="3" y1="12" x2="21" y2="12"/>
513 <line x1="3" y1="18" x2="21" y2="18"/> 601 <line x1="3" y1="18" x2="21" y2="18"/>
...@@ -526,9 +614,9 @@ ...@@ -526,9 +614,9 @@
526 614
527 <!-- Buscador --> 615 <!-- Buscador -->
528 <div class="search-wrap" class:search-wrap-with-results={allHits.length > 0}> 616 <div class="search-wrap" class:search-wrap-with-results={allHits.length > 0}>
529 - <div class="search-bar" class:search-focused={searchFocused} class:has-results={isSearching}> 617 + <div class="search-bar" class:search-focused={searchVal.length > 0} class:has-results={isSearching}>
530 <svg class="search-icon" width="20" height="20" viewBox="0 0 24 24" fill="none" 618 <svg class="search-icon" width="20" height="20" viewBox="0 0 24 24" fill="none"
531 - stroke={searchFocused ? '#D4B254' : '#8C8880'} stroke-width="2" stroke-linecap="round"> 619 + stroke={searchVal.length > 0 ? '#FFFFFF' : '#F0C14D'} stroke-width="2" stroke-linecap="round">
532 <circle cx="11" cy="11" r="8"/><path d="M21 21l-4.35-4.35"/> 620 <circle cx="11" cy="11" r="8"/><path d="M21 21l-4.35-4.35"/>
533 </svg> 621 </svg>
534 622
...@@ -620,15 +708,12 @@ ...@@ -620,15 +708,12 @@
620 > 708 >
621 <span class="checkbox-box"> 709 <span class="checkbox-box">
622 {#if selectedClassifiers.includes(clf.id)} 710 {#if selectedClassifiers.includes(clf.id)}
623 - <svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"> 711 + <svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round" stroke-linejoin="round">
624 <polyline points="20 6 9 17 4 12"/> 712 <polyline points="20 6 9 17 4 12"/>
625 </svg> 713 </svg>
626 {/if} 714 {/if}
627 </span> 715 </span>
628 <span class="checkbox-label">{clf.label}</span> 716 <span class="checkbox-label">{clf.label}</span>
629 - {#if clf.disabled}
630 - <span class="chip-soon">próx.</span>
631 - {/if}
632 </button> 717 </button>
633 {/each} 718 {/each}
634 </div> 719 </div>
...@@ -701,28 +786,26 @@ ...@@ -701,28 +786,26 @@
701 {#if stats} 786 {#if stats}
702 <div class="results-summary"> 787 <div class="results-summary">
703 <div class="summary-row"> 788 <div class="summary-row">
704 - <div class="summary-left"> 789 + <div class="summary-stats">
705 - <div class="summary-header"> 790 + <span class="summary-count">{stats.found.toLocaleString()}</span>
706 - <span class="summary-count">{sortedHits.length}</span> 791 + <span class="summary-label">resultados</span>
707 - <span class="summary-header-text">de {stats.found.toLocaleString()} resultados</span> 792 + <span class="summary-sep">·</span>
708 - {#if isLoading}<span class="updating-dot"></span>{/if} 793 + <span class="summary-tag summary-tag-gold">{formatMonto(stats.montoTotal)}</span>
709 - </div> 794 + <span class="summary-sep">·</span>
710 - <div class="summary-meta">
711 - <span class="summary-tag summary-tag-gold">
712 - {formatMonto(stats.montoTotal)}
713 - </span>
714 {#if stats.isClassifier} 795 {#if stats.isClassifier}
715 {#if stats.isEntidad && groupedHits} 796 {#if stats.isEntidad && groupedHits}
716 <span class="summary-tag summary-tag-entities">{stats.numEntidades} {stats.numEntidades === 1 ? 'entidad' : 'entidades'}</span> 797 <span class="summary-tag summary-tag-entities">{stats.numEntidades} {stats.numEntidades === 1 ? 'entidad' : 'entidades'}</span>
798 + <span class="summary-sep">·</span>
717 <span class="summary-tag">{groupedHits.length} {groupedHits.length === 1 ? 'categoría' : 'categorías'}</span> 799 <span class="summary-tag">{groupedHits.length} {groupedHits.length === 1 ? 'categoría' : 'categorías'}</span>
718 {/if} 800 {/if}
719 {:else} 801 {:else}
720 - <span class="summary-tag">en {stats.numEntidades} {stats.numEntidades === 1 ? 'entidad' : 'entidades'}</span> 802 + <span class="summary-tag">{stats.numEntidades} {stats.numEntidades === 1 ? 'entidad' : 'entidades'}</span>
721 {#if stats.yearRange} 803 {#if stats.yearRange}
804 + <span class="summary-sep">·</span>
722 <span class="summary-tag">{stats.yearRange}</span> 805 <span class="summary-tag">{stats.yearRange}</span>
723 {/if} 806 {/if}
724 {/if} 807 {/if}
725 - </div> 808 + {#if isLoading}<span class="updating-dot"></span>{/if}
726 </div> 809 </div>
727 <div class="sort-buttons"> 810 <div class="sort-buttons">
728 {#if !stats.isClassifier} 811 {#if !stats.isClassifier}
...@@ -798,6 +881,8 @@ ...@@ -798,6 +881,8 @@
798 ? `/entidad/${meta.entidad}` 881 ? `/entidad/${meta.entidad}`
799 : (isClassResult ? `/clasificador/${hit.document.class_}/${hit.document.id}` : `/proyecto/${generateCodigo(hit)}`)} 882 : (isClassResult ? `/clasificador/${hit.document.class_}/${hit.document.id}` : `/proyecto/${generateCodigo(hit)}`)}
800 class="result-card" 883 class="result-card"
884 + class:result-card-selected={selectedResultIndex === i}
885 + data-result-index={i}
801 > 886 >
802 <div class="result-content"> 887 <div class="result-content">
803 <div class="result-text"> 888 <div class="result-text">
...@@ -814,9 +899,17 @@ ...@@ -814,9 +899,17 @@
814 {:else if isClassResult} 899 {:else if isClassResult}
815 <span class="result-class-type">{hit.document.class_}</span> 900 <span class="result-class-type">{hit.document.class_}</span>
816 {:else} 901 {:else}
817 - <span class="result-year">{hit.document.gestion}</span> 902 + <span class="result-year">{formatYears(meta.gestion)}</span>
903 + <span class="result-sep">·</span>
904 + <span class="result-monto">{formatMonto(hit.document.devengado)}</span>
905 + {#if meta.entidad_desc_entidad}
906 + <span class="result-sep">·</span>
907 + <span class="result-entity">{meta.entidad_desc_entidad}</span>
818 {/if} 908 {/if}
909 + {/if}
910 + {#if isEntidadClass || isClassResult}
819 <span class="result-monto">{formatMonto(hit.document.devengado)}</span> 911 <span class="result-monto">{formatMonto(hit.document.devengado)}</span>
912 + {/if}
820 </div> 913 </div>
821 </div> 914 </div>
822 <svg class="result-link-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"> 915 <svg class="result-link-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
...@@ -1304,8 +1397,8 @@ ...@@ -1304,8 +1397,8 @@
1304 /* Search */ 1397 /* Search */
1305 .search-wrap{max-width:960px;width:100%;margin:0 auto;position:relative;z-index:9999;transition:all 0.3s cubic-bezier(0.16,1,0.3,1)} 1398 .search-wrap{max-width:960px;width:100%;margin:0 auto;position:relative;z-index:9999;transition:all 0.3s cubic-bezier(0.16,1,0.3,1)}
1306 .search-wrap-with-results{background:rgba(255,255,255,0.04);border-radius:20px;border:1px solid rgba(255,255,255,0.08);padding:6px} 1399 .search-wrap-with-results{background:rgba(255,255,255,0.04);border-radius:20px;border:1px solid rgba(255,255,255,0.08);padding:6px}
1307 - .search-bar{display:flex;align-items:center;background:rgba(255,255,255,0.04);border-radius:16px;padding:8px 14px 8px 8px;transition:all 0.4s cubic-bezier(0.16,1,0.3,1);box-shadow:0 0 0 1px rgba(201,167,81,0.12),0 8px 32px rgba(0,0,0,0.25);position:relative} 1400 + .search-bar{display:flex;align-items:center;background:rgba(255,255,255,0.05);border-radius:16px;padding:8px 14px 8px 14px;transition:all 0.3s cubic-bezier(0.16,1,0.3,1);box-shadow:0 12px 40px rgba(0,0,0,0.4),0 4px 12px rgba(0,0,0,0.2);position:relative}
1308 - .search-focused{background:rgba(255,255,255,0.06);box-shadow:0 12px 40px rgba(0,0,0,0.4),0 4px 12px rgba(0,0,0,0.2)} 1401 + .search-focused{background:rgba(255,255,255,0.12)}
1309 .search-has-results{border-radius:16px 16px 0 0} 1402 .search-has-results{border-radius:16px 16px 0 0}
1310 .search-meta{display:flex;align-items:center;gap:8px;flex-shrink:0;padding:0 4px} 1403 .search-meta{display:flex;align-items:center;gap:8px;flex-shrink:0;padding:0 4px}
1311 .search-meta-item{display:flex;align-items:center;gap:7px;font-family:var(--sans);font-size:13px;font-weight:500;padding:10px 14px;border-radius:10px;text-decoration:none;transition:all 0.2s} 1404 .search-meta-item{display:flex;align-items:center;gap:7px;font-family:var(--sans);font-size:13px;font-weight:500;padding:10px 14px;border-radius:10px;text-decoration:none;transition:all 0.2s}
...@@ -1316,16 +1409,16 @@ ...@@ -1316,16 +1409,16 @@
1316 .search-diario-link svg{transition:transform 0.2s} 1409 .search-diario-link svg{transition:transform 0.2s}
1317 .search-diario-link:hover svg{transform:translateX(3px)} 1410 .search-diario-link:hover svg{transform:translateX(3px)}
1318 .search-divider{width:1px;height:32px;background:rgba(255,255,255,0.08);margin:0 16px;flex-shrink:0} 1411 .search-divider{width:1px;height:32px;background:rgba(255,255,255,0.08);margin:0 16px;flex-shrink:0}
1319 - .search-icon{flex-shrink:0;transition:stroke 0.3s} 1412 + .search-icon{flex-shrink:0;transition:stroke 0.3s;margin-left:4px}
1320 .search-input-wrap{flex:1;position:relative;display:flex;align-items:center} 1413 .search-input-wrap{flex:1;position:relative;display:flex;align-items:center}
1321 - .search-input-wrap input{width:100%;background:transparent;border:none;outline:none;color:#F5F0E8;font-size:16px;font-family:var(--sans);padding:12px 12px 12px 10px;caret-color:#C9A751} 1414 + .search-input-wrap input{width:100%;background:transparent;border:none;outline:none;color:#FFFFFF;font-size:22px;font-weight:500;font-family:var(--sans);padding:14px 12px 14px 10px;caret-color:#F0C14D;letter-spacing:-0.01em}
1322 .search-placeholder{position:absolute;left:10px;top:50%;transform:translateY(-50%);display:flex;align-items:center;pointer-events:none} 1415 .search-placeholder{position:absolute;left:10px;top:50%;transform:translateY(-50%);display:flex;align-items:center;pointer-events:none}
1323 - .blink-cursor{width:1.5px;height:18px;margin-right:1px;animation:blink 1s step-end infinite;border-radius:1px;flex-shrink:0;background:#C9A751} 1416 + .blink-cursor{width:2px;height:20px;margin-right:2px;animation:blink 1s step-end infinite;border-radius:1px;flex-shrink:0;background:#F0C14D}
1324 .cursor-hidden{opacity:0} 1417 .cursor-hidden{opacity:0}
1325 .cursor-diario{background:#4A8B6E} 1418 .cursor-diario{background:#4A8B6E}
1326 .cursor-archivo{background:#C9A751} 1419 .cursor-archivo{background:#C9A751}
1327 .has-results{border-radius:14px;box-shadow:none;background:rgba(255,255,255,0.03)} 1420 .has-results{border-radius:14px;box-shadow:none;background:rgba(255,255,255,0.03)}
1328 - .placeholder-text{font-family:var(--sans);font-size:16px;color:#B8B5AD} 1421 + .placeholder-text{font-family:var(--sans);font-size:17px;font-weight:400;color:#9B9890;letter-spacing:0}
1329 .placeholder-mobile{display:none} 1422 .placeholder-mobile{display:none}
1330 .gear-btn{width:38px;height:38px;border-radius:10px;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,0.06);cursor:pointer;transition:all 0.3s;flex-shrink:0;margin-left:8px} 1423 .gear-btn{width:38px;height:38px;border-radius:10px;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,0.06);cursor:pointer;transition:all 0.3s;flex-shrink:0;margin-left:8px}
1331 .gear-btn svg{transition:transform 0.3s ease} 1424 .gear-btn svg{transition:transform 0.3s ease}
...@@ -1452,7 +1545,7 @@ ...@@ -1452,7 +1545,7 @@
1452 .daily-hint{display:inline-flex;align-items:center;gap:8px;margin-top:28px;padding:8px 14px;background:transparent;border:1px solid rgba(74,139,110,0.25);border-radius:20px;transition:all 0.3s;opacity:0;transform:translateY(10px);text-decoration:none;font-size:13px} 1545 .daily-hint{display:inline-flex;align-items:center;gap:8px;margin-top:28px;padding:8px 14px;background:transparent;border:1px solid rgba(74,139,110,0.25);border-radius:20px;transition:all 0.3s;opacity:0;transform:translateY(10px);text-decoration:none;font-size:13px}
1453 .daily-hint-visible{opacity:1;transform:translateY(0)} 1546 .daily-hint-visible{opacity:1;transform:translateY(0)}
1454 .daily-hint:hover{background:rgba(74,139,110,0.08);border-color:rgba(74,139,110,0.4)} 1547 .daily-hint:hover{background:rgba(74,139,110,0.08);border-color:rgba(74,139,110,0.4)}
1455 - .daily-dot{width:6px;height:6px;border-radius:50%;background:#4A8B6E;animation:pulse 2s ease-in-out infinite;flex-shrink:0} 1548 + .daily-dot{width:6px;height:6px;border-radius:50%;background:#E8A84C;animation:pulse 2s ease-in-out infinite;flex-shrink:0;box-shadow:0 0 8px rgba(232,168,76,0.4)}
1456 .daily-text{font-family:var(--sans);font-size:12px;color:#9B9890} 1549 .daily-text{font-family:var(--sans);font-size:12px;color:#9B9890}
1457 .daily-text strong{color:#4A8B6E} 1550 .daily-text strong{color:#4A8B6E}
1458 .daily-hint svg{color:#4A8B6E;opacity:0.6;transition:all 0.2s} 1551 .daily-hint svg{color:#4A8B6E;opacity:0.6;transition:all 0.2s}
...@@ -1469,23 +1562,22 @@ ...@@ -1469,23 +1562,22 @@
1469 .results-content-visible{max-height:60vh;overflow-y:auto;opacity:1;background:transparent;border-radius:0;border:none;padding:14px 10px;text-align:left} 1562 .results-content-visible{max-height:60vh;overflow-y:auto;opacity:1;background:transparent;border-radius:0;border:none;padding:14px 10px;text-align:left}
1470 1563
1471 /* Results Summary */ 1564 /* Results Summary */
1472 - .results-summary{background:transparent;border-radius:0;padding:0 0 14px 0;margin-bottom:14px;border-bottom:1px solid rgba(255,255,255,0.08)} 1565 + .results-summary{background:transparent;border-radius:0;padding:0 0 12px 0;margin-bottom:12px;border-bottom:1px solid rgba(255,255,255,0.08)}
1473 - .summary-row{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;flex-wrap:wrap} 1566 + .summary-row{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap}
1474 - .summary-left{display:flex;flex-direction:column;gap:8px} 1567 + .summary-stats{display:flex;align-items:center;gap:4px;flex-wrap:wrap}
1475 - .summary-header{display:flex;align-items:center;gap:8px} 1568 + .summary-count{font-family:var(--mono);font-size:12px;font-weight:500;color:#D0CCC4}
1476 - .summary-count{font-family:var(--mono);font-size:24px;font-weight:600;color:#F0C14D} 1569 + .summary-label{font-family:var(--sans);font-size:13px;color:#A5A29A}
1477 - .summary-header-text{font-family:var(--sans);font-size:14px;color:#A5A29A} 1570 + .summary-sep{color:#6B6860;font-size:10px;margin:0 6px}
1478 - .updating-dot{width:6px;height:6px;border-radius:50%;background:#C9A751;animation:pulse 1s ease-in-out infinite} 1571 + .updating-dot{width:6px;height:6px;border-radius:50%;background:#F0C14D;animation:pulse 1s ease-in-out infinite;margin-left:4px}
1479 - .summary-meta{display:flex;gap:8px;flex-wrap:wrap} 1572 + .summary-tag{font-family:var(--mono);font-size:11px;letter-spacing:0.03em;color:#9B9890}
1480 - .summary-tag{font-family:var(--mono);font-size:11px;letter-spacing:0.03em;padding:4px 10px;border-radius:6px;background:rgba(255,255,255,0.06);color:#8B8880} 1573 + .summary-tag-gold{font-size:14px;font-weight:600;color:#5AAF8A}
1481 - .summary-tag-gold{background:rgba(240,193,77,0.18);color:#F0C14D} 1574 + .summary-tag-entities{color:#5AAF8A}
1482 - .summary-tag-entities{background:rgba(74,139,110,0.12);color:#4A8B6E}
1483 1575
1484 /* Sort Buttons */ 1576 /* Sort Buttons */
1485 .sort-buttons{display:flex;gap:8px} 1577 .sort-buttons{display:flex;gap:8px}
1486 - .sort-btn{display:flex;align-items:center;gap:6px;font-family:var(--mono);font-size:12px;color:#6B6860;padding:8px 12px;border-radius:8px;background:rgba(255,255,255,0.04);border:none;cursor:pointer;transition:all 0.2s} 1578 + .sort-btn{display:flex;align-items:center;gap:6px;font-family:var(--mono);font-size:12px;color:#8B8880;padding:8px 12px;border-radius:8px;background:rgba(255,255,255,0.04);border:none;cursor:pointer;transition:all 0.2s}
1487 - .sort-btn:hover{background:rgba(255,255,255,0.08);color:#B8B5AD} 1579 + .sort-btn:hover{background:rgba(255,255,255,0.08);color:#D0CCC4}
1488 - .sort-btn-active{background:rgba(201,167,81,0.12);color:#C9A751} 1580 + .sort-btn-active{background:rgba(255,255,255,0.1);color:#F5F0E8}
1489 1581
1490 /* Results List */ 1582 /* Results List */
1491 .results-list{display:flex;flex-direction:column;gap:0} 1583 .results-list{display:flex;flex-direction:column;gap:0}
...@@ -1493,25 +1585,29 @@ ...@@ -1493,25 +1585,29 @@
1493 /* Result Group (for entidades) */ 1585 /* Result Group (for entidades) */
1494 .result-group{background:transparent;border-radius:0;overflow:hidden;border-bottom:1px solid rgba(255,255,255,0.06);padding-bottom:8px;margin-bottom:8px} 1586 .result-group{background:transparent;border-radius:0;overflow:hidden;border-bottom:1px solid rgba(255,255,255,0.06);padding-bottom:8px;margin-bottom:8px}
1495 .result-group:last-child{border-bottom:none;margin-bottom:0;padding-bottom:0} 1587 .result-group:last-child{border-bottom:none;margin-bottom:0;padding-bottom:0}
1496 - .result-group-header{display:flex;align-items:center;gap:12px;padding:8px 0;background:transparent} 1588 + .result-group-header{display:flex;align-items:center;gap:12px;padding:10px 12px;background:rgba(255,255,255,0.04);border-radius:8px;margin-bottom:6px}
1497 - .result-group-name{font-family:var(--sans);font-size:13px;font-weight:500;color:#F5F0E8;flex:1} 1589 + .result-group-name{font-family:var(--sans);font-size:14px;font-weight:600;color:#F5F0E8;flex:1}
1498 - .result-group-count{font-family:var(--mono);font-size:11px;color:#6B6860;background:rgba(255,255,255,0.06);padding:2px 8px;border-radius:4px} 1590 + .result-group-count{font-family:var(--mono);font-size:11px;color:#A5A29A;background:rgba(255,255,255,0.08);padding:3px 10px;border-radius:4px}
1499 - .result-group-monto{font-family:var(--mono);font-size:12px;color:#F0C14D} 1591 + .result-group-monto{font-family:var(--mono);font-size:13px;font-weight:500;color:#5AAF8A}
1500 .result-group-items{display:flex;flex-direction:column} 1592 .result-group-items{display:flex;flex-direction:column}
1501 1593
1502 /* Result Card */ 1594 /* Result Card */
1503 .result-card{display:flex;align-items:center;gap:12px;padding:12px 14px;background:transparent;border-radius:8px;text-decoration:none;transition:all 0.15s;border-bottom:1px solid rgba(255,255,255,0.06)} 1595 .result-card{display:flex;align-items:center;gap:12px;padding:12px 14px;background:transparent;border-radius:8px;text-decoration:none;transition:all 0.15s;border-bottom:1px solid rgba(255,255,255,0.06)}
1504 .result-card:last-child{border-bottom:none} 1596 .result-card:last-child{border-bottom:none}
1505 .result-card:hover{background:rgba(255,255,255,0.06)} 1597 .result-card:hover{background:rgba(255,255,255,0.06)}
1506 - .result-card-grouped{border-radius:6px;border-bottom:none;padding:10px 12px;margin-left:8px} 1598 + .result-card-selected{background:rgba(240,193,77,0.1);border-left:2px solid #F0C14D}
1507 - .result-card-grouped:hover{background:rgba(255,255,255,0.03)} 1599 + .result-card-grouped{border-radius:6px;border-bottom:1px solid rgba(255,255,255,0.04);padding:10px 14px;margin-left:12px;background:transparent}
1600 + .result-card-grouped:last-child{border-bottom:none}
1601 + .result-card-grouped:hover{background:rgba(255,255,255,0.04)}
1508 .result-content{flex:1;min-width:0} 1602 .result-content{flex:1;min-width:0}
1509 .result-text{font-family:var(--sans);font-size:14px;color:#F5F0E8;line-height:1.4} 1603 .result-text{font-family:var(--sans);font-size:14px;color:#F5F0E8;line-height:1.4}
1510 - .result-text :global(mark){background:rgba(240,193,77,0.85);color:#1C1C1A;border-radius:3px;padding:1px 5px;font-weight:600} 1604 + .result-text :global(mark){background:rgba(255,213,79,0.9);color:#1C1C1A;border-radius:3px;padding:1px 5px;font-weight:600}
1511 .result-meta{display:flex;align-items:center;gap:10px;margin-top:6px;flex-wrap:wrap} 1605 .result-meta{display:flex;align-items:center;gap:10px;margin-top:6px;flex-wrap:wrap}
1512 .result-parent,.result-subarea,.result-class-type{font-family:var(--mono);font-size:11px;color:#8B8880} 1606 .result-parent,.result-subarea,.result-class-type{font-family:var(--mono);font-size:11px;color:#8B8880}
1513 .result-year{font-family:var(--mono);font-size:12px;color:#8B8880;background:rgba(255,255,255,0.06);padding:2px 8px;border-radius:4px} 1607 .result-year{font-family:var(--mono);font-size:12px;color:#8B8880;background:rgba(255,255,255,0.06);padding:2px 8px;border-radius:4px}
1514 - .result-monto{font-family:var(--mono);font-size:12px;color:#F0C14D;margin-left:auto} 1608 + .result-monto{font-family:var(--mono);font-size:12px;color:#5AAF8A}
1609 + .result-entity{font-family:var(--sans);font-size:12px;color:#9B9890}
1610 + .result-sep{color:#6B6860;font-size:10px;margin:0 2px}
1515 .result-link-icon{color:#6B6860;opacity:0;transition:all 0.2s;flex-shrink:0} 1611 .result-link-icon{color:#6B6860;opacity:0;transition:all 0.2s;flex-shrink:0}
1516 .result-card:hover .result-link-icon{opacity:1} 1612 .result-card:hover .result-link-icon{opacity:1}
1517 1613
...@@ -1732,7 +1828,8 @@ ...@@ -1732,7 +1828,8 @@
1732 .mobile-settings-panel{display:block} 1828 .mobile-settings-panel{display:block}
1733 .search-icon{margin-left:0} 1829 .search-icon{margin-left:0}
1734 .search-input-wrap{order:1} 1830 .search-input-wrap{order:1}
1735 - .search-input-wrap input{font-size:15px;padding:10px 8px} 1831 + .search-input-wrap input{font-size:16px;padding:10px 8px}
1832 + .placeholder-text{font-size:14px}
1736 .placeholder-desktop{display:none} 1833 .placeholder-desktop{display:none}
1737 .placeholder-mobile{display:inline;font-size:14px} 1834 .placeholder-mobile{display:inline;font-size:14px}
1738 1835
...@@ -1740,7 +1837,7 @@ ...@@ -1740,7 +1837,7 @@
1740 .search-results{max-height:260px;border-radius:0 0 12px 12px} 1837 .search-results{max-height:260px;border-radius:0 0 12px 12px}
1741 .search-result-item{padding:12px 16px} 1838 .search-result-item{padding:12px 16px}
1742 .result-name{font-size:13px} 1839 .result-name{font-size:13px}
1743 - .result-meta{flex-direction:column;align-items:flex-end;gap:4px} 1840 + .result-meta{flex-direction:row;align-items:center;justify-content:flex-start;gap:8px}
1744 .result-code{font-size:9px} 1841 .result-code{font-size:9px}
1745 .result-type{font-size:8px} 1842 .result-type{font-size:8px}
1746 .pills{gap:6px} 1843 .pills{gap:6px}
...@@ -1750,31 +1847,39 @@ ...@@ -1750,31 +1847,39 @@
1750 .scroll-icon-touch{display:block} 1847 .scroll-icon-touch{display:block}
1751 1848
1752 /* New search responsive */ 1849 /* New search responsive */
1753 - .search-container{padding:0 16px} 1850 + .search-container{padding:0 16px;justify-content:flex-start;padding-top:100px}
1754 - .hero-title{font-size:clamp(32px,7vw,48px);margin-bottom:4px} 1851 + .hero-title{font-size:clamp(38px,9vw,52px);margin-bottom:4px}
1755 - .hero-sub{font-size:14px;margin-bottom:24px} 1852 + .hero-sub{font-size:14px;margin-bottom:20px}
1756 .filters-row{gap:12px;margin-top:16px} 1853 .filters-row{gap:12px;margin-top:16px}
1757 .filter-level{flex-direction:column;gap:8px} 1854 .filter-level{flex-direction:column;gap:8px}
1758 - .segmented-control{width:100%;justify-content:center} 1855 + .segmented-control{width:auto;justify-content:center}
1759 - .segment{flex:1;text-align:center;padding:10px 12px;font-size:13px} 1856 + .segment{text-align:center;padding:10px 16px;font-size:13px}
1760 .checkbox-group{justify-content:flex-start} 1857 .checkbox-group{justify-content:flex-start}
1761 .checkbox-chip{font-size:12px;padding:6px 12px} 1858 .checkbox-chip{font-size:12px;padding:6px 12px}
1762 - .examples{flex-direction:row;gap:8px} 1859 + .examples{flex-direction:row;gap:8px;margin-top:16px}
1763 - .examples-label{display:none} 1860 + .examples-label{display:inline;font-size:10px}
1764 .example-chip{font-size:12px;padding:6px 12px} 1861 .example-chip{font-size:12px;padding:6px 12px}
1862 + .results-area{margin-top:4px;min-height:40px}
1863 + .results-content-visible{padding:2px 4px}
1864 + .search-wrap-with-results{padding:2px}
1765 .daily-hint{padding:10px 14px;gap:8px} 1865 .daily-hint{padding:10px 14px;gap:8px}
1766 .daily-text{font-size:13px} 1866 .daily-text{font-size:13px}
1767 - .results-summary{padding:12px 14px} 1867 + .results-summary{padding:4px 0}
1768 - .summary-row{flex-direction:column;gap:12px} 1868 + .summary-row{flex-direction:row;gap:6px;flex-wrap:nowrap}
1769 - .summary-count{font-size:20px} 1869 + .summary-stats{gap:2px;flex:1}
1770 - .summary-meta{flex-wrap:wrap} 1870 + .summary-sep{margin:0 3px;font-size:10px}
1771 - .summary-tag{font-size:10px;padding:3px 8px} 1871 + .summary-count{font-size:12px}
1772 - .sort-buttons{width:100%;justify-content:flex-end} 1872 + .summary-tag-gold{font-size:14px}
1773 - .sort-btn{font-size:11px;padding:6px 10px} 1873 + .summary-label{font-size:11px}
1874 + .summary-tag{font-size:10px}
1875 + .sort-buttons{flex-shrink:0}
1876 + .sort-btn{font-size:11px;padding:5px 8px}
1774 .result-card{padding:12px 14px} 1877 .result-card{padding:12px 14px}
1775 .result-text{font-size:13px} 1878 .result-text{font-size:13px}
1776 .result-monto{font-size:11px} 1879 .result-monto{font-size:11px}
1777 .result-year{font-size:11px;padding:2px 6px} 1880 .result-year{font-size:11px;padding:2px 6px}
1881 + .result-entity{font-size:11px}
1882 + .result-sep{font-size:9px;margin:0 3px}
1778 .load-more-btn{font-size:13px;padding:10px 20px} 1883 .load-more-btn{font-size:13px;padding:10px 20px}
1779 1884
1780 /* Directory */ 1885 /* Directory */
...@@ -1865,9 +1970,12 @@ ...@@ -1865,9 +1970,12 @@
1865 .scroll-hint{display:none} 1970 .scroll-hint{display:none}
1866 1971
1867 /* New search 480px */ 1972 /* New search 480px */
1868 - .search-container{padding:0 12px} 1973 + .search-container{padding:0 12px;padding-top:80px}
1869 - .hero-title{font-size:clamp(28px,8vw,36px)} 1974 + .search-input-wrap input{font-size:15px}
1870 - .hero-sub{font-size:13px;margin-bottom:20px} 1975 + .placeholder-text{font-size:12px}
1976 + .hero-title{font-size:clamp(34px,10vw,44px)}
1977 + .hero-sub{font-size:13px;margin-bottom:16px}
1978 + .examples-label{font-size:9px}
1871 main[data-section="hero"] .nav-logo{top:16px;left:16px;height:60px} 1979 main[data-section="hero"] .nav-logo{top:16px;left:16px;height:60px}
1872 .nav-menu-btn{top:16px;right:16px;width:40px;height:40px} 1980 .nav-menu-btn{top:16px;right:16px;width:40px;height:40px}
1873 .segmented-control{padding:3px} 1981 .segmented-control{padding:3px}
...@@ -1876,20 +1984,31 @@ ...@@ -1876,20 +1984,31 @@
1876 .filter-level-label{font-size:10px} 1984 .filter-level-label{font-size:10px}
1877 .checkbox-chip{font-size:11px;padding:5px 10px;gap:6px} 1985 .checkbox-chip{font-size:11px;padding:5px 10px;gap:6px}
1878 .checkbox-box{width:14px;height:14px} 1986 .checkbox-box{width:14px;height:14px}
1987 + .examples{margin-top:14px}
1879 .example-chip{font-size:11px;padding:5px 10px} 1988 .example-chip{font-size:11px;padding:5px 10px}
1989 + .results-area{margin-top:2px;min-height:28px}
1990 + .results-content-visible{padding:0 2px}
1991 + .search-wrap-with-results{padding:2px}
1880 .daily-hint{padding:8px 12px;border-radius:10px} 1992 .daily-hint{padding:8px 12px;border-radius:10px}
1881 .daily-dot{width:6px;height:6px} 1993 .daily-dot{width:6px;height:6px}
1882 .daily-text{font-size:12px} 1994 .daily-text{font-size:12px}
1883 - .results-summary{padding:10px 12px;border-radius:10px} 1995 + .results-summary{padding:2px 0}
1884 - .summary-count{font-size:18px} 1996 + .summary-count{font-size:11px}
1997 + .summary-tag-gold{font-size:13px}
1998 + .summary-label{font-size:10px}
1999 + .summary-tag{font-size:9px}
2000 + .summary-sep{font-size:9px}
2001 + .sort-btn{font-size:10px;padding:4px 6px}
1885 .summary-header-text{font-size:12px} 2002 .summary-header-text{font-size:12px}
1886 .result-group-header{padding:10px 12px} 2003 .result-group-header{padding:10px 12px}
1887 .result-group-name{font-size:12px} 2004 .result-group-name{font-size:12px}
1888 .result-card{padding:10px 12px;border-radius:8px} 2005 .result-card{padding:10px 12px;border-radius:8px}
1889 .result-text{font-size:12px} 2006 .result-text{font-size:12px}
1890 - .result-meta{gap:6px;margin-top:4px} 2007 + .result-meta{flex-direction:row;gap:6px;margin-top:4px}
1891 .result-parent,.result-subarea,.result-class-type{font-size:10px} 2008 .result-parent,.result-subarea,.result-class-type{font-size:10px}
1892 .result-monto{font-size:10px} 2009 .result-monto{font-size:10px}
2010 + .result-entity{font-size:10px}
2011 + .result-sep{font-size:8px;margin:0 2px}
1893 .load-more-btn{font-size:12px;padding:8px 16px;border-radius:8px} 2012 .load-more-btn{font-size:12px;padding:8px 16px;border-radius:8px}
1894 2013
1895 /* Directory */ 2014 /* Directory */
......