|
335 | 335 | white-space: pre-wrap; |
336 | 336 | word-wrap: break-word; |
337 | 337 | } |
| 338 | + .modal-footer { |
| 339 | + margin-top: 1.5rem; |
| 340 | + padding-top: 1rem; |
| 341 | + border-top: 1px solid var(--border-color); |
| 342 | + text-align: right; |
| 343 | + } |
| 344 | + .modal-close-footer-btn { |
| 345 | + padding: 0.6rem 1.5rem; |
| 346 | + background: var(--primary-color); |
| 347 | + color: white; |
| 348 | + border: none; |
| 349 | + border-radius: 8px; |
| 350 | + font-size: 0.9rem; |
| 351 | + font-weight: 500; |
| 352 | + cursor: pointer; |
| 353 | + transition: background 0.2s; |
| 354 | + } |
| 355 | + .modal-close-footer-btn:hover { |
| 356 | + background: var(--primary-hover); |
| 357 | + } |
| 358 | + .keywords-title { |
| 359 | + font-size: 0.75rem; |
| 360 | + font-weight: 600; |
| 361 | + color: var(--text-secondary); |
| 362 | + text-transform: uppercase; |
| 363 | + letter-spacing: 0.05em; |
| 364 | + margin-top: 0.75rem; |
| 365 | + margin-bottom: 0.5rem; |
| 366 | + } |
| 367 | + .keywords-list { |
| 368 | + display: flex; |
| 369 | + flex-wrap: wrap; |
| 370 | + gap: 0.4rem; |
| 371 | + } |
| 372 | + .keyword-tag { |
| 373 | + display: inline-block; |
| 374 | + padding: 0.25rem 0.5rem; |
| 375 | + background: #e0e7ff; |
| 376 | + border-radius: 4px; |
| 377 | + font-size: 0.75rem; |
| 378 | + color: #3730a3; |
| 379 | + } |
338 | 380 | .card-body { |
339 | 381 | padding: 1rem 1.25rem 1.25rem; |
340 | 382 | } |
|
426 | 468 |
|
427 | 469 | <div class="services-grid"> |
428 | 470 | <xsl:for-each select="TableClothCatalog/InternetServices/Service"> |
429 | | - <div class="service-card" data-category="{@Category}" data-id="{@Id}" data-name="{@DisplayName}" data-name-en="{@en-US-DisplayName}" data-packages="{Packages/Package/@Name}"> |
| 471 | + <div class="service-card" data-category="{@Category}" data-id="{@Id}" data-name="{@DisplayName}" data-name-en="{@en-US-DisplayName}" data-packages="{Packages/Package/@Name}" data-keywords="{SearchKeywords}"> |
430 | 472 | <div class="card-header"> |
431 | 473 | <img class="service-icon" |
432 | 474 | src="images/{@Category}/{@Id}.png" |
|
469 | 511 | </xsl:for-each> |
470 | 512 | </ul> |
471 | 513 | </xsl:if> |
| 514 | + <xsl:if test="SearchKeywords"> |
| 515 | + <div class="keywords-title" data-i18n="searchKeywords">검색 키워드</div> |
| 516 | + <div class="keywords-list" data-keywords="{SearchKeywords}"></div> |
| 517 | + </xsl:if> |
472 | 518 | </div> |
473 | 519 | </div> |
474 | 520 | </xsl:for-each> |
|
490 | 536 | <button class="modal-close-btn" onclick="closeModal()">✕</button> |
491 | 537 | </div> |
492 | 538 | <div class="modal-body" id="modalText"></div> |
| 539 | + <div class="modal-footer"> |
| 540 | + <button class="modal-close-footer-btn" onclick="closeModal()" data-i18n="closeBtn">닫기</button> |
| 541 | + </div> |
493 | 542 | </div> |
494 | 543 | </div> |
495 | 544 |
|
|
517 | 566 | filterSecurity: '💹 증권', |
518 | 567 | filterOther: '📁 기타', |
519 | 568 | requiredPackages: '필요 패키지', |
| 569 | + searchKeywords: '검색 키워드', |
520 | 570 | warning: '⚠️ 주의', |
521 | 571 | viewDetails: '상세 정보 보기', |
522 | 572 | noResults: '🔍 검색 결과가 없습니다.', |
523 | 573 | madeWith: 'Made with ❤️ for Korean Internet Banking Users', |
524 | 574 | compatTitle: '⚠️ 호환성 안내', |
| 575 | + closeBtn: '닫기', |
525 | 576 | categoryBanking: '🏦 은행', |
526 | 577 | categoryCreditCard: '💳 카드', |
527 | 578 | categoryGovernment: '🏛️ 공공기관', |
|
550 | 601 | filterSecurity: '💹 Securities', |
551 | 602 | filterOther: '📁 Other', |
552 | 603 | requiredPackages: 'Required Packages', |
| 604 | + searchKeywords: 'Search Keywords', |
553 | 605 | warning: '⚠️ Warning', |
554 | 606 | viewDetails: 'View details', |
555 | 607 | noResults: '🔍 No results found.', |
556 | 608 | madeWith: 'Made with ❤️ for Korean Internet Banking Users', |
557 | 609 | compatTitle: '⚠️ Compatibility Notice', |
| 610 | + closeBtn: 'Close', |
558 | 611 | categoryBanking: '🏦 Banking', |
559 | 612 | categoryCreditCard: '💳 Credit Card', |
560 | 613 | categoryGovernment: '🏛️ Government', |
|
677 | 730 | const serviceName = (card.dataset.name || '').toLowerCase(); |
678 | 731 | const category = (card.dataset.category || '').toLowerCase(); |
679 | 732 | const packages = (card.dataset.packages || '').toLowerCase(); |
| 733 | + const keywords = (card.dataset.keywords || '').toLowerCase(); |
680 | 734 | searchMatch = serviceId.includes(searchTerm) || |
681 | 735 | serviceName.includes(searchTerm) || |
682 | 736 | category.includes(searchTerm) || |
683 | | - packages.includes(searchTerm); |
| 737 | + packages.includes(searchTerm) || |
| 738 | + keywords.includes(searchTerm); |
684 | 739 | } |
685 | 740 |
|
686 | 741 | const shouldShow = categoryMatch && searchMatch; |
|
725 | 780 | closeModal(); |
726 | 781 | } |
727 | 782 | }); |
| 783 | + |
| 784 | + // 페이지 로드 시 키워드 렌더링 |
| 785 | + document.addEventListener('DOMContentLoaded', function() { |
| 786 | + document.querySelectorAll('.keywords-list').forEach(container => { |
| 787 | + const keywords = container.getAttribute('data-keywords'); |
| 788 | + if (keywords) { |
| 789 | + const keywordArray = keywords.split(';').map(k => k.trim()).filter(k => k); |
| 790 | + container.innerHTML = keywordArray.map(keyword => |
| 791 | + '<span class="keyword-tag">' + keyword + '</span>' |
| 792 | + ).join(''); |
| 793 | + } |
| 794 | + }); |
| 795 | + }); |
728 | 796 | </script> |
729 | 797 | </body> |
730 | 798 | </html> |
|
0 commit comments