1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <title>Kevin Kam - Apps</title> 7 <style>[v-cloak]{display:none!important}</style> 8 <link rel="stylesheet" href="./assets/css/style.css"> 9</head> 10<body> 11 <div id="app" v-cloak> 12 <header> 13 <div class="container"> 14 <h1>Kevin Kam</h1> 15 <p class="subtitle">{{ translations[currentLang].subtitle }}</p> 16 <div class="social-links"> 17 <!-- Instagram and YouTube temporarily hidden --> 18 <a href="https://instagram.com/icaros0226" target="_blank" rel="noopener noreferrer" aria-label="Instagram" class="social-link instagram" style="display: none;"> 19 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 20 <path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162 0 3.403 2.759 6.162 6.162 6.162 3.403 0 6.162-2.759 6.162-6.162 0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4 2.209 0 4 1.791 4 4 0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44 0 .795.645 1.44 1.441 1.44.795 0 1.44-.645 1.44-1.44 0-.795-.645-1.44-1.44-1.44z" fill="white"/> 21 </svg> 22 </a> 23 <a href="https://www.youtube.com/@icaros0226" target="_blank" rel="noopener noreferrer" aria-label="YouTube" class="social-link youtube" style="display: none;"> 24 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 25 <path d="M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z" fill="white"/> 26 </svg> 27 </a> 28 <a href="https://shkam.tistory.com/" target="_blank" rel="noopener noreferrer" aria-label="Tistory" class="social-link tistory"> 29 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 30 <text x="50%" y="50%" dominant-baseline="central" text-anchor="middle" font-family="Arial, sans-serif" font-size="18" font-weight="bold" fill="currentColor">T</text> 31 </svg> 32 </a> 33 </div> 34 </div> 35 </header> 36 37 <main> 38 <div class="container"> 39 <section class="apps-grid"> 40 <div 41 v-for="app in appsData" 42 :key="app.slug" 43 class="app-card clickable" 44 @click="handleCardClick(app, $event)" 45 > 46 <a 47 :href="getAppDetailUrl(app)" 48 class="app-icon-link" 49 @click.stop 50 > 51 <div class="app-icon"> 52 <img 53 v-if="app.appIconUrl" 54 :src="app.appIconUrl" 55 :alt="getAppName(app) + ' ìì´ì½'" 56 class="app-icon-img" 57 @error="handleImageError($event, app)" 58 />
59 <span v-else class="app-icon-fallback">{{ app.icon || getAppName(app).charAt(0).toUpperCase() }}</span> 60 </div> 61 </a> 62 <h3>{{ getAppName(app) }}</h3> 63 <p>{{ getAppDescription(app) }}</p> 64 <div class="app-links" @click.stop> 65 <a 66 v-if="app.appStoreUrl" 67 :href="app.appStoreUrl" 68 target="_blank" 69 class="btn btn-primary" 70 > 71 {{ getAppStoreLabel(app) }} 72 </a> 73 <a 74 v-if="app.playStoreUrl" 75 :href="app.playStoreUrl" 76 target="_blank" 77 class="btn btn-primary" 78 > 79 Android 80 </a> 81 </div> 82 </div> 83 </section> 84 </div> 85 </main> 86 87 <footer> 88 <div class="container"> 89 <p>© 2025 Kevin Kam. All rights reserved.</p> 90 <p class="contact">Contact: <a href="mailto:[email protected]">[email protected]</a></p> 91 </div> 92 </footer> 93 </div> 94 95
95<script src="./assets/js/vendor/vue.global.prod.js"></script>
95 96
96<script src="./assets/js/apps-data.js"></script>
96 97
97<script src="./assets/js/app-utils.js"></script>
97 98
98<script src="./assets/js/main.js"></script>
98 99</body> 100</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.