@n3rd-ai/ui 0.2.0 → 0.2.2
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/dist/{chunk-MZO6ECNX.js → chunk-P5L6UDFY.js} +1 -1
- package/dist/hooks/index.js +20 -19
- package/dist/index.css +22 -0
- package/dist/index.js +13 -7
- package/dist/theme/reset.css +11 -0
- package/package.json +1 -1
package/dist/hooks/index.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
export { useToast } from '../chunk-
|
|
2
|
+
export { useToast } from '../chunk-P5L6UDFY.js';
|
|
3
3
|
import { useState, useRef, useEffect, useCallback } from 'react';
|
|
4
4
|
|
|
5
5
|
function useTypewriter({ text, speed = 50, delay = 0, onComplete }) {
|
|
6
6
|
const [displayed, setDisplayed] = useState("");
|
|
7
7
|
const [done, setDone] = useState(false);
|
|
8
8
|
const hasRun = useRef(false);
|
|
9
|
+
const onCompleteRef = useRef(onComplete);
|
|
10
|
+
onCompleteRef.current = onComplete;
|
|
9
11
|
useEffect(() => {
|
|
10
12
|
if (hasRun.current) return;
|
|
11
13
|
hasRun.current = true;
|
|
@@ -19,7 +21,7 @@ function useTypewriter({ text, speed = 50, delay = 0, onComplete }) {
|
|
|
19
21
|
} else {
|
|
20
22
|
clearInterval(interval);
|
|
21
23
|
setDone(true);
|
|
22
|
-
|
|
24
|
+
onCompleteRef.current?.();
|
|
23
25
|
}
|
|
24
26
|
}, speed);
|
|
25
27
|
}, delay);
|
|
@@ -27,27 +29,26 @@ function useTypewriter({ text, speed = 50, delay = 0, onComplete }) {
|
|
|
27
29
|
clearTimeout(timeout);
|
|
28
30
|
clearInterval(interval);
|
|
29
31
|
};
|
|
30
|
-
}, [text, speed, delay
|
|
32
|
+
}, [text, speed, delay]);
|
|
31
33
|
return { displayed, done };
|
|
32
34
|
}
|
|
33
35
|
function useKeyboard(shortcuts) {
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
36
|
+
const shortcutsRef = useRef(shortcuts);
|
|
37
|
+
shortcutsRef.current = shortcuts;
|
|
38
|
+
const handleKeyDown = useCallback((e) => {
|
|
39
|
+
for (const shortcut of shortcutsRef.current) {
|
|
40
|
+
const keyMatch = e.key.toLowerCase() === shortcut.key.toLowerCase();
|
|
41
|
+
const ctrlMatch = (shortcut.ctrl ?? false) === e.ctrlKey;
|
|
42
|
+
const metaMatch = (shortcut.meta ?? false) === e.metaKey;
|
|
43
|
+
const shiftMatch = (shortcut.shift ?? false) === e.shiftKey;
|
|
44
|
+
const altMatch = (shortcut.alt ?? false) === e.altKey;
|
|
45
|
+
if (keyMatch && ctrlMatch && metaMatch && shiftMatch && altMatch) {
|
|
46
|
+
e.preventDefault();
|
|
47
|
+
shortcut.handler(e);
|
|
48
|
+
return;
|
|
47
49
|
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
);
|
|
50
|
+
}
|
|
51
|
+
}, []);
|
|
51
52
|
useEffect(() => {
|
|
52
53
|
document.addEventListener("keydown", handleKeyDown);
|
|
53
54
|
return () => document.removeEventListener("keydown", handleKeyDown);
|
package/dist/index.css
CHANGED
|
@@ -17,6 +17,15 @@
|
|
|
17
17
|
transform: translateY(0);
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
+
@media (max-width: 640px) {
|
|
21
|
+
.n3rd-nav {
|
|
22
|
+
padding: var(--n3rd-space-2) var(--n3rd-space-3);
|
|
23
|
+
font-size: var(--n3rd-text-xs);
|
|
24
|
+
}
|
|
25
|
+
.n3rd-footer-starfield {
|
|
26
|
+
display: none;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
20
29
|
|
|
21
30
|
/* src/components/layout/Box.css */
|
|
22
31
|
.n3rd-box {
|
|
@@ -62,6 +71,13 @@
|
|
|
62
71
|
line-height: var(--n3rd-line-height);
|
|
63
72
|
}
|
|
64
73
|
|
|
74
|
+
/* src/components/layout/Grid.css */
|
|
75
|
+
@media (max-width: 640px) {
|
|
76
|
+
.n3rd-grid {
|
|
77
|
+
grid-template-columns: 1fr !important;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
65
81
|
/* src/components/display/Footer.css */
|
|
66
82
|
.n3rd-footer {
|
|
67
83
|
font-family: var(--n3rd-font);
|
|
@@ -90,6 +106,9 @@
|
|
|
90
106
|
flex-direction: column;
|
|
91
107
|
align-items: center;
|
|
92
108
|
margin-bottom: 0;
|
|
109
|
+
max-width: 480px;
|
|
110
|
+
margin-left: auto;
|
|
111
|
+
margin-right: auto;
|
|
93
112
|
}
|
|
94
113
|
.n3rd-footer-sun-line {
|
|
95
114
|
height: 6px;
|
|
@@ -104,6 +123,9 @@
|
|
|
104
123
|
flex-direction: column;
|
|
105
124
|
align-items: center;
|
|
106
125
|
margin-bottom: var(--n3rd-space-6);
|
|
126
|
+
max-width: 480px;
|
|
127
|
+
margin-left: auto;
|
|
128
|
+
margin-right: auto;
|
|
107
129
|
}
|
|
108
130
|
.n3rd-footer-horizon-bright {
|
|
109
131
|
width: 100%;
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import "./index.css";
|
|
3
|
-
import { ToastProvider } from './chunk-
|
|
4
|
-
export { ToastProvider, useToast } from './chunk-
|
|
3
|
+
import { ToastProvider } from './chunk-P5L6UDFY.js';
|
|
4
|
+
export { ToastProvider, useToast } from './chunk-P5L6UDFY.js';
|
|
5
5
|
import { getBorderChars } from './chunk-CBVIEAN7.js';
|
|
6
6
|
export { BORDER_CHARS, getBorderChars } from './chunk-CBVIEAN7.js';
|
|
7
7
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
@@ -119,7 +119,7 @@ function Grid({ children, columns = 3, gap = "md", className, style }) {
|
|
|
119
119
|
gap: GAP_MAP3[gap],
|
|
120
120
|
...style
|
|
121
121
|
};
|
|
122
|
-
return /* @__PURE__ */ jsx("div", { className
|
|
122
|
+
return /* @__PURE__ */ jsx("div", { className: `n3rd-grid ${className ?? ""}`, style: gridStyle, children });
|
|
123
123
|
}
|
|
124
124
|
var CHARS = {
|
|
125
125
|
single: "\u2500",
|
|
@@ -168,6 +168,7 @@ function Page({ children, maxWidth = "1200px", className, style }) {
|
|
|
168
168
|
margin: "0 auto",
|
|
169
169
|
padding: "var(--n3rd-space-6) var(--n3rd-space-4)",
|
|
170
170
|
minHeight: "100vh",
|
|
171
|
+
overflowX: "hidden",
|
|
171
172
|
...style
|
|
172
173
|
};
|
|
173
174
|
return /* @__PURE__ */ jsx("main", { className, style: pageStyle, children });
|
|
@@ -356,6 +357,7 @@ function Table({ columns, rows, border = "single", className, style }) {
|
|
|
356
357
|
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { children: columns.map((col) => /* @__PURE__ */ jsx(
|
|
357
358
|
"th",
|
|
358
359
|
{
|
|
360
|
+
scope: "col",
|
|
359
361
|
style: {
|
|
360
362
|
textAlign: "left",
|
|
361
363
|
padding: "var(--n3rd-space-2)",
|
|
@@ -550,7 +552,8 @@ function Logo({ text, gradient = false, accent, className, style }) {
|
|
|
550
552
|
fontSize: "var(--n3rd-text-sm)",
|
|
551
553
|
fontWeight: 700,
|
|
552
554
|
whiteSpace: "pre",
|
|
553
|
-
lineHeight: 1
|
|
555
|
+
lineHeight: 1,
|
|
556
|
+
letterSpacing: "-0.05em",
|
|
554
557
|
color: accent ? `var(--n3rd-accent-${accent})` : "var(--n3rd-text-primary)",
|
|
555
558
|
...style
|
|
556
559
|
};
|
|
@@ -844,6 +847,7 @@ function Progress({
|
|
|
844
847
|
style: progressStyle,
|
|
845
848
|
role: "progressbar",
|
|
846
849
|
"aria-valuenow": value,
|
|
850
|
+
"aria-valuemin": 0,
|
|
847
851
|
"aria-valuemax": max,
|
|
848
852
|
children: [
|
|
849
853
|
/* @__PURE__ */ jsxs("span", { children: [
|
|
@@ -898,6 +902,8 @@ function Typewriter({
|
|
|
898
902
|
const [displayed, setDisplayed] = useState("");
|
|
899
903
|
const [done, setDone] = useState(false);
|
|
900
904
|
const hasRun = useRef(false);
|
|
905
|
+
const onCompleteRef = useRef(onComplete);
|
|
906
|
+
onCompleteRef.current = onComplete;
|
|
901
907
|
useEffect(() => {
|
|
902
908
|
if (hasRun.current) return;
|
|
903
909
|
hasRun.current = true;
|
|
@@ -911,7 +917,7 @@ function Typewriter({
|
|
|
911
917
|
} else {
|
|
912
918
|
clearInterval(interval);
|
|
913
919
|
setDone(true);
|
|
914
|
-
|
|
920
|
+
onCompleteRef.current?.();
|
|
915
921
|
}
|
|
916
922
|
}, speed);
|
|
917
923
|
}, delay);
|
|
@@ -919,7 +925,7 @@ function Typewriter({
|
|
|
919
925
|
clearTimeout(timeout);
|
|
920
926
|
clearInterval(interval);
|
|
921
927
|
};
|
|
922
|
-
}, [text, speed, delay
|
|
928
|
+
}, [text, speed, delay]);
|
|
923
929
|
return /* @__PURE__ */ jsxs("span", { className, children: [
|
|
924
930
|
displayed,
|
|
925
931
|
!done && cursor !== false && /* @__PURE__ */ jsx(Cursor, { style: cursor })
|
|
@@ -933,7 +939,7 @@ function Scanline({ opacity = 0.03 }) {
|
|
|
933
939
|
width: "100%",
|
|
934
940
|
height: "100%",
|
|
935
941
|
pointerEvents: "none",
|
|
936
|
-
zIndex: 9999,
|
|
942
|
+
zIndex: "var(--n3rd-z-scanline, 9999)",
|
|
937
943
|
background: `repeating-linear-gradient(
|
|
938
944
|
0deg,
|
|
939
945
|
transparent,
|
package/dist/theme/reset.css
CHANGED
|
@@ -65,6 +65,17 @@ pre {
|
|
|
65
65
|
font-family: var(--n3rd-font);
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
+
table {
|
|
69
|
+
border-collapse: collapse;
|
|
70
|
+
border-spacing: 0;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
th,
|
|
74
|
+
td {
|
|
75
|
+
padding: 0;
|
|
76
|
+
text-align: left;
|
|
77
|
+
}
|
|
78
|
+
|
|
68
79
|
::selection {
|
|
69
80
|
background: var(--n3rd-accent-purple);
|
|
70
81
|
color: var(--n3rd-bg-primary);
|