@bit.rhplus/ui2.ai-button 0.0.1
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/index.d.ts +17 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/preview-1769973842678.js +7 -0
- package/dist/style.css +172 -0
- package/index.jsx +60 -0
- package/package.json +27 -0
- package/style.css +172 -0
- package/types/asset.d.ts +43 -0
- package/types/style.d.ts +42 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export default AIButton;
|
|
2
|
+
/**
|
|
3
|
+
* AI Rainbow Button - Moderní tlačítko s rotujícím duhovým prstencem
|
|
4
|
+
*
|
|
5
|
+
* @param {Object} props
|
|
6
|
+
* @param {string} [props.label='AI'] - Text zobrazený na tlačítku
|
|
7
|
+
* @param {Function} [props.onClick] - Handler pro kliknutí
|
|
8
|
+
* @param {string|number} [props.size='110px'] - Velikost tlačítka
|
|
9
|
+
* @param {string|number} [props.ring='10px'] - Tloušťka duhového prstence
|
|
10
|
+
* @param {string} [props.className] - Dodatečné CSS třídy
|
|
11
|
+
* @param {string} [props.ariaLabel] - Aria label pro accessibility (výchozí je hodnota label)
|
|
12
|
+
* @param {string} [props.type='button'] - Typ tlačítka
|
|
13
|
+
* @param {Object} [props.style] - Inline styly pro tlačítko
|
|
14
|
+
* @param {boolean} [props.disabled=false] - Zakázat tlačítko
|
|
15
|
+
*/
|
|
16
|
+
declare const AIButton: React.ForwardRefExoticComponent<React.RefAttributes<any>>;
|
|
17
|
+
import React from 'react';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import classnames from 'classnames';
|
|
4
|
+
import './style.css';
|
|
5
|
+
/**
|
|
6
|
+
* AI Rainbow Button - Moderní tlačítko s rotujícím duhovým prstencem
|
|
7
|
+
*
|
|
8
|
+
* @param {Object} props
|
|
9
|
+
* @param {string} [props.label='AI'] - Text zobrazený na tlačítku
|
|
10
|
+
* @param {Function} [props.onClick] - Handler pro kliknutí
|
|
11
|
+
* @param {string|number} [props.size='110px'] - Velikost tlačítka
|
|
12
|
+
* @param {string|number} [props.ring='10px'] - Tloušťka duhového prstence
|
|
13
|
+
* @param {string} [props.className] - Dodatečné CSS třídy
|
|
14
|
+
* @param {string} [props.ariaLabel] - Aria label pro accessibility (výchozí je hodnota label)
|
|
15
|
+
* @param {string} [props.type='button'] - Typ tlačítka
|
|
16
|
+
* @param {Object} [props.style] - Inline styly pro tlačítko
|
|
17
|
+
* @param {boolean} [props.disabled=false] - Zakázat tlačítko
|
|
18
|
+
*/
|
|
19
|
+
const AIButton = React.forwardRef((props, ref) => {
|
|
20
|
+
const { label = 'AI', onClick, size = '110px', ring = '10px', className, ariaLabel, type = 'button', style, disabled = false, ...restProps } = props;
|
|
21
|
+
// Inline CSS proměnné pro customizaci
|
|
22
|
+
const buttonStyle = {
|
|
23
|
+
'--size': typeof size === 'number' ? `${size}px` : size,
|
|
24
|
+
'--ring': typeof ring === 'number' ? `${ring}px` : ring,
|
|
25
|
+
...style,
|
|
26
|
+
};
|
|
27
|
+
return (_jsx("button", { ref: ref, className: classnames('ai-btn', className), type: type, "aria-label": ariaLabel || label, onClick: onClick, style: buttonStyle, disabled: disabled, ...restProps, children: _jsx("div", { className: "ai-inner", children: _jsx("div", { className: "ai-label", children: label }) }) }));
|
|
28
|
+
});
|
|
29
|
+
AIButton.displayName = 'AIButton';
|
|
30
|
+
export default AIButton;
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.jsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,aAAa,CAAC;AAErB;;;;;;;;;;;;;GAaG;AACH,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IAC/C,MAAM,EACJ,KAAK,GAAG,IAAI,EACZ,OAAO,EACP,IAAI,GAAG,OAAO,EACd,IAAI,GAAG,MAAM,EACb,SAAS,EACT,SAAS,EACT,IAAI,GAAG,QAAQ,EACf,KAAK,EACL,QAAQ,GAAG,KAAK,EAChB,GAAG,SAAS,EACb,GAAG,KAAK,CAAC;IAEV,sCAAsC;IACtC,MAAM,WAAW,GAAG;QAClB,QAAQ,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI;QACvD,QAAQ,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI;QACvD,GAAG,KAAK;KACT,CAAC;IAEF,OAAO,CACL,iBACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,EAC1C,IAAI,EAAE,IAAI,gBACE,SAAS,IAAI,KAAK,EAC9B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,QAAQ,KACd,SAAS,YAEb,cAAK,SAAS,EAAC,UAAU,YACvB,cAAK,SAAS,EAAC,UAAU,YAAE,KAAK,GAAO,GACnC,GACC,CACV,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAC;AAElC,eAAe,QAAQ,CAAC"}
|
package/dist/style.css
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/* AI Rainbow Button - Duhové tlačítko s rotujícím prstencem */
|
|
2
|
+
|
|
3
|
+
.ai-btn {
|
|
4
|
+
/* CSS proměnné - lze přepsat pomocí inline style */
|
|
5
|
+
--size: 110px;
|
|
6
|
+
--ring: 10px;
|
|
7
|
+
--bg: #ffffff;
|
|
8
|
+
--text: rgba(20, 20, 20, 0.92);
|
|
9
|
+
|
|
10
|
+
position: relative;
|
|
11
|
+
width: var(--size);
|
|
12
|
+
height: var(--size);
|
|
13
|
+
border: 0;
|
|
14
|
+
border-radius: 999px;
|
|
15
|
+
cursor: pointer;
|
|
16
|
+
background: transparent;
|
|
17
|
+
padding: 0;
|
|
18
|
+
outline: none;
|
|
19
|
+
-webkit-tap-highlight-color: transparent;
|
|
20
|
+
transform: translateZ(0);
|
|
21
|
+
transition: transform 0.15s ease;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.ai-btn:disabled {
|
|
25
|
+
cursor: not-allowed;
|
|
26
|
+
opacity: 0.5;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* Duhový rotující prstenec */
|
|
30
|
+
.ai-btn::before {
|
|
31
|
+
content: '';
|
|
32
|
+
position: absolute;
|
|
33
|
+
inset: 0;
|
|
34
|
+
border-radius: inherit;
|
|
35
|
+
|
|
36
|
+
/* Duhový conic gradient */
|
|
37
|
+
background: conic-gradient(
|
|
38
|
+
from 0deg,
|
|
39
|
+
#ff004c,
|
|
40
|
+
#ff8a00,
|
|
41
|
+
#ffe600,
|
|
42
|
+
#35ff7a,
|
|
43
|
+
#00d4ff,
|
|
44
|
+
#6a5cff,
|
|
45
|
+
#ff4fd8,
|
|
46
|
+
#ff004c
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
/* Vyříznutí vnitřku => prstenec */
|
|
50
|
+
-webkit-mask: radial-gradient(
|
|
51
|
+
closest-side,
|
|
52
|
+
transparent calc(100% - var(--ring)),
|
|
53
|
+
#000 calc(100% - var(--ring) + 1px)
|
|
54
|
+
);
|
|
55
|
+
mask: radial-gradient(
|
|
56
|
+
closest-side,
|
|
57
|
+
transparent calc(100% - var(--ring)),
|
|
58
|
+
#000 calc(100% - var(--ring) + 1px)
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
/* Animace "točení" barev */
|
|
62
|
+
animation: ai-btn-spin 3.2s linear infinite;
|
|
63
|
+
filter: saturate(1.15) brightness(1.05);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.ai-btn:disabled::before {
|
|
67
|
+
animation: none;
|
|
68
|
+
filter: saturate(0.5) brightness(0.8);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* Glow aura kolem tlačítka */
|
|
72
|
+
.ai-btn::after {
|
|
73
|
+
content: '';
|
|
74
|
+
position: absolute;
|
|
75
|
+
inset: -18px;
|
|
76
|
+
border-radius: inherit;
|
|
77
|
+
background: conic-gradient(
|
|
78
|
+
from 0deg,
|
|
79
|
+
#ff004c,
|
|
80
|
+
#ff8a00,
|
|
81
|
+
#ffe600,
|
|
82
|
+
#35ff7a,
|
|
83
|
+
#00d4ff,
|
|
84
|
+
#6a5cff,
|
|
85
|
+
#ff4fd8,
|
|
86
|
+
#ff004c
|
|
87
|
+
);
|
|
88
|
+
opacity: 0.35;
|
|
89
|
+
filter: blur(22px);
|
|
90
|
+
animation: ai-btn-spin 3.2s linear infinite, ai-btn-breathe 2.6s ease-in-out infinite;
|
|
91
|
+
transform: translateZ(0);
|
|
92
|
+
pointer-events: none;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.ai-btn:disabled::after {
|
|
96
|
+
animation: none;
|
|
97
|
+
opacity: 0.15;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/* Vnitřek tlačítka */
|
|
101
|
+
.ai-inner {
|
|
102
|
+
position: absolute;
|
|
103
|
+
inset: var(--ring);
|
|
104
|
+
border-radius: inherit;
|
|
105
|
+
background: radial-gradient(
|
|
106
|
+
120% 120% at 30% 20%,
|
|
107
|
+
rgba(255, 255, 255, 1) 0%,
|
|
108
|
+
rgba(250, 250, 250, 1) 40%,
|
|
109
|
+
rgba(240, 242, 245, 1) 80%,
|
|
110
|
+
rgba(235, 237, 240, 1) 100%
|
|
111
|
+
);
|
|
112
|
+
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.08),
|
|
113
|
+
inset 0 0 0 1px rgba(0, 0, 0, 0.06), 0 2px 8px rgba(0, 0, 0, 0.12);
|
|
114
|
+
display: grid;
|
|
115
|
+
place-items: center;
|
|
116
|
+
user-select: none;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.ai-label {
|
|
120
|
+
font-weight: 700;
|
|
121
|
+
letter-spacing: 0.08em;
|
|
122
|
+
font-size: 14px;
|
|
123
|
+
text-transform: uppercase;
|
|
124
|
+
color: var(--text);
|
|
125
|
+
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* Hover efekt */
|
|
129
|
+
.ai-btn:hover:not(:disabled) {
|
|
130
|
+
transform: translateZ(0) scale(1.03);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/* Active (stisknuté) */
|
|
134
|
+
.ai-btn:active:not(:disabled) {
|
|
135
|
+
transform: translateZ(0) scale(0.98);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/* Focus - accessibility */
|
|
139
|
+
.ai-btn:focus-visible .ai-inner {
|
|
140
|
+
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.12),
|
|
141
|
+
inset 0 -10px 30px rgba(0, 0, 0, 0.55), 0 10px 30px rgba(0, 0, 0, 0.35),
|
|
142
|
+
0 0 0 3px rgba(255, 255, 255, 0.16);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/* Animace - rotace */
|
|
146
|
+
@keyframes ai-btn-spin {
|
|
147
|
+
to {
|
|
148
|
+
transform: rotate(360deg);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/* Animace - dýchání (breathe) */
|
|
153
|
+
@keyframes ai-btn-breathe {
|
|
154
|
+
0%,
|
|
155
|
+
100% {
|
|
156
|
+
opacity: 0.28;
|
|
157
|
+
}
|
|
158
|
+
50% {
|
|
159
|
+
opacity: 0.46;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/* Respektovat uživatelské preference pro redukci pohybu */
|
|
164
|
+
@media (prefers-reduced-motion: reduce) {
|
|
165
|
+
.ai-btn::before,
|
|
166
|
+
.ai-btn::after {
|
|
167
|
+
animation: none;
|
|
168
|
+
}
|
|
169
|
+
.ai-btn {
|
|
170
|
+
transition: none;
|
|
171
|
+
}
|
|
172
|
+
}
|
package/index.jsx
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import classnames from 'classnames';
|
|
3
|
+
import './style.css';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* AI Rainbow Button - Moderní tlačítko s rotujícím duhovým prstencem
|
|
7
|
+
*
|
|
8
|
+
* @param {Object} props
|
|
9
|
+
* @param {string} [props.label='AI'] - Text zobrazený na tlačítku
|
|
10
|
+
* @param {Function} [props.onClick] - Handler pro kliknutí
|
|
11
|
+
* @param {string|number} [props.size='110px'] - Velikost tlačítka
|
|
12
|
+
* @param {string|number} [props.ring='10px'] - Tloušťka duhového prstence
|
|
13
|
+
* @param {string} [props.className] - Dodatečné CSS třídy
|
|
14
|
+
* @param {string} [props.ariaLabel] - Aria label pro accessibility (výchozí je hodnota label)
|
|
15
|
+
* @param {string} [props.type='button'] - Typ tlačítka
|
|
16
|
+
* @param {Object} [props.style] - Inline styly pro tlačítko
|
|
17
|
+
* @param {boolean} [props.disabled=false] - Zakázat tlačítko
|
|
18
|
+
*/
|
|
19
|
+
const AIButton = React.forwardRef((props, ref) => {
|
|
20
|
+
const {
|
|
21
|
+
label = 'AI',
|
|
22
|
+
onClick,
|
|
23
|
+
size = '110px',
|
|
24
|
+
ring = '10px',
|
|
25
|
+
className,
|
|
26
|
+
ariaLabel,
|
|
27
|
+
type = 'button',
|
|
28
|
+
style,
|
|
29
|
+
disabled = false,
|
|
30
|
+
...restProps
|
|
31
|
+
} = props;
|
|
32
|
+
|
|
33
|
+
// Inline CSS proměnné pro customizaci
|
|
34
|
+
const buttonStyle = {
|
|
35
|
+
'--size': typeof size === 'number' ? `${size}px` : size,
|
|
36
|
+
'--ring': typeof ring === 'number' ? `${ring}px` : ring,
|
|
37
|
+
...style,
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
return (
|
|
41
|
+
<button
|
|
42
|
+
ref={ref}
|
|
43
|
+
className={classnames('ai-btn', className)}
|
|
44
|
+
type={type}
|
|
45
|
+
aria-label={ariaLabel || label}
|
|
46
|
+
onClick={onClick}
|
|
47
|
+
style={buttonStyle}
|
|
48
|
+
disabled={disabled}
|
|
49
|
+
{...restProps}
|
|
50
|
+
>
|
|
51
|
+
<div className="ai-inner">
|
|
52
|
+
<div className="ai-label">{label}</div>
|
|
53
|
+
</div>
|
|
54
|
+
</button>
|
|
55
|
+
);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
AIButton.displayName = 'AIButton';
|
|
59
|
+
|
|
60
|
+
export default AIButton;
|
package/package.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@bit.rhplus/ui2.ai-button",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"componentId": {
|
|
6
|
+
"name": "ui2/ai-button",
|
|
7
|
+
"version": "0.0.1",
|
|
8
|
+
"scope": "remote-scope"
|
|
9
|
+
},
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"classnames": "^2.5.1"
|
|
12
|
+
},
|
|
13
|
+
"devDependencies": {
|
|
14
|
+
"@teambit/react.react-env": "1.0.132"
|
|
15
|
+
},
|
|
16
|
+
"peerDependencies": {
|
|
17
|
+
"react": "^17.0.0 || ^18.0.0"
|
|
18
|
+
},
|
|
19
|
+
"license": "SEE LICENSE IN UNLICENSED",
|
|
20
|
+
"optionalDependencies": {},
|
|
21
|
+
"peerDependenciesMeta": {},
|
|
22
|
+
"private": false,
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"scope": "@bit.rhplus",
|
|
25
|
+
"registry": "https://registry.npmjs.org/"
|
|
26
|
+
}
|
|
27
|
+
}
|
package/style.css
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/* AI Rainbow Button - Duhové tlačítko s rotujícím prstencem */
|
|
2
|
+
|
|
3
|
+
.ai-btn {
|
|
4
|
+
/* CSS proměnné - lze přepsat pomocí inline style */
|
|
5
|
+
--size: 110px;
|
|
6
|
+
--ring: 10px;
|
|
7
|
+
--bg: #ffffff;
|
|
8
|
+
--text: rgba(20, 20, 20, 0.92);
|
|
9
|
+
|
|
10
|
+
position: relative;
|
|
11
|
+
width: var(--size);
|
|
12
|
+
height: var(--size);
|
|
13
|
+
border: 0;
|
|
14
|
+
border-radius: 999px;
|
|
15
|
+
cursor: pointer;
|
|
16
|
+
background: transparent;
|
|
17
|
+
padding: 0;
|
|
18
|
+
outline: none;
|
|
19
|
+
-webkit-tap-highlight-color: transparent;
|
|
20
|
+
transform: translateZ(0);
|
|
21
|
+
transition: transform 0.15s ease;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.ai-btn:disabled {
|
|
25
|
+
cursor: not-allowed;
|
|
26
|
+
opacity: 0.5;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* Duhový rotující prstenec */
|
|
30
|
+
.ai-btn::before {
|
|
31
|
+
content: '';
|
|
32
|
+
position: absolute;
|
|
33
|
+
inset: 0;
|
|
34
|
+
border-radius: inherit;
|
|
35
|
+
|
|
36
|
+
/* Duhový conic gradient */
|
|
37
|
+
background: conic-gradient(
|
|
38
|
+
from 0deg,
|
|
39
|
+
#ff004c,
|
|
40
|
+
#ff8a00,
|
|
41
|
+
#ffe600,
|
|
42
|
+
#35ff7a,
|
|
43
|
+
#00d4ff,
|
|
44
|
+
#6a5cff,
|
|
45
|
+
#ff4fd8,
|
|
46
|
+
#ff004c
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
/* Vyříznutí vnitřku => prstenec */
|
|
50
|
+
-webkit-mask: radial-gradient(
|
|
51
|
+
closest-side,
|
|
52
|
+
transparent calc(100% - var(--ring)),
|
|
53
|
+
#000 calc(100% - var(--ring) + 1px)
|
|
54
|
+
);
|
|
55
|
+
mask: radial-gradient(
|
|
56
|
+
closest-side,
|
|
57
|
+
transparent calc(100% - var(--ring)),
|
|
58
|
+
#000 calc(100% - var(--ring) + 1px)
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
/* Animace "točení" barev */
|
|
62
|
+
animation: ai-btn-spin 3.2s linear infinite;
|
|
63
|
+
filter: saturate(1.15) brightness(1.05);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.ai-btn:disabled::before {
|
|
67
|
+
animation: none;
|
|
68
|
+
filter: saturate(0.5) brightness(0.8);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* Glow aura kolem tlačítka */
|
|
72
|
+
.ai-btn::after {
|
|
73
|
+
content: '';
|
|
74
|
+
position: absolute;
|
|
75
|
+
inset: -18px;
|
|
76
|
+
border-radius: inherit;
|
|
77
|
+
background: conic-gradient(
|
|
78
|
+
from 0deg,
|
|
79
|
+
#ff004c,
|
|
80
|
+
#ff8a00,
|
|
81
|
+
#ffe600,
|
|
82
|
+
#35ff7a,
|
|
83
|
+
#00d4ff,
|
|
84
|
+
#6a5cff,
|
|
85
|
+
#ff4fd8,
|
|
86
|
+
#ff004c
|
|
87
|
+
);
|
|
88
|
+
opacity: 0.35;
|
|
89
|
+
filter: blur(22px);
|
|
90
|
+
animation: ai-btn-spin 3.2s linear infinite, ai-btn-breathe 2.6s ease-in-out infinite;
|
|
91
|
+
transform: translateZ(0);
|
|
92
|
+
pointer-events: none;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.ai-btn:disabled::after {
|
|
96
|
+
animation: none;
|
|
97
|
+
opacity: 0.15;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/* Vnitřek tlačítka */
|
|
101
|
+
.ai-inner {
|
|
102
|
+
position: absolute;
|
|
103
|
+
inset: var(--ring);
|
|
104
|
+
border-radius: inherit;
|
|
105
|
+
background: radial-gradient(
|
|
106
|
+
120% 120% at 30% 20%,
|
|
107
|
+
rgba(255, 255, 255, 1) 0%,
|
|
108
|
+
rgba(250, 250, 250, 1) 40%,
|
|
109
|
+
rgba(240, 242, 245, 1) 80%,
|
|
110
|
+
rgba(235, 237, 240, 1) 100%
|
|
111
|
+
);
|
|
112
|
+
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.08),
|
|
113
|
+
inset 0 0 0 1px rgba(0, 0, 0, 0.06), 0 2px 8px rgba(0, 0, 0, 0.12);
|
|
114
|
+
display: grid;
|
|
115
|
+
place-items: center;
|
|
116
|
+
user-select: none;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.ai-label {
|
|
120
|
+
font-weight: 700;
|
|
121
|
+
letter-spacing: 0.08em;
|
|
122
|
+
font-size: 14px;
|
|
123
|
+
text-transform: uppercase;
|
|
124
|
+
color: var(--text);
|
|
125
|
+
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* Hover efekt */
|
|
129
|
+
.ai-btn:hover:not(:disabled) {
|
|
130
|
+
transform: translateZ(0) scale(1.03);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/* Active (stisknuté) */
|
|
134
|
+
.ai-btn:active:not(:disabled) {
|
|
135
|
+
transform: translateZ(0) scale(0.98);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/* Focus - accessibility */
|
|
139
|
+
.ai-btn:focus-visible .ai-inner {
|
|
140
|
+
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.12),
|
|
141
|
+
inset 0 -10px 30px rgba(0, 0, 0, 0.55), 0 10px 30px rgba(0, 0, 0, 0.35),
|
|
142
|
+
0 0 0 3px rgba(255, 255, 255, 0.16);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/* Animace - rotace */
|
|
146
|
+
@keyframes ai-btn-spin {
|
|
147
|
+
to {
|
|
148
|
+
transform: rotate(360deg);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/* Animace - dýchání (breathe) */
|
|
153
|
+
@keyframes ai-btn-breathe {
|
|
154
|
+
0%,
|
|
155
|
+
100% {
|
|
156
|
+
opacity: 0.28;
|
|
157
|
+
}
|
|
158
|
+
50% {
|
|
159
|
+
opacity: 0.46;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/* Respektovat uživatelské preference pro redukci pohybu */
|
|
164
|
+
@media (prefers-reduced-motion: reduce) {
|
|
165
|
+
.ai-btn::before,
|
|
166
|
+
.ai-btn::after {
|
|
167
|
+
animation: none;
|
|
168
|
+
}
|
|
169
|
+
.ai-btn {
|
|
170
|
+
transition: none;
|
|
171
|
+
}
|
|
172
|
+
}
|
package/types/asset.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
declare module '*.png' {
|
|
2
|
+
const value: any;
|
|
3
|
+
export = value;
|
|
4
|
+
}
|
|
5
|
+
declare module '*.svg' {
|
|
6
|
+
import type { FunctionComponent, SVGProps } from 'react';
|
|
7
|
+
|
|
8
|
+
export const ReactComponent: FunctionComponent<
|
|
9
|
+
SVGProps<SVGSVGElement> & { title?: string }
|
|
10
|
+
>;
|
|
11
|
+
const src: string;
|
|
12
|
+
export default src;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// @TODO Gilad
|
|
16
|
+
declare module '*.jpg' {
|
|
17
|
+
const value: any;
|
|
18
|
+
export = value;
|
|
19
|
+
}
|
|
20
|
+
declare module '*.jpeg' {
|
|
21
|
+
const value: any;
|
|
22
|
+
export = value;
|
|
23
|
+
}
|
|
24
|
+
declare module '*.gif' {
|
|
25
|
+
const value: any;
|
|
26
|
+
export = value;
|
|
27
|
+
}
|
|
28
|
+
declare module '*.bmp' {
|
|
29
|
+
const value: any;
|
|
30
|
+
export = value;
|
|
31
|
+
}
|
|
32
|
+
declare module '*.otf' {
|
|
33
|
+
const value: any;
|
|
34
|
+
export = value;
|
|
35
|
+
}
|
|
36
|
+
declare module '*.woff' {
|
|
37
|
+
const value: any;
|
|
38
|
+
export = value;
|
|
39
|
+
}
|
|
40
|
+
declare module '*.woff2' {
|
|
41
|
+
const value: any;
|
|
42
|
+
export = value;
|
|
43
|
+
}
|
package/types/style.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
declare module '*.module.css' {
|
|
2
|
+
const classes: { readonly [key: string]: string };
|
|
3
|
+
export default classes;
|
|
4
|
+
}
|
|
5
|
+
declare module '*.module.scss' {
|
|
6
|
+
const classes: { readonly [key: string]: string };
|
|
7
|
+
export default classes;
|
|
8
|
+
}
|
|
9
|
+
declare module '*.module.sass' {
|
|
10
|
+
const classes: { readonly [key: string]: string };
|
|
11
|
+
export default classes;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
declare module '*.module.less' {
|
|
15
|
+
const classes: { readonly [key: string]: string };
|
|
16
|
+
export default classes;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
declare module '*.less' {
|
|
20
|
+
const classes: { readonly [key: string]: string };
|
|
21
|
+
export default classes;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
declare module '*.css' {
|
|
25
|
+
const classes: { readonly [key: string]: string };
|
|
26
|
+
export default classes;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
declare module '*.sass' {
|
|
30
|
+
const classes: { readonly [key: string]: string };
|
|
31
|
+
export default classes;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
declare module '*.scss' {
|
|
35
|
+
const classes: { readonly [key: string]: string };
|
|
36
|
+
export default classes;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
declare module '*.mdx' {
|
|
40
|
+
const component: any;
|
|
41
|
+
export default component;
|
|
42
|
+
}
|