diff --git a/.agents/rules/docs.mdc b/.agents/rules/docs.mdc
index 6ba8b2d6e..22ea3d57c 100644
--- a/.agents/rules/docs.mdc
+++ b/.agents/rules/docs.mdc
@@ -31,7 +31,7 @@ Consult these guides before working on related tasks:
## Writing documentation pages
-Pages live in `pages/**/*.mdx`. Use the flat convention: leaf pages are `foo.mdx`; only pages with sub-pages use `foo/index.mdx` (both render as `/foo/`).
+Pages live in `content/**/*.mdx` — the `docs` content collection, rendered by `pages/[...slug].astro`. Use the flat convention: leaf pages are `foo.mdx`; only pages with sub-pages use `foo/index.mdx` (both render as `/foo/`).
- Write in simple English: short sentences, common words, direct verbs (`Use`, `Add`, `Set`).
- Component docs use singular naming in frontmatter and filename: `title: Card`, `card.mdx` (not `cards.mdx`).
@@ -39,18 +39,19 @@ Pages live in `pages/**/*.mdx`. Use the flat convention: leaf pages are `foo.mdx
### Frontmatter
-Static YAML only. Required keys plus the layout:
+Static YAML only, validated by the collection schema in `docs/content.config.ts` — an unknown or mistyped key fails the build. Required keys:
```yaml
---
title: Alert
summary: Short one-sentence summary of what this component does.
description: Practical description of when and why to use it.
-layout: '@shared/layouts/DocsMdxLayout.astro'
---
```
-Optional: `bootstrapLink: components/alerts/` when the component extends a Bootstrap component.
+No `layout:` key — the route picks the layout.
+
+Optional keys: `seoTitle`, `seoDescription`, `icon`, `order`, `related`, `docs-libs`, `css-plugins`, `hide-pagination`, `added-in`. Anything else is rejected.
### Examples
diff --git a/.agents/rules/main.mdc b/.agents/rules/main.mdc
index 7bb0d589e..9a3da1c0e 100644
--- a/.agents/rules/main.mdc
+++ b/.agents/rules/main.mdc
@@ -13,11 +13,33 @@ Shared instructions for all AI agents (Claude Code, Cursor, etc.). Canonical age
- `core/` — `@tabler/core`: SCSS sources (`core/scss/`), JS, the distributable framework.
- `preview/` — `@tabler/preview`: demo site built with Astro (pages in `preview/pages/*.astro`).
-- `docs/` — `@tabler/docs`: documentation site built with Astro (pages in `docs/pages/**/*.mdx`); docs-specific rules: `.agents/rules/docs.mdc`.
+- `docs/` — `@tabler/docs`: documentation site built with Astro (content in `docs/content/**/*.mdx`); docs-specific rules: `.agents/rules/docs.mdc`.
- `shared/` — Astro components (`ui/`, `components/`, `layouts/`, `lib/`) shared by `preview` and `docs` via `@shared`; JSON data in `data/` via `@data`; plus `static/`.
- `docs/components/` — docs-only Astro components (`Example`, menu, …) via `@components`.
- Package manager: pnpm workspaces + turbo. Node.js >= 22.12.
+## Skills
+
+Task-specific instructions live in `.agents/skills//SKILL.md` — read the matching one before starting, it is the source of truth for that area.
+
+| Skill | Use it when |
+| --- | --- |
+| `ui-component` | creating or extending a component in `shared/ui/` or `shared/components/` |
+| `astro-scripts` | a component or page needs client-side JavaScript |
+| `page-layouts` | choosing or changing the page chrome (`shared/layouts/`) |
+| `shared-lib` | moving logic into `shared/lib/` and testing it |
+| `core-scss` | writing or changing styles in `core/scss/` |
+| `core-js` | working on the framework JavaScript in `core/js/` |
+| `demo-pages` | adding or updating a page in `preview/pages/` |
+| `write-docs` | writing or updating a page in `docs/content/` |
+| `class-reference` | a docs page needs its `classnames` table added or refreshed |
+| `navigation` | menus, page URLs and docs redirects |
+| `astro-dev` | starting a dev server and verifying a change in the browser |
+| `html-diff` | proving a refactor changes no rendered HTML |
+| `build-pipeline` | assets missing, stale or growing; editing `.build/` or the asset manifests |
+| `generate-changeset` | writing a changeset (always — never hand-write the file) |
+| `mr-description` | drafting an MR/PR title and description |
+
## Language
- Write all repository content in English: code, comments, documentation, commit messages, PR titles and descriptions.
@@ -28,6 +50,10 @@ Shared instructions for all AI agents (Claude Code, Cursor, etc.). Canonical age
### Astro pages and components
- Pages are Astro components; reusable markup lives in `shared/components/`.
+- Building or changing a shared component: follow the `ui-component` skill (Props interface, prop names, class composition, slots).
+- Client-side JavaScript: follow the `astro-scripts` skill. Always `
+
+
+```
+
+- `BEGIN … / END …` comments mark the block in the copied HTML. Use the component name in caps.
+- A named `init…` function plus the `readyState` guard, never a bare call: the script may be parsed after `DOMContentLoaded` has already fired.
+- The component takes a required `id` prop and derives ids and selectors from it in the frontmatter. Never query by class or by tag — a page renders many instances.
+
+## 4. Passing data with `define:vars`
+
+`define:vars` JSON-serialises the values and declares them as consts at the top of the script. It carries data only: no functions, no DOM nodes, no closures over frontmatter helpers. Pass config objects whole (`chartOptions`, `markers`, `sortKeys`) instead of interpolating them into a template string.
+
+Two known snags:
+
+- **Astro wraps a `define:vars` script in an IIFE.** Anything the markup calls (`onclick="setPageListItems(this)"`) must be assigned to `window` explicitly — see `shared/components/demo/AdvancedTable.astro`. If several instances define the same global, make it stateless and resolve the instance from the clicked element.
+- The type checker does not see `define:vars` bindings used inside template literals. `shared/components/marketing/hero/Side.astro` carries a `// @ts-nocheck` for exactly that; copy the comment with its explanation rather than restructuring the script.
+
+## 5. When the script has to be a string
+
+If caller-supplied JS must land *inside* a function body, `define:vars` cannot do it — it injects variables, not code. Then build the script as a template string in the frontmatter and render it with `` inside `` (see `shared/ui/Signature.astro`). Serialise every interpolated value with `JSON.stringify` and keep raw-JS props documented as an escape hatch.
+
+## 6. Instance registries
+
+Plugin instances go into a namespaced global keyed by id, so demo pages, docs examples, and the browser console can reach them:
+
+```js
+window.tabler_rating ??= {}
+window.tabler_rating[ratingKey] = new StarRating(ratingSelector, { … })
+```
+
+`window.tabler_list`, `window.tabler_rating`, … follow the same shape. Never store an instance in a bare global.
+
+## 7. Loading the library
+
+The library itself is not imported — it is a global loaded from `libs.json`:
+
+1. Check `core/libs.json` for the plugin (`npm`, `js`, `css`, `head`); add an entry if it is missing.
+2. Preview pages declare it on the layout: `pageLibs={['nouislider', 'tom-select']}` on `DefaultLayout` / `BaseLayout`.
+3. Docs pages declare it in front matter: `docs-libs: apexcharts` (and `css-plugins:` for extra `tabler-*.css`).
+
+A component that silently assumes a global is a broken page whenever someone forgets the prop — say which lib it needs in a frontmatter comment and in the docs page.
+
+## 8. Prettier caveat
+
+`prettier-plugin-astro` cannot parse HTML comments or `
```
-#### Styles
+Styles:
```html
```
-## Building locally
+### Download
-To build a copy of Tabler locally, you have two options. You can either set up your device directly with the development tools required to build Tabler, or if you would prefer not to install all the development dependencies directly onto your device, you can use a Dockerfile that Tabler provides to build a docker image. Instructions follow below.
+If you don't use a package manager, you can [download the latest release](https://github.com/tabler/tabler/releases) as a ZIP archive.
-### First steps: Downloading the Tabler source files
+### Quick start
-With either method, the first thing you'll want to do is download a copy of the Tabler source files to your device.
+Create an HTML file with Tabler's CSS and JavaScript loaded from the CDN and start building:
-#### From the Tabler GitHub releases page
-
-If you don't want to edit the source code once you've downloaded it, and aren't interested in merging future project updates into your copy, you can just download the source files straight from the [Tabler releases on GitHub](https://github.com/tabler/tabler/releases) and extract the contents to a directory called `tabler`.
-
-#### Cloning with Git
-
-If you **do** wish to edit the source code after downloading it, for example to contribute changes back to the Tabler project, you'll want to do this by cloning it with Git:
-1. If you don't have Git installed on your device, download and install it. You can find instructions at [https://git-scm.com/downloads](https://git-scm.com/downloads).
-2. (Optional) **Windows users:** you could optionally install Git in the `C:\Program Files\git\bin` directory and run `npm config set script-shell "C:\\Program Files\\git\\bin\\bash.exe"` to change the default shell.
-3. Clone the Tabler project into a folder on your device. Instructions can be found at [cloning a repository](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository).
-
-### Installing and running development tools directly
-
-1. [Install Node.js](https://nodejs.org/download/) (version 22.12 or newer), which we use to manage our dependencies.
-2. [Install pnpm](https://pnpm.io/installation) (We recommend either by [Using Corepack](https://pnpm.io/installation#using-corepack) or by [Using npm](https://pnpm.io/installation#using-npm))
-3. From the root `/tabler` directory where you downloaded the Tabler source files, run installation on the command line:
-```sh
-pnpm install
+```html
+
+
+
+
+
+ Tabler demo
+
+
+
+
Hello, Tabler!
+
+
+
+
```
-4. Then execute the following to start up the application stack:
-```sh
-pnpm run start
-```
-5. Open [http://localhost:3000](http://localhost:3000) to view the preview website in your browser, or [http://localhost:3010](http://localhost:3010) to view the documentation website - and voilà.
-Changes to most of the source files of Tabler core, preview and docs will rebuild the application and refresh the page.
-**Note**:
-If you wish to perform a one-off production build without a dev server, you can run:
+Or try it without installing anything: open the [tabler-starter](https://github.com/tabler/tabler-starter) template on [StackBlitz](https://stackblitz.com/github/tabler/tabler-starter), [CodeSandbox](https://codesandbox.io/s/github/tabler/tabler-starter) or [GitHub Codespaces](https://codespaces.new/tabler/tabler-starter).
+
+## 📖 Documentation
+
+The full documentation is available at [docs.tabler.io](https://docs.tabler.io/). To see what changed in each release, check the [changelog](core/CHANGELOG.md) and [GitHub releases](https://github.com/tabler/tabler/releases).
+
+### Upgrading to 1.5
+
+Tabler 1.5 ships Bootstrap inside the package, moves the Sass sources to the module system, and drops a few unused variables. Read the [upgrade guide](https://docs.tabler.io/ui/getting-started/upgrade/) before updating from 1.4 — it lists every breaking change with a before-and-after example.
+
+## 🛠️ Development
+
+To build a copy of Tabler locally, you have two options: set up the development tools directly on your device, or use the provided Docker setup. You can also start right away in the cloud with [GitHub Codespaces](https://codespaces.new/tabler/tabler) — the dev container installs everything for you.
+
+### Local setup
+
+1. Install [Node.js](https://nodejs.org/download/) (version 22.12 or newer) and [pnpm](https://pnpm.io/installation) (we recommend [Corepack](https://pnpm.io/installation#using-corepack)).
+2. Clone the repository:
+
+ ```sh
+ git clone https://github.com/tabler/tabler.git
+ cd tabler
+ ```
+
+3. Install dependencies:
+
+ ```sh
+ pnpm install
+ ```
+
+4. Start the development servers:
+
+ ```sh
+ pnpm run dev
+ ```
+
+5. Open [http://localhost:3000](http://localhost:3000) to view the preview website, or [http://localhost:3010](http://localhost:3010) to view the documentation website. Changes to most source files of Tabler core, preview and docs will rebuild the application and refresh the page.
+
+To perform a one-off production build without a dev server, run:
+
```sh
pnpm run build
```
+### Docker
-### Installing and running development tools with Docker
+1. From the root `tabler` directory, build the image:
-**Plain Docker**
+ ```sh
+ docker build -t tabler .
+ ```
-Here is an example of how to use this image:
+2. Run the image. The following command mounts the source directories into the container and exposes port 3000 (preview) and port 3010 (documentation):
-1. From the root `/tabler` directory where you downloaded the Tabler source files, build the tabler image:
-```sh
-docker build -t tabler .
-```
-2. Run the tabler image. The following command mounts the source directories into the container, exposes port 3000 to browse the preview website and port 3010 to browse the documentation website:
-```sh
-docker run -p 3000:3000 -p 3010:3010 -v $(pwd)/core:/app/core -v $(pwd)/preview:/app/preview -v $(pwd)/docs:/app/docs -v $(pwd)/shared:/app/shared tabler
-```
-3. Open your browser to [http://localhost:3000](http://localhost:3000) (preview) or [http://localhost:3010](http://localhost:3010) (documentation). Edit anything in the `core/`, `preview/`, `docs/` or `shared/` folders and watch your browser refresh the page after it has been rebuilt.
+ ```sh
+ docker run -p 3000:3000 -p 3010:3010 -v $(pwd)/core:/app/core -v $(pwd)/preview:/app/preview -v $(pwd)/docs:/app/docs -v $(pwd)/shared:/app/shared tabler
+ ```
-**Docker Compose**
+3. Open [http://localhost:3000](http://localhost:3000) (preview) or [http://localhost:3010](http://localhost:3010) (documentation). Edit anything in the `core/`, `preview/`, `docs/` or `shared/` folders and watch your browser refresh the page after it has been rebuilt.
-You can also use the docker compose config from this repo. From the root `/tabler` directory where you downloaded the Tabler source files, use `docker compose build && docker compose up` or `docker compose up --build` to build and start the container. Edit anything in the `core/`, `preview/`, `docs/` or `shared/` folders the same way as with plain docker and access the same URLs and ports in your browser.
+Alternatively, use Docker Compose: `docker compose up --build` builds and starts the container with the same mounts, ports and URLs.
-## Bugs and feature requests
+## 🤝 Contributing
-Found a bug or have a feature request? [Please open a new issue](https://github.com/tabler/tabler/issues/new).
+We welcome contributions of all kinds! Please read the [contributing guide](CONTRIBUTING.md) to learn about the development workflow, project structure and conventions. By participating, you agree to follow our [Code of Conduct](.github/CODE_OF_CONDUCT.md).
+
+- **Found a bug?** [Open a bug report](https://github.com/tabler/tabler/issues/new?template=bug_report.yml).
+- **Have an idea?** [Open a feature request](https://github.com/tabler/tabler/issues/new?template=feature_request.yml) or start a [discussion](https://github.com/tabler/tabler/discussions).
+- **Found a security issue?** Please report it privately — see our [security policy](SECURITY.md).
+
+## 🪴 Project activity
+
+
+
+
## 🤓 Creators
@@ -171,17 +189,22 @@ Found a bug or have a feature request? [Please open a new issue](https://github.
-
-
+**Bartosz Dobija**
+
+-
+
## 👨🚀 Contributors
This project exists thanks to all the people who contribute.
-
+
+
+
-## Social media
+## 📣 Social media
-Stay up to date by joining our community on X and Facebook
+Stay up to date by joining our community on [X](https://x.com/tabler_io) and [Facebook](https://www.facebook.com/tabler.io).
-## License
-
-See the [LICENSE](https://github.com/tabler/tabler/blob/master/LICENSE) file.
+## 📄 License
+Tabler is licensed under the [MIT License](LICENSE).
diff --git a/SECURITY.md b/SECURITY.md
index 26bdf1e14..6f2bbbe1e 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -1,16 +1,28 @@
# Security Policy
-We take security very seriously and ask that you follow the following process.
+We take security seriously and appreciate responsible disclosure of vulnerabilities.
-## Supported Versions
+## Supported versions
| Version | Supported |
| ------- | ------------------ |
-| 1.0.x | :white_check_mark: |
+| 1.x | :white_check_mark: |
| 0.x | :x: |
-## Reporting a Vulnerability
+## Reporting a vulnerability
-If you think you may have found a security bug, We ask that you privately send the details to support@tabler.io.
-Please make sure to use a descriptive title in the email.
+**Please do not report security vulnerabilities through public GitHub issues.**
+If you think you have found a security issue, report it privately in one of two ways:
+
+- Use GitHub's private reporting: [Report a vulnerability](https://github.com/tabler/tabler/security/advisories/new) (Security tab → "Report a vulnerability")
+- Send the details to **support@tabler.io**
+
+Please include:
+
+- A descriptive title
+- A description of the issue and its potential impact
+- Steps to reproduce, or a proof of concept if possible
+- The affected version(s)
+
+We will review your report and get back to you as soon as possible. Please give us reasonable time to address the issue before disclosing it publicly.
diff --git a/UPGRADE.md b/UPGRADE.md
new file mode 100644
index 000000000..91cddbdcb
--- /dev/null
+++ b/UPGRADE.md
@@ -0,0 +1,5 @@
+# Upgrading to Tabler 1.5
+
+The upgrade guide lives in the documentation: [Upgrade to 1.5](https://docs.tabler.io/ui/getting-started/upgrade/).
+
+It covers every breaking change between 1.4 and 1.5, with a before and after example for each one.
diff --git a/core/.build/generate-sri.ts b/core/.build/generate-sri.ts
index c567a89f8..8ac0d38c1 100644
--- a/core/.build/generate-sri.ts
+++ b/core/.build/generate-sri.ts
@@ -1,115 +1,129 @@
+// Writes SRI hashes for the built core files to shared/data/sri.json.
+//
+// Nothing consumes that file yet: the CDN snippets in the docs are shown without `integrity`, and
+// Subresource Integrity is planned for v2.0. The script is kept here so the hashes are ready to be
+// wired up then; it is not part of any build or workflow. Run it by hand after building core:
+//
+// pnpm exec tsx core/.build/generate-sri.ts
+//
+// Hashes describe the release the snippets would link to (@tabler/core@), so a real setup
+// must run this against the published build — hashing an unreleased core/dist would pin an
+// `integrity` value the browser rejects, which is worse for users than no `integrity` at all. The
+// version is stored next to the hashes so the consumer can check the two match.
import * as crypto from 'node:crypto'
-import { readFileSync, writeFileSync } from 'node:fs'
+import { existsSync, readFileSync, writeFileSync } from 'node:fs'
import path from 'node:path'
import { fileURLToPath } from 'node:url'
const __dirname = path.dirname(fileURLToPath(import.meta.url))
const configFile = path.join(__dirname, '../../shared/data/sri.json')
+const distDir = path.join(__dirname, '../dist')
+const { version } = JSON.parse(readFileSync(path.join(__dirname, '../package.json'), 'utf8')) as { version: string }
interface FileConfig {
file: string
configPropertyName: string
}
+interface SriData {
+ version: string
+ hashes: Record
+}
+
const files: FileConfig[] = [
{
- file: 'dist/css/tabler.min.css',
+ file: 'css/tabler.min.css',
configPropertyName: 'css',
},
{
- file: 'dist/css/tabler.rtl.min.css',
+ file: 'css/tabler.rtl.min.css',
configPropertyName: 'css-rtl',
},
{
- file: 'dist/css/tabler-flags.min.css',
+ file: 'css/tabler-flags.min.css',
configPropertyName: 'css-flags',
},
{
- file: 'dist/css/tabler-flags.rtl.min.css',
+ file: 'css/tabler-flags.rtl.min.css',
configPropertyName: 'css-flags-rtl',
},
{
- file: 'dist/css/tabler-marketing.min.css',
+ file: 'css/tabler-marketing.min.css',
configPropertyName: 'css-marketing',
},
{
- file: 'dist/css/tabler-marketing.rtl.min.css',
+ file: 'css/tabler-marketing.rtl.min.css',
configPropertyName: 'css-marketing-rtl',
},
{
- file: 'dist/css/tabler-payments.min.css',
+ file: 'css/tabler-payments.min.css',
configPropertyName: 'css-payments',
},
{
- file: 'dist/css/tabler-payments.rtl.min.css',
+ file: 'css/tabler-payments.rtl.min.css',
configPropertyName: 'css-payments-rtl',
},
{
- file: 'dist/css/tabler-props.min.css',
+ file: 'css/tabler-props.min.css',
configPropertyName: 'css-props',
},
{
- file: 'dist/css/tabler-props.rtl.min.css',
+ file: 'css/tabler-props.rtl.min.css',
configPropertyName: 'css-props-rtl',
},
{
- file: 'dist/css/tabler-themes.min.css',
+ file: 'css/tabler-themes.min.css',
configPropertyName: 'css-themes',
},
{
- file: 'dist/css/tabler-themes.rtl.min.css',
+ file: 'css/tabler-themes.rtl.min.css',
configPropertyName: 'css-themes-rtl',
},
{
- file: 'dist/css/tabler-socials.min.css',
+ file: 'css/tabler-socials.min.css',
configPropertyName: 'css-socials',
},
{
- file: 'dist/css/tabler-socials.rtl.min.css',
+ file: 'css/tabler-socials.rtl.min.css',
configPropertyName: 'css-socials-rtl',
},
{
- file: 'dist/css/tabler-vendors.min.css',
+ file: 'css/tabler-vendors.min.css',
configPropertyName: 'css-vendors',
},
{
- file: 'dist/css/tabler-vendors.rtl.min.css',
+ file: 'css/tabler-vendors.rtl.min.css',
configPropertyName: 'css-vendors-rtl',
},
{
- file: 'dist/js/tabler.min.js',
+ file: 'js/tabler.min.js',
configPropertyName: 'js',
},
{
- file: 'dist/js/tabler-theme.min.js',
+ file: 'js/tabler-theme.min.js',
configPropertyName: 'js-theme',
},
]
function generateSRI(): void {
- const sriData: Record = {}
+ const hashes: Record = {}
for (const { file, configPropertyName } of files) {
- try {
- const filePath = path.join(__dirname, '..', file)
- const data = readFileSync(filePath, 'utf8')
+ const filePath = path.join(distDir, file)
- const algorithm = 'sha384'
- const hash = crypto.createHash(algorithm).update(data, 'utf8').digest('base64')
- const integrity = `${algorithm}-${hash}`
-
- console.log(`${configPropertyName}: ${integrity}`)
-
- sriData[configPropertyName] = integrity
- } catch (error) {
- const errorMessage = error instanceof Error ? error.message : String(error)
- console.error(`Error processing ${file}:`, errorMessage)
- throw error
+ if (!existsSync(filePath)) {
+ throw new Error(`${filePath} is missing. Run \`pnpm --filter @tabler/core build\` first.`)
}
+
+ const integrity = `sha384-${crypto.createHash('sha384').update(readFileSync(filePath)).digest('base64')}`
+
+ console.log(`${configPropertyName}: ${integrity}`)
+
+ hashes[configPropertyName] = integrity
}
- writeFileSync(configFile, JSON.stringify(sriData, null, 2) + '\n', 'utf8')
+ writeFileSync(configFile, JSON.stringify({ version, hashes } satisfies SriData, null, 2) + '\n', 'utf8')
}
try {
diff --git a/core/README.md b/core/README.md
index 615d4108c..8e4501ac4 100644
--- a/core/README.md
+++ b/core/README.md
@@ -1,6 +1,20 @@
-# Tabler Core
+
+
+
-Tabler Core is a set of components and utilities for building web applications. It provides a collection of pre-designed components, such as buttons, forms, modals, and more, that can be easily customized and integrated into your projects.
+
+A premium and open source dashboard template with a responsive and high-quality UI.
+
## 🔎 Preview
@@ -12,21 +26,62 @@ Tabler is fully responsive and compatible with all modern browsers. Thanks to it
-## Installation
+## 📦 Installation
-To install Tabler Core, you can use npm or yarn. Run one of the following commands in your terminal:
+Install `@tabler/core` with npm or your preferred JavaScript package manager:
-```bash
-npm install @tabler/core
+```sh
+npm install --save @tabler/core
```
-or
+### CDN
-```bash
-pnpm add @tabler/core
+All files included in the `@tabler/core` npm package are also available over a CDN.
+
+JavaScript:
+
+```html
+
```
-## Sponsors
+Styles:
+
+```html
+
+```
+
+### Quick start
+
+Create an HTML file with Tabler's CSS and JavaScript loaded from the CDN and start building:
+
+```html
+
+
+
+
+
+ Tabler demo
+
+
+
+
Hello, Tabler!
+
+
+
+
+```
+
+Or try it without installing anything: open the [tabler-starter](https://github.com/tabler/tabler-starter) template on [StackBlitz](https://stackblitz.com/github/tabler/tabler-starter), [CodeSandbox](https://codesandbox.io/s/github/tabler/tabler-starter) or [GitHub Codespaces](https://codespaces.new/tabler/tabler-starter).
+
+## 📖 Documentation
+
+The full documentation is available at [docs.tabler.io](https://docs.tabler.io/). Release notes live in the [changelog](https://github.com/tabler/tabler/blob/dev/core/CHANGELOG.md).
+
+## 🤝 Contributing
+
+We welcome contributions of all kinds! See the [contributing guide](https://github.com/tabler/tabler/blob/dev/CONTRIBUTING.md) to get started.
+
+## 💛 Sponsors
**If you want to support our project and help us grow it, you can [become a sponsor on GitHub](https://github.com/sponsors/codecalm) or just [donate on PayPal](https://paypal.me/codecalm) :)**
@@ -36,7 +91,6 @@ pnpm add @tabler/core
+## 📄 License
-## License
-
-See the [LICENSE](https://github.com/tabler/tabler/blob/master/LICENSE) file.
\ No newline at end of file
+Tabler is licensed under the [MIT License](https://github.com/tabler/tabler/blob/dev/LICENSE).
diff --git a/core/img/payments/2c2p-dark.svg b/core/img/payments/2c2p-dark.svg
index c02bc8bc4..b1482653d 100644
--- a/core/img/payments/2c2p-dark.svg
+++ b/core/img/payments/2c2p-dark.svg
@@ -1 +1,5 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/2c2p.svg b/core/img/payments/2c2p.svg
index 5402034b2..c1b771480 100644
--- a/core/img/payments/2c2p.svg
+++ b/core/img/payments/2c2p.svg
@@ -1 +1,5 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/2checkout-dark.svg b/core/img/payments/2checkout-dark.svg
index 31295f991..ddb1d40ba 100644
--- a/core/img/payments/2checkout-dark.svg
+++ b/core/img/payments/2checkout-dark.svg
@@ -1 +1,4 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/2checkout.svg b/core/img/payments/2checkout.svg
index ee059732c..89be19015 100644
--- a/core/img/payments/2checkout.svg
+++ b/core/img/payments/2checkout.svg
@@ -1 +1,4 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/ach-transfer-dark.svg b/core/img/payments/ach-transfer-dark.svg
new file mode 100644
index 000000000..ca17690ed
--- /dev/null
+++ b/core/img/payments/ach-transfer-dark.svg
@@ -0,0 +1,14 @@
+
diff --git a/core/img/payments/ach-transfer.svg b/core/img/payments/ach-transfer.svg
new file mode 100644
index 000000000..eb6998459
--- /dev/null
+++ b/core/img/payments/ach-transfer.svg
@@ -0,0 +1,14 @@
+
diff --git a/core/img/payments/adyen-dark.svg b/core/img/payments/adyen-dark.svg
index 27b84ed2b..7103e90c9 100644
--- a/core/img/payments/adyen-dark.svg
+++ b/core/img/payments/adyen-dark.svg
@@ -1 +1,8 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/adyen.svg b/core/img/payments/adyen.svg
index bd26437e1..a46443b1a 100644
--- a/core/img/payments/adyen.svg
+++ b/core/img/payments/adyen.svg
@@ -1 +1,8 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/affirm-dark.svg b/core/img/payments/affirm-dark.svg
index 313dcabff..3762c4c6b 100644
--- a/core/img/payments/affirm-dark.svg
+++ b/core/img/payments/affirm-dark.svg
@@ -1 +1,9 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/affirm.svg b/core/img/payments/affirm.svg
index dece89adb..24e9f9021 100644
--- a/core/img/payments/affirm.svg
+++ b/core/img/payments/affirm.svg
@@ -1 +1,9 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/afterpay-dark.svg b/core/img/payments/afterpay-dark.svg
new file mode 100644
index 000000000..57649db04
--- /dev/null
+++ b/core/img/payments/afterpay-dark.svg
@@ -0,0 +1,13 @@
+
diff --git a/core/img/payments/afterpay.svg b/core/img/payments/afterpay.svg
new file mode 100644
index 000000000..01ca343b9
--- /dev/null
+++ b/core/img/payments/afterpay.svg
@@ -0,0 +1,13 @@
+
diff --git a/core/img/payments/airtm-dark.svg b/core/img/payments/airtm-dark.svg
new file mode 100644
index 000000000..4fdcfa48a
--- /dev/null
+++ b/core/img/payments/airtm-dark.svg
@@ -0,0 +1,4 @@
+
diff --git a/core/img/payments/airtm.svg b/core/img/payments/airtm.svg
new file mode 100644
index 000000000..ff298af45
--- /dev/null
+++ b/core/img/payments/airtm.svg
@@ -0,0 +1,4 @@
+
diff --git a/core/img/payments/airwallex-dark.svg b/core/img/payments/airwallex-dark.svg
new file mode 100644
index 000000000..57b6e9da6
--- /dev/null
+++ b/core/img/payments/airwallex-dark.svg
@@ -0,0 +1,11 @@
+
diff --git a/core/img/payments/airwallex.svg b/core/img/payments/airwallex.svg
new file mode 100644
index 000000000..372e8e844
--- /dev/null
+++ b/core/img/payments/airwallex.svg
@@ -0,0 +1,11 @@
+
diff --git a/core/img/payments/alipay-dark.svg b/core/img/payments/alipay-dark.svg
index 518a708cc..9193c32ca 100644
--- a/core/img/payments/alipay-dark.svg
+++ b/core/img/payments/alipay-dark.svg
@@ -1 +1,12 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/alipay-plus-dark.svg b/core/img/payments/alipay-plus-dark.svg
index 6fbc96d2d..e45f024e3 100644
--- a/core/img/payments/alipay-plus-dark.svg
+++ b/core/img/payments/alipay-plus-dark.svg
@@ -1 +1,9 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/alipay-plus.svg b/core/img/payments/alipay-plus.svg
index 5f81c8794..9b3ba5167 100644
--- a/core/img/payments/alipay-plus.svg
+++ b/core/img/payments/alipay-plus.svg
@@ -1 +1,9 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/alipay.svg b/core/img/payments/alipay.svg
index b2b08041a..b0aa37711 100644
--- a/core/img/payments/alipay.svg
+++ b/core/img/payments/alipay.svg
@@ -1 +1,12 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/allegro-pay-dark.svg b/core/img/payments/allegro-pay-dark.svg
index aad3975aa..21ae4d6f3 100644
--- a/core/img/payments/allegro-pay-dark.svg
+++ b/core/img/payments/allegro-pay-dark.svg
@@ -1 +1,5 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/allegro-pay.svg b/core/img/payments/allegro-pay.svg
index 4e5e07f76..a15c746c1 100644
--- a/core/img/payments/allegro-pay.svg
+++ b/core/img/payments/allegro-pay.svg
@@ -1 +1,5 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/amazon-dark.svg b/core/img/payments/amazon-dark.svg
index 4d44550da..3f6067f43 100644
--- a/core/img/payments/amazon-dark.svg
+++ b/core/img/payments/amazon-dark.svg
@@ -1 +1,6 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/amazon-pay-dark.svg b/core/img/payments/amazon-pay-dark.svg
index 510841661..bb118d98c 100644
--- a/core/img/payments/amazon-pay-dark.svg
+++ b/core/img/payments/amazon-pay-dark.svg
@@ -1 +1,7 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/amazon-pay.svg b/core/img/payments/amazon-pay.svg
index a499cebba..efec2ef08 100644
--- a/core/img/payments/amazon-pay.svg
+++ b/core/img/payments/amazon-pay.svg
@@ -1 +1,7 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/amazon.svg b/core/img/payments/amazon.svg
index 23f7e9de3..340b69447 100644
--- a/core/img/payments/amazon.svg
+++ b/core/img/payments/amazon.svg
@@ -1 +1,6 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/americanexpress-dark.svg b/core/img/payments/americanexpress-dark.svg
index df4c35327..364b8f720 100644
--- a/core/img/payments/americanexpress-dark.svg
+++ b/core/img/payments/americanexpress-dark.svg
@@ -1 +1,4 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/americanexpress.svg b/core/img/payments/americanexpress.svg
index c6bc3ac0d..907b249ac 100644
--- a/core/img/payments/americanexpress.svg
+++ b/core/img/payments/americanexpress.svg
@@ -1 +1,4 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/ant-group-dark.svg b/core/img/payments/ant-group-dark.svg
new file mode 100644
index 000000000..d082f14b8
--- /dev/null
+++ b/core/img/payments/ant-group-dark.svg
@@ -0,0 +1,6 @@
+
diff --git a/core/img/payments/ant-group.svg b/core/img/payments/ant-group.svg
new file mode 100644
index 000000000..744a15178
--- /dev/null
+++ b/core/img/payments/ant-group.svg
@@ -0,0 +1,23 @@
+
diff --git a/core/img/payments/applepay-dark.svg b/core/img/payments/applepay-dark.svg
index fe8060c19..5f2e1c205 100644
--- a/core/img/payments/applepay-dark.svg
+++ b/core/img/payments/applepay-dark.svg
@@ -1 +1,8 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/applepay.svg b/core/img/payments/applepay.svg
index d0bf3573f..7ea5c0010 100644
--- a/core/img/payments/applepay.svg
+++ b/core/img/payments/applepay.svg
@@ -1 +1,8 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/authorize-dark.svg b/core/img/payments/authorize-dark.svg
index bdb3b74a5..c6f229979 100644
--- a/core/img/payments/authorize-dark.svg
+++ b/core/img/payments/authorize-dark.svg
@@ -1 +1,17 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/authorize.svg b/core/img/payments/authorize.svg
index 76ee3789b..69efd3e1b 100644
--- a/core/img/payments/authorize.svg
+++ b/core/img/payments/authorize.svg
@@ -1 +1,17 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/autopay-dark.svg b/core/img/payments/autopay-dark.svg
index f18de72c1..e1722bdce 100644
--- a/core/img/payments/autopay-dark.svg
+++ b/core/img/payments/autopay-dark.svg
@@ -1 +1,11 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/autopay.svg b/core/img/payments/autopay.svg
index 1a9aa008b..60010eb28 100644
--- a/core/img/payments/autopay.svg
+++ b/core/img/payments/autopay.svg
@@ -1 +1,11 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/bancontact-dark.svg b/core/img/payments/bancontact-dark.svg
index 66c4b3827..541f082e0 100644
--- a/core/img/payments/bancontact-dark.svg
+++ b/core/img/payments/bancontact-dark.svg
@@ -1 +1,9 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/bancontact.svg b/core/img/payments/bancontact.svg
index 261d171d5..b6c2c811a 100644
--- a/core/img/payments/bancontact.svg
+++ b/core/img/payments/bancontact.svg
@@ -1 +1,9 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/bank-of-america-dark.svg b/core/img/payments/bank-of-america-dark.svg
new file mode 100644
index 000000000..86c3f1dc5
--- /dev/null
+++ b/core/img/payments/bank-of-america-dark.svg
@@ -0,0 +1,10 @@
+
diff --git a/core/img/payments/bank-of-america.svg b/core/img/payments/bank-of-america.svg
new file mode 100644
index 000000000..78f324ebb
--- /dev/null
+++ b/core/img/payments/bank-of-america.svg
@@ -0,0 +1,10 @@
+
diff --git a/core/img/payments/barclays-dark.svg b/core/img/payments/barclays-dark.svg
new file mode 100644
index 000000000..1318ee2f8
--- /dev/null
+++ b/core/img/payments/barclays-dark.svg
@@ -0,0 +1,11 @@
+
diff --git a/core/img/payments/barclays.svg b/core/img/payments/barclays.svg
new file mode 100644
index 000000000..3e9739bbb
--- /dev/null
+++ b/core/img/payments/barclays.svg
@@ -0,0 +1,11 @@
+
diff --git a/core/img/payments/bbva-dark.svg b/core/img/payments/bbva-dark.svg
new file mode 100644
index 000000000..34d42301a
--- /dev/null
+++ b/core/img/payments/bbva-dark.svg
@@ -0,0 +1,4 @@
+
diff --git a/core/img/payments/bbva.svg b/core/img/payments/bbva.svg
new file mode 100644
index 000000000..60decc664
--- /dev/null
+++ b/core/img/payments/bbva.svg
@@ -0,0 +1,4 @@
+
diff --git a/core/img/payments/binance-dark.svg b/core/img/payments/binance-dark.svg
new file mode 100644
index 000000000..d2b88c4ea
--- /dev/null
+++ b/core/img/payments/binance-dark.svg
@@ -0,0 +1,4 @@
+
diff --git a/core/img/payments/binance-usd-dark.svg b/core/img/payments/binance-usd-dark.svg
index d63c13be5..9f7f08caf 100644
--- a/core/img/payments/binance-usd-dark.svg
+++ b/core/img/payments/binance-usd-dark.svg
@@ -1 +1,11 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/binance-usd.svg b/core/img/payments/binance-usd.svg
index 81a4b9b04..705c715c6 100644
--- a/core/img/payments/binance-usd.svg
+++ b/core/img/payments/binance-usd.svg
@@ -1 +1,11 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/binance.svg b/core/img/payments/binance.svg
new file mode 100644
index 000000000..df7491213
--- /dev/null
+++ b/core/img/payments/binance.svg
@@ -0,0 +1,4 @@
+
diff --git a/core/img/payments/bitcoin-dark.svg b/core/img/payments/bitcoin-dark.svg
index 232c82599..aec8cb349 100644
--- a/core/img/payments/bitcoin-dark.svg
+++ b/core/img/payments/bitcoin-dark.svg
@@ -1 +1,13 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/bitcoin.svg b/core/img/payments/bitcoin.svg
index f01ba3490..3c1a1ae96 100644
--- a/core/img/payments/bitcoin.svg
+++ b/core/img/payments/bitcoin.svg
@@ -1 +1,12 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/bitpay-dark.svg b/core/img/payments/bitpay-dark.svg
index 5493c9141..d01b4dc4f 100644
--- a/core/img/payments/bitpay-dark.svg
+++ b/core/img/payments/bitpay-dark.svg
@@ -1 +1,4 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/bitpay.svg b/core/img/payments/bitpay.svg
index c91274601..fdaaed90c 100644
--- a/core/img/payments/bitpay.svg
+++ b/core/img/payments/bitpay.svg
@@ -1 +1,4 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/bkash-dark.svg b/core/img/payments/bkash-dark.svg
index 58ea0b9b2..baeb6ecd2 100644
--- a/core/img/payments/bkash-dark.svg
+++ b/core/img/payments/bkash-dark.svg
@@ -1 +1,16 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/bkash.svg b/core/img/payments/bkash.svg
index 854b2121e..7fe3f0451 100644
--- a/core/img/payments/bkash.svg
+++ b/core/img/payments/bkash.svg
@@ -1 +1,16 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/blik-dark.svg b/core/img/payments/blik-dark.svg
index 3c512cf51..1dd02c199 100644
--- a/core/img/payments/blik-dark.svg
+++ b/core/img/payments/blik-dark.svg
@@ -1 +1,5 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/blik.svg b/core/img/payments/blik.svg
index 9e3611ce7..65937769c 100644
--- a/core/img/payments/blik.svg
+++ b/core/img/payments/blik.svg
@@ -1 +1,12 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/bnb-chain-dark.svg b/core/img/payments/bnb-chain-dark.svg
new file mode 100644
index 000000000..562ac1fc8
--- /dev/null
+++ b/core/img/payments/bnb-chain-dark.svg
@@ -0,0 +1,14 @@
+
diff --git a/core/img/payments/bnb-chain.svg b/core/img/payments/bnb-chain.svg
new file mode 100644
index 000000000..ba0f635de
--- /dev/null
+++ b/core/img/payments/bnb-chain.svg
@@ -0,0 +1,14 @@
+
diff --git a/core/img/payments/bnp-paribas-dark.svg b/core/img/payments/bnp-paribas-dark.svg
new file mode 100644
index 000000000..95f252d1d
--- /dev/null
+++ b/core/img/payments/bnp-paribas-dark.svg
@@ -0,0 +1,80 @@
+
diff --git a/core/img/payments/bnp-paribas.svg b/core/img/payments/bnp-paribas.svg
new file mode 100644
index 000000000..b64c5536c
--- /dev/null
+++ b/core/img/payments/bnp-paribas.svg
@@ -0,0 +1,80 @@
+
diff --git a/core/img/payments/braintree-dark.svg b/core/img/payments/braintree-dark.svg
index d71e62d4a..c62563d8e 100644
--- a/core/img/payments/braintree-dark.svg
+++ b/core/img/payments/braintree-dark.svg
@@ -1 +1,6 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/braintree.svg b/core/img/payments/braintree.svg
index dd75f6878..8e5b35171 100644
--- a/core/img/payments/braintree.svg
+++ b/core/img/payments/braintree.svg
@@ -1 +1,6 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/brex-dark.svg b/core/img/payments/brex-dark.svg
new file mode 100644
index 000000000..e5d445c6f
--- /dev/null
+++ b/core/img/payments/brex-dark.svg
@@ -0,0 +1,4 @@
+
diff --git a/core/img/payments/brex.svg b/core/img/payments/brex.svg
new file mode 100644
index 000000000..40b649c94
--- /dev/null
+++ b/core/img/payments/brex.svg
@@ -0,0 +1,4 @@
+
diff --git a/core/img/payments/capital-one-dark.svg b/core/img/payments/capital-one-dark.svg
new file mode 100644
index 000000000..b92626c33
--- /dev/null
+++ b/core/img/payments/capital-one-dark.svg
@@ -0,0 +1,6 @@
+
diff --git a/core/img/payments/capital-one.svg b/core/img/payments/capital-one.svg
new file mode 100644
index 000000000..eb30363e4
--- /dev/null
+++ b/core/img/payments/capital-one.svg
@@ -0,0 +1,6 @@
+
diff --git a/core/img/payments/cash-app-dark.svg b/core/img/payments/cash-app-dark.svg
index 42745b486..47612a99f 100644
--- a/core/img/payments/cash-app-dark.svg
+++ b/core/img/payments/cash-app-dark.svg
@@ -1 +1,8 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/cash-app.svg b/core/img/payments/cash-app.svg
index e267fd9b5..881948b1d 100644
--- a/core/img/payments/cash-app.svg
+++ b/core/img/payments/cash-app.svg
@@ -1 +1,8 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/chase-dark.svg b/core/img/payments/chase-dark.svg
new file mode 100644
index 000000000..c7568483d
--- /dev/null
+++ b/core/img/payments/chase-dark.svg
@@ -0,0 +1,12 @@
+
diff --git a/core/img/payments/chase.svg b/core/img/payments/chase.svg
new file mode 100644
index 000000000..bc44288ca
--- /dev/null
+++ b/core/img/payments/chase.svg
@@ -0,0 +1,12 @@
+
diff --git a/core/img/payments/checkout-com-dark.svg b/core/img/payments/checkout-com-dark.svg
new file mode 100644
index 000000000..735d6e838
--- /dev/null
+++ b/core/img/payments/checkout-com-dark.svg
@@ -0,0 +1,4 @@
+
diff --git a/core/img/payments/checkout-com.svg b/core/img/payments/checkout-com.svg
new file mode 100644
index 000000000..d1a0ed5c3
--- /dev/null
+++ b/core/img/payments/checkout-com.svg
@@ -0,0 +1,4 @@
+
diff --git a/core/img/payments/chime-dark.svg b/core/img/payments/chime-dark.svg
index 8c7066b7f..6620fcd54 100644
--- a/core/img/payments/chime-dark.svg
+++ b/core/img/payments/chime-dark.svg
@@ -1 +1,9 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/chime.svg b/core/img/payments/chime.svg
index 7d923829a..ce37ebeb2 100644
--- a/core/img/payments/chime.svg
+++ b/core/img/payments/chime.svg
@@ -1 +1,9 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/china-construction-bank-dark.svg b/core/img/payments/china-construction-bank-dark.svg
new file mode 100644
index 000000000..e4e0a44c4
--- /dev/null
+++ b/core/img/payments/china-construction-bank-dark.svg
@@ -0,0 +1,36 @@
+
diff --git a/core/img/payments/china-construction-bank.svg b/core/img/payments/china-construction-bank.svg
new file mode 100644
index 000000000..a68ae4bbf
--- /dev/null
+++ b/core/img/payments/china-construction-bank.svg
@@ -0,0 +1,36 @@
+
diff --git a/core/img/payments/cirrus-dark.svg b/core/img/payments/cirrus-dark.svg
index fefbe374b..f2caf989a 100644
--- a/core/img/payments/cirrus-dark.svg
+++ b/core/img/payments/cirrus-dark.svg
@@ -1 +1,8 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/cirrus.svg b/core/img/payments/cirrus.svg
index de2ec6e70..72645ee64 100644
--- a/core/img/payments/cirrus.svg
+++ b/core/img/payments/cirrus.svg
@@ -1 +1,8 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/citi-dark.svg b/core/img/payments/citi-dark.svg
new file mode 100644
index 000000000..1a0b52937
--- /dev/null
+++ b/core/img/payments/citi-dark.svg
@@ -0,0 +1,8 @@
+
diff --git a/core/img/payments/citi.svg b/core/img/payments/citi.svg
new file mode 100644
index 000000000..c75a31612
--- /dev/null
+++ b/core/img/payments/citi.svg
@@ -0,0 +1,8 @@
+
diff --git a/core/img/payments/clickandbuy-dark.svg b/core/img/payments/clickandbuy-dark.svg
deleted file mode 100644
index 3d6c7085d..000000000
--- a/core/img/payments/clickandbuy-dark.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/core/img/payments/clickandbuy.svg b/core/img/payments/clickandbuy.svg
deleted file mode 100644
index 901ff2beb..000000000
--- a/core/img/payments/clickandbuy.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/core/img/payments/coinbase-dark.svg b/core/img/payments/coinbase-dark.svg
new file mode 100644
index 000000000..0e7058fff
--- /dev/null
+++ b/core/img/payments/coinbase-dark.svg
@@ -0,0 +1,4 @@
+
diff --git a/core/img/payments/coinbase.svg b/core/img/payments/coinbase.svg
new file mode 100644
index 000000000..353e3c435
--- /dev/null
+++ b/core/img/payments/coinbase.svg
@@ -0,0 +1,5 @@
+
diff --git a/core/img/payments/coinkite-dark.svg b/core/img/payments/coinkite-dark.svg
index edf30f034..fac3ca896 100644
--- a/core/img/payments/coinkite-dark.svg
+++ b/core/img/payments/coinkite-dark.svg
@@ -1 +1,6 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/coinkite.svg b/core/img/payments/coinkite.svg
index 4f352bc2e..fdf82715e 100644
--- a/core/img/payments/coinkite.svg
+++ b/core/img/payments/coinkite.svg
@@ -1 +1,6 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/crypto-com-dark.svg b/core/img/payments/crypto-com-dark.svg
new file mode 100644
index 000000000..9c1489fc4
--- /dev/null
+++ b/core/img/payments/crypto-com-dark.svg
@@ -0,0 +1,8 @@
+
diff --git a/core/img/payments/crypto-com.svg b/core/img/payments/crypto-com.svg
new file mode 100644
index 000000000..157891eb9
--- /dev/null
+++ b/core/img/payments/crypto-com.svg
@@ -0,0 +1,8 @@
+
diff --git a/core/img/payments/deutsche-bank-dark.svg b/core/img/payments/deutsche-bank-dark.svg
new file mode 100644
index 000000000..dc8f10619
--- /dev/null
+++ b/core/img/payments/deutsche-bank-dark.svg
@@ -0,0 +1,16 @@
+
diff --git a/core/img/payments/deutsche-bank.svg b/core/img/payments/deutsche-bank.svg
new file mode 100644
index 000000000..32a5b5c8b
--- /dev/null
+++ b/core/img/payments/deutsche-bank.svg
@@ -0,0 +1,16 @@
+
diff --git a/core/img/payments/dinersclub-dark.svg b/core/img/payments/dinersclub-dark.svg
index 69bef0069..1e471f5a7 100644
--- a/core/img/payments/dinersclub-dark.svg
+++ b/core/img/payments/dinersclub-dark.svg
@@ -1 +1,7 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/dinersclub.svg b/core/img/payments/dinersclub.svg
index b49d7ac19..05545e9fe 100644
--- a/core/img/payments/dinersclub.svg
+++ b/core/img/payments/dinersclub.svg
@@ -1 +1,7 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/directdebit-dark.svg b/core/img/payments/directdebit-dark.svg
index 702730124..fe6518502 100644
--- a/core/img/payments/directdebit-dark.svg
+++ b/core/img/payments/directdebit-dark.svg
@@ -1 +1,4 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/directdebit.svg b/core/img/payments/directdebit.svg
index 5f1d72be3..db0081a4c 100644
--- a/core/img/payments/directdebit.svg
+++ b/core/img/payments/directdebit.svg
@@ -1 +1,4 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/discover-dark.svg b/core/img/payments/discover-dark.svg
index adf125b88..c8b09cc08 100644
--- a/core/img/payments/discover-dark.svg
+++ b/core/img/payments/discover-dark.svg
@@ -1 +1,8 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/discover.svg b/core/img/payments/discover.svg
index 59d6e2d34..47720a755 100644
--- a/core/img/payments/discover.svg
+++ b/core/img/payments/discover.svg
@@ -1 +1,6 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/dotpay-dark.svg b/core/img/payments/dotpay-dark.svg
deleted file mode 100644
index 949e08aaf..000000000
--- a/core/img/payments/dotpay-dark.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/core/img/payments/dotpay.svg b/core/img/payments/dotpay.svg
deleted file mode 100644
index 10530506a..000000000
--- a/core/img/payments/dotpay.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/core/img/payments/dwolla-dark.svg b/core/img/payments/dwolla-dark.svg
index e7fd192e9..3d3a7ae4b 100644
--- a/core/img/payments/dwolla-dark.svg
+++ b/core/img/payments/dwolla-dark.svg
@@ -1 +1,5 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/dwolla.svg b/core/img/payments/dwolla.svg
index 41df8601b..fe2df5c7f 100644
--- a/core/img/payments/dwolla.svg
+++ b/core/img/payments/dwolla.svg
@@ -1 +1,5 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/easypaisa-dark.svg b/core/img/payments/easypaisa-dark.svg
index d7c8d2462..c51611c1c 100644
--- a/core/img/payments/easypaisa-dark.svg
+++ b/core/img/payments/easypaisa-dark.svg
@@ -1 +1,14 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/easypaisa.svg b/core/img/payments/easypaisa.svg
index eb72c2ecf..6e40d132f 100644
--- a/core/img/payments/easypaisa.svg
+++ b/core/img/payments/easypaisa.svg
@@ -1 +1,14 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/ebay-dark.svg b/core/img/payments/ebay-dark.svg
index 060aef5ca..d7418ee51 100644
--- a/core/img/payments/ebay-dark.svg
+++ b/core/img/payments/ebay-dark.svg
@@ -1 +1,7 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/ebay.svg b/core/img/payments/ebay.svg
index 72bfcfd71..4277c122b 100644
--- a/core/img/payments/ebay.svg
+++ b/core/img/payments/ebay.svg
@@ -1 +1,7 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/elo-dark.svg b/core/img/payments/elo-dark.svg
index 31b16caac..757840161 100644
--- a/core/img/payments/elo-dark.svg
+++ b/core/img/payments/elo-dark.svg
@@ -1 +1,11 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/elo.svg b/core/img/payments/elo.svg
index 126f59a5d..a143ece4f 100644
--- a/core/img/payments/elo.svg
+++ b/core/img/payments/elo.svg
@@ -1 +1,11 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/epayco-dark.svg b/core/img/payments/epayco-dark.svg
index 731794769..bcdeb74b8 100644
--- a/core/img/payments/epayco-dark.svg
+++ b/core/img/payments/epayco-dark.svg
@@ -1 +1,5 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/epayco.svg b/core/img/payments/epayco.svg
index 193a96e5e..e26b0e6ee 100644
--- a/core/img/payments/epayco.svg
+++ b/core/img/payments/epayco.svg
@@ -1 +1,5 @@
-
\ No newline at end of file
+
diff --git a/core/img/payments/esewa-dark.svg b/core/img/payments/esewa-dark.svg
index a999ad1c4..915362220 100644
--- a/core/img/payments/esewa-dark.svg
+++ b/core/img/payments/esewa-dark.svg
@@ -1,11 +1,11 @@
-