@neptune.fintech/icons 2.0.0
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/LICENSE +104 -0
- package/README.md +93 -0
- package/dist/element.d.ts +23 -0
- package/dist/element.d.ts.map +1 -0
- package/dist/element.js +80 -0
- package/dist/element.js.map +1 -0
- package/dist/icons.d.ts +4 -0
- package/dist/icons.d.ts.map +1 -0
- package/dist/icons.js +87 -0
- package/dist/icons.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/svg.d.ts +17 -0
- package/dist/svg.d.ts.map +1 -0
- package/dist/svg.js +32 -0
- package/dist/svg.js.map +1 -0
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +73 -0
- package/dist/types.js.map +1 -0
- package/package.json +43 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
Neptune Odyssey Community License
|
|
2
|
+
Version 1.0
|
|
3
|
+
|
|
4
|
+
Copyright (c) 2026 Neptune.Fintech. All rights reserved.
|
|
5
|
+
|
|
6
|
+
This is a source-available license. It is NOT an OSI-approved open-source license.
|
|
7
|
+
"Neptune Odyssey" and "Neptune.Fintech" are names and marks of the Licensor; this
|
|
8
|
+
license does not grant rights to use them except as required for attribution.
|
|
9
|
+
|
|
10
|
+
------------------------------------------------------------------------------
|
|
11
|
+
1. DEFINITIONS
|
|
12
|
+
------------------------------------------------------------------------------
|
|
13
|
+
"Software" means the Neptune Odyssey design system and all materials in this
|
|
14
|
+
repository: design tokens, configuration files, documentation, reference
|
|
15
|
+
implementations, and generated libraries (Flutter, web, and any other target).
|
|
16
|
+
|
|
17
|
+
"Licensor" means Neptune.Fintech.
|
|
18
|
+
|
|
19
|
+
"You" means the individual or legal entity exercising rights under this license,
|
|
20
|
+
together with all entities that control, are controlled by, or are under common
|
|
21
|
+
control with that entity.
|
|
22
|
+
|
|
23
|
+
"Qualifying User" means You, if You are either:
|
|
24
|
+
(a) using the Software for a Non-Commercial Purpose; or
|
|
25
|
+
(b) an individual or entity whose total gross revenue (across all controlled
|
|
26
|
+
entities) in the most recently completed 12-month period was less than
|
|
27
|
+
twenty-five thousand United States dollars (USD $25,000), or the equivalent
|
|
28
|
+
in any other currency.
|
|
29
|
+
|
|
30
|
+
"Non-Commercial Purpose" means use that is not primarily intended for or directed
|
|
31
|
+
toward commercial advantage or monetary compensation — including personal
|
|
32
|
+
projects, evaluation, research, teaching, and use by registered non-profit or
|
|
33
|
+
charitable organizations.
|
|
34
|
+
|
|
35
|
+
------------------------------------------------------------------------------
|
|
36
|
+
2. GRANT OF RIGHTS (for Qualifying Users)
|
|
37
|
+
------------------------------------------------------------------------------
|
|
38
|
+
Subject to the terms below, the Licensor grants each Qualifying User a worldwide,
|
|
39
|
+
royalty-free, non-exclusive, non-transferable license to use, copy, modify,
|
|
40
|
+
create derivative works of, and distribute the Software, including in Your own
|
|
41
|
+
applications and products, for as long as You remain a Qualifying User.
|
|
42
|
+
|
|
43
|
+
------------------------------------------------------------------------------
|
|
44
|
+
3. COMMERCIAL USE ABOVE THE THRESHOLD
|
|
45
|
+
------------------------------------------------------------------------------
|
|
46
|
+
If You do not meet the definition of a Qualifying User — for example, if Your
|
|
47
|
+
gross revenue equals or exceeds USD $25,000 in the most recently completed
|
|
48
|
+
12-month period and Your use is not a Non-Commercial Purpose — You must obtain a
|
|
49
|
+
separate commercial license from the Licensor before using the Software in
|
|
50
|
+
production. Contact: licensing@neptune.fintech.
|
|
51
|
+
|
|
52
|
+
A Qualifying User who later crosses the revenue threshold has a 60-day grace
|
|
53
|
+
period from the end of the 12-month period in which the threshold was crossed to
|
|
54
|
+
obtain a commercial license or cease production use.
|
|
55
|
+
|
|
56
|
+
------------------------------------------------------------------------------
|
|
57
|
+
4. CONDITIONS
|
|
58
|
+
------------------------------------------------------------------------------
|
|
59
|
+
(a) Attribution. You must retain, in source and in any distributed copies of the
|
|
60
|
+
Software or substantial portions of it, this license, the copyright notice,
|
|
61
|
+
and a notice stating the Software is "Neptune Odyssey by Neptune.Fintech."
|
|
62
|
+
(b) No misrepresentation. You may not remove or alter notices, or represent the
|
|
63
|
+
Software (or a derivative) as Your own original design system.
|
|
64
|
+
(c) No trademark use. This license grants no rights in the Licensor's names,
|
|
65
|
+
logos, or brand names beyond the attribution required above.
|
|
66
|
+
(d) The brands, names, and visual identities of example tenants in this
|
|
67
|
+
repository (e.g. "Triton Bank", "Nereid", "Proteus") are reference
|
|
68
|
+
illustrations only and convey no rights.
|
|
69
|
+
|
|
70
|
+
------------------------------------------------------------------------------
|
|
71
|
+
5. TERMINATION
|
|
72
|
+
------------------------------------------------------------------------------
|
|
73
|
+
This license terminates automatically if You breach it and do not cure the breach
|
|
74
|
+
within 30 days of becoming aware of it, or if You use the Software in production
|
|
75
|
+
while not a Qualifying User and without a commercial license. Upon termination
|
|
76
|
+
You must cease use and distribution, except that copies You distributed to
|
|
77
|
+
downstream Qualifying Users in compliance with this license remain licensed.
|
|
78
|
+
|
|
79
|
+
------------------------------------------------------------------------------
|
|
80
|
+
6. DISCLAIMER OF WARRANTY
|
|
81
|
+
------------------------------------------------------------------------------
|
|
82
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
83
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
84
|
+
FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
|
|
85
|
+
|
|
86
|
+
------------------------------------------------------------------------------
|
|
87
|
+
7. LIMITATION OF LIABILITY
|
|
88
|
+
------------------------------------------------------------------------------
|
|
89
|
+
IN NO EVENT SHALL THE LICENSOR BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER
|
|
90
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM,
|
|
91
|
+
OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
92
|
+
SOFTWARE.
|
|
93
|
+
|
|
94
|
+
------------------------------------------------------------------------------
|
|
95
|
+
8. SUMMARY (non-binding, for convenience)
|
|
96
|
+
------------------------------------------------------------------------------
|
|
97
|
+
• Free to use, modify and ship — including commercially — IF your use is
|
|
98
|
+
non-commercial OR your organization makes under USD $25,000/year.
|
|
99
|
+
• Make USD $25,000/year or more from commercial use? Get a commercial license:
|
|
100
|
+
licensing@neptune.fintech.
|
|
101
|
+
• Keep the attribution. Don't pass it off as your own. Don't use our marks.
|
|
102
|
+
|
|
103
|
+
This summary does not modify the terms above. For anything load-bearing, consult
|
|
104
|
+
your own legal counsel — the Licensor provides this text without legal advice.
|
package/README.md
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# @neptune.fintech/icons
|
|
2
|
+
|
|
3
|
+
The **Neptune Odyssey icon family** — an original, hand-authored SVG icon set
|
|
4
|
+
built for banking & fintech surfaces. ~60 glyphs, one coherent style, themeable
|
|
5
|
+
everywhere via `currentColor`.
|
|
6
|
+
|
|
7
|
+
- **24×24** viewBox on a 24px grid with ~2px visual padding.
|
|
8
|
+
- **Outlined / stroke-based**: `stroke="currentColor"`, `stroke-width="1.8"`,
|
|
9
|
+
round caps & joins, `fill="none"` (a few solid dots use `fill="currentColor"`).
|
|
10
|
+
- **Themeable by inheritance** — every icon paints with `currentColor`, so it
|
|
11
|
+
picks up `color` (e.g. `--md-sys-color-on-surface`) with zero per-icon config.
|
|
12
|
+
- Usable from **plain web** (string builder) or as the **`<npt-icon>`** custom
|
|
13
|
+
element. SSR-safe.
|
|
14
|
+
|
|
15
|
+
## Install
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
pnpm add @neptune.fintech/icons
|
|
19
|
+
# or: npm i @neptune.fintech/icons
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Plain web — `iconSvg()`
|
|
23
|
+
|
|
24
|
+
`iconSvg(name, opts?)` returns a complete, ready-to-inline `<svg>` string.
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
import { iconSvg } from "@neptune.fintech/icons";
|
|
28
|
+
|
|
29
|
+
document.querySelector("#slot")!.innerHTML = iconSvg("card");
|
|
30
|
+
|
|
31
|
+
// options: size (px), stroke (viewBox units), class
|
|
32
|
+
iconSvg("send", { size: 32, stroke: 2, class: "cta-icon" });
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Colour follows CSS — set `color` on an ancestor and the icon matches:
|
|
36
|
+
|
|
37
|
+
```html
|
|
38
|
+
<span style="color: var(--md-sys-color-primary)">
|
|
39
|
+
<!-- iconSvg("transfer") inserted here paints in the primary colour -->
|
|
40
|
+
</span>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Custom element — `<npt-icon>`
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
import { registerIcons } from "@neptune.fintech/icons";
|
|
47
|
+
registerIcons(); // browser-only, idempotent
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
```html
|
|
51
|
+
<npt-icon name="qr-code" size="28"></npt-icon>
|
|
52
|
+
<npt-icon name="security-shield"></npt-icon>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Reactive attributes: `name`, `size` (px, default 24), `stroke` (default 1.8).
|
|
56
|
+
Override colour with the `--npt-icon-color` custom property or plain `color`.
|
|
57
|
+
|
|
58
|
+
## Theming
|
|
59
|
+
|
|
60
|
+
There is nothing to configure. Because each glyph uses `currentColor`, it
|
|
61
|
+
inherits the resolved text colour. Inside a Neptune Odyssey theme that means it
|
|
62
|
+
tracks `--md-sys-color-*` automatically — light/dark and per-brand reskins come
|
|
63
|
+
for free.
|
|
64
|
+
|
|
65
|
+
## API
|
|
66
|
+
|
|
67
|
+
| Export | Description |
|
|
68
|
+
| ---------------- | ----------------------------------------------------------------- |
|
|
69
|
+
| `iconSvg` | `(name, opts?) => string` — full `<svg>` string. Throws on bad name. |
|
|
70
|
+
| `isIconName` | `(name) => boolean` type guard for `IconName`. |
|
|
71
|
+
| `ICONS` | `Record<IconName, string>` — inner markup per icon. |
|
|
72
|
+
| `ICON_NAMES` | `IconName[]` — the full roster, in catalogue order. |
|
|
73
|
+
| `IconName` | Union type of every icon name. |
|
|
74
|
+
| `NptIcon` | The `<npt-icon>` custom-element class. |
|
|
75
|
+
| `registerIcons` | Registers `<npt-icon>` (browser-only, idempotent). |
|
|
76
|
+
| `ICONS_VERSION` | `"2.0.0"`. |
|
|
77
|
+
|
|
78
|
+
## Icon list
|
|
79
|
+
|
|
80
|
+
`home`, `accounts`, `card`, `card-add`, `wallet`, `transfer`, `send`,
|
|
81
|
+
`receive`, `request`, `swap-exchange`, `qr-code`, `contactless`, `bill`,
|
|
82
|
+
`receipt`, `statement`, `pdf`, `download`, `upload`, `search`, `filter`,
|
|
83
|
+
`settings`, `user`, `users`, `security-shield`, `lock`, `unlock`, `key`,
|
|
84
|
+
`fingerprint`, `face-id`, `bell`, `eye`, `eye-off`, `info`, `success-check`,
|
|
85
|
+
`warning`, `error`, `close`, `plus`, `minus`, `chart-line`, `chart-pie`,
|
|
86
|
+
`trending-up`, `trending-down`, `savings`, `calendar`, `clock`, `location`,
|
|
87
|
+
`phone`, `mail`, `support`, `chevron-right`, `chevron-down`, `arrow-right`,
|
|
88
|
+
`arrow-left`, `menu`, `more-horizontal`, `more-vertical`, `copy`, `share`,
|
|
89
|
+
`logout`, `language`, `moon`, `sun`.
|
|
90
|
+
|
|
91
|
+
## License
|
|
92
|
+
|
|
93
|
+
Neptune Odyssey Community License v1.0 — see [LICENSE](./LICENSE).
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <npt-icon name="card" size="24"></npt-icon>
|
|
3
|
+
*
|
|
4
|
+
* Reactive attributes:
|
|
5
|
+
* - `name` — an IconName; unknown names render nothing.
|
|
6
|
+
* - `size` — px, default 24.
|
|
7
|
+
* - `stroke` — viewBox-unit stroke width, default 1.8.
|
|
8
|
+
*/
|
|
9
|
+
export declare class NptIcon extends HTMLElement {
|
|
10
|
+
static observedAttributes: string[];
|
|
11
|
+
private root;
|
|
12
|
+
constructor();
|
|
13
|
+
connectedCallback(): void;
|
|
14
|
+
attributeChangedCallback(): void;
|
|
15
|
+
get name(): string;
|
|
16
|
+
set name(v: string);
|
|
17
|
+
get size(): number;
|
|
18
|
+
set size(v: number);
|
|
19
|
+
private update;
|
|
20
|
+
}
|
|
21
|
+
/** Register <npt-icon> in a browser, idempotently. SSR-safe (no-op on server). */
|
|
22
|
+
export declare function registerIcons(): void;
|
|
23
|
+
//# sourceMappingURL=element.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../src/element.ts"],"names":[],"mappings":"AAiCA;;;;;;;GAOG;AACH,qBAAa,OAAQ,SAAQ,WAAW;IACtC,MAAM,CAAC,kBAAkB,WAA8B;IAEvD,OAAO,CAAC,IAAI,CAAa;;IAOzB,iBAAiB,IAAI,IAAI;IAIzB,wBAAwB,IAAI,IAAI;IAIhC,IAAI,IAAI,IAAI,MAAM,CAEjB;IACD,IAAI,IAAI,CAAC,CAAC,EAAE,MAAM,EAEjB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IACD,IAAI,IAAI,CAAC,CAAC,EAAE,MAAM,EAEjB;IAED,OAAO,CAAC,MAAM;CAYf;AAED,kFAAkF;AAClF,wBAAgB,aAAa,IAAI,IAAI,CAGpC"}
|
package/dist/element.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// Neptune Odyssey — <npt-icon> custom element · © 2026 Neptune.Fintech (neptune.ly)
|
|
2
|
+
// Licensed under the Neptune Odyssey Community License v1.0 (see LICENSE).
|
|
3
|
+
//
|
|
4
|
+
// A minimal, self-contained Shadow-DOM custom element that renders a Neptune
|
|
5
|
+
// icon. It mirrors the web-ui base pattern (a cached CSSStyleSheet per class,
|
|
6
|
+
// custom-property-driven styling, browser-only registration via define()), but
|
|
7
|
+
// carries no cross-package dependency so the icon set ships standalone.
|
|
8
|
+
//
|
|
9
|
+
// The element is colour-agnostic: the inner <svg> uses `currentColor`, so the
|
|
10
|
+
// icon inherits `color` — which itself defaults to whatever the surrounding
|
|
11
|
+
// theme resolves (e.g. --md-sys-color-on-surface). SSR-safe: nothing touches
|
|
12
|
+
// the DOM at import time; registerIcons() is a no-op outside the browser.
|
|
13
|
+
import { iconSvg, isIconName } from "./svg.js";
|
|
14
|
+
const TAG = "npt-icon";
|
|
15
|
+
let sheet = null;
|
|
16
|
+
function styleSheet() {
|
|
17
|
+
if (typeof CSSStyleSheet === "undefined")
|
|
18
|
+
return null;
|
|
19
|
+
if (!sheet) {
|
|
20
|
+
sheet = new CSSStyleSheet();
|
|
21
|
+
sheet.replaceSync(`:host{display:inline-flex;align-items:center;justify-content:center;` +
|
|
22
|
+
`color:var(--npt-icon-color, currentColor);line-height:0;vertical-align:middle}` +
|
|
23
|
+
`:host([hidden]){display:none}` +
|
|
24
|
+
`svg{display:block;width:var(--_size);height:var(--_size)}`);
|
|
25
|
+
}
|
|
26
|
+
return sheet;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* <npt-icon name="card" size="24"></npt-icon>
|
|
30
|
+
*
|
|
31
|
+
* Reactive attributes:
|
|
32
|
+
* - `name` — an IconName; unknown names render nothing.
|
|
33
|
+
* - `size` — px, default 24.
|
|
34
|
+
* - `stroke` — viewBox-unit stroke width, default 1.8.
|
|
35
|
+
*/
|
|
36
|
+
export class NptIcon extends HTMLElement {
|
|
37
|
+
constructor() {
|
|
38
|
+
super();
|
|
39
|
+
this.root = this.attachShadow({ mode: "open" });
|
|
40
|
+
}
|
|
41
|
+
connectedCallback() {
|
|
42
|
+
this.update();
|
|
43
|
+
}
|
|
44
|
+
attributeChangedCallback() {
|
|
45
|
+
if (this.isConnected)
|
|
46
|
+
this.update();
|
|
47
|
+
}
|
|
48
|
+
get name() {
|
|
49
|
+
return this.getAttribute("name") ?? "";
|
|
50
|
+
}
|
|
51
|
+
set name(v) {
|
|
52
|
+
this.setAttribute("name", v);
|
|
53
|
+
}
|
|
54
|
+
get size() {
|
|
55
|
+
return Number(this.getAttribute("size")) || 24;
|
|
56
|
+
}
|
|
57
|
+
set size(v) {
|
|
58
|
+
this.setAttribute("size", String(v));
|
|
59
|
+
}
|
|
60
|
+
update() {
|
|
61
|
+
const s = styleSheet();
|
|
62
|
+
if (s)
|
|
63
|
+
this.root.adoptedStyleSheets = [s];
|
|
64
|
+
const size = this.size;
|
|
65
|
+
const strokeAttr = this.getAttribute("stroke");
|
|
66
|
+
const stroke = strokeAttr ? Number(strokeAttr) || 1.8 : 1.8;
|
|
67
|
+
this.root.host.style.setProperty("--_size", `${size}px`);
|
|
68
|
+
const name = this.name;
|
|
69
|
+
this.root.innerHTML = isIconName(name) ? iconSvg(name, { size, stroke }) : "";
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
NptIcon.observedAttributes = ["name", "size", "stroke"];
|
|
73
|
+
/** Register <npt-icon> in a browser, idempotently. SSR-safe (no-op on server). */
|
|
74
|
+
export function registerIcons() {
|
|
75
|
+
if (typeof customElements === "undefined")
|
|
76
|
+
return;
|
|
77
|
+
if (!customElements.get(TAG))
|
|
78
|
+
customElements.define(TAG, NptIcon);
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=element.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element.js","sourceRoot":"","sources":["../src/element.ts"],"names":[],"mappings":"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"}
|
package/dist/icons.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../src/icons.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,gFAAgF;AAChF,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAkJ1C,CAAC"}
|
package/dist/icons.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// Neptune Odyssey — icon path data · © 2026 Neptune.Fintech (neptune.ly)
|
|
2
|
+
// Licensed under the Neptune Odyssey Community License v1.0 (see LICENSE).
|
|
3
|
+
//
|
|
4
|
+
// The Neptune icon family. Each value is the INNER markup of a 24×24 icon
|
|
5
|
+
// (the <path>/<circle>/… elements only — NOT the outer <svg>). Authored on a
|
|
6
|
+
// 24px grid with ~2px visual padding, outlined stroke style: stroke-width 1.8,
|
|
7
|
+
// round caps & joins, fill none. Colour is inherited from `currentColor` at the
|
|
8
|
+
// <svg> level (see svg.ts), so every glyph themes with --md-sys-color-*.
|
|
9
|
+
//
|
|
10
|
+
// Do not add width/height/style attributes here, and do not wrap in <svg>.
|
|
11
|
+
/** name → inner SVG markup. Typed against IconName so the set stays in sync. */
|
|
12
|
+
export const ICONS = {
|
|
13
|
+
// ── Navigation & core ───────────────────────────────────────────────
|
|
14
|
+
home: '<path d="M4 11 12 4l8 7"/><path d="M6 10v9a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1v-9"/><path d="M10 20v-5h4v5"/>',
|
|
15
|
+
accounts: '<rect x="3" y="6" width="18" height="13" rx="2.5"/><path d="M3 10h18"/><path d="M7 15h4"/>',
|
|
16
|
+
card: '<rect x="3" y="5" width="18" height="14" rx="2.5"/><path d="M3 9.5h18"/><path d="M6.5 14.5h4"/>',
|
|
17
|
+
"card-add": '<path d="M21 11V7.5A2.5 2.5 0 0 0 18.5 5h-13A2.5 2.5 0 0 0 3 7.5V16a2.5 2.5 0 0 0 2.5 2.5H12"/><path d="M3 9.5h18"/><path d="M18 15v6"/><path d="M15 18h6"/>',
|
|
18
|
+
wallet: '<path d="M4 7.5A2.5 2.5 0 0 1 6.5 5H17a1 1 0 0 1 1 1v1.5"/><rect x="4" y="7.5" width="16" height="12" rx="2.5"/><path d="M16 13h2"/><path d="M20 11.5h-3a1.5 1.5 0 0 0 0 3h3"/>',
|
|
19
|
+
transfer: '<path d="M5 9h12l-3-3"/><path d="M19 15H7l3 3"/>',
|
|
20
|
+
send: '<path d="M20 4 9.5 14.5"/><path d="M20 4 13.5 20l-4-7-7-4Z"/>',
|
|
21
|
+
receive: '<path d="M12 4v11"/><path d="M7.5 10.5 12 15l4.5-4.5"/><path d="M5 19h14"/>',
|
|
22
|
+
request: '<path d="M12 20V9"/><path d="M16.5 13.5 12 9 7.5 13.5"/><path d="M5 5h14"/>',
|
|
23
|
+
"swap-exchange": '<path d="M6 8h11l-3.5-3.5"/><path d="M6 8V6"/><path d="M18 16H7l3.5 3.5"/><path d="M18 16v2"/>',
|
|
24
|
+
"qr-code": '<rect x="4" y="4" width="6" height="6" rx="1.2"/><rect x="14" y="4" width="6" height="6" rx="1.2"/><rect x="4" y="14" width="6" height="6" rx="1.2"/><path d="M14 14h2v2"/><path d="M20 14v2"/><path d="M14 20h6"/><path d="M20 18v2"/>',
|
|
25
|
+
contactless: '<path d="M7 8a8 8 0 0 1 0 8"/><path d="M11 6a12 12 0 0 1 0 12"/><path d="M15 4.5a16 16 0 0 1 0 15"/>',
|
|
26
|
+
// ── Documents & money flow ──────────────────────────────────────────
|
|
27
|
+
bill: '<path d="M6 3.5h9l3 3V20a.8.8 0 0 1-1.2.7L15 19.5l-1.5 1.2a1 1 0 0 1-1.2 0L10.8 19.5 9.3 20.7a1 1 0 0 1-1.2 0L6.6 19.5 5.2 20.7A.8.8 0 0 1 4 20V5.5A2 2 0 0 1 6 3.5Z"/><path d="M8.5 9h7"/><path d="M8.5 12.5h5"/>',
|
|
28
|
+
receipt: '<path d="M6 3.5h12V20a.8.8 0 0 1-1.2.7L15 19.5l-1.5 1.2a1 1 0 0 1-1.2 0L10.8 19.5 9.3 20.7a1 1 0 0 1-1.2 0L6.6 19.5 5.2 20.7A.8.8 0 0 1 6 20Z"/><path d="M9 8h6"/><path d="M9 11.5h6"/><path d="M9 15h3"/>',
|
|
29
|
+
statement: '<rect x="5" y="3.5" width="14" height="17" rx="2"/><path d="M8.5 8h7"/><path d="M8.5 11.5h7"/><path d="M8.5 15h4"/>',
|
|
30
|
+
pdf: '<path d="M7 3.5h7l4 4V19a1.5 1.5 0 0 1-1.5 1.5h-9A1.5 1.5 0 0 1 6 19V5A1.5 1.5 0 0 1 7.5 3.5Z"/><path d="M14 3.5V8h4"/><path d="M9 16.5v-4h1.2a1.2 1.2 0 0 1 0 2.4H9"/><path d="M14 12.5v4"/><path d="M14 12.5h1.6"/><path d="M14 14.5h1.2"/>',
|
|
31
|
+
download: '<path d="M12 4v10"/><path d="M7.5 9.5 12 14l4.5-4.5"/><path d="M5 18.5h14"/>',
|
|
32
|
+
upload: '<path d="M12 14V4"/><path d="M7.5 8.5 12 4l4.5 4.5"/><path d="M5 18.5h14"/>',
|
|
33
|
+
// ── Tools ───────────────────────────────────────────────────────────
|
|
34
|
+
search: '<circle cx="11" cy="11" r="6.5"/><path d="M16 16l3.5 3.5"/>',
|
|
35
|
+
filter: '<path d="M4 6h16"/><path d="M7 11h10"/><path d="M10 16h4"/>',
|
|
36
|
+
settings: '<circle cx="12" cy="12" r="3"/><path d="M12 3v2.2"/><path d="M12 18.8V21"/><path d="M3 12h2.2"/><path d="M18.8 12H21"/><path d="m5.6 5.6 1.6 1.6"/><path d="m16.8 16.8 1.6 1.6"/><path d="m18.4 5.6-1.6 1.6"/><path d="m7.2 16.8-1.6 1.6"/>',
|
|
37
|
+
// ── People & identity ───────────────────────────────────────────────
|
|
38
|
+
user: '<circle cx="12" cy="8" r="3.5"/><path d="M5.5 19.5a6.5 6.5 0 0 1 13 0"/>',
|
|
39
|
+
users: '<circle cx="9" cy="8" r="3"/><path d="M3.5 19a5.5 5.5 0 0 1 11 0"/><path d="M16 5.2a3 3 0 0 1 0 5.6"/><path d="M17 14.2a5.5 5.5 0 0 1 3.5 4.8"/>',
|
|
40
|
+
"security-shield": '<path d="M12 3.5 19 6v5.5c0 4.5-3 7.5-7 9-4-1.5-7-4.5-7-9V6Z"/><path d="m9 12 2 2 4-4"/>',
|
|
41
|
+
lock: '<rect x="5" y="10.5" width="14" height="9" rx="2"/><path d="M8 10.5V8a4 4 0 0 1 8 0v2.5"/><circle cx="12" cy="15" r="1.1" fill="currentColor" stroke="none"/>',
|
|
42
|
+
unlock: '<rect x="5" y="10.5" width="14" height="9" rx="2"/><path d="M8 10.5V8a4 4 0 0 1 7.5-1.9"/><circle cx="12" cy="15" r="1.1" fill="currentColor" stroke="none"/>',
|
|
43
|
+
key: '<circle cx="8" cy="8" r="4"/><path d="m11 11 8 8"/><path d="m16.5 16.5 1.8-1.8"/><path d="m18.5 18.5 1.8-1.8"/>',
|
|
44
|
+
fingerprint: '<path d="M7 11a5 5 0 0 1 10 0v1"/><path d="M9.5 11a2.5 2.5 0 0 1 5 0v1.5a6 6 0 0 0 .8 3"/><path d="M12 11v3a8 8 0 0 0 1.2 4.2"/><path d="M9.5 14a8 8 0 0 0 1 4.5"/><path d="M5 13a9 9 0 0 1 1.2-7"/><path d="M18.8 6.5A9 9 0 0 1 19 13"/>',
|
|
45
|
+
"face-id": '<path d="M4 8V6.5A2.5 2.5 0 0 1 6.5 4H8"/><path d="M16 4h1.5A2.5 2.5 0 0 1 20 6.5V8"/><path d="M20 16v1.5a2.5 2.5 0 0 1-2.5 2.5H16"/><path d="M8 20H6.5A2.5 2.5 0 0 1 4 17.5V16"/><path d="M9.5 9.5v1"/><path d="M14.5 9.5v1"/><path d="M12 9.5v3l-1 .8"/><path d="M9.5 15a3.5 3.5 0 0 0 5 0"/>',
|
|
46
|
+
// ── Status & alerts ─────────────────────────────────────────────────
|
|
47
|
+
bell: '<path d="M6 16.5V11a6 6 0 0 1 12 0v5.5l1.5 2H4.5Z"/><path d="M10 18.5a2 2 0 0 0 4 0"/>',
|
|
48
|
+
eye: '<path d="M3 12c2.2-4 5.5-6 9-6s6.8 2 9 6c-2.2 4-5.5 6-9 6s-6.8-2-9-6Z"/><circle cx="12" cy="12" r="2.6"/>',
|
|
49
|
+
"eye-off": '<path d="M4 4 20 20"/><path d="M9.6 9.7A2.6 2.6 0 0 0 12 14.6"/><path d="M7 7.3C5.3 8.4 3.9 10 3 12c2.2 4 5.5 6 9 6 1.5 0 2.9-.3 4.2-1"/><path d="M14.7 9.5A2.6 2.6 0 0 0 12 9.4"/><path d="M17.4 7.6c1.3 1 2.5 2.5 3.6 4.4-1 1.7-2.1 3-3.5 4"/>',
|
|
50
|
+
info: '<circle cx="12" cy="12" r="8.5"/><path d="M12 11v5"/><circle cx="12" cy="8" r="1.1" fill="currentColor" stroke="none"/>',
|
|
51
|
+
"success-check": '<circle cx="12" cy="12" r="8.5"/><path d="m8.5 12 2.3 2.3 4.7-4.6"/>',
|
|
52
|
+
warning: '<path d="M12 4.5 21 19.5H3Z"/><path d="M12 10v4"/><circle cx="12" cy="17" r="1" fill="currentColor" stroke="none"/>',
|
|
53
|
+
error: '<circle cx="12" cy="12" r="8.5"/><path d="M12 8v5"/><circle cx="12" cy="16" r="1" fill="currentColor" stroke="none"/>',
|
|
54
|
+
close: '<path d="M6 6 18 18"/><path d="M18 6 6 18"/>',
|
|
55
|
+
plus: '<path d="M12 5v14"/><path d="M5 12h14"/>',
|
|
56
|
+
minus: '<path d="M5 12h14"/>',
|
|
57
|
+
// ── Charts & insights ───────────────────────────────────────────────
|
|
58
|
+
"chart-line": '<path d="M4 4v15a1 1 0 0 0 1 1h15"/><path d="M7 15l3.5-4 3 2.5L20 7"/>',
|
|
59
|
+
"chart-pie": '<path d="M12 4a8 8 0 1 0 8 8h-8Z"/><path d="M14 3.2A8 8 0 0 1 20.8 10H14Z"/>',
|
|
60
|
+
"trending-up": '<path d="M4 16l5-5 3 3 7-7"/><path d="M15 7h4v4"/>',
|
|
61
|
+
"trending-down": '<path d="M4 8l5 5 3-3 7 7"/><path d="M15 17h4v-4"/>',
|
|
62
|
+
savings: '<circle cx="12" cy="12" r="8.5"/><path d="M12 6.5v11"/><path d="M14.5 8.5h-3.2a2 2 0 0 0 0 4h2.4a2 2 0 0 1 0 4H10"/>',
|
|
63
|
+
// ── Time & place ────────────────────────────────────────────────────
|
|
64
|
+
calendar: '<rect x="4" y="5.5" width="16" height="14.5" rx="2.5"/><path d="M4 10h16"/><path d="M8 3.5v3.5"/><path d="M16 3.5v3.5"/>',
|
|
65
|
+
clock: '<circle cx="12" cy="12" r="8.5"/><path d="M12 7.5V12l3 2"/>',
|
|
66
|
+
location: '<path d="M12 21c-3.5-3.4-6-6.4-6-9.5a6 6 0 0 1 12 0c0 3.1-2.5 6.1-6 9.5Z"/><circle cx="12" cy="11" r="2.4"/>',
|
|
67
|
+
phone: '<path d="M6 4h3l1.5 4-2 1.5a11 11 0 0 0 5 5l1.5-2 4 1.5V19a2 2 0 0 1-2.2 2A15.5 15.5 0 0 1 5 8.2 2 2 0 0 1 6 4Z"/>',
|
|
68
|
+
mail: '<rect x="3.5" y="6" width="17" height="12" rx="2.5"/><path d="m4.5 8 7.5 5.5L19.5 8"/>',
|
|
69
|
+
// ── Support ─────────────────────────────────────────────────────────
|
|
70
|
+
support: '<circle cx="12" cy="12" r="8.5"/><path d="M9.5 10a2.5 2.5 0 0 1 4.6 1.3c0 1.7-2.1 1.9-2.1 3.2"/><circle cx="12" cy="17" r="1" fill="currentColor" stroke="none"/>',
|
|
71
|
+
// ── Carets & arrows ─────────────────────────────────────────────────
|
|
72
|
+
"chevron-right": '<path d="M9.5 5.5 16 12l-6.5 6.5"/>',
|
|
73
|
+
"chevron-down": '<path d="M5.5 9.5 12 16l6.5-6.5"/>',
|
|
74
|
+
"arrow-right": '<path d="M4 12h15"/><path d="m13 6 6 6-6 6"/>',
|
|
75
|
+
"arrow-left": '<path d="M20 12H5"/><path d="m11 6-6 6 6 6"/>',
|
|
76
|
+
// ── Overflow & misc ─────────────────────────────────────────────────
|
|
77
|
+
menu: '<path d="M4 7h16"/><path d="M4 12h16"/><path d="M4 17h16"/>',
|
|
78
|
+
"more-horizontal": '<circle cx="5.5" cy="12" r="1.3" fill="currentColor" stroke="none"/><circle cx="12" cy="12" r="1.3" fill="currentColor" stroke="none"/><circle cx="18.5" cy="12" r="1.3" fill="currentColor" stroke="none"/>',
|
|
79
|
+
"more-vertical": '<circle cx="12" cy="5.5" r="1.3" fill="currentColor" stroke="none"/><circle cx="12" cy="12" r="1.3" fill="currentColor" stroke="none"/><circle cx="12" cy="18.5" r="1.3" fill="currentColor" stroke="none"/>',
|
|
80
|
+
copy: '<rect x="8" y="8" width="12" height="12" rx="2.5"/><path d="M16 8V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2"/>',
|
|
81
|
+
share: '<circle cx="7" cy="12" r="2.5"/><circle cx="17" cy="6" r="2.5"/><circle cx="17" cy="18" r="2.5"/><path d="m9.2 10.8 5.6-3.4"/><path d="m9.2 13.2 5.6 3.4"/>',
|
|
82
|
+
logout: '<path d="M14 4.5H6.5A1.5 1.5 0 0 0 5 6v12a1.5 1.5 0 0 0 1.5 1.5H14"/><path d="M11 12h9"/><path d="m16.5 8 3.5 4-3.5 4"/>',
|
|
83
|
+
language: '<circle cx="12" cy="12" r="8.5"/><path d="M3.5 12h17"/><path d="M12 3.5c2.4 2.3 3.7 5.3 3.7 8.5S14.4 18.2 12 20.5c-2.4-2.3-3.7-5.3-3.7-8.5S9.6 5.8 12 3.5Z"/>',
|
|
84
|
+
moon: '<path d="M20 13.5A8 8 0 0 1 10.5 4 8 8 0 1 0 20 13.5Z"/>',
|
|
85
|
+
sun: '<circle cx="12" cy="12" r="4"/><path d="M12 3v2.2"/><path d="M12 18.8V21"/><path d="M3 12h2.2"/><path d="M18.8 12H21"/><path d="m5.4 5.4 1.6 1.6"/><path d="m17 17 1.6 1.6"/><path d="m18.6 5.4-1.6 1.6"/><path d="m7 17-1.6 1.6"/>',
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=icons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.js","sourceRoot":"","sources":["../src/icons.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,2EAA2E;AAC3E,EAAE;AACF,0EAA0E;AAC1E,6EAA6E;AAC7E,+EAA+E;AAC/E,gFAAgF;AAChF,yEAAyE;AACzE,EAAE;AACF,2EAA2E;AAI3E,gFAAgF;AAChF,MAAM,CAAC,MAAM,KAAK,GAA6B;IAC7C,uEAAuE;IACvE,IAAI,EACF,0GAA0G;IAC5G,QAAQ,EACN,4FAA4F;IAC9F,IAAI,EACF,iGAAiG;IACnG,UAAU,EACR,8JAA8J;IAChK,MAAM,EACJ,iLAAiL;IACnL,QAAQ,EACN,kDAAkD;IACpD,IAAI,EACF,+DAA+D;IACjE,OAAO,EACL,6EAA6E;IAC/E,OAAO,EACL,6EAA6E;IAC/E,eAAe,EACb,gGAAgG;IAClG,SAAS,EACP,yOAAyO;IAC3O,WAAW,EACT,sGAAsG;IAExG,uEAAuE;IACvE,IAAI,EACF,oNAAoN;IACtN,OAAO,EACL,4MAA4M;IAC9M,SAAS,EACP,qHAAqH;IACvH,GAAG,EACD,+OAA+O;IACjP,QAAQ,EACN,8EAA8E;IAChF,MAAM,EACJ,6EAA6E;IAE/E,uEAAuE;IACvE,MAAM,EACJ,6DAA6D;IAC/D,MAAM,EACJ,6DAA6D;IAC/D,QAAQ,EACN,6OAA6O;IAE/O,uEAAuE;IACvE,IAAI,EACF,0EAA0E;IAC5E,KAAK,EACH,kJAAkJ;IACpJ,iBAAiB,EACf,0FAA0F;IAC5F,IAAI,EACF,+JAA+J;IACjK,MAAM,EACJ,+JAA+J;IACjK,GAAG,EACD,iHAAiH;IACnH,WAAW,EACT,2OAA2O;IAC7O,SAAS,EACP,iSAAiS;IAEnS,uEAAuE;IACvE,IAAI,EACF,wFAAwF;IAC1F,GAAG,EACD,2GAA2G;IAC7G,SAAS,EACP,kPAAkP;IACpP,IAAI,EACF,yHAAyH;IAC3H,eAAe,EACb,sEAAsE;IACxE,OAAO,EACL,qHAAqH;IACvH,KAAK,EACH,uHAAuH;IACzH,KAAK,EACH,8CAA8C;IAChD,IAAI,EACF,0CAA0C;IAC5C,KAAK,EACH,sBAAsB;IAExB,uEAAuE;IACvE,YAAY,EACV,wEAAwE;IAC1E,WAAW,EACT,8EAA8E;IAChF,aAAa,EACX,oDAAoD;IACtD,eAAe,EACb,qDAAqD;IACvD,OAAO,EACL,sHAAsH;IAExH,uEAAuE;IACvE,QAAQ,EACN,0HAA0H;IAC5H,KAAK,EACH,6DAA6D;IAC/D,QAAQ,EACN,8GAA8G;IAChH,KAAK,EACH,oHAAoH;IACtH,IAAI,EACF,wFAAwF;IAE1F,uEAAuE;IACvE,OAAO,EACL,mKAAmK;IAErK,uEAAuE;IACvE,eAAe,EACb,qCAAqC;IACvC,cAAc,EACZ,oCAAoC;IACtC,aAAa,EACX,+CAA+C;IACjD,YAAY,EACV,+CAA+C;IAEjD,uEAAuE;IACvE,IAAI,EACF,6DAA6D;IAC/D,iBAAiB,EACf,8MAA8M;IAChN,eAAe,EACb,8MAA8M;IAChN,IAAI,EACF,wHAAwH;IAC1H,KAAK,EACH,6JAA6J;IAC/J,MAAM,EACJ,0HAA0H;IAC5H,QAAQ,EACN,+JAA+J;IACjK,IAAI,EACF,0DAA0D;IAC5D,GAAG,EACD,qOAAqO;CACxO,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { ICONS } from "./icons.js";
|
|
2
|
+
export { ICON_NAMES } from "./types.js";
|
|
3
|
+
export type { IconName } from "./types.js";
|
|
4
|
+
export { iconSvg, isIconName } from "./svg.js";
|
|
5
|
+
export type { IconSvgOptions } from "./svg.js";
|
|
6
|
+
export { NptIcon, registerIcons } from "./element.js";
|
|
7
|
+
/** Semantic version of the icon family (kept in lockstep with package.json). */
|
|
8
|
+
export declare const ICONS_VERSION = "2.0.0";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC/C,YAAY,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAEtD,gFAAgF;AAChF,eAAO,MAAM,aAAa,UAAU,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Neptune Odyssey — @neptune.fintech/icons · © 2026 Neptune.Fintech (neptune.ly)
|
|
2
|
+
// An original, hand-authored 24px stroke icon family for banking & fintech.
|
|
3
|
+
// Licensed under the Neptune Odyssey Community License v1.0 (see LICENSE).
|
|
4
|
+
//
|
|
5
|
+
// Two ways to consume:
|
|
6
|
+
// 1. Plain web — iconSvg("card") returns a complete, themeable <svg> string.
|
|
7
|
+
// 2. Custom element — <npt-icon name="card" size="24">, after registerIcons().
|
|
8
|
+
//
|
|
9
|
+
// Every glyph paints with `currentColor`, so it themes with --md-sys-color-*
|
|
10
|
+
// (or any inherited `color`) with zero per-icon configuration.
|
|
11
|
+
export { ICONS } from "./icons.js";
|
|
12
|
+
export { ICON_NAMES } from "./types.js";
|
|
13
|
+
export { iconSvg, isIconName } from "./svg.js";
|
|
14
|
+
export { NptIcon, registerIcons } from "./element.js";
|
|
15
|
+
/** Semantic version of the icon family (kept in lockstep with package.json). */
|
|
16
|
+
export const ICONS_VERSION = "2.0.0";
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,4EAA4E;AAC5E,2EAA2E;AAC3E,EAAE;AACF,uBAAuB;AACvB,+EAA+E;AAC/E,iFAAiF;AACjF,EAAE;AACF,6EAA6E;AAC7E,+DAA+D;AAE/D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAEtD,gFAAgF;AAChF,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC"}
|
package/dist/svg.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { IconName } from "./types.js";
|
|
2
|
+
export interface IconSvgOptions {
|
|
3
|
+
/** Rendered width & height in px (the viewBox is always 24×24). Default 24. */
|
|
4
|
+
size?: number;
|
|
5
|
+
/** Stroke width in viewBox units. Default 1.8 — the family's native weight. */
|
|
6
|
+
stroke?: number;
|
|
7
|
+
/** Optional class attribute to place on the root <svg>. */
|
|
8
|
+
class?: string;
|
|
9
|
+
}
|
|
10
|
+
/** True when `name` is a known icon. Acts as a type guard for IconName. */
|
|
11
|
+
export declare function isIconName(name: string): name is IconName;
|
|
12
|
+
/**
|
|
13
|
+
* Build a complete <svg> string for `name`.
|
|
14
|
+
* @throws RangeError when `name` is not a known IconName.
|
|
15
|
+
*/
|
|
16
|
+
export declare function iconSvg(name: IconName, opts?: IconSvgOptions): string;
|
|
17
|
+
//# sourceMappingURL=svg.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../src/svg.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,WAAW,cAAc;IAC7B,+EAA+E;IAC/E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,2EAA2E;AAC3E,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,QAAQ,CAEzD;AAKD;;;GAGG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAE,cAAmB,GAAG,MAAM,CAczE"}
|
package/dist/svg.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// Neptune Odyssey — SVG string builder · © 2026 Neptune.Fintech (neptune.ly)
|
|
2
|
+
// Licensed under the Neptune Odyssey Community License v1.0 (see LICENSE).
|
|
3
|
+
//
|
|
4
|
+
// iconSvg() composes a complete, themeable <svg> string from the inner path data
|
|
5
|
+
// in ICONS. Colour is `currentColor`, so the icon inherits whatever colour the
|
|
6
|
+
// surrounding text/CSS resolves (e.g. --md-sys-color-on-surface). The root <svg>
|
|
7
|
+
// carries ONLY viewBox (plus width/height and the shared stroke attributes) —
|
|
8
|
+
// never a literal colour.
|
|
9
|
+
import { ICONS } from "./icons.js";
|
|
10
|
+
/** True when `name` is a known icon. Acts as a type guard for IconName. */
|
|
11
|
+
export function isIconName(name) {
|
|
12
|
+
return Object.prototype.hasOwnProperty.call(ICONS, name);
|
|
13
|
+
}
|
|
14
|
+
const escapeAttr = (v) => v.replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<").replace(/>/g, ">");
|
|
15
|
+
/**
|
|
16
|
+
* Build a complete <svg> string for `name`.
|
|
17
|
+
* @throws RangeError when `name` is not a known IconName.
|
|
18
|
+
*/
|
|
19
|
+
export function iconSvg(name, opts = {}) {
|
|
20
|
+
if (!isIconName(name)) {
|
|
21
|
+
throw new RangeError(`Unknown Neptune icon: "${String(name)}"`);
|
|
22
|
+
}
|
|
23
|
+
const size = opts.size ?? 24;
|
|
24
|
+
const stroke = opts.stroke ?? 1.8;
|
|
25
|
+
const inner = ICONS[name];
|
|
26
|
+
const cls = opts.class ? ` class="${escapeAttr(opts.class)}"` : "";
|
|
27
|
+
return (`<svg${cls} viewBox="0 0 24 24" width="${size}" height="${size}" fill="none" ` +
|
|
28
|
+
`stroke="currentColor" stroke-width="${stroke}" stroke-linecap="round" ` +
|
|
29
|
+
`stroke-linejoin="round" role="img" aria-label="${escapeAttr(name)}" ` +
|
|
30
|
+
`data-npt-icon="${escapeAttr(name)}">${inner}</svg>`);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=svg.js.map
|
package/dist/svg.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg.js","sourceRoot":"","sources":["../src/svg.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,2EAA2E;AAC3E,EAAE;AACF,iFAAiF;AACjF,+EAA+E;AAC/E,iFAAiF;AACjF,8EAA8E;AAC9E,0BAA0B;AAE1B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAYnC,2EAA2E;AAC3E,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,CAAS,EAAU,EAAE,CACvC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAE/F;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,IAAc,EAAE,OAAuB,EAAE;IAC/D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,UAAU,CAAC,0BAA0B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;IAClC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,OAAO,CACL,OAAO,GAAG,+BAA+B,IAAI,aAAa,IAAI,gBAAgB;QAC9E,uCAAuC,MAAM,2BAA2B;QACxE,kDAAkD,UAAU,CAAC,IAAI,CAAC,IAAI;QACtE,kBAAkB,UAAU,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ,CACrD,CAAC;AACJ,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Every icon shipped by the Neptune Odyssey icon family. */
|
|
2
|
+
export type IconName = "home" | "accounts" | "card" | "card-add" | "wallet" | "transfer" | "send" | "receive" | "request" | "swap-exchange" | "qr-code" | "contactless" | "bill" | "receipt" | "statement" | "pdf" | "download" | "upload" | "search" | "filter" | "settings" | "user" | "users" | "security-shield" | "lock" | "unlock" | "key" | "fingerprint" | "face-id" | "bell" | "eye" | "eye-off" | "info" | "success-check" | "warning" | "error" | "close" | "plus" | "minus" | "chart-line" | "chart-pie" | "trending-up" | "trending-down" | "savings" | "calendar" | "clock" | "location" | "phone" | "mail" | "support" | "chevron-right" | "chevron-down" | "arrow-right" | "arrow-left" | "menu" | "more-horizontal" | "more-vertical" | "copy" | "share" | "logout" | "language" | "moon" | "sun";
|
|
3
|
+
/** All icon names, in catalogue order. */
|
|
4
|
+
export declare const ICON_NAMES: IconName[];
|
|
5
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAOA,6DAA6D;AAC7D,MAAM,MAAM,QAAQ,GAEhB,MAAM,GACN,UAAU,GACV,MAAM,GACN,UAAU,GACV,QAAQ,GACR,UAAU,GACV,MAAM,GACN,SAAS,GACT,SAAS,GACT,eAAe,GACf,SAAS,GACT,aAAa,GAEb,MAAM,GACN,SAAS,GACT,WAAW,GACX,KAAK,GACL,UAAU,GACV,QAAQ,GAER,QAAQ,GACR,QAAQ,GACR,UAAU,GAEV,MAAM,GACN,OAAO,GACP,iBAAiB,GACjB,MAAM,GACN,QAAQ,GACR,KAAK,GACL,aAAa,GACb,SAAS,GAET,MAAM,GACN,KAAK,GACL,SAAS,GACT,MAAM,GACN,eAAe,GACf,SAAS,GACT,OAAO,GACP,OAAO,GACP,MAAM,GACN,OAAO,GAEP,YAAY,GACZ,WAAW,GACX,aAAa,GACb,eAAe,GACf,SAAS,GAET,UAAU,GACV,OAAO,GACP,UAAU,GACV,OAAO,GACP,MAAM,GAEN,SAAS,GAET,eAAe,GACf,cAAc,GACd,aAAa,GACb,YAAY,GAEZ,MAAM,GACN,iBAAiB,GACjB,eAAe,GACf,MAAM,GACN,OAAO,GACP,QAAQ,GACR,UAAU,GACV,MAAM,GACN,KAAK,CAAC;AAEV,0CAA0C;AAC1C,eAAO,MAAM,UAAU,EAAE,QAAQ,EAgEhC,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// Neptune Odyssey — icon names · © 2026 Neptune.Fintech (neptune.ly)
|
|
2
|
+
// Licensed under the Neptune Odyssey Community License v1.0 (see LICENSE).
|
|
3
|
+
//
|
|
4
|
+
// The canonical IconName union and the ordered ICON_NAMES roster. The ICONS
|
|
5
|
+
// map in icons.ts is typed as Record<IconName, string>, so adding a name here
|
|
6
|
+
// without a path (or vice-versa) is a compile error — the set cannot drift.
|
|
7
|
+
/** All icon names, in catalogue order. */
|
|
8
|
+
export const ICON_NAMES = [
|
|
9
|
+
"home",
|
|
10
|
+
"accounts",
|
|
11
|
+
"card",
|
|
12
|
+
"card-add",
|
|
13
|
+
"wallet",
|
|
14
|
+
"transfer",
|
|
15
|
+
"send",
|
|
16
|
+
"receive",
|
|
17
|
+
"request",
|
|
18
|
+
"swap-exchange",
|
|
19
|
+
"qr-code",
|
|
20
|
+
"contactless",
|
|
21
|
+
"bill",
|
|
22
|
+
"receipt",
|
|
23
|
+
"statement",
|
|
24
|
+
"pdf",
|
|
25
|
+
"download",
|
|
26
|
+
"upload",
|
|
27
|
+
"search",
|
|
28
|
+
"filter",
|
|
29
|
+
"settings",
|
|
30
|
+
"user",
|
|
31
|
+
"users",
|
|
32
|
+
"security-shield",
|
|
33
|
+
"lock",
|
|
34
|
+
"unlock",
|
|
35
|
+
"key",
|
|
36
|
+
"fingerprint",
|
|
37
|
+
"face-id",
|
|
38
|
+
"bell",
|
|
39
|
+
"eye",
|
|
40
|
+
"eye-off",
|
|
41
|
+
"info",
|
|
42
|
+
"success-check",
|
|
43
|
+
"warning",
|
|
44
|
+
"error",
|
|
45
|
+
"close",
|
|
46
|
+
"plus",
|
|
47
|
+
"minus",
|
|
48
|
+
"chart-line",
|
|
49
|
+
"chart-pie",
|
|
50
|
+
"trending-up",
|
|
51
|
+
"trending-down",
|
|
52
|
+
"savings",
|
|
53
|
+
"calendar",
|
|
54
|
+
"clock",
|
|
55
|
+
"location",
|
|
56
|
+
"phone",
|
|
57
|
+
"mail",
|
|
58
|
+
"support",
|
|
59
|
+
"chevron-right",
|
|
60
|
+
"chevron-down",
|
|
61
|
+
"arrow-right",
|
|
62
|
+
"arrow-left",
|
|
63
|
+
"menu",
|
|
64
|
+
"more-horizontal",
|
|
65
|
+
"more-vertical",
|
|
66
|
+
"copy",
|
|
67
|
+
"share",
|
|
68
|
+
"logout",
|
|
69
|
+
"language",
|
|
70
|
+
"moon",
|
|
71
|
+
"sun",
|
|
72
|
+
];
|
|
73
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,2EAA2E;AAC3E,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,4EAA4E;AA8E5E,0CAA0C;AAC1C,MAAM,CAAC,MAAM,UAAU,GAAe;IACpC,MAAM;IACN,UAAU;IACV,MAAM;IACN,UAAU;IACV,QAAQ;IACR,UAAU;IACV,MAAM;IACN,SAAS;IACT,SAAS;IACT,eAAe;IACf,SAAS;IACT,aAAa;IACb,MAAM;IACN,SAAS;IACT,WAAW;IACX,KAAK;IACL,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,MAAM;IACN,OAAO;IACP,iBAAiB;IACjB,MAAM;IACN,QAAQ;IACR,KAAK;IACL,aAAa;IACb,SAAS;IACT,MAAM;IACN,KAAK;IACL,SAAS;IACT,MAAM;IACN,eAAe;IACf,SAAS;IACT,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,YAAY;IACZ,WAAW;IACX,aAAa;IACb,eAAe;IACf,SAAS;IACT,UAAU;IACV,OAAO;IACP,UAAU;IACV,OAAO;IACP,MAAM;IACN,SAAS;IACT,eAAe;IACf,cAAc;IACd,aAAa;IACb,YAAY;IACZ,MAAM;IACN,iBAAiB;IACjB,eAAe;IACf,MAAM;IACN,OAAO;IACP,QAAQ;IACR,UAAU;IACV,MAAM;IACN,KAAK;CACN,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@neptune.fintech/icons",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "Neptune Odyssey icon library — an original, hand-authored 24px stroke icon family for banking & fintech, themeable via currentColor, usable from plain web or as the <npt-icon> custom element.",
|
|
5
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
6
|
+
"author": "Neptune.Fintech (https://neptune.ly)",
|
|
7
|
+
"homepage": "https://neptune.ly",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/neptune-ly/neptune_odyssey.git",
|
|
11
|
+
"directory": "packages/neptune_icons"
|
|
12
|
+
},
|
|
13
|
+
"type": "module",
|
|
14
|
+
"sideEffects": false,
|
|
15
|
+
"main": "./dist/index.js",
|
|
16
|
+
"module": "./dist/index.js",
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"import": "./dist/index.js"
|
|
22
|
+
},
|
|
23
|
+
"./package.json": "./package.json"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist",
|
|
27
|
+
"LICENSE",
|
|
28
|
+
"README.md"
|
|
29
|
+
],
|
|
30
|
+
"publishConfig": {
|
|
31
|
+
"access": "public"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"typescript": "^5.6.3",
|
|
35
|
+
"vitest": "^2.1.8"
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "tsc -p tsconfig.json",
|
|
39
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
40
|
+
"test": "vitest run",
|
|
41
|
+
"lint": "tsc -p tsconfig.json --noEmit"
|
|
42
|
+
}
|
|
43
|
+
}
|