strapi-plugin-magic-mail 2.0.2 → 2.0.4
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/README.md +15 -17
- package/admin/src/index.js +26 -25
- package/admin/src/pages/Analytics.jsx +19 -19
- package/admin/src/pages/EmailDesigner/EditorPage.jsx +33 -33
- package/admin/src/pages/EmailDesigner/TemplateList.jsx +36 -36
- package/admin/src/pages/HomePage.jsx +25 -88
- package/admin/src/pages/LicensePage.jsx +12 -6
- package/admin/src/pages/RoutingRules.jsx +21 -21
- package/admin/src/pages/Settings.jsx +3 -3
- package/admin/src/utils/theme.js +85 -0
- package/dist/_chunks/{App-DYNCyt54.mjs → App-BZaHrE0R.mjs} +184 -200
- package/dist/_chunks/{App-DF9vAGXX.js → App-Bze8Ixs_.js} +184 -200
- package/dist/_chunks/{LicensePage-CJXwPnEe.js → LicensePage-Bg72gy8w.js} +12 -6
- package/dist/_chunks/{LicensePage-Bl02myMx.mjs → LicensePage-ndUhjynY.mjs} +12 -6
- package/dist/_chunks/{Settings-zuFQ3pnn.js → Settings-BSFLpt0H.js} +3 -7
- package/dist/_chunks/{Settings-C_TmKwcz.mjs → Settings-Ca5UE3c1.mjs} +3 -7
- package/dist/admin/index.js +41 -24
- package/dist/admin/index.mjs +41 -24
- package/dist/server/index.js +602 -665
- package/dist/server/index.mjs +602 -665
- package/package.json +1 -1
- package/server/src/bootstrap.js +16 -16
- package/server/src/config/features.js +7 -7
- package/server/src/controllers/accounts.js +15 -6
- package/server/src/controllers/analytics.js +56 -42
- package/server/src/controllers/license.js +9 -7
- package/server/src/controllers/oauth.js +9 -9
- package/server/src/controllers/routing-rules.js +18 -11
- package/server/src/controllers/test.js +111 -193
- package/server/src/services/account-manager.js +73 -21
- package/server/src/services/analytics.js +88 -72
- package/server/src/services/email-designer.js +131 -284
- package/server/src/services/email-router.js +69 -43
- package/server/src/services/license-guard.js +24 -24
- package/server/src/services/oauth.js +11 -11
- package/server/src/services/service.js +1 -1
- package/server/src/utils/encryption.js +1 -1
|
@@ -99,12 +99,12 @@ const ScrollableDialogBody = styled(Box)`
|
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
&::-webkit-scrollbar-thumb {
|
|
102
|
-
background: ${theme.colors.
|
|
102
|
+
background: ${props => props.theme.colors.neutral200};
|
|
103
103
|
border-radius: 3px;
|
|
104
104
|
}
|
|
105
|
-
|
|
105
|
+
|
|
106
106
|
&::-webkit-scrollbar-thumb:hover {
|
|
107
|
-
background: ${theme.colors.
|
|
107
|
+
background: ${props => props.theme.colors.neutral300};
|
|
108
108
|
}
|
|
109
109
|
`;
|
|
110
110
|
|
|
@@ -125,7 +125,7 @@ const CodeHeader = styled(Flex)`
|
|
|
125
125
|
const CodeLabel = styled(Typography)`
|
|
126
126
|
font-size: 15px;
|
|
127
127
|
font-weight: 600;
|
|
128
|
-
color: ${theme.colors.
|
|
128
|
+
color: ${props => props.theme.colors.neutral800};
|
|
129
129
|
display: flex;
|
|
130
130
|
align-items: center;
|
|
131
131
|
gap: 8px;
|
|
@@ -337,7 +337,7 @@ const HeaderContent = styled(Flex)`
|
|
|
337
337
|
`;
|
|
338
338
|
|
|
339
339
|
const Title = styled(Typography)`
|
|
340
|
-
color:
|
|
340
|
+
color: white;
|
|
341
341
|
font-size: 2rem;
|
|
342
342
|
font-weight: 700;
|
|
343
343
|
letter-spacing: -0.025em;
|
|
@@ -392,7 +392,7 @@ const StatsGrid = styled.div`
|
|
|
392
392
|
`;
|
|
393
393
|
|
|
394
394
|
const StatCard = styled(Box)`
|
|
395
|
-
background: ${theme.colors.
|
|
395
|
+
background: ${props => props.theme.colors.neutral0};
|
|
396
396
|
border-radius: ${theme.borderRadius.lg};
|
|
397
397
|
padding: 28px ${theme.spacing.lg};
|
|
398
398
|
position: relative;
|
|
@@ -401,7 +401,7 @@ const StatCard = styled(Box)`
|
|
|
401
401
|
${css`animation: ${fadeIn} ${theme.transitions.slow} backwards;`}
|
|
402
402
|
animation-delay: ${props => props.$delay || '0s'};
|
|
403
403
|
box-shadow: ${theme.shadows.sm};
|
|
404
|
-
border: 1px solid ${theme.colors.
|
|
404
|
+
border: 1px solid ${props => props.theme.colors.neutral200};
|
|
405
405
|
min-width: 200px;
|
|
406
406
|
flex: 1;
|
|
407
407
|
text-align: center;
|
|
@@ -468,7 +468,7 @@ const StatIcon = styled(Box)`
|
|
|
468
468
|
const StatValue = styled(Typography)`
|
|
469
469
|
font-size: 2.75rem;
|
|
470
470
|
font-weight: 700;
|
|
471
|
-
color: ${theme.colors.
|
|
471
|
+
color: ${props => props.theme.colors.neutral800};
|
|
472
472
|
line-height: 1;
|
|
473
473
|
margin-bottom: 10px;
|
|
474
474
|
transition: all ${theme.transitions.normal};
|
|
@@ -482,7 +482,7 @@ const StatValue = styled(Typography)`
|
|
|
482
482
|
|
|
483
483
|
const StatLabel = styled(Typography)`
|
|
484
484
|
font-size: 0.95rem;
|
|
485
|
-
color: ${theme.colors.
|
|
485
|
+
color: ${props => props.theme.colors.neutral600};
|
|
486
486
|
font-weight: 500;
|
|
487
487
|
letter-spacing: 0.025em;
|
|
488
488
|
text-align: center;
|
|
@@ -501,12 +501,12 @@ const SectionHeader = styled(Box)`
|
|
|
501
501
|
`;
|
|
502
502
|
|
|
503
503
|
const FilterBar = styled(Flex)`
|
|
504
|
-
background: ${theme.colors.
|
|
504
|
+
background: ${props => props.theme.colors.neutral0};
|
|
505
505
|
padding: ${theme.spacing.md} ${theme.spacing.lg};
|
|
506
506
|
border-radius: ${theme.borderRadius.lg};
|
|
507
507
|
margin-bottom: ${theme.spacing.lg};
|
|
508
508
|
box-shadow: ${theme.shadows.sm};
|
|
509
|
-
border: 1px solid ${theme.colors.
|
|
509
|
+
border: 1px solid ${props => props.theme.colors.neutral200};
|
|
510
510
|
gap: ${theme.spacing.md};
|
|
511
511
|
align-items: center;
|
|
512
512
|
`;
|
|
@@ -523,7 +523,7 @@ const SearchIcon = styled(MagnifyingGlassIcon)`
|
|
|
523
523
|
left: 12px;
|
|
524
524
|
width: 16px;
|
|
525
525
|
height: 16px;
|
|
526
|
-
color: ${theme.colors.
|
|
526
|
+
color: ${props => props.theme.colors.neutral600};
|
|
527
527
|
pointer-events: none;
|
|
528
528
|
z-index: 1;
|
|
529
529
|
`;
|
|
@@ -536,12 +536,12 @@ const StyledSearchInput = styled(TextInput)`
|
|
|
536
536
|
const StyledTable = styled(Table)`
|
|
537
537
|
width: 100%;
|
|
538
538
|
thead {
|
|
539
|
-
background: ${theme.colors.
|
|
540
|
-
border-bottom: 2px solid ${theme.colors.
|
|
539
|
+
background: ${props => props.theme.colors.neutral100};
|
|
540
|
+
border-bottom: 2px solid ${props => props.theme.colors.neutral200};
|
|
541
541
|
|
|
542
542
|
th {
|
|
543
543
|
font-weight: 600;
|
|
544
|
-
color: ${theme.colors.
|
|
544
|
+
color: ${props => props.theme.colors.neutral800};
|
|
545
545
|
font-size: 0.875rem;
|
|
546
546
|
text-transform: uppercase;
|
|
547
547
|
letter-spacing: 0.025em;
|
|
@@ -551,28 +551,28 @@ const StyledTable = styled(Table)`
|
|
|
551
551
|
|
|
552
552
|
tbody tr {
|
|
553
553
|
transition: all ${theme.transitions.fast};
|
|
554
|
-
border-bottom: 1px solid ${theme.colors.
|
|
554
|
+
border-bottom: 1px solid ${props => props.theme.colors.neutral150};
|
|
555
555
|
|
|
556
556
|
&:last-child {
|
|
557
557
|
border-bottom: none;
|
|
558
558
|
}
|
|
559
559
|
|
|
560
560
|
&:hover {
|
|
561
|
-
background: ${theme.colors.
|
|
561
|
+
background: ${props => props.theme.colors.primary100};
|
|
562
562
|
}
|
|
563
563
|
|
|
564
564
|
td {
|
|
565
565
|
padding: ${theme.spacing.lg} ${theme.spacing.lg};
|
|
566
|
-
color: ${theme.colors.
|
|
566
|
+
color: ${props => props.theme.colors.neutral800};
|
|
567
567
|
vertical-align: middle;
|
|
568
568
|
}
|
|
569
569
|
}
|
|
570
570
|
`;
|
|
571
571
|
|
|
572
572
|
const EmptyState = styled(Box)`
|
|
573
|
-
background: ${theme.colors.
|
|
573
|
+
background: ${props => props.theme.colors.neutral0};
|
|
574
574
|
border-radius: ${theme.borderRadius.xl};
|
|
575
|
-
border: 2px dashed ${theme.colors.
|
|
575
|
+
border: 2px dashed ${props => props.theme.colors.neutral300};
|
|
576
576
|
padding: 80px 32px;
|
|
577
577
|
text-align: center;
|
|
578
578
|
position: relative;
|
|
@@ -639,7 +639,7 @@ const EmptyFeatureItem = styled.div`
|
|
|
639
639
|
text-align: center;
|
|
640
640
|
gap: ${theme.spacing.sm};
|
|
641
641
|
padding: ${theme.spacing.lg};
|
|
642
|
-
background: ${theme.colors.
|
|
642
|
+
background: ${props => props.theme.colors.neutral0};
|
|
643
643
|
border-radius: ${theme.borderRadius.md};
|
|
644
644
|
box-shadow: ${theme.shadows.sm};
|
|
645
645
|
transition: ${theme.transitions.fast};
|
|
@@ -1121,12 +1121,12 @@ const TemplateList = () => {
|
|
|
1121
1121
|
<Flex alignItems="center" gap={3}>
|
|
1122
1122
|
<SparklesIcon style={{ width: 24, height: 24, color: theme.colors.warning[600] }} />
|
|
1123
1123
|
<Box>
|
|
1124
|
-
<Typography variant="omega" fontWeight="bold"
|
|
1124
|
+
<Typography variant="omega" fontWeight="bold" textColor="neutral800">
|
|
1125
1125
|
{limits.emailTemplates.current >= limits.emailTemplates.max
|
|
1126
1126
|
? `You've reached your ${getTierInfo().name} limit!`
|
|
1127
1127
|
: `You're approaching your ${getTierInfo().name} limit!`}
|
|
1128
1128
|
</Typography>
|
|
1129
|
-
<Typography variant="pi" style={{
|
|
1129
|
+
<Typography variant="pi" textColor="neutral600" style={{ marginTop: '4px' }}>
|
|
1130
1130
|
Using {limits.emailTemplates.current} of {limits.emailTemplates.max} templates.
|
|
1131
1131
|
{getTierInfo().next && ` Upgrade to ${getTierInfo().next} for ${getTierInfo().nextTemplates === -1 ? 'unlimited' : getTierInfo().nextTemplates} templates!`}
|
|
1132
1132
|
</Typography>
|
|
@@ -1159,10 +1159,10 @@ const TemplateList = () => {
|
|
|
1159
1159
|
|
|
1160
1160
|
<Typography
|
|
1161
1161
|
variant="alpha"
|
|
1162
|
+
textColor="neutral800"
|
|
1162
1163
|
style={{
|
|
1163
1164
|
fontSize: '1.75rem',
|
|
1164
1165
|
fontWeight: '700',
|
|
1165
|
-
color: theme.colors.neutral[800],
|
|
1166
1166
|
textAlign: 'center',
|
|
1167
1167
|
display: 'block',
|
|
1168
1168
|
}}
|
|
@@ -1244,7 +1244,7 @@ const TemplateList = () => {
|
|
|
1244
1244
|
<TemplatesContainer>
|
|
1245
1245
|
<SectionHeader>
|
|
1246
1246
|
<Flex justifyContent="space-between" alignItems="center" marginBottom={4}>
|
|
1247
|
-
<Typography variant="delta" style={{ fontSize: '1.5rem', fontWeight: 600
|
|
1247
|
+
<Typography variant="delta" textColor="neutral700" style={{ fontSize: '1.5rem', fontWeight: 600 }}>
|
|
1248
1248
|
Email Templates
|
|
1249
1249
|
</Typography>
|
|
1250
1250
|
<Button
|
|
@@ -1420,16 +1420,16 @@ const TemplateList = () => {
|
|
|
1420
1420
|
</Box>
|
|
1421
1421
|
) : (
|
|
1422
1422
|
<Box
|
|
1423
|
+
background="neutral100"
|
|
1423
1424
|
style={{
|
|
1424
1425
|
padding: '80px 32px',
|
|
1425
1426
|
textAlign: 'center',
|
|
1426
|
-
background: theme.colors.neutral[50],
|
|
1427
1427
|
borderRadius: theme.borderRadius.lg,
|
|
1428
|
-
border:
|
|
1428
|
+
border: '1px dashed #D1D5DB',
|
|
1429
1429
|
}}
|
|
1430
1430
|
>
|
|
1431
|
-
<MagnifyingGlassIcon style={{ width: '64px', height: '64px', margin: '0 auto 16px', color:
|
|
1432
|
-
<Typography variant="beta" style={{ marginBottom: '8px'
|
|
1431
|
+
<MagnifyingGlassIcon style={{ width: '64px', height: '64px', margin: '0 auto 16px', color: '#9CA3AF' }} />
|
|
1432
|
+
<Typography variant="beta" textColor="neutral700" style={{ marginBottom: '8px' }}>
|
|
1433
1433
|
No templates found
|
|
1434
1434
|
</Typography>
|
|
1435
1435
|
<Typography variant="omega" textColor="neutral600">
|
|
@@ -1455,7 +1455,7 @@ const TemplateList = () => {
|
|
|
1455
1455
|
<Tabs.Content value="coreEmails">
|
|
1456
1456
|
<Box style={{ marginTop: '24px' }}>
|
|
1457
1457
|
<Flex direction="column" gap={2} style={{ marginBottom: '24px' }}>
|
|
1458
|
-
<Typography variant="delta" style={{ fontSize: '1.5rem', fontWeight: 600
|
|
1458
|
+
<Typography variant="delta" textColor="neutral700" style={{ fontSize: '1.5rem', fontWeight: 600 }}>
|
|
1459
1459
|
Core Email Templates
|
|
1460
1460
|
</Typography>
|
|
1461
1461
|
<Typography variant="omega" textColor="neutral600">
|
|
@@ -1463,7 +1463,7 @@ const TemplateList = () => {
|
|
|
1463
1463
|
</Typography>
|
|
1464
1464
|
</Flex>
|
|
1465
1465
|
|
|
1466
|
-
<Box background="neutral0" borderRadius={theme.borderRadius.lg} shadow="md" style={{ border:
|
|
1466
|
+
<Box background="neutral0" borderRadius={theme.borderRadius.lg} shadow="md" style={{ border: '1px solid #E5E7EB', overflow: 'hidden' }}>
|
|
1467
1467
|
<Table colCount={2} rowCount={2}>
|
|
1468
1468
|
<Thead>
|
|
1469
1469
|
<Tr>
|
|
@@ -1523,10 +1523,10 @@ const TemplateList = () => {
|
|
|
1523
1523
|
display: 'flex',
|
|
1524
1524
|
flexDirection: 'column'
|
|
1525
1525
|
}}>
|
|
1526
|
-
<Modal.Header style={{ borderBottom:
|
|
1526
|
+
<Modal.Header style={{ borderBottom: '1px solid #E5E7EB', paddingBottom: '16px' }}>
|
|
1527
1527
|
<Flex alignItems="center" gap={2}>
|
|
1528
1528
|
<BoltIcon style={{ width: 24, height: 24, color: theme.colors.primary[600] }} />
|
|
1529
|
-
<Typography variant="beta"
|
|
1529
|
+
<Typography variant="beta" textColor="neutral800">
|
|
1530
1530
|
Send Template: {selectedTemplate.name}
|
|
1531
1531
|
</Typography>
|
|
1532
1532
|
</Flex>
|
|
@@ -1541,7 +1541,7 @@ const TemplateList = () => {
|
|
|
1541
1541
|
</CodeLabel>
|
|
1542
1542
|
<RecommendedBadge>Empfohlen</RecommendedBadge>
|
|
1543
1543
|
</CodeHeader>
|
|
1544
|
-
<Typography variant="pi" style={{
|
|
1544
|
+
<Typography variant="pi" textColor="neutral600" style={{ marginBottom: '16px' }}>
|
|
1545
1545
|
Nutze die standard Strapi Email-Funktion. MagicMail fängt sie automatisch ab und wendet alle Features an.
|
|
1546
1546
|
</Typography>
|
|
1547
1547
|
<CodeBlockWrapper>
|
|
@@ -1596,7 +1596,7 @@ const TemplateList = () => {
|
|
|
1596
1596
|
MagicMail Plugin Service
|
|
1597
1597
|
</CodeLabel>
|
|
1598
1598
|
</CodeHeader>
|
|
1599
|
-
<Typography variant="pi" style={{
|
|
1599
|
+
<Typography variant="pi" textColor="neutral600" style={{ marginBottom: '16px' }}>
|
|
1600
1600
|
Direkter Zugriff auf den MagicMail Service für erweiterte Optionen.
|
|
1601
1601
|
</Typography>
|
|
1602
1602
|
<CodeBlockWrapper>
|
|
@@ -1647,7 +1647,7 @@ const TemplateList = () => {
|
|
|
1647
1647
|
REST API
|
|
1648
1648
|
</CodeLabel>
|
|
1649
1649
|
</CodeHeader>
|
|
1650
|
-
<Typography variant="pi" style={{
|
|
1650
|
+
<Typography variant="pi" textColor="neutral600" style={{ marginBottom: '16px' }}>
|
|
1651
1651
|
Für externe Anwendungen, Frontend-Calls oder Postman Tests.
|
|
1652
1652
|
</Typography>
|
|
1653
1653
|
<CodeBlockWrapper>
|
|
@@ -2,6 +2,7 @@ import { useState, useEffect } from 'react';
|
|
|
2
2
|
import { useFetchClient, useNotification } from '@strapi/strapi/admin';
|
|
3
3
|
import { useAuthRefresh } from '../hooks/useAuthRefresh';
|
|
4
4
|
import styled, { keyframes, css } from 'styled-components';
|
|
5
|
+
import { theme } from '../utils/theme';
|
|
5
6
|
import {
|
|
6
7
|
Box,
|
|
7
8
|
Button,
|
|
@@ -29,72 +30,6 @@ import {
|
|
|
29
30
|
} from '@heroicons/react/24/outline';
|
|
30
31
|
import AddAccountModal from '../components/AddAccountModal';
|
|
31
32
|
|
|
32
|
-
// ================ THEME (Exact copy from magic-sessionmanager) ================
|
|
33
|
-
const theme = {
|
|
34
|
-
colors: {
|
|
35
|
-
primary: {
|
|
36
|
-
50: '#F0F9FF',
|
|
37
|
-
100: '#E0F2FE',
|
|
38
|
-
500: '#0EA5E9',
|
|
39
|
-
600: '#0284C7',
|
|
40
|
-
700: '#0369A1',
|
|
41
|
-
},
|
|
42
|
-
secondary: {
|
|
43
|
-
500: '#A855F7',
|
|
44
|
-
600: '#9333EA',
|
|
45
|
-
},
|
|
46
|
-
success: {
|
|
47
|
-
100: '#DCFCE7',
|
|
48
|
-
500: '#22C55E',
|
|
49
|
-
600: '#16A34A',
|
|
50
|
-
700: '#15803D',
|
|
51
|
-
},
|
|
52
|
-
warning: {
|
|
53
|
-
100: '#FEF3C7',
|
|
54
|
-
500: '#F59E0B',
|
|
55
|
-
600: '#D97706',
|
|
56
|
-
},
|
|
57
|
-
danger: {
|
|
58
|
-
100: '#FEE2E2',
|
|
59
|
-
500: '#EF4444',
|
|
60
|
-
600: '#DC2626',
|
|
61
|
-
},
|
|
62
|
-
neutral: {
|
|
63
|
-
0: '#FFFFFF',
|
|
64
|
-
50: '#F9FAFB',
|
|
65
|
-
100: '#F3F4F6',
|
|
66
|
-
200: '#E5E7EB',
|
|
67
|
-
600: '#4B5563',
|
|
68
|
-
700: '#374151',
|
|
69
|
-
800: '#1F2937',
|
|
70
|
-
}
|
|
71
|
-
},
|
|
72
|
-
shadows: {
|
|
73
|
-
sm: '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1)',
|
|
74
|
-
md: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1)',
|
|
75
|
-
lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)',
|
|
76
|
-
xl: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)',
|
|
77
|
-
},
|
|
78
|
-
transitions: {
|
|
79
|
-
fast: '150ms cubic-bezier(0.4, 0, 0.2, 1)',
|
|
80
|
-
normal: '300ms cubic-bezier(0.4, 0, 0.2, 1)',
|
|
81
|
-
slow: '500ms cubic-bezier(0.4, 0, 0.2, 1)',
|
|
82
|
-
},
|
|
83
|
-
spacing: {
|
|
84
|
-
xs: '4px',
|
|
85
|
-
sm: '8px',
|
|
86
|
-
md: '16px',
|
|
87
|
-
lg: '24px',
|
|
88
|
-
xl: '32px',
|
|
89
|
-
'2xl': '48px',
|
|
90
|
-
},
|
|
91
|
-
borderRadius: {
|
|
92
|
-
md: '8px',
|
|
93
|
-
lg: '12px',
|
|
94
|
-
xl: '16px',
|
|
95
|
-
}
|
|
96
|
-
};
|
|
97
|
-
|
|
98
33
|
// ================ ANIMATIONS ================
|
|
99
34
|
const fadeIn = keyframes`
|
|
100
35
|
from { opacity: 0; transform: translateY(10px); }
|
|
@@ -196,7 +131,7 @@ const HeaderContent = styled(Flex)`
|
|
|
196
131
|
`;
|
|
197
132
|
|
|
198
133
|
const Title = styled(Typography)`
|
|
199
|
-
color:
|
|
134
|
+
color: white;
|
|
200
135
|
font-size: 2rem;
|
|
201
136
|
font-weight: 700;
|
|
202
137
|
letter-spacing: -0.025em;
|
|
@@ -251,7 +186,7 @@ const StatsGrid = styled.div`
|
|
|
251
186
|
`;
|
|
252
187
|
|
|
253
188
|
const StatCard = styled(Box)`
|
|
254
|
-
background: ${theme.colors.
|
|
189
|
+
background: ${props => props.theme.colors.neutral0};
|
|
255
190
|
border-radius: ${theme.borderRadius.lg};
|
|
256
191
|
padding: 28px ${theme.spacing.lg};
|
|
257
192
|
position: relative;
|
|
@@ -260,7 +195,7 @@ const StatCard = styled(Box)`
|
|
|
260
195
|
${css`animation: ${fadeIn} ${theme.transitions.slow} backwards;`}
|
|
261
196
|
animation-delay: ${props => props.$delay || '0s'};
|
|
262
197
|
box-shadow: ${theme.shadows.sm};
|
|
263
|
-
border: 1px solid ${theme.colors.
|
|
198
|
+
border: 1px solid ${props => props.theme.colors.neutral200};
|
|
264
199
|
min-width: 200px;
|
|
265
200
|
flex: 1;
|
|
266
201
|
text-align: center;
|
|
@@ -327,7 +262,7 @@ const StatIcon = styled(Box)`
|
|
|
327
262
|
const StatValue = styled(Typography)`
|
|
328
263
|
font-size: 2.75rem;
|
|
329
264
|
font-weight: 700;
|
|
330
|
-
color: ${theme.colors.
|
|
265
|
+
color: ${props => props.theme.colors.neutral800};
|
|
331
266
|
line-height: 1;
|
|
332
267
|
margin-bottom: 10px;
|
|
333
268
|
transition: all ${theme.transitions.normal};
|
|
@@ -341,7 +276,7 @@ const StatValue = styled(Typography)`
|
|
|
341
276
|
|
|
342
277
|
const StatLabel = styled(Typography)`
|
|
343
278
|
font-size: 0.95rem;
|
|
344
|
-
color: ${theme.colors.
|
|
279
|
+
color: ${props => props.theme.colors.neutral600};
|
|
345
280
|
font-weight: 500;
|
|
346
281
|
letter-spacing: 0.025em;
|
|
347
282
|
text-align: center;
|
|
@@ -356,9 +291,9 @@ const AccountsContainer = styled(Box)`
|
|
|
356
291
|
`;
|
|
357
292
|
|
|
358
293
|
const EmptyState = styled(Box)`
|
|
359
|
-
background: ${theme.colors.
|
|
294
|
+
background: ${props => props.theme.colors.neutral0};
|
|
360
295
|
border-radius: ${theme.borderRadius.xl};
|
|
361
|
-
border: 2px dashed ${theme.colors.
|
|
296
|
+
border: 2px dashed ${props => props.theme.colors.neutral300};
|
|
362
297
|
padding: 80px 32px;
|
|
363
298
|
text-align: center;
|
|
364
299
|
position: relative;
|
|
@@ -386,7 +321,7 @@ const OnlineBadge = styled.div`
|
|
|
386
321
|
width: 12px;
|
|
387
322
|
height: 12px;
|
|
388
323
|
border-radius: 50%;
|
|
389
|
-
background: ${props => props.$active ? theme.colors.success[500] : theme.colors.
|
|
324
|
+
background: ${props => props.$active ? theme.colors.success[500] : props.theme.colors.neutral400};
|
|
390
325
|
display: inline-block;
|
|
391
326
|
margin-right: 8px;
|
|
392
327
|
${css`animation: ${props => props.$active ? pulse : 'none'} 2s ease-in-out infinite;`}
|
|
@@ -394,12 +329,12 @@ const OnlineBadge = styled.div`
|
|
|
394
329
|
|
|
395
330
|
const StyledTable = styled(Table)`
|
|
396
331
|
thead {
|
|
397
|
-
background: ${theme.colors.
|
|
398
|
-
border-bottom: 2px solid ${theme.colors.
|
|
332
|
+
background: ${props => props.theme.colors.neutral100};
|
|
333
|
+
border-bottom: 2px solid ${props => props.theme.colors.neutral200};
|
|
399
334
|
|
|
400
335
|
th {
|
|
401
336
|
font-weight: 600;
|
|
402
|
-
color: ${theme.colors.
|
|
337
|
+
color: ${props => props.theme.colors.neutral800};
|
|
403
338
|
font-size: 0.875rem;
|
|
404
339
|
text-transform: uppercase;
|
|
405
340
|
letter-spacing: 0.025em;
|
|
@@ -409,31 +344,31 @@ const StyledTable = styled(Table)`
|
|
|
409
344
|
|
|
410
345
|
tbody tr {
|
|
411
346
|
transition: all ${theme.transitions.fast};
|
|
412
|
-
border-bottom: 1px solid ${theme.colors.
|
|
347
|
+
border-bottom: 1px solid ${props => props.theme.colors.neutral150};
|
|
413
348
|
|
|
414
349
|
&:last-child {
|
|
415
350
|
border-bottom: none;
|
|
416
351
|
}
|
|
417
352
|
|
|
418
353
|
&:hover {
|
|
419
|
-
background: ${theme.colors.
|
|
354
|
+
background: ${props => props.theme.colors.primary100};
|
|
420
355
|
}
|
|
421
356
|
|
|
422
357
|
td {
|
|
423
358
|
padding: ${theme.spacing.lg} ${theme.spacing.lg};
|
|
424
|
-
color: ${theme.colors.
|
|
359
|
+
color: ${props => props.theme.colors.neutral800};
|
|
425
360
|
vertical-align: middle;
|
|
426
361
|
}
|
|
427
362
|
}
|
|
428
363
|
`;
|
|
429
364
|
|
|
430
365
|
const FilterBar = styled(Flex)`
|
|
431
|
-
background: ${theme.colors.
|
|
366
|
+
background: ${props => props.theme.colors.neutral0};
|
|
432
367
|
padding: ${theme.spacing.md} ${theme.spacing.lg};
|
|
433
368
|
border-radius: ${theme.borderRadius.lg};
|
|
434
369
|
margin-bottom: ${theme.spacing.lg};
|
|
435
370
|
box-shadow: ${theme.shadows.sm};
|
|
436
|
-
border: 1px solid ${theme.colors.
|
|
371
|
+
border: 1px solid ${props => props.theme.colors.neutral200};
|
|
437
372
|
gap: ${theme.spacing.md};
|
|
438
373
|
align-items: center;
|
|
439
374
|
`;
|
|
@@ -450,17 +385,19 @@ const SearchIcon = styled(MagnifyingGlassIcon)`
|
|
|
450
385
|
left: 12px;
|
|
451
386
|
width: 16px;
|
|
452
387
|
height: 16px;
|
|
453
|
-
color: ${theme.colors.
|
|
388
|
+
color: ${props => props.theme.colors.neutral600};
|
|
454
389
|
pointer-events: none;
|
|
455
390
|
`;
|
|
456
391
|
|
|
457
392
|
const StyledSearchInput = styled.input`
|
|
458
393
|
width: 100%;
|
|
459
394
|
padding: 10px 12px 10px 40px;
|
|
460
|
-
border: 1px solid ${theme.colors.
|
|
395
|
+
border: 1px solid ${props => props.theme.colors.neutral200};
|
|
461
396
|
border-radius: ${theme.borderRadius.md};
|
|
462
397
|
font-size: 0.875rem;
|
|
463
398
|
transition: all ${theme.transitions.fast};
|
|
399
|
+
background: ${props => props.theme.colors.neutral0};
|
|
400
|
+
color: ${props => props.theme.colors.neutral800};
|
|
464
401
|
|
|
465
402
|
&:focus {
|
|
466
403
|
outline: none;
|
|
@@ -469,7 +406,7 @@ const StyledSearchInput = styled.input`
|
|
|
469
406
|
}
|
|
470
407
|
|
|
471
408
|
&::placeholder {
|
|
472
|
-
color: ${theme.colors.
|
|
409
|
+
color: ${props => props.theme.colors.neutral500};
|
|
473
410
|
}
|
|
474
411
|
`;
|
|
475
412
|
|
|
@@ -654,10 +591,10 @@ const HomePage = () => {
|
|
|
654
591
|
|
|
655
592
|
<Typography
|
|
656
593
|
variant="alpha"
|
|
594
|
+
textColor="neutral800"
|
|
657
595
|
style={{
|
|
658
596
|
fontSize: '1.75rem',
|
|
659
597
|
fontWeight: '700',
|
|
660
|
-
color: theme.colors.neutral[800],
|
|
661
598
|
marginBottom: '8px',
|
|
662
599
|
}}
|
|
663
600
|
>
|
|
@@ -689,7 +626,7 @@ const HomePage = () => {
|
|
|
689
626
|
<AccountsContainer>
|
|
690
627
|
<Box style={{ marginBottom: theme.spacing.md }}>
|
|
691
628
|
<Flex justifyContent="space-between" alignItems="center" marginBottom={4}>
|
|
692
|
-
<Typography variant="delta" style={{ fontSize: '1.5rem', fontWeight: 600
|
|
629
|
+
<Typography variant="delta" textColor="neutral700" style={{ fontSize: '1.5rem', fontWeight: 600 }}>
|
|
693
630
|
📧 Email Accounts
|
|
694
631
|
</Typography>
|
|
695
632
|
<Button startIcon={<PlusIcon style={{ width: 16, height: 16 }} />} onClick={() => setShowAddModal(true)}>
|
|
@@ -833,10 +770,10 @@ const HomePage = () => {
|
|
|
833
770
|
{account.dailyLimit > 0 && (
|
|
834
771
|
<Box style={{ width: '100%', minWidth: '80px' }}>
|
|
835
772
|
<Box
|
|
773
|
+
background="neutral100"
|
|
836
774
|
style={{
|
|
837
775
|
width: '100%',
|
|
838
776
|
height: '6px',
|
|
839
|
-
background: theme.colors.neutral[100],
|
|
840
777
|
borderRadius: '999px',
|
|
841
778
|
overflow: 'hidden',
|
|
842
779
|
}}
|
|
@@ -43,7 +43,7 @@ const Title = styled(Typography)`
|
|
|
43
43
|
|
|
44
44
|
const Subtitle = styled(Typography)`
|
|
45
45
|
font-size: 1.125rem;
|
|
46
|
-
color:
|
|
46
|
+
color: ${props => props.theme.colors.neutral600};
|
|
47
47
|
line-height: 1.6;
|
|
48
48
|
display: block;
|
|
49
49
|
`;
|
|
@@ -54,24 +54,29 @@ const TierGrid = styled(Flex)`
|
|
|
54
54
|
max-width: 1080px;
|
|
55
55
|
justify-content: center;
|
|
56
56
|
flex-wrap: wrap;
|
|
57
|
+
align-items: stretch;
|
|
57
58
|
`;
|
|
58
59
|
|
|
59
60
|
const TierWrapper = styled(Box)`
|
|
60
61
|
flex: 1;
|
|
61
62
|
min-width: 280px;
|
|
62
63
|
max-width: 340px;
|
|
64
|
+
display: flex;
|
|
63
65
|
`;
|
|
64
66
|
|
|
65
67
|
const TierCard = styled(Box)`
|
|
66
|
-
background:
|
|
68
|
+
background: ${props => props.theme.colors.neutral0};
|
|
67
69
|
border-radius: 16px;
|
|
68
70
|
padding: 32px;
|
|
69
|
-
border: 2px solid ${props => props.$featured ? '#0EA5E9' :
|
|
71
|
+
border: 2px solid ${props => props.$featured ? '#0EA5E9' : props.theme.colors.neutral200};
|
|
70
72
|
position: relative;
|
|
71
73
|
transition: all 0.3s ease;
|
|
72
74
|
box-shadow: ${props => props.$featured
|
|
73
75
|
? '0 20px 25px -5px rgba(14, 165, 233, 0.25), 0 8px 10px -6px rgba(14, 165, 233, 0.2)'
|
|
74
76
|
: '0 10px 15px -3px rgba(15, 23, 42, 0.08), 0 4px 6px -4px rgba(15, 23, 42, 0.05)'};
|
|
77
|
+
display: flex;
|
|
78
|
+
flex-direction: column;
|
|
79
|
+
width: 100%;
|
|
75
80
|
|
|
76
81
|
&:hover {
|
|
77
82
|
transform: translateY(-4px);
|
|
@@ -120,12 +125,13 @@ const TierPrice = styled(Typography)`
|
|
|
120
125
|
`;
|
|
121
126
|
|
|
122
127
|
const TierDescription = styled(Typography)`
|
|
123
|
-
color:
|
|
128
|
+
color: ${props => props.theme.colors.neutral600};
|
|
124
129
|
margin-bottom: 24px;
|
|
125
130
|
`;
|
|
126
131
|
|
|
127
132
|
const FeatureList = styled(Box)`
|
|
128
133
|
margin-bottom: 24px;
|
|
134
|
+
flex: 1;
|
|
129
135
|
`;
|
|
130
136
|
|
|
131
137
|
const Feature = styled(Flex)`
|
|
@@ -174,8 +180,8 @@ const CurrentPlanBadge = styled(Badge)`
|
|
|
174
180
|
display: flex;
|
|
175
181
|
align-items: center;
|
|
176
182
|
justify-content: center;
|
|
177
|
-
background:
|
|
178
|
-
color:
|
|
183
|
+
background: ${props => props.theme.colors.neutral100};
|
|
184
|
+
color: ${props => props.theme.colors.neutral600};
|
|
179
185
|
font-weight: 600;
|
|
180
186
|
font-size: 15px;
|
|
181
187
|
`;
|