@prasadj28/react-neu 1.0.29 → 1.0.30
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/App.d.ts +2 -0
- package/dist/components/Button/Button.css.d.ts +1 -0
- package/dist/components/Button/Button.d.ts +3 -0
- package/dist/components/Card/Card.css.d.ts +1 -0
- package/dist/components/Card/Card.d.ts +3 -0
- package/dist/components/Checkbox/Checkbox.css.d.ts +5 -0
- package/dist/components/Checkbox/Checkbox.d.ts +23 -0
- package/dist/components/Icon/Icon.css.d.ts +3 -0
- package/dist/components/Icon/Icon.d.ts +18 -0
- package/dist/components/Icon/IconPaths.d.ts +3 -0
- package/dist/components/Radio/Radio.css.d.ts +6 -0
- package/dist/components/Radio/Radio.d.ts +25 -0
- package/dist/components/Ridge/Ridge.css.d.ts +1 -0
- package/dist/components/Ridge/Ridge.d.ts +15 -0
- package/dist/components/Slider/Slider.css.d.ts +3 -0
- package/dist/components/Slider/Slider.d.ts +15 -0
- package/dist/components/TextInput/TextInput.css.d.ts +1 -0
- package/dist/components/TextInput/TextInput.d.ts +5 -0
- package/dist/components/Toggle/Toggle.css.d.ts +6 -0
- package/dist/components/Toggle/Toggle.d.ts +29 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/index.cjs +7 -6294
- package/dist/index.d.ts +13 -165
- package/dist/index.js +590 -5975
- package/dist/main.d.ts +0 -0
- package/dist/react-neu.css +1 -0
- package/dist/styles/colorUtils.d.ts +3 -0
- package/dist/styles/neumorphicEngine.d.ts +14 -0
- package/dist/styles/theme.css.d.ts +11 -0
- package/dist/styles/types.d.ts +31 -0
- package/dist/utils/colorUtils.d.ts +3 -0
- package/dist/utils/neuEngine.d.ts +13 -0
- package/dist/vite.svg +1 -0
- package/package.json +9 -8
- package/dist/index.d.cts +0 -165
package/dist/main.d.ts
ADDED
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--_1wjpzpi0: #e0e0e0;--_1wjpzpi1: #1e1e1e;--_1wjpzpi2: #3b82f6;--_1wjpzpi3: 145deg;--_1wjpzpi4: .15}body{margin:0;padding:0;box-sizing:border-box;background-color:var(--_1wjpzpi0);color:var(--_1wjpzpi1);font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;display:flex;flex-direction:column;justify-content:center;align-items:center;min-height:100vh}*{box-sizing:border-box}.v9ajg60{display:flex;flex-direction:column;padding:20px;box-sizing:border-box;color:var(--_1wjpzpi1);transition:all .3s ease-in-out}.dgtiea0{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;padding:0;overflow:hidden}._1gsbumb0{display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:1rem;font-weight:600;color:var(--_1wjpzpi1);border:none;outline:none;cursor:pointer;text-decoration:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;user-select:none;touch-action:manipulation}.kou9xh0{position:relative;display:inline-flex;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none;cursor:pointer;transition:transform .1s ease;isolation:isolate}.kou9xh0:active{transform:scale(.95)}.kou9xh1{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;align-items:center;justify-content:center;transition:all .3s cubic-bezier(.4,0,.2,1)}.kou9xh2{width:50%;height:50%;fill:none;stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;transition:all .3s ease}._199tft90{font-family:inherit;width:100%;box-sizing:border-box;cursor:text;transition:all .25s ease;border:none;outline:none}.gbo3hi0{display:inline-flex;align-items:center;gap:12px;cursor:pointer;-webkit-user-select:none;user-select:none;font-size:1rem;position:relative}.gbo3hi1{position:absolute;opacity:0;cursor:pointer;height:0;width:0}.gbo3hi2{position:relative;display:flex;align-items:center;justify-content:center;transition:all .3s ease;box-sizing:border-box}.gbo3hi3{position:absolute;display:flex;align-items:center;justify-content:center;width:100%;height:100%;pointer-events:none}.gbo3hi4{width:60%;height:60%;stroke-linecap:round;stroke-linejoin:round;fill:none;transition:all .3s cubic-bezier(.175,.885,.32,1.275)}._1q2jya40{display:inline-flex;align-items:center;gap:12px;cursor:pointer;-webkit-user-select:none;user-select:none;font-size:1rem;position:relative}._1q2jya41{position:absolute;opacity:0;cursor:pointer;height:0;width:0}._1q2jya42{position:relative;display:flex;align-items:center;justify-content:center;transition:all .3s ease;box-sizing:border-box}._1q2jya43{position:absolute;display:flex;align-items:center;justify-content:center;width:100%;height:100%;pointer-events:none}._1q2jya44{width:50%;height:50%;border-radius:50%;background-color:currentColor;transition:transform .2s cubic-bezier(.175,.885,.32,1.275),opacity .2s ease}._1q2jya45{width:60%;height:60%;stroke-linecap:round;stroke-linejoin:round;fill:none;transition:all .3s cubic-bezier(.175,.885,.32,1.275)}.ir7c9x0{display:inline-flex;align-items:center;gap:12px;cursor:pointer;-webkit-user-select:none;user-select:none;position:relative}.ir7c9x1{position:absolute;opacity:0;cursor:pointer;height:0;width:0}.ir7c9x2{position:relative;transition:all .3s ease;display:flex;align-items:center;box-sizing:border-box}.ir7c9x3{position:absolute;display:flex;align-items:center;justify-content:center;transition:transform .3s cubic-bezier(.4,0,.2,1),box-shadow .3s ease;z-index:2}.ir7c9x4{position:absolute;display:flex;align-items:center;justify-content:center;width:100%;height:100%;pointer-events:none}.ir7c9x5{width:60%;height:60%;stroke-linecap:round;stroke-linejoin:round;fill:none;transition:all .3s cubic-bezier(.175,.885,.32,1.275)}._17y2xzl0{position:relative;width:100%;height:32px;display:flex;align-items:center;touch-action:none;cursor:pointer;-webkit-user-select:none;user-select:none}._17y2xzl1{width:100%;height:12px;position:relative}._17y2xzl2{position:absolute;top:50%;width:24px;height:24px;border-radius:50%;transform:translate(-50%,-50%);cursor:grab;transition:box-shadow .2s ease,transform .1s ease;z-index:2}._17y2xzl2:active{cursor:grabbing;transform:translate(-50%,-50%) scale(.95)}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { NeumorphicProps } from './types';
|
|
2
|
+
interface EngineOptions extends NeumorphicProps {
|
|
3
|
+
state?: "default" | "hover" | "active";
|
|
4
|
+
}
|
|
5
|
+
export declare function getNeumorphicStyle(options: EngineOptions): {
|
|
6
|
+
background: string;
|
|
7
|
+
boxShadow: string;
|
|
8
|
+
borderRadius: string;
|
|
9
|
+
border: string;
|
|
10
|
+
transform: string;
|
|
11
|
+
outline: string;
|
|
12
|
+
transition: string;
|
|
13
|
+
};
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { HTMLAttributes, ReactNode } from 'react';
|
|
2
|
+
export type NeuVariant = "flat" | "pop" | "sink" | "inset";
|
|
3
|
+
export type NeuShape = "square" | "rounded" | "circle" | "pill";
|
|
4
|
+
export type NeuSurface = "flat" | "convex" | "concave";
|
|
5
|
+
export interface NeumorphicConfig {
|
|
6
|
+
distance: number;
|
|
7
|
+
blur: number;
|
|
8
|
+
intensity: number;
|
|
9
|
+
angleDeg: number;
|
|
10
|
+
color: string;
|
|
11
|
+
}
|
|
12
|
+
export interface NeumorphicProps {
|
|
13
|
+
variant?: NeuVariant;
|
|
14
|
+
surface?: NeuSurface;
|
|
15
|
+
shape?: NeuShape;
|
|
16
|
+
color?: string;
|
|
17
|
+
elevation?: number;
|
|
18
|
+
intensity?: number;
|
|
19
|
+
angleDeg?: number;
|
|
20
|
+
border?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* If true, active/focus state keeps the outer drop shadow while adding an inner shadow.
|
|
23
|
+
* Creates a "trench" or "ridge" effect where edges stay raised but center sinks.
|
|
24
|
+
* Only applies to 'pop' variant.
|
|
25
|
+
*/
|
|
26
|
+
ridge?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export type NeuComponentProps<T extends HTMLElement> = HTMLAttributes<T> & NeumorphicProps & {
|
|
29
|
+
disabled?: boolean;
|
|
30
|
+
children?: ReactNode;
|
|
31
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type NeumorphicVariant = "flat" | "convex" | "concave" | "pressed";
|
|
2
|
+
export type NeumorphicState = "default" | "hover" | "active" | "disabled" | "focus";
|
|
3
|
+
export interface NeumorphicOptions {
|
|
4
|
+
variant?: NeumorphicVariant;
|
|
5
|
+
color?: string;
|
|
6
|
+
angleDeg?: number;
|
|
7
|
+
distance?: number;
|
|
8
|
+
blur?: number;
|
|
9
|
+
intensity?: number;
|
|
10
|
+
elevation?: number;
|
|
11
|
+
border?: boolean;
|
|
12
|
+
state?: NeumorphicState;
|
|
13
|
+
}
|
package/dist/vite.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prasadj28/react-neu",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.30",
|
|
4
4
|
"description": "Neumorphic components for react frontend",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
@@ -28,15 +28,14 @@
|
|
|
28
28
|
"import": "./dist/index.js",
|
|
29
29
|
"require": "./dist/index.cjs"
|
|
30
30
|
},
|
|
31
|
-
"./style.css": "./dist/
|
|
31
|
+
"./style.css": "./dist/react-neu.css"
|
|
32
32
|
},
|
|
33
33
|
"files": [
|
|
34
34
|
"dist"
|
|
35
35
|
],
|
|
36
36
|
"scripts": {
|
|
37
|
-
"dev": "vite
|
|
38
|
-
"build": "
|
|
39
|
-
"build:vite": "LIB=true vite build",
|
|
37
|
+
"dev": "vite",
|
|
38
|
+
"build": "LIB=true vite build",
|
|
40
39
|
"lint": "eslint .",
|
|
41
40
|
"preview": "vite preview"
|
|
42
41
|
},
|
|
@@ -45,8 +44,6 @@
|
|
|
45
44
|
"react-dom": "^19.1.1"
|
|
46
45
|
},
|
|
47
46
|
"devDependencies": {
|
|
48
|
-
"react": "^19.1.1",
|
|
49
|
-
"react-dom": "^19.1.1",
|
|
50
47
|
"@eslint/js": "^9.36.0",
|
|
51
48
|
"@types/node": "^24.6.0",
|
|
52
49
|
"@types/react": "^19.1.16",
|
|
@@ -54,13 +51,17 @@
|
|
|
54
51
|
"@vanilla-extract/css": "^1.17.4",
|
|
55
52
|
"@vanilla-extract/vite-plugin": "^5.1.1",
|
|
56
53
|
"@vitejs/plugin-react": "^5.0.4",
|
|
54
|
+
"ajv": "^8.17.1",
|
|
57
55
|
"eslint": "^9.36.0",
|
|
58
56
|
"eslint-plugin-react-hooks": "^5.2.0",
|
|
59
57
|
"eslint-plugin-react-refresh": "^0.4.22",
|
|
60
58
|
"globals": "^16.4.0",
|
|
59
|
+
"react": "^19.1.1",
|
|
60
|
+
"react-dom": "^19.1.1",
|
|
61
61
|
"tsup": "^8.5.1",
|
|
62
62
|
"typescript": "~5.9.3",
|
|
63
63
|
"typescript-eslint": "^8.45.0",
|
|
64
|
-
"vite": "^7.1.7"
|
|
64
|
+
"vite": "^7.1.7",
|
|
65
|
+
"vite-plugin-dts": "^4.5.4"
|
|
65
66
|
}
|
|
66
67
|
}
|
package/dist/index.d.cts
DELETED
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
import React, { HTMLAttributes, ReactNode } from 'react';
|
|
2
|
-
|
|
3
|
-
type NeuVariant = "flat" | "pop" | "sink" | "inset";
|
|
4
|
-
type NeuShape = "square" | "rounded" | "circle" | "pill";
|
|
5
|
-
type NeuSurface = "flat" | "convex" | "concave";
|
|
6
|
-
interface NeumorphicProps {
|
|
7
|
-
variant?: NeuVariant;
|
|
8
|
-
surface?: NeuSurface;
|
|
9
|
-
shape?: NeuShape;
|
|
10
|
-
color?: string;
|
|
11
|
-
elevation?: number;
|
|
12
|
-
intensity?: number;
|
|
13
|
-
angleDeg?: number;
|
|
14
|
-
border?: boolean;
|
|
15
|
-
/**
|
|
16
|
-
* If true, active/focus state keeps the outer drop shadow while adding an inner shadow.
|
|
17
|
-
* Creates a "trench" or "ridge" effect where edges stay raised but center sinks.
|
|
18
|
-
* Only applies to 'pop' variant.
|
|
19
|
-
*/
|
|
20
|
-
ridge?: boolean;
|
|
21
|
-
}
|
|
22
|
-
type NeuComponentProps<T extends HTMLElement> = HTMLAttributes<T> & NeumorphicProps & {
|
|
23
|
-
disabled?: boolean;
|
|
24
|
-
children?: ReactNode;
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
declare const NeuCard: React.FC<NeuComponentProps<HTMLDivElement>>;
|
|
28
|
-
|
|
29
|
-
interface RidgeProps extends NeumorphicProps {
|
|
30
|
-
children: React.ReactNode;
|
|
31
|
-
/**
|
|
32
|
-
* Sets the thickness of the ridge frame (padding).
|
|
33
|
-
* Can be a number (pixels) or string (e.g., "1rem").
|
|
34
|
-
* @default "10px"
|
|
35
|
-
*/
|
|
36
|
-
ridgeWidth?: number | string;
|
|
37
|
-
className?: string;
|
|
38
|
-
style?: React.CSSProperties;
|
|
39
|
-
}
|
|
40
|
-
declare const NeuRidge: React.FC<RidgeProps>;
|
|
41
|
-
|
|
42
|
-
declare const NeuButton: React.FC<NeuComponentProps<HTMLButtonElement>>;
|
|
43
|
-
|
|
44
|
-
type IconName = "heart" | "bookmark" | "comment" | "star" | "circle" | "square" | "triangle" | "diamond" | "user" | "gear" | "bell" | "search" | "share" | "mail" | "send" | "camera" | "mic";
|
|
45
|
-
|
|
46
|
-
interface IconProps extends NeumorphicProps {
|
|
47
|
-
icon: IconName;
|
|
48
|
-
filled?: boolean;
|
|
49
|
-
fillColor?: string;
|
|
50
|
-
size?: string;
|
|
51
|
-
/** * If true, removes the background button shape entirely.
|
|
52
|
-
* You will see ONLY the icon.
|
|
53
|
-
*/
|
|
54
|
-
transparent?: boolean;
|
|
55
|
-
className?: string;
|
|
56
|
-
style?: React.CSSProperties;
|
|
57
|
-
onClick?: () => void;
|
|
58
|
-
}
|
|
59
|
-
declare const NeuIcon: React.FC<IconProps>;
|
|
60
|
-
|
|
61
|
-
type TextInputProps = NeumorphicProps & React.InputHTMLAttributes<HTMLInputElement>;
|
|
62
|
-
declare const NeuTextInput: React.FC<TextInputProps>;
|
|
63
|
-
|
|
64
|
-
interface CheckboxProps extends NeumorphicProps, Omit<React.InputHTMLAttributes<HTMLInputElement>, "size" | "color"> {
|
|
65
|
-
/**
|
|
66
|
-
* The visual style when checked.
|
|
67
|
-
* - 'check': Shows a checkmark.
|
|
68
|
-
* - 'cross': Shows an X.
|
|
69
|
-
* - 'fill': No icon, the button just sinks (simulates pressing/filling).
|
|
70
|
-
*/
|
|
71
|
-
selectionStyle?: "check" | "cross" | "fill";
|
|
72
|
-
/**
|
|
73
|
-
* Color of the Check or Cross icon.
|
|
74
|
-
* @default "#333"
|
|
75
|
-
*/
|
|
76
|
-
selectedColor?: string;
|
|
77
|
-
/**
|
|
78
|
-
* Width/Height of the checkbox.
|
|
79
|
-
* @default "26px"
|
|
80
|
-
*/
|
|
81
|
-
size?: number | string;
|
|
82
|
-
}
|
|
83
|
-
declare const NeuCheckbox: React.FC<CheckboxProps>;
|
|
84
|
-
|
|
85
|
-
interface RadioProps extends NeumorphicProps, Omit<React.InputHTMLAttributes<HTMLInputElement>, "size" | "color"> {
|
|
86
|
-
/**
|
|
87
|
-
* Visual style when selected.
|
|
88
|
-
* - 'dot': Standard radio circle.
|
|
89
|
-
* - 'check': Checkmark.
|
|
90
|
-
* - 'cross': X mark.
|
|
91
|
-
* - 'fill': Sinks in (Inset) without an icon.
|
|
92
|
-
* @default "dot"
|
|
93
|
-
*/
|
|
94
|
-
selectionStyle?: "dot" | "check" | "cross" | "fill";
|
|
95
|
-
/**
|
|
96
|
-
* Color of the Dot/Icon.
|
|
97
|
-
* @default "#1e1e1e"
|
|
98
|
-
*/
|
|
99
|
-
selectedColor?: string;
|
|
100
|
-
/**
|
|
101
|
-
* Size of the radio button.
|
|
102
|
-
* @default "26px"
|
|
103
|
-
*/
|
|
104
|
-
size?: number | string;
|
|
105
|
-
}
|
|
106
|
-
declare const NeuRadio: React.FC<RadioProps>;
|
|
107
|
-
|
|
108
|
-
interface SwitchProps extends NeumorphicProps, Omit<React.InputHTMLAttributes<HTMLInputElement>, "size" | "color" | "shape"> {
|
|
109
|
-
/**
|
|
110
|
-
* Visual style of the thumb when active.
|
|
111
|
-
* - 'plain': Standard empty thumb.
|
|
112
|
-
* - 'check': Shows a checkmark when ON.
|
|
113
|
-
* - 'cross': Shows an X when ON.
|
|
114
|
-
*/
|
|
115
|
-
selectionStyle?: "plain" | "check" | "cross";
|
|
116
|
-
/**
|
|
117
|
-
* Color of the Icon (if used).
|
|
118
|
-
* @default "#1e1e1e"
|
|
119
|
-
*/
|
|
120
|
-
selectedColor?: string;
|
|
121
|
-
/**
|
|
122
|
-
* Width of the switch track. Height is automatically calculated (approx 1/2 of width).
|
|
123
|
-
* @default "50px"
|
|
124
|
-
*/
|
|
125
|
-
width?: string;
|
|
126
|
-
/**
|
|
127
|
-
* Shape of the switch.
|
|
128
|
-
* - 'pill': Standard capsule.
|
|
129
|
-
* - 'square': Rectangular box.
|
|
130
|
-
*/
|
|
131
|
-
shape?: "pill" | "square" | "rounded";
|
|
132
|
-
}
|
|
133
|
-
declare const NeuSwitch: React.FC<SwitchProps>;
|
|
134
|
-
|
|
135
|
-
interface SliderProps extends NeumorphicProps {
|
|
136
|
-
min?: number;
|
|
137
|
-
max?: number;
|
|
138
|
-
step?: number;
|
|
139
|
-
value: number;
|
|
140
|
-
onChange: (value: number) => void;
|
|
141
|
-
className?: string;
|
|
142
|
-
style?: React.CSSProperties;
|
|
143
|
-
disabled?: boolean;
|
|
144
|
-
thumbSize?: string;
|
|
145
|
-
}
|
|
146
|
-
declare const NeuSlider: React.FC<SliderProps>;
|
|
147
|
-
|
|
148
|
-
interface EngineOptions extends NeumorphicProps {
|
|
149
|
-
state?: "default" | "hover" | "active";
|
|
150
|
-
}
|
|
151
|
-
declare function getNeumorphicStyle(options: EngineOptions): {
|
|
152
|
-
background: string;
|
|
153
|
-
boxShadow: string;
|
|
154
|
-
borderRadius: string;
|
|
155
|
-
border: string;
|
|
156
|
-
transform: string;
|
|
157
|
-
outline: string;
|
|
158
|
-
transition: string;
|
|
159
|
-
};
|
|
160
|
-
|
|
161
|
-
declare function hexToRgb(hex: string): number[];
|
|
162
|
-
declare function lighten(hex: string, amount: number): string;
|
|
163
|
-
declare function darken(hex: string, amount: number): string;
|
|
164
|
-
|
|
165
|
-
export { type IconName, NeuButton, NeuCard, NeuCheckbox, type NeuComponentProps, NeuIcon, NeuRadio, NeuRidge, type NeuShape, NeuSlider, type NeuSurface, NeuSwitch, NeuTextInput, type NeuVariant, type NeumorphicProps, darken, getNeumorphicStyle, hexToRgb, lighten };
|