|
8 | 8 | import { countryCodeToEmoji } from '$lib/utils/countryCodeToEmoji'; |
9 | 9 | import { enhance } from '$app/forms'; |
10 | 10 | import CrossfilterAppsTable from '$lib/CrossfilterAppsTable.svelte'; |
11 | | - import WhiteCard from '$lib/WhiteCard.svelte'; |
12 | 11 |
|
13 | 12 | import type { CatData, CrossfilterApp } from '../.././types'; |
14 | 13 |
|
|
185 | 184 | <div class="container mx-auto px-2 md:px-4 py-4 md:py-8"> |
186 | 185 | <div class="mb-6"> |
187 | 186 | <h1 class="text-2xl md:text-3xl font-bold text-primary-900-100">App Explorer</h1> |
188 | | - <p class="text-sm md:text-base text-surface-600-400 mt-2"> |
| 187 | + <p class="text-sm md:text-base text-primary-900-100 mt-2"> |
189 | 188 | Powerful app discovery and filtering tool for sales teams, market researchers, and app |
190 | 189 | developers. |
191 | 190 | </p> |
192 | 191 | </div> |
193 | 192 |
|
194 | | - {#if !hasPaidAccess} |
195 | | - <!-- Explanatory Content - Only shown to non-paid users --> |
196 | | - <WhiteCard> |
197 | | - {#snippet title()} |
198 | | - <span>About App Explorer / App CrossFilter / App Query</span> |
199 | | - {/snippet} |
200 | | - <div class="p-4 flex flex-col gap-4"> |
201 | | - <div class="space-y-3"> |
202 | | - <p> |
203 | | - The <strong>App Explorer</strong> (also known as <strong>App CrossFilter</strong> or |
204 | | - <strong>App Query</strong>) is a powerful tool that allows you to discover and filter |
205 | | - mobile apps based on multiple criteria simultaneously. |
206 | | - </p> |
207 | | - |
208 | | - <div> |
209 | | - <h3 class="font-semibold text-lg mb-2">Key Features:</h3> |
210 | | - <ul class="list-disc list-inside space-y-2 text-sm"> |
211 | | - <li> |
212 | | - <strong>SDK & Company Filtering:</strong> Find apps that use specific SDKs or companies |
213 | | - (include/exclude multiple companies) |
214 | | - </li> |
215 | | - <li> |
216 | | - <strong>Monetization Filters:</strong> Filter by in-app purchases, ad support, and SDK/API |
217 | | - detection requirements |
218 | | - </li> |
219 | | - <li> |
220 | | - <strong>Store & Category:</strong> Narrow down by app store (Google Play, Apple App Store) |
221 | | - and category |
222 | | - </li> |
223 | | - <li> |
224 | | - <strong>Metrics Filtering:</strong> Filter by install counts, rating counts, and monthly |
225 | | - installs with min/max ranges |
226 | | - </li> |
227 | | - <li> |
228 | | - <strong>Date Filtering:</strong> Find apps updated after a specific date |
229 | | - </li> |
230 | | - <li> |
231 | | - <strong>Export Results:</strong> Download filtered results as CSV for further analysis |
232 | | - </li> |
233 | | - </ul> |
234 | | - </div> |
235 | | - |
236 | | - <div> |
237 | | - <h3 class="font-semibold text-lg mb-2">Use Cases:</h3> |
238 | | - <ul class="list-disc list-inside space-y-2 text-sm"> |
239 | | - <li> |
240 | | - <strong>Sales Teams:</strong> Find potential customers by identifying apps using competitor |
241 | | - SDKs or specific technologies |
242 | | - </li> |
243 | | - <li> |
244 | | - <strong>Market Research:</strong> Analyze app ecosystems by filtering apps with specific |
245 | | - monetization strategies |
246 | | - </li> |
247 | | - <li> |
248 | | - <strong>Competitive Analysis:</strong> Discover apps in your category that use certain |
249 | | - SDKs or ad networks |
250 | | - </li> |
251 | | - <li> |
252 | | - <strong>Partnership Opportunities:</strong> Identify apps that could benefit from your |
253 | | - SDK or service |
254 | | - </li> |
255 | | - </ul> |
256 | | - </div> |
257 | | - |
258 | | - <div class="mt-4 p-4 bg-surface-100-900 rounded-lg border border-surface-300-700"> |
259 | | - <p class="text-sm mb-3"> |
260 | | - <strong>Access Required:</strong> The App Explorer is available to paid subscribers at |
261 | | - any level. Please |
262 | | - <a href="/pricing" class="underline hover:text-primary-600-400" |
263 | | - >upgrade your account</a |
264 | | - > to use this tool. |
265 | | - </p> |
266 | | - <a href="/pricing" class="btn preset-filled-primary-500 inline-flex items-center gap-2"> |
267 | | - <svg |
268 | | - xmlns="http://www.w3.org/2000/svg" |
269 | | - width="18" |
270 | | - height="18" |
271 | | - viewBox="0 0 24 24" |
272 | | - fill="none" |
273 | | - stroke="currentColor" |
274 | | - stroke-width="2" |
275 | | - stroke-linecap="round" |
276 | | - stroke-linejoin="round" |
277 | | - aria-hidden="true" |
278 | | - > |
279 | | - <rect x="3" y="11" width="18" height="11" rx="2" ry="2" /> |
280 | | - <path d="M7 11V7a5 5 0 0 1 10 0v4" /> |
281 | | - </svg> |
282 | | - <span>View Pricing Plans</span> |
283 | | - </a> |
284 | | - </div> |
285 | | - </div> |
286 | | - </div> |
287 | | - </WhiteCard> |
288 | | - {/if} |
289 | | - |
290 | 193 | <div class="mt-6"> |
291 | | - {#if hasPaidAccess} |
292 | | - <h2 class="text-xl md:text-2xl font-bold text-primary-900-100 mb-4">Start Exploring</h2> |
293 | | - {:else} |
| 194 | + {#if !hasPaidAccess} |
294 | 195 | <h2 class="text-xl md:text-2xl font-bold text-primary-900-100 mb-4">Preview</h2> |
295 | 196 | {/if} |
296 | 197 | </div> |
|
368 | 269 | class="space-y-5" |
369 | 270 | > |
370 | 271 | <div class="space-y-4 p-3 rounded-lg border border-surface-300-700 bg-surface-100-900/40"> |
371 | | - <h3 class="font-semibold text-sm uppercase tracking-wide text-surface-700-300"> |
| 272 | + <h3 class="font-semibold text-sm uppercase tracking-wide text-primary-900-100"> |
372 | 273 | App Details & Metrics |
373 | 274 | </h3> |
374 | 275 |
|
375 | 276 | <!-- App Details --> |
376 | 277 | <div class="space-y-2"> |
377 | | - <label class="label text-xs text-surface-500" for="store-select">Store</label> |
| 278 | + <label class="label text-xs text-primary-900-100" for="store-select">Store</label> |
378 | 279 | <select class="select text-sm" id="store-select" bind:value={selectedStore}> |
379 | 280 | <option value="">Any Store</option> |
380 | 281 | <option value="1">Google Play</option> |
381 | 282 | <option value="2">Apple App Store</option> |
382 | 283 | </select> |
383 | 284 |
|
384 | | - <label class="label text-xs text-surface-500 mt-2" for="category-select">Category</label |
| 285 | + <label class="label text-xs text-primary-900-100 mt-2" for="category-select" |
| 286 | + >Category</label |
385 | 287 | > |
386 | 288 | <select class="select text-sm" id="category-select" bind:value={selectedCategory}> |
387 | 289 | <option value="">Any Category</option> |
|
398 | 300 | <!-- Installs --> |
399 | 301 | <div class="grid grid-cols-2 gap-2"> |
400 | 302 | <div class="space-y-1"> |
401 | | - <label class="text-xs text-surface-500" for="min-installs">Min Installs</label> |
| 303 | + <label class="text-xs text-primary-900-100" for="min-installs">Min Installs</label> |
402 | 304 | <input |
403 | 305 | type="number" |
404 | 306 | id="min-installs" |
|
408 | 310 | /> |
409 | 311 | </div> |
410 | 312 | <div class="space-y-1"> |
411 | | - <label class="text-xs text-surface-500" for="max-installs">Max Installs</label> |
| 313 | + <label class="text-xs text-primary-900-100" for="max-installs">Max Installs</label> |
412 | 314 | <input |
413 | 315 | type="number" |
414 | 316 | id="max-installs" |
|
422 | 324 | <!-- Monthly Installs --> |
423 | 325 | <div class="grid grid-cols-2 gap-2"> |
424 | 326 | <div class="space-y-1"> |
425 | | - <label class="text-xs text-surface-500" for="min-monthly" |
| 327 | + <label class="text-xs text-primary-900-100" for="min-monthly" |
426 | 328 | >Min Monthly Installs</label |
427 | 329 | > |
428 | 330 | <input |
|
434 | 336 | /> |
435 | 337 | </div> |
436 | 338 | <div class="space-y-1"> |
437 | | - <label class="text-xs text-surface-500" for="max-monthly" |
| 339 | + <label class="text-xs text-primary-900-100" for="max-monthly" |
438 | 340 | >Max Monthly Installs</label |
439 | 341 | > |
440 | 342 | <input |
|
450 | 352 | <!-- Ratings --> |
451 | 353 | <div class="grid grid-cols-2 gap-2"> |
452 | 354 | <div class="space-y-1"> |
453 | | - <label class="text-xs text-surface-500" for="min-ratings">Min Ratings</label> |
| 355 | + <label class="text-xs text-primary-900-100" for="min-ratings">Min Ratings</label> |
454 | 356 | <input |
455 | 357 | type="number" |
456 | 358 | id="min-ratings" |
|
460 | 362 | /> |
461 | 363 | </div> |
462 | 364 | <div class="space-y-1"> |
463 | | - <label class="text-xs text-surface-500" for="max-ratings">Max Ratings</label> |
| 365 | + <label class="text-xs text-primary-900-100" for="max-ratings">Max Ratings</label> |
464 | 366 | <input |
465 | 367 | type="number" |
466 | 368 | id="max-ratings" |
|
490 | 392 | <label class="label font-medium text-sm" for="date-filter">Last Updated After</label> |
491 | 393 | <input type="date" id="date-filter" class="input text-sm" bind:value={myDate} /> |
492 | 394 | </div> |
| 395 | + </div> |
493 | 396 |
|
494 | | - <!-- Current Ranking Filter --> |
| 397 | + <div class="space-y-4 p-3 rounded-lg border border-surface-300-700 bg-surface-100-900/40"> |
| 398 | + <h3 class="font-semibold text-sm uppercase tracking-wide text-primary-900-100"> |
| 399 | + App Store Ranks |
| 400 | + </h3> |
495 | 401 | <div class="space-y-2"> |
496 | | - <label class="label font-medium text-sm" for="ranking-filter" |
497 | | - >Apps that Are Currently Ranking</label |
498 | | - > |
499 | | - <p class="text-xs text-surface-500"> |
| 402 | + <label class="label font-medium text-sm" for="ranking-filter">Ranking Filter</label> |
| 403 | + <p class="text-xs text-primary-900-100"> |
500 | 404 | Leave unset for all apps, choose overall for any ranking country, or choose one |
501 | 405 | specific country. |
502 | 406 | </p> |
|
514 | 418 | </div> |
515 | 419 |
|
516 | 420 | <div class="space-y-4 p-3 rounded-lg border border-surface-300-700 bg-surface-100-900/40"> |
517 | | - <h3 class="font-semibold text-sm uppercase tracking-wide text-surface-700-300"> |
| 421 | + <h3 class="font-semibold text-sm uppercase tracking-wide text-primary-900-100"> |
518 | 422 | Company Filters |
519 | 423 | </h3> |
520 | 424 |
|
|
531 | 435 | <!-- Include Companies --> |
532 | 436 | <div class="space-y-2"> |
533 | 437 | <label class="label font-medium text-sm" for="include-search">Include Companies</label> |
534 | | - <p class="text-xs text-surface-500">Apps must use ALL selected SDKs/companies</p> |
| 438 | + <p class="text-xs text-primary-900-100">Apps must use ALL selected SDKs/companies</p> |
535 | 439 | <div class="relative"> |
536 | 440 | <input |
537 | 441 | type="text" |
|
556 | 460 | onmousedown={() => addIncludeDomain(company.company_domain)} |
557 | 461 | > |
558 | 462 | <span>{company.company_name}</span> |
559 | | - <span class="text-xs text-surface-500" |
| 463 | + <span class="text-xs text-primary-900-100" |
560 | 464 | >{formatNumber(company.total_apps)} apps</span |
561 | 465 | > |
562 | 466 | </button> |
|
584 | 488 | <!-- Exclude Companies --> |
585 | 489 | <div class="space-y-2"> |
586 | 490 | <label class="label font-medium text-sm" for="exclude-search">Exclude Companies</label> |
587 | | - <p class="text-xs text-surface-500">Apps must NOT use any of these</p> |
| 491 | + <p class="text-xs text-primary-900-100">Apps must NOT use any of these</p> |
588 | 492 | <div class="relative"> |
589 | 493 | <input |
590 | 494 | type="text" |
|
609 | 513 | onmousedown={() => addExcludeDomain(company.company_domain)} |
610 | 514 | > |
611 | 515 | <span>{company.company_name}</span> |
612 | | - <span class="text-xs text-surface-500" |
| 516 | + <span class="text-xs text-primary-900-100" |
613 | 517 | >{formatNumber(company.total_apps)} apps</span |
614 | 518 | > |
615 | 519 | </button> |
|
692 | 596 |
|
693 | 597 | <!-- Filter Summary --> |
694 | 598 | {#if includeDomains.length > 0} |
695 | | - <div class="text-xs text-surface-500 pt-2 border-t border-surface-300-700"> |
| 599 | + <div class="text-xs text-primary-900-100 pt-2 border-t border-surface-300-700"> |
696 | 600 | <p> |
697 | 601 | <strong>Query:</strong> Apps using {includeDomains.length} selected SDK{includeDomains.length > |
698 | 602 | 1 |
|
707 | 611 | <!-- Results Table --> |
708 | 612 | <main class="card preset-tonal p-4 overflow-hidden"> |
709 | 613 | {#if !hasPaidAccess} |
710 | | - <div class="text-center py-16 relative"> |
711 | | - <div class="absolute inset-0 flex items-center justify-center opacity-10"> |
| 614 | + <div class="py-10 relative"> |
| 615 | + <div class="absolute inset-0 flex items-start justify-center opacity-10 pt-8"> |
712 | 616 | <Filter size={120} class="text-surface-500" /> |
713 | 617 | </div> |
714 | | - <div class="relative z-10"> |
| 618 | + <div class="relative max-w-3xl mx-auto"> |
715 | 619 | <svg |
716 | 620 | xmlns="http://www.w3.org/2000/svg" |
717 | 621 | width="64" |
|
727 | 631 | <rect x="3" y="11" width="18" height="11" rx="2" ry="2" /> |
728 | 632 | <path d="M7 11V7a5 5 0 0 1 10 0v4" /> |
729 | 633 | </svg> |
730 | | - <p class="text-lg font-medium mb-2">Results Area Locked</p> |
731 | | - <p class="text-sm text-surface-600-400 mb-4"> |
732 | | - App search results will appear here once you upgrade. Configure filters on the left to |
733 | | - see what you can discover. |
| 634 | + <p class="text-lg font-medium mb-3 text-center">Results Area Locked</p> |
| 635 | + <p class="text-sm text-primary-900-100 mb-6 text-center"> |
| 636 | + The <strong>App Explorer</strong> (also known as <strong>App CrossFilter</strong> or |
| 637 | + <strong>App Query</strong>) helps you discover and filter mobile apps with advanced |
| 638 | + criteria. |
734 | 639 | </p> |
735 | | - <a href="/pricing" class="btn preset-filled-primary-500 inline-flex items-center gap-2"> |
736 | | - <svg |
737 | | - xmlns="http://www.w3.org/2000/svg" |
738 | | - width="18" |
739 | | - height="18" |
740 | | - viewBox="0 0 24 24" |
741 | | - fill="none" |
742 | | - stroke="currentColor" |
743 | | - stroke-width="2" |
744 | | - stroke-linecap="round" |
745 | | - stroke-linejoin="round" |
746 | | - aria-hidden="true" |
| 640 | + |
| 641 | + <div class="space-y-6 text-primary-900-100"> |
| 642 | + <div> |
| 643 | + <h3 class="font-semibold text-lg mb-2">Key Features</h3> |
| 644 | + <ul class="list-disc list-inside space-y-2 text-sm"> |
| 645 | + <li> |
| 646 | + <strong>SDK & Company Filtering:</strong> Find apps using specific SDKs and companies. |
| 647 | + </li> |
| 648 | + <li> |
| 649 | + <strong>Monetization Filters:</strong> Filter by in-app purchases, ads, and detection |
| 650 | + requirements. |
| 651 | + </li> |
| 652 | + <li> |
| 653 | + <strong>Store & Category:</strong> Narrow down by Google Play / Apple App Store and |
| 654 | + category. |
| 655 | + </li> |
| 656 | + <li> |
| 657 | + <strong>Metrics Filtering:</strong> Filter installs, ratings, and monthly installs |
| 658 | + ranges. |
| 659 | + </li> |
| 660 | + <li> |
| 661 | + <strong>Date & Rankings:</strong> Filter by recent updates and current store ranking |
| 662 | + status. |
| 663 | + </li> |
| 664 | + </ul> |
| 665 | + </div> |
| 666 | + |
| 667 | + <div> |
| 668 | + <h3 class="font-semibold text-lg mb-2">Use Cases</h3> |
| 669 | + <ul class="list-disc list-inside space-y-2 text-sm"> |
| 670 | + <li> |
| 671 | + <strong>Sales Teams:</strong> Identify potential customers using competitor SDKs. |
| 672 | + </li> |
| 673 | + <li> |
| 674 | + <strong>Market Research:</strong> Analyze ecosystems by monetization strategy. |
| 675 | + </li> |
| 676 | + <li> |
| 677 | + <strong>Competitive Analysis:</strong> Discover peers in your category and store. |
| 678 | + </li> |
| 679 | + <li> |
| 680 | + <strong>Partnership Discovery:</strong> Find apps likely to benefit from your SDK. |
| 681 | + </li> |
| 682 | + </ul> |
| 683 | + </div> |
| 684 | + </div> |
| 685 | + |
| 686 | + <div |
| 687 | + class="mt-6 p-4 bg-surface-100-900 rounded-lg border border-surface-300-700 text-center" |
| 688 | + > |
| 689 | + <p class="text-sm mb-3 text-primary-900-100"> |
| 690 | + <strong>Access Required:</strong> App Explorer is available to paid subscribers. |
| 691 | + </p> |
| 692 | + <a |
| 693 | + href="/pricing" |
| 694 | + class="btn preset-filled-primary-500 inline-flex items-center gap-2" |
747 | 695 | > |
748 | | - <rect x="3" y="11" width="18" height="11" rx="2" ry="2" /> |
749 | | - <path d="M7 11V7a5 5 0 0 1 10 0v4" /> |
750 | | - </svg> |
751 | | - <span>Upgrade to Unlock</span> |
752 | | - </a> |
| 696 | + <span class="inline text-white"> View Pricing Plans</span> |
| 697 | + </a> |
| 698 | + </div> |
753 | 699 | </div> |
754 | 700 | </div> |
755 | 701 | {:else if !hasSearched()} |
|
0 commit comments