@qeetrix/icons 1.0.7 โ†’ 1.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,14 +1,16 @@
1
1
  <div align="center">
2
2
 
3
- # Qeetrix Icons
3
+ # ๐ŸŽจ Qeetrix Icons
4
4
 
5
5
  **The icon and brand logo library for Qeet Group products.**
6
6
 
7
- 1,863 Lucide icons in round and sharp shapes, 794 filled variants, and 7,429 brand logos, as
8
- tree-shakeable, fully typed React 19 components, all from one import.
7
+ 1,863 Lucide icons in **round** and **sharp** shapes, **775 filled** variants, **7,429 brand
8
+ logos** and the first-party **Qeet logo and wordmark**, as tree-shakeable, fully typed React 19 components, all from one import.
9
9
 
10
+ [![npm](https://img.shields.io/npm/v/@qeetrix/icons?style=flat-square&color=111111&label=npm)](https://www.npmjs.com/package/@qeetrix/icons)
11
+ [![CI](https://img.shields.io/github/actions/workflow/status/qeetgroup/qeetrix-icons/ci.yml?branch=main&style=flat-square&label=CI)](https://github.com/qeetgroup/qeetrix-icons/actions/workflows/ci.yml)
10
12
  ![Icons](https://img.shields.io/badge/icons-1%2C863-111111?style=flat-square)
11
- ![Filled](https://img.shields.io/badge/filled-794-111111?style=flat-square)
13
+ ![Filled](https://img.shields.io/badge/filled-775-111111?style=flat-square)
12
14
  ![Shapes](https://img.shields.io/badge/shapes-round%20%C2%B7%20sharp-111111?style=flat-square)
13
15
  ![Logos](https://img.shields.io/badge/brand%20logos-7%2C429-111111?style=flat-square)
14
16
  ![React](https://img.shields.io/badge/React-19-149ECA?style=flat-square&logo=react&logoColor=white)
@@ -28,72 +30,103 @@ import { TrashIcon, StarIcon, GithubLogo } from "@qeetrix/icons";
28
30
  ```
29
31
 
30
32
  > [!IMPORTANT]
31
- > **2.0 is unreleased.** It replaces the 1.x catalogue entirely: do not rely on any 1.x icon name,
32
- > prop, type, or import path. Versions already published to the registry are unchanged, and the
33
- > package version stays `1.0.4` until the major release (see [Releases](#releases)).
33
+ > **Versions 1.0.5 and later are a new library.** They replace the 1.0.0โ€“1.0.4 catalogue entirely
34
+ > with Lucide-based icons and brand logos. No earlier icon name, prop, type, or import path carries
35
+ > over. If you depend on the old set, pin `@qeetrix/icons@1.0.4` until you migrate.
34
36
 
35
37
  ---
36
38
 
37
- ## Contents
38
-
39
- - [Why Qeetrix Icons](#why-qeetrix-icons)
40
- - [At a glance](#at-a-glance)
41
- - [Installation](#installation)
42
- - [Icons](#icons)
43
- - [Brand logos](#brand-logos)
44
- - [Catalogue and search](#catalogue-and-search)
45
- - [Playground](#playground)
46
- - [Performance](#performance)
47
- - [How it is built](#how-it-is-built)
48
- - [Development](#development)
49
- - [Documentation](#documentation)
50
- - [Releases](#releases)
51
- - [License](#license)
52
-
53
- ## Why Qeetrix Icons
39
+ ## ๐Ÿ“‘ Contents
40
+
41
+ - [โœจ Why Qeetrix Icons](#-why-qeetrix-icons)
42
+ - [๐Ÿ“Š At a glance](#-at-a-glance)
43
+ - [๐Ÿ“ฆ Installation](#-installation)
44
+ - [๐Ÿš€ Quick start](#-quick-start)
45
+ - [๐ŸŽจ Icons](#-icons)
46
+ - [๐Ÿท๏ธ Brand logos](#๏ธ-brand-logos)
47
+ - [๐Ÿ”Ž Catalogue and search](#-catalogue-and-search)
48
+ - [๐Ÿ” Coming from lucide-react](#-coming-from-lucide-react)
49
+ - [๐Ÿ“ Design rules](#-design-rules)
50
+ - [๐Ÿงช Playground](#-playground)
51
+ - [โšก Performance and package size](#-performance-and-package-size)
52
+ - [๐Ÿ—๏ธ How it is built](#๏ธ-how-it-is-built)
53
+ - [โœ… Quality](#-quality)
54
+ - [๐Ÿ› ๏ธ Development](#๏ธ-development)
55
+ - [๐Ÿ“š Documentation](#-documentation)
56
+ - [๐Ÿšข Releases](#-releases)
57
+ - [โš–๏ธ License](#๏ธ-license)
58
+
59
+ ## โœจ Why Qeetrix Icons
54
60
 
55
61
  [Lucide](https://lucide.dev) is a superb outline icon set, and [theSVG](https://thesvg.org)
56
62
  collects thousands of brand logos. Qeetrix Icons turns them into one consistent, typed library for
57
63
  every Qeet product (Qeet ID, Qeet Pay, Qeet Logs, Qeet Notify, Qeet People, Qeet AI) and adds what
58
64
  neither provides:
59
65
 
60
- - **Filled variants.** Lucide is outline-only. 794 icons gain a filled drawing for selected,
66
+ - ๐ŸŒ“ **Filled variants.** Lucide is outline-only. 775 icons gain a filled drawing for selected,
61
67
  active, and favourite states, derived from the outline with Skia path operations and reviewed
62
- one by one.
63
- - **A complete sharp style.** Every icon, outline and filled, also comes with square caps,
68
+ one by one, category by category.
69
+ - ๐Ÿ”ท **A complete sharp style.** Every icon, outline and filled, also comes with square caps,
64
70
  mitered joins, and squared corners, behind a single `shape` prop.
65
- - **One API for everything.** Icons and logos share naming, sizing, accessibility defaults, and
71
+ - ๐Ÿงฉ **One API for everything.** Icons and logos share naming, sizing, accessibility defaults, and
66
72
  typing. A `variant` the icon or logo doesn't have is a compile-time error.
67
- - **Logos you can trust.** Every logo is embedded byte for byte as published, validated for
73
+ - ๐Ÿ›ก๏ธ **Logos you can trust.** Every logo is embedded byte for byte as published, validated for
68
74
  safety, labelled with the background it is drawn for, and carries its own license metadata.
69
- - **Searchable catalogues.** Tags, categories, Lucide's former names, RTL behaviour, logo
75
+ - ๐Ÿ”Ž **Searchable catalogues.** Tags, categories, Lucide's former names, RTL behaviour, logo
70
76
  collections, colours, and licenses, published as data for docs sites and pickers.
77
+ - ๐ŸŒฒ **Zero runtime cost you didn't ask for.** No runtime dependencies, no hooks, no side
78
+ effects: bundlers keep only the icons and logos you import.
71
79
 
72
- ## At a glance
80
+ ## ๐Ÿ“Š At a glance
73
81
 
74
82
  | | |
75
83
  |:--|:--|
76
- | **Icons** | 1,863 from Lucide 1.52.0, in 42 categories, with Lucide's names and tags |
77
- | **Shapes** | `round` (Lucide's drawing, the default) and `sharp`, for every icon |
78
- | **Variants** | `outline` for every icon; `filled` for 794 |
79
- | **Brand logos** | 7,429 from theSVG 3.3.12: brands, community, auth badges, AWS, Azure, Google Cloud, Kubernetes |
80
- | **Logo files** | 13,401 variants (default, mono, wordmark, light, dark, colour, โ€ฆ), embedded unmodified |
81
- | **Grid** | 24 ร— 24, 2-unit stroke, 1-unit padding, `currentColor` |
82
- | **Runtime** | React 19 peer dependency only; no runtime dependencies; no hooks |
83
- | **Module format** | ESM with TypeScript declarations; every module free of side effects |
84
-
85
- ## Installation
84
+ | ๐ŸŽจ **Icons** | 1,863 from Lucide 1.52.0, in Lucide's 42 categories, with Lucide's names and tags |
85
+ | ๐Ÿ”ท **Shapes** | `round` (Lucide's drawing, the default) and `sharp`, for every icon |
86
+ | ๐ŸŒ“ **Variants** | `outline` for every icon; `filled` for 775, in both shapes |
87
+ | ๐Ÿท๏ธ **Brand logos** | 7,429 from theSVG 3.3.12 (brands, community, auth badges, AWS, Azure, Google Cloud, Kubernetes), plus the first-party Qeet logo and wordmark |
88
+ | ๐Ÿ—‚๏ธ **Logo files** | 13,407 variants (default, mono, wordmark, light, dark, colour, โ€ฆ), embedded unmodified |
89
+ | ๐Ÿ“ **Grid** | 24 ร— 24, 2-unit stroke, 1-unit padding, `currentColor` |
90
+ | โš›๏ธ **Runtime** | React 19 peer dependency only; no runtime dependencies; no hooks |
91
+ | ๐Ÿ“ฆ **Module format** | ESM with TypeScript declarations; every module free of side effects |
92
+ | โ†”๏ธ **RTL** | 18 reading-direction concepts flagged `mirror` in the catalogue |
93
+ | โœ… **Tests** | 638 tests in 11 suites, including a packed-tarball consumer test |
94
+
95
+ ## ๐Ÿ“ฆ Installation
86
96
 
87
97
  ```bash
88
98
  bun add @qeetrix/icons
99
+ # or: npm install @qeetrix/icons
89
100
  ```
90
101
 
91
102
  React 19 is the only peer dependency. The package ships compiled ESM with type declarations, so
92
103
  it works in Vite, Next.js, TanStack Start, and React Server Components without extra setup.
93
104
 
94
- ## Icons
105
+ ## ๐Ÿš€ Quick start
106
+
107
+ ```tsx
108
+ import { BellIcon, SearchIcon, SettingsIcon, StarIcon } from "@qeetrix/icons";
109
+
110
+ export function Toolbar({ starred }: { starred: boolean }) {
111
+ return (
112
+ <nav className="flex items-center gap-3 text-zinc-700">
113
+ <SearchIcon size={20} />
114
+ <BellIcon variant="filled" aria-label="Notifications" />
115
+ <StarIcon variant={starred ? "filled" : "outline"} className="text-amber-500" />
116
+ <SettingsIcon shape="sharp" strokeWidth={1.5} />
117
+ </nav>
118
+ );
119
+ }
120
+ ```
121
+
122
+ - ๐ŸŽจ Icons draw in `currentColor`: they follow the text colour around them.
123
+ - ๐Ÿ“ `size` takes pixels or any CSS length; the default is 24.
124
+ - ๐Ÿ”ท Switch a whole UI to the sharp style by passing `shape="sharp"`, for example from your own
125
+ wrapper or theme.
126
+
127
+ ## ๐ŸŽจ Icons
95
128
 
96
- ### Shapes and variants
129
+ ### ๐Ÿ”ท Shapes and variants
97
130
 
98
131
  Every icon has two shapes, and some icons have two variants. Pick one with two props:
99
132
 
@@ -103,10 +136,11 @@ Every icon has two shapes, and some icons have two variants. Pick one with two p
103
136
  | **`shape="sharp"`** | `<StarIcon shape="sharp" />` | `<StarIcon shape="sharp" variant="filled" />` |
104
137
 
105
138
  Filled drawings exist only where the solid form is clean and meaningful: badges, toggles, nav
106
- items, devices, media, and many more. Open-line icons such as arrows, chevrons, and text marks are
107
- outline-only by design.
139
+ items, devices, media, files, people, and many more. Open-line icons such as arrows, chevrons,
140
+ and text marks, and icons whose outline is clipped open around a badge, are outline-only by
141
+ design.
108
142
 
109
- ### Props
143
+ ### ๐ŸŽ›๏ธ Props
110
144
 
111
145
  Every icon accepts the native `<svg>` props (including `ref`, `className`, `style`, and event
112
146
  handlers) plus:
@@ -119,16 +153,14 @@ handlers) plus:
119
153
  | `strokeWidth` | `number \| string` | `2` | Overrides the outline stroke (try 1.5 for dense UIs). |
120
154
  | `aria-label` | `string` | | Names the icon for assistive technology. |
121
155
 
122
- Icons draw in `currentColor`, so they follow the surrounding text colour: set `color` with CSS or
123
- a utility class.
124
-
125
156
  ```tsx
126
157
  <SearchIcon size={20} className="text-muted" />
127
158
  <BellIcon variant="filled" aria-label="Notifications" />
128
159
  <SettingsIcon shape="sharp" strokeWidth={1.5} />
160
+ <HeartIcon size="1.25em" style={{ color: "crimson" }} />
129
161
  ```
130
162
 
131
- ### Naming
163
+ ### ๐Ÿ”ค Naming
132
164
 
133
165
  Each icon is one named export: its Lucide name in PascalCase plus `Icon`. Categories never appear
134
166
  in names or import paths.
@@ -142,13 +174,13 @@ in names or import paths.
142
174
  Lucide's former names (`trash-2` for `trash`, for example) are listed in the catalogue for search
143
175
  and migration, but are not exported.
144
176
 
145
- ### Type safety
177
+ ### ๐Ÿงท Type safety
146
178
 
147
179
  `variant` is narrowed per icon, so asking for a drawing that doesn't exist fails at compile time:
148
180
 
149
181
  ```tsx
150
- <StarIcon variant="filled" /> // โœ“ star has a filled drawing
151
- <ArrowLeftIcon variant="filled" /> // โœ— type error: arrow-left is outline-only
182
+ <StarIcon variant="filled" /> // โœ… star has a filled drawing
183
+ <ArrowLeftIcon variant="filled" /> // โŒ type error: arrow-left is outline-only
152
184
  ```
153
185
 
154
186
  To accept any icon, for example in a button component, type the prop as
@@ -167,15 +199,16 @@ function ToolbarButton({ icon: Icon, label }: { icon: ComponentType<IconProps<"o
167
199
  }
168
200
  ```
169
201
 
170
- ### Accessibility and RTL
202
+ ### โ™ฟ Accessibility and RTL
171
203
 
172
204
  - Icons are **decorative by default**: `aria-hidden="true"` and `focusable="false"`. A non-empty
173
205
  `aria-label` or `aria-labelledby` turns an icon into `role="img"`. Explicit props always win.
174
206
  - Each icon's **directionality** is in the catalogue: `mirror` for reading-direction concepts
175
207
  such as undo, reply, send, log-in, and indentation, and `preserve` for everything else.
176
- Physical arrows and chevrons never mirror. See [docs/rtl.md](docs/rtl.md).
208
+ Physical arrows and chevrons never mirror. The library never flips an icon itself; your RTL
209
+ layer decides. See [docs/rtl.md](docs/rtl.md).
177
210
 
178
- ## Brand logos
211
+ ## ๐Ÿท๏ธ Brand logos
179
212
 
180
213
  ```tsx
181
214
  import { GithubLogo, SlackLogo, StripeLogo } from "@qeetrix/icons";
@@ -183,10 +216,11 @@ import { GithubLogo, SlackLogo, StripeLogo } from "@qeetrix/icons";
183
216
  <GithubLogo /> // the default file, 24 px tall
184
217
  <GithubLogo variant="wordmark" height={32} /> // any file the logo has
185
218
  <SlackLogo height="2em" aria-label="Slack" /> // CSS lengths work too
219
+ <StripeLogo variant="mono" loading="lazy" /> // native <img> props pass through
186
220
  ```
187
221
 
188
222
  Each logo renders its **published SVG file, unmodified**, as an `<img>`. Nothing in the artwork is
189
- converted or recoloured; a test proves all 13,401 files are embedded byte for byte. Because each
223
+ converted or recoloured; a test proves all 13,405 files are embedded byte for byte. Because each
190
224
  logo is its own image, logos never clash with each other's styles or ids, and they work in Server
191
225
  Components.
192
226
 
@@ -200,7 +234,56 @@ Components.
200
234
  Other native `<img>` props (`className`, `style`, `loading`, `decoding`, โ€ฆ) pass through. Logos
201
235
  keep their brand colours by design, so CSS cannot recolour them.
202
236
 
203
- ### Names and collections
237
+ ### ๐ŸŸ  The Qeet logo and wordmark
238
+
239
+ Qeet's own marks sit in the catalogue beside the third-party logos, each with a file for light
240
+ surfaces (`default`) and one for dark surfaces (`dark`):
241
+
242
+ | Component | What it is | `default` (light surfaces) | `dark` (dark surfaces) |
243
+ |:--|:--|:--|:--|
244
+ | `QeetLogo` | the Qeet "q" mark | graphite bowl, orange descender | white bowl, orange descender |
245
+ | `QeetWordmarkLogo` | **Qeet.** in a tile | graphite tile, white letters | white tile, graphite letters |
246
+
247
+ The wordmark also comes without the tile, as two more files: `plain` (graphite letters, for light
248
+ surfaces) and `plain-dark` (white letters, for dark surfaces), cropped to the letters themselves.
249
+
250
+ ```tsx
251
+ import { QeetLogo, QeetWordmarkLogo } from "@qeetrix/icons";
252
+
253
+ <QeetLogo aria-label="Qeet" /> // on light surfaces
254
+ <QeetLogo variant="dark" aria-label="Qeet" /> // on dark surfaces
255
+ <QeetWordmarkLogo height={28} aria-label="Qeet" /> // tile, on light surfaces
256
+ <QeetWordmarkLogo variant="dark" height={28} aria-label="Qeet" /> // tile, on dark surfaces
257
+ <QeetWordmarkLogo variant="plain" height={24} aria-label="Qeet" /> // no tile, on light surfaces
258
+ <QeetWordmarkLogo variant="plain-dark" height={24} aria-label="Qeet" />
259
+ ```
260
+
261
+ The wordmark is **Qeet.** set in Qeet Display Bold (Cal Sans UI Geo Bold, SIL OFL 1.1), kerned by
262
+ eye pair by pair, with the full stop in Qeet orange, and converted to outlines, so it renders the
263
+ same without the font. The tile is square-cornered and centred on the capitals. The stop is the
264
+ same orange in all four files. Use the tile where the mark must stand out on a busy or coloured
265
+ surface; use the plain letters in headers, footers and anywhere the surface is already calm.
266
+
267
+ An image cannot see your app's theme, so pick the file the same way your theme is picked. With a
268
+ class-based theme (`.dark` on `<html>`, as Qeetrix UI does), render both and let CSS show one:
269
+
270
+ ```tsx
271
+ <QeetLogo className="inline-block dark:hidden" aria-label="Qeet" />
272
+ <QeetLogo variant="dark" className="hidden dark:inline-block" aria-label="Qeet" />
273
+ ```
274
+
275
+ The same pattern works for `QeetWordmarkLogo`. The Qeetrix UI playground's **Brand** page
276
+ (`#/brand`) shows both in light and dark, at every size, and inside real app layouts.
277
+
278
+ If your theme follows the operating system instead, use `prefers-color-scheme` in your CSS the
279
+ same way. Prefer the class approach whenever the app has its own theme toggle, or the logo and
280
+ the page will disagree.
281
+
282
+ Both are first-party (`firstParty: true` in `config/brands.json`, licence class `first-party`):
283
+ their files in `icons/brand-icons/brands/qeet/` and `qeet-wordmark/` are kept across
284
+ `bun run sync:brands`, which replaces everything else in that folder. The Qeet name and mark are trademarks of Qeet Group.
285
+
286
+ ### ๐Ÿ—‚๏ธ Names and collections
204
287
 
205
288
  A logo's name is its slug in PascalCase plus `Logo`: `GithubLogo`, `GoogleCloudLogo`. Slugs that
206
289
  start with a digit get a `Brand` prefix (`Brand1passwordLogo`). Icons always end in `Icon` and
@@ -208,14 +291,14 @@ logos in `Logo`, so the two families never collide.
208
291
 
209
292
  | Collection | Logos |
210
293
  |:--|--:|
211
- | Brands | 4,691 |
212
- | Auth badges | 860 |
213
- | AWS architecture | 739 |
214
- | Azure architecture | 626 |
215
- | Community | 259 |
216
- | Google Cloud architecture | 214 |
217
- | Kubernetes architecture | 38 |
218
- | Unlisted | 2 |
294
+ | ๐Ÿข Brands | 4,693 |
295
+ | ๐Ÿ” Auth badges | 860 |
296
+ | โ˜๏ธ AWS architecture | 739 |
297
+ | โ˜๏ธ Azure architecture | 626 |
298
+ | ๐Ÿ‘ฅ Community | 259 |
299
+ | โ˜๏ธ Google Cloud architecture | 214 |
300
+ | โ˜ธ๏ธ Kubernetes architecture | 38 |
301
+ | ๐Ÿ—ƒ๏ธ Unlisted | 2 |
219
302
 
220
303
  theSVG's own `light` and `dark` labels are inverted for most logos, so the catalogue records the
221
304
  background each file is actually drawn for (`light`, `dark`, or `any`), measured from its colours.
@@ -228,7 +311,7 @@ background each file is actually drawn for (`light`, `dark`, or `any`), measured
228
311
  > see [licenses/third-party-logos.md](licenses/third-party-logos.md) and
229
312
  > [docs/logos.md](docs/logos.md#licensing-and-trademarks).
230
313
 
231
- ## Catalogue and search
314
+ ## ๐Ÿ”Ž Catalogue and search
232
315
 
233
316
  Machine-readable catalogues for docs sites, icon pickers, and tooling. They are never needed to
234
317
  render, and the package root never imports them.
@@ -261,7 +344,44 @@ const wordmarks = logoManifest.logos.filter(
261
344
  | `tags`, `aliases` | `aliases`, `hex` (brand colour) |
262
345
  | `directionality` | `license`, `website`, `guidelines`, `source` |
263
346
 
264
- ## Playground
347
+ ## ๐Ÿ” Coming from lucide-react
348
+
349
+ The artwork is Lucide's, so most screens move over with an import change:
350
+
351
+ | `lucide-react` | `@qeetrix/icons` |
352
+ |:--|:--|
353
+ | `import { Star } from "lucide-react"` | `import { StarIcon } from "@qeetrix/icons"` |
354
+ | `<Star size={20} strokeWidth={1.5} />` | `<StarIcon size={20} strokeWidth={1.5} />` (same props) |
355
+ | `<Star className="text-amber-500" />` | `<StarIcon className="text-amber-500" />` (same `currentColor`) |
356
+ | Outline only | Add `variant="filled"` where a filled drawing exists |
357
+ | Round only | Add `shape="sharp"` for the sharp style |
358
+ | Logos not included | `GithubLogo`, `SlackLogo`, โ€ฆ from the same package |
359
+
360
+ Names follow Lucide 1.52.0, so a few older lucide-react names differ (`Trash2` is `TrashIcon`
361
+ here); the catalogue's `aliases` field maps them. `absoluteStrokeWidth` is not supported.
362
+
363
+ ## ๐Ÿ“ Design rules
364
+
365
+ Every derived drawing follows the same rules, so families look alike and nothing surprises you at
366
+ 16 px.
367
+
368
+ | | Round filled | Sharp (outline and filled) |
369
+ |:--|:--|:--|
370
+ | ๐Ÿ“ **Footprint** | Same painted extent as the outline | Same drawing, square caps, mitered joins (miter limit 4) |
371
+ | ๐Ÿงฑ **Bodies and details** | Bodies solid; details cut as 2-unit negative lines | Small corner roundings become sharp corners; acute tips come to a point |
372
+ | โœ‚๏ธ **Cuts that reach an edge** | Run straight through, so parts separate cleanly (calendar header, file dog-ear, mail flap) | Identical to round: both shapes part the same way |
373
+ | ๐Ÿ”— **Attached parts** | Legs, handles, stands, cords stay joined | Line ends that stop on another stroke are trimmed so no cap pokes out |
374
+ | ๐ŸชŸ **Layers** | Front parts sit in a 1-unit gap (clipboard clip, copy's front sheet, wheels) | Same roles as round, part for part |
375
+ | ๐Ÿ”ฒ **Border** | Inside Lucide's 1-unit padding | Never crosses it: a corner that would is cut flat, minimally, symmetrically |
376
+ | โšช **Dots** | Round holes | UI dots square (ellipsis, bullets, keys, pips); figurative dots round (eyes, spots, drops) |
377
+ | ๐ŸŒฟ **Organic shapes** | As the outline | Circles, faces, animals, fruit, hands, and coastlines stay round |
378
+ | ๐Ÿ”ค **Letters** | As the outline | An A's apex stays level with the letters beside it |
379
+
380
+ Where no rule gives a clean result, a reviewed, hand-drawn override takes the derivation's place.
381
+ Full detail: [docs/filled.md](docs/filled.md), [docs/sharp.md](docs/sharp.md), and
382
+ [docs/design.md](docs/design.md).
383
+
384
+ ## ๐Ÿงช Playground
265
385
 
266
386
  An internal, unpublished playground for browsing and visual review, with separate **Icons** and
267
387
  **Logos** pages:
@@ -270,30 +390,33 @@ An internal, unpublished playground for browsing and visual review, with separat
270
390
  bun run playground
271
391
  ```
272
392
 
273
- - **Icons:** category sidebar, search across names, tags, and former names, Round/Sharp and
393
+ - ๐ŸŽจ **Icons:** category sidebar, search across names, tags, and former names, Round/Sharp and
274
394
  variant switches, size, stroke, and colour controls, and an inspector with every shape and
275
395
  variant, real-size previews, construction grid, light/dark surfaces, RTL preview, and copyable
276
396
  JSX.
277
- - **Logos:** collections, license and variant filters, a light/dark/transparent background
397
+ - ๐Ÿท๏ธ **Logos:** collections, license and variant filters, a light/dark/transparent background
278
398
  switch, cards at each logo's true aspect ratio, and an inspector with every file on the
279
399
  background it's drawn for, license warnings, and brand links.
280
- - **Everywhere:** a โŒ˜K command palette across icons and logos, shareable URLs, keyboard
400
+ - โŒจ๏ธ **Everywhere:** a โŒ˜K command palette across icons and logos, shareable URLs, keyboard
281
401
  navigation, and light and dark themes.
282
402
 
283
- ## Performance
403
+ ## โšก Performance and package size
284
404
 
285
- - **Production builds include only what you import.** Every module is free of side effects and
286
- the root is a list of static re-exports, so bundlers drop every unused icon and logo.
287
- - **One import, everything included.** Importing `@qeetrix/icons` gives you all icons and logos.
405
+ - ๐ŸŒฒ **Production builds include only what you import.** Every module is free of side effects and
406
+ the root is a list of static re-exports, so bundlers drop every unused icon and logo. Tests
407
+ bundle real consumers to prove it.
408
+ - ๐Ÿ“ฅ **One import, everything included.** Importing `@qeetrix/icons` gives you all icons and logos.
288
409
  In Node (server rendering, test runners) the first import therefore loads every module:
289
410
  measured cold on a development laptop, about 20 s and 360 MB with the logos, against about
290
411
  1.8 s for icons alone. It is paid once per process.
291
- - **Dev servers** that pre-bundle a dependency's root, such as Vite and Next.js, process the whole
412
+ - ๐Ÿ”ฅ **Dev servers** that pre-bundle a dependency's root, such as Vite and Next.js, process the whole
292
413
  package on the first start after installing or upgrading, then reuse their cache.
293
- - **Per-icon imports** are available when you need the leanest possible module graph:
414
+ - ๐Ÿชถ **Per-icon imports** are available when you need the leanest possible module graph:
294
415
  `import { TrashIcon } from "@qeetrix/icons/icons/trash"`.
416
+ - ๐Ÿ“ฆ **Package:** about 10.7 MB packed and 50.7 MB unpacked, almost all of it logo data. Only
417
+ compiled code and licenses ship; no source SVGs.
295
418
 
296
- ## How it is built
419
+ ## ๐Ÿ—๏ธ How it is built
297
420
 
298
421
  Every source file is written by a tool from a pinned upstream release, and everything generated
299
422
  is committed, validated in CI, and reproducible.
@@ -304,6 +427,7 @@ flowchart LR
304
427
  RO -->|derive:filled| RF["icons/round-filled"]
305
428
  RO -->|derive:sharp| SO["icons/sharp-outline"]
306
429
  SO -->|derive:sharp| SF["icons/sharp-filled"]
430
+ C["config/derived ยท config/overrides"] -.-> RF & SO & SF
307
431
  RO & RF & SO & SF -->|check:icons ยท generate| GI["src/generated/icons"]
308
432
  T["theSVG 3.3.12"] -->|sync:brands| B["icons/brand-icons"]
309
433
  B -->|check:brands ยท generate:logos| GL["src/generated/logos"]
@@ -311,22 +435,28 @@ flowchart LR
311
435
  GL --> P
312
436
  ```
313
437
 
314
- - **Filled drawings** are derived with CanvasKit (Skia) path operations from per-category recipes
438
+ - ๐ŸŒ“ **Filled drawings** are derived with CanvasKit (Skia) path operations from per-category recipes
315
439
  in [config/derived/](config/derived/README.md): bodies filled to the outline's painted extent,
316
- details cut as negative lines (running cleanly through the edge they reach), crossing lines
317
- cleared by a gap. A few hand-drawn, hash-stamped overrides in `config/overrides/` replace
318
- derivations that rules cannot get right. See [docs/filled.md](docs/filled.md).
319
- - **Sharp drawings** square corner roundings at their tangent intersections, point acute tips with
320
- a miter limit of 4, and keep circles, pills, and organic curves round. See
440
+ details cut as negative lines, crossing lines cleared by a gap. See
441
+ [docs/filled.md](docs/filled.md).
442
+ - ๐Ÿ”ท **Sharp drawings** square corner roundings at their tangent intersections, point acute tips,
443
+ and then fit the whole icon: nothing crosses the padding, no cap pokes past the stroke it ends
444
+ on, joined strokes form one corner, and mirror twins get the same cut. See
321
445
  [docs/sharp.md](docs/sharp.md).
322
- - **Logos** are copied byte for byte from a pinned theSVG commit, validated (no scripts, event
446
+ - โœ๏ธ **Overrides:** 78 hand-drawn replacements in `config/overrides/` cover the few drawings rules
447
+ cannot get right. Each is stamped with the SHA-256 of the outline it was drawn against, so a
448
+ Lucide upgrade flags it for review instead of silently drifting.
449
+ - ๐Ÿท๏ธ **Logos** are copied byte for byte from a pinned theSVG commit, validated (no scripts, event
323
450
  handlers, or external references), and embedded as lossless `data:` URIs. See
324
451
  [docs/logos.md](docs/logos.md).
325
452
 
326
- ### Repository layout
453
+ ### ๐Ÿ—ƒ๏ธ Repository layout
327
454
 
328
455
  ```text
329
- config/ Pinned upstream data and recipes (lucide.json, brands.json, filled.ts, โ€ฆ)
456
+ config/
457
+ derived/ Per-category tables: filled recipes and roles, keepRound, tipHeight
458
+ overrides/ Hand-drawn, hash-stamped replacements for derived drawings
459
+ lucide.json, brands.json, categories.ts, icon-system.ts, icon-metadata.ts, โ€ฆ
330
460
  icons/
331
461
  round-outline/ Lucide outlines, unchanged
332
462
  round-filled/ Derived filled drawings
@@ -345,7 +475,23 @@ tests/ Vitest suites, including a packed-tarball consumer test
345
475
  docs/ Design, API, pipeline, and process documentation
346
476
  ```
347
477
 
348
- ## Development
478
+ ## โœ… Quality
479
+
480
+ - ๐Ÿงพ **Validation:** every source SVG is checked against 24 rules (`QXI-*` codes): structure,
481
+ allowed elements and attributes, paint, the grid, naming, categories, duplicates, and that every
482
+ icon has all its drawings in both shapes. See [docs/validation.md](docs/validation.md).
483
+ - ๐Ÿ”ฒ **Border proof:** a test measures every sharp drawing with CanvasKit and fails if anything
484
+ paints past the padding where the round drawing doesn't. The few curved ends too short to trim
485
+ are listed with their measured overshoot, and none may get worse.
486
+ - ๐Ÿ” **Reproducibility:** `check:filled`, `check:sharp`, `check:generated`, and `check:logos` fail
487
+ if any derived or generated file differs from what the tools produce.
488
+ - ๐Ÿ“ฆ **Real consumers:** the package test packs the tarball, installs it in a fresh project,
489
+ typechecks strict consumers under `bundler` and `nodenext` resolution, renders icons in both
490
+ shapes, and bundles them to prove tree-shaking.
491
+ - ๐Ÿ‘€ **Visual review:** every filled and sharp drawing was reviewed by eye at 64, 24, and 16 px,
492
+ category by category. See [docs/visual-qa.md](docs/visual-qa.md).
493
+
494
+ ## ๐Ÿ› ๏ธ Development
349
495
 
350
496
  Bun only (1.3.14), strict TypeScript, ESM, Biome, and Vitest.
351
497
 
@@ -356,56 +502,61 @@ bun run lint && bun run typecheck && bun run test
356
502
 
357
503
  | Area | Commands |
358
504
  |:--|:--|
359
- | Quality | `lint`, `typecheck`, `test`, `build` |
360
- | Icons | `sync:lucide [version]`, `derive:filled`, `derive:sharp`, `generate` |
361
- | Icon checks | `check:icons`, `check:filled`, `check:sharp`, `check:generated` |
362
- | Logos | `sync:brands [commit]`, `generate:logos` |
363
- | Logo checks | `check:brands`, `check:logos` |
364
- | Playground | `playground`, `playground:build` |
505
+ | โœ… Quality | `lint`, `typecheck`, `test`, `build` |
506
+ | ๐ŸŽจ Icons | `sync:lucide [version]`, `derive:filled`, `derive:sharp`, `generate` |
507
+ | ๐ŸŽฏ One category | `derive:filled --category <id>`, `derive:sharp --category <id>` |
508
+ | โœ๏ธ Overrides | `stamp:override <file>` |
509
+ | ๐Ÿ” Icon checks | `check:icons`, `check:filled`, `check:sharp`, `check:generated` |
510
+ | ๐Ÿท๏ธ Logos | `sync:brands [commit]`, `generate:logos` |
511
+ | ๐Ÿ” Logo checks | `check:brands`, `check:logos` |
512
+ | ๐Ÿงช Playground | `playground`, `playground:build` |
365
513
 
366
514
  Ground rules:
367
515
 
368
- - **Never hand-edit tool-written files**: `icons/`, `config/lucide.json`, `config/brands.json`,
516
+ - ๐Ÿšซ **Never hand-edit tool-written files**: `icons/`, `config/lucide.json`, `config/brands.json`,
369
517
  `config/categories.ts`, `src/generated/`, `icon-manifest.json`, or `licenses/third-party-logos.md`.
370
518
  Change the inputs and rerun the tool.
371
- - **`sync:lucide` and `sync:brands` leave the repository consistent**: they re-derive and
519
+ - ๐Ÿ”„ **`sync:lucide` and `sync:brands` leave the repository consistent**: they re-derive and
372
520
  regenerate everything downstream.
373
- - **A missing or flawed outline belongs upstream** in Lucide; a filled or sharp result is changed
521
+ - โฌ†๏ธ **A missing or flawed outline belongs upstream** in Lucide; a filled or sharp result is changed
374
522
  through its category's file in [config/derived/](config/derived/README.md), an override, or the
375
523
  sharp rules.
376
- - **CI and the release gate run** lint, typecheck, tests, every `check:*` command, the build, and
524
+ - ๐Ÿค– **CI and the release gate run** lint, typecheck, tests, every `check:*` command, the build, and
377
525
  the playground build.
378
526
 
379
- ## Documentation
527
+ ## ๐Ÿ“š Documentation
380
528
 
381
529
  | Guide | |
382
530
  |:--|:--|
383
- | [API](docs/api.md) | Entry points, props, types, the catalogue schema, and versioning |
384
- | [Design](docs/design.md) | Grid, stroke, padding, and how filled and sharp drawings are formed |
385
- | [Filled drawings](docs/filled.md) | Roles, inference, recipes, and how to add a filled icon |
386
- | [Sharp style](docs/sharp.md) | Sharpening rules, exceptions, and parity |
387
- | [Brand logos](docs/logos.md) | Sync, catalogue, components, licensing, and performance |
388
- | [Lucide](docs/lucide.md) | What comes from Lucide, syncing, and upgrading |
389
- | [Naming](docs/naming.md) ยท [Accessibility](docs/accessibility.md) ยท [RTL](docs/rtl.md) | Conventions |
390
- | [Architecture](docs/architecture.md) ยท [Generation](docs/generation.md) ยท [Validation](docs/validation.md) | How the pipeline works |
391
- | [Visual QA](docs/visual-qa.md) ยท [Contributing](docs/contributing.md) ยท [Releases](docs/releases.md) | Process |
531
+ | ๐Ÿงฉ [API](docs/api.md) | Entry points, props, types, the catalogue schema, and versioning |
532
+ | ๐Ÿ“ [Design](docs/design.md) | Grid, stroke, padding, and how filled and sharp drawings are formed |
533
+ | ๐ŸŒ“ [Filled drawings](docs/filled.md) | Roles, inference, recipes, overrides, and how to add a filled icon |
534
+ | ๐Ÿ”ท [Sharp style](docs/sharp.md) | Sharpening rules, fitting, kept-round elements, letter heights |
535
+ | ๐Ÿท๏ธ [Brand logos](docs/logos.md) | Sync, catalogue, components, licensing, and performance |
536
+ | ๐Ÿชถ [Lucide](docs/lucide.md) | What comes from Lucide, syncing, and upgrading |
537
+ | ๐Ÿ”ค [Naming](docs/naming.md) ยท โ™ฟ [Accessibility](docs/accessibility.md) ยท โ†”๏ธ [RTL](docs/rtl.md) | Conventions |
538
+ | ๐Ÿ—๏ธ [Architecture](docs/architecture.md) ยท โš™๏ธ [Generation](docs/generation.md) ยท ๐Ÿงพ [Validation](docs/validation.md) | How the pipeline works |
539
+ | ๐Ÿ‘€ [Visual QA](docs/visual-qa.md) ยท ๐Ÿค [Contributing](docs/contributing.md) ยท ๐Ÿšข [Releases](docs/releases.md) | Process |
392
540
 
393
541
  The full index is [docs/README.md](docs/README.md).
394
542
 
395
- ## Releases
543
+ ## ๐Ÿšข Releases
396
544
 
397
- The package version stays `1.0.4` for now. The existing workflows patch-bump pull requests and
398
- publish on merge to `main`, so keep 2.0 off `main` until the major release is prepared, or it
399
- could ship as an incompatible 1.x patch. Read [docs/releases.md](docs/releases.md) before any
400
- release work.
545
+ - ๐Ÿท๏ธ **Published on npm** as [`@qeetrix/icons`](https://www.npmjs.com/package/@qeetrix/icons),
546
+ with signed provenance from GitHub Actions, and as a GitHub Release for each version.
547
+ - ๐Ÿ”ข **Versioning:** the Version workflow raises the patch version on every pull request unless
548
+ it is already raised; merging to `main` publishes that version, tags it, and opens the GitHub
549
+ Release. A Rollback workflow moves the `latest` tag back to an earlier version.
550
+ - ๐Ÿ“ **Changes** are recorded in [CHANGELOG.md](CHANGELOG.md). Read
551
+ [docs/releases.md](docs/releases.md) before any release work.
401
552
 
402
- ## License
553
+ ## โš–๏ธ License
403
554
 
404
- - **Package code:** MIT ยฉ Qeet Group.
405
- - **Icons:** the artwork, the derived filled and sharp drawings, and the generated icon components
555
+ - ๐Ÿ’ป **Package code:** MIT ยฉ Qeet Group.
556
+ - ๐ŸŽจ **Icons:** the artwork, the derived filled and sharp drawings, and the generated icon components
406
557
  are based on [Lucide](https://lucide.dev), ISC ยฉ Lucide Icons and Contributors. Some Lucide icons
407
558
  derive from Feather, MIT ยฉ Cole Bemis.
408
- - **Brand logos:** each logo keeps its own license (public domain, permissive, attribution,
559
+ - ๐Ÿท๏ธ **Brand logos:** each logo keeps its own license (public domain, permissive, attribution,
409
560
  share-alike, no-derivatives, non-commercial, copyleft, or none), listed in
410
561
  [licenses/third-party-logos.md](licenses/third-party-logos.md). theSVG's own code is MIT ยฉ
411
562
  thesvg.org. Logos are trademarks of their owners, shown for identification only.
@@ -413,7 +564,7 @@ release work.
413
564
  `package.json` declares `"license": "SEE LICENSE IN LICENSE"`; the full notices are in
414
565
  [LICENSE](LICENSE).
415
566
 
416
- ### Acknowledgements
567
+ ### ๐Ÿ™ Acknowledgements
417
568
 
418
569
  Built on [Lucide](https://lucide.dev) and [Feather](https://feathericons.com) for the icons,
419
570
  [theSVG](https://thesvg.org), [Simple Icons](https://simpleicons.org),
@@ -5744,6 +5744,8 @@ export { QatarAirwaysLogo } from "./logos/qatar-airways.js";
5744
5744
  export { QatarEnergyLogo } from "./logos/qatar-energy.js";
5745
5745
  export { QbittorrentLogo } from "./logos/qbittorrent.js";
5746
5746
  export { QdrantLogo } from "./logos/qdrant.js";
5747
+ export { QeetLogo } from "./logos/qeet.js";
5748
+ export { QeetWordmarkLogo } from "./logos/qeet-wordmark.js";
5747
5749
  export { QemuLogo } from "./logos/qemu.js";
5748
5750
  export { QgisLogo } from "./logos/qgis.js";
5749
5751
  export { QiLogo } from "./logos/qi.js";
@@ -5747,6 +5747,8 @@ export { QatarAirwaysLogo } from "./logos/qatar-airways.js";
5747
5747
  export { QatarEnergyLogo } from "./logos/qatar-energy.js";
5748
5748
  export { QbittorrentLogo } from "./logos/qbittorrent.js";
5749
5749
  export { QdrantLogo } from "./logos/qdrant.js";
5750
+ export { QeetLogo } from "./logos/qeet.js";
5751
+ export { QeetWordmarkLogo } from "./logos/qeet-wordmark.js";
5750
5752
  export { QemuLogo } from "./logos/qemu.js";
5751
5753
  export { QgisLogo } from "./logos/qgis.js";
5752
5754
  export { QiLogo } from "./logos/qi.js";
@@ -5750,6 +5750,8 @@ export const logoManifest = /* @__PURE__ */ JSON.parse(`{
5750
5750
  {"id":"qatar-energy","componentName":"QatarEnergyLogo","title":"QatarEnergy","collection":"brands","variants":[{"name":"default","background":"any"}],"defaultVariant":"default","hex":"FAB916","categories":["Oil & Gas"],"aliases":[],"license":"CC0-1.0","website":"https://www.qatarenergy.qa","guidelines":"https://commons.wikimedia.org/wiki/File%3AQatarEnergy_logo.svg","source":"https://thesvg.org/icon/qatar-energy"},
5751
5751
  {"id":"qbittorrent","componentName":"QbittorrentLogo","title":"qbittorrent","collection":"brands","variants":[{"name":"default","background":"any"},{"name":"mono","background":"light"}],"defaultVariant":"default","hex":"2F67BA","categories":["DevTool","Community"],"aliases":[],"license":"CC0-1.0","website":"https://github.com/qbittorrent/qBittorrent/blob/73028f9930d9ab9d89edb60ed4aedb66d75669d9/src/icons/qbittorrent-tray-light.svg","guidelines":null,"source":"https://thesvg.org/icon/qbittorrent"},
5752
5752
  {"id":"qdrant","componentName":"QdrantLogo","title":"Qdrant","collection":"brands","variants":[{"name":"default","background":"dark"},{"name":"dark","background":"dark"},{"name":"light","background":"any"},{"name":"wordmark","background":"dark"},{"name":"wordmark-dark","background":"dark"},{"name":"wordmark-light","background":"light"}],"defaultVariant":"default","hex":"000000","categories":["Database","AI"],"aliases":[],"license":"MIT","website":"https://qdrant.tech/","guidelines":"https://qdrant.tech/brand-resources/","source":"https://thesvg.org/icon/qdrant"},
5753
+ {"id":"qeet","componentName":"QeetLogo","title":"Qeet","collection":"brands","variants":[{"name":"default","background":"light"},{"name":"dark","background":"dark"}],"defaultVariant":"default","hex":"F26D0E","categories":["Brand"],"aliases":["qeet-group"],"license":"LicenseRef-Qeet","website":"https://qeet.in","guidelines":null,"source":"https://qeet.in"},
5754
+ {"id":"qeet-wordmark","componentName":"QeetWordmarkLogo","title":"Qeet wordmark","collection":"brands","variants":[{"name":"default","background":"any"},{"name":"dark","background":"any"},{"name":"plain","background":"any"},{"name":"plain-dark","background":"any"}],"defaultVariant":"default","hex":"F26D0E","categories":["Brand"],"aliases":["qeet-group"],"license":"LicenseRef-Qeet","website":"https://qeet.in","guidelines":null,"source":"https://qeet.in"},
5753
5755
  {"id":"qemu","componentName":"QemuLogo","title":"QEMU","collection":"brands","variants":[{"name":"default","background":"any"},{"name":"mono","background":"light"}],"defaultVariant":"default","hex":"FF6600","categories":["Software","Platform"],"aliases":[],"license":"CC0-1.0","website":"https://wiki.qemu.org/Logo","guidelines":null,"source":"https://thesvg.org/icon/qemu"},
5754
5756
  {"id":"qgis","componentName":"QgisLogo","title":"Qgis","collection":"brands","variants":[{"name":"default","background":"any"},{"name":"mono","background":"light"}],"defaultVariant":"default","hex":"589632","categories":["Software","Platform"],"aliases":[],"license":"CC0-1.0","website":"https://www.qgis.org/en/site/getinvolved/styleguide.html","guidelines":"https://www.qgis.org/en/site/getinvolved/styleguide.html","source":"https://thesvg.org/icon/qgis"},
5755
5757
  {"id":"qi","componentName":"QiLogo","title":"Qi","collection":"brands","variants":[{"name":"default","background":"light"},{"name":"mono","background":"light"}],"defaultVariant":"default","hex":"000000","categories":["Software","Platform"],"aliases":[],"license":"CC0-1.0","website":"https://www.wirelesspowerconsortium.com/knowledge-base/retail/qi-logo-guidelines-and-artwork.html","guidelines":"https://www.wirelesspowerconsortium.com/knowledge-base/retail/qi-logo-guidelines-and-artwork.html","source":"https://thesvg.org/icon/qi"},
@@ -0,0 +1,9 @@
1
+ import type { ReactElement } from "react";
2
+ import type { LogoProps } from "../../types/logo.js";
3
+ type Variant = "default" | "dark" | "plain" | "plain-dark";
4
+ /**
5
+ * Qeet wordmark logo. Variants: `default` (default), `dark`, `plain`, `plain-dark`.
6
+ * License: LicenseRef-Qeet. Trademarks belong to their owners.
7
+ */
8
+ export declare function QeetWordmarkLogo(props: LogoProps<Variant>): ReactElement;
9
+ export {};
@@ -0,0 +1,22 @@
1
+ // Generated by @qeetrix/icons from icons/brand-icons/brands/qeet-wordmark/default.svg, icons/brand-icons/brands/qeet-wordmark/dark.svg, icons/brand-icons/brands/qeet-wordmark/plain.svg, icons/brand-icons/brands/qeet-wordmark/plain-dark.svg.
2
+ // Each file is embedded unmodified: percent-decoding its data URI gives back the file byte for byte.
3
+ // First-party: Qeet Group's own artwork, not from theSVG (`firstParty` in config/brands.json).
4
+ // Logo license: LicenseRef-Qeet. The Qeet name and mark are trademarks of Qeet Group.
5
+ // Do not edit this file directly. Edit the sources and run `bun run generate:logos`.
6
+ import { renderLogo } from "../../runtime/render-logo.js";
7
+ const data = {
8
+ defaultVariant: "default",
9
+ variants: {
10
+ default: { width: 2773, height: 1006, src: 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2773 1006" width="2773" height="1006" role="img" aria-label="Qeet">%0A<title>Qeet</title>%0A<rect width="2773" height="1006" fill="%230A0A0A"/>%0A<path fill="%23FFFFFF" d="M566,854c-68.67 0-130.83-16.17-186.5-48.5c-55.67-32.33-99.5-76.83-131.5-133.5c-32-56.67-48-120-48-190c0-70.67 16-134.5 48-191.5c32-57 75.83-101.83 131.5-134.5c55.67-32.67 117.83-49 186.5-49c68.67 0 130.83 16.33 186.5 49c55.67 32.67 99.5 77.5 131.5 134.5c32 57 48 120.83 48 191.5c0 56-10.17 107.83-30.5 155.5c-20.33 47.67-49.17 88.5-86.5 122.5l93 140h-157l-48-71c-44 16.67-89.67 25-137 25zM566,712c21.33 0 42.67-2.67 64-8l-86-129h157l38 56c30-39.33 45-89 45-149c0-48.67-9.83-90.67-29.5-126c-19.67-35.33-46-62-79-80c-33-18-69.5-27-109.5-27c-40.67 0-77.5 9-110.5 27c-33 18-59.17 44.5-78.5 79.5c-19.33 35-29 77.17-29 126.5c0 48.67 9.67 90.33 29 125c19.33 34.67 45.5 60.83 78.5 78.5c33 17.67 69.83 26.5 110.5 26.5zM1235,855c-55.33 0-104.33-11.83-147-35.5c-42.67-23.67-75.67-56.5-99-98.5c-23.33-42-35-89-35-141c0-58 11.83-108.33 35.5-151c23.67-42.67 56.33-75.33 98-98c41.67-22.67 88.5-34 140.5-34c51.33 0 96.5 11.17 135.5 33.5c39 22.33 69.17 53.83 90.5 94.5c21.33 40.67 32 87.67 32 141c0 18-1.33 37.67-4 59h-379c8.67 30 24.5 54.83 47.5 74.5c23 19.67 52.5 29.5 88.5 29.5c26 0 50.67-5.5 74-16.5c23.33-11 42-25.83 56-44.5l93 94c-24 27.33-56 49.67-96 67c-40 17.33-83.67 26-131 26zM1343,524c-8-74.67-47-112-117-112c-33.33 0-61 9.33-83 28c-22 18.67-36.33 45.67-43 81zM1793,855c-55.33 0-104.33-11.83-147-35.5c-42.67-23.67-75.67-56.5-99-98.5c-23.33-42-35-89-35-141c0-58 11.83-108.33 35.5-151c23.67-42.67 56.33-75.33 98-98c41.67-22.67 88.5-34 140.5-34c51.33 0 96.5 11.17 135.5 33.5c39 22.33 69.17 53.83 90.5 94.5c21.33 40.67 32 87.67 32 141c0 18-1.33 37.67-4 59h-379c8.67 30 24.5 54.83 47.5 74.5c23 19.67 52.5 29.5 88.5 29.5c26 0 50.67-5.5 74-16.5c23.33-11 42-25.83 56-44.5l93 94c-24 27.33-56 49.67-96 67c-40 17.33-83.67 26-131 26zM1901,524c-8-74.67-47-112-117-112c-33.33 0-61 9.33-83 28c-22 18.67-36.33 45.67-43 81zM2177,437h-113v-126h113v-137h142v137h116v126h-116v404h-142z"/>%0A<path fill="%23F26D0E" d="M2509,855c-26.67 0-49-9-67-27c-18-18-27-40-27-66c0-24.67 9-46 27-64c18-18 40.33-27 67-27c27.33 0 49.83 8.83 67.5 26.5c17.67 17.67 26.5 39.17 26.5 64.5c0 26-8.83 48-26.5 66c-17.67 18-40.17 27-67.5 27z"/>%0A</svg>%0A' },
11
+ dark: { width: 2773, height: 1006, src: 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2773 1006" width="2773" height="1006" role="img" aria-label="Qeet">%0A<title>Qeet</title>%0A<rect width="2773" height="1006" fill="%23FFFFFF"/>%0A<path fill="%230A0A0A" d="M566,854c-68.67 0-130.83-16.17-186.5-48.5c-55.67-32.33-99.5-76.83-131.5-133.5c-32-56.67-48-120-48-190c0-70.67 16-134.5 48-191.5c32-57 75.83-101.83 131.5-134.5c55.67-32.67 117.83-49 186.5-49c68.67 0 130.83 16.33 186.5 49c55.67 32.67 99.5 77.5 131.5 134.5c32 57 48 120.83 48 191.5c0 56-10.17 107.83-30.5 155.5c-20.33 47.67-49.17 88.5-86.5 122.5l93 140h-157l-48-71c-44 16.67-89.67 25-137 25zM566,712c21.33 0 42.67-2.67 64-8l-86-129h157l38 56c30-39.33 45-89 45-149c0-48.67-9.83-90.67-29.5-126c-19.67-35.33-46-62-79-80c-33-18-69.5-27-109.5-27c-40.67 0-77.5 9-110.5 27c-33 18-59.17 44.5-78.5 79.5c-19.33 35-29 77.17-29 126.5c0 48.67 9.67 90.33 29 125c19.33 34.67 45.5 60.83 78.5 78.5c33 17.67 69.83 26.5 110.5 26.5zM1235,855c-55.33 0-104.33-11.83-147-35.5c-42.67-23.67-75.67-56.5-99-98.5c-23.33-42-35-89-35-141c0-58 11.83-108.33 35.5-151c23.67-42.67 56.33-75.33 98-98c41.67-22.67 88.5-34 140.5-34c51.33 0 96.5 11.17 135.5 33.5c39 22.33 69.17 53.83 90.5 94.5c21.33 40.67 32 87.67 32 141c0 18-1.33 37.67-4 59h-379c8.67 30 24.5 54.83 47.5 74.5c23 19.67 52.5 29.5 88.5 29.5c26 0 50.67-5.5 74-16.5c23.33-11 42-25.83 56-44.5l93 94c-24 27.33-56 49.67-96 67c-40 17.33-83.67 26-131 26zM1343,524c-8-74.67-47-112-117-112c-33.33 0-61 9.33-83 28c-22 18.67-36.33 45.67-43 81zM1793,855c-55.33 0-104.33-11.83-147-35.5c-42.67-23.67-75.67-56.5-99-98.5c-23.33-42-35-89-35-141c0-58 11.83-108.33 35.5-151c23.67-42.67 56.33-75.33 98-98c41.67-22.67 88.5-34 140.5-34c51.33 0 96.5 11.17 135.5 33.5c39 22.33 69.17 53.83 90.5 94.5c21.33 40.67 32 87.67 32 141c0 18-1.33 37.67-4 59h-379c8.67 30 24.5 54.83 47.5 74.5c23 19.67 52.5 29.5 88.5 29.5c26 0 50.67-5.5 74-16.5c23.33-11 42-25.83 56-44.5l93 94c-24 27.33-56 49.67-96 67c-40 17.33-83.67 26-131 26zM1901,524c-8-74.67-47-112-117-112c-33.33 0-61 9.33-83 28c-22 18.67-36.33 45.67-43 81zM2177,437h-113v-126h113v-137h142v137h116v126h-116v404h-142z"/>%0A<path fill="%23F26D0E" d="M2509,855c-26.67 0-49-9-67-27c-18-18-27-40-27-66c0-24.67 9-46 27-64c18-18 40.33-27 67-27c27.33 0 49.83 8.83 67.5 26.5c17.67 17.67 26.5 39.17 26.5 64.5c0 26-8.83 48-26.5 66c-17.67 18-40.17 27-67.5 27z"/>%0A</svg>%0A' },
12
+ plain: { width: 2403, height: 793, src: 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2403 793" width="2403" height="793" role="img" aria-label="Qeet">%0A<title>Qeet</title>%0A<path fill="%230A0A0A" d="M366,747c-68.67 0-130.83-16.17-186.5-48.5c-55.67-32.33-99.5-76.83-131.5-133.5c-32-56.67-48-120-48-190c0-70.67 16-134.5 48-191.5c32-57 75.83-101.83 131.5-134.5c55.67-32.67 117.83-49 186.5-49c68.67 0 130.83 16.33 186.5 49c55.67 32.67 99.5 77.5 131.5 134.5c32 57 48 120.83 48 191.5c0 56-10.17 107.83-30.5 155.5c-20.33 47.67-49.17 88.5-86.5 122.5l93 140h-157l-48-71c-44 16.67-89.67 25-137 25zM366,605c21.33 0 42.67-2.67 64-8l-86-129h157l38 56c30-39.33 45-89 45-149c0-48.67-9.83-90.67-29.5-126c-19.67-35.33-46-62-79-80c-33-18-69.5-27-109.5-27c-40.67 0-77.5 9-110.5 27c-33 18-59.17 44.5-78.5 79.5c-19.33 35-29 77.17-29 126.5c0 48.67 9.67 90.33 29 125c19.33 34.67 45.5 60.83 78.5 78.5c33 17.67 69.83 26.5 110.5 26.5zM1035,748c-55.33 0-104.33-11.83-147-35.5c-42.67-23.67-75.67-56.5-99-98.5c-23.33-42-35-89-35-141c0-58 11.83-108.33 35.5-151c23.67-42.67 56.33-75.33 98-98c41.67-22.67 88.5-34 140.5-34c51.33 0 96.5 11.17 135.5 33.5c39 22.33 69.17 53.83 90.5 94.5c21.33 40.67 32 87.67 32 141c0 18-1.33 37.67-4 59h-379c8.67 30 24.5 54.83 47.5 74.5c23 19.67 52.5 29.5 88.5 29.5c26 0 50.67-5.5 74-16.5c23.33-11 42-25.83 56-44.5l93 94c-24 27.33-56 49.67-96 67c-40 17.33-83.67 26-131 26zM1143,417c-8-74.67-47-112-117-112c-33.33 0-61 9.33-83 28c-22 18.67-36.33 45.67-43 81zM1593,748c-55.33 0-104.33-11.83-147-35.5c-42.67-23.67-75.67-56.5-99-98.5c-23.33-42-35-89-35-141c0-58 11.83-108.33 35.5-151c23.67-42.67 56.33-75.33 98-98c41.67-22.67 88.5-34 140.5-34c51.33 0 96.5 11.17 135.5 33.5c39 22.33 69.17 53.83 90.5 94.5c21.33 40.67 32 87.67 32 141c0 18-1.33 37.67-4 59h-379c8.67 30 24.5 54.83 47.5 74.5c23 19.67 52.5 29.5 88.5 29.5c26 0 50.67-5.5 74-16.5c23.33-11 42-25.83 56-44.5l93 94c-24 27.33-56 49.67-96 67c-40 17.33-83.67 26-131 26zM1701,417c-8-74.67-47-112-117-112c-33.33 0-61 9.33-83 28c-22 18.67-36.33 45.67-43 81zM1977,330h-113v-126h113v-137h142v137h116v126h-116v404h-142z"/>%0A<path fill="%23F26D0E" d="M2309,748c-26.67 0-49-9-67-27c-18-18-27-40-27-66c0-24.67 9-46 27-64c18-18 40.33-27 67-27c27.33 0 49.83 8.83 67.5 26.5c17.67 17.67 26.5 39.17 26.5 64.5c0 26-8.83 48-26.5 66c-17.67 18-40.17 27-67.5 27z"/>%0A</svg>%0A' },
13
+ "plain-dark": { width: 2403, height: 793, src: 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2403 793" width="2403" height="793" role="img" aria-label="Qeet">%0A<title>Qeet</title>%0A<path fill="%23FFFFFF" d="M366,747c-68.67 0-130.83-16.17-186.5-48.5c-55.67-32.33-99.5-76.83-131.5-133.5c-32-56.67-48-120-48-190c0-70.67 16-134.5 48-191.5c32-57 75.83-101.83 131.5-134.5c55.67-32.67 117.83-49 186.5-49c68.67 0 130.83 16.33 186.5 49c55.67 32.67 99.5 77.5 131.5 134.5c32 57 48 120.83 48 191.5c0 56-10.17 107.83-30.5 155.5c-20.33 47.67-49.17 88.5-86.5 122.5l93 140h-157l-48-71c-44 16.67-89.67 25-137 25zM366,605c21.33 0 42.67-2.67 64-8l-86-129h157l38 56c30-39.33 45-89 45-149c0-48.67-9.83-90.67-29.5-126c-19.67-35.33-46-62-79-80c-33-18-69.5-27-109.5-27c-40.67 0-77.5 9-110.5 27c-33 18-59.17 44.5-78.5 79.5c-19.33 35-29 77.17-29 126.5c0 48.67 9.67 90.33 29 125c19.33 34.67 45.5 60.83 78.5 78.5c33 17.67 69.83 26.5 110.5 26.5zM1035,748c-55.33 0-104.33-11.83-147-35.5c-42.67-23.67-75.67-56.5-99-98.5c-23.33-42-35-89-35-141c0-58 11.83-108.33 35.5-151c23.67-42.67 56.33-75.33 98-98c41.67-22.67 88.5-34 140.5-34c51.33 0 96.5 11.17 135.5 33.5c39 22.33 69.17 53.83 90.5 94.5c21.33 40.67 32 87.67 32 141c0 18-1.33 37.67-4 59h-379c8.67 30 24.5 54.83 47.5 74.5c23 19.67 52.5 29.5 88.5 29.5c26 0 50.67-5.5 74-16.5c23.33-11 42-25.83 56-44.5l93 94c-24 27.33-56 49.67-96 67c-40 17.33-83.67 26-131 26zM1143,417c-8-74.67-47-112-117-112c-33.33 0-61 9.33-83 28c-22 18.67-36.33 45.67-43 81zM1593,748c-55.33 0-104.33-11.83-147-35.5c-42.67-23.67-75.67-56.5-99-98.5c-23.33-42-35-89-35-141c0-58 11.83-108.33 35.5-151c23.67-42.67 56.33-75.33 98-98c41.67-22.67 88.5-34 140.5-34c51.33 0 96.5 11.17 135.5 33.5c39 22.33 69.17 53.83 90.5 94.5c21.33 40.67 32 87.67 32 141c0 18-1.33 37.67-4 59h-379c8.67 30 24.5 54.83 47.5 74.5c23 19.67 52.5 29.5 88.5 29.5c26 0 50.67-5.5 74-16.5c23.33-11 42-25.83 56-44.5l93 94c-24 27.33-56 49.67-96 67c-40 17.33-83.67 26-131 26zM1701,417c-8-74.67-47-112-117-112c-33.33 0-61 9.33-83 28c-22 18.67-36.33 45.67-43 81zM1977,330h-113v-126h113v-137h142v137h116v126h-116v404h-142z"/>%0A<path fill="%23F26D0E" d="M2309,748c-26.67 0-49-9-67-27c-18-18-27-40-27-66c0-24.67 9-46 27-64c18-18 40.33-27 67-27c27.33 0 49.83 8.83 67.5 26.5c17.67 17.67 26.5 39.17 26.5 64.5c0 26-8.83 48-26.5 66c-17.67 18-40.17 27-67.5 27z"/>%0A</svg>%0A' },
14
+ },
15
+ };
16
+ /**
17
+ * Qeet wordmark logo. Variants: `default` (default), `dark`, `plain`, `plain-dark`.
18
+ * License: LicenseRef-Qeet. Trademarks belong to their owners.
19
+ */
20
+ export function QeetWordmarkLogo(props) {
21
+ return renderLogo(data, props);
22
+ }
@@ -0,0 +1,9 @@
1
+ import type { ReactElement } from "react";
2
+ import type { LogoProps } from "../../types/logo.js";
3
+ type Variant = "default" | "dark";
4
+ /**
5
+ * Qeet logo. Variants: `default` (default), `dark`.
6
+ * License: LicenseRef-Qeet. Trademarks belong to their owners.
7
+ */
8
+ export declare function QeetLogo(props: LogoProps<Variant>): ReactElement;
9
+ export {};
@@ -0,0 +1,20 @@
1
+ // Generated by @qeetrix/icons from icons/brand-icons/brands/qeet/default.svg, icons/brand-icons/brands/qeet/dark.svg.
2
+ // Each file is embedded unmodified: percent-decoding its data URI gives back the file byte for byte.
3
+ // First-party: Qeet Group's own artwork, not from theSVG (`firstParty` in config/brands.json).
4
+ // Logo license: LicenseRef-Qeet. The Qeet name and mark are trademarks of Qeet Group.
5
+ // Do not edit this file directly. Edit the sources and run `bun run generate:logos`.
6
+ import { renderLogo } from "../../runtime/render-logo.js";
7
+ const data = {
8
+ defaultVariant: "default",
9
+ variants: {
10
+ default: { width: 1254, height: 1254, src: 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1254 1254" role="img" aria-label="Qeet logo">%0A <title>Qeet</title>%0A <defs>%0A %3C!-- Mask carves a true transparent hole through the bowl -->%0A <mask id="qBowlHole" maskUnits="userSpaceOnUse">%0A <rect width="1254" height="1254" fill="%23FFFFFF"/>%0A <path fill="%23000000" d="%0A M669.964722,338.242981%0A C714.535645,351.395386 751.471863,375.501129 779.470825,412.042328%0A C814.503479,457.763184 828.529907,509.627594 821.508301,567.354248%0A C815.037964,614.333862 796.163635,655.232849 763.035339,688.671509%0A C715.514587,736.637695 657.793396,758.218994 590.453552,749.188904%0A C504.824402,737.706116 436.176788,675.264038 417.429352,590.163330%0A C398.281219,503.243683 423.564056,429.604553 493.036591,373.787628%0A C542.333557,334.180542 599.844727,323.023224 661.836060,336.080780%0A C664.430725,336.627319 666.966248,337.454285 669.964722,338.242981 z"/>%0A </mask>%0A </defs>%0A%0A %3C!-- Bowl + descender curve (dark) with hole masked out -->%0A <path mask="url(%23qBowlHole)" fill="%230A0A0A" d="%0A M821.791687,894.018799%0A C803.326172,903.166809 785.336975,913.478882 766.312927,921.261658%0A C682.977112,955.354797 597.577454,960.575989 510.776794,936.458923%0A C427.137451,913.220154 358.319214,867.022827 303.655487,799.771240%0A C259.619385,745.594543 231.852402,683.929749 219.855377,615.135681%0A C205.246201,531.363037 215.390701,450.569489 250.641022,373.361603%0A C287.752838,292.076569 346.057434,229.640503 423.650269,185.486679%0A C489.535767,147.994873 560.685242,131.387634 636.355042,134.347610%0A C667.607117,135.570114 698.193970,141.258041 728.247498,149.842102%0A C729.508179,150.202209 730.704346,150.788620 731.848389,151.967499%0A C730.448730,152.746170 729.071960,153.118286 727.822754,152.863968%0A C709.200012,149.072678 691.179749,151.872894 674.192566,159.455490%0A C609.452271,188.353607 598.711670,273.967438 647.019897,320.610840%0A C654.005493,327.355682 662.567566,332.467743 669.964722,338.242981%0A C666.966248,337.454285 664.430725,336.627319 661.836060,336.080780%0A C599.844727,323.023224 542.333557,334.180542 493.036591,373.787628%0A C423.564056,429.604553 398.281219,503.243683 417.429352,590.163330%0A C436.176788,675.264038 504.824402,737.706116 590.453552,749.188904%0A C657.793396,758.218994 715.514587,736.637695 763.035339,688.671509%0A C796.163635,655.232849 815.037964,614.333862 821.583984,568.151245%0A C821.813477,570.053894 822.135437,571.531555 822.135864,573.009338%0A C822.152954,633.669861 822.122437,694.330322 822.139038,754.990845%0A C822.151672,800.985046 822.219727,846.979187 822.106567,893.217285%0A C821.897339,893.647034 821.844543,893.832886 821.791687,894.018799 z"/>%0A%0A %3C!-- Bright orange (brand) -->%0A <path fill="%23F26D0E" d="%0A M822.263123,892.973389%0A C822.219727,846.979187 822.151672,800.985046 822.139038,754.990845%0A C822.122437,694.330322 822.152954,633.669861 822.135864,573.009338%0A C822.135437,571.531555 821.813477,570.053894 821.565674,567.779114%0A C828.529907,509.627594 814.503479,457.763184 779.470825,412.042328%0A C751.471863,375.501129 714.535645,351.395386 670.400085,338.335388%0A C662.567566,332.467743 654.005493,327.355682 647.019897,320.610840%0A C598.711670,273.967438 609.452271,188.353607 674.192566,159.455490%0A C691.179749,151.872894 709.200012,149.072678 727.822754,152.863968%0A C729.071960,153.118286 730.448730,152.746170 731.992310,152.316010%0A C769.401550,160.954422 803.019836,177.923462 834.791809,198.657364%0A C880.962646,228.787796 919.463745,266.834351 950.460815,312.497620%0A C982.820740,360.168488 1003.902954,412.329163 1013.963745,469.046661%0A C1020.018982,503.183136 1020.544678,537.589294 1019.593262,572.806763%0A C1019.448914,575.015015 1019.590332,576.503357 1019.731812,577.991638%0A C1019.772949,580.350159 1019.814148,582.708679 1019.428955,585.628662%0A C1017.683411,593.105652 1016.613953,600.080200 1014.998474,606.925842%0A C1009.980408,628.190918 1005.808533,649.733887 999.348572,670.561157%0A C990.918884,697.739197 978.245422,723.197205 964.169678,747.999512%0A C946.413818,779.286499 923.983276,806.907410 899.392212,832.849548%0A C890.630920,842.092285 880.599915,850.155457 870.943115,858.519897%0A C855.853760,871.589722 839.671936,883.159241 822.263123,892.973389 z"/>%0A%0A %3C!-- Dark orange shadow -->%0A <path fill="%23D85301" d="%0A M822.106567,893.217285%0A C839.671936,883.159241 855.853760,871.589722 870.943115,858.519897%0A C880.599915,850.155457 890.630920,842.092285 899.392212,832.849548%0A C923.983276,806.907410 946.413818,779.286499 964.169678,747.999512%0A C978.245422,723.197205 990.918884,697.739197 999.348572,670.561157%0A C1005.808533,649.733887 1009.980408,628.190918 1014.998474,606.925842%0A C1016.613953,600.080200 1017.683411,593.105652 1019.364136,586.065613%0A C1019.808838,604.428406 1019.960144,622.915649 1019.964478,641.402893%0A C1019.996887,779.531555 1020.306824,917.661377 1019.819763,1055.788208%0A C1019.679565,1095.540405 1004.006104,1128.543701 969.487183,1150.236328%0A C923.479797,1179.148682 863.557739,1162.918457 837.012451,1115.253418%0A C826.966858,1097.215454 822.142151,1077.902100 822.083740,1057.398804%0A C821.929504,1003.248413 821.950806,949.097534 821.846924,894.482788%0A C821.844543,893.832886 821.897339,893.647034 822.106567,893.217285 z"/>%0A%0A <path fill="%23D85301" d="%0A M1019.828918,577.584717%0A C1019.590332,576.503357 1019.448914,575.015015 1019.526367,573.272095%0A C1019.805603,574.404175 1019.865845,575.791016 1019.828918,577.584717 z"/>%0A</svg>%0A' },
11
+ dark: { width: 1254, height: 1254, src: 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1254 1254" role="img" aria-label="Qeet logo">%0A <title>Qeet</title>%0A <defs>%0A <mask id="qBowlHole" maskUnits="userSpaceOnUse">%0A <rect width="1254" height="1254" fill="%23FFFFFF"/>%0A <path fill="%23000000" d="%0A M669.964722,338.242981%0A C714.535645,351.395386 751.471863,375.501129 779.470825,412.042328%0A C814.503479,457.763184 828.529907,509.627594 821.508301,567.354248%0A C815.037964,614.333862 796.163635,655.232849 763.035339,688.671509%0A C715.514587,736.637695 657.793396,758.218994 590.453552,749.188904%0A C504.824402,737.706116 436.176788,675.264038 417.429352,590.163330%0A C398.281219,503.243683 423.564056,429.604553 493.036591,373.787628%0A C542.333557,334.180542 599.844727,323.023224 661.836060,336.080780%0A C664.430725,336.627319 666.966248,337.454285 669.964722,338.242981 z"/>%0A </mask>%0A </defs>%0A%0A %3C!-- Bowl + descender curve (white) with hole masked out -->%0A <path mask="url(%23qBowlHole)" fill="%23FCFCFC" d="%0A M821.791687,894.018799%0A C803.326172,903.166809 785.336975,913.478882 766.312927,921.261658%0A C682.977112,955.354797 597.577454,960.575989 510.776794,936.458923%0A C427.137451,913.220154 358.319214,867.022827 303.655487,799.771240%0A C259.619385,745.594543 231.852402,683.929749 219.855377,615.135681%0A C205.246201,531.363037 215.390701,450.569489 250.641022,373.361603%0A C287.752838,292.076569 346.057434,229.640503 423.650269,185.486679%0A C489.535767,147.994873 560.685242,131.387634 636.355042,134.347610%0A C667.607117,135.570114 698.193970,141.258041 728.247498,149.842102%0A C729.508179,150.202209 730.704346,150.788620 731.848389,151.967499%0A C730.448730,152.746170 729.071960,153.118286 727.822754,152.863968%0A C709.200012,149.072678 691.179749,151.872894 674.192566,159.455490%0A C609.452271,188.353607 598.711670,273.967438 647.019897,320.610840%0A C654.005493,327.355682 662.567566,332.467743 669.964722,338.242981%0A C666.966248,337.454285 664.430725,336.627319 661.836060,336.080780%0A C599.844727,323.023224 542.333557,334.180542 493.036591,373.787628%0A C423.564056,429.604553 398.281219,503.243683 417.429352,590.163330%0A C436.176788,675.264038 504.824402,737.706116 590.453552,749.188904%0A C657.793396,758.218994 715.514587,736.637695 763.035339,688.671509%0A C796.163635,655.232849 815.037964,614.333862 821.583984,568.151245%0A C821.813477,570.053894 822.135437,571.531555 822.135864,573.009338%0A C822.152954,633.669861 822.122437,694.330322 822.139038,754.990845%0A C822.151672,800.985046 822.219727,846.979187 822.106567,893.217285%0A C821.897339,893.647034 821.844543,893.832886 821.791687,894.018799 z"/>%0A%0A %3C!-- Bright orange (brand) -->%0A <path fill="%23F26D0E" d="%0A M822.263123,892.973389%0A C822.219727,846.979187 822.151672,800.985046 822.139038,754.990845%0A C822.122437,694.330322 822.152954,633.669861 822.135864,573.009338%0A C822.135437,571.531555 821.813477,570.053894 821.565674,567.779114%0A C828.529907,509.627594 814.503479,457.763184 779.470825,412.042328%0A C751.471863,375.501129 714.535645,351.395386 670.400085,338.335388%0A C662.567566,332.467743 654.005493,327.355682 647.019897,320.610840%0A C598.711670,273.967438 609.452271,188.353607 674.192566,159.455490%0A C691.179749,151.872894 709.200012,149.072678 727.822754,152.863968%0A C729.071960,153.118286 730.448730,152.746170 731.992310,152.316010%0A C769.401550,160.954422 803.019836,177.923462 834.791809,198.657364%0A C880.962646,228.787796 919.463745,266.834351 950.460815,312.497620%0A C982.820740,360.168488 1003.902954,412.329163 1013.963745,469.046661%0A C1020.018982,503.183136 1020.544678,537.589294 1019.593262,572.806763%0A C1019.448914,575.015015 1019.590332,576.503357 1019.731812,577.991638%0A C1019.772949,580.350159 1019.814148,582.708679 1019.428955,585.628662%0A C1017.683411,593.105652 1016.613953,600.080200 1014.998474,606.925842%0A C1009.980408,628.190918 1005.808533,649.733887 999.348572,670.561157%0A C990.918884,697.739197 978.245422,723.197205 964.169678,747.999512%0A C946.413818,779.286499 923.983276,806.907410 899.392212,832.849548%0A C890.630920,842.092285 880.599915,850.155457 870.943115,858.519897%0A C855.853760,871.589722 839.671936,883.159241 822.263123,892.973389 z"/>%0A%0A %3C!-- Dark orange shadow -->%0A <path fill="%23D85301" d="%0A M822.106567,893.217285%0A C839.671936,883.159241 855.853760,871.589722 870.943115,858.519897%0A C880.599915,850.155457 890.630920,842.092285 899.392212,832.849548%0A C923.983276,806.907410 946.413818,779.286499 964.169678,747.999512%0A C978.245422,723.197205 990.918884,697.739197 999.348572,670.561157%0A C1005.808533,649.733887 1009.980408,628.190918 1014.998474,606.925842%0A C1016.613953,600.080200 1017.683411,593.105652 1019.364136,586.065613%0A C1019.808838,604.428406 1019.960144,622.915649 1019.964478,641.402893%0A C1019.996887,779.531555 1020.306824,917.661377 1019.819763,1055.788208%0A C1019.679565,1095.540405 1004.006104,1128.543701 969.487183,1150.236328%0A C923.479797,1179.148682 863.557739,1162.918457 837.012451,1115.253418%0A C826.966858,1097.215454 822.142151,1077.902100 822.083740,1057.398804%0A C821.929504,1003.248413 821.950806,949.097534 821.846924,894.482788%0A C821.844543,893.832886 821.897339,893.647034 822.106567,893.217285 z"/>%0A%0A <path fill="%23D85301" d="%0A M1019.828918,577.584717%0A C1019.590332,576.503357 1019.448914,575.015015 1019.526367,573.272095%0A C1019.805603,574.404175 1019.865845,575.791016 1019.828918,577.584717 z"/>%0A</svg>%0A' },
12
+ },
13
+ };
14
+ /**
15
+ * Qeet logo. Variants: `default` (default), `dark`.
16
+ * License: LicenseRef-Qeet. Trademarks belong to their owners.
17
+ */
18
+ export function QeetLogo(props) {
19
+ return renderLogo(data, props);
20
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qeetrix/icons",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "private": false,
5
5
  "description": "Qeetrix Icons โ€” Lucide icons in round and sharp shapes with derived filled variants, plus theSVG brand logos, as tree-shakeable React components.",
6
6
  "license": "SEE LICENSE IN LICENSE",