@neptune.fintech/web-ui 1.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.
Files changed (42) hide show
  1. package/LICENSE +104 -0
  2. package/README.md +62 -0
  3. package/dist/components/base.d.ts +18 -0
  4. package/dist/components/base.d.ts.map +1 -0
  5. package/dist/components/base.js +57 -0
  6. package/dist/components/base.js.map +1 -0
  7. package/dist/components/button.d.ts +12 -0
  8. package/dist/components/button.d.ts.map +1 -0
  9. package/dist/components/button.js +70 -0
  10. package/dist/components/button.js.map +1 -0
  11. package/dist/components/card.d.ts +13 -0
  12. package/dist/components/card.d.ts.map +1 -0
  13. package/dist/components/card.js +46 -0
  14. package/dist/components/card.js.map +1 -0
  15. package/dist/components/financial.d.ts +23 -0
  16. package/dist/components/financial.d.ts.map +1 -0
  17. package/dist/components/financial.js +164 -0
  18. package/dist/components/financial.js.map +1 -0
  19. package/dist/components/inputs.d.ts +27 -0
  20. package/dist/components/inputs.d.ts.map +1 -0
  21. package/dist/components/inputs.js +167 -0
  22. package/dist/components/inputs.js.map +1 -0
  23. package/dist/components/nav.d.ts +24 -0
  24. package/dist/components/nav.d.ts.map +1 -0
  25. package/dist/components/nav.js +131 -0
  26. package/dist/components/nav.js.map +1 -0
  27. package/dist/index.d.ts +12 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +19 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/register.d.ts +3 -0
  32. package/dist/register.d.ts.map +1 -0
  33. package/dist/register.js +24 -0
  34. package/dist/register.js.map +1 -0
  35. package/dist/theme/applyTheme.d.ts +27 -0
  36. package/dist/theme/applyTheme.d.ts.map +1 -0
  37. package/dist/theme/applyTheme.js +118 -0
  38. package/dist/theme/applyTheme.js.map +1 -0
  39. package/package.json +58 -0
  40. package/styles/neptune-odyssey.css +6 -0
  41. package/styles/system.css +74 -0
  42. package/styles/themes.css +246 -0
@@ -0,0 +1,167 @@
1
+ // Neptune Odyssey — inputs · © 2026 Neptune.Fintech (neptune.ly)
2
+ // <npt-text-field>, <npt-chip>, <npt-badge>.
3
+ import { NptElement, css, html, A11Y } from "./base.js";
4
+ const esc = (v) => (v ?? "").replace(/[&<>"]/g, (c) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;" })[c]);
5
+ /**
6
+ * <npt-text-field label="IBAN" value="" placeholder="LY.." [error="msg"]></npt-text-field>
7
+ * Outlined M3 field. Logical padding → mirrors in RTL.
8
+ */
9
+ export class NptTextField extends NptElement {
10
+ attributeChangedCallback() {
11
+ if (this.isConnected)
12
+ this.update();
13
+ }
14
+ get value() {
15
+ return this.root.querySelector("input")?.value ?? this.getAttribute("value") ?? "";
16
+ }
17
+ styles() {
18
+ return css `
19
+ ${A11Y}
20
+ :host {
21
+ display: block;
22
+ }
23
+ label {
24
+ display: block;
25
+ font-family: var(--npt-font-text);
26
+ font-size: var(--npt-text-label, 14px);
27
+ color: var(--md-sys-color-on-surface-variant);
28
+ margin-block-end: var(--npt-space-2, 8px);
29
+ }
30
+ input {
31
+ inline-size: 100%;
32
+ box-sizing: border-box;
33
+ min-height: 48px;
34
+ font-family: var(--npt-font-text);
35
+ font-size: var(--npt-text-body-lg, 16px);
36
+ color: var(--md-sys-color-on-surface);
37
+ background: var(--md-sys-color-surface-container-lowest);
38
+ border: 1px solid var(--md-sys-color-outline);
39
+ border-radius: var(--npt-corner-sm, 12px);
40
+ padding-inline: var(--npt-space-4, 16px);
41
+ padding-block: var(--npt-space-3, 12px);
42
+ transition: border-color var(--npt-dur-fast, 200ms) var(--npt-ease-standard, ease);
43
+ }
44
+ input::placeholder {
45
+ color: var(--md-sys-color-on-surface-variant);
46
+ opacity: 0.7;
47
+ }
48
+ input:focus {
49
+ outline: none;
50
+ border-color: var(--md-sys-color-primary);
51
+ box-shadow: 0 0 0 1px var(--md-sys-color-primary);
52
+ }
53
+ :host([error]) input {
54
+ border-color: var(--md-sys-color-error);
55
+ }
56
+ .error {
57
+ font-family: var(--npt-font-text);
58
+ font-size: var(--npt-text-caption, 12px);
59
+ color: var(--md-sys-color-error);
60
+ margin-block-start: var(--npt-space-2, 8px);
61
+ }
62
+ `;
63
+ }
64
+ render() {
65
+ const label = esc(this.getAttribute("label"));
66
+ const value = esc(this.getAttribute("value"));
67
+ const placeholder = esc(this.getAttribute("placeholder"));
68
+ const error = this.getAttribute("error");
69
+ const type = esc(this.getAttribute("type")) || "text";
70
+ return html `
71
+ ${label ? html `<label>${label}</label>` : ""}
72
+ <input
73
+ type="${type}"
74
+ value="${value}"
75
+ placeholder="${placeholder}"
76
+ aria-invalid="${error ? "true" : "false"}"
77
+ aria-label="${label}"
78
+ />
79
+ ${error ? html `<p class="error" role="alert">${esc(error)}</p>` : ""}
80
+ `;
81
+ }
82
+ }
83
+ NptTextField.observedAttributes = ["label", "value", "placeholder", "error", "type"];
84
+ /** <npt-chip [selected]>Label</npt-chip> */
85
+ export class NptChip extends NptElement {
86
+ attributeChangedCallback() {
87
+ if (this.isConnected)
88
+ this.update();
89
+ }
90
+ styles() {
91
+ return css `
92
+ ${A11Y}
93
+ :host {
94
+ display: inline-block;
95
+ }
96
+ .chip {
97
+ font-family: var(--npt-font-text);
98
+ font-size: var(--npt-text-label, 14px);
99
+ min-height: 32px;
100
+ display: inline-flex;
101
+ align-items: center;
102
+ padding-inline: var(--npt-space-4, 16px);
103
+ border-radius: var(--npt-corner-sm, 12px);
104
+ border: 1px solid var(--md-sys-color-outline);
105
+ background: transparent;
106
+ color: var(--md-sys-color-on-surface-variant);
107
+ cursor: pointer;
108
+ }
109
+ :host([selected]) .chip {
110
+ background: var(--md-sys-color-secondary-container);
111
+ color: var(--md-sys-color-on-secondary-container);
112
+ border-color: transparent;
113
+ }
114
+ `;
115
+ }
116
+ render() {
117
+ const selected = this.hasAttribute("selected");
118
+ return html `<button class="chip" part="chip" role="option" aria-selected="${selected}"><slot></slot></button>`;
119
+ }
120
+ }
121
+ NptChip.observedAttributes = ["selected"];
122
+ /** <npt-badge tone="primary|success|error|neutral">3</npt-badge> */
123
+ export class NptBadge extends NptElement {
124
+ attributeChangedCallback() {
125
+ if (this.isConnected)
126
+ this.update();
127
+ }
128
+ styles() {
129
+ return css `
130
+ :host {
131
+ display: inline-block;
132
+ }
133
+ .badge {
134
+ font-family: var(--npt-font-num);
135
+ font-variant-numeric: tabular-nums;
136
+ font-size: var(--npt-text-caption, 12px);
137
+ font-weight: 600;
138
+ min-inline-size: 20px;
139
+ block-size: 20px;
140
+ padding-inline: var(--npt-space-2, 8px);
141
+ border-radius: var(--npt-corner-full, 999px);
142
+ display: inline-flex;
143
+ align-items: center;
144
+ justify-content: center;
145
+ background: var(--md-sys-color-primary);
146
+ color: var(--md-sys-color-on-primary);
147
+ }
148
+ :host([tone="success"]) .badge {
149
+ background: var(--md-sys-color-success);
150
+ color: var(--md-sys-color-on-success);
151
+ }
152
+ :host([tone="error"]) .badge {
153
+ background: var(--md-sys-color-error);
154
+ color: var(--md-sys-color-on-error);
155
+ }
156
+ :host([tone="neutral"]) .badge {
157
+ background: var(--md-sys-color-surface-container-highest);
158
+ color: var(--md-sys-color-on-surface-variant);
159
+ }
160
+ `;
161
+ }
162
+ render() {
163
+ return html `<span class="badge" part="badge"><slot></slot></span>`;
164
+ }
165
+ }
166
+ NptBadge.observedAttributes = ["tone"];
167
+ //# sourceMappingURL=inputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputs.js","sourceRoot":"","sources":["../../src/components/inputs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { NptElement } from "./base.js";
2
+ /** <npt-app-bar title="Accounts"> …trailing slot… </npt-app-bar> */
3
+ export declare class NptAppBar extends NptElement {
4
+ static observedAttributes: string[];
5
+ attributeChangedCallback(): void;
6
+ protected styles(): string;
7
+ protected render(): string;
8
+ }
9
+ /**
10
+ * <npt-nav-bar> with <npt-nav-item> children (icon + label slots).
11
+ * The mobile bottom navigation. Indicator uses secondary-container.
12
+ */
13
+ export declare class NptNavBar extends NptElement {
14
+ protected styles(): string;
15
+ protected render(): string;
16
+ }
17
+ /** <npt-nav-item label="Home" [active]>icon-glyph</npt-nav-item> */
18
+ export declare class NptNavItem extends NptElement {
19
+ static observedAttributes: string[];
20
+ attributeChangedCallback(): void;
21
+ protected styles(): string;
22
+ protected render(): string;
23
+ }
24
+ //# sourceMappingURL=nav.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav.d.ts","sourceRoot":"","sources":["../../src/components/nav.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAa,MAAM,WAAW,CAAC;AAKlD,oEAAoE;AACpE,qBAAa,SAAU,SAAQ,UAAU;IACvC,MAAM,CAAC,kBAAkB,WAAa;IAEtC,wBAAwB,IAAI,IAAI;IAIhC,SAAS,CAAC,MAAM,IAAI,MAAM;IA4B1B,SAAS,CAAC,MAAM,IAAI,MAAM;CAU3B;AAED;;;GAGG;AACH,qBAAa,SAAU,SAAQ,UAAU;IACvC,SAAS,CAAC,MAAM,IAAI,MAAM;IAiB1B,SAAS,CAAC,MAAM,IAAI,MAAM;CAG3B;AAED,oEAAoE;AACpE,qBAAa,UAAW,SAAQ,UAAU;IACxC,MAAM,CAAC,kBAAkB,WAAuB;IAEhD,wBAAwB,IAAI,IAAI;IAIhC,SAAS,CAAC,MAAM,IAAI,MAAM;IAuC1B,SAAS,CAAC,MAAM,IAAI,MAAM;CAU3B"}
@@ -0,0 +1,131 @@
1
+ // Neptune Odyssey — navigation · © 2026 Neptune.Fintech (neptune.ly)
2
+ // <npt-app-bar>, <npt-nav-bar>. Logical layout → mirrors in RTL.
3
+ import { NptElement, css, html } from "./base.js";
4
+ const esc = (v) => (v ?? "").replace(/[&<>"]/g, (c) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;" })[c]);
5
+ /** <npt-app-bar title="Accounts"> …trailing slot… </npt-app-bar> */
6
+ export class NptAppBar extends NptElement {
7
+ attributeChangedCallback() {
8
+ if (this.isConnected)
9
+ this.update();
10
+ }
11
+ styles() {
12
+ return css `
13
+ :host {
14
+ display: block;
15
+ }
16
+ .bar {
17
+ display: flex;
18
+ align-items: center;
19
+ gap: var(--npt-space-4, 16px);
20
+ min-height: 56px;
21
+ padding-inline: var(--npt-space-4, 16px);
22
+ background: var(--md-sys-color-surface);
23
+ color: var(--md-sys-color-on-surface);
24
+ }
25
+ .title {
26
+ flex: 1 1 auto;
27
+ font-family: var(--npt-font-display);
28
+ font-size: var(--npt-text-title-lg, 22px);
29
+ font-weight: var(--npt-display-weight, 700);
30
+ letter-spacing: var(--npt-display-tracking, -0.02em);
31
+ margin: 0;
32
+ white-space: nowrap;
33
+ overflow: hidden;
34
+ text-overflow: ellipsis;
35
+ }
36
+ `;
37
+ }
38
+ render() {
39
+ const title = esc(this.getAttribute("title"));
40
+ return html `
41
+ <header class="bar" part="bar">
42
+ <slot name="leading"></slot>
43
+ <h1 class="title">${title}</h1>
44
+ <slot name="trailing"></slot>
45
+ </header>
46
+ `;
47
+ }
48
+ }
49
+ NptAppBar.observedAttributes = ["title"];
50
+ /**
51
+ * <npt-nav-bar> with <npt-nav-item> children (icon + label slots).
52
+ * The mobile bottom navigation. Indicator uses secondary-container.
53
+ */
54
+ export class NptNavBar extends NptElement {
55
+ styles() {
56
+ return css `
57
+ :host {
58
+ display: block;
59
+ }
60
+ .nav {
61
+ display: flex;
62
+ justify-content: space-around;
63
+ align-items: center;
64
+ min-height: 64px;
65
+ background: var(--md-sys-color-surface-container);
66
+ color: var(--md-sys-color-on-surface-variant);
67
+ padding-inline: var(--npt-space-2, 8px);
68
+ }
69
+ `;
70
+ }
71
+ render() {
72
+ return html `<nav class="nav" part="nav" role="navigation"><slot></slot></nav>`;
73
+ }
74
+ }
75
+ /** <npt-nav-item label="Home" [active]>icon-glyph</npt-nav-item> */
76
+ export class NptNavItem extends NptElement {
77
+ attributeChangedCallback() {
78
+ if (this.isConnected)
79
+ this.update();
80
+ }
81
+ styles() {
82
+ return css `
83
+ :host {
84
+ display: inline-flex;
85
+ flex: 1 1 0;
86
+ }
87
+ .item {
88
+ flex: 1 1 0;
89
+ min-height: 48px;
90
+ display: flex;
91
+ flex-direction: column;
92
+ align-items: center;
93
+ justify-content: center;
94
+ gap: 2px;
95
+ border: none;
96
+ background: transparent;
97
+ color: inherit;
98
+ cursor: pointer;
99
+ font-family: var(--npt-font-text);
100
+ font-size: var(--npt-text-caption, 12px);
101
+ }
102
+ .pill {
103
+ min-inline-size: 56px;
104
+ block-size: 28px;
105
+ border-radius: var(--npt-corner-full, 999px);
106
+ display: grid;
107
+ place-items: center;
108
+ transition: background-color var(--npt-dur-fast, 200ms) var(--npt-ease-standard, ease);
109
+ }
110
+ :host([active]) {
111
+ color: var(--md-sys-color-on-surface);
112
+ }
113
+ :host([active]) .pill {
114
+ background: var(--md-sys-color-secondary-container);
115
+ color: var(--md-sys-color-on-secondary-container);
116
+ }
117
+ `;
118
+ }
119
+ render() {
120
+ const label = esc(this.getAttribute("label"));
121
+ const active = this.hasAttribute("active");
122
+ return html `
123
+ <button class="item" part="item" aria-current="${active ? "page" : "false"}" aria-label="${label}">
124
+ <span class="pill"><slot></slot></span>
125
+ <span>${label}</span>
126
+ </button>
127
+ `;
128
+ }
129
+ }
130
+ NptNavItem.observedAttributes = ["label", "active"];
131
+ //# sourceMappingURL=nav.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav.js","sourceRoot":"","sources":["../../src/components/nav.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,iEAAiE;AACjE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAElD,MAAM,GAAG,GAAG,CAAC,CAAgB,EAAU,EAAE,CACvC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;AAEvG,oEAAoE;AACpE,MAAM,OAAO,SAAU,SAAQ,UAAU;IAGvC,wBAAwB;QACtB,IAAI,IAAI,CAAC,WAAW;YAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACtC,CAAC;IAES,MAAM;QACd,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;KAwBT,CAAC;IACJ,CAAC;IAES,MAAM;QACd,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAA;;;4BAGa,KAAK;;;KAG5B,CAAC;IACJ,CAAC;;AA3CM,4BAAkB,GAAG,CAAC,OAAO,CAAC,CAAC;AA8CxC;;;GAGG;AACH,MAAM,OAAO,SAAU,SAAQ,UAAU;IAC7B,MAAM;QACd,OAAO,GAAG,CAAA;;;;;;;;;;;;;KAaT,CAAC;IACJ,CAAC;IAES,MAAM;QACd,OAAO,IAAI,CAAA,mEAAmE,CAAC;IACjF,CAAC;CACF;AAED,oEAAoE;AACpE,MAAM,OAAO,UAAW,SAAQ,UAAU;IAGxC,wBAAwB;QACtB,IAAI,IAAI,CAAC,WAAW;YAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACtC,CAAC;IAES,MAAM;QACd,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAmCT,CAAC;IACJ,CAAC;IAES,MAAM;QACd,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAA;uDACwC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,iBAAiB,KAAK;;gBAEtF,KAAK;;KAEhB,CAAC;IACJ,CAAC;;AAtDM,6BAAkB,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ export * from "./theme/applyTheme.js";
2
+ export { NptElement, define } from "./components/base.js";
3
+ export { NptButton } from "./components/button.js";
4
+ export { NptCard } from "./components/card.js";
5
+ export { NptBalanceCard, NptTransactionRow } from "./components/financial.js";
6
+ export { NptTextField, NptChip, NptBadge } from "./components/inputs.js";
7
+ export { NptAppBar, NptNavBar, NptNavItem } from "./components/nav.js";
8
+ export { registerAll } from "./register.js";
9
+ export type { Brand, Mode, Direction, NeptuneTheme, ThemeInput, BrandprintConfig, } from "@neptune.fintech/tokens";
10
+ export { buildTheme, encode, decode, brandprintFor } from "@neptune.fintech/tokens";
11
+ export declare const WEB_UI_VERSION = "1.0.0";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,cAAc,uBAAuB,CAAC;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,YAAY,EACV,KAAK,EACL,IAAI,EACJ,SAAS,EACT,YAAY,EACZ,UAAU,EACV,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAEpF,eAAO,MAAM,cAAc,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ // Neptune Odyssey — @neptune.fintech/web-ui · © 2026 Neptune.Fintech (neptune.ly)
2
+ // Framework-agnostic, CSS-variable themed custom-element kit + the applyTheme API.
3
+ // Licensed under the Neptune Odyssey Community License v1.0 (see LICENSE).
4
+ //
5
+ // Theming is pure CSS variables. Import the stylesheet once:
6
+ // import "@neptune.fintech/web-ui/styles.css";
7
+ // then either set data-theme/data-mode/dir yourself, or use applyTheme().
8
+ // Register components with registerAll() (or import "@neptune.fintech/web-ui/register").
9
+ export * from "./theme/applyTheme.js";
10
+ export { NptElement, define } from "./components/base.js";
11
+ export { NptButton } from "./components/button.js";
12
+ export { NptCard } from "./components/card.js";
13
+ export { NptBalanceCard, NptTransactionRow } from "./components/financial.js";
14
+ export { NptTextField, NptChip, NptBadge } from "./components/inputs.js";
15
+ export { NptAppBar, NptNavBar, NptNavItem } from "./components/nav.js";
16
+ export { registerAll } from "./register.js";
17
+ export { buildTheme, encode, decode, brandprintFor } from "@neptune.fintech/tokens";
18
+ export const WEB_UI_VERSION = "1.0.0";
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,mFAAmF;AACnF,2EAA2E;AAC3E,EAAE;AACF,6DAA6D;AAC7D,iDAAiD;AACjD,0EAA0E;AAC1E,yFAAyF;AAEzF,cAAc,uBAAuB,CAAC;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAW5C,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAEpF,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Register every Neptune Odyssey custom element (idempotent, browser-only). */
2
+ export declare function registerAll(): void;
3
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAUA,gFAAgF;AAChF,wBAAgB,WAAW,IAAI,IAAI,CAWlC"}
@@ -0,0 +1,24 @@
1
+ // Neptune Odyssey — element registration · © 2026 Neptune.Fintech (neptune.ly)
2
+ // Side-effectful by design: importing this file registers every custom element.
3
+ // (Tree-shakers: this module is listed in package.json "sideEffects".)
4
+ import { define } from "./components/base.js";
5
+ import { NptButton } from "./components/button.js";
6
+ import { NptCard } from "./components/card.js";
7
+ import { NptBalanceCard, NptTransactionRow } from "./components/financial.js";
8
+ import { NptTextField, NptChip, NptBadge } from "./components/inputs.js";
9
+ import { NptAppBar, NptNavBar, NptNavItem } from "./components/nav.js";
10
+ /** Register every Neptune Odyssey custom element (idempotent, browser-only). */
11
+ export function registerAll() {
12
+ define("npt-button", NptButton);
13
+ define("npt-card", NptCard);
14
+ define("npt-balance-card", NptBalanceCard);
15
+ define("npt-transaction-row", NptTransactionRow);
16
+ define("npt-text-field", NptTextField);
17
+ define("npt-chip", NptChip);
18
+ define("npt-badge", NptBadge);
19
+ define("npt-app-bar", NptAppBar);
20
+ define("npt-nav-bar", NptNavBar);
21
+ define("npt-nav-item", NptNavItem);
22
+ }
23
+ registerAll();
24
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,gFAAgF;AAChF,uEAAuE;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEvE,gFAAgF;AAChF,MAAM,UAAU,WAAW;IACzB,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAChC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC5B,MAAM,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;IAC3C,MAAM,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,CAAC;IACjD,MAAM,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IACvC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC5B,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC9B,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IACjC,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IACjC,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC;AAED,WAAW,EAAE,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { type NeptuneTheme, type ThemeInput, type Direction } from "@neptune.fintech/tokens";
2
+ export type ModeOption = "light" | "dark" | "system";
3
+ export type DirOption = Direction | "auto";
4
+ export interface ApplyThemeOptions {
5
+ mode?: ModeOption;
6
+ dir?: DirOption;
7
+ }
8
+ export interface ThemeHandle {
9
+ /** The resolved theme that was applied. */
10
+ theme: NeptuneTheme;
11
+ /** Stop watching `system`/`auto` listeners and leave the last applied values in place. */
12
+ dispose(): void;
13
+ }
14
+ /**
15
+ * Apply a Neptune Odyssey theme to a root element.
16
+ *
17
+ * @example
18
+ * applyTheme(document.documentElement, "andalus", { mode: "system", dir: "auto" });
19
+ * applyTheme(root, "NO1-AYB4AKKeeABWDBIaIiw4B_YBAAABAQEBAQAAyA");
20
+ * applyTheme(root, { primary: {L,C,H}, tertiary: {…}, corners: {…}, … });
21
+ */
22
+ export declare function applyTheme(root: HTMLElement, input: ThemeInput, options?: ApplyThemeOptions): ThemeHandle;
23
+ /** Convenience: set only the mode on an already-themed root (zero re-resolve). */
24
+ export declare function setMode(root: HTMLElement, mode: "light" | "dark"): void;
25
+ /** Convenience: set only the direction on an already-themed root. */
26
+ export declare function setDirection(root: HTMLElement, dir: Direction): void;
27
+ //# sourceMappingURL=applyTheme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applyTheme.d.ts","sourceRoot":"","sources":["../../src/theme/applyTheme.ts"],"names":[],"mappings":"AAUA,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AACrD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAE3C,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,GAAG,CAAC,EAAE,SAAS,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,2CAA2C;IAC3C,KAAK,EAAE,YAAY,CAAC;IACpB,0FAA0F;IAC1F,OAAO,IAAI,IAAI,CAAC;CACjB;AAwDD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,iBAAsB,GAC9B,WAAW,CAyCb;AAED,kFAAkF;AAClF,wBAAgB,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAEvE;AAED,qEAAqE;AACrE,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,CAEpE"}
@@ -0,0 +1,118 @@
1
+ // Neptune Odyssey — web theming surface · © 2026 Neptune.Fintech (neptune.ly)
2
+ // Licensed under the Neptune Odyssey Community License v1.0 (see LICENSE).
3
+ //
4
+ // Theming is PURE CSS VARIABLES. For the four reference brands, the shipped
5
+ // themes.css already defines every var — so re-skinning is zero JS: just set
6
+ // data-theme / data-mode / dir. For a custom config or a brandprint string we
7
+ // resolve the palette (via @neptune.fintech/tokens, the shared determinism
8
+ // backbone) and write the vars onto the root element. SSR-safe: no module-level
9
+ // DOM access; everything is guarded and runs only when called with an element.
10
+ import { buildTheme, COLOR_ROLES, } from "@neptune.fintech/tokens";
11
+ const REFERENCE_BRANDS = new Set(["neptune", "andalus", "nuran", "fglb"]);
12
+ function prefersDark() {
13
+ return typeof matchMedia === "function" && matchMedia("(prefers-color-scheme: dark)").matches;
14
+ }
15
+ function resolveMode(mode, fallback) {
16
+ if (mode === "light" || mode === "dark")
17
+ return mode;
18
+ if (mode === "system")
19
+ return prefersDark() ? "dark" : "light";
20
+ return fallback;
21
+ }
22
+ function resolveDir(dir, root, fallback) {
23
+ if (dir === "ltr" || dir === "rtl")
24
+ return dir;
25
+ if (dir === "auto") {
26
+ const inherited = getComputedStyle?.(root)?.direction;
27
+ return inherited === "rtl" ? "rtl" : "ltr";
28
+ }
29
+ return fallback;
30
+ }
31
+ /** Write the resolved palette + npt expression vars onto the element (custom themes). */
32
+ function writeVars(root, theme) {
33
+ const s = root.style;
34
+ for (const role of COLOR_ROLES)
35
+ s.setProperty(`--md-sys-color-${role}`, theme.colors[role]);
36
+ // shape (themes.css computes --npt-corner-* from *-base * --npt-shape-scale)
37
+ s.setProperty("--npt-corner-xs-base", `${theme.shape.xs}px`);
38
+ s.setProperty("--npt-corner-sm-base", `${theme.shape.sm}px`);
39
+ s.setProperty("--npt-corner-md-base", `${theme.shape.md}px`);
40
+ s.setProperty("--npt-corner-lg-base", `${theme.shape.lg}px`);
41
+ s.setProperty("--npt-corner-xl-base", `${theme.shape.xl}px`);
42
+ s.setProperty("--npt-corner-2xl-base", `${theme.shape.xxl}px`);
43
+ s.setProperty("--npt-corner-full", "999px");
44
+ s.setProperty("--npt-shape-scale", "1");
45
+ // type
46
+ s.setProperty("--npt-font-display", `'${theme.type.display}'`);
47
+ s.setProperty("--npt-font-text", `'${theme.type.text}'`);
48
+ s.setProperty("--npt-font-num", `'${theme.type.num}'`);
49
+ s.setProperty("--npt-display-weight", String(theme.type.displayWeight));
50
+ s.setProperty("--npt-display-tracking", `${theme.type.displayTracking}em`);
51
+ // motion
52
+ s.setProperty("--npt-ease-standard", theme.motion.ease.standard);
53
+ s.setProperty("--npt-ease-emphasized", theme.motion.ease.emphasized);
54
+ s.setProperty("--npt-ease-spring", theme.motion.ease.spring);
55
+ s.setProperty("--npt-dur-fast", `${theme.motion.durMs.fast}ms`);
56
+ s.setProperty("--npt-dur-standard", `${theme.motion.durMs.standard}ms`);
57
+ s.setProperty("--npt-dur-slow", `${theme.motion.durMs.slow}ms`);
58
+ s.setProperty("--npt-glass-blur", `${theme.motion.glassBlurPx}px`);
59
+ // named levers
60
+ s.setProperty("--npt-login-shell", theme.levers.loginShell);
61
+ s.setProperty("--npt-dashboard-hero", theme.levers.dashboardHero);
62
+ s.setProperty("--npt-content-tone", theme.levers.contentTone);
63
+ }
64
+ /**
65
+ * Apply a Neptune Odyssey theme to a root element.
66
+ *
67
+ * @example
68
+ * applyTheme(document.documentElement, "andalus", { mode: "system", dir: "auto" });
69
+ * applyTheme(root, "NO1-AYB4AKKeeABWDBIaIiw4B_YBAAABAQEBAQAAyA");
70
+ * applyTheme(root, { primary: {L,C,H}, tertiary: {…}, corners: {…}, … });
71
+ */
72
+ export function applyTheme(root, input, options = {}) {
73
+ const isReferenceBrand = typeof input === "string" && REFERENCE_BRANDS.has(input);
74
+ const cleanups = [];
75
+ const paint = () => {
76
+ const base = buildTheme(input);
77
+ const mode = resolveMode(options.mode, base.mode);
78
+ const dir = resolveDir(options.dir, root, base.dir);
79
+ const theme = buildTheme(input, { mode, dir });
80
+ if (isReferenceBrand) {
81
+ root.dataset.theme = input;
82
+ }
83
+ else {
84
+ root.dataset.theme = "custom";
85
+ writeVars(root, theme);
86
+ }
87
+ root.dataset.mode = mode;
88
+ root.setAttribute("dir", dir);
89
+ return theme;
90
+ };
91
+ let theme = paint();
92
+ if (options.mode === "system" && typeof matchMedia === "function") {
93
+ const mq = matchMedia("(prefers-color-scheme: dark)");
94
+ const onChange = () => {
95
+ theme = paint();
96
+ };
97
+ mq.addEventListener?.("change", onChange);
98
+ cleanups.push(() => mq.removeEventListener?.("change", onChange));
99
+ }
100
+ return {
101
+ get theme() {
102
+ return theme;
103
+ },
104
+ dispose() {
105
+ for (const c of cleanups)
106
+ c();
107
+ },
108
+ };
109
+ }
110
+ /** Convenience: set only the mode on an already-themed root (zero re-resolve). */
111
+ export function setMode(root, mode) {
112
+ root.dataset.mode = mode;
113
+ }
114
+ /** Convenience: set only the direction on an already-themed root. */
115
+ export function setDirection(root, dir) {
116
+ root.setAttribute("dir", dir);
117
+ }
118
+ //# sourceMappingURL=applyTheme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applyTheme.js","sourceRoot":"","sources":["../../src/theme/applyTheme.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@neptune.fintech/web-ui",
3
+ "version": "1.0.0",
4
+ "description": "Neptune Odyssey web kit — framework-agnostic, CSS-variable-themed custom elements + the applyTheme API (brand id / config / brandprint).",
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_web_ui"
12
+ },
13
+ "type": "module",
14
+ "sideEffects": [
15
+ "./dist/register.js",
16
+ "**/*.css"
17
+ ],
18
+ "main": "./dist/index.js",
19
+ "module": "./dist/index.js",
20
+ "types": "./dist/index.d.ts",
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "import": "./dist/index.js"
25
+ },
26
+ "./register": {
27
+ "types": "./dist/register.d.ts",
28
+ "import": "./dist/register.js"
29
+ },
30
+ "./styles.css": "./styles/neptune-odyssey.css",
31
+ "./styles/themes.css": "./styles/themes.css",
32
+ "./styles/system.css": "./styles/system.css",
33
+ "./package.json": "./package.json"
34
+ },
35
+ "files": [
36
+ "dist",
37
+ "styles",
38
+ "LICENSE",
39
+ "README.md"
40
+ ],
41
+ "publishConfig": {
42
+ "access": "public"
43
+ },
44
+ "dependencies": {
45
+ "@neptune.fintech/tokens": "^1.0.0"
46
+ },
47
+ "devDependencies": {
48
+ "jsdom": "^25.0.1",
49
+ "typescript": "^5.6.3",
50
+ "vitest": "^2.1.8"
51
+ },
52
+ "scripts": {
53
+ "build": "tsc -p tsconfig.json",
54
+ "typecheck": "tsc -p tsconfig.json --noEmit",
55
+ "test": "vitest run",
56
+ "lint": "tsc -p tsconfig.json --noEmit"
57
+ }
58
+ }
@@ -0,0 +1,6 @@
1
+ /* Neptune Odyssey — web theme entry · © 2026 Neptune.Fintech (neptune.ly)
2
+ Load order matters: themes.css (per-brand color/shape/type) → system.css
3
+ (brand-constant motion/elevation/spacing/type-scale/focus). Import once at the
4
+ root of your app, then set data-theme / data-mode / dir (or use applyTheme()). */
5
+ @import "./themes.css";
6
+ @import "./system.css";