@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.
Files changed (138) hide show
  1. package/LICENSE +59 -0
  2. package/css/nexui-base.css +157 -0
  3. package/css/nexui-icons.css +86 -0
  4. package/css/nexui-tokens.css +113 -0
  5. package/css/nexui.css +16 -0
  6. package/dist/assets/geometry.d.ts +98 -0
  7. package/dist/assets/geometry.d.ts.map +1 -0
  8. package/dist/assets/geometry.js +114 -0
  9. package/dist/assets/geometry.js.map +1 -0
  10. package/dist/assets/typography.d.ts +3 -0
  11. package/dist/assets/typography.d.ts.map +1 -0
  12. package/dist/assets/typography.js +178 -0
  13. package/dist/assets/typography.js.map +1 -0
  14. package/dist/core/compiler.d.ts +30 -0
  15. package/dist/core/compiler.d.ts.map +1 -0
  16. package/dist/core/compiler.js +124 -0
  17. package/dist/core/compiler.js.map +1 -0
  18. package/dist/core/cx.d.ts +7 -0
  19. package/dist/core/cx.d.ts.map +1 -0
  20. package/dist/core/cx.js +34 -0
  21. package/dist/core/cx.js.map +1 -0
  22. package/dist/core/matrix.d.ts +118 -0
  23. package/dist/core/matrix.d.ts.map +1 -0
  24. package/dist/core/matrix.js +180 -0
  25. package/dist/core/matrix.js.map +1 -0
  26. package/dist/index.d.ts +27 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +74 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/primitives/avatar.d.ts +8 -0
  31. package/dist/primitives/avatar.d.ts.map +1 -0
  32. package/dist/primitives/avatar.js +146 -0
  33. package/dist/primitives/avatar.js.map +1 -0
  34. package/dist/primitives/badge.d.ts +8 -0
  35. package/dist/primitives/badge.d.ts.map +1 -0
  36. package/dist/primitives/badge.js +88 -0
  37. package/dist/primitives/badge.js.map +1 -0
  38. package/dist/primitives/button.d.ts +10 -0
  39. package/dist/primitives/button.d.ts.map +1 -0
  40. package/dist/primitives/button.js +137 -0
  41. package/dist/primitives/button.js.map +1 -0
  42. package/dist/primitives/checkbox.d.ts +13 -0
  43. package/dist/primitives/checkbox.d.ts.map +1 -0
  44. package/dist/primitives/checkbox.js +107 -0
  45. package/dist/primitives/checkbox.js.map +1 -0
  46. package/dist/primitives/input.d.ts +14 -0
  47. package/dist/primitives/input.d.ts.map +1 -0
  48. package/dist/primitives/input.js +177 -0
  49. package/dist/primitives/input.js.map +1 -0
  50. package/dist/primitives/panel.d.ts +9 -0
  51. package/dist/primitives/panel.d.ts.map +1 -0
  52. package/dist/primitives/panel.js +101 -0
  53. package/dist/primitives/panel.js.map +1 -0
  54. package/dist/primitives/progress.d.ts +8 -0
  55. package/dist/primitives/progress.d.ts.map +1 -0
  56. package/dist/primitives/progress.js +105 -0
  57. package/dist/primitives/progress.js.map +1 -0
  58. package/dist/primitives/separator.d.ts +8 -0
  59. package/dist/primitives/separator.d.ts.map +1 -0
  60. package/dist/primitives/separator.js +69 -0
  61. package/dist/primitives/separator.js.map +1 -0
  62. package/dist/primitives/skeleton.d.ts +8 -0
  63. package/dist/primitives/skeleton.d.ts.map +1 -0
  64. package/dist/primitives/skeleton.js +61 -0
  65. package/dist/primitives/skeleton.js.map +1 -0
  66. package/dist/primitives/spinner.d.ts +8 -0
  67. package/dist/primitives/spinner.d.ts.map +1 -0
  68. package/dist/primitives/spinner.js +64 -0
  69. package/dist/primitives/spinner.js.map +1 -0
  70. package/dist/primitives/status-ring.d.ts +8 -0
  71. package/dist/primitives/status-ring.d.ts.map +1 -0
  72. package/dist/primitives/status-ring.js +101 -0
  73. package/dist/primitives/status-ring.js.map +1 -0
  74. package/dist/primitives/switch.d.ts +12 -0
  75. package/dist/primitives/switch.d.ts.map +1 -0
  76. package/dist/primitives/switch.js +124 -0
  77. package/dist/primitives/switch.js.map +1 -0
  78. package/dist/primitives/text-stream.d.ts +23 -0
  79. package/dist/primitives/text-stream.d.ts.map +1 -0
  80. package/dist/primitives/text-stream.js +167 -0
  81. package/dist/primitives/text-stream.js.map +1 -0
  82. package/dist/tokens/colors.d.ts +127 -0
  83. package/dist/tokens/colors.d.ts.map +1 -0
  84. package/dist/tokens/colors.js +135 -0
  85. package/dist/tokens/colors.js.map +1 -0
  86. package/dist/tokens/motion.d.ts +37 -0
  87. package/dist/tokens/motion.d.ts.map +1 -0
  88. package/dist/tokens/motion.js +93 -0
  89. package/dist/tokens/motion.js.map +1 -0
  90. package/dist/tokens/shadows.d.ts +34 -0
  91. package/dist/tokens/shadows.d.ts.map +1 -0
  92. package/dist/tokens/shadows.js +45 -0
  93. package/dist/tokens/shadows.js.map +1 -0
  94. package/dist/tokens/spacing.d.ts +69 -0
  95. package/dist/tokens/spacing.d.ts.map +1 -0
  96. package/dist/tokens/spacing.js +71 -0
  97. package/dist/tokens/spacing.js.map +1 -0
  98. package/dist/tokens/type.d.ts +166 -0
  99. package/dist/tokens/type.d.ts.map +1 -0
  100. package/dist/tokens/type.js +215 -0
  101. package/dist/tokens/type.js.map +1 -0
  102. package/fonts/NexuiIcons.woff2 +0 -0
  103. package/fonts/NexuiMono-Regular.otf +0 -0
  104. package/fonts/NexuiMono-Regular.woff2 +0 -0
  105. package/fonts/NexuiSans-Bold.otf +0 -0
  106. package/fonts/NexuiSans-Bold.woff2 +0 -0
  107. package/fonts/NexuiSans-Medium.otf +0 -0
  108. package/fonts/NexuiSans-Medium.woff2 +0 -0
  109. package/fonts/NexuiSans-Regular.otf +0 -0
  110. package/fonts/NexuiSans-Regular.woff2 +0 -0
  111. package/native/Cargo.toml +16 -0
  112. package/native/src/lib.rs +127 -0
  113. package/nexui-utils.css +485 -0
  114. package/package.json +58 -0
  115. package/src/assets/geometry.ts +144 -0
  116. package/src/assets/typography.ts +184 -0
  117. package/src/core/compiler.ts +139 -0
  118. package/src/core/cx.ts +50 -0
  119. package/src/core/matrix.ts +195 -0
  120. package/src/index.ts +78 -0
  121. package/src/primitives/avatar.ts +159 -0
  122. package/src/primitives/badge.ts +98 -0
  123. package/src/primitives/button.ts +149 -0
  124. package/src/primitives/checkbox.ts +113 -0
  125. package/src/primitives/input.ts +187 -0
  126. package/src/primitives/panel.ts +111 -0
  127. package/src/primitives/progress.ts +112 -0
  128. package/src/primitives/separator.ts +73 -0
  129. package/src/primitives/skeleton.ts +68 -0
  130. package/src/primitives/spinner.ts +71 -0
  131. package/src/primitives/status-ring.ts +109 -0
  132. package/src/primitives/switch.ts +134 -0
  133. package/src/primitives/text-stream.ts +187 -0
  134. package/src/tokens/colors.ts +149 -0
  135. package/src/tokens/motion.ts +97 -0
  136. package/src/tokens/shadows.ts +58 -0
  137. package/src/tokens/spacing.ts +79 -0
  138. 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,9 @@
1
+ export declare class NexPanel extends HTMLElement {
2
+ static get observedAttributes(): string[];
3
+ constructor();
4
+ connectedCallback(): void;
5
+ attributeChangedCallback(): void;
6
+ private getMask;
7
+ private render;
8
+ }
9
+ //# sourceMappingURL=panel.d.ts.map
@@ -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,8 @@
1
+ export declare class NexProgress extends HTMLElement {
2
+ static get observedAttributes(): string[];
3
+ constructor();
4
+ connectedCallback(): void;
5
+ attributeChangedCallback(): void;
6
+ private render;
7
+ }
8
+ //# sourceMappingURL=progress.d.ts.map
@@ -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"}