@yugnex/nexui 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 +59 -0
- package/css/nexui-base.css +157 -0
- package/css/nexui-icons.css +86 -0
- package/css/nexui-tokens.css +113 -0
- package/css/nexui.css +16 -0
- package/dist/assets/geometry.d.ts +98 -0
- package/dist/assets/geometry.d.ts.map +1 -0
- package/dist/assets/geometry.js +114 -0
- package/dist/assets/geometry.js.map +1 -0
- package/dist/assets/typography.d.ts +3 -0
- package/dist/assets/typography.d.ts.map +1 -0
- package/dist/assets/typography.js +178 -0
- package/dist/assets/typography.js.map +1 -0
- package/dist/core/compiler.d.ts +30 -0
- package/dist/core/compiler.d.ts.map +1 -0
- package/dist/core/compiler.js +124 -0
- package/dist/core/compiler.js.map +1 -0
- package/dist/core/cx.d.ts +7 -0
- package/dist/core/cx.d.ts.map +1 -0
- package/dist/core/cx.js +34 -0
- package/dist/core/cx.js.map +1 -0
- package/dist/core/matrix.d.ts +118 -0
- package/dist/core/matrix.d.ts.map +1 -0
- package/dist/core/matrix.js +180 -0
- package/dist/core/matrix.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +74 -0
- package/dist/index.js.map +1 -0
- package/dist/primitives/avatar.d.ts +8 -0
- package/dist/primitives/avatar.d.ts.map +1 -0
- package/dist/primitives/avatar.js +146 -0
- package/dist/primitives/avatar.js.map +1 -0
- package/dist/primitives/badge.d.ts +8 -0
- package/dist/primitives/badge.d.ts.map +1 -0
- package/dist/primitives/badge.js +88 -0
- package/dist/primitives/badge.js.map +1 -0
- package/dist/primitives/button.d.ts +10 -0
- package/dist/primitives/button.d.ts.map +1 -0
- package/dist/primitives/button.js +137 -0
- package/dist/primitives/button.js.map +1 -0
- package/dist/primitives/checkbox.d.ts +13 -0
- package/dist/primitives/checkbox.d.ts.map +1 -0
- package/dist/primitives/checkbox.js +107 -0
- package/dist/primitives/checkbox.js.map +1 -0
- package/dist/primitives/input.d.ts +14 -0
- package/dist/primitives/input.d.ts.map +1 -0
- package/dist/primitives/input.js +177 -0
- package/dist/primitives/input.js.map +1 -0
- package/dist/primitives/panel.d.ts +9 -0
- package/dist/primitives/panel.d.ts.map +1 -0
- package/dist/primitives/panel.js +101 -0
- package/dist/primitives/panel.js.map +1 -0
- package/dist/primitives/progress.d.ts +8 -0
- package/dist/primitives/progress.d.ts.map +1 -0
- package/dist/primitives/progress.js +105 -0
- package/dist/primitives/progress.js.map +1 -0
- package/dist/primitives/separator.d.ts +8 -0
- package/dist/primitives/separator.d.ts.map +1 -0
- package/dist/primitives/separator.js +69 -0
- package/dist/primitives/separator.js.map +1 -0
- package/dist/primitives/skeleton.d.ts +8 -0
- package/dist/primitives/skeleton.d.ts.map +1 -0
- package/dist/primitives/skeleton.js +61 -0
- package/dist/primitives/skeleton.js.map +1 -0
- package/dist/primitives/spinner.d.ts +8 -0
- package/dist/primitives/spinner.d.ts.map +1 -0
- package/dist/primitives/spinner.js +64 -0
- package/dist/primitives/spinner.js.map +1 -0
- package/dist/primitives/status-ring.d.ts +8 -0
- package/dist/primitives/status-ring.d.ts.map +1 -0
- package/dist/primitives/status-ring.js +101 -0
- package/dist/primitives/status-ring.js.map +1 -0
- package/dist/primitives/switch.d.ts +12 -0
- package/dist/primitives/switch.d.ts.map +1 -0
- package/dist/primitives/switch.js +124 -0
- package/dist/primitives/switch.js.map +1 -0
- package/dist/primitives/text-stream.d.ts +23 -0
- package/dist/primitives/text-stream.d.ts.map +1 -0
- package/dist/primitives/text-stream.js +167 -0
- package/dist/primitives/text-stream.js.map +1 -0
- package/dist/tokens/colors.d.ts +127 -0
- package/dist/tokens/colors.d.ts.map +1 -0
- package/dist/tokens/colors.js +135 -0
- package/dist/tokens/colors.js.map +1 -0
- package/dist/tokens/motion.d.ts +37 -0
- package/dist/tokens/motion.d.ts.map +1 -0
- package/dist/tokens/motion.js +93 -0
- package/dist/tokens/motion.js.map +1 -0
- package/dist/tokens/shadows.d.ts +34 -0
- package/dist/tokens/shadows.d.ts.map +1 -0
- package/dist/tokens/shadows.js +45 -0
- package/dist/tokens/shadows.js.map +1 -0
- package/dist/tokens/spacing.d.ts +69 -0
- package/dist/tokens/spacing.d.ts.map +1 -0
- package/dist/tokens/spacing.js +71 -0
- package/dist/tokens/spacing.js.map +1 -0
- package/dist/tokens/type.d.ts +166 -0
- package/dist/tokens/type.d.ts.map +1 -0
- package/dist/tokens/type.js +215 -0
- package/dist/tokens/type.js.map +1 -0
- package/fonts/NexuiIcons.woff2 +0 -0
- package/fonts/NexuiMono-Regular.otf +0 -0
- package/fonts/NexuiMono-Regular.woff2 +0 -0
- package/fonts/NexuiSans-Bold.otf +0 -0
- package/fonts/NexuiSans-Bold.woff2 +0 -0
- package/fonts/NexuiSans-Medium.otf +0 -0
- package/fonts/NexuiSans-Medium.woff2 +0 -0
- package/fonts/NexuiSans-Regular.otf +0 -0
- package/fonts/NexuiSans-Regular.woff2 +0 -0
- package/native/Cargo.toml +16 -0
- package/native/src/lib.rs +127 -0
- package/nexui-utils.css +485 -0
- package/package.json +58 -0
- package/src/assets/geometry.ts +144 -0
- package/src/assets/typography.ts +184 -0
- package/src/core/compiler.ts +139 -0
- package/src/core/cx.ts +50 -0
- package/src/core/matrix.ts +195 -0
- package/src/index.ts +78 -0
- package/src/primitives/avatar.ts +159 -0
- package/src/primitives/badge.ts +98 -0
- package/src/primitives/button.ts +149 -0
- package/src/primitives/checkbox.ts +113 -0
- package/src/primitives/input.ts +187 -0
- package/src/primitives/panel.ts +111 -0
- package/src/primitives/progress.ts +112 -0
- package/src/primitives/separator.ts +73 -0
- package/src/primitives/skeleton.ts +68 -0
- package/src/primitives/spinner.ts +71 -0
- package/src/primitives/status-ring.ts +109 -0
- package/src/primitives/switch.ts +134 -0
- package/src/primitives/text-stream.ts +187 -0
- package/src/tokens/colors.ts +149 -0
- package/src/tokens/motion.ts +97 -0
- package/src/tokens/shadows.ts +58 -0
- package/src/tokens/spacing.ts +79 -0
- package/src/tokens/type.ts +224 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// @yugnex/nexui — NexButton Web Component
|
|
2
|
+
// Attributes:
|
|
3
|
+
// variant: primary | secondary | ghost | danger | outline | accent | live
|
|
4
|
+
// size: sm | md | lg
|
|
5
|
+
// loading: boolean
|
|
6
|
+
// disabled: boolean (native HTML attribute)
|
|
7
|
+
// icon-only: boolean (square aspect ratio)
|
|
8
|
+
import { nexui_compiler } from "../core/compiler";
|
|
9
|
+
export class NexButton extends HTMLElement {
|
|
10
|
+
static get observedAttributes() {
|
|
11
|
+
return ["variant", "size", "loading", "disabled", "icon-only", "type"];
|
|
12
|
+
}
|
|
13
|
+
constructor() {
|
|
14
|
+
super();
|
|
15
|
+
this.btn = null;
|
|
16
|
+
this.attachShadow({ mode: "open" });
|
|
17
|
+
}
|
|
18
|
+
connectedCallback() {
|
|
19
|
+
this.render();
|
|
20
|
+
this.setupDelegation();
|
|
21
|
+
}
|
|
22
|
+
attributeChangedCallback() {
|
|
23
|
+
this.render();
|
|
24
|
+
this.setupDelegation();
|
|
25
|
+
}
|
|
26
|
+
// Forward clicks from the host element to the internal button
|
|
27
|
+
setupDelegation() {
|
|
28
|
+
this.onclick = (e) => {
|
|
29
|
+
if (this.hasAttribute("disabled") || this.getAttribute("loading") === "true") {
|
|
30
|
+
e.stopImmediatePropagation();
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
render() {
|
|
36
|
+
if (!this.shadowRoot)
|
|
37
|
+
return;
|
|
38
|
+
const variant = this.getAttribute("variant") ?? "primary";
|
|
39
|
+
const size = this.getAttribute("size") ?? "md";
|
|
40
|
+
const loading = this.getAttribute("loading") === "true";
|
|
41
|
+
const disabled = this.hasAttribute("disabled") || loading;
|
|
42
|
+
const iconOnly = this.getAttribute("icon-only") === "true";
|
|
43
|
+
const type = this.getAttribute("type") ?? "button";
|
|
44
|
+
const themeCSS = nexui_compiler.getThemeCSS(nexui_compiler.getActiveTheme(), ":host");
|
|
45
|
+
const sizeStyles = {
|
|
46
|
+
sm: `font-size:11px; padding:${iconOnly ? "5px" : "5px 10px"}; min-height:28px; border-radius:5px; gap:6px;`,
|
|
47
|
+
md: `font-size:13px; padding:${iconOnly ? "7px" : "7px 14px"}; min-height:34px; border-radius:6px; gap:8px;`,
|
|
48
|
+
lg: `font-size:14px; padding:${iconOnly ? "9px" : "9px 18px"}; min-height:40px; border-radius:7px; gap:10px;`,
|
|
49
|
+
};
|
|
50
|
+
const variantStyles = {
|
|
51
|
+
primary: `background:var(--nx-accent,#E89010); color:#000; border:none;`,
|
|
52
|
+
secondary: `background:var(--nx-bg-elevated,#1C2128); color:var(--nx-text,#E6EDF3); border:1px solid var(--nx-border-strong,rgba(255,255,255,0.16));`,
|
|
53
|
+
ghost: `background:transparent; color:var(--nx-text,#E6EDF3); border:none;`,
|
|
54
|
+
outline: `background:transparent; color:var(--nx-text,#E6EDF3); border:1px solid var(--nx-border-strong,rgba(255,255,255,0.16));`,
|
|
55
|
+
danger: `background:var(--nx-error,#EF4444); color:#fff; border:none;`,
|
|
56
|
+
accent: `background:var(--nx-accent-dim,rgba(232,144,16,0.09)); color:var(--nx-accent-text,#F5B342); border:1px solid var(--nx-accent-border,rgba(232,144,16,0.22));`,
|
|
57
|
+
live: `background:var(--nx-live-dim,rgba(15,212,198,0.09)); color:var(--nx-live,#0FD4C6); border:1px solid var(--nx-live-border,rgba(15,212,198,0.22));`,
|
|
58
|
+
};
|
|
59
|
+
const hoverStyles = {
|
|
60
|
+
primary: `filter:brightness(1.1);`,
|
|
61
|
+
secondary: `background:var(--nx-bg-overlay,#21262D);`,
|
|
62
|
+
ghost: `background:rgba(255,255,255,0.06);`,
|
|
63
|
+
outline: `background:rgba(255,255,255,0.04); border-color:rgba(255,255,255,0.24);`,
|
|
64
|
+
danger: `filter:brightness(1.1);`,
|
|
65
|
+
accent: `background:rgba(232,144,16,0.14);`,
|
|
66
|
+
live: `background:rgba(15,212,198,0.14);`,
|
|
67
|
+
};
|
|
68
|
+
const iconSize = size === "sm" ? 12 : size === "lg" ? 16 : 14;
|
|
69
|
+
this.shadowRoot.innerHTML = `
|
|
70
|
+
<style>
|
|
71
|
+
${themeCSS}
|
|
72
|
+
:host {
|
|
73
|
+
display: inline-block;
|
|
74
|
+
}
|
|
75
|
+
button {
|
|
76
|
+
display: inline-flex;
|
|
77
|
+
align-items: center;
|
|
78
|
+
justify-content: center;
|
|
79
|
+
font-family: var(--nx-font-sans, system-ui, sans-serif);
|
|
80
|
+
font-weight: 500;
|
|
81
|
+
letter-spacing: 0.01em;
|
|
82
|
+
cursor: pointer;
|
|
83
|
+
user-select: none;
|
|
84
|
+
white-space: nowrap;
|
|
85
|
+
text-decoration: none;
|
|
86
|
+
transition: background 150ms ease, color 150ms ease, border-color 150ms ease, filter 150ms ease, opacity 150ms ease, box-shadow 150ms ease;
|
|
87
|
+
${sizeStyles[size] ?? sizeStyles.md}
|
|
88
|
+
${variantStyles[variant] ?? variantStyles.primary}
|
|
89
|
+
${iconOnly ? `aspect-ratio: 1; padding: ${size === "sm" ? "5px" : size === "lg" ? "9px" : "7px"};` : ""}
|
|
90
|
+
}
|
|
91
|
+
button:hover:not(:disabled):not(.loading) {
|
|
92
|
+
${hoverStyles[variant] ?? ""}
|
|
93
|
+
}
|
|
94
|
+
button:active:not(:disabled):not(.loading) {
|
|
95
|
+
transform: translateY(1px);
|
|
96
|
+
filter: brightness(0.95);
|
|
97
|
+
}
|
|
98
|
+
button:focus-visible {
|
|
99
|
+
outline: none;
|
|
100
|
+
box-shadow: 0 0 0 2px var(--nx-bg-base, #0D1117), 0 0 0 4px var(--nx-accent, #E89010);
|
|
101
|
+
}
|
|
102
|
+
button:disabled, button.loading {
|
|
103
|
+
opacity: 0.45;
|
|
104
|
+
cursor: not-allowed;
|
|
105
|
+
}
|
|
106
|
+
.spinner {
|
|
107
|
+
width: ${iconSize}px;
|
|
108
|
+
height: ${iconSize}px;
|
|
109
|
+
border: 1.5px solid transparent;
|
|
110
|
+
border-top-color: currentColor;
|
|
111
|
+
border-radius: 50%;
|
|
112
|
+
animation: nx-spin 600ms linear infinite;
|
|
113
|
+
flex-shrink: 0;
|
|
114
|
+
}
|
|
115
|
+
@keyframes nx-spin {
|
|
116
|
+
to { transform: rotate(360deg); }
|
|
117
|
+
}
|
|
118
|
+
::slotted(svg) {
|
|
119
|
+
width: ${iconSize}px;
|
|
120
|
+
height: ${iconSize}px;
|
|
121
|
+
flex-shrink: 0;
|
|
122
|
+
}
|
|
123
|
+
</style>
|
|
124
|
+
<button
|
|
125
|
+
type="${type}"
|
|
126
|
+
${disabled ? "disabled" : ""}
|
|
127
|
+
${loading ? 'class="loading"' : ""}
|
|
128
|
+
part="button"
|
|
129
|
+
>
|
|
130
|
+
${loading ? '<span class="spinner" aria-hidden="true"></span>' : ""}
|
|
131
|
+
<slot></slot>
|
|
132
|
+
</button>
|
|
133
|
+
`;
|
|
134
|
+
this.btn = this.shadowRoot.querySelector("button");
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button.js","sourceRoot":"","sources":["../../src/primitives/button.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class NexCheckbox extends HTMLElement {
|
|
2
|
+
private _checked;
|
|
3
|
+
private _indeterminate;
|
|
4
|
+
static get observedAttributes(): string[];
|
|
5
|
+
constructor();
|
|
6
|
+
connectedCallback(): void;
|
|
7
|
+
attributeChangedCallback(name: string): void;
|
|
8
|
+
get checked(): boolean;
|
|
9
|
+
set checked(v: boolean);
|
|
10
|
+
private toggle;
|
|
11
|
+
private render;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=checkbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkbox.d.ts","sourceRoot":"","sources":["../../src/primitives/checkbox.ts"],"names":[],"mappings":"AAYA,qBAAa,WAAY,SAAQ,WAAW;IAC1C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,cAAc,CAAS;IAE/B,MAAM,KAAK,kBAAkB,aAE5B;;IAOD,iBAAiB;IAMjB,wBAAwB,CAAC,IAAI,EAAE,MAAM;IAMrC,IAAI,OAAO,IACI,OAAO,CADiB;IACvC,IAAI,OAAO,CAAC,CAAC,EAAE,OAAO,EAMrB;IAED,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,MAAM;CA4Df"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// @yugnex/nexui — NexCheckbox Web Component
|
|
2
|
+
// Checkbox with indeterminate state support.
|
|
3
|
+
// Attributes:
|
|
4
|
+
// checked: boolean
|
|
5
|
+
// indeterminate: boolean
|
|
6
|
+
// disabled: boolean
|
|
7
|
+
// label: string
|
|
8
|
+
// size: sm | md | lg
|
|
9
|
+
import { nexui_compiler } from "../core/compiler";
|
|
10
|
+
import { NexuiIcons } from "../assets/geometry";
|
|
11
|
+
export class NexCheckbox extends HTMLElement {
|
|
12
|
+
static get observedAttributes() {
|
|
13
|
+
return ["checked", "indeterminate", "disabled", "label", "size"];
|
|
14
|
+
}
|
|
15
|
+
constructor() {
|
|
16
|
+
super();
|
|
17
|
+
this._checked = false;
|
|
18
|
+
this._indeterminate = false;
|
|
19
|
+
this.attachShadow({ mode: "open" });
|
|
20
|
+
}
|
|
21
|
+
connectedCallback() {
|
|
22
|
+
this._checked = this.hasAttribute("checked");
|
|
23
|
+
this._indeterminate = this.hasAttribute("indeterminate");
|
|
24
|
+
this.render();
|
|
25
|
+
}
|
|
26
|
+
attributeChangedCallback(name) {
|
|
27
|
+
if (name === "checked")
|
|
28
|
+
this._checked = this.hasAttribute("checked");
|
|
29
|
+
if (name === "indeterminate")
|
|
30
|
+
this._indeterminate = this.hasAttribute("indeterminate");
|
|
31
|
+
this.render();
|
|
32
|
+
}
|
|
33
|
+
get checked() { return this._checked; }
|
|
34
|
+
set checked(v) {
|
|
35
|
+
this._checked = v;
|
|
36
|
+
this._indeterminate = false;
|
|
37
|
+
v ? this.setAttribute("checked", "") : this.removeAttribute("checked");
|
|
38
|
+
this.removeAttribute("indeterminate");
|
|
39
|
+
this.render();
|
|
40
|
+
}
|
|
41
|
+
toggle() {
|
|
42
|
+
if (this.hasAttribute("disabled"))
|
|
43
|
+
return;
|
|
44
|
+
this.checked = !this._checked;
|
|
45
|
+
this.dispatchEvent(new CustomEvent("change", { detail: { checked: this._checked }, bubbles: true }));
|
|
46
|
+
}
|
|
47
|
+
render() {
|
|
48
|
+
if (!this.shadowRoot)
|
|
49
|
+
return;
|
|
50
|
+
const size = this.getAttribute("size") ?? "md";
|
|
51
|
+
const label = this.getAttribute("label") ?? "";
|
|
52
|
+
const disabled = this.hasAttribute("disabled");
|
|
53
|
+
const themeCSS = nexui_compiler.getThemeCSS(nexui_compiler.getActiveTheme(), ":host");
|
|
54
|
+
const szMap = { sm: 14, md: 16, lg: 20 };
|
|
55
|
+
const sz = szMap[size] ?? 16;
|
|
56
|
+
const iconSz = Math.round(sz * 0.7);
|
|
57
|
+
const fs = size === "sm" ? "11px" : size === "lg" ? "13px" : "12px";
|
|
58
|
+
const isActive = this._checked || this._indeterminate;
|
|
59
|
+
const icon = this._indeterminate
|
|
60
|
+
? `<svg width="${iconSz}" height="${iconSz}" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"><path d="M5 12h14"/></svg>`
|
|
61
|
+
: `<svg width="${iconSz}" height="${iconSz}" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="${NexuiIcons.check}"/></svg>`;
|
|
62
|
+
this.shadowRoot.innerHTML = `
|
|
63
|
+
<style>
|
|
64
|
+
${themeCSS}
|
|
65
|
+
:host { display: inline-flex; align-items: center; gap: 8px; cursor: ${disabled ? "not-allowed" : "pointer"}; }
|
|
66
|
+
.box {
|
|
67
|
+
width: ${sz}px;
|
|
68
|
+
height: ${sz}px;
|
|
69
|
+
border-radius: 4px;
|
|
70
|
+
border: 1.5px solid ${isActive ? "var(--nx-accent, #E89010)" : "var(--nx-border-strong, rgba(255,255,255,0.16))"};
|
|
71
|
+
background: ${isActive ? "var(--nx-accent, #E89010)" : "var(--nx-bg-elevated, #1C2128)"};
|
|
72
|
+
display: flex;
|
|
73
|
+
align-items: center;
|
|
74
|
+
justify-content: center;
|
|
75
|
+
color: #000;
|
|
76
|
+
opacity: ${disabled ? 0.45 : 1};
|
|
77
|
+
transition: background 120ms ease, border-color 120ms ease;
|
|
78
|
+
flex-shrink: 0;
|
|
79
|
+
outline: none;
|
|
80
|
+
}
|
|
81
|
+
.box:focus-visible {
|
|
82
|
+
box-shadow: 0 0 0 2px var(--nx-bg-base, #0D1117), 0 0 0 4px var(--nx-accent, #E89010);
|
|
83
|
+
}
|
|
84
|
+
.icon { display: ${isActive ? "flex" : "none"}; pointer-events: none; }
|
|
85
|
+
label {
|
|
86
|
+
font-family: var(--nx-font-sans, system-ui, sans-serif);
|
|
87
|
+
font-size: ${fs};
|
|
88
|
+
color: ${disabled ? "var(--nx-text-4, #484F58)" : "var(--nx-text-2, #8B949E)"};
|
|
89
|
+
user-select: none;
|
|
90
|
+
}
|
|
91
|
+
</style>
|
|
92
|
+
<div class="box" role="checkbox" aria-checked="${this._indeterminate ? "mixed" : this._checked}" tabindex="${disabled ? -1 : 0}" part="box">
|
|
93
|
+
<span class="icon" aria-hidden="true">${icon}</span>
|
|
94
|
+
</div>
|
|
95
|
+
${label ? `<label part="label">${label}</label>` : ""}
|
|
96
|
+
`;
|
|
97
|
+
const box = this.shadowRoot.querySelector(".box");
|
|
98
|
+
box?.addEventListener("click", () => this.toggle());
|
|
99
|
+
box?.addEventListener("keydown", (e) => {
|
|
100
|
+
if (e.key === " ") {
|
|
101
|
+
e.preventDefault();
|
|
102
|
+
this.toggle();
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=checkbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkbox.js","sourceRoot":"","sources":["../../src/primitives/checkbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare class NexInput extends HTMLElement {
|
|
2
|
+
private input;
|
|
3
|
+
static get observedAttributes(): string[];
|
|
4
|
+
constructor();
|
|
5
|
+
connectedCallback(): void;
|
|
6
|
+
attributeChangedCallback(): void;
|
|
7
|
+
get value(): string;
|
|
8
|
+
set value(v: string);
|
|
9
|
+
focus(): void;
|
|
10
|
+
blur(): void;
|
|
11
|
+
private setupProxy;
|
|
12
|
+
private render;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/primitives/input.ts"],"names":[],"mappings":"AAeA,qBAAa,QAAS,SAAQ,WAAW;IACvC,OAAO,CAAC,KAAK,CAAiC;IAE9C,MAAM,KAAK,kBAAkB,aAE5B;;IAOD,iBAAiB;IAKjB,wBAAwB;IAMxB,IAAI,KAAK,IAAI,MAAM,CAElB;IACD,IAAI,KAAK,CAAC,CAAC,EAAE,MAAM,EAGlB;IAED,KAAK;IACL,IAAI;IAEJ,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,MAAM;CA2Hf"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
// @yugnex/nexui — NexInput Web Component
|
|
2
|
+
// Full-featured input with label, helper text, error state, and prefix/suffix slots.
|
|
3
|
+
// Attributes:
|
|
4
|
+
// type: text | email | password | search | number | url (default: text)
|
|
5
|
+
// label: string
|
|
6
|
+
// placeholder: string
|
|
7
|
+
// helper: string — helper text below input
|
|
8
|
+
// error: string — error message (replaces helper, sets error state)
|
|
9
|
+
// size: sm | md | lg
|
|
10
|
+
// disabled: boolean
|
|
11
|
+
// required: boolean
|
|
12
|
+
// value: initial value
|
|
13
|
+
import { nexui_compiler } from "../core/compiler";
|
|
14
|
+
export class NexInput extends HTMLElement {
|
|
15
|
+
static get observedAttributes() {
|
|
16
|
+
return ["type", "label", "placeholder", "helper", "error", "size", "disabled", "required", "value"];
|
|
17
|
+
}
|
|
18
|
+
constructor() {
|
|
19
|
+
super();
|
|
20
|
+
this.input = null;
|
|
21
|
+
this.attachShadow({ mode: "open" });
|
|
22
|
+
}
|
|
23
|
+
connectedCallback() {
|
|
24
|
+
this.render();
|
|
25
|
+
this.setupProxy();
|
|
26
|
+
}
|
|
27
|
+
attributeChangedCallback() {
|
|
28
|
+
this.render();
|
|
29
|
+
this.setupProxy();
|
|
30
|
+
}
|
|
31
|
+
// Expose input value as a property on the custom element
|
|
32
|
+
get value() {
|
|
33
|
+
return this.input?.value ?? this.getAttribute("value") ?? "";
|
|
34
|
+
}
|
|
35
|
+
set value(v) {
|
|
36
|
+
if (this.input)
|
|
37
|
+
this.input.value = v;
|
|
38
|
+
this.setAttribute("value", v);
|
|
39
|
+
}
|
|
40
|
+
focus() { this.input?.focus(); }
|
|
41
|
+
blur() { this.input?.blur(); }
|
|
42
|
+
setupProxy() {
|
|
43
|
+
const input = this.shadowRoot?.querySelector("input");
|
|
44
|
+
if (!input)
|
|
45
|
+
return;
|
|
46
|
+
this.input = input;
|
|
47
|
+
// Re-dispatch events from shadow root so they bubble out
|
|
48
|
+
const forward = (e) => this.dispatchEvent(new e.constructor(e.type, e));
|
|
49
|
+
input.addEventListener("input", forward);
|
|
50
|
+
input.addEventListener("change", forward);
|
|
51
|
+
input.addEventListener("focus", forward);
|
|
52
|
+
input.addEventListener("blur", forward);
|
|
53
|
+
input.addEventListener("keydown", (e) => this.dispatchEvent(new KeyboardEvent("keydown", e)));
|
|
54
|
+
}
|
|
55
|
+
render() {
|
|
56
|
+
if (!this.shadowRoot)
|
|
57
|
+
return;
|
|
58
|
+
const type = this.getAttribute("type") ?? "text";
|
|
59
|
+
const label = this.getAttribute("label") ?? "";
|
|
60
|
+
const placeholder = this.getAttribute("placeholder") ?? "";
|
|
61
|
+
const helper = this.getAttribute("helper") ?? "";
|
|
62
|
+
const error = this.getAttribute("error") ?? "";
|
|
63
|
+
const size = this.getAttribute("size") ?? "md";
|
|
64
|
+
const disabled = this.hasAttribute("disabled");
|
|
65
|
+
const required = this.hasAttribute("required");
|
|
66
|
+
const value = this.getAttribute("value") ?? "";
|
|
67
|
+
const inputId = `nx-input-${Math.random().toString(36).slice(2, 7)}`;
|
|
68
|
+
const themeCSS = nexui_compiler.getThemeCSS(nexui_compiler.getActiveTheme(), ":host");
|
|
69
|
+
const hasError = error.length > 0;
|
|
70
|
+
const sizeVars = {
|
|
71
|
+
sm: { fs: "12px", ph: "6px 10px", radius: "5px" },
|
|
72
|
+
md: { fs: "13px", ph: "8px 12px", radius: "6px" },
|
|
73
|
+
lg: { fs: "14px", ph: "10px 14px", radius: "7px" },
|
|
74
|
+
};
|
|
75
|
+
const sv = sizeVars[size] ?? sizeVars.md;
|
|
76
|
+
this.shadowRoot.innerHTML = `
|
|
77
|
+
<style>
|
|
78
|
+
${themeCSS}
|
|
79
|
+
:host {
|
|
80
|
+
display: block;
|
|
81
|
+
font-family: var(--nx-font-sans, system-ui, sans-serif);
|
|
82
|
+
}
|
|
83
|
+
.field {
|
|
84
|
+
display: flex;
|
|
85
|
+
flex-direction: column;
|
|
86
|
+
gap: 5px;
|
|
87
|
+
}
|
|
88
|
+
label {
|
|
89
|
+
font-size: 12px;
|
|
90
|
+
font-weight: 500;
|
|
91
|
+
color: var(--nx-text-2, #8B949E);
|
|
92
|
+
letter-spacing: 0.02em;
|
|
93
|
+
user-select: none;
|
|
94
|
+
}
|
|
95
|
+
label .req {
|
|
96
|
+
color: var(--nx-error, #EF4444);
|
|
97
|
+
margin-left: 2px;
|
|
98
|
+
}
|
|
99
|
+
.input-wrap {
|
|
100
|
+
position: relative;
|
|
101
|
+
display: flex;
|
|
102
|
+
align-items: center;
|
|
103
|
+
}
|
|
104
|
+
input {
|
|
105
|
+
width: 100%;
|
|
106
|
+
background: var(--nx-bg-elevated, #1C2128);
|
|
107
|
+
border: 1px solid ${hasError ? "var(--nx-error,#EF4444)" : "var(--nx-border,rgba(255,255,255,0.08))"};
|
|
108
|
+
border-radius: ${sv.radius};
|
|
109
|
+
color: var(--nx-text, #E6EDF3);
|
|
110
|
+
font-family: inherit;
|
|
111
|
+
font-size: ${sv.fs};
|
|
112
|
+
padding: ${sv.ph};
|
|
113
|
+
line-height: 1.5;
|
|
114
|
+
outline: none;
|
|
115
|
+
transition: border-color 150ms ease, box-shadow 150ms ease, background 150ms ease;
|
|
116
|
+
box-sizing: border-box;
|
|
117
|
+
-webkit-appearance: none;
|
|
118
|
+
}
|
|
119
|
+
input::placeholder {
|
|
120
|
+
color: var(--nx-text-4, #484F58);
|
|
121
|
+
}
|
|
122
|
+
input:hover:not(:disabled):not(:focus) {
|
|
123
|
+
border-color: var(--nx-border-strong, rgba(255,255,255,0.16));
|
|
124
|
+
}
|
|
125
|
+
input:focus {
|
|
126
|
+
border-color: ${hasError ? "var(--nx-error,#EF4444)" : "var(--nx-border-focus,rgba(232,144,16,0.60))"};
|
|
127
|
+
box-shadow: 0 0 0 3px ${hasError ? "rgba(239,68,68,0.15)" : "rgba(232,144,16,0.12)"};
|
|
128
|
+
background: var(--nx-bg-surface, #161B22);
|
|
129
|
+
}
|
|
130
|
+
input:disabled {
|
|
131
|
+
opacity: 0.45;
|
|
132
|
+
cursor: not-allowed;
|
|
133
|
+
}
|
|
134
|
+
.prefix-slot, .suffix-slot {
|
|
135
|
+
position: absolute;
|
|
136
|
+
top: 50%;
|
|
137
|
+
transform: translateY(-50%);
|
|
138
|
+
color: var(--nx-text-3, #6E7681);
|
|
139
|
+
pointer-events: none;
|
|
140
|
+
}
|
|
141
|
+
.prefix-slot { left: 10px; }
|
|
142
|
+
.suffix-slot { right: 10px; }
|
|
143
|
+
:host([has-prefix]) input { padding-left: 34px; }
|
|
144
|
+
:host([has-suffix]) input { padding-right: 34px; }
|
|
145
|
+
.help {
|
|
146
|
+
font-size: 11px;
|
|
147
|
+
color: ${hasError ? "var(--nx-error,#EF4444)" : "var(--nx-text-3,#6E7681)"};
|
|
148
|
+
line-height: 1.4;
|
|
149
|
+
}
|
|
150
|
+
</style>
|
|
151
|
+
<div class="field" part="field">
|
|
152
|
+
${label ? `<label for="${inputId}">${label}${required ? '<span class="req" aria-hidden="true">*</span>' : ""}</label>` : ""}
|
|
153
|
+
<div class="input-wrap">
|
|
154
|
+
<span class="prefix-slot" aria-hidden="true"><slot name="prefix"></slot></span>
|
|
155
|
+
<input
|
|
156
|
+
id="${inputId}"
|
|
157
|
+
type="${type}"
|
|
158
|
+
placeholder="${placeholder}"
|
|
159
|
+
${value ? `value="${value}"` : ""}
|
|
160
|
+
${disabled ? "disabled" : ""}
|
|
161
|
+
${required ? "required" : ""}
|
|
162
|
+
${hasError ? `aria-invalid="true" aria-describedby="${inputId}-help"` : ""}
|
|
163
|
+
part="input"
|
|
164
|
+
/>
|
|
165
|
+
<span class="suffix-slot" aria-hidden="true"><slot name="suffix"></slot></span>
|
|
166
|
+
</div>
|
|
167
|
+
${error || helper
|
|
168
|
+
? `<span class="help" id="${inputId}-help" role="${hasError ? "alert" : ""}">${error || helper}</span>`
|
|
169
|
+
: ""}
|
|
170
|
+
</div>
|
|
171
|
+
`;
|
|
172
|
+
this.input = this.shadowRoot.querySelector("input");
|
|
173
|
+
if (this.input && value)
|
|
174
|
+
this.input.value = value;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/primitives/input.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/primitives/panel.ts"],"names":[],"mappings":"AAOA,qBAAa,QAAS,SAAQ,WAAW;IACvC,MAAM,KAAK,kBAAkB,aAE5B;;IAOD,iBAAiB;IAIjB,wBAAwB;IAIxB,OAAO,CAAC,OAAO;IAgBf,OAAO,CAAC,MAAM;CAqEf"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// @yugnex/nexui — NexPanel Web Component
|
|
2
|
+
// A themed container that uses the LayoutMatrix bitmask system.
|
|
3
|
+
// Shadow DOM safe: injects theme vars + compiled matrix CSS into its own shadow root.
|
|
4
|
+
import { nexui_compiler } from "../core/compiler";
|
|
5
|
+
import { LayoutMatrix } from "../core/matrix";
|
|
6
|
+
export class NexPanel extends HTMLElement {
|
|
7
|
+
static get observedAttributes() {
|
|
8
|
+
return ["matrix", "variant", "padding", "elevation"];
|
|
9
|
+
}
|
|
10
|
+
constructor() {
|
|
11
|
+
super();
|
|
12
|
+
this.attachShadow({ mode: "open" });
|
|
13
|
+
}
|
|
14
|
+
connectedCallback() {
|
|
15
|
+
this.render();
|
|
16
|
+
}
|
|
17
|
+
attributeChangedCallback() {
|
|
18
|
+
this.render();
|
|
19
|
+
}
|
|
20
|
+
getMask() {
|
|
21
|
+
const raw = this.getAttribute("matrix");
|
|
22
|
+
if (raw !== null)
|
|
23
|
+
return parseInt(raw, 16);
|
|
24
|
+
// Build from convenience attributes if matrix is not set
|
|
25
|
+
let mask = 0;
|
|
26
|
+
const padding = this.getAttribute("padding") ?? "md";
|
|
27
|
+
const padMap = {
|
|
28
|
+
none: LayoutMatrix.PAD_NONE, xs: LayoutMatrix.PAD_XS,
|
|
29
|
+
sm: LayoutMatrix.PAD_SM, md: LayoutMatrix.PAD_MD,
|
|
30
|
+
lg: LayoutMatrix.PAD_LG, xl: LayoutMatrix.PAD_XL,
|
|
31
|
+
};
|
|
32
|
+
mask |= padMap[padding] ?? LayoutMatrix.PAD_MD;
|
|
33
|
+
return mask;
|
|
34
|
+
}
|
|
35
|
+
render() {
|
|
36
|
+
if (!this.shadowRoot)
|
|
37
|
+
return;
|
|
38
|
+
const mask = this.getMask();
|
|
39
|
+
const variant = this.getAttribute("variant") ?? "base";
|
|
40
|
+
const elevation = this.getAttribute("elevation") ?? "0";
|
|
41
|
+
const bgMap = {
|
|
42
|
+
"void": "var(--nx-bg-void)",
|
|
43
|
+
"base": "var(--nx-bg-base)",
|
|
44
|
+
"surface": "var(--nx-bg-surface)",
|
|
45
|
+
"elevated": "var(--nx-bg-elevated)",
|
|
46
|
+
"overlay": "var(--nx-bg-overlay)",
|
|
47
|
+
"accent": "var(--nx-accent-dim)",
|
|
48
|
+
"live": "var(--nx-live-dim)",
|
|
49
|
+
"success": "var(--nx-success-dim)",
|
|
50
|
+
"error": "var(--nx-error-dim)",
|
|
51
|
+
"warning": "var(--nx-warning-dim)",
|
|
52
|
+
};
|
|
53
|
+
const shadowMap = {
|
|
54
|
+
"0": "none",
|
|
55
|
+
"1": "0 1px 3px rgba(0,0,0,0.50)",
|
|
56
|
+
"2": "0 4px 6px rgba(0,0,0,0.40), 0 2px 4px rgba(0,0,0,0.30)",
|
|
57
|
+
"3": "0 10px 15px rgba(0,0,0,0.50), 0 4px 6px rgba(0,0,0,0.30)",
|
|
58
|
+
"4": "0 20px 25px rgba(0,0,0,0.55), 0 8px 10px rgba(0,0,0,0.30)",
|
|
59
|
+
};
|
|
60
|
+
const matrixCSS = nexui_compiler.compileBitmaskToString(mask);
|
|
61
|
+
const matrixClass = `nx-m-${mask.toString(16).toUpperCase()}`;
|
|
62
|
+
const themeCSS = nexui_compiler.getThemeCSS(nexui_compiler.getActiveTheme(), ":host");
|
|
63
|
+
this.shadowRoot.innerHTML = `
|
|
64
|
+
<style>
|
|
65
|
+
${themeCSS}
|
|
66
|
+
${matrixCSS}
|
|
67
|
+
:host {
|
|
68
|
+
display: block;
|
|
69
|
+
}
|
|
70
|
+
.panel {
|
|
71
|
+
background: ${bgMap[variant] ?? bgMap["base"]};
|
|
72
|
+
border: 1px solid var(--nx-border);
|
|
73
|
+
border-radius: 8px;
|
|
74
|
+
box-shadow: ${shadowMap[elevation] ?? "none"};
|
|
75
|
+
color: var(--nx-text);
|
|
76
|
+
font-family: var(--nx-font-sans, system-ui, sans-serif);
|
|
77
|
+
transition: border-color 150ms ease, box-shadow 150ms ease;
|
|
78
|
+
}
|
|
79
|
+
.panel[data-variant="elevated"] {
|
|
80
|
+
border-color: var(--nx-border-strong);
|
|
81
|
+
}
|
|
82
|
+
.panel[data-variant="accent"] {
|
|
83
|
+
border-color: var(--nx-accent-border);
|
|
84
|
+
}
|
|
85
|
+
.panel[data-variant="live"] {
|
|
86
|
+
border-color: var(--nx-live-border);
|
|
87
|
+
}
|
|
88
|
+
.panel[data-variant="error"] {
|
|
89
|
+
border-color: var(--nx-error-dim);
|
|
90
|
+
}
|
|
91
|
+
.panel[data-variant="success"] {
|
|
92
|
+
border-color: var(--nx-success-dim);
|
|
93
|
+
}
|
|
94
|
+
</style>
|
|
95
|
+
<div class="panel ${matrixClass}" data-variant="${variant}">
|
|
96
|
+
<slot></slot>
|
|
97
|
+
</div>
|
|
98
|
+
`;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/primitives/panel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/primitives/progress.ts"],"names":[],"mappings":"AAYA,qBAAa,WAAY,SAAQ,WAAW;IAC1C,MAAM,KAAK,kBAAkB,aAE5B;;IAOD,iBAAiB;IACjB,wBAAwB;IAExB,OAAO,CAAC,MAAM;CAsFf"}
|