├── .npmrc
├── netlify.toml
├── static
├── favicon.png
└── no_cover.png
├── .prettierignore
├── src
├── lib
│ ├── components
│ │ ├── ui
│ │ │ ├── sonner
│ │ │ │ ├── index.ts
│ │ │ │ └── sonner.svelte
│ │ │ ├── progress
│ │ │ │ ├── index.ts
│ │ │ │ └── progress.svelte
│ │ │ ├── skeleton
│ │ │ │ ├── index.ts
│ │ │ │ └── skeleton.svelte
│ │ │ ├── dialog
│ │ │ │ ├── dialog-portal.svelte
│ │ │ │ ├── dialog-header.svelte
│ │ │ │ ├── dialog-footer.svelte
│ │ │ │ ├── dialog-title.svelte
│ │ │ │ ├── dialog-description.svelte
│ │ │ │ ├── dialog-overlay.svelte
│ │ │ │ ├── index.ts
│ │ │ │ └── dialog-content.svelte
│ │ │ ├── card
│ │ │ │ ├── card-content.svelte
│ │ │ │ ├── card-footer.svelte
│ │ │ │ ├── card-header.svelte
│ │ │ │ ├── card-description.svelte
│ │ │ │ ├── card.svelte
│ │ │ │ ├── card-title.svelte
│ │ │ │ └── index.ts
│ │ │ ├── pagination
│ │ │ │ ├── pagination-item.svelte
│ │ │ │ ├── pagination-content.svelte
│ │ │ │ ├── pagination-ellipsis.svelte
│ │ │ │ ├── index.ts
│ │ │ │ ├── pagination-next-button.svelte
│ │ │ │ ├── pagination-prev-button.svelte
│ │ │ │ ├── pagination-link.svelte
│ │ │ │ └── pagination.svelte
│ │ │ ├── select
│ │ │ │ ├── select-separator.svelte
│ │ │ │ ├── select-label.svelte
│ │ │ │ ├── index.ts
│ │ │ │ ├── select-trigger.svelte
│ │ │ │ ├── select-content.svelte
│ │ │ │ └── select-item.svelte
│ │ │ ├── table
│ │ │ │ ├── table-body.svelte
│ │ │ │ ├── table-caption.svelte
│ │ │ │ ├── table-footer.svelte
│ │ │ │ ├── table-cell.svelte
│ │ │ │ ├── table.svelte
│ │ │ │ ├── table-head.svelte
│ │ │ │ ├── table-header.svelte
│ │ │ │ ├── table-row.svelte
│ │ │ │ └── index.ts
│ │ │ ├── badge
│ │ │ │ ├── badge.svelte
│ │ │ │ └── index.ts
│ │ │ ├── button
│ │ │ │ ├── button.svelte
│ │ │ │ └── index.ts
│ │ │ └── input
│ │ │ │ ├── index.ts
│ │ │ │ └── input.svelte
│ │ ├── GlobalLoading.svelte
│ │ ├── BookSkeleton.svelte
│ │ ├── ThemeSwitch.svelte
│ │ ├── Paginator.svelte
│ │ ├── SearchBar.svelte
│ │ ├── DownloadProgress.svelte
│ │ └── BookUI.svelte
│ ├── index.ts
│ ├── constants.ts
│ ├── types
│ │ └── Book.ts
│ └── utils.ts
├── app.d.ts
├── store
│ ├── globalStore.ts
│ └── downloadStore.ts
├── app.html
├── routes
│ ├── +page.svelte
│ ├── search
│ │ ├── +page.server.ts
│ │ └── +page.svelte
│ └── +layout.svelte
└── app.css
├── postcss.config.js
├── vite.config.ts
├── .gitignore
├── .prettierrc
├── components.json
├── tsconfig.json
├── eslint.config.js
├── svelte.config.js
├── README.md
├── package.json
└── tailwind.config.ts
/.npmrc:
--------------------------------------------------------------------------------
1 | engine-strict=true
2 |
--------------------------------------------------------------------------------
/netlify.toml:
--------------------------------------------------------------------------------
1 | [build]
2 | command = "npm run build"
3 | publish = "build"
4 |
--------------------------------------------------------------------------------
/static/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/henacodes/libros/HEAD/static/favicon.png
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | # Package Managers
2 | package-lock.json
3 | pnpm-lock.yaml
4 | yarn.lock
5 |
--------------------------------------------------------------------------------
/static/no_cover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/henacodes/libros/HEAD/static/no_cover.png
--------------------------------------------------------------------------------
/src/lib/components/ui/sonner/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Toaster } from "./sonner.svelte";
2 |
--------------------------------------------------------------------------------
/src/lib/index.ts:
--------------------------------------------------------------------------------
1 | // place files you want to import through the `$lib` alias in this folder.
2 |
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {}
5 | }
6 | };
7 |
--------------------------------------------------------------------------------
/src/lib/components/ui/progress/index.ts:
--------------------------------------------------------------------------------
1 | import Root from "./progress.svelte";
2 |
3 | export {
4 | Root,
5 | //
6 | Root as Progress,
7 | };
8 |
--------------------------------------------------------------------------------
/src/lib/components/ui/skeleton/index.ts:
--------------------------------------------------------------------------------
1 | import Root from "./skeleton.svelte";
2 |
3 | export {
4 | Root,
5 | //
6 | Root as Skeleton,
7 | };
8 |
--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { sveltekit } from '@sveltejs/kit/vite';
2 | import { defineConfig } from 'vite';
3 |
4 | export default defineConfig({
5 | plugins: [sveltekit()]
6 | });
7 |
--------------------------------------------------------------------------------
/src/lib/constants.ts:
--------------------------------------------------------------------------------
1 | export const API_SERVER_URL = 'https://libros-server.onrender.com'; //'http://localhost:3000';
2 | export const NOT_AVAILABLE = 'N/A';
3 | export const DOWNLOAD_HISTORY = 'download-history';
4 |
--------------------------------------------------------------------------------
/src/lib/components/ui/dialog/dialog-portal.svelte:
--------------------------------------------------------------------------------
1 |
5 |
6 |
12 |
You dont have any downloads so far in this session
11 | {:else} 12 |{download.title.replace(/\d{5,}/g, '')}
20 |{download.authors}
21 | {#if download.total === 0} 22 |31 | {Math.round((download.loaded / (1024 * 1024) + Number.EPSILON) * 100) / 100} mb / {Math.round( 32 | (download.total / (1024 * 1024) + Number.EPSILON) * 100 33 | ) / 100} mb 34 |
35 | {/if} 36 |Looks like we got no books for this search
82 |97 | {book.title.replace(/\d{5,}/g, '').slice(0, 100)} 98 | {book.title.replace(/\d{5,}/g, '').length > 100 ? '....' : ''} 99 |
100 |104 | Authors : 105 | 106 | {#if book.authors.length} 107 | {book.authors.length > 100 109 | ? `${book.authors.slice(0, 100)} ....` 110 | : book.authors} 112 | {:else} 113 | {book.authors.length && NOT_AVAILABLE} 114 | {/if} 115 |
116 |
117 |