Merge dev into main for v1.7.0

# Conflicts:
#	core/scss/layout/_root.scss
This commit is contained in:
codecalm committed 2026-10-20 12:43:22 +02:00
commit 8a01164546
1113 files changed
+22268 -4372

No files matched your search

+88
View File
@@ -0,0 +1,88 @@
---
name: component-finisher
description: Finishes a Tabler component or plugin whose core code already exists. Use after a new class, component or JS plugin has landed in `core/` (or a new `shared/ui` component was written) and the rest is still missing - the shared Astro component, the demo page, the docs page with its class reference, the menu entries and the screenshot page. Finds what is missing, writes it by following the repo skills, verifies it in the browser and reports. It never changes the public API in `core/`, and never commits or pushes.
---
You take a component whose styles or JavaScript already exist and make it visible and documented. The design and the API are decided; you do not redesign them. You write files, verify them and report. You never commit, push, open a PR or run a build while a dev server is running.
Being called is an explicit request to write: do not stop to ask whether docs or a demo page are wanted, write them.
## Skills are the source of truth
Every step below has a skill in `.agents/skills/<name>/SKILL.md`. Read the skill file before you do the step and follow it; this file only says what to do and in which order. When this file and a skill disagree, the skill wins.
## 1. Inventory
Find out what the component is. The caller names it, or you derive it from the change:
- `git status -sb`, `git diff origin/dev...HEAD --stat`, and `git diff` for uncommitted work.
- Styles: `core/scss/ui/_<name>.scss` - list every class, modifier, size and custom property.
- JavaScript: `core/js/src/**` - list the options, `data-bs-*` attributes, events and public methods. A third-party library is listed in `core/libs.json`.
- Shared component: `shared/ui/<Name>.astro` and its `Props` interface.
Then check each deliverable and build a gap table before writing anything:
| Deliverable | Where to look |
| --- | --- |
| Shared component | `shared/ui/<Name>.astro` |
| Demo page | `preview/pages/<name>.astro`, or a section on an existing page |
| Preview menu entry | `shared/data/menu.json`, and the page's `pageMenu` prop |
| Docs page | `docs/content/ui/**/<name>.mdx` |
| Class reference | `classnames` and `source` in the docs page front matter |
| Docs menu entry | `shared/data/docs.json` |
| Demo to docs link | `<DocsLink path="...">` on the demo page |
| Screenshot page | `screenshots/pages/<name>.astro` |
| Changeset | `.changeset/*.md` that names the component |
A variant, size or option added to an existing component needs an update to the existing demo and docs pages, not new ones. Say in the report which case it is.
## 2. Fill the gaps, in this order
Later steps use the output of earlier ones, so keep the order.
1. **Shared component** (`ui-component` skill; `astro-scripts` when it needs client-side JavaScript). Only when the markup is more than one element with classes, or when the demo page would repeat it. Extend an existing component before adding a new file.
2. **Demo page** (`demo-pages`, `page-layouts`). Show every variant, size, colour and state the inventory found. Compose from `@ui` components; fixed data only.
3. **Preview menu** (`navigation`). Add the entry with `"badge": "New"` for a new component; the url ends in `.html`; `pageMenu` equals the dot-path of the keys.
4. **Docs page** (`write-docs`). Simple English, the default section order, examples through `Example`. Set `added-in` to the next version when nearby pages use it. Quote any front matter value that contains `: `.
5. **Class reference** (`class-reference`). Every class from the inventory, generated families collapsed, `source` set. Check that every listed class exists in the SCSS.
6. **Docs menu and links** (`navigation`). Entry in `docs.json` with an absolute url without extension; `<DocsLink>` on the demo page; `related:` on sibling docs pages when it helps.
7. **Screenshot page** (`screenshots`). Only for a new component or plugin, not for a variant. Write the page with the interesting state visible on load. Capture the PNG files only when no dev server is running, because `capture` starts a build; otherwise leave the page and say so.
8. **Changeset** (`generate-changeset`). Write the file only when the caller asked for one. Otherwise put the proposed packages, bump levels and the one-line text in the report.
## 3. Limits
- **Do not change public API.** Classes, custom properties, Sass variables, `data-*` attributes and JS options in `core/` stay as they are. When the demo or docs show that something is missing or broken (a variant without a class, an option that does nothing, a dark mode or RTL defect), write it down for the report and continue. Fix it only when the caller asked you to.
- **Do not invent.** Document what the source does. No class, prop or option that you did not find in the inventory.
- **Do not hand-write styles.** No `<style>` blocks and no page-level CSS on a demo or docs page; if a layout needs a class that does not exist, report it.
- **Files are in English**, whatever language the caller used.
- **No drive-by refactors.** Touch the files this component needs.
## 4. Verify
Follow the `astro-dev` skill. Check first whether a server is already up (`lsof -iTCP -sTCP:LISTEN -P | grep -E ':30[0-9]{2}\b'`) and attach to it instead of starting a second one. Never run a build next to a dev server.
- Demo page on `:3000`: console clean, the menu entry highlighted, every interactive variant exercised, light and dark mode. Check RTL when the component has a direction.
- Docs page on `:3010`: the page renders, examples render, the class table is at the end. A page added after the docs server started answers 404 until the server is restarted; that is not a defect in the page.
- Screenshot page on `:3020` with `?theme=dark` too, when you wrote one.
Then the gates at the repo root. Read the full output, not a tail:
```bash
pnpm run format:prettier
pnpm run lint:md
pnpm run check:docs-links
pnpm run type-check
```
Do not run `prettier` on `.mdx` files. Skip the gates that need a build (`check:html`, `check:markup-classes`, `check:compat`) while a dev server is running, and name them in the report.
## 5. Report
Keep it short, in the language the caller used; file names, commands and code stay as they are.
1. The gap table from step 1 with a result per row: `done`, `already there`, `skipped` with the reason.
2. Files created and files changed.
3. What you verified and how, with a screenshot of the demo page for a visual component.
4. **Findings in `core/`**: defects and missing pieces you saw but did not change.
5. **Open decisions**: a name, a menu position, a bump level, anything you chose on the caller's behalf.
6. The proposed changeset line, when you did not write the file.
+128
View File
@@ -0,0 +1,128 @@
---
name: dev-sync
description: Brings the new commits from `dev` into `v2-dev` with a merge. Use when the user asks to sync, merge or update `v2-dev` from `dev`, or asks how far `v2-dev` is behind. Works in its own worktree on a sync branch, resolves the conflicts by the rules of the 2.0 branch (v2 structure wins, the change from `dev` is applied again by hand), looks for the breaks git does not report, runs the gates and reports. It never pushes, never moves `dev` or `v2-dev`, and leaves the merge uncommitted unless told to commit.
---
You merge `origin/dev` into `origin/v2-dev`. `v2-dev` is the future main branch: it has cascade layers, token maps, barrels, Floating UI, ESM only and other 2.0 work that `dev` does not have. `dev` keeps getting features and fixes for 1.x. Your job is to carry those over without undoing any 2.0 decision.
## Hard rules
- **Merge, never rebase.** `v2-dev` is published and has open PRs on top of it.
- **Never push**, never force anything, never move the `dev` or `v2-dev` refs, never touch the main checkout (a dev server may be running there).
- **Do not commit by default.** Stop with every conflict resolved and staged, the merge still open. Commit only when the caller asked for it, with the message `Merge origin/dev into v2-dev`.
- **Never backport.** Nothing from `v2-dev` goes to `dev`.
- No build next to a running dev server. Files you write are in English.
## 1. Survey
```bash
git fetch -q origin
git rev-list --count origin/v2-dev..origin/dev
git log --oneline --no-merges origin/v2-dev..origin/dev
git diff --stat origin/v2-dev...origin/dev
```
When the count is 0, say so and stop. When the caller only asked how far behind the branch is, report the list grouped by area (core SCSS, core JS, docs, preview, tooling, release) and stop.
Preview the conflicts without touching any tree:
```bash
git merge-tree --write-tree --name-only origin/v2-dev origin/dev
```
Note which dev commits are release commits (`chore: update versions`, `Update SRI hashes`), because they change versions, changelogs and delete changesets.
## 2. Worktree
```bash
git worktree add .claude/worktrees/dev-sync-<YYYY-MM-DD> -b sync-dev-<YYYY-MM-DD> origin/v2-dev
cd .claude/worktrees/dev-sync-<YYYY-MM-DD>
pnpm install --frozen-lockfile
git merge --no-ff --no-commit origin/dev
```
Branch names describe the change and never contain `claude`. When `pnpm` hangs with no output, a dead engine lock is the usual cause; say so instead of waiting.
zsh trap: in `"$ref:path"` the shell reads `:p`, `:c`, `:r` as modifiers. Always write `"${ref}:path"`.
## 3. Resolve conflicts
For every conflicted file read three things before editing: the v2-dev version, the dev commit that touched it (`git log -p origin/v2-dev..origin/dev -- <file>`), and the merge base. The question is always "what did dev change, and where does that change live in the v2 structure".
General rule: **v2-dev wins on structure, dev wins on behaviour.** Take the v2 version of the file, then apply the dev hunk again by hand in the v2 idiom.
| Area | Rule |
| --- | --- |
| Token maps, `tokens()` | The map stays. A dev change to a Sass variable or a declaration becomes a change of the matching token. A new variable of a component goes into its token map. |
| Cascade layers | The v2 `@layer` wrapper stays. A new component from dev is wrapped by hand: components in `components`, form controls in `forms`. |
| Barrels | `core/scss/_core.scss`, `ui/_index.scss`, `vendor/_index.scss`, `helpers/_index.scss` stay. A new partial from dev is added to the right barrel; a partial dev removed is removed from it. |
| Custom properties | Where dev replaced a Sass variable with a `var(--...)`, keep dev's custom property inside the v2 structure. |
| Focus ring | dev's outline `focus-ring($offset, $color)` and `focus-ring-transition()`. The old `$shadow` / `$show-border` / `$outline` arguments and `--focus-ring-box-shadow` do not come back. |
| Docs markers | Keep every `scss-docs-start <name>` / `scss-docs-end` pair from both sides. On v2-dev the `<name>-css-vars` markers sit around the token map. |
| Core JS | v2 imports and types stay (Floating UI, `ComponentConfig`, ESM entry points). dev's fix is applied on top. A file dev deleted stays deleted, and so do the exports that pointed at it. |
| Compat gates | `check:compat`, `check:compat-fixture`, `.build/check-compat*.ts`, `.build/released-package.ts`, `.build/compat-baseline.txt`, `.build/compat-fixture/` and their workflow steps are removed on v2-dev on purpose. Keep them deleted, also when dev modified them. |
| Workflows | Do not bring back the branch guard workflow. Other workflow changes from dev are taken. |
| Size budgets | The `bundlewatch` limits in `core/package.json` are v2's. Never take dev's numbers. |
| Responsive classes, legacy class map | v2's prefix form and PostCSS plugins stay; a guard or fix dev added to a loop is applied inside the v2 loop. |
| Agent config, `CLAUDE.md`, `.agents/rules/v2.mdc` | v2's files stay. New skills and agents from dev are taken. A skill both sides changed: v2 text wins where it describes 2.0 behaviour, dev's additions are kept. |
| Docs and preview pages | Usually dev's content. Keep v2 class names and markup where the page was already moved to a 2.0 API. |
| `pnpm-lock.yaml` | Never resolve by hand. Take v2's file, then `pnpm install` to add what dev's `package.json` changes need. |
After a release on dev:
- Versions in the `package.json` files and the three `CHANGELOG.md` files: take dev's. The 1.x history belongs in the 2.0 changelog.
- Changesets dev's release consumed are deleted. A changeset that v2-dev edited and dev deleted stays deleted, because it is already released. Changesets that exist only on v2-dev stay.
- `.changeset/config.json` and SRI hashes: v2's config, dev's hashes.
List every one of these in the report as a decision you took, so the maintainer can reverse it.
Traps:
- `git checkout --ours <file>` drops the hunks of dev that merged cleanly in that file. Use `git checkout -m <file>` and resolve the markers; the labels there are `ours` / `base` / `theirs`.
- `git add <directory>` marks files that still hold conflict markers as resolved. Add files one by one, and before finishing run `git diff --check` and `grep -rn '^<<<<<<< \|^>>>>>>> ' -- core docs preview shared .build .github`.
- A file that mostly differs by indentation (wrapped into `@layer`) is easier to rebuild from the v2 version than to resolve hunk by hunk.
- A conflict you cannot settle from the code and these rules is a decision. Take the v2 side, write the dev hunk into the report, and go on.
## 4. Breaks git does not report
A clean merge is not a correct merge. Check each of these after the conflicts are gone:
- **New partials**: every file dev added under `core/scss/ui/`, `vendor/`, `helpers/` is in a barrel and in a layer.
- **Old API in new code**: grep the files dev added or changed for names v2 removed (old `focus-ring` arguments, removed Sass variables, Popper imports, `BaseComponentConfig`, `src/tabler` re-exports).
- **Unused Sass variables**: both sides may have removed different usages; `fusv` in `lint:scss` reports them. Remove the variable.
- **Markers against front matter**: every `css-vars:` and `sass-vars:` value in `docs/content/**/*.mdx` has its `scss-docs-start` marker in `core/scss`. A missing one breaks the docs build.
- **`shared/data/open-source.json`** lists what v2 ships (Floating UI, not Popper).
- **JS entry points**: new plugins from dev are exported from the v2 ESM entry, and their jQuery or global bridges are not reintroduced where v2 removed them.
- **Custom properties without the prefix**: new code writes properties without `tblr-`; the build adds it.
## 5. Gates
Run at the root of the worktree and read the full output, never a tail:
```bash
pnpm run check
pnpm --filter @tabler/core test
```
`pnpm run check` is lint, type-check and type-check of `.build/`. When the worktree has no dev server of its own, also compile the styles once (`pnpm --filter @tabler/core build`) and run `pnpm run bundlewatch`. Growth past a limit is reported with the numbers, not fixed by raising the limit.
Fix what the merge broke and stage the fix, so it becomes part of the merge. A failure that is already on `origin/v2-dev` (check with `git stash` or a second worktree only when in doubt) is reported, not fixed.
## 6. Report
Lead with the state: **ready to commit**, **ready with decisions open**, or **blocked**. Write in the language the caller used; commands, file names and code stay as they are.
1. What came in: number of commits, the headline ones by PR number, grouped by area.
2. Conflicts: a table `File | What dev changed | How it was resolved`.
3. Semantic fixes from step 4.
4. Gates: result of each, with test counts and CSS sizes against the limits.
5. **Decisions for the maintainer**: versions and changesets after a release, any conflict you settled by taking the v2 side, anything in dev that contradicts a 2.0 decision.
6. How to finish, as commands the maintainer runs:
```bash
git -C .claude/worktrees/dev-sync-<date> commit -m "Merge origin/dev into v2-dev"
git push origin sync-dev-<date>:v2-dev
```
This is a fast-forward of `v2-dev`, so no force is needed. If `origin/v2-dev` moved in the meantime, say that the sync branch has to merge it first.
7. After the push: open PRs into `v2-dev` that touch the same files and will need `v2-dev` merged in, and the worktree to remove.
+1
View File
@@ -66,6 +66,7 @@ const selector = `#wysiwyg-${id}`
- `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.
- No `await` (and no `async` function) inside a captured `<script is:inline>`. The Astro compiler sees the keyword and renders the page content asynchronously, `PageScripts` then drains the registry too early, and **every** captured script of the page disappears with no error. Use a `.then()` chain instead.
- 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`
+5 -2
View File
@@ -7,14 +7,17 @@ description: >-
# The framework JavaScript
`core/js` builds two shipped bundles. Everything here is public API and is bound by a size budget.
`core/js` builds three shipped bundles. Everything here is public API and is bound by a size budget.
## 1. Two entry points
## 1. Three entry points
| Entry | Ships as | Holds |
| -------------------- | ---------------------------------- | ---------------------------------------------------------------------------- |
| `js/tabler.ts` | `tabler.js` / `.esm.js` (+ `.min`) | plugin initialisers, the Bootstrap components, the `tabler` helper namespace |
| `js/tabler-theme.ts` | `tabler-theme.js` (+ variants) | the colour-mode/theme switcher only |
| `js/tabler-map.ts` | `tabler-map.js` (+ variants) | the `MapView` component, as an add-on that extends the `tabler` global |
`tabler-map.js` is loaded after `tabler.js`, and only on pages with a map: a component that few pages use goes in an add-on bundle like this one, not in `tabler.js`. Its UMD build uses `extend` (`core/.build/vite.config.mts`), so it adds its exports to the existing `tabler` global.
`tabler-theme.js` is loaded right after `<body>` and **not deferred**, so the chosen theme applies before the first paint. It stays tiny on purpose (bundlewatch: 1 kB raw, 800 B minified) — do not add anything to it that is not needed before paint.
+2 -2
View File
@@ -82,13 +82,13 @@ async function compile(entry: string): Promise<{ outFile: string; result: Result
return { outFile, result }
}
// rtlcss over the prefixed output: outDir/x.css → outDir/x.rtl.css (+ .map)
// rtlcss over the prefixed, already autoprefixed output: outDir/x.css → outDir/x.rtl.css (+ .map)
async function rtl(entry: string, outFile: string, base: Result): Promise<void> {
const rtlFile = join(outDir, `${basename(entry, '.scss')}.rtl.css`)
// Same input the CLI read from disk: the prefixed css including its
// sourceMappingURL annotation, so postcss picks up the previous map.
// The previous map is not on disk yet (writes are buffered) — pass it in.
const result = await postcss([autoprefixer({ cascade: false }), rtlcss()]).process(base.css, {
const result = await postcss([rtlcss()]).process(base.css, {
from: outFile,
to: rtlFile,
map: { ...mapOptions, prev: base.map.toString() },
+3 -3
View File
@@ -27,7 +27,7 @@ import { pkgName, releasedPackage } from './released-package'
const fixtureDir = '.build/compat-fixture'
const packageArg = process.argv.indexOf('--package')
const coreDir = packageArg > -1 ? process.argv[packageArg + 1]! : 'core'
const coreDir = packageArg > -1 ? process.argv[packageArg + 1] : 'core'
const MIME: Record<string, string> = { '.html': 'text/html', '.css': 'text/css', '.js': 'text/javascript', '.svg': 'image/svg+xml', '.map': 'application/json' }
@@ -61,7 +61,7 @@ function sassResults(pkg: string): Result {
function serve(pkg: string): Promise<Server> {
const server = createServer((request, response) => {
const path = decodeURIComponent((request.url ?? '/').split('?')[0]!)
const path = decodeURIComponent((request.url ?? '/').split('?')[0])
const file = path === '/' ? resolve(fixtureDir, 'page.html') : resolve(pkg, `.${path}`)
if (!existsSync(file) || !statSync(file).isFile()) {
response.writeHead(404).end()
@@ -86,7 +86,7 @@ async function pageResults(pkg: string, page: Page): Promise<Result> {
await page.goto(`http://127.0.0.1:${port}/`, { waitUntil: 'networkidle' })
await page.addStyleTag({ content: '*, *::before, *::after { transition: none !important; }' })
const style = (selector: string, property: string): Promise<string> => page.evaluate(([s, p]) => getComputedStyle(document.querySelector(s!)!).getPropertyValue(p!), [selector, property])
const style = (selector: string, property: string): Promise<string> => page.evaluate(([s, p]) => getComputedStyle(document.querySelector(s)!).getPropertyValue(p), [selector, property])
results['page: no script error and no 404'] = problems.length === 0 ? 'yes' : problems.join('; ')
results['page: rgba(var(--tblr-primary-rgb), .5) paints'] = await style('#highlight', 'background-color')
+8 -8
View File
@@ -48,7 +48,7 @@ function walk(root: string, dir = root): string[] {
})
}
const matches = (source: string, pattern: RegExp): Set<string> => new Set([...source.matchAll(pattern)].map((match) => match[1]!))
const matches = (source: string, pattern: RegExp): Set<string> => new Set([...source.matchAll(pattern)].map((match) => match[1]))
// --- css -------------------------------------------------------------------
@@ -106,7 +106,7 @@ function splitParams(source: string | undefined): string[] {
}
params.push(current)
// `$color: rgba($white, 0.15)` → `$color`; `$args...` → `$args...`
return params.map((param) => param.trim().split(':')[0]!.trim()).filter(Boolean)
return params.map((param) => param.trim().split(':')[0].trim()).filter(Boolean)
}
function sassSurface(root: string): { variables: Set<string>; callables: Map<string, Callable> } {
@@ -117,8 +117,8 @@ function sassSurface(root: string): { variables: Set<string>; callables: Map<str
const source = readFileSync(join(root, 'scss', file), 'utf8').replace(/\/\/.*$/gm, '')
for (const name of matches(source, sassVariable)) variables.add(name)
for (const [, kind, name, params] of source.matchAll(sassCallable)) {
if (name!.startsWith('_') || name!.startsWith('-')) continue // private by convention
callables.set(`${kind} ${name}`, { kind: kind!, name: name!, params: splitParams(params) })
if (name.startsWith('_') || name.startsWith('-')) continue // private by convention
callables.set(`${kind} ${name}`, { kind: kind, name: name, params: splitParams(params) })
}
}
return { variables, callables }
@@ -160,7 +160,7 @@ function sassTypes(root: string): Map<string, string> {
}
}`
const { css } = compileString(source, { loadPaths: [root, 'node_modules'], logger: { warn() {}, debug() {} } })
return new Map([...css.matchAll(/--([\w-]+): (\w+);/g)].map((match) => [match[1]!, match[2]!]))
return new Map([...css.matchAll(/--([\w-]+): (\w+);/g)].map((match) => [match[1], match[2]]))
}
function sassTypeBreaks(released: string, current: string): string[] {
@@ -175,7 +175,7 @@ function esmExports(file: string): Set<string> {
const source = readFileSync(file, 'utf8')
const names = new Set<string>()
for (const [, list] of source.matchAll(/^export\s*\{([^}]*)\}/gm)) {
for (const entry of list!.split(',')) {
for (const entry of list.split(',')) {
const name = entry
.trim()
.split(/\s+as\s+/)
@@ -220,7 +220,7 @@ async function main() {
const lines = readFileSync(baselineFile, 'utf8').split('\n')
const againstIndex = lines.findIndex((line) => againstPattern.test(line))
if (againstIndex === -1) throw new Error(`${baselineFile} has no \`# against: <version>\` line`)
const against = againstPattern.exec(lines[againstIndex]!)![1]!
const against = againstPattern.exec(lines[againstIndex])![1]
if (reset) {
writeFileSync(baselineFile, [...lines.slice(0, againstIndex), `# against: ${version}`, ''].join('\n'))
@@ -233,7 +233,7 @@ async function main() {
const baseline = new Map<string, boolean>() // key → accepted
for (const line of stale ? [] : lines) {
const [entry, comment = ''] = line.split(' # ')
const key = entry!.trim()
const key = entry.trim()
if (!key || key.startsWith('#')) continue
baseline.set(key, comment.trim().startsWith('accepted:'))
}
+4 -4
View File
@@ -52,7 +52,7 @@ const CONSOLE_IGNORE = [/GL Driver Message/, /Google Maps JavaScript API/, /allo
type PageReport = { url: string; errors: string[]; warnings: string[] }
const resolveFile = (root: string, urlPath: string): string | null => {
const clean = decodeURIComponent(urlPath.split('?')[0]!.split('#')[0]!)
const clean = decodeURIComponent(urlPath.split('?')[0].split('#')[0])
// `/x/` and `/x/index.html` also resolve to x.html: Astro's file format
// collapses x/index.astro to x.html and the hosting serves it under both.
const collapsed = clean.replace(/\/(index\.html)?$/, '')
@@ -87,7 +87,7 @@ const serve = (root: string): Promise<{ server: Server; base: string }> =>
const sitemapPaths = async (base: string, dir?: string): Promise<string[]> => {
const xml = dir ? readFileSync(join(dir, 'sitemap.xml'), 'utf8') : await (await fetch(`${base}/sitemap.xml`)).text()
return [...xml.matchAll(/<loc>([^<]+)<\/loc>/g)].map((m) => m[1]!.replace(/^https?:\/\/[^/]+/, '')).filter((p) => p.startsWith('/'))
return [...xml.matchAll(/<loc>([^<]+)<\/loc>/g)].map((m) => m[1].replace(/^https?:\/\/[^/]+/, '')).filter((p) => p.startsWith('/'))
}
// Runs in the page as plain JavaScript (a string, so no bundler helpers such as
@@ -162,14 +162,14 @@ const crawl = async (browser: Browser, base: string, paths: string[]) => {
await page.goto(base + path, { waitUntil: 'load', timeout: 60_000 })
await page.waitForTimeout(500)
if (onSite()) {
const r = (await page.evaluate(INSPECT)) as Inspection
const r = await page.evaluate<Inspection>(INSPECT)
for (const id of r.duplicateIds) if (!VENDOR_ID_PREFIXES.some((p) => id.startsWith(p))) report.errors.push(`duplicate id "${id}"`)
for (const t of r.missingTargets) report.errors.push(`no element for ${t}`)
for (const n of r.nested) report.errors.push(`nested interactive: ${n}`)
for (const src of r.imgNoAlt) report.warnings.push(`img without alt: ${src}`)
for (const html of r.unnamed) report.warnings.push(`no accessible name: ${html}`)
for (const href of r.links) {
const key = href.split(/[?#]/)[0]!
const key = href.split(/[?#]/)[0]
if (!links.has(key)) links.set(key, path)
}
}
+7 -7
View File
@@ -23,8 +23,8 @@ const htmlTargets: string[] = []
const cssDirs: string[] = []
let updateBaseline = false
for (let i = 0; i < args.length; i++) {
if (args[i] === '--html') htmlTargets.push(args[++i]!)
else if (args[i] === '--css') cssDirs.push(args[++i]!)
if (args[i] === '--html') htmlTargets.push(args[++i])
else if (args[i] === '--css') cssDirs.push(args[++i])
else if (args[i] === '--update-baseline') updateBaseline = true
}
if (htmlTargets.length === 0 || cssDirs.length === 0) {
@@ -41,14 +41,14 @@ const walk = (dir: string, ext: string): string[] =>
const defined = new Set<string>()
for (const dir of cssDirs) {
for (const file of walk(resolve(dir), '.css')) {
for (const m of readFileSync(file, 'utf8').matchAll(/\.(-?[_a-zA-Z][\w-]*)/g)) defined.add(m[1]!)
for (const m of readFileSync(file, 'utf8').matchAll(/\.(-?[_a-zA-Z][\w-]*)/g)) defined.add(m[1])
}
}
const pagesOf = async (target: string): Promise<{ path: string; html: string }[]> => {
if (/^https?:/.test(target)) {
const xml = await (await fetch(`${target}/sitemap.xml`)).text()
const paths = [...xml.matchAll(/<loc>([^<]+)<\/loc>/g)].map((m) => m[1]!.replace(/^https?:\/\/[^/]+/, ''))
const paths = [...xml.matchAll(/<loc>([^<]+)<\/loc>/g)].map((m) => m[1].replace(/^https?:\/\/[^/]+/, ''))
const pages = []
for (const path of paths) pages.push({ path, html: await (await fetch(target + path)).text() })
return pages
@@ -56,7 +56,7 @@ const pagesOf = async (target: string): Promise<{ path: string; html: string }[]
const root = resolve(target)
const xml = readFileSync(join(root, 'sitemap.xml'), 'utf8')
return [...xml.matchAll(/<loc>([^<]+)<\/loc>/g)].map((m) => {
const path = m[1]!.replace(/^https?:\/\/[^/]+/, '')
const path = m[1].replace(/^https?:\/\/[^/]+/, '')
const file = [join(root, path), join(root, `${path}.html`), join(root, path, 'index.html')].find((f) => existsSync(f) && statSync(f).isFile())
return { path, html: file ? readFileSync(file, 'utf8') : '' }
})
@@ -70,9 +70,9 @@ const main = async () => {
pageCount++
// Page-level <style> blocks define classes too (demo pages style their own markup).
const inline = new Set<string>()
for (const block of html.matchAll(/<style[^>]*>([\s\S]*?)<\/style>/g)) for (const m of block[1]!.matchAll(/\.(-?[_a-zA-Z][\w-]*)/g)) inline.add(m[1]!)
for (const block of html.matchAll(/<style[^>]*>([\s\S]*?)<\/style>/g)) for (const m of block[1].matchAll(/\.(-?[_a-zA-Z][\w-]*)/g)) inline.add(m[1])
for (const m of html.matchAll(/class="([^"]*)"/g)) {
for (const cls of m[1]!.split(/\s+/).filter(Boolean)) {
for (const cls of m[1].split(/\s+/).filter(Boolean)) {
if (defined.has(cls) || inline.has(cls)) continue
if (!used.has(cls)) used.set(cls, new Set())
used.get(cls)!.add(`${target}${path}`)
+81 -1
View File
@@ -11,4 +11,84 @@
# The line below names the release this list is written against. Once a newer
# release is on npm the list no longer applies: the check only warns, and
# `pnpm run check:compat --reset` empties it and moves the line to that release.
# against: 1.6.0
# against: 1.6.1
#
# Decided by codecalm on 2026-10-06 (#3278): Pricing moves from tabler-marketing.css
# to tabler.css. See the 1.7 upgrade guide, "Pricing and Shape are in the core bundle".
css:tabler-marketing.css:--tblr-gray-200 # accepted: Pricing ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-shadow-card # accepted: Pricing ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.pricing # accepted: Pricing ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.pricing-btn # accepted: Pricing ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.pricing-card # accepted: Pricing ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.pricing-features # accepted: Pricing ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.pricing-label # accepted: Pricing ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.pricing-price # accepted: Pricing ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.pricing-price-currency # accepted: Pricing ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.pricing-price-description # accepted: Pricing ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.pricing-title # accepted: Pricing ships in tabler.css since 1.7, which every marketing page loads anyway
file:scss/marketing/_pricing.scss # accepted: Pricing ships in tabler.css since 1.7, which every marketing page loads anyway
#
# Decided by codecalm on 2026-10-08 (#3294): Shape moves from tabler-marketing.css
# to tabler.css. See the 1.7 upgrade guide, "Pricing and Shape are in the core bundle".
css:tabler-marketing.css:--tblr-azure # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-azure-lt # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-black # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-black-lt # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-blue # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-blue-lt # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-cyan # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-cyan-lt # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-gray # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-gray-dark # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-gray-dark-lt # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-gray-lt # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-green # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-green-lt # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-indigo # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-indigo-lt # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-lime # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-lime-lt # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-orange # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-orange-lt # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-pink # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-pink-lt # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-primary-lt # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-purple # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-purple-lt # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-red # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-red-lt # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-shape-border-radius # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-shape-icon-size # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-shape-size # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-teal # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-teal-lt # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-white # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-white-lt # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-yellow # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:--tblr-yellow-lt # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.icon # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape-2xl # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape-azure # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape-black # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape-blue # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape-cyan # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape-gray # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape-gray-dark # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape-green # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape-indigo # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape-lg # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape-lime # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape-md # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape-orange # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape-pink # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape-purple # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape-red # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape-sm # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape-teal # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape-white # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape-xl # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape-xs # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape-xxs # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
css:tabler-marketing.css:.shape-yellow # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
file:scss/marketing/_shape.scss # accepted: Shape ships in tabler.css since 1.7, which every marketing page loads anyway
+289
View File
@@ -0,0 +1,289 @@
#!/usr/bin/env tsx
/**
* Generates the map files of the VectorMap plugin (`core/js/maps/*.ts`) from
* Natural Earth (https://www.naturalearthdata.com, public domain).
*
* The shapes are projected here, at build time, and written as ready SVG path
* data. The plugin only puts them into an `<svg>`, so no geo library ships to
* the browser.
*
* Usage: pnpm run generate:maps
*/
import { writeFileSync } from 'node:fs'
import { dirname, join } from 'node:path'
import process from 'node:process'
import { fileURLToPath } from 'node:url'
import * as prettier from 'prettier'
const __dirname = dirname(fileURLToPath(import.meta.url))
const outDir = join(__dirname, '..', 'core', 'js', 'maps')
// Pinned, so that a new run gives the same file.
const SOURCE = 'https://raw.githubusercontent.com/nvkelso/natural-earth-vector/v5.1.2/geojson'
type Position = [number, number]
type Ring = Position[]
interface Feature {
properties: Record<string, string | number | null>
geometry: { type: 'Polygon'; coordinates: Ring[] } | { type: 'MultiPolygon'; coordinates: Ring[][] }
}
interface MapConfig {
/** File name in `core/js/maps/` and the name the map is registered under */
name: string
/** Natural Earth file, without the extension */
source: string
/** Width of the viewBox; the height follows from the projection */
width: number
/** Region codes left out of the map */
exclude: string[]
/**
* Countries too small to have a shape in `source`. They are taken from a
* more detailed file and put on the map as a point.
*/
points?: {
/** Natural Earth file, without the extension */
source: string
/** Natural Earth `TYPE` values that get a point */
types: string[]
/** Region codes that get a point whatever their type */
include: string[]
}
}
const maps: MapConfig[] = [
{
name: 'world',
source: 'ne_110m_admin_0_countries',
width: 1000,
exclude: ['AQ'],
points: {
source: 'ne_50m_admin_0_countries',
types: ['Sovereign country'],
include: ['HK', 'MO'],
},
},
]
// Territories with no ISO 3166-1 code in Natural Earth, keyed by `ADM0_A3`.
// `XK` is the code Kosovo uses in practice; the other two are user-assigned.
const CODE_OVERRIDES: Record<string, string> = {
KOS: 'XK',
CYN: 'XC',
SOL: 'XS',
}
// One decimal place in a 1000 unit wide viewBox is about 0.04° of longitude,
// well below the detail of the 110m data.
const PRECISION = 10
const RADIANS = Math.PI / 180
/**
* Miller cylindrical projection, in radians. Placing a point on the map by its
* coordinates takes the same formula, which is why `projection` is written
* into the map file.
*/
const miller = ([lng, lat]: Position): Position => [lng * RADIANS, 1.25 * Math.log(Math.tan(Math.PI / 4 + 0.4 * lat * RADIANS))]
const regionCode = (properties: Feature['properties']): string | null => {
const override = CODE_OVERRIDES[String(properties.ADM0_A3)]
if (override) {
return override
}
// `ISO_A2` is "-99" for France and Norway; `ISO_A2_EH` has them right.
for (const key of ['ISO_A2_EH', 'ISO_A2']) {
const code = String(properties[key] ?? '')
if (/^[A-Z]{2}$/.test(code)) {
return code
}
}
return null
}
const ringsOf = (geometry: Feature['geometry']): Ring[] => (geometry.type === 'Polygon' ? geometry.coordinates : geometry.coordinates.flat())
// "0.5" → ".5", "-0.5" → "-.5"
const formatNumber = (tenths: number): string => String(tenths / PRECISION).replace(/^(-?)0\./, '$1.')
// A minus sign already separates two numbers, so a space is only needed in
// front of a positive one.
const joinNumbers = (numbers: number[]): string => {
let out = ''
for (const number of numbers) {
const text = formatNumber(number)
out += out && !text.startsWith('-') ? ` ${text}` : text
}
return out
}
/**
* One ring as path data: an absolute move, then relative lines. The deltas are
* taken between already rounded points, so rounding does not add up.
*/
const ringPath = (points: Position[]): string => {
const rounded: Position[] = []
for (const [x, y] of points) {
const point: Position = [Math.round(x * PRECISION), Math.round(y * PRECISION)]
const last = rounded.at(-1)
if (!last || last[0] !== point[0] || last[1] !== point[1]) {
rounded.push(point)
}
}
// GeoJSON repeats the first point at the end; `z` closes the ring instead.
const first = rounded[0]
const last = rounded.at(-1)
if (rounded.length > 1 && first && last && first[0] === last[0] && first[1] === last[1]) {
rounded.pop()
}
if (rounded.length < 3) {
return ''
}
const deltas: number[] = []
for (let i = 1; i < rounded.length; i++) {
deltas.push(rounded[i][0] - rounded[i - 1][0], rounded[i][1] - rounded[i - 1][1])
}
return `M${joinNumbers(rounded[0])}l${joinNumbers(deltas)}z`
}
async function load(source: string): Promise<Feature[]> {
const url = `${SOURCE}/${source}.geojson`
const response = await fetch(url)
if (!response.ok) {
throw new Error(`Could not load ${url}: ${response.status}`)
}
const { features } = (await response.json()) as { features: Feature[] }
return features
}
// Where the long name of Natural Earth is the formal one, not the common one
const NAME_OVERRIDES: Record<string, string> = {
CV: 'Cabo Verde',
}
const regionName = (properties: Feature['properties']): string => NAME_OVERRIDES[regionCode(properties) ?? ''] ?? String(properties.NAME_LONG ?? properties.NAME)
async function generate(config: MapConfig): Promise<void> {
const features = await load(config.source)
const regions: { code: string; name: string; rings: Ring[] }[] = []
for (const feature of features) {
const code = regionCode(feature.properties)
if (!code) {
console.warn(` skipped "${feature.properties.NAME}": no region code`)
continue
}
if (config.exclude.includes(code)) {
continue
}
regions.push({
code,
name: regionName(feature.properties),
rings: ringsOf(feature.geometry).map((ring) => ring.map(miller)),
})
}
const duplicate = regions.find((region, index) => regions.findIndex((other) => other.code === region.code) !== index)
if (duplicate) {
throw new Error(`Region code "${duplicate.code}" is used twice`)
}
// Fit the projected shapes into the viewBox. The y axis points down in SVG.
let [minX, minY, maxX, maxY] = [Infinity, Infinity, -Infinity, -Infinity]
for (const [x, y] of regions.flatMap((region) => region.rings.flat())) {
minX = Math.min(minX, x)
maxX = Math.max(maxX, x)
minY = Math.min(minY, y)
maxY = Math.max(maxY, y)
}
const scale = config.width / (maxX - minX)
const translate: Position = [-minX * scale, maxY * scale]
const height = Math.ceil((maxY - minY) * scale)
const round = (value: number): number => Math.round(value * 1000) / 1000
// A point sits where Natural Earth puts the label of the country.
const points: { code: string; name: string; position: Position }[] = []
if (config.points) {
const { source, types, include } = config.points
for (const { properties } of await load(source)) {
const code = regionCode(properties)
if (!code || config.exclude.includes(code) || regions.some((region) => region.code === code)) {
continue
}
if (!types.includes(String(properties.TYPE)) && !include.includes(code)) {
continue
}
const [x, y] = miller([Number(properties.LABEL_X), Number(properties.LABEL_Y)])
const position: Position = [x * scale + translate[0], translate[1] - y * scale]
if (!(position[0] >= 0 && position[0] <= config.width && position[1] >= 0 && position[1] <= height)) {
throw new Error(`Point "${code}" is outside of the map`)
}
points.push({ code, name: regionName(properties), position })
}
}
regions.sort((a, b) => a.code.localeCompare(b.code))
points.sort((a, b) => a.code.localeCompare(b.code))
const data = {
width: config.width,
height,
projection: { type: 'miller', scale: round(scale), translate: translate.map(round) },
regions: Object.fromEntries([
...regions.map((region) => {
const path = region.rings.map((ring) => ringPath(ring.map(([x, y]): Position => [x * scale + translate[0], translate[1] - y * scale]))).join('')
if (!path) {
throw new Error(`Region "${region.code}" has no shape left after rounding`)
}
return [region.code, { name: region.name, path }]
}),
// A line of no length: the plugin draws it as a dot
...points.map((point) => [point.code, { name: point.name, path: `M${joinNumbers(point.position.map((value) => Math.round(value * PRECISION)))}h0`, point: true }]),
]),
}
const source = `// Generated by \`pnpm run generate:maps\` from Natural Earth (public domain,
// https://www.naturalearthdata.com). Do not edit by hand.
import type { VectorMapData } from '../src/vector-map'
export const ${config.name}: VectorMapData = ${JSON.stringify(data)}
`
const file = join(outDir, `${config.name}.ts`)
const options = await prettier.resolveConfig(file)
const formatted = await prettier.format(source, { ...options, filepath: file })
writeFileSync(file, formatted)
console.log(`✓ ${config.name}: ${regions.length} regions, ${points.length} points, ${config.width}x${height}, ${(formatted.length / 1024).toFixed(1)} kB`)
}
async function main(): Promise<void> {
for (const config of maps) {
await generate(config)
}
}
main().catch((error: unknown) => {
console.error(error)
process.exit(1)
})
+14 -5
View File
@@ -30,7 +30,16 @@ const dataFile = join(repoRoot, 'shared/data/sri.json')
// The files the docs hand out as CDN tags. The plugin bundles in `dist/libs/` are not here: they
// are third-party packages the docs only link to, and each one has its own version.
const files = ['dist/css/tabler.min.css', 'dist/css/tabler.rtl.min.css', 'dist/js/tabler.min.js', 'dist/js/tabler-theme.min.js', ...site.cssPlugins.flatMap((plugin) => [`dist/css/tabler-${plugin}.min.css`, `dist/css/tabler-${plugin}.rtl.min.css`])]
const files = ['dist/css/tabler.min.css', 'dist/css/tabler.rtl.min.css', 'dist/js/tabler.min.js', 'dist/js/tabler-theme.min.js', 'dist/js/tabler-map.min.js', ...site.cssPlugins.flatMap((plugin) => [`dist/css/tabler-${plugin}.min.css`, `dist/css/tabler-${plugin}.rtl.min.css`])]
// Files that a release added. An older version does not have them on the CDN, so they are left
// out until that release is the current one; the docs render their tags without `integrity`.
const addedIn: Record<string, string> = { 'dist/js/tabler-map.min.js': '1.7.0' }
const isBefore = (version: string, other: string): boolean => version.localeCompare(other, undefined, { numeric: true }) < 0
/** The files the current version of the package has. */
const publishedFiles = (): string[] => files.filter((file) => !(file in addedIn) || !isBefore(site.version, addedIn[file] ?? ''))
/** One GET, retried once: a single dropped connection should not fail a CI job. */
async function get(url: string): Promise<Response> {
@@ -70,7 +79,7 @@ async function hashFile(file: string): Promise<string> {
}
async function collectHashes(): Promise<SriData> {
const hashes = await Promise.all(files.map(async (file) => [file, await hashFile(file)] as const))
const hashes = await Promise.all(publishedFiles().map(async (file) => [file, await hashFile(file)] as const))
return { version: site.version, algorithm, files: Object.fromEntries(hashes) }
}
@@ -104,7 +113,7 @@ async function check(): Promise<void> {
const current = await collectHashes()
const problems: string[] = []
for (const file of files) {
for (const file of publishedFiles()) {
if (committed.files[file] !== current.files[file]) {
problems.push(`${file}: ${committed.files[file] ?? 'missing'} committed, ${current.files[file]} on the CDN`)
}
@@ -116,7 +125,7 @@ async function check(): Promise<void> {
return
}
console.log(`check:sri: ${files.length} hashes match @tabler/core v${current.version}`)
console.log(`check:sri: ${publishedFiles().length} hashes match @tabler/core v${current.version}`)
}
/**
@@ -155,7 +164,7 @@ async function generate(wait: boolean): Promise<void> {
writeFileSync(dataFile, `${JSON.stringify(data, null, 2)}\n`)
console.log(`generate:sri: wrote ${files.length} ${algorithm} hashes for @tabler/core v${data.version}`)
console.log(`generate:sri: wrote ${publishedFiles().length} ${algorithm} hashes for @tabler/core v${data.version}`)
}
// Wrapped in main() because the root package is CJS (no top-level await).
+4 -1
View File
@@ -98,4 +98,7 @@ const main = async () => {
}
}
main()
main().catch((error) => {
console.error(error)
process.exit(1)
})
+5 -2
View File
@@ -61,7 +61,7 @@ const main = async () => {
try {
pages.set(name, await fetchPage(url))
} catch (error) {
failures.push(`${url} — ${error instanceof Error ? error.message : error}`)
failures.push(`${url} — ${error instanceof Error ? error.message : String(error)}`)
}
}
}),
@@ -130,4 +130,7 @@ const main = async () => {
console.log(`✓ All ${pages.size} pages are byte-identical to the baseline.`)
}
main()
main().catch((error) => {
console.error(error)
process.exit(1)
})
+147
View File
@@ -0,0 +1,147 @@
#!/usr/bin/env node
// Imports the flags from the tabler/tabler-flags repo: the source SVGs (plain
// variant, minified with svgo), the $flag-countries list and the demo data.
//
// A flag is keyed by its ISO code in lower case (`pl`, `sh-ac`) and, when it
// has none, by its slug (`african-union`). Aliases in flags.json (Svalbard
// flies the Norwegian flag) get a copy of the artwork under their own code.
//
// Run: pnpm run import:flags
// Then: pnpm run generate:tokens — refreshes FlagCountry in shared/lib/tokens.ts
import { execFileSync } from 'node:child_process'
import { copyFileSync, existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
import { tmpdir } from 'node:os'
import { join, dirname, relative } from 'node:path'
import { fileURLToPath } from 'node:url'
import { optimizeSvgDir } from './optimize-svg.js'
const __dirname = dirname(fileURLToPath(import.meta.url))
const repoRoot = join(__dirname, '..')
const imgDir = join(repoRoot, 'core', 'img', 'flags')
const scssFile = join(repoRoot, 'core', 'scss', '_variables.scss')
const deprecatedScssFile = join(repoRoot, 'core', 'scss', '_variables-deprecated.scss')
const dataFile = join(repoRoot, 'shared', 'data', 'flags.json')
type FlagMeta = { name: string; category: string; iso?: string; alias?: string }
type Flag = { code: string; slug: string; name: string; category: string; iso: string | null }
let cloneDir: string | undefined
// In a git worktree the main checkout lives elsewhere, so also look next to it.
function mainCheckoutRoot(): string | undefined {
try {
const gitDir = execFileSync('git', ['rev-parse', '--path-format=absolute', '--git-common-dir'], { cwd: repoRoot, encoding: 'utf8' }).trim()
return dirname(gitDir)
} catch {
return undefined
}
}
function resolveSourceDir(): string {
const mainRoot = mainCheckoutRoot()
const candidates = [process.env.TABLER_FLAGS_DIR, join(repoRoot, '..', 'tabler-flags'), mainRoot && join(mainRoot, '..', 'tabler-flags')].filter((dir): dir is string => Boolean(dir))
for (const dir of candidates) {
if (existsSync(join(dir, 'src')) && existsSync(join(dir, 'flags.json'))) return dir
}
cloneDir = mkdtempSync(join(tmpdir(), 'tabler-flags-'))
console.log('No local checkout found, cloning tabler/tabler-flags…')
execFileSync('git', ['clone', '--depth', '1', 'https://github.com/tabler/tabler-flags.git', cloneDir], { stdio: 'inherit' })
return cloneDir
}
const svgNames = (dir: string) =>
readdirSync(dir)
.filter((file) => file.endsWith('.svg'))
.sort()
.map((file) => file.slice(0, -'.svg'.length))
// Reads the `$name: (` … `);` map or list in a Sass file and returns its entries.
function readSassEntries(scss: string, name: string, file: string): string[] {
const pattern = new RegExp(`\\$${name}: \\(\\n([\\s\\S]*?)\\n\\)( !default)?;`)
const match = scss.match(pattern)
if (!match) throw new Error(`import-flags: $${name} not found in ${file}`)
return match[1]
.split('\n')
.map((line) => line.trim().replace(/,$/, ''))
.filter(Boolean)
}
function replaceSassEntries(scss: string, name: string, entries: string[], file: string): string {
const pattern = new RegExp(`(\\$${name}: \\(\\n)[\\s\\S]*?(\\n\\)(?: !default)?;)`)
if (!pattern.test(scss)) throw new Error(`import-flags: $${name} not found in ${file}`)
return scss.replace(pattern, `$1${entries.map((entry) => ` ${entry}`).join(',\n')}$2`)
}
try {
const sourceDir = resolveSourceDir()
const srcDir = join(sourceDir, 'src')
const metaFile = join(sourceDir, 'flags.json')
const meta = JSON.parse(readFileSync(metaFile, 'utf8')) as Record<string, FlagMeta>
const flags: Flag[] = []
const codes = new Map<string, string>()
for (const [slug, { name, category, iso, alias }] of Object.entries(meta)) {
const source = alias ?? slug
if (!existsSync(join(srcDir, `${source}.svg`))) {
console.warn(`import-flags: '${slug}' has no SVG in ${relative(repoRoot, srcDir)} — skipped`)
continue
}
const code = (iso ?? slug).toLowerCase()
const taken = codes.get(code)
if (taken) throw new Error(`import-flags: code '${code}' is used by both '${taken}' and '${slug}'`)
codes.set(code, slug)
flags.push({ code, slug, name, category, iso: iso ?? null })
}
flags.sort((a, b) => a.code.localeCompare(b.code))
const stray = svgNames(srcDir).filter((slug) => !meta[slug])
if (stray.length) console.warn(`import-flags: SVGs not in flags.json, ignored: ${stray.join(', ')}`)
// Old codes from before the tabler-flags import. They keep their class and
// their file as copies of the flag that replaced them.
const deprecatedScss = readFileSync(deprecatedScssFile, 'utf8')
const aliases = readSassEntries(deprecatedScss, 'flag-country-aliases', deprecatedScssFile).map((entry) => {
const match = entry.match(/^'([^']+)': '([^']+)'$/)
if (!match) throw new Error(`import-flags: cannot parse $flag-country-aliases entry: ${entry}`)
return { from: match[1], to: match[2] }
})
for (const { from, to } of aliases) {
if (!codes.has(to)) throw new Error(`import-flags: alias '${from}' points to unknown flag '${to}'`)
if (codes.has(from)) throw new Error(`import-flags: alias '${from}' is also a flag in flags.json — drop the alias`)
}
const previous = existsSync(imgDir) ? new Set(svgNames(imgDir)) : new Set<string>()
rmSync(imgDir, { recursive: true, force: true })
mkdirSync(imgDir, { recursive: true })
for (const { code, slug } of flags) {
copyFileSync(join(srcDir, `${meta[slug].alias ?? slug}.svg`), join(imgDir, `${code}.svg`))
}
for (const { from, to } of aliases) {
copyFileSync(join(imgDir, `${to}.svg`), join(imgDir, `${from}.svg`))
}
optimizeSvgDir(imgDir)
const scss = readFileSync(scssFile, 'utf8')
writeFileSync(
scssFile,
replaceSassEntries(
scss,
'flag-countries',
flags.map(({ code }) => `'${code}'`),
scssFile,
),
)
const data = [...flags].sort((a, b) => a.name.localeCompare(b.name)).map(({ name, code, category }) => ({ name, flag: code, category }))
writeFileSync(dataFile, `${JSON.stringify(data, null, 2)}\n`)
const current = new Set(flags.map(({ code }) => code))
const added = flags.filter(({ code }) => !previous.has(code)).map(({ code }) => code)
const removed = [...previous].filter((code) => !current.has(code) && !aliases.some(({ from }) => from === code))
console.log(`Imported ${flags.length} flags from ${relative(repoRoot, sourceDir)} (${added.length} added, ${removed.length} removed, ${aliases.length} deprecated aliases kept)`)
if (added.length) console.log(` added: ${added.join(', ')}`)
if (removed.length) console.log(` removed: ${removed.join(', ')}`)
console.log('Now run `pnpm run generate:tokens` to refresh shared/lib/tokens.ts')
} finally {
if (cloneDir) rmSync(cloneDir, { recursive: true, force: true })
}
+12 -1
View File
@@ -18,8 +18,19 @@ const infoFile = join(repoRoot, 'shared', 'data', 'illustrations-info.json')
let cloneDir: string | undefined
// In a git worktree the main checkout lives elsewhere, so also look next to it.
function mainCheckoutRoot(): string | undefined {
try {
const gitDir = execFileSync('git', ['rev-parse', '--path-format=absolute', '--git-common-dir'], { cwd: repoRoot, encoding: 'utf8' }).trim()
return dirname(gitDir)
} catch {
return undefined
}
}
function resolveSourceDir(): string {
const candidates = [process.env.TABLER_ILLUSTRATIONS_DIR, join(repoRoot, '..', 'tabler-illustrations')].filter((dir): dir is string => Boolean(dir))
const mainRoot = mainCheckoutRoot()
const candidates = [process.env.TABLER_ILLUSTRATIONS_DIR, join(repoRoot, '..', 'tabler-illustrations'), mainRoot && join(mainRoot, '..', 'tabler-illustrations')].filter((dir): dir is string => Boolean(dir))
for (const dir of candidates) {
if (existsSync(join(dir, 'dist', 'png', 'light'))) return dir
}
+12 -1
View File
@@ -19,8 +19,19 @@ const dataFile = join(repoRoot, 'shared', 'data', 'payments.json')
let cloneDir: string | undefined
// In a git worktree the main checkout lives elsewhere, so also look next to it.
function mainCheckoutRoot(): string | undefined {
try {
const gitDir = execFileSync('git', ['rev-parse', '--path-format=absolute', '--git-common-dir'], { cwd: repoRoot, encoding: 'utf8' }).trim()
return dirname(gitDir)
} catch {
return undefined
}
}
function resolveSourceDir(): string {
const candidates = [process.env.TABLER_PAYMENTS_DIR, join(repoRoot, '..', 'tabler-payments')].filter((dir): dir is string => Boolean(dir))
const mainRoot = mainCheckoutRoot()
const candidates = [process.env.TABLER_PAYMENTS_DIR, join(repoRoot, '..', 'tabler-payments'), mainRoot && join(mainRoot, '..', 'tabler-payments')].filter((dir): dir is string => Boolean(dir))
for (const dir of candidates) {
if (existsSync(join(dir, 'src', 'light'))) return dir
}
+1 -2
View File
@@ -3,8 +3,6 @@
callout-note
clipboard-feedback
clipboard-label
datagrid-content
datagrid-item
datatable
docs-classnames
docs-page-lead
@@ -24,6 +22,7 @@ js-select-illustration
js-select-skin-color
line
list
nav-overflow-keep
settings
slide
sort-category
+4 -4
View File
@@ -113,7 +113,7 @@ function lineBalance(line: string): number {
let depth = 0
for (const m of line.matchAll(/<(\/)?([a-zA-Z][\w.-]*)((?:"[^"]*"|'[^']*'|[^<>"'])*?)(\/)?>/g)) {
if (m[1]) depth--
else if (!m[4] && !voidTags.has(m[2]!.toLowerCase())) depth++
else if (!m[4] && !voidTags.has(m[2].toLowerCase())) depth++
}
return depth
}
@@ -121,7 +121,7 @@ function lineBalance(line: string): number {
const hasText = (line: string): boolean => line.replace(/<[^<>]*>/g, '').trim().length > 0
/** The tags of a fragment in order, for comparing markup before and after formatting. */
const tagSequence = (html: string): string => [...html.matchAll(/<(\/?)([a-zA-Z][\w.-]*)/g)].map((m) => `${m[1]}${m[2]!.toLowerCase()}`).join(',')
const tagSequence = (html: string): string => [...html.matchAll(/<(\/?)([a-zA-Z][\w.-]*)/g)].map((m) => `${m[1]}${m[2].toLowerCase()}`).join(',')
/**
* Merge raw-text lines back into their markup (see formatExamples). MDX parses
@@ -145,8 +145,8 @@ function glueTextLines(formatted: string): string {
else out.push(line)
// A text line can also land after a closing tag whose opener sits on an
// earlier line (label after a multi-line svg) — pull those lines up too.
while (out.length > 1 && hasText(out[out.length - 1]!) && lineBalance(out[out.length - 1]!) < 0) {
const merged = `${out[out.length - 2]} ${out[out.length - 1]!.trim()}`
while (out.length > 1 && hasText(out[out.length - 1]) && lineBalance(out[out.length - 1]) < 0) {
const merged = `${out[out.length - 2]} ${out[out.length - 1].trim()}`
out.splice(out.length - 2, 2, merged)
}
}
+17 -41
View File
@@ -4,57 +4,35 @@
//
// 1. refreshes shared/data/sri.json for that version (`generate:sri --wait`),
// 2. commits it and pushes `dev`,
// 3. merges `dev` into `main` and pushes `main`.
// 3. merges `dev` into `main` and pushes `main`,
// 4. merges `dev` into `next`, when that branch exists, so the next minor carries the fix.
//
// The merge happens in a temporary worktree, so the current checkout (and a dev server running
// from it) never switches branches.
// The merges happen in a temporary worktree, so the current checkout (and a dev server running
// from it) never switches branches. A merge conflict stops the script before that push; the
// error says how to finish the merge by hand.
//
// Run: pnpm run release:main (does all of the above)
// pnpm run release:main --dry-run (refreshes and commits locally, pushes nothing)
import { execFileSync } from 'node:child_process'
import { mkdtempSync, readFileSync, rmSync } from 'node:fs'
import { tmpdir } from 'node:os'
import { join, dirname } from 'node:path'
import { fileURLToPath } from 'node:url'
import { commitSriHashes, coreVersion, fetchBranchIfExists, git, mergeAndPush, requireBranch, run } from './release-merge'
const __dirname = dirname(fileURLToPath(import.meta.url))
const repoRoot = join(__dirname, '..')
const sriFile = 'shared/data/sri.json'
const script = 'release:main'
const dryRun = process.argv.includes('--dry-run')
const git = (args: string[], cwd = repoRoot): string => execFileSync('git', args, { cwd, encoding: 'utf8' }).trim()
const run = (command: string, args: string[]): void => {
execFileSync(command, args, { cwd: repoRoot, stdio: 'inherit' })
}
const step = (message: string): void => {
console.log(`\nrelease:main: ${message}`)
console.log(`\n${script}: ${message}`)
}
const { version } = JSON.parse(readFileSync(join(repoRoot, 'core', 'package.json'), 'utf8')) as { version: string }
const main = (): void => {
if (git(['branch', '--show-current']) !== 'dev') {
throw new Error('release:main: run this on the `dev` branch')
}
if (git(['status', '--porcelain', '--untracked-files=no']) !== '') {
throw new Error('release:main: the working tree has uncommitted changes - commit or stash them first')
}
requireBranch(script, 'dev')
const version = coreVersion()
step('updating dev from origin')
git(['fetch', 'origin', 'dev', 'main'])
git(['merge', '--ff-only', 'origin/dev'])
step(`refreshing the SRI hashes for @tabler/core v${version}`)
run(join(repoRoot, 'node_modules', '.bin', 'tsx'), [join('.build', 'generate-sri.ts'), '--wait'])
if (git(['status', '--porcelain', '--', sriFile]) === '') {
console.log(`release:main: ${sriFile} is already up to date`)
} else {
git(['commit', '-m', `Update SRI hashes for v${version}`, '--', sriFile])
console.log(`release:main: committed ${sriFile}`)
}
commitSriHashes(script, version)
if (dryRun) {
step('--dry-run: stopping before any push')
@@ -65,15 +43,13 @@ const main = (): void => {
run('git', ['push', 'origin', 'dev'])
step('merging dev into main')
const worktree = mkdtempSync(join(tmpdir(), 'tabler-main-'))
mergeAndPush(script, 'dev', 'main', `Merge dev into main for v${version}`)
try {
git(['worktree', 'add', '--detach', worktree, 'origin/main'])
git(['merge', '--no-edit', '-m', `Merge dev into main for v${version}`, 'dev'], worktree)
execFileSync('git', ['push', 'origin', 'HEAD:main'], { cwd: worktree, stdio: 'inherit' })
} finally {
git(['worktree', 'remove', '--force', worktree])
rmSync(worktree, { recursive: true, force: true })
if (fetchBranchIfExists('next')) {
step('merging dev into next')
mergeAndPush(script, 'dev', 'next', `Merge dev into next after v${version}`)
} else {
step('no next branch - skipping the merge into next')
}
step(`done - docs.tabler.io deploys v${version} from main`)
+90
View File
@@ -0,0 +1,90 @@
// Steps of `release:main`: refresh the SRI hashes for the version in core/package.json, and
// merge one branch into another through a temporary worktree, so the current checkout (and a
// dev server running from it) never switches branches.
import { execFileSync } from 'node:child_process'
import { mkdtempSync, readFileSync, rmSync } from 'node:fs'
import { tmpdir } from 'node:os'
import { join, dirname } from 'node:path'
import { fileURLToPath } from 'node:url'
const __dirname = dirname(fileURLToPath(import.meta.url))
export const repoRoot = join(__dirname, '..')
const sriFile = 'shared/data/sri.json'
export const git = (args: string[], cwd = repoRoot): string => execFileSync('git', args, { cwd, encoding: 'utf8' }).trim()
export const run = (command: string, args: string[], cwd = repoRoot): void => {
execFileSync(command, args, { cwd, stdio: 'inherit' })
}
export const coreVersion = (): string => {
const { version } = JSON.parse(readFileSync(join(repoRoot, 'core', 'package.json'), 'utf8')) as { version: string }
return version
}
/** Fails unless the checkout is on `branch` and clean. */
export const requireBranch = (script: string, branch: string): string => {
const current = git(['branch', '--show-current'])
if (current !== branch) {
throw new Error(`${script}: run this on the \`${branch}\` branch`)
}
if (git(['status', '--porcelain', '--untracked-files=no']) !== '') {
throw new Error(`${script}: the working tree has uncommitted changes - commit or stash them first`)
}
return current
}
/** Whether `origin` has `branch`; fetches it when it does, so `origin/<branch>` is current. */
export const fetchBranchIfExists = (branch: string): boolean => {
if (git(['ls-remote', '--heads', 'origin', branch]) === '') return false
git(['fetch', 'origin', branch])
return true
}
/** Runs `generate:sri --wait` and commits shared/data/sri.json when it changed. */
export const commitSriHashes = (script: string, version: string): void => {
run(join(repoRoot, 'node_modules', '.bin', 'tsx'), [join('.build', 'generate-sri.ts'), '--wait'])
if (git(['status', '--porcelain', '--', sriFile]) === '') {
console.log(`${script}: ${sriFile} is already up to date`)
} else {
git(['commit', '-m', `Update SRI hashes for v${version}`, '--', sriFile])
console.log(`${script}: committed ${sriFile}`)
}
}
// Files two release lines always change on the same lines: the version fields and the top of
// the changelogs. On a conflict there the target branch is right (its version is newer, its
// changelog gets the entry from the GitHub release), so the merge keeps the target's side.
const versionFiles = /(^|\/)(package\.json|CHANGELOG\.md)$/
/**
* Merges the local branch `source` into `origin/<target>` in a temporary worktree and pushes
* the result to `target`. Conflicts in version files are resolved for the target; any other
* conflict aborts the merge and throws before anything is pushed.
*/
export const mergeAndPush = (script: string, source: string, target: string, message: string): void => {
const worktree = mkdtempSync(join(tmpdir(), `tabler-${target.replace(/\//g, '-')}-`))
try {
git(['worktree', 'add', '--detach', worktree, `origin/${target}`])
try {
git(['merge', '--no-edit', '-m', message, source], worktree)
} catch {
const conflicts = git(['diff', '--name-only', '--diff-filter=U'], worktree).split('\n').filter(Boolean)
const other = conflicts.filter((file) => !versionFiles.test(file))
if (other.length > 0) {
git(['merge', '--abort'], worktree)
throw new Error(`${script}: merging ${source} into ${target} has conflicts in ${other.join(', ')} - merge \`origin/${source}\` into \`${target}\` by hand, keep the version and the changelog of \`${target}\`, and push it`)
}
console.log(`${script}: keeping the ${target} side of ${conflicts.join(', ')}`)
git(['checkout', '--ours', '--', ...conflicts], worktree)
git(['add', '--', ...conflicts], worktree)
git(['commit', '--no-edit', '-m', message], worktree)
}
run('git', ['push', 'origin', `HEAD:${target}`], worktree)
} finally {
git(['worktree', 'remove', '--force', worktree])
rmSync(worktree, { recursive: true, force: true })
}
}
+9 -4
View File
@@ -1,5 +1,4 @@
import path from 'node:path'
import { fileURLToPath } from 'node:url'
import { defineConfig, type UserConfig } from 'vite'
interface CreateViteConfigOptions {
@@ -10,20 +9,26 @@ interface CreateViteConfigOptions {
outDir: string
banner?: string
minify?: boolean | 'esbuild'
/** UMD only: add the exports to an existing global of the same name instead of replacing it */
extend?: boolean
}
/**
* Creates a Vite configuration for building libraries
*/
export function createViteConfig({ entry, name, fileName, formats, outDir, banner, minify = false }: CreateViteConfigOptions): UserConfig {
export function createViteConfig({ entry, name, fileName, formats, outDir, banner, minify = false, extend = false }: CreateViteConfigOptions): UserConfig {
// Vite 8 (Rolldown) always emits const bindings and no longer accepts the
// Rollup-only generatedCode.constBindings option
const rollupOutput: { banner?: string } = {}
const rollupOutput: { banner?: string; extend?: boolean } = {}
if (banner) {
rollupOutput.banner = banner
}
if (extend) {
rollupOutput.extend = true
}
const config: UserConfig = {
// Library builds: never copy <root>/public into outDir (see copy-assets.ts).
publicDir: false,
@@ -40,7 +45,7 @@ export function createViteConfig({ entry, name, fileName, formats, outDir, banne
rollupOptions: {
output: rollupOutput,
},
target: 'es2015',
target: 'es2022',
minify: minify,
},
define: {
-5
View File
@@ -1,5 +0,0 @@
---
"@tabler/docs": minor
---
Added the Icon design guide page to the Tabler Icons docs, with the SVG format, naming rules and icon requests.
-10
View File
@@ -1,10 +0,0 @@
{
"rules": {
"semi": ["error", "always"],
"quotes": ["error", "single"],
"no-var": ["error"]
},
"parserOptions": {
"ecmaVersion": 6
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 448 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

+164
View File
@@ -0,0 +1,164 @@
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-cover-dark.png">
<img alt="Tabler 1.7" src="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-cover.png">
</picture>
Tabler 1.7 is out. It brings maps: an interactive map drawn by MapLibre and a vector world map that needs no map library. There's also a nav that moves its overflow into a More menu, a number input with buttons, five new components for images and text, list group items with slots, CSS variables for every form control and a new set of 304 flags. Buttons and dark mode got a round of polish too. On top of that there are more than forty smaller changes across the framework, the demo pages and the docs.
## Maps
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-maps-dark.png">
<img alt="Maps" src="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-maps.png">
</picture>
An interactive map from plain HTML, for a store locator, a delivery tracker or a dashboard of live users. Add `data-bs-toggle="map"` to an element, set the center and the zoom with data attributes, and every child with `data-bs-lng` and `data-bs-lat` becomes a `.map-marker`: a circle, a dot or a pin, with an icon, a count or an avatar inside, and a popup on click. `data-bs-route` draws a path with progress, `data-bs-geojson` draws areas and `data-bs-globe` turns the map into a 3D globe. The map is rendered by MapLibre GL JS with free tiles from OpenFreeMap, so it needs no account and no access token, and it follows dark mode. The component ships as a small add-on, `tabler-map.js`, and replaces the Mapbox and Google Maps demos.
## Vector map
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-vector-map-dark.png">
<img alt="Vector map" src="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-vector-map.png">
</picture>
A world map drawn as inline SVG, for a number per country, a few places or routes between them. Add `data-bs-toggle="vector-map"` to a `.vector-map` element and pass the values in `data-bs-values`, keyed by ISO code. The country with the highest value gets the full color and the others a lighter shade, and `data-bs-colors` gives a scale of several colors with a legend. Markers, dashed lines, tooltips, zoom and selection come from data attributes too. It needs no map library, no API key and no network request. The plugin ships as `tabler-vector-map.js` with the world data in `maps/world.js`.
## Nav overflow
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-nav-overflow-dark.png">
<img alt="Nav overflow" src="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-nav-overflow.png">
</picture>
Keeps a nav on one line. Items that don't fit move into a More dropdown at the end and come back when there's room again. Wrap the `.nav` in a `.nav-overflow` element with `data-bs-toggle="nav-overflow"`. It watches the wrapper, not the window, so it works in a card or a sidebar too. Mark an item with `.nav-overflow-keep` to keep it out of the menu. The demo navbar uses it now.
## Number input
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-number-input-dark.png">
<img alt="Number input" src="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-number-input.png">
</picture>
A number field between a decrease and an increase button, for a quantity in a cart or a number of seats. Add `data-bs-toggle="number-input"` to an input and the buttons are added for you. It keeps the value within `min` and `max`, rounds it to `step`, repeats while a button is held and works with the arrow keys. The input stays the only field the form sees, and every change fires `change.bs.numberInput`.
## Hover gallery
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-hover-gallery-dark.gif">
<img alt="Hover gallery" src="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-hover-gallery.gif">
</picture>
Several images in the space of one, for product cards, portfolios and listings. The image changes as the pointer moves across `.hover-gallery`, and `.hover-gallery-indicators` show which one is on. It needs no JavaScript. On touch screens it turns into a strip you swipe.
## Image label
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-image-label-dark.png">
<img alt="Image label" src="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-image-label.png">
</picture>
A short text or an icon pinned to a corner of an image, such as "New", "AI" or a video length. Put `.img-label` inside an `.img-labeled` wrapper, and move it with `.img-label-top-start`, `.img-label-top-end` or `.img-label-bottom-start`. The corners follow the text direction, so they swap in RTL.
## Mockup browser
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-mockup-browser-dark.png">
<img alt="Mockup browser" src="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-mockup-browser.png">
</picture>
A frame that looks like a browser window, with the window dots and an address bar, for a page preview or a screenshot. `.mockup-browser` holds a `.mockup-browser-toolbar` and a `.mockup-browser-body`, and an image in the body fills the frame. The address bar is optional, and there's a small size.
## Icon list
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-icon-list-dark.png">
<img alt="Icon list" src="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-icon-list.png">
</picture>
A list with icons instead of bullets, for the features of a plan or the steps of a setup. Add `.list-icon` to the list and start each entry with an icon. The first icon becomes the marker, centered on the first line. Color all markers with `--tblr-list-icon-color`, or one of them with a `text-{color}` class on the icon, and use `.list-icon-inline` for short entries in a row.
## List group slots
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-list-group-dark.png">
<img alt="List group slots" src="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-list-group.png">
</picture>
A list group item can now be a row of slots: `list-group-item-media`, `list-group-item-content` with a title and a description, `list-group-item-meta` and `list-group-item-actions`. Add `.list-group-selectable` and a checked input marks its row as active without JavaScript. Items can also be nested under a parent with `.list-group-nested`, and the list comes in `.list-group-sm` and `.list-group-lg` sizes.
## Text shimmer
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-text-shimmer-dark.png">
<img alt="Text shimmer" src="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-text-shimmer.png">
</picture>
A band of light that sweeps across a label such as "Thinking…" while an agent works or a task runs. Add `.text-shimmer` to the label. It's a mask, so the text keeps its own color, and `.text-shimmer-loader` adds a small spinner in front.
## Keyboard keys
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-kbd-dark.png">
<img alt="Keyboard keys" src="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-kbd.png">
</picture>
`<kbd>` looks like a compact key cap now, and the `.kbd` class gives the same look to any element. Wrap the keys of one shortcut in `.kbd-group` to keep them on one line with an even gap. Inside a button or a tooltip a key takes the color of the text around it, and the look is set with `--tblr-kbd-*` variables.
## Flags
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-flags-dark.png">
<img alt="Flags" src="https://raw.githubusercontent.com/tabler/tabler/dev/.github/release-notes/1.7.0-flags.png">
</picture>
The flags plugin now ships the flags from [Tabler Flags](https://github.com/tabler/tabler-flags): 304 country, territory and organisation flags, 50 of them new, such as `.flag-country-nato`. The class is still `.flag-country-{code}` with the ISO code, and flags without a code use a slug, such as `.flag-country-european-union`. The old codes keep working as aliases.
---
## Form CSS variables
Form controls read CSS variables now. `.form-control` and `.form-select` use `--tblr-control-*`, and checks, switches, input group add-ons, floating labels and range inputs have their own `--tblr-form-check-*`, `--tblr-form-switch-*`, `--tblr-input-group-addon-*`, `--tblr-form-floating-*` and `--tblr-range-*` sets. Icon add-ons, validation icons, the OTP input and Tom Select follow them too, so one override restyles a whole form. The new Forms → CSS variables page lists every token.
The small and large selects match the inputs: `.form-select-sm` is 32px tall, like `.form-control-sm`. Input icons sit in the middle of small and large fields, and Tom Select works with `.input-icon`. The switch has a filled gray track when off.
## Buttons and dark mode
Filled `.btn-*` buttons have a thin border, inner edges and a faint gradient, and outline buttons lose their shadow. The default `.btn` stays opaque on hover. `.btn-xl` is bigger, and `.btn-sm` has more side padding.
In dark mode, nav links, list group headers, toast headers, breadcrumbs, the footer, `.input-group-text` and striped tables have better contrast, and card, alert, dropdown and table borders are no longer too bright. `--tblr-bg-surface-tertiary` is translucent, so card headers, footers and table stripes show on dark cards. `.card-table` rounds only the cells in the card corners.
Four neutral fill tokens, `--tblr-fill-primary` to `--tblr-fill-quaternary`, give the translucent backgrounds of badges, avatars, code, progress and range tracks and the hover state. The `.bg-fill-*` utilities use them too.
## Datagrid, Datepicker and themes
`.datagrid-horizontal` puts each label beside its value, and `.datagrid-cols-{n}` shows several pairs in a row. The Datepicker has a `weekNumbers` option, `dateFormat` patterns such as `'DD.MM.YYYY'` or `'iso'`, and a `boundInput` option that writes ISO dates to a form field. It also no longer stays stuck closed after the calendar throws an error.
`tabler-themes.css` has a new `mist` gray palette for `data-bs-theme-base`, a cool gray with a blue-green tint.
## Layout and forms
`data-bs-navbar-position="combined"` shows the vertical and the horizontal navbar at once. The vertical navbar submenu no longer paints over the user dropdown in `.navbar-footer`. Disabled Tom Select fields have rounded corners, and small and large ones a rounded focus ring. `.nav-segmented` icons follow the link color on hover.
## Smaller JS and bundled libraries
`tabler.js` is built for ES2022 instead of ES2015, which takes about 1.5 kB off `tabler.min.js` after gzip. The code is checked with ESLint now. The Sass doc comments are no longer in `tabler.css`.
`dist/libs` has MapLibre GL JS 6, and `tabler-vendors.css` styles its popups, attribution and controls in light and dark. Dropzone, driver.js, fslightbox, FullCalendar, HugeRTE and Plyr are updated too.
## Demo and docs
The demo navbar moves the links that don't fit into a More menu. The maps page has marker, popup, route, area, cluster, bubble map and globe demos, and the new Map blocks page has seven blocks, among them a store locator, a delivery tracker and a server status map. The marketing hero has a new dashboard screenshot with a dark version. Tabler Icons are at 3.49 and Tabler Illustrations at 1.18 with 11 new illustrations.
The docs have pages for every new component, a Forms → CSS variables page and an Icon design guide in the Tabler Icons section. The datagrid page has more examples.
## Upgrading
Nothing in 1.7 requires a change to your markup, and every class, custom property, Sass variable and function from 1.6 is still there.
Pricing and Shape moved from `tabler-marketing.css` into the core `tabler.css`. A page that loads both files needs no change. A page that loaded only `tabler-marketing.css` for `.pricing` or `.shape` has to add `tabler.css`. If you import Sass partials one by one, `scss/marketing/pricing` and `scss/marketing/shape` are now `scss/ui/pricing` and `scss/ui/shape`.
Some things look a little different: buttons, the switch track, the small select height, a few dark mode surfaces and the flags, which are redrawn at a 5:4 ratio instead of 4:3. Check custom styles that sit close to them.
The map demos use MapLibre instead of Mapbox GL and Google Maps. This only touches the demo pages: `@tabler/core` never shipped those libraries.
Every change, with a before and after example, is in the [Upgrade to 1.7](https://docs.tabler.io/ui/getting-started/upgrade/1-7) guide.
+5 -3
View File
@@ -12,6 +12,7 @@ on:
push:
branches:
- dev
- next
permissions:
contents: read
@@ -31,9 +32,10 @@ jobs:
run: pnpm exec turbo build
# Nothing the last release shipped may disappear in a minor release. On the
# versions pull request it runs with --strict, but workflows there wait for
# a manual approval, so the Release workflow runs --strict too.
# versions pull request (`changeset-release/dev` or `changeset-release/next`)
# it runs with --strict, but workflows there wait for a manual approval, so
# the Release workflow runs --strict too.
- name: Check backward compatibility
env:
STRICT: ${{ github.head_ref == 'changeset-release/dev' && '--strict' || '' }}
STRICT: ${{ startsWith(github.head_ref, 'changeset-release/') && '--strict' || '' }}
run: pnpm run check:compat $STRICT
+4 -1
View File
@@ -13,6 +13,7 @@ on:
branches:
- main
- dev
- next
permissions:
contents: read
@@ -35,4 +36,6 @@ jobs:
run: pnpm run bundlewatch
env:
BUNDLEWATCH_GITHUB_TOKEN: "${{ secrets.BUNDLEWATCH_GITHUB_TOKEN }}"
CI_BRANCH_BASE: dev
# Compare a pull request with its base branch (`dev` or `next`);
# a push records the branch itself as the new baseline.
CI_BRANCH_BASE: ${{ github.base_ref || github.ref_name }}
@@ -26,9 +26,11 @@ jobs:
- name: Compress Images
# pinned to a commit: this job holds a write token
uses: calibreapp/image-actions@26d5b54006db4da7a1b29903f33404a6f77b58cf # main, 2026-09-02
uses: calibreapp/image-actions@ff27d81cd56064db7beb7fa56946c0c3b3d15fbf # main, 2026-09-02
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# docs images go through astro:assets, which makes the webp files at build
# time; lossy PNG compression here only degrades the source
ignorePaths: 'node_modules/**,docs/images/**'
# time; lossy PNG compression here only degrades the source.
# The README preview screenshots stay lossless: the palette quantization
# left visible shapes on the light cards (see #3186)
ignorePaths: 'node_modules/**,docs/images/**,shared/static/tabler-preview*.png'
+1
View File
@@ -13,6 +13,7 @@ on:
branches:
- dev
- main
- next
schedule:
- cron: '0 3 * * 1'
+1
View File
@@ -12,6 +12,7 @@ on:
push:
branches:
- dev
- next
permissions:
contents: read
+1
View File
@@ -13,6 +13,7 @@ on:
branches:
- dev
- main
- next
permissions:
contents: read
+1
View File
@@ -12,6 +12,7 @@ on:
push:
branches:
- dev
- next
permissions:
contents: read
+22 -6
View File
@@ -1,9 +1,14 @@
name: Release
# Two lines can release (see CONTRIBUTING.md, "Releases"):
# dev the next patch of the current minor; `release:main` then merges it into `main`
# next the next minor, in changesets prerelease mode: publishes `x.y.0-next.N` under
# the npm tag `next`, without a GitHub release
on:
push:
branches:
- dev
- next
permissions:
contents: read
@@ -56,6 +61,9 @@ jobs:
# changeset-release/dev via a short-lived changesets-ghcommit-temp/* branch,
# and every one of those branches triggered a Vercel build.
push-with-git-cli: true
# A `next` prerelease is only an npm tag; the GitHub release comes with the
# final version from `dev`.
create-github-releases: ${{ github.ref_name != 'next' }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -64,19 +72,26 @@ jobs:
# packages shows up several times. Replace that body with the same notes the
# GitHub release gets: the intro from `.github/release-notes/<version>.md`
# and the changes grouped as core / demo / docs, each listed once. The
# action rewrites the body on every push to dev, so this runs right after it.
# action rewrites the body on every push to the branch, so this runs right
# after it. The version branch is `changeset-release/<branch>`.
- name: Write the release notes into the version pull request
if: steps.changesets.outputs.pr-number != ''
continue-on-error: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_NUMBER: ${{ steps.changesets.outputs.pr-number }}
BRANCH: ${{ github.ref_name }}
run: |
git fetch --depth=1 origin changeset-release/dev
git checkout --force --detach origin/changeset-release/dev
git fetch --depth=1 origin "changeset-release/${BRANCH}"
git checkout --force --detach "origin/changeset-release/${BRANCH}"
version=$(node -p "require('./core/package.json').version")
if [ "${BRANCH}" = "next" ]; then
what="publishes \`@tabler/core@${version}\` to npm under the \`next\` tag"
else
what="publishes \`@tabler/core@${version}\` to npm and creates the GitHub release"
fi
{
echo "Merging this pull request publishes \`@tabler/core@${version}\` to npm and creates the GitHub release. It is regenerated on every push to \`dev\`."
echo "Merging this pull request ${what}. It is regenerated on every push to \`${BRANCH}\`."
echo
pnpm run --silent release-notes
} > "${RUNNER_TEMP}/pr-body.md"
@@ -84,8 +99,9 @@ jobs:
# `pnpm run build` above zipped preview/dist into packages-zip/; attach it to
# the GitHub release that changesets/action just created for @tabler/core.
# Not on `next`: a prerelease has no GitHub release.
- name: Attach the preview zip to the GitHub release
if: steps.changesets.outputs.published == 'true'
if: steps.changesets.outputs.published == 'true' && github.ref_name != 'next'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
@@ -97,7 +113,7 @@ jobs:
# the intro from `.github/release-notes/<version>.md` followed by the changes
# grouped per package.
- name: Write the release notes
if: steps.changesets.outputs.published == 'true'
if: steps.changesets.outputs.published == 'true' && github.ref_name != 'next'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
+1
View File
@@ -13,6 +13,7 @@ on:
branches:
- dev
- main
- next
permissions:
contents: read
+1
View File
@@ -13,6 +13,7 @@ on:
branches:
- main
- dev
- next
permissions:
contents: read
+23
View File
@@ -78,6 +78,29 @@ Two of these help with refactors:
4. **Write the PR in English**: a concise title in present tense (max ~72 chars, no trailing period) and a short description that explains why the change is needed.
5. **Keep the scope small**: one logical change per pull request makes reviews faster and releases safer.
## Releases
Only three long-lived branches exist: `main`, `dev` and `next`. There are no `release/*` branches; a fix always ships from `dev` as the next patch of the current minor.
| Branch | Holds | Releases |
| ------ | ----- | -------- |
| `dev` | the current minor: fixes, docs, chores | the next patch (`1.7.1`, `1.7.2`, ...) as `latest` on npm |
| `next` | the next minor: new components, classes, pages | prereleases (`1.8.0-next.0`, `-next.1`, ...) under the npm tag `next`, no GitHub release |
| `main` | the last release | nothing; it builds docs.tabler.io |
Every push to `dev` or `next` updates that branch's `chore: update versions` pull request; merging it publishes to npm. Open a pull request against `dev` for a fix and against `next` for a feature. A fix on `next` that users of the current version need goes to `dev` instead, and reaches `next` with the next sync.
**After a patch release** from `dev`: `pnpm run release:main` (on `dev`) refreshes the SRI hashes, merges `dev` into `main` and merges `dev` into `next`. Run it after every release from `dev`, so `next` never drifts.
**Releasing the next minor** (`next` becomes `1.8.0`):
1. On `next`: `pnpm exec changeset pre exit`, commit `.changeset/pre.json` and push. The changesets consumed by the prereleases are still there; the final changelog lists all of them once.
2. Merge `next` into `dev` (a pull request, or a merge pushed to `dev`). The `chore: update versions` pull request on `dev` now shows `1.8.0`; the `.github/release-notes/1.8.0.md` intro goes in before merging it.
3. Merge the version pull request, wait for npm, run `pnpm run release:main`.
4. Start the next line. `dev` now contains `next`, so it fast-forwards: `git checkout next && git merge --ff-only dev && pnpm exec changeset pre enter next && git commit -am "Enter prerelease mode for 1.9" && git push`. The first time, create the branch with `git checkout -b next dev` instead.
Never commit to `main` directly. Changes reach it only through `release:main`.
## Code style
- Use Bootstrap 5 conventions and Tabler's CSS custom properties pattern: `--component-property`. Write custom properties without a prefix — the build adds the public `--tblr-` prefix. Names owned by a third-party library you are theming must be listed in `cssVarIgnore` in `.build/css-var-prefix.ts` so they stay untouched.
+2 -2
View File
@@ -46,8 +46,8 @@ Tabler is a set of ready-made layouts, components and demo pages for admin panel
<p align="center">
<a href="https://preview.tabler.io" target="_blank">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/tabler/tabler/dev/shared/static/tabler-preview-dark.png">
<img src="https://raw.githubusercontent.com/tabler/tabler/dev/shared/static/tabler-preview.png" alt="Tabler preview">
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/tabler/tabler/dev/shared/static/tabler-preview-dark@2x.png">
<img src="https://raw.githubusercontent.com/tabler/tabler/dev/shared/static/tabler-preview@2x.png" alt="Tabler preview">
</picture>
</a>
</p>
+4
View File
@@ -104,6 +104,10 @@ const files: FileConfig[] = [
file: 'js/tabler-theme.min.js',
configPropertyName: 'js-theme',
},
{
file: 'js/tabler-map.min.js',
configPropertyName: 'js-map',
},
]
function generateSRI(): void {
+9 -1
View File
@@ -8,7 +8,14 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url))
const baseName = process.env.BASE_NAME || 'tabler'
const entryFile = baseName
const libraryName = baseName
// Some entries add to a global instead of creating their own, so they can be
// loaded next to the main bundle:
// - `tabler-map` and `tabler-vector-map` are add-ons, their UMD builds extend
// the `tabler` global;
// - `maps/*` are map files, each adds its map to the `tablerVectorMaps` global.
const isMap = baseName.startsWith('maps/')
const isAddon = baseName === 'tabler-map' || baseName === 'tabler-vector-map'
const libraryName = isMap ? 'tablerVectorMaps' : isAddon ? 'tabler' : baseName
const bannerText = getBanner()
@@ -26,4 +33,5 @@ export default createViteConfig({
outDir: path.resolve(__dirname, '../dist/js'),
banner: bannerText,
minify: false,
extend: isMap || isAddon,
})
+55
View File
@@ -1,5 +1,60 @@
# @tabler/core
## 1.7.0
### Minor Changes
- ace9a4f: Added `.datagrid-horizontal` and `.datagrid-cols-{n}` classes and more datagrid examples and docs.
- 964eb7c: Added `dateFormat` patterns such as `iso` or `DD.MM.YYYY` and a `boundInput` option for ISO form values to `Datepicker`.
- 725e45d: Added the `weekNumbers` option to `Datepicker` to show the week number in front of each row.
- 0647af1: Added the `--tblr-fill-*` tokens and `.bg-fill-*` utilities, used by badges, avatars, code, progress and range tracks and the hover background.
- 8f00eab: Added `--tblr-form-check-*` and `--tblr-form-switch-*` variables, with shared `--tblr-control-checked-bg` and disabled tokens on `:root`.
- 8f00eab: Added `--tblr-control-*` variables to `.form-control` and `.form-select`; sizes and the file button now follow them.
- 8f00eab: Updated icon addons, select groups, `.col-form-label`, validation icons, OTP and Tom Select to read the `--tblr-control-*` and `--tblr-btn-input-*` variables.
- 8f00eab: Updated `.form-select-sm`, `.form-select-lg` and small Tom Select to match `.form-control-*`, so small controls are now 32px tall.
- bb60211: Updated `.form-switch` with a filled gray off track, a white knob with an even gap and a new `$form-switch-bg` variable.
- f7c848a: Added the Hover gallery component with `.hover-gallery`, `.hover-gallery-item` and `.hover-gallery-indicators` classes.
- c493436: Added the `.list-icon` component for lists with icon markers, with `.list-icon-inline` for entries in a row.
- 681b6eb: Added the image label component: `.img-labeled` and `.img-label` pin a short text or an icon to a corner of an image.
- 68da446: Updated the flags plugin to Tabler Flags: 304 flags at a 5:4 ratio, 50 new like `.flag-country-nato`, old codes kept as aliases.
- 8f00eab: Added `--tblr-input-group-addon-*`, `--tblr-form-floating-*` and `--tblr-range-*` variables to input groups, floating labels and range inputs.
- 03e2775: Updated `<kbd>` to a compact key cap and added `.kbd-group` and `--tblr-kbd-*` variables for keyboard shortcuts.
- 69c1114: Added item slots, `.list-group-sm` and `.list-group-lg` sizes, selectable and nested items to the list group.
- a845ab0: Added `.map-marker` with dot, pin, pulse and color variants, `.map-popup-card`, `.map-tooltip` and MapLibre styles in `tabler-vendors.css`.
- a845ab0: Added the `MapView` component in `tabler-map.js` on MapLibre GL JS 6: `data-bs-toggle="map"` makes a themed map with markers, popups, routes and a globe.
- d6cfffb: Added the `.mockup-browser` component that frames a screenshot or any content in a browser window with an address bar.
- 6c46d55: Added `NavOverflow` component that moves nav items that do not fit into a More dropdown, with a `.nav-overflow` wrapper.
- 86388e4: Added `combined` as a `data-bs-navbar-position` value to show both navbars at once.
- 3f3aae9: Added the `NumberInput` component, a `.number-input` quantity input with buttons, bounds, hold-to-repeat and keyboard support.
- 12c045f: Updated `.pricing` to ship in the core `tabler.css` bundle instead of `tabler-marketing.css`.
- 28c24bf: Updated `.shape` to ship in the core `tabler.css` bundle instead of `tabler-marketing.css`.
- 744f9fe: Added the `.text-shimmer` class that sweeps a highlight across a label, with an optional `.text-shimmer-loader` spinner.
- 5cbc443: Added a `mist` gray palette for `data-bs-theme-base` and removed the hidden `pink` base from `tabler-themes.css`.
- 00746f2: Added `.input-icon` support for Tom Select: a leading icon no longer overlaps the selected value.
- 8ab6441: Added the `VectorMap` plugin: an SVG world map with values, color scales, a legend, markers, lines, selection, tooltips and zoom.
### Patch Changes
- d75c5d6: Updated `--tblr-bg-surface-tertiary` to a translucent color, so card headers, footers and table stripes show on dark cards.
- 9368b8e: Fixed the default `.btn` turning see-through on hover and active by mixing the tint over `--tblr-bg-surface`.
- b168be1: Updated filled `.btn-*` variants with a subtle border, inner edges and a faint gradient; outline buttons lose their shadow.
- b168be1: Updated `.btn-xl` with a `1.25rem` font, `1.75rem` icons and a larger radius; `.btn-sm` gets `0.75rem` side padding.
- e3739a1: Fixed `.card-table` rounding the outer cells of every row: only the cells in the card corners are rounded now.
- 6394af0: Added ESLint with `typescript-eslint` and fixed its findings in `Datepicker`, `Dropdown`, `Tooltip` and `Sparkline`.
- 3275bff: Fixed `$border-color-translucent-dark` overbrightening card, alert, dropdown and table borders in dark mode.
- d75c5d6: Fixed dark mode contrast of nav links, list group headers, toast headers, breadcrumbs, the footer, `.form-control-light` and `.form-help`.
- a1b46ae: Fixed `Datepicker` getting stuck closed after the calendar plugin throws in `show()` or `hide()`.
- d75c5d6: Fixed `.input-group-text` contrast in dark mode with the `--tblr-secondary-color` text color and a translucent background.
- dcacb65: Fixed `.table-striped` rows and `thead th` backgrounds that were invisible in dark mode on cards.
- 462835f: Fixed the square corners of disabled Tom Select fields and the square focus ring of small and large ones.
- 9d837ea: Fixed `.input-icon` icons off-center in small and large inputs and selects: the addon follows the control size.
- 252c914: Updated the `tabler.js` build target from ES2015 to ES2022, making `tabler.min.js` about 1.5 kB smaller (gzip).
- 9fb6930: Fixed the vertical navbar submenu painting over the `.navbar-footer` user dropdown.
- 252c914: Removed Sass doc comments from `tabler.css` and `tabler.rtl.css` by switching them to `//` comments.
- 530f11b: Fixed `.nav-segmented` icons staying gray on hover: they follow the link color like the text.
- 2726bc4: Updated the `tabler.min.js` minification to two terser compress passes.
- fbf2bdb: Updated bundled `dropzone` to v6.3.5, `driver.js` to v1.10.1, `fslightbox` to v3.8.0, `fullcalendar` to v6.1.22, `hugerte` to v1.0.14 and `plyr` to v3.8.5.
## 1.6.1
### Patch Changes
+2 -2
View File
@@ -21,8 +21,8 @@ Free and open source HTML dashboard UI kit built on Bootstrap 5.
<p align="center">
<a href="https://preview.tabler.io" target="_blank">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/tabler/tabler/dev/shared/static/tabler-preview-dark.png">
<img src="https://raw.githubusercontent.com/tabler/tabler/dev/shared/static/tabler-preview.png" alt="Tabler preview">
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/tabler/tabler/dev/shared/static/tabler-preview-dark@2x.png">
<img src="https://raw.githubusercontent.com/tabler/tabler/dev/shared/static/tabler-preview@2x.png" alt="Tabler preview">
</picture>
</a>
</p>
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#00993e" d="M0 0h30v24H0z"/><path fill="#fff" d="M30 3.43H0v3.43h30zm0 6.86H0v3.42h30zM0 17.14h30v3.43H0z"/><path fill="#c8312a" d="M15 0H0v10.29h15z"/><path fill="#fff" d="M6.2 5.68s-.15.06-.05 1.22c.08.96.42 1.27.42 1.27l.15.59h1.4s.03-.36.09-.48c.13-.28.66-.6.89-1.1.24-.3.12-.9.61-1.5.25-.29-.28-.16-.28-.16-.3.2-.44.42-.5.57-.06.3-.29.56-.3.34q.02 0-.34-1.12c-.02-.22-.13-.98-.15-1.56-.02-.38-.35-.4-.38-.02l-.04 1.52-.08-1.76c-.03-.5-.4-.42-.42 0L7.2 5.3l-.07-1.77c-.1-.34-.37-.14-.37.23l-.05 1.72-.07-1.34c0-.24-.29-.22-.32.12-.03.5-.1.9-.12 1.41m.87-3.22.43-1.32.43 1.32-1.12-.82h1.38zm3.33.52-1.12-.81h1.38l-1.12.81.43-1.31zm2.11 1.57-1.12-.82h1.39l-1.12.82.42-1.32zm1.23 2.2-1.12-.8H14l-1.12.8.43-1.31zM4.6 2.97l1.12-.81H4.34l1.12.81-.43-1.31zM2.49 4.54l1.12-.82H2.22l1.12.82-.42-1.32zm-1.23 2.2 1.12-.8H1l1.12.8-.43-1.31z"/></svg>

After

Width:  |  Height:  |  Size: 936 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><path fill="#ffd018" fill-rule="evenodd" d="M5 0h10v15H5z" clip-rule="evenodd"/><path fill="#2e42a5" fill-rule="evenodd" d="M0 0h5v15H0z" clip-rule="evenodd"/><path fill="#e31d1c" fill-rule="evenodd" d="M15 0h5v15h-5z" clip-rule="evenodd"/><path fill="#bf9937" fill-rule="evenodd" d="M10.187 12.14c.138-.04.257-.28.257-.28s.09.071.233.143.292-.142.292-.142.203 0 .292-.24c.09-.24-.178-.342-.178-.342s.312-.328.839-.328.936 0 1.28-.146.678-.396.803-.917c.124-.521-.271-.85-.271-.85s.088.029.27-.121-.111-.631-.27-.631-.177.089-.177.089-.098-.085-.232-.374c-.135-.29.134-.543.134-.543s.147.084.275-.055-.067-.352-.067-.352.618-.21.529-1c-.09-.79-.904-.745-.904-.745s.025-.131-.09-.206-.2.075-.2.075c-.09-.209.174-.494.385-.722.066-.07.126-.136.17-.192.182-.235.068-.527-.6-.845s-1.033.11-1.086.261.154.245.154.245a.73.73 0 0 1-.719.103c-.223-.103-.124-.414-.078-.5l.02-.033c.063-.106.194-.327.058-.542-.153-.242-.417-.242-.629-.105-.18.118-.438.18-.508.196a1.7 1.7 0 0 1-.51-.196c-.21-.137-.475-.137-.628.105-.136.215-.004.436.058.542l.02.034c.046.085.145.396-.078.499a.73.73 0 0 1-.719-.103s.208-.093.154-.245c-.053-.151-.418-.579-1.086-.26-.668.317-.782.609-.6.844.044.056.104.121.17.192.21.228.475.513.385.722 0 0-.085-.15-.2-.075s-.09.206-.09.206-.814-.045-.904.745c-.089.79.529 1 .529 1s-.195.213-.067.352c.128.14.275.055.275.055s.269.254.135.543c-.135.289-.233.374-.233.374s-.018-.09-.177-.09-.453.482-.27.632c.182.15.27.122.27.122s-.395.328-.27.849c.124.52.458.771.802.917s.754.146 1.28.146c.527 0 .839.328.839.328s-.267.102-.178.342.292.24.292.24.149.214.292.142.233-.142.233-.142.119.24.257.279v.005l.018-.001.019.001z" clip-rule="evenodd"/><path fill="#805440" d="m7.569 9.999.066-.16q1.131.486 2.577.486t2.508-.484l.07.157q-1.1.5-2.578.5t-2.643-.5z"/><path fill="#bf9937" fill-rule="evenodd" d="M7.799 4.52h4.713v4.394s-.001.388-.411.557-.892.11-.892.11-.462-.1-.705 0c-.15.06-.258.09-.32.104v.012l-.029-.005-.03.005v-.012a2 2 0 0 1-.318-.105c-.244-.099-.705 0-.705 0s-.482.061-.892-.109a.64.64 0 0 1-.411-.557z" clip-rule="evenodd"/><mask id="b" width="6" height="6" x="7" y="4" maskUnits="userSpaceOnUse"><path fill="#fff" fill-rule="evenodd" d="M7.799 4.52h4.713v4.394s-.001.388-.411.557-.892.11-.892.11-.462-.1-.705 0c-.15.06-.258.09-.32.104v.012l-.029-.005-.03.005v-.012a2 2 0 0 1-.318-.105c-.244-.099-.705 0-.705 0s-.482.061-.892-.109a.64.64 0 0 1-.411-.557z" clip-rule="evenodd"/></mask><g mask="url(#b)"><path fill="#d00f3a" d="M7.733 4.465h2.285v2.438H7.733z"/><path fill="#fedf00" fill-rule="evenodd" d="M10.272 4.465h2.37v2.438h-2.37zm0 2.709h2.285V9.7h-2.285z" clip-rule="evenodd"/><path fill="#fedf00" d="M7.733 7.174h2.285v2.528H7.733z"/><path fill="#d00f3a" fill-rule="evenodd" d="M11.965 8.312s.106-.108.106-.363c0-.254.09-.422-.106-.422h-.649c-.187 0-.09.113-.279 0-.188-.113-.34-.077-.34 0s.19.043.19.2c0 .156.072.02.072.302 0 .283.04.235.059.235.02 0 .02-.05.02-.125 0-.074-.01-.373.042-.281s.078.048.104.153c.025.104.095.206.047.253-.047.048-.143.088-.072.088.072 0 .176-.12.124-.323-.052-.202.065-.018.065-.018s.276.06.294-.023c.018-.084.043.08.118.08s-.072.17-.134.196c-.062.027 0 .048 0 .048s.058.047.096 0c.038-.048.175-.203.175-.283s.088-.032.088.04c0 .07-.082.324-.051.283l.03-.04zm0 .993s.106-.108.106-.362c0-.255.09-.423-.106-.423h-.649c-.187 0-.09.113-.279 0-.188-.113-.34-.077-.34 0s.19.043.19.2c0 .156.072.02.072.302 0 .283.04.235.059.235.02 0 .02-.05.02-.125 0-.074-.01-.373.042-.281s.078.048.104.153c.025.104.095.206.047.253-.047.048-.143.088-.072.088.072 0 .176-.12.124-.323-.052-.202.065-.018.065-.018s.276.061.294-.023.043.08.118.08-.072.17-.134.196c-.062.027 0 .048 0 .048s.058.047.096 0c.038-.048.175-.203.175-.283s.088-.031.088.04c0 .07-.082.324-.051.283l.03-.04z" clip-rule="evenodd"/><path fill="#fff" fill-rule="evenodd" d="M8.881 6.436c0 .103-.052.182-.172.303l-.048.048-.042.044c-.102.116-.28.016-.327-.096a3 3 0 0 0-.101-.183l-.003-.005-.035-.06-.031-.053-.04-.072c-.005-.007-.029.001-.07.054-.016.02.016.09.12.2l-.059.065c-.144-.14-.213-.23-.213-.294 0-.105.084-.161.242-.161.099 0 .151.07.23.245l.02.045a.8.8 0 0 0 .095.172c.036.046.058.044.095-.003s.071-.119.122-.249l.014-.035q.017-.04.013-.042-.003-.002-.026.01l-.02.011-.039.02-.358-.861.678-.824V6.43l-.043-.04-.002.045zm.049-.002-.004.003V6.43l.004.003zm.003-.003v.006l-.003-.003zm0-1.716.679.824-.359.862-.04-.021c-.027-.014-.041-.024-.045-.02-.004.003.007.024.027.076.051.13.085.202.122.249s.059.049.095.003a.8.8 0 0 0 .095-.172l.02-.045c.079-.175.132-.245.23-.245.158 0 .242.056.242.161 0 .063-.07.154-.213.294l-.058-.065c.103-.11.135-.18.12-.2-.042-.053-.066-.061-.07-.054l-.04.072-.032.053-.034.06-.004.005a3 3 0 0 0-.101.183c-.046.112-.225.212-.327.096l-.042-.044-.048-.048c-.12-.121-.172-.2-.172-.303q0-.027-.002-.044l-.043.039zm0 0L8.93 4.71l.003-.004zM8.93 4.71l-.00Line truncated
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#f9df4b" d="M10 0h10v24H10z"/><path fill="#06019a" d="M0 24V0h10v24z"/><path fill="#c42936" d="M20 24V0h10v24z"/><path fill="#c7b37f" d="M18.75 13.34c-.12-.35-.42-.29-.42-.17 0 0-.4-.29-.1-.82 0 0 .59.07.25-.38 0 0 .5-.29.52-.87s-.65-.96-.94-.72c0 0-.01-.24-.13-.24s-.18.15-.18.15.01-.38.26-.6.77-.8-.32-1.14c-1.08-.33-1.13.36-.97.5 0 0-.26.16-.57.14s-.08-.37-.01-.52c.06-.15.01-.68-.36-.67-.36.02-.38.17-.51.22-.14.05-.27.02-.27.02s-.13.03-.27-.02c-.13-.05-.15-.2-.52-.22s-.42.52-.35.67.29.5-.01.52c-.3.01-.57-.14-.57-.14.16-.15.11-.83-.97-.5-1.1.34-.57.92-.32 1.14s.27.6.27.6-.07-.15-.19-.15-.13.23-.13.23c-.29-.23-.96.14-.94.73.02.58.52.87.52.87-.34.45.25.38.25.38.3.53-.1.82-.1.82 0-.12-.3-.18-.42.17s.23.47.23.47c-.46.6-.16 1.17.29 1.5s1.32.29 1.76.32.52.25.52.25c-.34.32.16.57.16.57.1.34.5-.03.5-.03l.29.25.29-.25s.4.37.5.03c0 0 .5-.25.16-.57 0 0 .09-.22.52-.25s1.3.02 1.76-.32c.45-.33.75-.9.29-1.5 0 0 .35-.12.23-.47"/><path fill="#d01c3a" d="M14.87 11.85v-2.2h-2.21v2.2z"/><path fill="#fedf00" d="m13.46 11-.66.68.1.12.56-.61zm1.08-.86s.3.08.3-.18-.18-.26-.24-.26-.33.04-.34.15c0 .1.1.18.05.23l-.23.2.1.12s.14-.11.25-.27c.06-.09.02-.29.07-.3.16-.03.22.04.2.1 0 .06-.1.12-.1.12z"/><path fill="#fff" d="M14 11.1s.04.5.19.53.2-.78.45-.78c.24 0 .27.7 0 .81l-.04-.2s.18-.29.05-.33-.19.22-.2.33c-.02.1-.12.4-.27.4-.25 0-.28-.38-.32-.67s.14-.09.14-.09m-.45 0s-.04.5-.2.53c-.14.03-.2-.78-.44-.78-.25 0-.27.7 0 .81l.04-.2s-.18-.29-.05-.33c.12-.04.18.22.2.33.01.1.11.4.26.4.26 0 .29-.38.33-.67s-.14-.09-.14-.09"/><path fill="#fff" d="m13.8 9.73.65.82-.32.88s-.13-.07-.33-.07a1 1 0 0 0-.34.07l-.34-.89z"/><path fill="#fedf00" d="m13.86 10.02.45.54-.23.69-.22-.07zm-.15 0-.45.54.23.69.21-.07zm-1.05 2.03v1.37c0 .9.66 1.03 1.22.9.46-.1.99 0 .99 0v-2.27z"/><path fill="#d01c3a" d="m13.89 14.33.04-.01v-2.27h-.34v2.31zm.7-.04v-2.24h-.33v2.23zm-1.33.05v-2.29h-.33v2.12q.14.12.33.17"/><path fill="#fedf00" d="M15.13 11.85v-2.2h2.21v2.2z"/><path fill="#d01c3a" d="M15.4 9.64h.34v2.21h-.34zm.67 0h.34v2.21h-.34zm.67 0h.34v2.21h-.34z"/><path fill="#fedf00" d="M17.34 12.05v1.37c0 .9-.66 1.03-1.22.9-.46-.1-.99 0-.99 0v-2.27z"/><path fill="#d01c3a" d="m15.47 12.42.2-.17h.27v.14s.37-.01.67-.04.39.2.3.25c-.1.06.01.29 0 .4-.02.1-.22.26-.17.17.05-.1 0-.34 0-.34s-.06.2-.1.25c-.06.06-.23.07-.17.02.07-.05.14-.16.08-.22s-.32-.07-.34-.04c0 .02-.05.31-.09.33q-.06.03-.05-.12c.03-.09 0-.25 0-.25s-.17 0-.17.07c.01.08.09.11.07.17s-.12.13-.13.03-.18-.17-.1-.22l.15-.12s-.1-.03-.16-.12c-.07-.09-.13-.08-.26-.08-.07 0 0-.11 0-.11m0 1 .2-.16h.27v.13s.37 0 .67-.04c.3-.03.39.2.3.26s.01.28 0 .39c-.02.1-.22.27-.17.18s0-.35 0-.35-.06.2-.1.25c-.06.06-.23.07-.17.02.07-.05.14-.16.08-.22s-.32-.07-.34-.04c0 .03-.05.32-.09.34q-.06.02-.05-.12c.03-.1 0-.25 0-.25s-.17-.01-.17.06c.01.08.09.11.07.17s-.12.14-.13.04-.18-.17-.1-.22l.15-.13s-.1-.02-.16-.12c-.07-.09-.13-.08-.26-.08-.07 0 0-.1 0-.1"/><path fill="#af9167" d="M12.49 14.5c0 .02 1.23.44 1.37.47s.09.38-.1.36a8 8 0 0 1-1.21-.34c-.12-.07-.06-.5-.06-.5m1.69.5s.37.06.69.08.53-.02.53-.02l.23.38s-.4.05-.66.05c-.27 0-.7-.05-.7-.05zm1.6 0 .85-.2c.32-.1.74-.29.85-.3.1-.03.18.21.21.25l.04.03s-.55.32-.82.41c-.27.1-1.12.24-1.12.24s-.12-.4 0-.43"/></svg>

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><path fill="#f7fcff" fill-rule="evenodd" d="M0 0h20v15H0z" clip-rule="evenodd"/><path fill="#5eaa22" fill-rule="evenodd" d="M0 0v5h20V0z" clip-rule="evenodd"/><path fill="#272727" fill-rule="evenodd" d="M0 10v5h20v-5z" clip-rule="evenodd"/><path fill="#e31d1c" d="M0 0h6v15H0z"/></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#ea3323" d="M0 24V0h9v24z"/><path d="M30 24H9v-7h21z"/><path fill="#fff" d="M9 8h21v9H9z"/><path fill="#317234" d="M30 8H9V0h21z"/></svg>

Before

Width:  |  Height:  |  Size: 501 B

After

Width:  |  Height:  |  Size: 232 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><path fill="#67bd38" fill-rule="evenodd" d="M14 0h6v15h-6z" clip-rule="evenodd"/><path fill="#d51700" fill-rule="evenodd" d="M6 0h8v15H6z" clip-rule="evenodd"/><path fill="#272727" fill-rule="evenodd" d="M0 0h6v15H0z" clip-rule="evenodd"/><path fill="#f7fcff" fill-rule="evenodd" d="m7.705 4.986.216.135q-.54.91-.728 1.668a.6.6 0 0 1 .12.15q.147.254.247.494l-.287.122a4 4 0 0 0-.16-.333q-.043.37.006.698a.6.6 0 0 1 .148.036q.276.1.506.219l-.142.278a4 4 0 0 0-.431-.19l.003.01q.2.605.614 1.115a.6.6 0 0 1 .13-.013q.295 0 .55.033l-.037.31a4 4 0 0 0-.37-.028q.37.371.873.686l-.132.222a5 5 0 0 1-1.058-.869l-.143.06-.022.01q.381.399.9.734l-.134.22a5 5 0 0 1-1.029-.86.7.7 0 0 1-.384-.005l.083-.3q.03.009.06.013a3.9 3.9 0 0 1-.597-1.151 3 3 0 0 1-.061-.224.7.7 0 0 1-.282-.125l.182-.254.047.03a3.6 3.6 0 0 1 .134-1.24.7.7 0 0 1-.151-.295l.265-.069q.215-.608.607-1.286l.218.133a7.2 7.2 0 0 0-.634 1.382q.058.052.144.116.208-.756.729-1.632m-.806 1.963a5 5 0 0 0-.16-.12 3.1 3.1 0 0 0-.086 1.102q.07 0 .16-.006l.05-.003A3 3 0 0 1 6.9 6.95zm-.072 1.287.098-.005q.018.064.038.126.201.608.6 1.122l-.052.023q-.066.03-.12.05a3.6 3.6 0 0 1-.68-1.31zm5.26-3.25-.216.135q.54.91.727 1.668a.6.6 0 0 0-.12.15 4 4 0 0 0-.246.494l.287.122a4 4 0 0 1 .16-.333q.043.37-.006.698a.6.6 0 0 0-.148.036 4 4 0 0 0-.506.219l.141.278q.196-.1.432-.19l-.003.01a3.5 3.5 0 0 1-.614 1.115.6.6 0 0 0-.13-.013q-.295 0-.55.033l.037.31a4 4 0 0 1 .37-.028 5 5 0 0 1-.873.686l.132.222q.621-.39 1.058-.869l.143.06.022.01a5 5 0 0 1-.9.734l.134.22q.601-.386 1.028-.86c.136.035.25.035.385-.005l-.084-.3a.4.4 0 0 1-.06.013q.397-.528.598-1.151a3 3 0 0 0 .06-.224.7.7 0 0 0 .282-.125l-.18-.254-.049.03a3.6 3.6 0 0 0-.133-1.24.7.7 0 0 0 .15-.295l-.265-.069a8 8 0 0 0-.606-1.286l-.218.133q.427.74.634 1.382a2 2 0 0 1-.144.116q-.208-.756-.73-1.632zm.806 1.963a5 5 0 0 1 .16-.12q.144.597.085 1.102-.069 0-.16-.006l-.05-.003q.063-.456-.035-.973m.072 1.287-.098-.005a3.8 3.8 0 0 1-.637 1.249l.05.022q.067.03.122.05a3.6 3.6 0 0 0 .679-1.31z" clip-rule="evenodd"/><path fill="#f7fcff" fill-rule="evenodd" d="m8.808 10.165-.698.69s.602.369 1.736.369 1.794-.369 1.794-.369l-.53-.69s-.723.28-1.235.28c-.511 0-1.067-.28-1.067-.28" clip-rule="evenodd"/><path stroke="#c00001" stroke-width=".5" d="M8.823 10.606s.59.139 1.043.139 1.044-.14 1.044-.14"/><path fill="#f7fcff" fill-rule="evenodd" d="M10.457 5.911c0 .274-.25.495-.557.495s-.557-.221-.557-.495c0-.273.25-.494.557-.494s.557.221.557.494m-.557.495h-.6l-.165.127h-.033v-.99h-.304v.99h-.266v.169h.266v1.786c-.036.285-.12.446-.236.502l-.62.298h3.735l-.268-.268c-.236-.236-.349-.417-.349-.522V6.702h.107v-.17h-.107v-.99h-.304v.99h-.098l-.196-.126zm-.798.296h1.654v1.796q.001.216.202.478H8.977a1.4 1.4 0 0 0 .125-.469zm.849.798h-.66v1.302h1.319L9.95 7.5zm1.643-3.314v.006zm.187.023.001-.003zm-.757.384h.004z" clip-rule="evenodd"/><path fill="#f7fcff" fill-rule="evenodd" d="m8.02 6.668-.124.09.128.188c-.11.04-.286.14-.286.374 0 .34-.12.62-.12.62l.357.23s.038-.398.135-.624a.37.37 0 0 1 .189-.198l.555.816.125-.09zm3.8 0 .124.09-.128.188c.11.04.286.14.286.374 0 .34.12.62.12.62l-.357.23s-.038-.398-.135-.624a.37.37 0 0 0-.189-.198l-.555.816-.125-.09z" clip-rule="evenodd"/></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#fff" d="M0 0h30v24H0z"/><path d="m22.28 15.63 1.54-.65c-.03.3-1.48.7-1.68.84l.1-.17zm-1.6-.75c.29.17.54.58.32.88a.6.6 0 0 0-.34-.69zm-4.28-.1c.1-.07.64-.1.48.1-.11.11-.54.22-.42.4.28.06.56-.04.8-.18-.43.64-1.51.25-.54-.23-.08 0-.3-.02-.35.06q-.03-.07.03-.15m-3.1-.13c.24-.09.36.18.16.32-.09.02-.25-.01-.3.08 0 .25.17.49.06.73-.08-.32-.39-.94.17-.96-.05-.08-.16-.04-.2.03q0-.12.1-.2m4.5-.03h.02c-.1.14-.3.44-.07.52q.05-.04.07-.08 0 .14-.1.23c-.29-.11-.07-.53.08-.67m-13.35-1.1.16-.17c-.25.22-.33 1.06.11.58-.18.89-.8.11-.27-.4m6.57-.7c.05-.14.33-.06.3.08l-.08.08q-.03-.08-.1-.1c-.23.08-.19.37-.23.56l-.05.03c.1-.35-.41-.36-.34-.64.2.01.3.22.38.36a1 1 0 0 1 .12-.36m10.79-.34c.42-.12.84.92.2.57-.22.42-.75.66-1.21.7q.64-.24 1.12-.73l-.15-.02a.3.3 0 0 1 .04-.3c-.06-.05-.08-.18 0-.22m.2.25.04.22c.35.08.16-.12-.03-.22m-.21.12s.1.07.17.08l.03-.1q-.04-.08-.11-.1a.2.2 0 0 0-.1.12m-4.35-.47c.16-.16.33.04.23.22l.06.04v.14l-.12-.08c-.18.27-.5.47-.85.46q.5-.13.77-.51c-.08-.07-.15-.16-.09-.27m.07.06.08.1a.1.1 0 0 0 .01-.1zm-13.05.44 1.4-.75c.05.26-1.3.82-1.47.93zm9.78-1.33.12-.13c-.16.34.5.84.16.21l.05-.17h.07c.23.31.07.98-.33.51-.27.52-.73-.17-.33-.43h.03H14c-.13.19 0 .61.24.34zm-9.22-.23c.41-.1.82.9.2.57-.23.4-.78.67-1.23.69.42-.13.83-.39 1.12-.72l-.15-.02q-.07-.16.05-.3c-.06-.05-.09-.21.01-.22m.2.24.02.23.2.02c.1-.06-.2-.21-.22-.25m-.18.03s-.04.07-.04.1q.06.07.17.08c.05-.08-.03-.24-.13-.17m7.78-.36c1.14.93.47 3 1.63 3.67.08-.73 1.07-.81 1.64-.99h-2.25c.08-.87 1.13-1.09 1.83-1.43-.62-.99.81-.97 1.24-.31l-.15.42a5 5 0 0 0-.67.14c.03.12.06.25 0 .37-.1-.05-.1-.23-.17-.31-.48.19-1.01.34-1.4.69h3.5l-.24.42c-.89.21-4.55.83-2.2 1.34l-.01.5c-1.18.11-2.03-.86-2.04-1.99-.22.87-2.26 2.57-2.86 1.35-.74.6-1.78.67-2.68.86a29 29 0 0 0 2.68-1.41q.12-.54.5-.99c-.14.3-.32.58-.36.91 1.33-.9 1.68-.9.81-2.43l.16-.52c.21.18.48.53.52.81l-.2-.18c.85 1.19-.18 2.17-1.19 2.79 1 .37 1.88-.74 2.57-1.32-.2-.6-.47-1.39-.78-1.93zm2.9.8c-.16.06.19.27.22.35l.46-.14c-.2-.14-.43-.3-.67-.22m3.37-.2 1.4-.76c.09.25-1.36.83-1.48.94zm-2.36-.95c.5.08-.22.74-.51.73.29-.07.85-.78.21-.43.01-.14.18-.23.3-.3m-6.1-.26.41-.23c-.16.39-.75.47-1.08.71.03-.18.53-.4.66-.48m13.8-.49c.4.22.74.77.44 1.18.11-.38-.12-.75-.46-.92zm-5.04.09.11-.11c-.17.32.5.83.16.21l.07-.17h.06q.04.15.13.29c.05.31-.27.52-.47.22-.3.52-.72-.23-.3-.44-.16.18-.02.6.22.35 0-.05 0-.31.02-.35m-11.35-.8c.3.18.54.57.33.89.1-.28-.1-.58-.35-.69zm5.5-.14.14-.12c-.03.18.02.54.27.49.04-.03-.1-.25-.1-.29l.05-.17h.06q.04.16.13.3c.04.33-.24.5-.46.22-.3.53-.73-.23-.32-.44-.16.18-.02.59.24.35zm5.71-.14q.37-.15.75-.27c-.07.28-1.2.45-1.36.66q.07.05.15.07v.1l-.2-.08c-.04-.33.44-.34.65-.47M8.12 8.71c-.02.1.02.37.18.3l-.08-.18.04-.1h.04c.15.2.04.62-.21.33-.18.35-.5-.16-.2-.28-.12.1 0 .4.14.22v-.21zm2.05-.12c.31.15.52.56.34.88.08-.28-.11-.57-.36-.68zm1.23-.12c.15-.27.41-.04.35.21.43.29-.16.69 0 .98a.2.2 0 0 0 .1-.14q.03 0 .05.02c0 .41-.45.27-.26-.08.11-.21.26-.47.07-.66-.19.41-.52.72-.97.83.35-.23.73-.48.87-.87-.12-.07-.25-.15-.2-.29m.08.02v.04l.15.07c.02-.09-.06-.19-.15-.11m7.83-.09c.1-.18.45.03.23.15q-.05-.08-.12-.1c-.19.11-.19.37-.2.56l-.06.04q0-.24-.16-.4c-.15.03-.22-.14-.19-.25.2.01.3.23.38.36q.03-.2.12-.36m-14.9.05q.04-.08.12-.13c-.24.21-.33 1.05.11.58l.02.02c-.3.89-.77-.05-.25-.47m8.87-.19c.32.18.55.56.35.89.07-.3-.08-.56-.36-.69zm2.38-.09c.2.16.4.42.44.67a.4.4 0 0 0-.18-.1c.61.94.46 3.14-1.01 1.88-.14-.13-.16-.48-.28-.53-.43 1.96-2.58 1.02-1.77-.7h-.03c-.5.35-.39 1.09-.67 1.59-.87.91-1.1-.84-.82-1.44h.04c-.07.45-.24 1.16.26 1.42.96.03.54-1.75 1.41-2.15h.04c.03.5-.36 1.04-.22 1.54.23.63 1.3.56 1.56-.02.46-.65-.31-1.48.12-2.04.33.61.1 1.44.54 2 1.55 1.05.78-.94.42-1.71q.04-.2.15-.4m-6.38.44.24-.46c.15.36.39.74.36 1.15l-.17-.25q.2 1.53.34 3.08c.98-1.39.04.3 1.2-.24l-.1-.24c.02-.06.17-.39.21-.44.36.7-.42 1.91-1.01.97q-.1.2-.26.37c.38 2.1-3.1 4.11-4.69 2.74q-.61.06-1.24.06l1.1-.38c-.15-.84.21-1.7.64-2.42-.4.71-.65 1.53-.28 2.28.8-.47 2.76-.93 2.64-1.97-2.2.91-.86-2.52.18-.59 1.43-1.12.3-.04 1.28-.02-.04-.13-.35-3.53-.44-3.64m-1.8 3.61q-.14.03-.16.13c.14.15.44.08.64.08v-.03a.6.6 0 0 0-.5-.18m1.1.48c.08 1.37-1.55 1.95-2.58 2.46 1.39.29 4.11-.75 3.79-2.41-.35.16-.7-.13-.71-.47q-.2.24-.5.42m8.05-4.42q.04-.08.13-.14c-.25.21-.32 1.08.11.57-.21.92-.77.05-.25-.43m-10.44.3.26-.45c.14.37.35.75.3 1.14l-.16-.23.14 1.7c1.36-.28.3-1.76.74-2.48.22.52.23 1.11.34 1.64.88 1.47 1.57.25.78-.89-.12-.27-.22-.6 0-.87.2.16.39.43.44.67a.3.3 0 0 0-.18-.1c.97 1.61-.26 3.45-1.26 1.34h-.03c-.11.44-.33.91-.79 1.1.02 1 .32 2.1-.12 3.04-.02-.9-.15-2.09-.2-2.99-1.07-.02-.76-1.19-.68-1.85-.63.39-.32 1.36-.88 1.81-.94.25-.81-1.09-.63-1.65h.03c-.12.49-.19 1.68.61 1.4.45-.62.35-1.68 1.1-2.13.05.65-.72 1.83.4 1.97-.04-.21-.13-2.04-.2-2.18m19.12 0 .22-.48c.11.43.41.89.35 1.35l-.13-.21c.1 2.28 1.26 6.59-2.32 6.52 2.21-.66 2.6-2.21 2.15-4.27l-.2-2.7-.09-.17zm-1.14.15.77-.73c0 .43-.38.72-.7.97.03.09.04.26.02.35l-.17-.24c.06.5.18 2.45.21 2.98.56.6 1.5 1.38 1.2 2.31-.18-.78Line truncated

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#19724d" d="M0 24h30V0H0z"/><path fill="#fff" d="m14.62 14.7-1.53 4.18.85-4.38-2.57 3.65 1.95-4L9.91 17l2.92-3.37-4.05 1.88 3.7-2.5-4.4.77 4.22-1.46-4.44-.4 4.45-.3-4.2-1.54 4.39.85-3.65-2.57 4 1.95L10 6.91l3.37 2.92-1.88-4.05 2.5 3.7-.77-4.4 1.46 4.22.4-4.44.3 4.45 1.54-4.2-.85 4.39 2.57-3.65-1.95 4L20.09 7l-2.92 3.37 4.05-1.88-3.7 2.5 4.4-.77-4.22 1.46 4.44.4-4.45.3 4.2 1.54-4.39-.85 3.65 2.57-4-1.95 2.85 3.4-3.37-2.92 1.88 4.05-2.5-3.7.77 4.4-1.46-4.22-.4 4.44z"/><path fill="#19724d" d="m15.8 18.26-.36.17-.25-.36v-.18l-.19-.42-.3-.35-.12-.86-.37-.63-.04-.07-.05-.17v-.22l.1-.32.15-.38v-.76l-.16-.52-.44-.42-.21-.33.21-.39.16-.34-.37-.24h-.42l-.43-.4-.6.2-.73.2h-.91l-.4-.4-.22-.5-.4-.5-.16-.25.16-.36V8.4l.25-.26.37-.7.4-.35.34-.32.15-.32.42-.49.38-.22v.22h.36l1.81-.4v.64l.77.42.74.15v-.32l1.27.32.9-.15v.64l.47.88.38.76.21.37.33.35.54.44v.21h.53l.64-.2v.5l-.34.9-.68.57-.85 1.14v.52l.16.76-.16.7-.94.58v1.08h-.46v.52l-1.03.91zm3.61-1.55-.21-.12-.07-.18-.05-.45.36-.4-.07-.44.11-.23.2-.07.47-.13.35-.55.21.1-.03.58-.9 1.77z"/><path fill="#fff" d="M14.24 5.18q.19.15.2.4v.33l.44.25.14.03a.5.5 0 0 1 .54-.21l1.17.3.8-.14a.5.5 0 0 1 .59.5v.51l.4.77.38.75.18.31.27.28.5.43.1.1h.04l.57-.2a.5.5 0 0 1 .65.48v.5l-.03.18-.34.9-.14.2-.64.55-.72.96v.3l.15.7.06-.02.28-.08.24-.39a.5.5 0 0 1 .61-.2l.22.1c.2.08.32.27.31.49l-.03.59-.05.2-.9 1.77a.5.5 0 0 1-.29.24l-.37.13a.5.5 0 0 1-.42-.05l-.2-.12a.5.5 0 0 1-.21-.24l-.08-.18-.03-.14-.05-.45v-.1l-.18.12v.8a.5.5 0 0 1-.46.5v.02a.5.5 0 0 1-.17.37l-1.03.91a.5.5 0 0 1-.33.13h-.5l-.26.12a.5.5 0 0 1-.62-.16l-.25-.36a.5.5 0 0 1-.1-.29V18l-.1-.25-.26-.29-.11-.25-.11-.77-.32-.55-.04-.06-.05-.12-.05-.16-.02-.15v-.22q0-.08.02-.14l.1-.32.01-.06.12-.29v-.57l-.1-.32-.35-.34-.07-.09-.21-.32a.5.5 0 0 1-.02-.52l.13-.23h-.11a.5.5 0 0 1-.35-.14l-.2-.2-.3.1-.04.02-.74.2-.13.02h-.9a.5.5 0 0 1-.37-.15l-.4-.41-.1-.15-.19-.42-.36-.45-.03-.05-.17-.25a.5.5 0 0 1-.03-.48l.12-.26V8.4a.5.5 0 0 1 .14-.34l.2-.22.34-.63.1-.13.4-.36.27-.25.1-.22.08-.12.42-.5.13-.1.38-.22a.5.5 0 0 1 .65.13l1.66-.37a.5.5 0 0 1 .42.1m-2.62 1.27-.24.28-.1.26-.13.16-.34.32-.34.3-.33.61-.08.11-.11.12v.85l-.05.2-.05.12.4.48.06.11.18.4.2.2h.62l.66-.18.58-.2a.5.5 0 0 1 .5.11l.29.27h.22q.15 0 .27.08l.37.24c.21.14.29.4.18.63l-.15.35-.02.02-.07.13.02.03.4.38q.09.09.13.21l.16.52.02.15v.76l-.04.2-.15.34-.06.23v.11l.03.03.36.63.06.18.1.72.2.23.09.12.19.43.03.08.12-.01h.42l.72-.63v-.3c0-.26.2-.48.46-.5v-.58a.5.5 0 0 1 .23-.43l.77-.47.1-.39-.15-.64-.01-.11v-.52q0-.16.1-.3l.86-1.14.07-.07.58-.5.15-.4h-.56a.5.5 0 0 1-.5-.47l-.35-.3-.05-.03-.33-.35-.07-.1-.21-.37-.02-.03-.38-.75-.46-.87-.05-.24v-.05l-.33.06-.2-.01-.75-.19a.5.5 0 0 1-.5.2l-.74-.16-.14-.05-.77-.42a.5.5 0 0 1-.26-.44v-.02l-1.2.27-.11.01h-.36z"/><path fill="#feca00" d="m15 3.6-.63.34.12-.7-.5-.5.7-.1L15 2l.31.64.7.1-.5.5.12.7zm2.17.3-.7.15.3-.65-.36-.6.7.08.48-.54.14.7.65.28-.62.35-.07.7zm2.03.83-.71-.03.45-.54-.2-.69.67.26.59-.39-.05.71.56.44-.69.18-.24.66zm1.73 1.34-.67-.22.58-.4-.01-.72.57.43.67-.23-.23.67.43.57h-.71l-.41.57zm1.34 1.73-.6-.38.66-.24.18-.7.44.57.71-.05-.4.6.27.65-.69-.19-.54.45zm.83 2.03-.48-.52.71-.07.35-.62.28.65.7.14-.54.47.09.7-.61-.36-.65.3zm.3 2.17-.34-.63.7.12.5-.5.1.7.64.31-.64.31-.1.7-.5-.5-.7.12zm-.3 2.17-.15-.7.65.3.6-.36-.08.7.54.48-.7.14-.28.65-.35-.62-.7-.07zm-.83 2.03.03-.71.54.45.69-.2-.26.67.39.59-.71-.05-.44.56-.18-.69-.66-.24zm-1.34 1.73-.67.22.58.4-.01.72.57-.43.67.23-.23-.67.43-.57h-.71l-.41-.57zm-1.73 1.34-.71.03.45.54-.2.69.67-.26.59.39-.05-.71.56-.44-.69-.18-.24-.66zm-2.03.83.52-.48.07.71.62.35-.65.28-.14.7-.47-.54-.7.09.36-.61-.3-.65zm-2.17.3.63-.34-.12.7.5.5-.7.1L15 22l-.31-.64-.7-.1.5-.5-.12-.7zm-2.17-.3.7-.15-.3.65.36.6-.7-.08-.48.54-.14-.7-.65-.28.62-.35.07-.7zm-2.03-.83.71.03-.45.54.2.69-.67-.26-.59.39.05-.71-.56-.44.69-.18.24-.66zm-1.73-1.34.67.22-.58.4.01.72-.57-.43-.67.23.23-.67-.43-.57h.71l.41-.57zM7.73 16.2l.6.38-.66.24-.18.7-.44-.57-.71.05.4-.6-.27-.65.69.19.54-.45zm-.83-2.03.48.52-.71.07-.35.62-.28-.65-.7-.14.54-.47-.09-.7.61.36.65-.3zM6.6 12l.34.63-.7-.12-.5.5-.1-.7L5 12l.64-.31.1-.7.5.5.7-.12zm.3-2.17.15.7-.65-.3-.6.36.08-.7-.54-.48.7-.14.28-.65.35.62.7.07zm.83-2.03-.03.71-.54-.45-.69.2.26-.67L6.34 7l.71.05.44-.56.18.69.66.24zm1.34-1.73-.22.67-.4-.58-.72.01.43-.57-.23-.67.67.23.57-.43v.71l.57.41zm1.73-1.34-.38.6-.24-.66-.7-.18.57-.44-.05-.71.6.4.65-.27-.19.69.45.54zm2.03-.83-.52.48-.07-.71-.62-.35.65-.28.14-.7.47.54.7-.09-.36.61.3.65z"/></svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" mask-type="alpha" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><path fill="#19724d" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/><mask id="b" width="20" height="15" x="0" y="0" mask-type="alpha" maskUnits="userSpaceOnUse"><path fill="#fff" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/></mask><g mask="url(#b)"><path fill="#f7fcff" d="m9.735 9.386-1.071 2.932.592-3.065-1.794 2.555 1.365-2.807-2.393 2.004 2.045-2.359-2.83 1.316 2.585-1.748-3.075.538 2.95-1.02L5 7.456l3.114-.221-2.932-1.071 3.065.592-2.555-1.794 2.807 1.365-2.003-2.393 2.358 2.045-1.316-2.83 1.748 2.585-.538-3.075 1.02 2.95.276-3.109.221 3.114 1.071-2.932-.592 3.065 1.794-2.555-1.365 2.807 2.393-2.004-2.045 2.359 2.83-1.316-2.585 1.748 3.075-.538-2.95 1.02L15 7.544l-3.114.221 2.932 1.071-3.064-.592 2.554 1.794-2.807-1.365 2.004 2.393-2.359-2.045 1.316 2.83-1.748-2.585.538 3.075-1.02-2.95-.276 3.109z"/><mask id="c" width="10" height="11" x="5" y="2" fill="#000" maskUnits="userSpaceOnUse"><path fill="#fff" d="M5 2h10v11H5z"/><path fill-rule="evenodd" d="m10.557 11.882-.25.118-.175-.25v-.128L10 11.326l-.21-.24-.086-.602-.256-.444-.03-.05-.035-.114v-.159l.065-.225.114-.266v-.53l-.114-.36-.308-.297-.149-.229.15-.272.111-.24-.26-.167h-.296l-.3-.288-.412.143-.519.145H6.83l-.282-.288-.15-.34-.285-.353L6 5.972l.113-.252v-.731l.179-.186.256-.482.282-.253.24-.22.1-.224.295-.344.267-.152v.152h.252L9.252 3v.446l.539.298.516.105v-.225l.89.225.634-.105v.448l.322.61.269.535.148.26.233.244.375.31v.147h.368L14 6.15v.352l-.242.63-.472.406-.601.798v.36l.118.53-.118.491-.657.405v.759h-.322v.364l-.718.637zm2.53-1.082-.147-.088-.05-.124-.033-.319.251-.278-.052-.308.083-.162.143-.046.321-.094.244-.381.153.062-.02.413-.63 1.237z" clip-rule="evenodd"/></mask><path fill="#19724d" fill-rule="evenodd" d="m10.557 11.882-.25.118-.175-.25v-.128L10 11.326l-.21-.24-.086-.602-.256-.444-.03-.05-.035-.114v-.159l.065-.225.114-.266v-.53l-.114-.36-.308-.297-.149-.229.15-.272.111-.24-.26-.167h-.296l-.3-.288-.412.143-.519.145H6.83l-.282-.288-.15-.34-.285-.353L6 5.972l.113-.252v-.731l.179-.186.256-.482.282-.253.24-.22.1-.224.295-.344.267-.152v.152h.252L9.252 3v.446l.539.298.516.105v-.225l.89.225.634-.105v.448l.322.61.269.535.148.26.233.244.375.31v.147h.368L14 6.15v.352l-.242.63-.472.406-.601.798v.36l.118.53-.118.491-.657.405v.759h-.322v.364l-.718.637zm2.53-1.082-.147-.088-.05-.124-.033-.319.251-.278-.052-.308.083-.162.143-.046.321-.094.244-.381.153.062-.02.413-.63 1.237z" clip-rule="evenodd"/><path fill="#f7fcff" d="m10.307 12-.164.115.097.138.152-.072zm.25-.118v-.2h-.044l-.04.019zm-.425-.131h-.2v.063l.036.052zm0-.129h.2v-.043l-.017-.038zM10 11.326l.183-.082-.013-.027-.02-.023zm-.21-.24-.197.03.008.058.04.045zm-.086-.602.198-.029-.005-.038-.02-.033zm-.256-.444.174-.1-.003-.004zm-.03-.05-.191.06.007.023.014.022zm-.035-.114h-.2v.03l.01.028zm0-.159-.192-.056-.008.028v.028zm.065-.225-.183-.079-.005.011-.004.012zm.114-.266.184.079.016-.038v-.04zm0-.53h.2v-.03l-.01-.03zm-.114-.36.191-.06-.015-.049-.037-.035zM9.14 8.04l-.167.109.012.019.016.016.14-.144Zm-.149-.229-.175-.096-.057.105.065.1zm.15-.272.175.096.006-.012zm.111-.24.181.085.074-.159-.147-.094zm-.26-.167.107-.168-.049-.032h-.059zm-.296 0-.139.144.058.056h.081zm-.3-.288.139-.144-.088-.085-.116.04zm-.412.143.054.193.011-.004-.065-.19Zm-.519.145v.2h.028l.026-.007zm-.635 0-.143.14.059.06h.084zm-.282-.288-.183.08.015.034.025.025.143-.14Zm-.15-.34.183-.081-.01-.025-.017-.02-.156.125Zm-.285-.353-.168.107.006.01.007.009zM6 5.972l-.182-.082-.045.098.058.091zm.113-.252.183.082.017-.04V5.72zm0-.731L5.97 4.85l-.056.058v.08h.2Zm.179-.186.144.138.02-.02.012-.024zm.256-.482-.133-.149-.027.024-.016.03zm.282-.253.134.148zm.24-.22.135.149.03-.029.018-.038-.183-.081Zm.1-.224-.152-.13-.019.022-.012.027zm.295-.344-.098-.174-.03.017-.024.027zm.267-.152h.2v-.343l-.298.17zm0 .152h-.2v.2h.2zm.252 0v.2h.021l.022-.005zM9.252 3h.2v-.249l-.243.054zm0 .446h-.2v.118l.103.057zm.539.298-.097.175.027.014.03.006zm.516.105-.04.196.24.049v-.245zm0-.225.049-.193-.25-.063v.256h.2Zm.89.225-.05.194.041.01.041-.007zm.634-.105h.2v-.236l-.233.038zm0 .448h-.2v.05l.023.043zm.322.61.18-.09-.003-.003-.177.094Zm.269.535-.18.09.006.01zm.148.26-.173.1.012.021.017.018zm.233.244-.144.138.008.008.009.008zm.375.31h.2v-.095l-.073-.06zm0 .147h-.2v.2h.2zm.368 0v.2h.032l.03-.01zM14 6.15h.2v-.275l-.262.085zm0 .352.187.072.013-.035v-.037zm-.242.63.13.15.039-.032.018-.047zm-.472.406-.13-.152-.016.014-.013.018zm-.601.798-.16-.12-.04.053v.067zm0 .36h-.2v.022l.005.022zm.118.53.195.047.01-.045-.01-.045zm-.118.491.105.17.07-.043.02-.08zm-.657.405-.105-.17-.095.059v.111zm0 .76v.2h.2v-.2zm-.322 0v-.2h-.2v.2zm0 .363.133.15.067-.06v-.09zm-.718.637v.2h.075l.057-.05zm1.952-1.17-.186.075.026.063.057.034zm.147.088-.102.172.079.047.087-.03zm-.198-.212-.199.02.003.028.01.027zm-.032-.319-.148-.134-.06.066.01.088zm.251-.2Line truncated
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#19724d" d="M0 24h30V0H0z"/><path fill="#fff" d="m14.62 14.7-1.53 4.18.85-4.38-2.57 3.65 1.95-4L9.91 17l2.92-3.37-4.05 1.88 3.7-2.5-4.4.77 4.22-1.46-4.44-.4 4.45-.3-4.2-1.54 4.39.85-3.65-2.57 4 1.95L10 6.91l3.37 2.92-1.88-4.05 2.5 3.7-.77-4.4 1.46 4.22.4-4.44.3 4.45 1.54-4.2-.85 4.39 2.57-3.65-1.95 4L20.09 7l-2.92 3.37 4.05-1.88-3.7 2.5 4.4-.77-4.22 1.46 4.44.4-4.45.3 4.2 1.54-4.39-.85 3.65 2.57-4-1.95 2.85 3.4-3.37-2.92 1.88 4.05-2.5-3.7.77 4.4-1.46-4.22-.4 4.44z"/><path fill="#19724d" d="m15.8 18.26-.36.17-.25-.36v-.18l-.19-.42-.3-.35-.12-.86-.37-.63-.04-.07-.05-.17v-.22l.1-.32.15-.38v-.76l-.16-.52-.44-.42-.21-.33.21-.39.16-.34-.37-.24h-.42l-.43-.4-.6.2-.73.2h-.91l-.4-.4-.22-.5-.4-.5-.16-.25.16-.36V8.4l.25-.26.37-.7.4-.35.34-.32.15-.32.42-.49.38-.22v.22h.36l1.81-.4v.64l.77.42.74.15v-.32l1.27.32.9-.15v.64l.47.88.38.76.21.37.33.35.54.44v.21h.53l.64-.2v.5l-.34.9-.68.57-.85 1.14v.52l.16.76-.16.7-.94.58v1.08h-.46v.52l-1.03.91zm3.61-1.55-.21-.12-.07-.18-.05-.45.36-.4-.07-.44.11-.23.2-.07.47-.13.35-.55.21.1-.03.58-.9 1.77z"/><path fill="#fff" d="M14.24 5.18q.19.15.2.4v.33l.44.25.14.03a.5.5 0 0 1 .54-.21l1.17.3.8-.14a.5.5 0 0 1 .59.5v.51l.4.77.38.75.18.31.27.28.5.43.1.1h.04l.57-.2a.5.5 0 0 1 .65.48v.5l-.03.18-.34.9-.14.2-.64.55-.72.96v.3l.15.7.06-.02.28-.08.24-.39a.5.5 0 0 1 .61-.2l.22.1c.2.08.32.27.31.49l-.03.59-.05.2-.9 1.77a.5.5 0 0 1-.29.24l-.37.13a.5.5 0 0 1-.42-.05l-.2-.12a.5.5 0 0 1-.21-.24l-.08-.18-.03-.14-.05-.45v-.1l-.18.12v.8a.5.5 0 0 1-.46.5v.02a.5.5 0 0 1-.17.37l-1.03.91a.5.5 0 0 1-.33.13h-.5l-.26.12a.5.5 0 0 1-.62-.16l-.25-.36a.5.5 0 0 1-.1-.29V18l-.1-.25-.26-.29-.11-.25-.11-.77-.32-.55-.04-.06-.05-.12-.05-.16-.02-.15v-.22q0-.08.02-.14l.1-.32.01-.06.12-.29v-.57l-.1-.32-.35-.34-.07-.09-.21-.32a.5.5 0 0 1-.02-.52l.13-.23h-.11a.5.5 0 0 1-.35-.14l-.2-.2-.3.1-.04.02-.74.2-.13.02h-.9a.5.5 0 0 1-.37-.15l-.4-.41-.1-.15-.19-.42-.36-.45-.03-.05-.17-.25a.5.5 0 0 1-.03-.48l.12-.26V8.4a.5.5 0 0 1 .14-.34l.2-.22.34-.63.1-.13.4-.36.27-.25.1-.22.08-.12.42-.5.13-.1.38-.22a.5.5 0 0 1 .65.13l1.66-.37a.5.5 0 0 1 .42.1m-2.62 1.27-.24.28-.1.26-.13.16-.34.32-.34.3-.33.61-.08.11-.11.12v.85l-.05.2-.05.12.4.48.06.11.18.4.2.2h.62l.66-.18.58-.2a.5.5 0 0 1 .5.11l.29.27h.22q.15 0 .27.08l.37.24c.21.14.29.4.18.63l-.15.35-.02.02-.07.13.02.03.4.38q.09.09.13.21l.16.52.02.15v.76l-.04.2-.15.34-.06.23v.11l.03.03.36.63.06.18.1.72.2.23.09.12.19.43.03.08.12-.01h.42l.72-.63v-.3c0-.26.2-.48.46-.5v-.58a.5.5 0 0 1 .23-.43l.77-.47.1-.39-.15-.64-.01-.11v-.52q0-.16.1-.3l.86-1.14.07-.07.58-.5.15-.4h-.56a.5.5 0 0 1-.5-.47l-.35-.3-.05-.03-.33-.35-.07-.1-.21-.37-.02-.03-.38-.75-.46-.87-.05-.24v-.05l-.33.06-.2-.01-.75-.19a.5.5 0 0 1-.5.2l-.74-.16-.14-.05-.77-.42a.5.5 0 0 1-.26-.44v-.02l-1.2.27-.11.01h-.36z"/><path fill="#feca00" d="m15 3.6-.63.34.12-.7-.5-.5.7-.1L15 2l.31.64.7.1-.5.5.12.7zm2.17.3-.7.15.3-.65-.36-.6.7.08.48-.54.14.7.65.28-.62.35-.07.7zm2.03.83-.71-.03.45-.54-.2-.69.67.26.59-.39-.05.71.56.44-.69.18-.24.66zm1.73 1.34-.67-.22.58-.4-.01-.72.57.43.67-.23-.23.67.43.57h-.71l-.41.57zm1.34 1.73-.6-.38.66-.24.18-.7.44.57.71-.05-.4.6.27.65-.69-.19-.54.45zm.83 2.03-.48-.52.71-.07.35-.62.28.65.7.14-.54.47.09.7-.61-.36-.65.3zm.3 2.17-.34-.63.7.12.5-.5.1.7.64.31-.64.31-.1.7-.5-.5-.7.12zm-.3 2.17-.15-.7.65.3.6-.36-.08.7.54.48-.7.14-.28.65-.35-.62-.7-.07zm-.83 2.03.03-.71.54.45.69-.2-.26.67.39.59-.71-.05-.44.56-.18-.69-.66-.24zm-1.34 1.73-.67.22.58.4-.01.72.57-.43.67.23-.23-.67.43-.57h-.71l-.41-.57zm-1.73 1.34-.71.03.45.54-.2.69.67-.26.59.39-.05-.71.56-.44-.69-.18-.24-.66zm-2.03.83.52-.48.07.71.62.35-.65.28-.14.7-.47-.54-.7.09.36-.61-.3-.65zm-2.17.3.63-.34-.12.7.5.5-.7.1L15 22l-.31-.64-.7-.1.5-.5-.12-.7zm-2.17-.3.7-.15-.3.65.36.6-.7-.08-.48.54-.14-.7-.65-.28.62-.35.07-.7zm-2.03-.83.71.03-.45.54.2.69-.67-.26-.59.39.05-.71-.56-.44.69-.18.24-.66zm-1.73-1.34.67.22-.58.4.01.72-.57-.43-.67.23.23-.67-.43-.57h.71l.41-.57zM7.73 16.2l.6.38-.66.24-.18.7-.44-.57-.71.05.4-.6-.27-.65.69.19.54-.45zm-.83-2.03.48.52-.71.07-.35.62-.28-.65-.7-.14.54-.47-.09-.7.61.36.65-.3zM6.6 12l.34.63-.7-.12-.5.5-.1-.7L5 12l.64-.31.1-.7.5.5.7-.12zm.3-2.17.15.7-.65-.3-.6.36.08-.7-.54-.48.7-.14.28-.65.35.62.7.07zm.83-2.03-.03.71-.54-.45-.69.2.26-.67L6.34 7l.71.05.44-.56.18.69.66.24zm1.34-1.73-.22.67-.4-.58-.72.01.43-.57-.23-.67.67.23.57-.43v.71l.57.41zm1.73-1.34-.38.6-.24-.66-.7-.18.57-.44-.05-.71.6.4.65-.27-.19.69.45.54zm2.03-.83-.52.48-.07-.71-.62-.35.65-.28.14-.7.47.54.7-.09-.36.61.3.65z"/></svg>

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><path fill="#1b1b1b" fill-rule="evenodd" d="M0 0h20v15H0z" clip-rule="evenodd"/><path fill="#f9d313" fill-rule="evenodd" d="m10 8.75-1.39 2.375.034-2.623-2.54 1.657 1.453-2.35-3.188.61 2.584-1.613L3.75 6.25l3.203-.556L4.37 4.08l3.188.61-1.454-2.35 2.541 1.657-.035-2.623L10 3.75l1.39-2.375-.034 2.623 2.54-1.657-1.453 2.35 3.188-.61-2.584 1.613 3.203.556-3.203.556L15.63 8.42l-3.188-.61 1.454 2.35-2.541-1.657.035 2.623z" clip-rule="evenodd"/><path fill="#f1f9ff" d="M3.75 8.75h12.5V15H3.75z"/><path fill="#4a80e8" d="M1.25 6.25h17.5v2.5H1.25z"/><path fill="#e31d1c" fill-rule="evenodd" d="M0 3.75 10 15 20 3.75V15H0z" clip-rule="evenodd"/></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path d="M0 0h30v24H0z"/><path fill="#fcd116" d="m7 11.01 4.08-.78L7.6 7.95l4.06.84-2.33-3.43 3.44 2.33-.84-4.07 2.28 3.47.78-4.08.78 4.08 2.28-3.47-.84 4.07 3.44-2.33-2.33 3.43 4.06-.84-3.47 2.28 4.08.78z"/><path fill="#0072c6" d="M0 11h30v5H0z"/><path fill="#fff" d="M9 15h12v9H9z"/><path fill="#ce1126" d="M0 24V0l15 24zm30 0H15L30 0z"/></svg>

Before

Width:  |  Height:  |  Size: 862 B

After

Width:  |  Height:  |  Size: 429 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><path fill="#2e42a5" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/><mask id="b" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/></mask><g mask="url(#b)"><path fill="#fff" stroke="#e6e617" stroke-width=".5" d="M16.219 13.477c-.628 0-1.052-.148-1.35-.394-.298-.249-.5-.624-.632-1.14-.132-.52-.186-1.158-.207-1.907a56 56 0 0 1-.009-1.711l.002-.555h4.453c.079 1.475.1 2.891-.184 3.953-.149.555-.375.99-.7 1.286-.32.291-.758.468-1.373.468z"/><path fill="#82e5ff" fill-rule="evenodd" d="M14.246 12.696q.56 1.25 1.96 1.25 1.391 0 1.967-1.233z" clip-rule="evenodd"/><path fill="#e18600" fill-rule="evenodd" d="M14.653 9.75c0 .83.675 1.5 1.506 1.5s1.507-.67 1.507-1.5-.676-1.5-1.507-1.5-1.506.67-1.506 1.5m2.388 0a.88.88 0 0 1-.882.875.88.88 0 0 1-.88-.875c0-.483.394-.875.88-.875.487 0 .882.392.882.875" clip-rule="evenodd"/><path fill="#e18600" fill-rule="evenodd" d="M15.905 8.041s-.548.249-.429.716.253.534.253.534.194-1.012.976-1.012zm-.997 2.521s.457.392.83.086c.373-.305.377-.455.377-.455s-1 .252-1.33-.456zm2.742-.052s.017-.602-.455-.7-.591-.007-.591-.007.824.618.482 1.32z" clip-rule="evenodd"/><path fill="#2e42a5" d="M0 0h11v9H0z"/><mask id="c" width="11" height="9" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h11v9H0z"/></mask><g mask="url(#c)"><path fill="#f7fcff" d="M-1.253 8.125 1.223 9.21l10.083-8.03 1.306-1.614-2.647-.363-4.113 3.46-3.31 2.332z"/><path fill="#f50100" d="m-.914 8.886 1.261.63L12.143-.583h-1.77z"/><path fill="#f7fcff" d="M12.503 8.125 10.306 9.52-.056 1.18-1.362-.434l2.647-.363 4.113 3.46 3.31 2.332z"/><path fill="#f50100" d="m12.418 8.67-1.261.63-5.023-4.323-1.489-.483-6.133-4.921H.283l6.13 4.804 1.628.58 4.377 3.714z"/><mask id="d" width="13" height="11" x="-1" y="-1" fill="#000" maskUnits="userSpaceOnUse"><path fill="#fff" d="M-1-1h13v11H-1z"/><path fill-rule="evenodd" d="M6 0H5v4H0v1h5v4h1V5h5V4H6z" clip-rule="evenodd"/></mask><path fill="#f50100" fill-rule="evenodd" d="M6 0H5v4H0v1h5v4h1V5h5V4H6z" clip-rule="evenodd"/><path fill="#f7fcff" d="M5 0v-.938h-.938V0zm1 0h.938v-.938H6zM5 4v.938h.938V4zM0 4v-.938h-.938V4zm0 1h-.938v.938H0zm5 0h.938v-.938H5zm0 4h-.938v.938H5zm1 0v.938h.938V9zm0-4v-.938h-.938V5zm5 0v.938h.938V5zm0-1h.938v-.938H11zM6 4h-.938v.938H6zM5 .937h1V-.938H5zM5.938 4V0H4.063v4zM0 4.938h5V3.063H0zM.938 5V4H-.938v1zM5 4.062H0v1.875h5zM5.938 9V5H4.063v4zM6 8.062H5v1.876h1zM5.062 5v4h1.875V5zM11 4.062H6v1.875h5zM10.062 4v1h1.876V4zM6 4.938h5V3.063H6zM5.062 0v4h1.875V0z" mask="url(#d)"/></g></g></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#071b65" d="M0 0h30v24H0z"/><path fill="#cccc32" d="M25.97 7.23s-.96.34-2.05.34-1.9-.57-1.9-.57-.8.57-1.89.57-2.1-.34-2.1-.34c-.1 2.74.06 5.63 1.06 7.14A9 9 0 0 0 22.03 17s1.81-1 2.88-2.63c1-1.51 1.17-4.4 1.06-7.14"/><path fill="#fff" d="M25.63 7.55s-.77.3-1.8.3-1.8-.52-1.8-.52-.77.52-1.8.52-1.8-.3-1.8-.3c-.1 2.6 0 5.26 1 6.66.99 1.4 2.6 2.37 2.6 2.37s1.6-.97 2.6-2.37 1.1-4.06 1-6.66"/><path fill="#f90" d="M21.13 7.94s.03.46.22.62c0 0 .48-.1.87.06.3.13.87.36 1.16.26s.54-.19.6-.13c.07.07-.32.17-.38.23-.07.07-.29.13-.16.33s.35.35.29.55c0 0-.29-.23-.42-.42-.13-.2-.42-.36-.9-.3-.48.07-.87.33-.93.62-.07.3.29.26.58.33 0 0-.42.16-.64.16 0 0-.2.36-.4.68-.18.33-.22.52-.31.49-.1-.04-.13-.49-.07-.75 0 0-.22-.13-.19-.78.03-.55.42-1.07.42-1.07s-.03-.2 0-.42c.03-.23.26-.46.26-.46"/><path fill="#fff" d="m20.77 10.23-.03.08-.08.04a.1.1 0 0 1-.11-.12.11.11 0 0 1 .19-.08q.03.03.03.08"/><path fill="#f90" d="M20.1 13.49s.33-.31.33-.57c0 0-.38-.31-.5-.72-.1-.32-.27-.9-.53-1.07-.26-.16-.5-.3-.49-.4.01-.08.33.16.42.16.1.01.29.15.35-.07.07-.23.05-.5.24-.58 0 0 .01.37-.06.6s0 .55.35.88c.35.34.8.48 1.06.34.27-.13.02-.39-.12-.66 0 0 .4.23.54.4l.76-.12c.37-.06.54-.16.58-.06s-.3.4-.54.52c0 0 .05.26-.47.65-.44.33-1.09.35-1.09.35s-.12.14-.32.26-.51.09-.51.09"/><path fill="#fff" d="m22.08 12.32.08-.02a.1.1 0 0 1 .1.12q0 .05-.04.07a.1.1 0 0 1-.1.02.11.11 0 0 1-.04-.2"/><path fill="#f90" d="M25.21 11.56s-.42-.17-.65-.07c0 0-.12.48-.43.76-.25.23-.7.64-.74.94s-.07.58-.15.61c-.09.03 0-.36-.04-.45-.03-.08.02-.32-.21-.29s-.48.17-.62.03c0 0 .33-.17.56-.2s.5-.22.65-.69.1-.93-.14-1.11c-.23-.2-.36.14-.54.38 0 0 .04-.45.13-.66l-.43-.65c-.2-.31-.37-.43-.3-.5s.5.1.7.27c0 0 .21-.15.78.16.48.27.77.85.77.85s.18.06.37.19a1 1 0 0 1 .3.43"/><path fill="#fff" d="M23.33 10.24a.11.11 0 0 1 .01-.21.1.1 0 0 1 .14.07v.08a.1.1 0 0 1-.15.06"/><path fill="#9cf" d="m19.27 13.98.15.23c1 1.4 2.6 2.37 2.6 2.37s1.62-.97 2.61-2.37l.15-.23z"/><path fill="#fff" d="M5.5 9.77V12h4V9.77L12.54 12H15v-1.24L11.24 8H15V4h-2.74L15 2V0h-1.44L9.5 2.98V0h-4v2.8L1.75 0H0v1.9L2.99 4H0v4h3.76L0 10.76V12h2.46z"/><path fill="#b92932" d="m0 1 4.09 3h1.36L0 0zm0 11 5.45-4v1l-4.09 3z"/><path fill="#b92932" d="M8.5 12h-2V7H0V5h6.5V0h2v5H15v2H8.5z"/><path fill="#b92932" d="M15 11.67 10 8v1l4.1 3h.9zM15 0h-.25L9.3 4h1.37L15 .82z"/></svg>

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g fill-rule="evenodd" clip-rule="evenodd" mask="url(#a)"><path fill="#f50100" d="M0 0h20v15H0z"/><path fill="#1a1a1a" d="m10.313 12.03-.005 1.47s-.684-1.195-.63-1.195.258-.395.341-.591-.181-.335-.226-.196c-.044.14-.225.337-.474.495s-.303-.238-.303-.331c0-.072.097-.068.25-.063q.07.004.152.004c.238 0 .26-.527.206-.662-.03-.076-.1 0-.208.117a2 2 0 0 1-.327.3c-.3.204-.466-.01-.466-.203 0-.108.062-.105.158-.102a.56.56 0 0 0 .274-.042c.235-.11.404-.568.363-.609-.033-.032-.224.08-.438.206l-.16.094c-.27.154-.382-.21-.382-.3 0-.088.253-.1.382-.1s.591-.282.859-.64c.267-.356.19-.78 0-.917-.133-.096-.224.041-.322.19a1.2 1.2 0 0 1-.14.184c-.08.081-.185.297-.283.498-.102.21-.195.402-.243.402-.093 0-.376-.301-.376-.301l-1.009.302s.417.226.554.226.191.248.191.301c0 .054-.228.132-.39.079-.16-.054-.062-.224-.062-.224l-.53-.304s-.411.148-.411.304c0 .157-.186.224-.406.224s-.191-.09 0-.38a.5.5 0 0 1 .095-.117h.046c.018.033.006.117.006.117s.59-.22.259-.148c-.102.022-.19.03-.265.032-.008-.014-.022-.018-.046 0a1.4 1.4 0 0 1-.201-.022l-.085-.01c-.088 0-.436-.204-.436-.204s.127-.13.436-.13.19.13.19.13h.737s-.33-.231-.438-.231c-.055 0-.13-.046-.205-.091-.073-.044-.145-.088-.196-.088-.103 0-.088-.233.103-.233.19 0 .406.165.406.233s.411.28.411.28l1.081-.28s-.158-.365 0-.365c.16 0 .662-.326.866-.733.204-.408.182-.598.073-.598s-.202.182-.202.26-.262.478-.324.565c-.06.087-.278-.087-.125-.299.136-.188.13-.47.126-.607V7.68c0-.11-.28.11-.28.501s-.616.539-.788.539 0-.315.327-.387c.258-.056.214-.391.184-.625a1 1 0 0 1-.015-.16c0-.191-.393.275-.546.519-.153.243-.788.828-.974.904s-.541-.166-.627-.34c-.062-.126.13-.15.396-.182a6 6 0 0 0 .309-.044c.4-.073.946-.857 1.05-1.008.103-.152-.154-.265-.294 0-.14.262-.825.51-1.05.59l-.004.002c-.22.08-.407-.28-.407-.44 0-.098.11-.078.284-.047.116.02.26.046.42.046.402 0 .897-.7.897-.874s-.22-.099-.377 0q-.059.04-.134.098c-.15.115-.342.262-.536.262-.26 0-.468-.185-.468-.185s-.086-.274.13-.274h.597c.319 0 .838-.676.838-.802 0-.069-.247.04-.502.155-.213.095-.433.193-.522.193-.197 0-.627-.183-.627-.348 0-.07 0-.102.016-.116.022-.02.075-.005.2-.005.097 0 .19.025.291.051.126.033.266.07.445.07.22 0 .405-.17.525-.28.057-.053.1-.092.124-.092.075 0-.075-.256-.22-.256-.06 0-.15.044-.255.095-.15.073-.33.16-.5.16-.289 0-.626-.46-.626-.584s.161-.079.407 0 .423.135.975 0c.551-.135.22-.335.079-.335H6.252c-.407 0-.407-.587-.407-.698v-.001c0-.083.086-.036.294.08l.2.109c.275.147.647.12.912.1q.114-.009.195-.01c.24 0-.14-.28-.14-.28s-.357 0-.968-.26c-.61-.259-.493-.969-.493-.969s.182-.253.304 0c.12.254.891.892 1.157.892.166 0 .161-.053.158-.097-.003-.027-.005-.051.032-.058.096-.018.87.243.87.243.315.023.363.488.363.764 0 .275.232.52.59.52.268 0 .16-.402.07-.737a3 3 0 0 1-.07-.297c-.045-.318-1.034-.502-1.034-.502-.35-.055-.293-.255-.293-.255.131-.005.323-.084.323-.084.211-.048-.869-.153-.869-.153-.24-.022-.14-.312-.14-.312 0-.131.103-.062.251.038.141.096.323.218.494.218.349 0-.102-.256-.228-.256h-.025c0-.004.307-.025.568-.177.162-.095.31-.038.5.036.166.064.363.14.63.14.325 0 .32.201.312.452-.005.191-.012.412.128.595.228.3.334.358.377.367.042-.009.148-.067.376-.367.14-.183.133-.404.128-.595-.008-.25-.013-.451.312-.451.267 0 .465-.077.63-.141.19-.074.338-.131.5-.036.261.152.568.173.568.176h-.025c-.126 0-.577.257-.228.257.17 0 .353-.122.494-.218.148-.1.251-.17.251-.038 0 0 .1.29-.14.312 0 0-1.08.105-.87.153 0 0 .193.079.325.084 0 0 .056.2-.294.255 0 0-.989.184-1.034.502-.012.08-.04.184-.07.297-.09.335-.198.737.07.737.358 0 .59-.245.59-.52 0-.276.048-.74.363-.764 0 0 .774-.26.87-.243.037.007.035.03.033.058-.004.044-.009.097.157.097.266 0 1.036-.638 1.157-.892.122-.253.304 0 .304 0s.117.71-.493.97-.968.26-.968.26-.38.28-.14.28q.081 0 .195.01c.265.02.637.046.913-.101q.114-.061.199-.11c.208-.115.294-.162.294-.08v.002c0 .11 0 .698-.407.698H13.32c-.14 0-.472.2.08.335s.729.079.974 0c.246-.079.407-.123.407 0s-.337.585-.627.585c-.17 0-.35-.088-.5-.16-.105-.052-.195-.096-.255-.096-.144 0-.294.256-.22.256.025 0 .068.039.125.092.12.11.305.28.525.28.18 0 .32-.037.445-.07.102-.026.194-.05.291-.05.125 0 .178-.016.2.004.016.014.016.046.016.116 0 .165-.43.348-.627.348-.089 0-.309-.098-.522-.193-.255-.114-.502-.224-.502-.155 0 .126.519.802.838.802h.597c.216 0 .13.274.13.274s-.209.185-.468.185c-.194 0-.386-.147-.536-.262a2 2 0 0 0-.134-.098c-.158-.099-.377-.175-.377 0s.495.874.896.874c.16 0 .305-.026.421-.046.174-.031.284-.05.284.046 0 .161-.187.52-.407.441l-.004-.001c-.225-.082-.91-.329-1.05-.591-.14-.265-.397-.152-.293 0 .103.151.649.935 1.05 1.008.106.019.211.032.307.044.266.032.46.056.397.183-.086.173-.44.415-.627.34-.186-.077-.821-.662-.974-.905-.153-.244-.546-.71-.546-.519 0 .041-.007.097-.015.16-.03.234-.074.569.184.625.327.072.5.387.327.387-.172 0-.789-.148-.789-.539 0-.39-.278-.61-.278-.5l-.001.045c-.004.138-.01.419.126.607.153.212-.064.386-.125.299-Line truncated
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#ea3323" d="M0 0h30v24H0z"/><path d="M23 15.8c-.42-.75-1.6-.18-2.22-.18.33-.29 1.18-.9 1.65-.9-.33-.29-.94-.05-1.18.23-.85 1-1.36.48-2.6.1 1-1.04-2.82-1.8-1.6-2.65.24-.19.66 1.47 1.32 1.18.29-.09-1.08-1.18-.37-1.41.23-.1 1.18 2.69 1.84 1.56.23-.43-1.47-.8-1-1.66-.32.62 4.16 2.93 3.6 1.42-.29-.7-3.03-.19-2.8-2.03-.04.47 3.17 1.98 2.84.61-.1-.33-3.26-.1-2.69-1.6.1-.24 2.79 1.84 2.7.33-.06-.57-2.89-.14-2.6-1.37 0-.05 2.92 1.23 2.6-.1-.06-.19-3.27.2-2.65-.94-.29.52 3.82.28 2.6-.76-.43-.33-2.22 1.28-2.6-.14.05.19 3.54-.28 2.55-1.27-.24-.29-2.46 1.46-2.5.33 0-.24 2.92-1.61 2.5-2.32-.52-.85-3.4 1.51-3.73 1.65-2.22 1.04 0 .43-1.09 1.75-.66.76-1.18-.42-.99-.94.38-1.09 2.64-.95 2.74-1.66-.33.24-.66.2-.95 0 .05 0 2.41-.33 1.6-.66-.08-.04-.37.14-.65.29.05-1.14-3.02-.29-3.35-.24 1.27 1.09-1.04.47.28 1.04q-.48.08-.9.42c.62.05-.33.76-.33.76s-.94-.66-.37-.8a1.6 1.6 0 0 0-.9-.43c1.32-.56-1 .05.28-1.04-.28 0-3.4-.9-3.35.24-.28-.14-.56-.28-.66-.28-.75.33 1.56.66 1.6.66q-.42.35-.94 0c.1.7 2.36.56 2.74 1.65.19.52-.33 1.7-1 .95-1.12-1.33 1.1-.71-1.08-1.75-.33-.14-3.2-2.5-3.73-1.66-.42.71 2.5 2.08 2.5 2.32-.09 1.13-2.26-.62-2.5-.33-.99.99 2.5 1.46 2.55 1.27-.33 1.42-2.17-.19-2.6.15-1.22.99 2.89 1.27 2.6.75.57 1.09-2.6.76-2.64.95-.33 1.32 2.6.04 2.6.09.28 1.28-2.55.8-2.6 1.37-.1 1.51 2.6-.52 2.69-.33.57 1.51-2.6 1.27-2.7 1.6-.37 1.42 2.89-.09 2.84-.6.24 1.83-2.5 1.31-2.78 2.02-.57 1.51 3.91-.8 3.58-1.41.48.85-1.22 1.22-.99 1.65.66 1.13 1.6-1.65 1.84-1.56.71.24-.66 1.32-.37 1.42.66.28 1.08-1.37 1.32-1.18 1.22.85-2.6 1.6-1.6 2.64-1.23.38-1.8.9-2.6-.1-.24-.28-.9-.47-1.18-.23.47 0 1.32.66 1.65.9-.62 0-1.8-.57-2.22.19.52-.24 1.7 0 2.22.04-.57.48-1.6.15-1.42 1.33.29-.95 3.12-1.66 3.45-.33.33-.62-1-.95-1.28-1.04.2-.05 2.41-.05 2.41-.05s1.23-2.4 1.8-1.84c1.32 1.41-2.18 2.22-2.32 2.5-.38.9 1.8.1 1.7.05.57.52-1.42.99-1.42 1.13.05 1 1.66-.38 1.75-.38.76.2-1.08 1.33-1.04 1.18-.14 1.04 1.6-.33 1.56-.56.19.28.19.52-.05.85-.61 1.08-.04 1.23.66 2.36.71-1.13 1.28-1.23.66-2.36a.8.8 0 0 1-.04-.85c-.05.23 1.74 1.6 1.55.56 0 .15-1.84-1.03-1.03-1.18.1 0 1.7 1.37 1.74.38 0-.19-2.03-.61-1.41-1.13-.05.05 2.07.9 1.7-.05-.1-.28-3.64-1.04-2.32-2.5.57-.62 1.8 1.84 1.8 1.84s2.22 0 2.4.05c-.28.1-1.65.42-1.27 1.04.33-1.37 3.16-.62 3.44.33.2-1.18-.84-.8-1.41-1.33.47 0 1.65-.23 2.17 0M19.27 4.66c-.28.14-.57.23-.75.19.14-.24.52-.48.75-.2m-1.5-.2c.46.1.46.24 0 .34q-.72-.2 0-.33m-7 .2c.24-.29.62-.05.76.19-.19.04-.47-.05-.75-.2m1.52.14q-.72-.2 0-.33.7.13 0 .33"/></svg>

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><path fill="#2e42a5" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/><mask id="b" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/></mask><g fill-rule="evenodd" clip-rule="evenodd" mask="url(#b)"><path fill="#e31d1c" d="M0 0v5h20V0z"/><path fill="#feca00" d="M0 10v5h20v-5z"/></g></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#102f9b" d="M0 8h30v8H0z"/><path fill="#c82a20" d="M30 8H0V0h30z"/><path fill="#e8ad3b" d="M30 24H0v-8h30z"/></svg>

Before

Width:  |  Height:  |  Size: 603 B

After

Width:  |  Height:  |  Size: 210 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><path fill="#1d1d1d" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/><mask id="b" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/></mask><g fill-rule="evenodd" clip-rule="evenodd" mask="url(#b)"><path fill="#f50100" d="M0 0v7.5h20V0z"/><g filter="url(#c)"><path fill="#fcff01" d="M9.719 8.37c.484-.599.636-1.373.636-1.856 0-2.573-3.211-3.997-3.211-3.997 2.208 0 4.666 1.79 4.666 3.997 0 .935-.32 1.802-.858 2.492.984.49 1.817.874 1.817.874.309.202.395.742.192 1.052a.67.67 0 0 1-.926.192s-.79-.467-1.271-.783a21 21 0 0 0-.748-.462 3.93 3.93 0 0 1-2.203.675s-2.936-.36-2.852-1.865c0 0 .71.543 2.802.543.332 0 .625-.046.881-.128-.905-.494-1.673-.886-1.673-.886-.31-.202-1.113-1.23-.91-1.538.202-.31 1.427.04 1.736.242 0 0 .43.59 1.036.951.268.16.57.328.886.497M8.238 6.127l-.631.42.201-.72-.463-.46.627-.025.266-.712.265.712h.626l-.462.485.232.678z"/><path fill="#ffea42" d="M9.719 8.37c.484-.599.636-1.373.636-1.856 0-2.573-3.211-3.997-3.211-3.997 2.208 0 4.666 1.79 4.666 3.997 0 .935-.32 1.802-.858 2.492.984.49 1.817.874 1.817.874.309.202.395.742.192 1.052a.67.67 0 0 1-.926.192s-.79-.467-1.271-.783a21 21 0 0 0-.748-.462 3.93 3.93 0 0 1-2.203.675s-2.936-.36-2.852-1.865c0 0 .71.543 2.802.543.332 0 .625-.046.881-.128-.905-.494-1.673-.886-1.673-.886-.31-.202-1.113-1.23-.91-1.538.202-.31 1.427.04 1.736.242 0 0 .43.59 1.036.951.268.16.57.328.886.497M8.238 6.127l-.631.42.201-.72-.463-.46.627-.025.266-.712.265.712h.626l-.462.485.232.678z"/></g></g></g><defs><filter id="c" width="8.111" height="8.717" x="4.959" y="2.517" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/><feOffset/><feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/><feBlend in2="BackgroundImageFix" result="effect1_dropShadow"/><feBlend in="SourceGraphic" in2="effect1_dropShadow" result="shape"/></filter></defs></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path d="M0 24h30V0H0z"/><path fill="#bc2833" d="M30 0H0v12h30z"/><path fill="#ffcb00" d="M11.6 10.6c.15.9.98 1.6 1.92 2.34l8.83 6.8c.36.28.43.68.19.96l-.04.03a.4.4 0 0 1-.33.1c-.54-.07-.56-.54-.7-.64l-1.52-1.05-.81-.55-6.47-4.15c-1.85-1.16-1.78-2.07-1.4-3.05zm-2.27 4.94a6.3 6.3 0 0 0 6.23.96l1.06.64c-.1.1-.4.25-.47.28l.17.66c-.4.14-.85.33-1.3.42l-.27-.67q-.64.15-1.29.15l-.09.7c-.4-.04-.9 0-1.36-.11v-.7a8 8 0 0 1-1.2-.3l-.33.6-.47-.2q-.38-.15-.73-.36l.25-.66a6 6 0 0 1-.86-.57zM16.05 3.8l.37-.61.61.29.6.32-.29.66c.37.24.82.6 1.06.89l.55-.43.47.5q.23.24.43.51l-.5.52c.32.47.45.69.68 1.23l.7-.16.18.52q.16.42.23.82l-.66.26c.07.28.15.75.17 1.18v.31l.7.1-.05.66q-.03.34-.09.67h-.72c-.1.44-.23.98-.4 1.39l.6.35-.28.61-.34.6-.66-.28a8 8 0 0 1-.84 1.04l.43.56-.34.32-1.41-1.1a6.4 6.4 0 0 0 2.35-4.92 6.3 6.3 0 0 0-5.01-6.17l.22-1.02c.4.08.86.25 1.24.38m-1.6 1.9L15 7.4h1.8l-1.45 1.07.56 1.72-1.47-1.05L13 10.2l.56-1.72L12.1 7.4h1.79z"/></svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 1023 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><path fill="#5196ed" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/><mask id="c" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/></mask><g fill-rule="evenodd" clip-rule="evenodd" filter="url(#b)" mask="url(#c)"><path fill="#fff" d="M5.448 4.934s1.29.707 1.47.903.467.915.915.508c.448-.406.897-.09.897-.738 0-.647.67-2.15 1.64-1.773.972.376 1.77.14 1.995.291.224.151.762.899 1.18.899.419 0 .628.436.658 1.069s-.135.693.254.768c.388.076.538.362.344.738-.195.377-.18.211-.15.603.03.391-.388 2.7-1.674 2.927-1.285.225-2.504.105-2.175-.332s.784-.94.112-1.045c-.673-.105-1.097-.195-1.77-.014-.672.18-1.374.467-1.793-.075-.418-.543-.328-.934-.672-1.19s-.763-.211-.419-.708.628-.311.344-.703-1.356-.562-1.356-.954-.681-1.25.2-1.174"/><path fill="#f5f8fb" d="M5.448 4.934s1.29.707 1.47.903.467.915.915.508c.448-.406.897-.09.897-.738 0-.647.67-2.15 1.64-1.773.972.376 1.77.14 1.995.291.224.151.762.899 1.18.899.419 0 .628.436.658 1.069s-.135.693.254.768c.388.076.538.362.344.738-.195.377-.18.211-.15.603.03.391-.388 2.7-1.674 2.927-1.285.225-2.504.105-2.175-.332s.784-.94.112-1.045c-.673-.105-1.097-.195-1.77-.014-.672.18-1.374.467-1.793-.075-.418-.543-.328-.934-.672-1.19s-.763-.211-.419-.708.628-.311.344-.703-1.356-.562-1.356-.954-.681-1.25.2-1.174"/></g></g><defs><filter id="b" width="11.889" height="9.466" x="3.997" y="2.774" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/><feOffset/><feGaussianBlur stdDeviation=".5"/><feColorMatrix values="0 0 0 0 0.0941176 0 0 0 0 0.32549 0 0 0 0 0.639216 0 0 0 0.43 0"/><feBlend in2="BackgroundImageFix" result="effect1_dropShadow"/><feBlend in="SourceGraphic" in2="effect1_dropShadow" result="shape"/></filter></defs></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#265fb5" d="M0 0h30v24H0z"/><path fill="#fff" d="M23.3 12.79c-.05-.44.67-1.55.1-1.47-.71.1-1.27-.39-1.5-.38.76-1.08.2-1.36.02-2.06-.3-1.23.66-1.84-1.06-2.1-1.11-.17-1.89-.06-2.22-1.33-.5.34-1.08.43-1.64.19-.35-.16-.46-.45-.8-.6-.25-.1-.78-.1-1.06-.15-.79-.12-1.19.22-1.89.1.07.11.08.24.13.35-.44.01-.7.3-.75.7-.63-.06-.79.77-.72 1.29l-.06.02.02.02c-.13 1.38-.69 2.06-2.1 2.28-.93.14-1.75-.47-2.55-.97a4 4 0 0 1-.65-.53c-.24-.26-.4-.63-.63-.82-.11-.08-.34-.16-.3.02-.15.91.52 2.05 1.28 2.49-1.05.48.27.77.46.94l.46.65c.07.44-.24.4-.27.75-.03.37-.03.66.1 1.03l-.03.03c0 .3-.22.19-.51.12.04.9.9.98 1.03 1.15.46.57.3 1.4.84 1.92 1.33 1.3 2.84.53 4.34.75.84.12 1.56.83 2.32.03.9.98-.7 2.15-.3 2.48q.16.12.34.14l-.07.18c1.08.1 2.21.36 3.22-.17 0 .16.1.35.11.44.25-.3.44-.28.76-.44.4-.2 1.08-.43 1.35-.82.3-.47-.18-1.12.8-.92.07-.34.1-.3.29-.53-.27-.67.53-1.13.77-1.61.05-.1.05-.56.12-.73.12-.32.46-.5.56-.91.18-.75-.25-.88-.31-1.53"/></svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><path fill="#f7fcff" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/><mask id="b" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/></mask><g fill-rule="evenodd" clip-rule="evenodd" mask="url(#b)"><path fill="#58a5ff" d="M0 0v5h20V0zm0 10v5h20v-5z"/><path fill="#ffd018" stroke="#f19900" stroke-opacity=".98" stroke-width=".5" d="M10.345 9.054s-.638 1.325-1.2 1.596c.243-.607.332-1.846.332-1.846s-1.458.577-1.97.472c.616-.43 1.47-1.226 1.47-1.226s-1.887-.617-1.84-.879c.851.153 2.022-.014 2.022-.014S7.836 5.57 7.97 5.452c.202.196 1.788 1.025 1.788 1.025s.115-1.412.456-1.888c.041.336.52 1.857.52 1.857s.963-.963 1.498-.963c-.235.29-.791 1.57-.791 1.57s1.385-.022 1.912.237c-.638.09-1.756.652-1.756.652s1.456 1.104 1.324 1.334c-.782-.382-1.686-.51-1.686-.51s.25 1.537.048 1.884c-.197-.511-.938-1.596-.938-1.596z"/><path fill="#ffd018" stroke="#f19900" stroke-opacity=".98" stroke-width=".5" d="M10.262 8.339a.625.625 0 1 0 0-1.25.625.625 0 0 0 0 1.25z"/></g></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#fff" d="M0 8h30v8H0z"/><path fill="#81acdc" d="M30 8H0V0h30zm0 16H0v-8h30z"/><path fill="#edb840" d="m18.51 11.94-.04-.01-1.94-.07.24-.09c.18-.06.35-.13.56-.1.32.02.54-.1.7-.19q.08-.05.15-.07.13-.03.2.01.06.03.1-.01.02-.02 0-.08-.09-.1-.37-.09l-.22.08c-.12.06-.27.12-.6.1q-.3-.04-.6.08-.12.05-.27.07l1.81-.83.04-.02q.03-.04.02-.08l-.03-.04h-.08l-1.82.68.2-.17q.18-.2.46-.31c.31-.1.47-.3.58-.44l.1-.12a.3.3 0 0 1 .2-.07q.07.01.1-.05 0-.03-.05-.06-.1-.07-.37.05l-.17.15c-.1.1-.2.22-.52.33-.25.08-.39.19-.51.3l-.23.17L17.5 9.6q.06-.05.02-.12l-.05-.02q-.05.01-.07.04l-1.42 1.32.11-.23q.1-.27.32-.47c.25-.21.32-.45.37-.63l.05-.15a.3.3 0 0 1 .15-.14q.07-.02.07-.08 0-.03-.06-.04-.14-.03-.32.19l-.1.2c-.05.14-.1.28-.36.5q-.24.2-.36.48l-.15.25.7-1.87q.03-.07-.04-.12h-.04l-.06.06-.8 1.76.01-.25q-.02-.29.11-.56c.15-.28.12-.53.1-.71v-.17a.3.3 0 0 1 .08-.18q.06-.05.03-.1-.01-.02-.07-.02-.14.03-.23.3-.02.12-.01.23c0 .14.01.3-.14.6q-.15.26-.15.57 0 .15-.04.29l-.08-2q0-.07-.07-.09-.04 0-.06.05l-.01.04-.07 1.94-.09-.24q-.11-.26-.1-.56a1.2 1.2 0 0 0-.19-.7l-.07-.14q-.03-.14.01-.2.04-.07-.01-.11-.03-.01-.07.01-.12.08-.1.36l.08.22c.06.13.13.27.1.6-.02.27.03.44.08.6q.05.13.07.28l-.83-1.82q-.04-.07-.1-.06-.04.02-.04.08v.04l.68 1.81-.17-.19q-.2-.19-.31-.47c-.1-.3-.3-.46-.44-.58l-.12-.1a.3.3 0 0 1-.07-.2q.01-.07-.05-.09-.03-.01-.06.04-.07.12.05.37l.15.17c.1.1.22.2.33.52.08.26.2.39.3.51q.1.11.17.24L12.6 9.5q-.05-.06-.12-.01-.03.03 0 .08l.02.03 1.32 1.42-.23-.11a1 1 0 0 1-.47-.31 1 1 0 0 0-.63-.37l-.15-.06a.3.3 0 0 1-.14-.15c-.02-.03-.04-.08-.08-.06q-.03 0-.04.06-.03.13.19.32l.2.1c.13.05.28.1.5.36.18.2.33.28.48.36q.13.05.25.14l-1.87-.69q-.07-.03-.12.03v.05q.04.05.06.05l1.76.81-.25-.02c-.2 0-.37 0-.56-.1a1 1 0 0 0-.71-.1h-.17q-.14-.02-.18-.08-.05-.06-.1-.03-.02 0-.02.07.03.14.3.22.11.02.23.02c.14 0 .3-.01.6.14.23.12.4.13.57.15q.14 0 .29.04l-2 .07q-.07 0-.09.08l.02.04q.05.04.07.03l1.94.07-.24.08q-.26.12-.56.11c-.32-.03-.54.1-.7.18l-.15.08q-.12.02-.2-.01-.06-.04-.1.01-.01.02.01.07.08.11.36.1l.22-.08c.13-.06.27-.13.6-.1.27.02.44-.03.6-.08q.12-.06.28-.08l-1.82.84q-.07.02-.06.1.02.04.07.04l.04-.01 1.82-.67-.19.16q-.19.21-.47.32c-.3.1-.46.3-.58.43l-.1.13a.3.3 0 0 1-.2.07q-.07-.01-.09.05-.01.02.04.06.1.07.37-.05l.17-.16c.1-.1.2-.22.52-.32.26-.08.39-.2.51-.3q.1-.09.24-.18l-1.36 1.47q-.06.05-.02.11l.02.02h.07l.03-.03 1.42-1.32-.11.23a1 1 0 0 1-.32.47c-.25.2-.31.45-.37.62l-.05.16q-.07.1-.15.14-.07.02-.06.08 0 .03.06.04.12.03.32-.2l.1-.2c.04-.13.1-.28.36-.5.2-.17.28-.32.35-.47l.15-.25-.7 1.87q-.01.08.04.12h.05q.05-.04.05-.06l.8-1.77v.26c-.01.19-.02.37-.12.56-.15.28-.12.53-.1.71l.01.17q-.02.13-.09.18-.05.05-.02.1 0 .02.07.02c.07-.02.18-.12.22-.3l.02-.23a1 1 0 0 1 .14-.6c.12-.24.13-.4.14-.57q0-.15.05-.3l.07 2q0 .09.07.1.05 0 .07-.06v-.04l.08-1.94.08.25q.12.26.11.55c-.03.33.1.54.18.7l.07.15c.03.09 0 .16 0 .2q-.04.07 0 .1l.03.01.05-.01c.06-.05.12-.18.09-.37l-.07-.21c-.06-.13-.13-.27-.1-.61q.01-.3-.09-.59l-.07-.28.83 1.81.03.04q.03.05.08.02l.03-.03q.02-.05 0-.08l-.68-1.82.17.2q.2.19.32.47c.1.3.29.46.43.58l.13.1a.3.3 0 0 1 .06.2q-.02.07.06.09.02 0 .06-.04.07-.12-.06-.37l-.15-.17c-.1-.1-.22-.2-.32-.53-.09-.25-.2-.38-.3-.5l-.18-.24 1.47 1.36q.05.06.11.01.03-.03.01-.08l-.02-.03-1.32-1.43.23.12c.17.08.33.15.47.31.2.25.45.32.62.37l.16.06q.11.07.13.15.03.05.07.06h.02q.02 0 .04-.06.03-.13-.2-.32l-.2-.1c-.13-.05-.28-.1-.5-.36a1.3 1.3 0 0 0-.47-.36l-.25-.14 1.87.69q.08.03.11-.03v-.05q-.03-.05-.06-.05l-1.76-.81.26.01c.19.01.37.02.55.12.29.15.54.12.72.1l.16-.01q.14.02.19.09l.07.03h.03q.02-.02.02-.08-.03-.14-.3-.22-.13-.03-.23-.02c-.14 0-.3.02-.6-.14a1.3 1.3 0 0 0-.58-.15q-.15 0-.29-.04l2-.07q.08 0 .1-.07 0-.06-.06-.07"/></svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#006233" d="M0 24h30V0H0z"/><path fill="#fff" d="M16.33 9.59q-.11-.05-.17-.17 0-.65-.06-1.27l-.02.04-.09.12c.05.31.06.8.07 1.22q.16.25.36.3h-.03l.03.15h.03v-.14h.09c.17 0 .36-.1.58-.21q.22-.12.52-.23c.03-.01.13-.13.03-.17l-.23-.05-.29-.07-.15-.05q-.16-.07-.36-.09c-.19-.02-.4.11-.37.33q.01.13.07.26l.01.04zm.3.03c-.21.05-.22-.07-.23-.18v-.06c-.03-.14 0-.29.18-.26q.37.1.7.23zm-1.58-.26q.26-.03.32-.2-.11-.22-.49-.21c-.32 0-.49.13-.51.29h.09c.11 0 .21 0 .25.1q-.4.17-.92.16c-.49.02-.61-.15-.74-.33L13 9.1l-.09-.03c-.08 0-.16.13-.23.26-.08.14-.16.29-.26.28-.14-.02-.15-.18-.17-.35q0-.11-.03-.19c-.05.29.06 1.39.66.2q.03-.05.06 0c.16.33.49.45.84.46q.45.01 1.07-.31l.04.04c.09.09.18.19.37.21q.12 0 .23-.03h.02v.08l.02-.09h.01q.24-.11.32-.32c.03-.11.04-.33-.09-.33s-.24.22-.27.48a.4.4 0 0 1-.48-.09zm.03-.16q-.1.03-.15.07l-.07-.04-.1-.06c.12-.05.23-.07.32.04m.55.18c.02-.11.04-.19.14-.25.02.12.03.19-.15.27zm-.37 3.16c0-.73-.02-1.56-.09-2.08.18-.18.12-.25.04-.36a1 1 0 0 1-.14-.25l-.04.12c-.05.14-.11.29-.03.4q.08 1.17.1 2.35c.06 0 .13-.14.16-.18"/><path fill="#fff" d="m17.55 9.9.02-.03zm0 0-.14.19.08.63q.16 1.06.19 2.16c-.62.56-.95-.13-.93-.67.85-.25.61-1.78-.08-1.17-.31.38-.02.49.55.45-.04.16-.26.36-.53.51a3 3 0 0 0-.3-.65l-.13.22.22.54q-.22.1-.42.13 0-.86-.08-1.7c.18-.2.1-.28.01-.38l-.14-.23-.04.13c-.04.14-.1.29-.01.4q.1.89.11 1.79c-.33-.01-.52-.26-.25-.96-.5.57-.27 1.2.25 1.23v.28q-.34.26-.63.38-.06-.18.05-.56-.21.35-.19.62l-.22.07c.24-.66-.29-.91-.82-.91-.13 0-.52.02-.73-.05q.17-.19.36-.29h.01c.36.38.89-.02 1.02-.31 0-.28 0-.75-.07-1.21.18-.2.11-.27.02-.38l-.13-.23c-.12.34-.08.7-.03 1.07q.07.37.05.76a1 1 0 0 1-.65.18c1.25-.51-.71-.89-.91-.13.21-.08.36 0 .51.1-.12.15-.27.4-.27.4l-.17-.2-.07-.1-.03.09a.4.4 0 0 0-.05.18l.06.09.03.05.09.12q-.15.27-.2.49c-.42.37-1.33.42-.96-.57-.66.91.32 1.4.93.85.05 1 1.42.98 1.87.27q.2-.03.41-.11c.19.32.8.26 1.45-.67 1.28 1.91 1.33-1.48.98-2.37 1.48 2.28.11 3.24-1.92 3.7 2.64.07 3.48-2.26 1.85-4.24M13 13.21c.18-.16.33-.38.33-.62q.21.08.64.08c-.18.58.14.87.61.88v.01c-.45.46-1.54.34-1.58-.35m.19-.59q.02.17-.12.28.04-.16.12-.28m3.35-.31v.03q.06.17.07.36c-.46.5-.94.76-1.19.64q.38-.19.63-.49v-.36l.01.01q.21-.04.48-.19m-2.7-.52-.22-.13c.07-.06.31-.1.4 0zm2.98-.71c-.29.13.16.22.19.12.03-.07-.09-.12-.19-.12m-2.77 1.59c-.06.43.25.71.72.65.34-.53-.26-.72-.72-.65"/><path fill="#fff" d="M14.21 10.31c.07.13.09.22.1.35-.04.17-.2.33-.37.34-.1 0-.22-.02-.3-.17q-.02-.05-.09-.04-.26.4-.48.39c-.18 0-.23-.08-.29-.16a.4.4 0 0 0-.25-.19c-.13 0-.33.11-.44.34-.41 1.05-.77 0-.62-.49.02.47.15.74.27.73.07 0 .14-.13.22-.28l.07-.13c.09-.16.31-.44.54-.44q.12.01.15.13c.05.1.1.22.35.22q.3 0 .58-.43.04.01.06.07v.02c.03.1.21.36.46.12v-.04q0-.08-.06-.12z"/><path fill="#fff" d="M12.55 11.28h-.04l-.13.12-.01.03.01.03.14.11h.04l.14-.11.01-.03.13.1h.04l.14-.11.01-.03-.01-.03-.15-.11h-.04l-.13.12-.01.03zm-.57-1.27h-.04l-.13.12-.01.03.01.03.14.11h.04l.14-.11.01-.03-.01-.03zm.06.35H12l-.13.12-.01.03.01.03.14.11h.04l.14-.11.01-.03-.01-.03zm2.32.62h-.04l-.12.09-.01.03.01.03.1.1h.04l.12-.08.02-.03-.01-.03zm-1.59-2.23h-.04l-.08.08-.01.03.01.03.09.07h.04l.09-.07.07.05h.04l.09-.07.01-.03-.01-.03-.1-.08h-.05l-.08.08zm4.5.87h-.04l-.08.06-.02.03.01.03.08.07h.04l.08-.06.01-.03-.01-.03z"/><path fill="#fff" d="M15 16.3c4.14.14 6.34-5 3.04-7.45 2.24 2.32.24 6.17-3.04 6.07-3.27.1-5.28-3.75-3.04-6.07-3.3 2.45-1.1 7.59 3.04 7.45"/><path fill="#fff" d="M15 4.64c-.24-.25-.31-.24-.2.12l-.04.02c-.28-.28-.73-.44-.99-.65-.37-.34 0 .5.14.63-.28-.11-.65-.15-.86-.25-.23-.14-.2 0-.12.21q.18.37.56.56c-.2.05-.42.15-.61.39-.03-.13-.15-.14-.27.03-.12.16-.42.29-.73.44-.52.25-1.24.56-1.02 1.02-.07.05-.15.12.14.19q-.21.07-.47.12c.24-.25.43-1.2-.03-.75-.46.35-.98.5-1.29 1.41 0-.2-.13-.6-.31-.25-.27.32-.71.54-.71 1.24-.43.3-1.08.96-.51 2.35.13.3.19-.02.29-.14 0 .14-.06.82.21.38.34-.45.92-.92.95-1.58.05-.53-.73.18-.86.4.04-.37 0-.69-.02-1.02.08.44.22.13.42-.08-.06.13-.41.86.03.59.45-.24 1.53-.86 1.26-1.53.49-.15 1.24-.57 1.38-1.1.49.02 1.53-.19 1.81-.72a2.4 2.4 0 0 0 1.58-.42c.08-.05.18-.18-.04-.13-.15.03-.41-.07-.61-.09l.09-.04c.58.13 1.09.13 1.66 0l.09.04c-.19.02-.45.12-.61.09-.21-.05-.12.07-.03.13.49.31 1.07.5 1.58.42.28.53 1.32.74 1.81.72.14.53.88.95 1.38 1.1-.26.67.81 1.29 1.26 1.53.44.27.09-.46.03-.59.2.21.34.53.42.08-.01.33-.06.65-.02 1.02-1.37-1.51-.86.3-.16.89q.16.16.24.3c.27.44.21-.24.21-.38.1.12.16.44.29.14.57-1.38-.08-2.05-.51-2.35 0-.7-.43-.92-.71-1.24-.19-.35-.31.05-.31.25-.3-.91-.83-1.06-1.29-1.41-.46-.45-.28.5-.03.75L19 7.36c.29-.07.21-.14.14-.19.31-.72-1.4-1.01-1.75-1.46-.12-.16-.24-.16-.27-.03a1 1 0 0 0-.61-.39c.24-.13.46-.31.56-.56.08-.21.12-.35-.12-.21-.22.1-.59.14-.86.25.13-.13.51-.97.14-.63-.26.2-.71.36-.99.65l-.04-.02c.11-.37.04-.37-.2-.12zM9.58 8.69c-.17.06-.41.14-.63.36q.13-.21.21-.47c.15.07.49.02.72-.06-.09.07-.16.13-.31.17zm3.02-2.1h-.24l.27-.24q.05.05.16.01c-.16.11-.17.14.03.22zm1.32-.57a2 2 0 0 0-.49.04q.17-.1.31-.22l.16.07zm2.31-.17-.13.06-.01.1Line truncated

After

Width:  |  Height:  |  Size: 7.0 KiB

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><path fill="#f7fcff" fill-rule="evenodd" d="M0 0h20v15H0z" clip-rule="evenodd"/><path fill="#3547a0" stroke="#e31d1c" stroke-width="1.25" d="M0-.625h-.625v7.692L-1.78 7.5l1.155.433v7.692H20l.22-1.21L1.78 7.5 20.22.585 20-.625z"/><path fill="#c44800" fill-rule="evenodd" d="M17.556 3.767s-5.04 1.309-5.04 1.51-.453.84-.36 1.006.334.387.532.277.668-.554.51-.277c-.157.277.85.598.425 1.21 0 0 .51-.294.263 1.377l1.213.346s1.356-.355.737-1.372h.718s-.297-1.318.143-1.561c.44-.244-.449-.429-.449-.429 1.878-1.069 1.308-2.087 1.308-2.087" clip-rule="evenodd"/><path fill="#ffc221" fill-rule="evenodd" d="m16.722 9.357-3.042-.515-.399-.533-1.727.348 1.516.859.51-.275 3.142.502z" clip-rule="evenodd"/><path fill="#ffc221" fill-rule="evenodd" d="M17.189 9.824v-.301l-3.41-.208s-.207-.19-.714-.19-.565.398-.565.398.29.58.855.58c.564 0 1.441.135 1.679.414.237.279 1.222-.143 1.222-.143s-.421-.724-.96-.497c-.54.226-1.518-.11-1.518-.232s3.411.18 3.411.18zm-5.761-2.44s-.33.709-.21.977c.528.551 1.488-.328 1.488-.328z" clip-rule="evenodd"/><path fill="#979797" fill-rule="evenodd" d="M16.642 7.722c.351-.18.53-.515.53-.95 0-.336-.08-.602-.256-.771v-.229l-.31-.003c-2.774-.025-4.336.25-4.789.936-.458.695-.418 1.288.205 1.576l.276-.007c1.347-.702 2.717-.877 4.126-.527zm-4.564-.845q.549-.832 4.525-.795v.079q.257.123.257.61c0 .487-.12.55-.36.673q-2.226-.553-4.347.553-.622-.288-.075-1.12" clip-rule="evenodd"/><path fill="#f7fcff" d="M16.603 6.082q-3.977-.037-4.525.795-.547.832.075 1.12 2.121-1.106 4.346-.553.36-.185.36-.673 0-.487-.256-.61v-.08z"/></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#00247d" d="M0 0h30v24H0z"/><path fill="#bd1721" d="m0 12 30 12V0z"/><path fill="#eee" d="M30 22.5v-21L3.5 12z"/><path fill="#d89500" d="M17.3 13.42s.72.11 1.01 0l.67-.23.56.6.23-.56.4.11-.03.19s.33.11.33.15l-.04.33 1.05.26.18-.4s.67.6.93.63c.27.04 1.05 0 1.2.11l.48.33s2.64.6 2.64.64-.03.26-.26.22c-.22-.04-3.65-.7-4.1-.86-.44-.14-1.11.15-1.11.15v-.4l-1.16-.34-.1.3h-.3l-.12.26-.4-.11.07-.56s-.34-.04-.48.07c-.15.11-.38.22-.38.22s-.22-.4-.56-.63z"/><path fill="#d89500" d="M21.1 15.4s5 .4 5.3.44.3.3 0 .33-5.3-.37-5.3-.37-.22.23-.22.3 1.98.11 1.98.11l-.19.19s.78.03 1.08-.04.33-.3.37-.22-.22.37-.15.37l.9-.08-.6.3.9.34s-.45.1-.64.1-.48-.07-.48-.07.3.41.52.49c0 0-.75-.19-.86-.3s.22.56-.45-.04-.67-.3-.67-.3l.23.38s-.56 0-.93-.23c-.38-.22-.82-.33-1.16-.44a5 5 0 0 1-.9-.37c-.25-.15-.81-.49-.7-.82.11-.34.56-.23.56-.23s.3-.07.52-.03c.22.03.37-.27.6-.15q.2.11.3.33"/><path fill="#fff" d="M26.28 9.62c.45.11 1.27-.04 1.64-.11s.63-.19.78-.04.11.23.11.23.23.1.23.22v.11s.15.26 0 .37c0 0 .15.41-.11.49 0 0 .18.33-.12.37l-.1.37-2.47-.41z"/><path fill="#66757f" d="m28.75 11.71-2.58-.43v-.06l.04-1.69.09.02a4 4 0 0 0 1.83-.16c.26-.06.48-.11.62.03q.14.15.14.24c.07.04.22.14.22.26v.1c.05.1.1.29 0 .4.03.09.07.27 0 .4l-.1.1c.03.07.06.19.02.28a.2.2 0 0 1-.16.12zm-2.44-.55 2.34.4.11-.37h.04q.11-.02.1-.05c.03-.06-.01-.18-.04-.22l-.04-.08.09-.02a.1.1 0 0 0 .08-.06c.05-.1 0-.28-.02-.33l-.02-.05.04-.03c.1-.08-.01-.28-.02-.29v-.14c0-.04-.1-.12-.19-.16l-.06-.03.03-.06s0-.05-.1-.15c-.08-.09-.23-.06-.5 0l-.22.06a5 5 0 0 1-1.58.13z"/><path fill="#ffc220" d="M23.64 13.68c-.02.03-.3.74-.45.86-.15.1-.48.37-.63.4s-.15.2-.15.2l-.45.25c-.1.08-.22.08.08.11.3.04.37.08.37.08s-.22.22-.15.33.38.13.75.23c.3.07.6-.04.6-.15 0-.12-.08-.41-.08-.37s.22-.12.44-.23c.23-.11.34-.37.26-.56q-.1-.29.19-.82c.29-.53-.04-.74-.22-.78-.19-.04-.49.26-.56.45"/><path fill="#9c3900" d="M20.73 10.55c.34-.22.64-.67.64-.67s-.11-.15-.52.04-.94.4-1.16.15c-.34-.4.16-.9.56-1.04 1.2-.41-.48-.86.93-1.5.6-.26 1.75-.44 1.97-.55.23-.11.56-.52.56-.49l.04.3s.82-.22 1.08-.33.48-.41.48-.41l.08.26s.67-.08.93-.26c.26-.19.45-.04.45-.04s.74-.18 1.04-.33.7-.23.63.03-.52 1.57-.7 1.83c-.2.26-.16.67-.38.86s-1.75 1.04-1.75 1.04.75.03 1.05.15c.3.1.14.48.14.48s.08.15.08.3-.19.18-.19.18.19.08.15.23-.37.15-.3.15.38.3.34.4c-.04.12-.63-.14-.9-.07 0 0 .04.19.26.3q.34.15.04.3c-.18.11-.37.26-.18.26.18 0 .26.11.14.19-.1.07.45 0 .12.26-.34.26-.41.26-.41.26s.33.4.18.44-.63-.22-.63-.22.11.37.3.48c0 0-.41.26-.64-.03 0 0 .04.4.15.52 0 0-.22.04-.4-.11 0 0-.16.3-.08.48l-.37-.6-.52-.14-.3.52s-.19-.38-.15-.71c.04-.34 0-.82-.04-1-.03-.2-.48-.71-.85-.79-.38-.07-1.08-.07-1.08-.07l-.86-1.05"/><path fill="#ffc220" d="M18.83 12.64s.79.26 1.05-.26-.64-.71-.97-.52c-.34.18-.6.52-.56.78s.37.37.37.37z"/><path fill="#fff" d="m18.76 11.93.19.45h.93s.85-.71 1.52-.75 1.16-.37.41-.4c0 0 1-.46-.07-.38 0 0 .7-.48-.23-.3 0 0 .82-.56-.26-.3l.12-.4s-.45.51-.75.66-1.23.6-1.45.67-.19.19-.22.38c-.04.18-.19.37-.19.37"/><path fill="#66757f" d="M19.9 12.44h-1l-.22-.52.03-.03a1 1 0 0 0 .17-.35l.01-.1c.02-.12.04-.25.26-.32.21-.07 1.12-.5 1.44-.67.28-.14.72-.65.72-.65l.2-.24-.16.6c.38-.08.49-.04.52.04q.03.11-.1.24.23-.02.29.09.03.11-.11.24.33 0 .35.12.03.13-.25.29.19.03.2.17c0 .19-.43.33-.84.35-.64.04-1.48.72-1.49.73zm-.9-.13h.85c.14-.11.91-.71 1.55-.75.43-.02.7-.16.72-.21 0 0-.06-.05-.31-.06l-.29-.01.27-.12c.17-.08.33-.18.37-.23a1 1 0 0 0-.42-.01l-.25.02.21-.15a1 1 0 0 0 .22-.2c-.02-.01-.12-.03-.4.03l-.32.07.28-.2a1 1 0 0 0 .26-.23c-.04-.01-.15-.02-.47.06l-.11.03.06-.25c-.16.17-.38.38-.57.48-.27.13-1.22.6-1.46.67-.14.05-.14.1-.16.21l-.02.11q-.05.2-.17.37z"/><path d="M19.64 11.56q.04.13-.13.22t-.25-.04q-.04-.12.12-.22c.16-.1.22-.04.26.04"/></svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#0039a6" d="M0 24h30V0H0z"/><path fill="#fff" d="M15 18a6 6 0 1 0 0-12 6 6 0 0 0 0 12"/><path fill="#ed2939" d="M15 17.72a5.72 5.72 0 1 0 0-11.44 5.72 5.72 0 0 0 0 11.44"/><path fill="#f9e300" d="M13.46 12c-.99-.59-1.46-1.78-1.46-3h.45v.04c0 .42.08 1.86 1.17 2.96a4.3 4.3 0 0 0-1.17 2.96V15H12c0-1.22.47-2.41 1.46-3"/><path fill="#f9e300" d="M12.61 9.04V9h.46v.05c0 .42.08 1.81.88 2.95a5.5 5.5 0 0 0-.88 2.95V15h-.46v-.04c0-.4.1-1.85 1.18-2.96a4.5 4.5 0 0 1-1.18-2.96"/><path fill="#f9e300" d="m14.11 12-.03-.04a5.4 5.4 0 0 1-.85-2.9V9h.46v.07c0 .44.05 1.77.58 2.93a8 8 0 0 0-.58 2.93V15h-.46v-.05c0-.41.05-1.67.85-2.91"/><path fill="#f9e300" d="M14.43 12a8 8 0 0 1-.58-3h.46v.14c0 .5.03 1.72.28 2.86a14 14 0 0 0-.28 3h-.46v-.07c0-.43.05-1.8.58-2.92"/><path fill="#f9e300" d="M14.76 12v-.02a14 14 0 0 1-.29-2.84V9h.45v6h-.45v-.14c0-.49.03-1.72.29-2.84m1.78-.02c.99-.59 1.46-1.78 1.46-3h-.45v.04A4.3 4.3 0 0 1 16.38 12a4.3 4.3 0 0 1 1.17 2.96V15H18c0-1.22-.47-2.41-1.46-3"/><path fill="#f9e300" d="M17.39 9.04V9h-.46v.05c0 .42-.08 1.81-.88 2.95.8 1.14.88 2.53.88 2.95V15h.46v-.04c0-.4-.1-1.85-1.18-2.96a4.5 4.5 0 0 0 1.18-2.96"/><path fill="#f9e300" d="m15.89 12 .03-.04c.8-1.24.85-2.5.85-2.9V9h-.46v.07c0 .44-.05 1.77-.58 2.93a8 8 0 0 1 .58 2.93V15h.46v-.05c0-.41-.05-1.67-.85-2.91"/><path fill="#f9e300" d="M15.57 12a8 8 0 0 0 .58-3h-.46v.14c0 .5-.03 1.72-.28 2.86.25 1.14.28 2.37.28 2.86V15h.46v-.07c0-.43-.05-1.8-.58-2.92"/><path fill="#f9e300" d="M15.24 12v-.02c.26-1.12.29-2.35.29-2.84V9h-.45v6h.45v-.14c0-.49-.03-1.72-.29-2.84"/></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><path fill="#f7fcff" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/><mask id="b" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/></mask><g fill="#c51918" fill-rule="evenodd" clip-rule="evenodd" mask="url(#b)"><path d="M0 0v5h20V0zm0 10v5h20v-5z"/></g></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#b92932" d="M30 24H0V0h30z"/><path fill="#fff" d="M0 8h30v8H0z"/></svg>

Before

Width:  |  Height:  |  Size: 576 B

After

Width:  |  Height:  |  Size: 166 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><path fill="#2e42a5" fill-rule="evenodd" d="M0 0h20v15H0z" clip-rule="evenodd"/><path fill="#2e42a5" d="M0 0h11v9H0z"/><mask id="b" width="11" height="9" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h11v9H0z"/></mask><g mask="url(#b)"><path fill="#f7fcff" d="M-1.253 8.125 1.223 9.21l10.083-8.03 1.306-1.614-2.647-.363-4.113 3.46-3.31 2.332z"/><path fill="#f50100" d="m-.914 8.886 1.261.63L12.143-.583h-1.77z"/><path fill="#f7fcff" d="M12.503 8.125 10.306 9.52-.056 1.18-1.362-.434l2.647-.363 4.113 3.46 3.31 2.332z"/><path fill="#f50100" d="m12.418 8.67-1.261.63-5.023-4.323-1.489-.483-6.133-4.921H.283l6.13 4.804 1.628.58 4.377 3.714z"/><mask id="c" width="13" height="11" x="-1" y="-1" fill="#000" maskUnits="userSpaceOnUse"><path fill="#fff" d="M-1-1h13v11H-1z"/><path fill-rule="evenodd" d="M6 0H5v4H0v1h5v4h1V5h5V4H6z" clip-rule="evenodd"/></mask><path fill="#f50100" fill-rule="evenodd" d="M6 0H5v4H0v1h5v4h1V5h5V4H6z" clip-rule="evenodd"/><path fill="#f7fcff" d="M5 0v-.938h-.938V0zm1 0h.938v-.938H6zM5 4v.938h.938V4zM0 4v-.938h-.938V4zm0 1h-.938v.938H0zm5 0h.938v-.938H5zm0 4h-.938v.938H5zm1 0v.938h.938V9zm0-4v-.938h-.938V5zm5 0v.938h.938V5zm0-1h.938v-.938H11zM6 4h-.938v.938H6zM5 .937h1V-.938H5zM5.938 4V0H4.063v4zM0 4.938h5V3.063H0zM.938 5V4H-.938v1zM5 4.062H0v1.875h5zM5.938 9V5H4.063v4zM6 8.062H5v1.876h1zM5.062 5v4h1.875V5zM11 4.062H6v1.875h5zM10.062 4v1h1.876V4zM6 4.938h5V3.063H6zM5.062 0v4h1.875V0z" mask="url(#c)"/></g></g><path fill="#f7fcff" d="m5.92 12.278-.82.758.081-1.113-1.104-.17.922-.63-.557-.968 1.068.327.41-1.039.41 1.039 1.068-.327-.557.968.922.63-1.104.17.081 1.113zm7.32-3.981-.547.505.054-.743-.735-.112.614-.42-.371-.646.712.218.273-.692.273.692.712-.218-.37.645.613.421-.735.112.054.743zm1.28-5.334-.547.506.054-.743-.735-.112.614-.42-.371-.646.712.218.273-.693.273.693.712-.218-.37.645.613.42-.735.113.054.743zm3.2 2.667-.547.505.054-.742-.735-.113.614-.42-.371-.646.712.218.273-.692.273.692.712-.218-.37.646.613.42-.735.113.054.742zm-2.56 7.667-.547.505.054-.742-.735-.113.614-.42-.371-.646.712.218.273-.692.273.692.712-.218-.37.646.613.42-.735.113.054.742zM17.4 9.14l-.555.291.106-.618-.45-.438.621-.09.278-.563.278.562.62.09-.449.439.107.618z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#061b65" d="M0 0h30v24H0z"/><path fill="#fff" d="m5.84 14.74.53 1.67 1.64-.62-.97 1.45 1.5.9-1.74.15.24 1.73-1.2-1.27-1.2 1.27.23-1.73-1.74-.15 1.5-.9-.96-1.45 1.63.62zm16.27 3.01.3.91.88-.34-.52.8.82.48-.95.08.13.95-.66-.7-.65.7.13-.95-.95-.08.82-.48-.53-.8.9.34zm-2.94-8.62.29.9.89-.33-.53.79.82.48-.95.09.13.94-.65-.69-.66.69.13-.94-.95-.09.82-.48-.53-.8.9.34zm3.26-6 .3.9.88-.33-.53.79.82.48-.95.09.14.94-.66-.69-.66.69.14-.94-.95-.08.82-.5-.53-.78.89.33zm4.7 3.69.3.9.88-.33-.52.79.82.48-.95.09.13.94-.66-.69-.65.69.13-.94-.95-.09.82-.48-.53-.8.9.34zM24.74 12l.23.56.61.05-.47.4.15.59-.52-.33-.52.33.15-.6-.47-.39.61-.04zM5.5 9.77V12h4V9.77L12.54 12H15v-1.24L11.24 8H15V4h-2.74L15 2V0h-1.44L9.5 2.98V0h-4v2.8L1.75 0H0v1.9L2.99 4H0v4h3.76L0 10.76V12h2.46z"/><path fill="#d22d32" d="m0 1 4.09 3h1.36L0 0zm0 11 5.45-4v1l-4.09 3z"/><path fill="#d22d32" d="M8.5 12h-2V7H0V5h6.5V0h2v5H15v2H8.5z"/><path fill="#d22d32" d="M15 11.67 10 8v1l4.1 3h.9zM15 0h-.25L9.3 4h1.37L15 .82z"/></svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><path fill="#5ba3da" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/><mask id="b" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/></mask><g fill-rule="evenodd" clip-rule="evenodd" mask="url(#b)"><g filter="url(#c)"><path fill="#ef2929" d="M3.546 4.975.808 4.397l2.772-.549.8-2.868.633 2.845 2.474.575-2.445.575-.706 2.34z"/><path fill="red" d="M3.546 4.975.808 4.397l2.772-.549.8-2.868.633 2.845 2.474.575-2.445.575-.706 2.34z"/></g><path fill="#fad615" d="M20 9H0v1h20zm0 2H0v1h20z"/></g></g><defs><filter id="c" width="8.681" height="8.335" x="-.192" y="-.02" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/><feOffset/><feGaussianBlur stdDeviation=".5"/><feColorMatrix values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.2 0"/><feBlend in2="BackgroundImageFix" result="effect1_dropShadow"/><feBlend in="SourceGraphic" in2="effect1_dropShadow" result="shape"/></filter></defs></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#4189dd" d="M0 0h30v24H0z"/><path fill="#f9d616" d="m0 15 30 .08v1.97H0v1.98h30V21H0z"/><path fill="#fff" d="M6.25 1.19a.26.26 0 0 1 .5 0l.96 3.1 3.1.96c.23.07.25.36.07.47l-.07.03-3.1.96-.96 3.1a.27.27 0 0 1-.47.07l-.03-.07-.96-3.1-3.1-.96a.27.27 0 0 1-.07-.47l.07-.03 3.1-.96z"/><path fill="#d21034" d="m6.5 2.5-.67 2.17a.2.2 0 0 1-.16.16L3.5 5.5l2.17.67q.08.03.14.1l.02.06.67 2.17.67-2.17q.03-.08.1-.14l.06-.02L9.5 5.5l-2.17-.67a.2.2 0 0 1-.13-.1l-.03-.06z"/></svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 562 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><path fill="#0061c1" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/><mask id="b" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/></mask><g mask="url(#b)"><path fill="#d21034" stroke="#ffce00" d="M6-.5h-.5v6h-6v4h6v6h4v-6h11v-4h-11v-6z"/></g></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#0464ae" d="M0 0h30v24H0z"/><path fill="#ffd500" d="M30 8H16V0H8v8H0v8h8v8h8v-8h14z"/><path fill="#db070d" d="M30 10H14V0h-4v10H0v4h10v10h4V14h16z"/></svg>

Before

Width:  |  Height:  |  Size: 566 B

After

Width:  |  Height:  |  Size: 250 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><path fill="#af0100" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/><mask id="b" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/></mask><g fill-rule="evenodd" clip-rule="evenodd" mask="url(#b)"><path fill="#3ca5d9" d="M0 0v5h20V0z"/><path fill="#73be4a" d="M0 10v5h20v-5z"/><path fill="#f7fcff" d="M10.726 9.317c-.842-.194-1.5-.856-1.492-1.828.008-.909.595-1.678 1.52-1.887.927-.209 1.741.232 1.741.232-.255-.567-1.143-.965-1.872-.963-1.357.003-2.804 1.039-2.818 2.62-.015 1.64 1.546 2.571 2.919 2.568 1.1-.003 1.624-.712 1.732-1.013 0 0-.888.465-1.73.27zm.535-.93.735-.51.735.51-.26-.856.714-.54-.895-.019-.294-.845-.294.845-.895.018.713.541z"/></g></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#dd4446" d="M0 8h30v8H0z"/><path fill="#52b4de" d="M30 8H0V0h30z"/><path fill="#649e3f" d="M30 24H0v-8h30z"/><path fill="#fff" d="M14.6 15.06a3.06 3.06 0 1 1 2.1-5.26 3.67 3.67 0 1 0 0 4.4 3 3 0 0 1-2.12.85"/><path fill="#fff" d="m17.85 9.96.4 1.1 1.04-.5-.5 1.05 1.1.4-1.1.38.5 1.05-1.05-.5-.39 1.1-.39-1.1-1.05.5.5-1.05-1.1-.39 1.1-.39-.5-1.05 1.05.5z"/></svg>

Before

Width:  |  Height:  |  Size: 975 B

After

Width:  |  Height:  |  Size: 457 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="21" height="15" fill="none"><mask id="a" width="22" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h21.25v15H0z"/></mask><g fill-rule="evenodd" clip-rule="evenodd" mask="url(#a)"><path fill="#2e42a5" d="M0 0h20.25v15H0z"/><path fill="#feca00" d="M6.25 0H19v15z"/><path fill="#f7fcff" d="m4.443 1.746-.735.386.14-.818-.594-.58.821-.119.368-.744.367.744.821.12-.594.58.14.817zm2.179 2.675-.735.386.14-.818-.594-.58.821-.118.368-.745.367.745.822.119-.595.58.14.817zm2.043 2.603-.735.386.14-.818-.594-.58.821-.119.368-.744.367.744.821.12-.594.58.14.817zm2.001 2.494-.735.387.14-.819-.594-.579.822-.12.367-.744.367.745.822.119-.595.58.14.818zm2.156 2.567-.735.387.14-.818-.594-.58.821-.12.367-.744.368.745.821.12-.594.579.14.818zm2.382 2.485-.735.386.14-.819-.594-.579.822-.12.367-.744.368.745.821.12-.594.579.14.818-.735-.387z"/></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#091c91" d="M0 0h30v24H0z"/><path fill="#f6ce46" d="M23 24 7 0h16z"/><path fill="#fff" d="m7.71 5.38 1.38-1H7.4l-.53-1.63-.53 1.62h-1.7l1.38 1L5.48 7l1.38-1 1.38 1zM5.47 0l-.86.63.53 1.62-1.38-1-1.38 1L2.9.63 2.04 0zm5.34 10.13 1.38-1h-1.7L9.94 7.5l-.52 1.62h-1.7l1.38 1-.53 1.63 1.38-1 1.38 1zm3.09 4.75 1.38-1h-1.7l-.53-1.63-.53 1.62h-1.7l1.37 1-.52 1.63 1.38-1 1.38 1zm3.1 4.75 1.38-1h-1.71L16.14 17l-.53 1.62h-1.7l1.38 1-.53 1.63 1.38-1 1.38 1zM20.6 24l.87-.63h-1.7l-.54-1.62-.52 1.62H17l.86.63z"/></svg>

Before

Width:  |  Height:  |  Size: 911 B

After

Width:  |  Height:  |  Size: 603 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g fill-rule="evenodd" clip-rule="evenodd" mask="url(#a)"><path fill="#2e42a5" d="M14 0h6v15h-6z"/><path fill="#feca00" d="M6 0h8v15H6z"/><path fill="#2e42a5" d="M0 0h6v15H0z"/><path fill="#000" d="M11.521 9.546c.396-.818.852-2.311.852-2.311l.346-1.028-1.372.497.325.188s-.566 1.131-.85 1.684c-.286.552-.314.187-.314.187l.049-3.855.315-.086-.785-1.507-1.001 1.528.44.012S9.49 8.923 9.43 8.763c-.034-.09-.125.19-.17.081-.278-.681-.658-2.002-.658-2.002l.222-.208-1.492-.307.445.918s.393 1.635.825 2.434c.097.252.566.36.566.36s.23-.233.286 0c.057.233 0 1.172 0 1.172h1.055s-.074-.886 0-1.172.304 0 .304 0 .612-.24.71-.493z"/></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#09207b" d="M0 24V0h30v24z"/><path fill="#f7cb4d" d="M10 0h10v24H10z"/><path d="M19.33 8.45a4 4 0 0 0-2.24 1.15c-.07.08.36-.09.4-.1.31-.09-.1.45-.12.6-.33 1.03-.6 2.03-.71 3.22q0 .13-.05.14l-1.08-.16V9.47c.25 0 .65.06.87.14A7 7 0 0 1 15 7.02c-.33.91-.67 1.86-1.4 2.59.22-.08.62-.15.87-.14v3.83l-1.08.16q-.05-.01-.05-.14c-.1-1.2-.38-2.2-.7-3.23-.03-.14-.44-.68-.12-.58.03 0 .46.17.39.1a4 4 0 0 0-2.23-1.16q-.14-.02-.05.1a11 11 0 0 1 1.98 5.98c.42 0 1.44-.25 1.86-.25v2.7h1.06v-2.7c.42 0 1.44.25 1.86.25 0-2.34.9-4.31 1.98-5.98q.09-.12-.05-.1"/></svg>

Before

Width:  |  Height:  |  Size: 826 B

After

Width:  |  Height:  |  Size: 644 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><path fill="#38a17e" d="M0 0h20v15H0z"/><path fill="#f72e45" fill-rule="evenodd" d="M7.5 11.25a3.75 3.75 0 1 0 0-7.5 3.75 3.75 0 0 0 0 7.5" clip-rule="evenodd"/></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#2d694f" d="M0 0h30v24H0z"/><path fill="#e13e47" d="M15 5a7 7 0 1 0 0 14 7 7 0 0 0 0-14"/></svg>

Before

Width:  |  Height:  |  Size: 383 B

After

Width:  |  Height:  |  Size: 191 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g fill-rule="evenodd" clip-rule="evenodd" mask="url(#a)"><path fill="#feca00" d="M6 0h8v15H6z"/><path fill="#e31d1c" d="M14 0h6v15h-6z"/><path fill="#1d1d1d" d="M0 0h6v15H0z"/></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#f8dc51" d="M9 0h12v24H9z"/><path d="M0 24V0h10v24z"/><path fill="#dd4446" d="M20 24V0h10v24z"/></svg>

Before

Width:  |  Height:  |  Size: 381 B

After

Width:  |  Height:  |  Size: 197 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><path fill="#5eaa22" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/><mask id="b" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/></mask><g fill-rule="evenodd" clip-rule="evenodd" mask="url(#b)"><path fill="#c51918" d="M0 0v7.5h20V0z"/><path fill="#feca00" d="m10.022 9.857-2.94 2.224.941-3.623-2.757-2.206h3.286l1.47-3.216 1.47 3.216h3.285l-2.786 2.209.97 3.62z"/></g></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#479d52" d="M30 24H0V12h30z"/><path fill="#dc3e36" d="M30 12H0V0h30z"/><path fill="#fcd116" d="m16.74 12.36 2.82-2.04h-3.48L15 7l-1.08 3.31h-3.48l2.82 2.05-1.08 3.32L15 13.63l2.82 2.05z"/></svg>

Before

Width:  |  Height:  |  Size: 693 B

After

Width:  |  Height:  |  Size: 289 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><path fill="#5eaa22" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/><mask id="b" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/></mask><g fill-rule="evenodd" clip-rule="evenodd" mask="url(#b)"><path fill="#f7fcff" d="M0 0v5h20V0z"/><path fill="#e22c18" d="M0 10v5h20v-5z"/></g></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#439571" d="M0 8h30v8H0z"/><path fill="#fff" d="M30 8H0V0h30z"/><path fill="#c63621" d="M30 24H0v-8h30z"/></svg>

Before

Width:  |  Height:  |  Size: 603 B

After

Width:  |  Height:  |  Size: 207 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><path fill="#e31d1c" d="M0 0h20v15H0z"/><path fill="#f7fcff" fill-rule="evenodd" d="M0 0h4.25L7.5 1.25 4.25 2.5 7.5 3.75 4.25 5 7.5 6.25 4.25 7.5 7.5 8.75 4.25 10l3.25 1.25-3.25 1.25 3.25 1.25L4.25 15H0z" clip-rule="evenodd"/></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#ea3323" d="M0 24V0h30v24z"/><path fill="#fff" d="M0 24V0h9l6 2.4-6 2.4 6 2.4-6 2.4 6 2.4-6 2.4 6 2.4-6 2.4 6 2.4L9 24z"/></svg>

Before

Width:  |  Height:  |  Size: 448 B

After

Width:  |  Height:  |  Size: 223 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><rect width="20" height="15" fill="#5eaa22" rx="1.25"/><mask id="b" width="30" height="19" x="-5" y="-2" fill="#000" maskUnits="userSpaceOnUse"><path fill="#fff" d="M-5-2h30v19H-5z"/><path fill-rule="evenodd" d="M10 7.5 20 0H0zm0 0L0 15h20z" clip-rule="evenodd"/></mask><path fill="#dd2c2b" fill-rule="evenodd" d="M10 7.5 20 0H0zm0 0L0 15h20z" clip-rule="evenodd"/><path fill="#fff" d="m20 0 .938 1.25 3.75-2.813H20zM0 0v-1.563h-4.688l3.75 2.813zm0 15-.938-1.25-3.75 2.813H0zm20 0v1.563h4.688l-3.75-2.813zm-.938-16.25-10 7.5 1.876 2.5 10-7.5-1.875-2.5zM0 1.563h20v-3.125H0zM10.938 6.25l-10-7.5-1.875 2.5 10 7.5zm-1.876 0-10 7.5 1.875 2.5 10-7.5-1.874-2.5zM0 16.563h20v-3.125H0v3.124zm20.938-2.813-10-7.5-1.876 2.5 10 7.5 1.875-2.5z" mask="url(#b)"/><path fill="#fff" fill-rule="evenodd" d="M10 11.25a3.75 3.75 0 1 0 0-7.5 3.75 3.75 0 0 0 0 7.5" clip-rule="evenodd"/><path fill="#dd2c2b" fill-rule="evenodd" d="m10.104 6.518-.734.386.14-.818-.594-.58h.821l.367-.863.368.864h.821l-.594.58.14.817zm-1.753 2.5-.734.386.14-.818-.595-.58h.822l.367-.863.368.864h.821l-.594.58.14.817zm3.5 0-.734.386.14-.818-.595-.58h.822l.367-.863.368.864h.821l-.594.58.14.817z" clip-rule="evenodd"/></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#62af3f" d="M0 0h30v24H0z"/><path fill="#b92932" d="M15 12 30 0H0zm0 0L0 24h30z"/><path fill="#fff" d="m27.5 0-8.9 7.2a6 6 0 0 0-7.2 0L2.5 0H0v2l9.53 7.55a6 6 0 0 0 0 4.9L0 22v2h2.5l8.9-7.2a6 6 0 0 0 7.2 0l8.9 7.2H30v-2l-9.53-7.54a6 6 0 0 0 0-4.92L30 2V0z"/><path fill="#b92932" d="M15.48 8.32 15 7.5l-.48.82h-.95l.48.83-.48.83h.95l.48.82.48-.82h.95l-.48-.83.48-.83zm3.05 5.37.47-.82h-.95l-.48-.83-.47.83h-.95l.47.82-.47.83h.95l.47.82.48-.82H19zm-5.63-.82-.47-.83-.48.83H11l.47.82-.48.83h.96l.48.82.47-.82h.95l-.47-.83.47-.82z"/></svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 630 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><path fill="#dd2c2b" fill-rule="evenodd" d="M0 0h20v15H0z" clip-rule="evenodd"/><path fill="#feca00" fill-rule="evenodd" d="M0 0v7.5h20V0z" clip-rule="evenodd"/><path fill="#5eaa22" d="M0 0h9v15H0z"/></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#d63034" d="M12 24V12h18v12z"/><path fill="#f6d44a" d="M30 12H12V0h18z"/><path fill="#3b8655" d="M0 24V0h12v24z"/></svg>

Before

Width:  |  Height:  |  Size: 422 B

After

Width:  |  Height:  |  Size: 215 B

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g fill-rule="evenodd" clip-rule="evenodd" mask="url(#a)"><path fill="#f50100" d="M14 0h6v15h-6z"/><path fill="#2e42a5" d="M0 0h8v15H0z"/><path fill="#f7fcff" d="M6 0h8v15H6z"/></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#fff" d="M0 0v24h30V0z"/><path fill="#ce1a24" d="M7.6 15s-.32.94-.24 1.88 2.26.86 2.73.78.78-.08.47.31-.7 1.01-.63 1.72c.08.7-.93.23-1.24-.47-.32-.7-.63-.7-1.18-1.02-.54-.3-1.07-1.1-1.4-1.56-.4-.54-.63-.93 1.48-1.64m14.04 0s.31.94.23 1.88-2.26.86-2.73.78-.78-.08-.47.31.7 1.01.63 1.72c-.08.7.93.23 1.25-.47s.62-.7 1.17-1.02c.54-.3 1.07-1.1 1.4-1.56.4-.54.63-.93-1.48-1.64"/><path fill="#f6e4be" d="M22.97 16.49c-.86.39-2.64.64-3.36.7-.95.07-1.1.31-1.1.54s1.02.4 1.57.32c.54-.08 1.17.08.23.62-.94.55-2.18 1.33-3.35 1.64s-2.34.23-2.34.23-1.17.08-2.35-.23c-1.17-.31-2.42-1.1-3.35-1.64s-.31-.7.23-.62c.55.08 1.56-.08 1.56-.32s-.14-.47-1.09-.54c-.71-.06-2.5-.31-3.36-.7-.36-.17-.46-.47-.46-.47s0 .16.07.62c.08.47.47.78.55 1.25s.08.7.47.78 1.25.16 1.25.16 0 .7-.16 1.09c-.15.39.4 1.1 2.5 1.87 2.1.78 3.04.7 4.14.7s2.02.08 4.13-.7 2.65-1.48 2.5-1.87c-.16-.4-.16-1.1-.16-1.1s.86-.07 1.25-.15c.4-.08.4-.31.47-.78.08-.47.47-.78.55-1.25.07-.46.07-.62.07-.62s-.1.3-.46.47"/><path fill="#bcad96" d="M11.18 20.62c.87.3 4.46 1.05 6.63.08.7-.31.94.62.32.86-.5.18-2.42.47-3.28.47s-3.22-.27-3.9-.55c-.4-.16-.24-1.01.23-.86"/><path fill="#666" d="M9.62 5.1h9.99v1.4H9.62z"/><path fill="#ce1a24" d="M14.62 6.03h-5v5.93c0 2.97 1.87 4.14 2.81 4.84s3.43.7 4.37 0 2.8-1.87 2.8-4.84V6.03z"/><path fill="#1353b4" d="M9.74 13.2c.44 2.08 1.9 3 2.69 3.6.94.7 2.19 1.17 2.19 1.17s1.24-.47 2.18-1.17c.8-.6 2.25-1.52 2.69-3.6zm-.12-7.17h9.99V9.7H9.62z"/><path fill="#eace23" d="M11.65 7.36s.08-.16 0-.4c-.07-.2-.39-.38-.39-.38s-.32.18-.39.39a.5.5 0 0 0 0 .39c-.39-.16-.55.23-.55.46s.32.4.32.4 0-.32.15-.32c.16 0 .16.31.16.31-.31 0 0 .24 0 .24l-.24.39.32-.08c-.08.23.23.47.23.47s.31-.24.23-.47l.32.08-.24-.4s.32-.23 0-.23c0 0 0-.3.16-.3.15 0 .15.3.15.3s.32-.15.32-.39c0-.23-.16-.62-.55-.46m6.71 0s.08-.16 0-.4c-.07-.2-.39-.38-.39-.38s-.32.18-.39.39a.5.5 0 0 0 0 .39c-.39-.16-.55.23-.55.46s.32.4.32.4 0-.32.15-.32c.16 0 .16.31.16.31-.31 0 0 .24 0 .24l-.23.39.3-.08c-.07.23.24.47.24.47s.31-.24.24-.47l.3.08-.23-.4s.32-.23 0-.23c0 0 0-.3.16-.3s.16.3.16.3.3-.15.3-.39c0-.23-.15-.62-.54-.46m-3.35 0s.07-.16 0-.4c-.07-.2-.4-.38-.4-.38s-.31.18-.39.39a.5.5 0 0 0 0 .39c-.39-.16-.54.23-.54.46s.31.4.31.4 0-.32.16-.32c.15 0 .15.31.15.31-.31 0 0 .24 0 .24l-.23.39.31-.08c-.08.23.24.47.24.47s.3-.23.23-.47l.31.08-.23-.39s.3-.23 0-.23c0 0 0-.32.15-.32.16 0 .16.32.16.32s.31-.16.31-.4c0-.23-.15-.62-.54-.46"/><path fill="#fff" d="m15.47 11.5.4-.55-1.1.3.31-1-.46.3-.47-.3.3 1-1.08-.3.39.54-.4.47 1.1-.39-.4 1.1.56-.32.54.31-.39-1.09 1.1.39z"/><path fill="#eace23" d="M15.47 15.7s-.23 0-.23.24.23.31.23.31-.15.24-.39.24c-.23 0-.3-.24-.3-.24s.3-.07.3-.23-.23-.24-.23-.24 0-.39-.23-.39-.24.4-.24.4-.23.07-.23.23.3.23.3.23-.07.24-.3.24c-.24 0-.4-.24-.4-.24s.24-.07.24-.3c0-.24-.23-.24-.23-.24 0-.32-.31-.16-.31-.16l.23 1.64h1.87l.24-1.64s-.32-.16-.32.16m-1.8-2.02s-.23 0-.23.23.24.31.24.31-.16.24-.4.24c-.22 0-.3-.24-.3-.24s.3-.07.3-.23-.22-.24-.22-.24 0-.38-.24-.38-.23.38-.23.38-.24.08-.24.24.31.23.31.23-.07.24-.3.24c-.24 0-.4-.24-.4-.24s.24-.07.24-.3c0-.24-.24-.24-.24-.24 0-.31-.3-.16-.3-.16l.22 1.64h1.88l.23-1.64s-.31-.15-.31.16m3.6 0s-.24 0-.24.23.24.31.24.31-.16.24-.4.24c-.23 0-.3-.24-.3-.24s.3-.07.3-.23-.23-.24-.23-.24 0-.38-.23-.38-.23.38-.23.38-.24.08-.24.24.31.23.31.23-.07.24-.3.24c-.24 0-.4-.24-.4-.24s.23-.07.23-.3c0-.24-.23-.24-.23-.24 0-.31-.31-.16-.31-.16l.23 1.64h1.88l.23-1.64s-.31-.15-.31.16m3.35-11.4-.15.47-.31-.08.07-.46-.78-.16-.08.5-.3-.1V1.9l-.79-.07-.06.48-.56-.1v.32h-.16v-.4h-.39v.32h-.23v-.4h-.4v.32l-.3-.08v-.7l-.78-.08v.47H15V1.5h-.78v.47h-.39V1.5l-.77.08v.7l-.32.08v-.31h-.39v.39h-.23v-.31h-.4v.39h-.15V2.2l-.56.1-.06-.5-.78.08v.57l-.3.08-.1-.5L9 2.2l.07.46-.3.08-.16-.47-.78.24.39 1.01.23-.08 1.17 2.58s1.33-.39 2.58-.55c1.24-.15 2.42-.15 2.42-.15s1.17 0 2.41.15c1.25.16 2.58.55 2.58.55l1.17-2.58.23.08.4-1.01z"/><path fill="#5e520d" d="M14.62 2.75a.3.3 0 0 0-.32.31v.78h.63v-.78a.3.3 0 0 0-.31-.3m-4.73.49a.3.3 0 0 0-.23.38l.2.75.6-.15-.2-.76a.3.3 0 0 0-.37-.22m9.45 0a.3.3 0 0 1 .23.38l-.2.75-.6-.15.2-.76a.3.3 0 0 1 .37-.22"/></svg>

Before

Width:  |  Height:  |  Size: 381 B

After

Width:  |  Height:  |  Size: 4.0 KiB

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><path fill="#af0100" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/><mask id="b" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/></mask><g mask="url(#b)"><path fill="#f7fcff" fill-rule="evenodd" d="M13.755 7.5c0 3.68.348 4.957 2.445 4.957s2.67-1.854 2.494-4.957h-4.94z" clip-rule="evenodd"/><path fill="#af0100" fill-rule="evenodd" d="M16.313 9.625c.586 0 1.062-.56 1.062-1.25s-.476-1.25-1.063-1.25c-.586 0-1.062.56-1.062 1.25s.476 1.25 1.063 1.25" clip-rule="evenodd"/><path fill="#5eaa22" fill-rule="evenodd" d="M14.246 11.446q.56 1.25 1.96 1.25 1.391 0 1.967-1.233z" clip-rule="evenodd"/><path fill="#82b2cb" d="m14.762 9.394-.349-.87q.961-.386 1.85-.387.89 0 1.852.387l-.35.87q-.8-.32-1.501-.32t-1.502.32"/><path fill="#feca00" fill-rule="evenodd" d="M15.625 10a.625.625 0 1 0 0-1.25.625.625 0 0 0 0 1.25" clip-rule="evenodd"/><path fill="#8a4e22" fill-rule="evenodd" d="M16 11a.625.625 0 1 0 0-1.25.625.625 0 0 0 0 1.25" clip-rule="evenodd"/><path fill="#af0100" fill-rule="evenodd" d="M15 10.5a.625.625 0 1 0 0-1.25.625.625 0 0 0 0 1.25m2.125 0a.625.625 0 1 0 0-1.25.625.625 0 0 0 0 1.25m-.437 1.375c.241 0 .437-.28.437-.625s-.196-.625-.438-.625c-.241 0-.437.28-.437.625s.196.625.438.625m-1.5 0c.241 0 .437-.28.437-.625s-.196-.625-.438-.625c-.241 0-.437.28-.437.625s.196.625.438.625" clip-rule="evenodd"/><path fill="#2e42a5" d="M0 0h11v9H0z"/><mask id="c" width="11" height="9" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h11v9H0z"/></mask><g mask="url(#c)"><path fill="#fff" d="M-1.253 8.125 1.223 9.21l10.083-8.03 1.306-1.614-2.647-.363-4.113 3.46-3.31 2.332z"/><path fill="#f50100" d="m-.914 8.886 1.261.63L12.143-.583h-1.77z"/><path fill="#fff" d="M12.503 8.125 10.306 9.52-.056 1.18-1.362-.434l2.647-.363 4.113 3.46 3.31 2.332z"/><path fill="#f50100" d="m12.418 8.67-1.261.63-5.023-4.323-1.489-.483-6.133-4.921H.283l6.13 4.804 1.628.58 4.377 3.714z"/><mask id="d" width="13" height="11" x="-1" y="-1" fill="#000" maskUnits="userSpaceOnUse"><path fill="#fff" d="M-1-1h13v11H-1z"/><path fill-rule="evenodd" d="M6 0H5v4H0v1h5v4h1V5h5V4H6z" clip-rule="evenodd"/></mask><path fill="#f50100" fill-rule="evenodd" d="M6 0H5v4H0v1h5v4h1V5h5V4H6z" clip-rule="evenodd"/><path fill="#f7fcff" d="M5 0v-.938h-.938V0zm1 0h.938v-.938H6zM5 4v.938h.938V4zM0 4v-.938h-.938V4zm0 1h-.938v.938H0zm5 0h.938v-.938H5zm0 4h-.938v.938H5zm1 0v.938h.938V9zm0-4v-.938h-.938V5zm5 0v.938h.938V5zm0-1h.938v-.938H11zM6 4h-.938v.938H6zM5 .937h1V-.938H5zM5.938 4V0H4.063v4zM0 4.938h5V3.063H0zM.938 5V4H-.938v1zM5 4.062H0v1.875h5zM5.938 9V5H4.063v4zM6 8.062H5v1.876h1zM5.062 5v4h1.875V5zM11 4.062H6v1.875h5zM10.062 4v1h1.876V4zM6 4.938h5V3.063H6zM5.062 0v4h1.875V0z" mask="url(#d)"/></g></g></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#b92932" d="M0 0h30v24H0z"/><path fill="#071b65" d="M0 0h15v12H0z"/><path fill="#f8f8f9" d="M17.99 15.11c0 .64.43 2.77 4.5 3.41 4.08-.64 4.5-2.77 4.5-3.41L27 7h-9z"/><path fill="#73af00" d="M22.5 18.51c3.4-.53 4.26-2.11 4.45-2.98h-8.91c.19.88 1.05 2.45 4.45 2.98z"/><path fill="#82afff" d="M25.29 11.48s.21-.21 0-.64l-2.79-.12-2.79.12c-.21.43 0 .64 0 .64-.21.21-.21.42-.21.42h.43l.46.76 2.11 1.15 2.11-1.15.46-.76h.43s0-.21-.22-.42z"/><path fill="#f8f8f9" d="M24.61 12.67s-.13-.29-.49-.26c0 0-.2-.26-.53-.19 0 0-.39-.22-.61.19 0 0-.71-.07-.75.47 0 0 1.11 1.66 1.13 1.67.03.02 1.32.01 1.32.01l.6-.66-.59-.84z"/><path fill="#f0c850" d="M22.53 13.19s-.94-1.52-1.07-1.65-.38-.24-.64-.03c0 0-.78-.06-.67.52l.22.89s-.2.61-.29.68l-.42.23.19.74 2.5-.12z"/><path fill="#965032" d="m23.56 12.53-.07-.16-.01-.02-.02-.01h-.04l-.46.2-.55-.9.03-.04v-.05q0-.03-.04-.05h-.06l-.12.04-.08-.24-.03-.03h-.04l-.03.03v.04l.08.25-.13.05-.04.04v.05q0 .03.03.05l.05.02h.01l.18 1.09-.12.05-.03.03v.04l.07.19-.01.15-.73-1.28.03-.05v-.05q0-.03-.04-.04h-.05l-.12.04-.08-.24v-.02l-.02-.01h-.04l-.02.01-.01.02v.04l.08.25-.13.05-.05.04v.06q.02.05.07.05l.32 2.02-.13.05s-.15.72-.03.75l1.29.4 1.66-.8c.04-.02.11-.53.11-.53l-.64-1.55zm-1.24-.85.54.9-.26.12-.34-1 .05-.02zm-.19.07h.04l.34.99-.2.09zm-.84.34.8 1.38a1 1 0 0 1-.25.39l-.59-1.76zm-.2.07.06-.02.6 1.8q-.14.12-.34.22z"/><path fill="#ff4b55" d="M25.24 10.47c-.04-.11-.32-.18-.35 0 0 0-.03-.02-.18-.01-.15 0-.12.25-.12.25q.02.02-.25-.06c-.2-.06-.33-.02-.33-.02l-.06-.18c-.16.07-.3 0-.33-.07-.03-.06.05-.15.05-.22s-.11-.07-.14-.14q-.05-.09.1-.15c.25-.14.15-.49-.11-.44.06.01.11.12.01.15s-.19-.33-.19-.33c.34.24.58-.14.36-.29-.1.16-.27.02-.17-.08.09-.1.1-.27.1-.27-.2.1-.33-.03-.33-.03.26-.18.19-.44.19-.44-.1-.05-.31 0-.31 0 .05-.09.04-.25.04-.25l-.24.05c.04-.12-.01-.34-.01-.34-.08.01-.23.06-.23.06-.06-.14-.24-.23-.24-.23s-.17.09-.24.23c0 0-.15-.05-.23-.06 0 0-.05.22-.01.34a.4.4 0 0 0-.24-.05s-.01.16.03.25c0 0-.21-.03-.31 0 0 0-.08.26.19.44 0 0-.12.12-.33.03 0 0 0 .17.1.27.09.1-.08.24-.17.08-.22.15.02.53.36.29 0 0-.09.35-.18.33-.1-.02-.05-.14.01-.15-.26-.05-.35.3-.11.44q.15.05.1.15c-.04.07-.14.06-.14.14s.08.16.05.22-.16.13-.33.07c0 0-.05.08-.06.18 0 0-.13-.05-.33.02q-.12.04-.25.06s.03-.25-.12-.25l-.18.01s-.03-.12-.16-.11a.2.2 0 0 0-.19.11c-.24-.08-.39.2-.2.33.11.06.39.29.39.29l.4.17 1.41-.62.74.19.74-.19 1.41.62.4-.17s.28-.24.39-.29c.19-.14.04-.41-.2-.33"/><path fill="#f8f8f9" d="M22.06 8.26s.02.19.3.14c0 0 0-.2-.3-.14"/><path fill="#ff4b55" d="M21.02 15.69s-.2 0-.41.15-.3.04-.51.04-.26.22-.26.22-.4.1-.24.39c.1.19.24.18.33.15 0 .12.02.26.17.29.27.05.39-.1.33-.33 0 0 .03.23.21.23s.3-.11.28-.35.3-.09.55-.45l-.47-.35z"/><path fill="#82afff" d="M19.85 16.54s-.12.16-.09.32c0 0-.27-.08-.12-.48 0 0 .18-.05.22.16zm.42.22s-.07.21.03.39c0 0-.34-.01-.27-.42 0 0 .11-.11.24.03m.33-.02s.06.17 0 .34c0 0 .27-.02.23-.41 0 0-.15-.05-.23.07"/><path fill="#ff4b55" d="M20.36 12.76c-.03-.2-1.32-.33-1.24.76-.08-.06-.36.36-.48.18 0 0 .01.24.31.23-.2.12.13.61-.09.75.24.02.26-.49.27-.63-.04.11.27.5.15.69.27-.02.17-.56.13-.72 0 0 .26.27.22.5.12 0 .04-.64-.06-.61 0 0 .88-.44.8-1.15zm4.03 3.07c.22.18.74-.09.76.26.34-.02.36.66-.09.55.07.43-.66.36-.5-.04.01.29-.57.32-.5-.12.02-.24-.3-.09-.55-.45l.47-.35s.2 0 .41.15"/><path fill="#82afff" d="M25.15 16.54s.12.16.09.32c0 0 .27-.08.12-.48 0 0-.18-.05-.22.16zm-.42.22s.07.21-.03.39c0 0 .34-.01.27-.42 0 0-.11-.11-.24.03m-.33-.02s-.06.17 0 .34c0 0-.27-.02-.23-.41 0 0 .15-.05.23.07"/><path fill="#ff4b55" d="M24.64 12.76c.03-.2 1.32-.33 1.24.76.08-.06.36.36.48.18 0 0-.01.24-.31.23.2.12-.13.61.09.75-.24.02-.26-.48-.27-.63.04.11-.27.5-.15.69-.27-.02-.17-.56-.13-.72 0 0-.26.27-.22.5-.12 0-.04-.63.06-.61 0 0-.88-.44-.8-1.15z"/><path fill="#ffe15a" d="M25.17 10.91s-.12-.02-.15.03c-.65.7-1.47-.73-2.08-.33-.26.12-.62.12-.88 0-.61-.41-1.44 1.03-2.08.33-.08-.11-.25 0-.18.12.4.61 1.3.09 1.68-.19.22-.15.5-.17.54.03q0 .03-.04.05c-.02-.25-.33-.06-.2.12.1.15.32.11.41-.04q.16-.04.31-.05s.15 0 .31.05c.13.26.58.08.39-.18-.07-.08-.2 0-.18.09q-.03-.01-.04-.06c.04-.2.33-.18.54-.03.37.29 1.28.8 1.68.19q.04-.09-.03-.15z"/><path fill="#82afff" d="m19.77 11.03-.03-.32c0-.08-.15-.14-.21-.06s-.07.22.24.37zm.05-.07s.21-.17.18-.26q-.04-.14-.16-.11c-.07.03-.1.19-.03.37zm.41-.14s.04-.18-.04-.19-.19.11-.19.27c0 0 .17-.02.23-.08m-.09.09c-.1.03-.19.11-.19.11s.18.13.3.09.06-.25-.1-.2z"/><path fill="#f8f8f9" d="M22.94 8.26s-.02.19-.3.14c0 0 0-.2.3-.14"/><path fill="#82afff" d="m25.23 11.03.03-.32c0-.08.15-.14.21-.06s.07.22-.24.37zm-.05-.07s-.21-.17-.18-.26q.04-.14.16-.11c.07.03.1.19.03.37zm-.41-.14s-.04-.18.04-.19.19.11.19.27c0 0-.17-.02-.23-.08m.09.09.19.11s-.18.13-.3.09-.06-.25.1-.2z"/><path fill="#464655" d="m22.39 8.7.09.08.03.01.03-.01.09-.08.01-.02v-.02l-.01-.02h-.21l-.01.02v.02l.01.02z"/><path fill="#464655" d="M22.34 9.05s-.06 0-.08-.02l-.07-.05-.04-.08v-.09q0-.03.04-.03.03 0 .03.04v.05l.03.05q.03.04.11.04c.09 0 .11-.1.11-.1v-.17q0-.02.04Line truncated

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><mask id="a" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h20v15H0z"/></mask><g mask="url(#a)"><path fill="#ffd221" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/><mask id="b" width="20" height="15" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" fill-rule="evenodd" d="M0 0v15h20V0z" clip-rule="evenodd"/></mask><g mask="url(#b)"><path fill="#313131" d="m-1.917 6.635 1.255-2.862 21.767 9.545-1.255 2.862z"/><path fill="#faf9f9" d="M-1.886 3.48-.63.62l22.849 10.014-1.255 2.863z"/><path fill="#cf1225" fill-rule="evenodd" d="M4.582 7.748c-.887-1.088-.739-1.824-.739-1.824s.908.034.898.619c0 .247.325.48.605.683.213.152.399.286.399.393 0 .249.187 2.756.187 2.756s-.13.229-.757.229c-.626 0-.593-.361-.593-.361.38-.466 0-2.495 0-2.495m10.836 0c.887-1.088.739-1.824.739-1.824s-.907.034-.897.619c0 .247-.326.48-.606.683-.212.152-.399.286-.399.393 0 .249-.187 2.756-.187 2.756s.13.229.757.229.594-.361.594-.361c-.38-.466 0-2.495 0-2.495zm-5.381-5.951.705.502-.462.124.462.399-.575-.146v.403h.575l.192.945-.223-.158-.222.158-.222-.158-.223.158-.229-.158-.229.158-.229-.158-.229.158.289-.945h.531V1.797h.09zm3.141 3.173s-.215.19-.675 0a3.3 3.3 0 0 1-.498-.29c-.35-.23-.73-.48-1.08-.411-.524.104-.757.354-.757.354v-.576h-.226v.576s-.233-.25-.757-.354c-.35-.07-.729.18-1.08.41a3.3 3.3 0 0 1-.498.29c-.46.19-.675 0-.675 0s0 .161.342.409c.149.107.319.1.463.056-.107.081-.159.176.012.252.354.158.936-.257 1-.304-.072.053-.775.581-.453.581.34 0 .889-.444.889-.444s-.667.64-.308.74c.228.063.5-.27.629-.467.004.042.042.067.084.095.054.036.113.076.113.158 0 .106.027.124.05.14.018.012.033.023.033.073v.146l-.083.122s0 .191.083.342c.063.115.031.211-.025.377a4 4 0 0 0-.058.183c-.083.288.083.78.083.78h-.083s.083.06.083.303c0 .198-.055.31-.159.522l-.078.163c-.155.328.154.745.154.745s-.518-.228-.414 0c.08.175.518.345.717.414v.033l.05-.016.048.016v-.033c.2-.07.638-.24.718-.414.103-.228-.415 0-.415 0s.31-.417.155-.745l-.08-.163c-.103-.212-.158-.324-.158-.522 0-.242.083-.303.083-.303h-.083s.166-.492.083-.78a4 4 0 0 0-.058-.183c-.056-.166-.088-.262-.025-.377.083-.151.083-.342.083-.342l-.083-.122v-.146c0-.05.016-.061.034-.073.023-.016.049-.034.049-.14 0-.082.06-.122.113-.158.042-.028.08-.053.085-.095.128.197.4.53.628.466.359-.1-.308-.739-.308-.739s.55.444.889.444c.322 0-.381-.528-.452-.581.064.047.645.462 1 .304.17-.076.118-.171.011-.252.145.043.314.051.463-.056.342-.248.342-.408.342-.408m-1.14.291s.146.117.335.173a1.6 1.6 0 0 0-.335-.173m-1.476.425c-.057-.075-.03-.007.043.106q.005-.039-.043-.106m-1.013 0c.056-.075.03-.007-.043.106q-.006-.039.043-.106m-1.477-.425s-.146.117-.335.173c.128-.096.335-.173.335-.173" clip-rule="evenodd"/><path fill="#cf1225" fill-rule="evenodd" d="M7.018 5.986s-.746 1.015-.663 2.1c.083 1.084.968 3.606 3.592 3.606h.068c2.78 0 3.57-2.782 3.57-3.782 0-1.009-.63-1.924-.63-1.924s.074 1.354 0 1.924c-.221 1.719-1.304 2.513-2.959 2.513-1.665 0-2.696-.824-2.978-2.513-.09-.546 0-1.924 0-1.924" clip-rule="evenodd"/><path fill="#cf1225" fill-rule="evenodd" d="M5.666 12.345s.135-.388.302-.388-.319-.337 0-.432c.318-.095.808.38.808-.095s-.414-.734-.11-.734c.305 0 .623-.09.623-.09s1.295 1.35 2.593 1.35c1.297 0 2.857-1.26 2.857-1.26s.575-.146.575.082-.126.572-.126.572.402-.079.607 0c.205.08 0 .46 0 .46v.147s.534-.118.534.092-.258.09-.78.15c-.521.06-.719.469-1.047.469s-.398-.323-.398-.323-1.016.55-2.222.55c-1.207 0-1.936-.55-1.936-.55s.114.565-.272.444c-.385-.121-.78-.89-1.243-.74s-.765.296-.765.296" clip-rule="evenodd"/><path fill="#f6e017" fill-rule="evenodd" d="M7.539 10.103q.031-.03.075-.078a1 1 0 0 1 .126-.128.4.4 0 0 1 .006.078q-.002.351.031.536.022.132.08.172c.058.04.117.005.171-.077.126-.188.361-.211.361-.14 0 .02-.007.04-.053.151l-.02.05a.4.4 0 0 0-.04.2c.011.08.07.124.164.124.106 0 .175-.068.252-.203l.036-.065.004-.007.033-.055c.028-.04.034-.036.096.11l.079.19.05.12c.04.095.069.152.099.191q.102.133.249.006l.066-.05c.013-.01.044-.03.074-.049l.065-.042c.057-.04.085-.07.084-.117 0-.058-.05-.095-.147-.131l-.045-.02-.017-.006.012-.005.004-.003a.8.8 0 0 1 .295-.052l.01.001q.004.002.003.022v.002a1 1 0 0 1-.036.167l-.009.036c-.03.12-.04.191-.018.254.031.091.12.123.256.096.185-.037.275-.11.299-.223a.4.4 0 0 0 .007-.094c0-.073 0-.073.063-.073.088 0 .123.031.16.118l.013.032c.043.104.083.15.174.15.06 0 .102-.026.095-.085a.1.1 0 0 0-.017-.046l-.007-.014-.013-.026c-.056-.114-.034-.202.16-.325.054-.036.14-.095.213-.147l.126-.087.005.069.003.082.002.04c.008.21.051.401.115.479.107.132.211.01.282-.28a2.8 2.8 0 0 1 .258-.697c.046-.078.09-.127.122-.142.022-.01.037-.002.06.038.085.155.215.298.326.34.164.063.26-.07.26-.365 0-.248.041-.446.108-.599a.7.7 0 0 1 .1-.165l-.071-.076a.7.7 0 0 0-.123.198 1.6 1.6 0 0 0-.116.642c0 .233-.046.296-.122.267-.084-.032-.199-.159-.273-.293-.047-.085-.116-.117-.19-.083q-.085.04-.169.183c-.1.169-.2.44-.27.726q-.043.187-.104.238c-.044-.055-.084-.227-.09-.415l-.002-.04-.004-.083-.006-.086c-.01-.06Line truncated
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><path fill="#f4e24e" d="M0 0h30v24H0z"/><path fill="#fff" d="M30 15 0 9V4l30 6z"/><path d="M30 20 0 14V9l30 6z"/><path fill="#bf2a2c" d="M14.19 17.96a4 4 0 0 1-1.8-.67q-.03.01-.03.14.02.29-.3.37c-.2.05-.51-.05-.76-.26a2 2 0 0 0-.82-.45 1.3 1.3 0 0 0-.93.12l-.09.04c-.04 0-.03-.23 0-.3q.1-.16.32-.24l.13-.07-.06-.12q-.14-.27.12-.46c.17-.13.46-.16.71-.06l.14.05q.05.01-.08-.19a.5.5 0 0 1-.12-.42.5.5 0 0 1 .45-.45c.2 0 .31.06.6.33a4.8 4.8 0 0 0 2.85 1.37c.27.03.81.02 1.13-.03a5 5 0 0 0 2.71-1.35c.21-.2.32-.25.49-.25q.21-.01.36.16a.5.5 0 0 1 .12.38l-.08.26q-.16.22.1.1c.25-.1.56-.05.73.1q.21.2.04.47l-.07.14c0 .02.03.03.18.05q.3.07.31.4 0 .13-.02.13l-.16-.06q-.3-.13-.64-.12-.21 0-.42.06-.34.12-.64.38c-.21.19-.35.25-.55.25q-.29 0-.4-.17c-.03-.06-.03-.1-.03-.22v-.16l-.16.1a2 2 0 0 1-.61.33 6 6 0 0 1-2.72.32"/><path fill="#bf2a2c" d="M14.54 16.49a4.5 4.5 0 0 1-3.24-1.85 5 5 0 0 1-.82-3.88c.13-.6.4-1.2.85-1.64a4.1 4.1 0 0 0 3.07 5.74c.65.2 1.33 0 1.96-.21a3.9 3.9 0 0 0 2.58-3.28c.11-.8-.02-1.62-.37-2.35.2.1.46.53.61.82.53 1.03.55 2.26.24 3.35a4.6 4.6 0 0 1-4.88 3.3M7.13 9.13c.15-.08.8.1.88.16.08.07.21.38.22.73q.16 0 .35.27c.14.16.34.47.55.53s.37.36.38.74c0 .37.01 2.34.04 2.47s.18.55.22.67c.05.13.07.15-.18.3s-1.39.13-1.6-.14c-.14-.2 0-.28.09-.38s.12-.33.15-.46.1-.27.12-.51-.02-1.32-.06-1.61-.71-.55-.87-.92-.5-1.76-.3-1.85m15.74 0c-.15-.08-.8.1-.88.16-.08.07-.21.38-.22.73q-.16 0-.35.27c-.14.16-.34.47-.55.53s-.37.36-.37.74c-.01.37-.02 2.34-.05 2.47s-.18.55-.22.67c-.05.13-.07.15.18.3s1.39.13 1.6-.14c.14-.2 0-.28-.09-.38s-.12-.33-.15-.46-.1-.27-.12-.51.03-1.32.06-1.61c.04-.3.71-.55.87-.92s.5-1.76.3-1.85"/><path fill="#bf2a2c" d="M17.65 7.76c-.5-.24-.94-.53-1.43-.6-.45-.05-.84.28-1.01.47v-.8l.1-.25.29.33.24-.27.4.25s-.32-.46-.3-1.04c0-.14-.35-.25-.78-.26v-.5l.72.33-.41-.55.55-.18-.83-.44q.1-.05.1-.11-.02-.13-.24-.14-.23.01-.25.14.01.08.14.12V5.6c-.42.02-.75.13-.75.26 0 0-.1.8-.33 1.08l.37-.34.25.3.28-.3.13.25v.77c-.18-.2-.56-.5-1-.44-.48.06-.92.35-1.42.59s-1.06.46-1.56.27c.06.65 1.66 1.3 2.16 1.45s1.1-.15 1.33-.23c.22-.07.31.14.25.32-.07.19.01.3.13.4q.03-.2.1-.22v.45a.7.7 0 0 0-.48-.2c.04.12.35.18.27.63-.08.46-.22.98 0 1.39-.27-.12-.37.07-.37.07s.38.13.27.5c-.1.38-.45 1.18.05 1.72-.43-.2-.62-.06-.76-.25 0 .48.7.79 1.03.79h.32c.32 0 1.04-.31 1.05-.79-.14.2-.33.05-.76.25.5-.54.14-1.33.04-1.71s.28-.51.28-.51-.1-.2-.37-.07c.22-.4.07-.93 0-1.39-.09-.45.23-.51.26-.63-.23-.01-.42.14-.5.21v-.48q.08.04.13.24c.11-.1.2-.22.13-.4s.02-.4.24-.32c.23.08.84.38 1.34.23.5-.16 2.1-.8 2.15-1.45-.5.2-1.04-.04-1.55-.27"/></svg>

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Loaded 100 of 1113 files, more files were not shown because too many files have changed in this diff. Show more