@opexa/portal-components 0.0.281 → 0.0.283

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 (81) hide show
  1. package/dist/components/Disclaimer/DisclaimerV2.d.ts +1 -0
  2. package/dist/components/Disclaimer/DisclaimerV2.js +10 -3
  3. package/dist/components/GameLaunch/GameLaunchTrigger.js +8 -9
  4. package/dist/components/Games/Game.js +1 -2
  5. package/dist/components/Jackpots/JackpotsCarousel/JackpotsCarouselItem.js +6 -1
  6. package/dist/components/Jackpots/JackpotsCarousel/JackpotsCarouselItem.module.css +184 -184
  7. package/dist/components/Jackpots/JackpotsList/JackpotsListItem.module.css +184 -184
  8. package/dist/components/Jackpots/JackpotsList/JackpotsListItemDesktop.js +6 -1
  9. package/dist/components/Jackpots/JackpotsList/JackpotsListItemMobile.js +6 -1
  10. package/dist/components/KYC/utils.js +18 -18
  11. package/dist/components/SignUp/SignUpDefault/SignUpForm.js +20 -3
  12. package/dist/components/SignUp/SignUpKYC/CaptureIdDocument.js +2 -2
  13. package/dist/components/SignUp/SignUpKYC/CaptureSelfie.js +3 -3
  14. package/dist/components/SignUp/SignUpKYC/ImageUploader.js +1 -1
  15. package/dist/components/SignUp/SignUpKYC/PersonOverlayDesktop.d.ts +7 -0
  16. package/dist/components/SignUp/SignUpKYC/PersonOverlayDesktop.js +9 -0
  17. package/dist/components/SignUp/SignUpKYC/SignUpFormKYC.js +19 -2
  18. package/dist/components/SignUp/SignUpKYC/useImageUploader.js +1 -1
  19. package/dist/components/SignUp/SignUpKYC/utils.d.ts +9 -0
  20. package/dist/components/SignUp/SignUpKYC/utils.js +79 -0
  21. package/dist/components/Tournaments/TournamentsCarousel/TournamentsCarouselItem.module.css +184 -184
  22. package/dist/components/Tournaments/TournamentsList/TournamentItem.module.css +184 -184
  23. package/dist/constants/PisoPayBanks.js +43 -43
  24. package/dist/handlers/index.d.ts +7 -7
  25. package/dist/handlers/postTransformIdFrontImage.js +21 -6
  26. package/dist/handlers/postTransformSelfieImage.js +20 -9
  27. package/dist/services/queries.js +2574 -2574
  28. package/dist/styles/theme.css +695 -695
  29. package/dist/ui/AlertDialog/AlertDialog.d.ts +55 -55
  30. package/dist/ui/AlertDialog/alertDialog.recipe.d.ts +5 -5
  31. package/dist/ui/Carousel/Carousel.d.ts +99 -99
  32. package/dist/ui/Carousel/carousel.recipe.d.ts +11 -11
  33. package/dist/ui/Checkbox/Checkbox.d.ts +23 -23
  34. package/dist/ui/Checkbox/checkbox.recipe.d.ts +3 -3
  35. package/dist/ui/Clipboard/Clipboard.d.ts +18 -18
  36. package/dist/ui/Clipboard/clipboard.recipe.d.ts +3 -3
  37. package/dist/ui/Collapsible/Collapsible.d.ts +20 -20
  38. package/dist/ui/Collapsible/collapsible.recipe.d.ts +5 -5
  39. package/dist/ui/Combobox/Combobox.d.ts +42 -42
  40. package/dist/ui/Combobox/combobox.recipe.d.ts +3 -3
  41. package/dist/ui/DatePicker/DatePicker.d.ts +72 -72
  42. package/dist/ui/DatePicker/datePicker.recipe.d.ts +3 -3
  43. package/dist/ui/Dialog/Dialog.d.ts +55 -55
  44. package/dist/ui/Dialog/dialog.recipe.d.ts +5 -5
  45. package/dist/ui/Drawer/Drawer.d.ts +33 -33
  46. package/dist/ui/Drawer/drawer.recipe.d.ts +3 -3
  47. package/dist/ui/Field/Field.d.ts +21 -21
  48. package/dist/ui/Field/field.recipe.d.ts +3 -3
  49. package/dist/ui/Menu/Menu.d.ts +198 -198
  50. package/dist/ui/Menu/menu.recipe.d.ts +11 -11
  51. package/dist/ui/PasswordInput/PasswordInput.d.ts +18 -18
  52. package/dist/ui/PasswordInput/passwordInput.recipe.d.ts +3 -3
  53. package/dist/ui/Popover/Popover.d.ts +55 -55
  54. package/dist/ui/Popover/popover.recipe.d.ts +5 -5
  55. package/dist/ui/SegmentGroup/SegmentGroup.d.ts +18 -18
  56. package/dist/ui/SegmentGroup/segmentGroup.recipe.d.ts +3 -3
  57. package/dist/ui/Select/Select.d.ts +45 -45
  58. package/dist/ui/Select/select.recipe.d.ts +3 -3
  59. package/dist/ui/Table/Table.d.ts +21 -21
  60. package/dist/ui/Table/table.anatomy.d.ts +1 -1
  61. package/dist/ui/Table/table.recipe.d.ts +3 -3
  62. package/dist/ui/Tabs/Tabs.d.ts +15 -15
  63. package/dist/ui/Tabs/tabs.recipe.d.ts +3 -3
  64. package/dist/utils/formatNumber.d.ts +1 -1
  65. package/dist/utils/formatNumber.js +3 -2
  66. package/dist/utils/getGameImageUrl.js +4 -3
  67. package/dist/utils/mask.d.ts +10 -0
  68. package/dist/utils/mask.js +10 -0
  69. package/dist/utils/validateFile.d.ts +1 -1
  70. package/dist/utils/validateFile.js +3 -2
  71. package/package.json +163 -163
  72. package/dist/components/shared/IdDocumentField.client.d.ts +0 -25
  73. package/dist/components/shared/IdDocumentField.client.js +0 -204
  74. package/dist/components/shared/IdDocumentField.d.ts +0 -2
  75. package/dist/components/shared/IdDocumentField.js +0 -11
  76. package/dist/components/shared/SelfieField.client.d.ts +0 -20
  77. package/dist/components/shared/SelfieField.client.js +0 -327
  78. package/dist/components/shared/SelfieField.d.ts +0 -2
  79. package/dist/components/shared/SelfieField.js +0 -11
  80. package/dist/handlers.d.ts +0 -43
  81. package/dist/handlers.js +0 -297
@@ -142,7 +142,7 @@ export function SignUpFormKYC() {
142
142
  if (!v) {
143
143
  ctx.addIssue({
144
144
  code: z.ZodIssueCode.custom,
145
- message: 'You must accept the terms and conditions',
145
+ message: 'You must accept the terms and conditions and the responsible gaming guidelines',
146
146
  });
147
147
  }
148
148
  }),
@@ -226,7 +226,20 @@ export function SignUpFormKYC() {
226
226
  const memberVerification = useMemberVerificationQuery();
227
227
  const memberId = memberVerification.data?.id;
228
228
  const { mutate: uploadImageFile } = useUploadImageFileMutation();
229
- return (_jsxs(_Fragment, { children: [_jsx(TermsOfUse, { termsOfUseContent: props.termsOfUseContent ?? 'Terms of Use content', siteName: props.siteName ?? 'Site', logo: props.logo, open: isTermsOfUseOpen, onCloseAction: () => setTermsOfUseOpen(false), responsibleGamingLogo: props.responsibleGamingLogo }), _jsx(ResponsibleGaming, { responsibleGamingContent: props.responsibleGamingContent ?? 'Responsible Gaming content', logo: props.logo, open: isResponsibleGamingOpen, onCloseAction: () => setResponsibleGamingOpen(false), responsibleGamingLogo: props.responsibleGamingLogo }), step === 1 && (_jsxs(_Fragment, { children: [_jsx("h2", { className: "mt-xl text-center text-lg font-semibold", children: "Create an account" }), _jsx("p", { className: "text-text-secondary-700 mt-xs text-center text-sm", children: "Register instantly and start playing!" }), _jsxs("form", { className: "mt-3xl", autoComplete: "off", onSubmit: step1Form.handleSubmit(async (data) => {
229
+ const [isTermsOfUseAccepted, setIsTermsOfUseAccepted] = useState(false);
230
+ const [isResponsibleGamingAccepted, setIsResponsibleGamingAccepted] = useState(false);
231
+ useEffect(() => {
232
+ if (isTermsOfUseAccepted && isResponsibleGamingAccepted) {
233
+ step1Form.setValue('termsAccepted', true);
234
+ }
235
+ }, [isResponsibleGamingAccepted, isTermsOfUseAccepted, step1Form]);
236
+ return (_jsxs(_Fragment, { children: [_jsx(TermsOfUse, { termsOfUseContent: props.termsOfUseContent ?? 'Terms of Use content', siteName: props.siteName ?? 'Site', logo: props.logo, open: isTermsOfUseOpen, onCloseAction: () => {
237
+ setIsTermsOfUseAccepted(true);
238
+ setTermsOfUseOpen(false);
239
+ }, responsibleGamingLogo: props.responsibleGamingLogo }), _jsx(ResponsibleGaming, { responsibleGamingContent: props.responsibleGamingContent ?? 'Responsible Gaming content', logo: props.logo, open: isResponsibleGamingOpen, onCloseAction: () => {
240
+ setIsResponsibleGamingAccepted(true);
241
+ setResponsibleGamingOpen(false);
242
+ }, responsibleGamingLogo: props.responsibleGamingLogo }), step === 1 && (_jsxs(_Fragment, { children: [_jsx("h2", { className: "mt-xl text-center text-lg font-semibold", children: "Create an account" }), _jsx("p", { className: "text-text-secondary-700 mt-xs text-center text-sm", children: "Register instantly and start playing!" }), _jsxs("form", { className: "mt-3xl", autoComplete: "off", onSubmit: step1Form.handleSubmit(async (data) => {
230
243
  try {
231
244
  await sendVerificationCodeMutation.mutateAsync({
232
245
  channel: 'SMS',
@@ -276,6 +289,10 @@ export function SignUpFormKYC() {
276
289
  props.setSelfieImage(file);
277
290
  } }, "selfie-image-upload"), _jsx(Field.ErrorText, { children: step1Form.formState.errors.selfieImage?.message })] }), _jsxs("div", { className: "mt-xl text-center text-sm", children: ["Prohibition to play in open and public places", _jsxs("div", { className: "mt-5 flex items-center justify-center gap-3xl", children: [_jsx("div", { className: "flex size-5xl items-center justify-center overflow-hidden rounded-full bg-white", children: _jsx(Image, { src: pagcorLogo, alt: "", draggable: false, height: 62, width: 186, className: "h-9.5 w-auto object-contain" }) }), _jsx(Image, { src: responsibleGamingLogo, alt: "", height: 62, width: 186, className: "h-10 w-auto", draggable: false })] })] }), _jsx(Controller, { control: step1Form.control, name: "termsAccepted", render: (o) => (_jsxs(Field.Root, { className: "mt-2xl", invalid: o.fieldState.invalid, children: [_jsxs(Checkbox.Root, { checked: o.field.value, onCheckedChange: (details) => {
278
291
  o.field.onChange(details.checked);
292
+ if (!details.checked) {
293
+ setIsTermsOfUseAccepted(false);
294
+ setIsResponsibleGamingAccepted(false);
295
+ }
279
296
  }, children: [_jsx(Checkbox.Control, { children: _jsx(Checkbox.Indicator, { asChild: true, children: _jsx(CheckIcon, {}) }) }), _jsxs(Checkbox.Label, { children: ["I am at least 21 years of age and I have read and accept the", ' ', _jsx("button", { type: "button", className: "text-brand-400 underline underline-offset-2", onClick: () => {
280
297
  setTermsOfUseOpen(true);
281
298
  }, children: "Terms and Conditions" }), ' ', "and", ' ', _jsx("button", { type: "button", className: "text-brand-400 underline underline-offset-2", onClick: () => {
@@ -6,7 +6,7 @@ export function useImageUploader() {
6
6
  const reset = () => {
7
7
  setCapturing(null);
8
8
  setFrontImage(null);
9
- setFrontImage(null);
9
+ setSelfieImage(null);
10
10
  };
11
11
  return {
12
12
  capturing,
@@ -0,0 +1,9 @@
1
+ export declare function loadFaceApiModels(): Promise<void>;
2
+ export declare function dataURLtoBlob(dataURL: string): Blob;
3
+ export declare const resizeFile: (file: File) => Promise<unknown>;
4
+ export declare const MAX_FILE_SIZE = 10;
5
+ export declare const MAX_NAME_LENGTH = 52;
6
+ export declare const SUPPORTED_FILES: string[];
7
+ export declare function validateFile(file: File): "File too large" | "File name too long" | "Unsupported file" | undefined;
8
+ export declare function showPermissionInstructions(): void;
9
+ export declare const cameraErrorDescriptions: Record<string, string>;
@@ -0,0 +1,79 @@
1
+ import * as faceapi from 'face-api.js';
2
+ import Resizer from 'react-image-file-resizer';
3
+ export async function loadFaceApiModels() {
4
+ // const url = `${STATIC_ENDPOINT}/models`;
5
+ const url = '/models';
6
+ await Promise.all([
7
+ faceapi.nets.tinyFaceDetector.loadFromUri(url),
8
+ faceapi.nets.faceLandmark68Net.loadFromUri(url),
9
+ faceapi.nets.faceRecognitionNet.loadFromUri(url),
10
+ ]);
11
+ }
12
+ export function dataURLtoBlob(dataURL) {
13
+ const parts = dataURL.split(';base64,');
14
+ const contentType = parts[0].split(':')[1];
15
+ const raw = window.atob(parts[1]);
16
+ const rawLength = raw.length;
17
+ const uInt8Array = new Uint8Array(rawLength);
18
+ for (let i = 0; i < rawLength; ++i) {
19
+ uInt8Array[i] = raw.charCodeAt(i);
20
+ }
21
+ return new Blob([uInt8Array], { type: contentType });
22
+ }
23
+ export const resizeFile = (file) => new Promise((resolve) => {
24
+ Resizer.imageFileResizer(file, 300, 300, 'jpeg', 100, 0, (uri) => {
25
+ resolve(uri);
26
+ }, 'file');
27
+ });
28
+ export const MAX_FILE_SIZE = 10; /* in MB */
29
+ export const MAX_NAME_LENGTH = 52;
30
+ export const SUPPORTED_FILES = [
31
+ /* add more supported ext */
32
+ 'image/png',
33
+ 'image/jpg',
34
+ 'image/jpeg',
35
+ ];
36
+ function removeFilenameExt(subject) {
37
+ const l = subject.split('.');
38
+ l.pop();
39
+ return l.join('.');
40
+ }
41
+ export function validateFile(file) {
42
+ const fileType = file.type;
43
+ const fileSize = file.size / (1024 * 1024);
44
+ const nameLength = removeFilenameExt(file.name).length;
45
+ if (fileSize > MAX_FILE_SIZE)
46
+ return 'File too large';
47
+ if (nameLength > MAX_NAME_LENGTH)
48
+ return 'File name too long';
49
+ if (!SUPPORTED_FILES.includes(fileType))
50
+ return 'Unsupported file';
51
+ }
52
+ export function showPermissionInstructions() {
53
+ const instructions = `
54
+ Camera access is blocked. To enable camera access:
55
+
56
+ Chrome/Edge:
57
+ 1. Click the camera icon in the address bar
58
+ 2. Select "Always allow" and click "Done"
59
+ 3. Or go to Settings > Privacy and security > Site settings > Camera
60
+
61
+ Firefox:
62
+ 1. Click the shield icon in the address bar
63
+ 2. Click on "Camera blocked"
64
+ 3. Select "Allow" and refresh the page
65
+
66
+ Safari:
67
+ 1. Go to Safari > Settings > Websites > Camera
68
+ 2. Find this website and change to "Allow"
69
+
70
+ After changing permissions, please refresh the page and try again.
71
+ `;
72
+ alert(instructions);
73
+ }
74
+ export const cameraErrorDescriptions = {
75
+ NotAllowedError: 'We were unable to detect a camera on your device. Please ensure it is properly connected and accessible to this application.',
76
+ NotReadableError: 'We were unable to access your camera. Please check if another application is using it or try reconnecting your device.',
77
+ NotFoundError: 'No camera was found. Please connect a camera and try again.',
78
+ NoIdDetectedError: 'No ID document was detected in the frame. Please ensure your ID is clearly visible and try again.',
79
+ };
@@ -1,184 +1,184 @@
1
- @keyframes arrow-green-flash {
2
- 0% {
3
- color: #abefc6;
4
- }
5
- 100% {
6
- color: #079455;
7
- }
8
- }
9
-
10
- .animate-arrow-green-flash-1 {
11
- animation: arrow-green-flash 0.4s infinite;
12
- animation-delay: -0.2s;
13
- }
14
-
15
- .animate-arrow-green-flash-2 {
16
- animation: arrow-green-flash 0.4s infinite;
17
- animation-delay: -0.1s;
18
- }
19
-
20
- .animate-arrow-green-flash-3 {
21
- animation: arrow-green-flash 0.4s infinite;
22
- }
23
-
24
- @keyframes arrow-red-flash {
25
- 0%,
26
- 100% {
27
- color: #f97066;
28
- }
29
- 50% {
30
- color: #fecdca;
31
- }
32
- }
33
-
34
- .animate-arrow-red-flash-1 {
35
- animation: arrow-red-flash 0.4s infinite;
36
- }
37
-
38
- .animate-arrow-red-flash-2 {
39
- animation: arrow-red-flash 0.4s infinite;
40
- animation-delay: -0.1s;
41
- }
42
-
43
- .animate-arrow-red-flash-3 {
44
- animation: arrow-red-flash 0.4s infinite;
45
- animation-delay: -0.2s;
46
- }
47
-
48
- /* Animated BG */
49
- @keyframes rotate {
50
- to {
51
- transform: rotate(1turn);
52
- }
53
- }
54
-
55
- .light-rays {
56
- position: absolute;
57
- top: 0;
58
- left: 0;
59
- right: 0;
60
- bottom: 0;
61
- overflow: hidden;
62
-
63
- --first: var(--color-bg-tertiary);
64
- --second: var(--color-bg-quaternary);
65
- }
66
-
67
- .light-rays::before,
68
- .light-rays::after {
69
- content: '';
70
- position: absolute;
71
- top: var(--light-rays-top, 150px);
72
- left: calc(50% - 90px);
73
- margin: -100vmax;
74
- width: 200vmax;
75
- height: 200vmax;
76
- opacity: 0.6;
77
- transform-origin: center;
78
- }
79
-
80
- .light-rays::before {
81
- background: conic-gradient(
82
- var(--first) 0deg 7.2deg,
83
- var(--second) 7.2deg 14.4deg,
84
- var(--first) 14.4deg 21.6deg,
85
- var(--second) 21.6deg 28.8deg,
86
- var(--first) 28.8deg 36deg,
87
- var(--second) 36deg 43.2deg,
88
- var(--first) 43.2deg 50.4deg,
89
- var(--second) 50.4deg 57.6deg,
90
- var(--first) 57.6deg 64.8deg,
91
- var(--second) 64.8deg 72deg,
92
- var(--first) 72deg 79.2deg,
93
- var(--second) 79.2deg 86.4deg,
94
- var(--first) 86.4deg 93.6deg,
95
- var(--second) 93.6deg 100.8deg,
96
- var(--first) 100.8deg 108deg,
97
- var(--second) 108deg 115.2deg,
98
- var(--first) 115.2deg 122.4deg,
99
- var(--second) 122.4deg 129.6deg,
100
- var(--first) 129.6deg 136.8deg,
101
- var(--second) 136.8deg 144deg,
102
- var(--first) 144deg 151.2deg,
103
- var(--second) 151.2deg 158.4deg,
104
- var(--first) 158.4deg 165.6deg,
105
- var(--second) 165.6deg 172.8deg,
106
- var(--first) 172.8deg 180deg,
107
- var(--second) 180deg 187.2deg,
108
- var(--first) 187.2deg 194.4deg,
109
- var(--second) 194.4deg 201.6deg,
110
- var(--first) 201.6deg 208.8deg,
111
- var(--second) 208.8deg 216deg,
112
- var(--first) 216deg 223.2deg,
113
- var(--second) 223.2deg 230.4deg,
114
- var(--first) 230.4deg 237.6deg,
115
- var(--second) 237.6deg 244.8deg,
116
- var(--first) 244.8deg 252deg,
117
- var(--second) 252deg 259.2deg,
118
- var(--first) 259.2deg 266.4deg,
119
- var(--second) 266.4deg 273.6deg,
120
- var(--first) 273.6deg 280.8deg,
121
- var(--second) 280.8deg 288deg,
122
- var(--first) 288deg 295.2deg,
123
- var(--second) 295.2deg 302.4deg,
124
- var(--first) 302.4deg 309.6deg,
125
- var(--second) 309.6deg 316.8deg,
126
- var(--first) 316.8deg 324deg,
127
- var(--second) 324deg 331.2deg,
128
- var(--first) 331.2deg 338.4deg,
129
- var(--second) 338.4deg 345.6deg,
130
- var(--first) 345.6deg 352.8deg,
131
- var(--second) 352.8deg 360deg
132
- );
133
- animation: rotate 20s linear infinite;
134
- }
135
-
136
- @media (max-width: 1024px) {
137
- .light-rays::before,
138
- .light-rays::after {
139
- left: auto;
140
- right: 11%;
141
- }
142
- }
143
-
144
- /* ScrollArea.module.css */
145
- .scrollArea {
146
- overflow-y: scroll;
147
- padding-right: 4px;
148
- }
149
-
150
- /* WebKit-based browsers */
151
- .scrollArea::-webkit-scrollbar {
152
- width: 8px;
153
- }
154
-
155
- .scrollArea::-webkit-scrollbar-track {
156
- background: var(--color-bg-primary-alt);
157
- border-radius: 9999px;
158
- }
159
-
160
- .scrollArea::-webkit-scrollbar-thumb {
161
- background-color: var(--color-bg-quaternary);
162
- border-radius: 9999px;
163
- }
164
-
165
- @keyframes waveColor {
166
- 0%,
167
- 2.5% {
168
- color: var(--wave-highlight-color);
169
- }
170
- 2.51%,
171
- 100% {
172
- color: var(--color-brand-300);
173
- }
174
- }
175
-
176
- .animate-wave-color-success {
177
- --wave-highlight-color: var(--color-success-800);
178
- animation: waveColor 4s ease-in-out infinite;
179
- }
180
-
181
- .animate-wave-color-error {
182
- --wave-highlight-color: var(--color-error-600);
183
- animation: waveColor 4s ease-in-out infinite;
184
- }
1
+ @keyframes arrow-green-flash {
2
+ 0% {
3
+ color: #abefc6;
4
+ }
5
+ 100% {
6
+ color: #079455;
7
+ }
8
+ }
9
+
10
+ .animate-arrow-green-flash-1 {
11
+ animation: arrow-green-flash 0.4s infinite;
12
+ animation-delay: -0.2s;
13
+ }
14
+
15
+ .animate-arrow-green-flash-2 {
16
+ animation: arrow-green-flash 0.4s infinite;
17
+ animation-delay: -0.1s;
18
+ }
19
+
20
+ .animate-arrow-green-flash-3 {
21
+ animation: arrow-green-flash 0.4s infinite;
22
+ }
23
+
24
+ @keyframes arrow-red-flash {
25
+ 0%,
26
+ 100% {
27
+ color: #f97066;
28
+ }
29
+ 50% {
30
+ color: #fecdca;
31
+ }
32
+ }
33
+
34
+ .animate-arrow-red-flash-1 {
35
+ animation: arrow-red-flash 0.4s infinite;
36
+ }
37
+
38
+ .animate-arrow-red-flash-2 {
39
+ animation: arrow-red-flash 0.4s infinite;
40
+ animation-delay: -0.1s;
41
+ }
42
+
43
+ .animate-arrow-red-flash-3 {
44
+ animation: arrow-red-flash 0.4s infinite;
45
+ animation-delay: -0.2s;
46
+ }
47
+
48
+ /* Animated BG */
49
+ @keyframes rotate {
50
+ to {
51
+ transform: rotate(1turn);
52
+ }
53
+ }
54
+
55
+ .light-rays {
56
+ position: absolute;
57
+ top: 0;
58
+ left: 0;
59
+ right: 0;
60
+ bottom: 0;
61
+ overflow: hidden;
62
+
63
+ --first: var(--color-bg-tertiary);
64
+ --second: var(--color-bg-quaternary);
65
+ }
66
+
67
+ .light-rays::before,
68
+ .light-rays::after {
69
+ content: '';
70
+ position: absolute;
71
+ top: var(--light-rays-top, 150px);
72
+ left: calc(50% - 90px);
73
+ margin: -100vmax;
74
+ width: 200vmax;
75
+ height: 200vmax;
76
+ opacity: 0.6;
77
+ transform-origin: center;
78
+ }
79
+
80
+ .light-rays::before {
81
+ background: conic-gradient(
82
+ var(--first) 0deg 7.2deg,
83
+ var(--second) 7.2deg 14.4deg,
84
+ var(--first) 14.4deg 21.6deg,
85
+ var(--second) 21.6deg 28.8deg,
86
+ var(--first) 28.8deg 36deg,
87
+ var(--second) 36deg 43.2deg,
88
+ var(--first) 43.2deg 50.4deg,
89
+ var(--second) 50.4deg 57.6deg,
90
+ var(--first) 57.6deg 64.8deg,
91
+ var(--second) 64.8deg 72deg,
92
+ var(--first) 72deg 79.2deg,
93
+ var(--second) 79.2deg 86.4deg,
94
+ var(--first) 86.4deg 93.6deg,
95
+ var(--second) 93.6deg 100.8deg,
96
+ var(--first) 100.8deg 108deg,
97
+ var(--second) 108deg 115.2deg,
98
+ var(--first) 115.2deg 122.4deg,
99
+ var(--second) 122.4deg 129.6deg,
100
+ var(--first) 129.6deg 136.8deg,
101
+ var(--second) 136.8deg 144deg,
102
+ var(--first) 144deg 151.2deg,
103
+ var(--second) 151.2deg 158.4deg,
104
+ var(--first) 158.4deg 165.6deg,
105
+ var(--second) 165.6deg 172.8deg,
106
+ var(--first) 172.8deg 180deg,
107
+ var(--second) 180deg 187.2deg,
108
+ var(--first) 187.2deg 194.4deg,
109
+ var(--second) 194.4deg 201.6deg,
110
+ var(--first) 201.6deg 208.8deg,
111
+ var(--second) 208.8deg 216deg,
112
+ var(--first) 216deg 223.2deg,
113
+ var(--second) 223.2deg 230.4deg,
114
+ var(--first) 230.4deg 237.6deg,
115
+ var(--second) 237.6deg 244.8deg,
116
+ var(--first) 244.8deg 252deg,
117
+ var(--second) 252deg 259.2deg,
118
+ var(--first) 259.2deg 266.4deg,
119
+ var(--second) 266.4deg 273.6deg,
120
+ var(--first) 273.6deg 280.8deg,
121
+ var(--second) 280.8deg 288deg,
122
+ var(--first) 288deg 295.2deg,
123
+ var(--second) 295.2deg 302.4deg,
124
+ var(--first) 302.4deg 309.6deg,
125
+ var(--second) 309.6deg 316.8deg,
126
+ var(--first) 316.8deg 324deg,
127
+ var(--second) 324deg 331.2deg,
128
+ var(--first) 331.2deg 338.4deg,
129
+ var(--second) 338.4deg 345.6deg,
130
+ var(--first) 345.6deg 352.8deg,
131
+ var(--second) 352.8deg 360deg
132
+ );
133
+ animation: rotate 20s linear infinite;
134
+ }
135
+
136
+ @media (max-width: 1024px) {
137
+ .light-rays::before,
138
+ .light-rays::after {
139
+ left: auto;
140
+ right: 11%;
141
+ }
142
+ }
143
+
144
+ /* ScrollArea.module.css */
145
+ .scrollArea {
146
+ overflow-y: scroll;
147
+ padding-right: 4px;
148
+ }
149
+
150
+ /* WebKit-based browsers */
151
+ .scrollArea::-webkit-scrollbar {
152
+ width: 8px;
153
+ }
154
+
155
+ .scrollArea::-webkit-scrollbar-track {
156
+ background: var(--color-bg-primary-alt);
157
+ border-radius: 9999px;
158
+ }
159
+
160
+ .scrollArea::-webkit-scrollbar-thumb {
161
+ background-color: var(--color-bg-quaternary);
162
+ border-radius: 9999px;
163
+ }
164
+
165
+ @keyframes waveColor {
166
+ 0%,
167
+ 2.5% {
168
+ color: var(--wave-highlight-color);
169
+ }
170
+ 2.51%,
171
+ 100% {
172
+ color: var(--color-brand-300);
173
+ }
174
+ }
175
+
176
+ .animate-wave-color-success {
177
+ --wave-highlight-color: var(--color-success-800);
178
+ animation: waveColor 4s ease-in-out infinite;
179
+ }
180
+
181
+ .animate-wave-color-error {
182
+ --wave-highlight-color: var(--color-error-600);
183
+ animation: waveColor 4s ease-in-out infinite;
184
+ }