@novacraft-engineering/mailbox 0.4.5 → 0.4.18
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 +17 -0
- package/app/api/mail/inbox/counts/route.ts +7 -7
- package/app/api/mail/inbox/route.ts +23 -4
- package/app/api/mail/maintenance/received/route.ts +11 -6
- package/app/api/mail/maintenance/rejudge/route.ts +32 -0
- package/app/api/mail/scheduled/route.ts +48 -0
- package/app/api/mail/scheduled/run/route.ts +19 -0
- package/app/api/mail/send/route.ts +35 -3
- package/app/api/mail/threads/route.ts +1 -1
- package/app/globals.css +7 -0
- package/app/mail/AttachmentLightbox.tsx +1 -1
- package/app/mail/InstallGuide.tsx +133 -0
- package/app/mail/page.module.css +197 -1
- package/app/mail/page.tsx +278 -35
- package/app/mail/pwa.test.ts +30 -0
- package/app/mail/pwa.ts +25 -1
- package/app/mail/search.ts +17 -0
- package/lib/dev-auth.ts +25 -9
- package/lib/mail-provider.ts +22 -2
- package/lib/mailbox.ts +519 -42
- package/lib/receive.test.ts +20 -8
- package/lib/receive.ts +109 -12
- package/lib/scheduled.ts +168 -0
- package/lib/schema.test.ts +50 -0
- package/lib/ses-send.ts +14 -2
- package/package.json +1 -1
- package/tools/__pycache__/import-mbox.cpython-314.pyc +0 -0
package/app/mail/page.module.css
CHANGED
|
@@ -915,7 +915,10 @@
|
|
|
915
915
|
.item:hover { background: var(--nc-ink-1); }
|
|
916
916
|
.itemActive {
|
|
917
917
|
background: var(--nc-ink-2);
|
|
918
|
-
|
|
918
|
+
/* The same ring the selected folder wears, so "this is the one you are on" reads the
|
|
919
|
+
same in the list as it does in the sidebar. */
|
|
920
|
+
border-color: transparent;
|
|
921
|
+
box-shadow: inset 0 0 0 1.5px var(--nc-violet-500);
|
|
919
922
|
}
|
|
920
923
|
.avatar {
|
|
921
924
|
width: var(--row-avatar);
|
|
@@ -1009,6 +1012,91 @@
|
|
|
1009
1012
|
.chipDraft { color: var(--nc-violet-200); border-color: rgba(165,120,255,.3); }
|
|
1010
1013
|
.chipAuto { color: var(--nc-fg-3); border-color: var(--nc-line-2); }
|
|
1011
1014
|
|
|
1015
|
+
/* Copied-in notice. The brand accent carries it, darkened to 70%: white on pulsar's own
|
|
1016
|
+
accent measures 2.5:1, which is unreadable, and every brand clears AA once darkened. */
|
|
1017
|
+
.copiedNote,
|
|
1018
|
+
.copiedBanner {
|
|
1019
|
+
--copied-bg: color-mix(in srgb, var(--nc-violet-500, #6d28d9) 70%, black);
|
|
1020
|
+
display: flex;
|
|
1021
|
+
align-items: center;
|
|
1022
|
+
gap: 6px;
|
|
1023
|
+
background: var(--copied-bg);
|
|
1024
|
+
color: #fff;
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
.copiedNote {
|
|
1028
|
+
margin-top: 6px;
|
|
1029
|
+
padding: 3px 8px;
|
|
1030
|
+
border-radius: 6px;
|
|
1031
|
+
font: 500 11px/1.35 var(--nc-font-sans);
|
|
1032
|
+
width: fit-content;
|
|
1033
|
+
max-width: 100%;
|
|
1034
|
+
}
|
|
1035
|
+
|
|
1036
|
+
.copiedBanner {
|
|
1037
|
+
margin: 10px 0 0;
|
|
1038
|
+
padding: 9px 14px;
|
|
1039
|
+
border-radius: 8px;
|
|
1040
|
+
font: 500 13px/1.45 var(--nc-font-sans);
|
|
1041
|
+
width: 100%;
|
|
1042
|
+
box-sizing: border-box;
|
|
1043
|
+
text-wrap: pretty;
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1046
|
+
.copiedNoteIcon,
|
|
1047
|
+
.copiedBannerIcon {
|
|
1048
|
+
display: inline-flex;
|
|
1049
|
+
flex-shrink: 0;
|
|
1050
|
+
color: #fff;
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
.copiedNoteIcon svg { width: 12px; height: 12px; }
|
|
1054
|
+
|
|
1055
|
+
/* A warning, not the brand: spam and spoofing are not house colours. Amber for a sender
|
|
1056
|
+
that cannot be verified, red where a scanner actually failed the message. */
|
|
1057
|
+
.riskNote,
|
|
1058
|
+
.riskBanner {
|
|
1059
|
+
display: flex;
|
|
1060
|
+
gap: 8px;
|
|
1061
|
+
color: #fff;
|
|
1062
|
+
background: #b45309;
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1065
|
+
.riskNote {
|
|
1066
|
+
align-items: center;
|
|
1067
|
+
gap: 6px;
|
|
1068
|
+
margin-top: 6px;
|
|
1069
|
+
padding: 3px 8px;
|
|
1070
|
+
border-radius: 6px;
|
|
1071
|
+
font: 600 11px/1.35 var(--nc-font-sans);
|
|
1072
|
+
width: fit-content;
|
|
1073
|
+
max-width: 100%;
|
|
1074
|
+
}
|
|
1075
|
+
|
|
1076
|
+
.riskBanner {
|
|
1077
|
+
align-items: flex-start;
|
|
1078
|
+
margin: 10px 0 0;
|
|
1079
|
+
padding: 11px 14px;
|
|
1080
|
+
border-radius: 8px;
|
|
1081
|
+
font: 400 13px/1.5 var(--nc-font-sans);
|
|
1082
|
+
width: 100%;
|
|
1083
|
+
box-sizing: border-box;
|
|
1084
|
+
text-wrap: pretty;
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
.riskBanner strong { display: block; font-weight: 650; }
|
|
1088
|
+
.riskBannerWhy { display: block; margin-top: 3px; opacity: 0.92; font-size: 12.5px; }
|
|
1089
|
+
.riskBannerReasons { margin: 4px 0 0; padding-left: 16px; opacity: 0.92; font-size: 12.5px; list-style: disc; }
|
|
1090
|
+
.riskBannerReasons li { margin-top: 2px; }
|
|
1091
|
+
|
|
1092
|
+
.riskNoteIcon,
|
|
1093
|
+
.riskBannerIcon { display: inline-flex; flex-shrink: 0; }
|
|
1094
|
+
.riskNoteIcon svg { width: 12px; height: 12px; }
|
|
1095
|
+
.riskBannerIcon svg { width: 17px; height: 17px; margin-top: 1px; }
|
|
1096
|
+
|
|
1097
|
+
.copiedBannerIcon svg { width: 16px; height: 16px; }
|
|
1098
|
+
|
|
1099
|
+
|
|
1012
1100
|
.emptyList {
|
|
1013
1101
|
display: flex;
|
|
1014
1102
|
flex-direction: column;
|
|
@@ -4056,6 +4144,59 @@
|
|
|
4056
4144
|
font: 500 14px/1.4 var(--nc-font-sans);
|
|
4057
4145
|
color: var(--nc-fg-1);
|
|
4058
4146
|
}
|
|
4147
|
+
|
|
4148
|
+
.installGuide {
|
|
4149
|
+
display: flex;
|
|
4150
|
+
flex-direction: column;
|
|
4151
|
+
gap: 12px;
|
|
4152
|
+
}
|
|
4153
|
+
.installWarn {
|
|
4154
|
+
margin: 0;
|
|
4155
|
+
padding: 10px 12px;
|
|
4156
|
+
border: 1px solid var(--nc-line-2);
|
|
4157
|
+
border-left: 3px solid var(--nc-violet-400);
|
|
4158
|
+
border-radius: 10px;
|
|
4159
|
+
background: var(--nc-ink-2);
|
|
4160
|
+
font: 400 12px/1.55 var(--nc-font-sans);
|
|
4161
|
+
color: var(--nc-fg-2);
|
|
4162
|
+
}
|
|
4163
|
+
.installSteps {
|
|
4164
|
+
list-style: none;
|
|
4165
|
+
margin: 0;
|
|
4166
|
+
padding: 0;
|
|
4167
|
+
display: flex;
|
|
4168
|
+
flex-direction: column;
|
|
4169
|
+
gap: 10px;
|
|
4170
|
+
}
|
|
4171
|
+
.installStep {
|
|
4172
|
+
display: grid;
|
|
4173
|
+
grid-template-columns: 116px minmax(0, 1fr);
|
|
4174
|
+
align-items: center;
|
|
4175
|
+
gap: 14px;
|
|
4176
|
+
padding: 12px;
|
|
4177
|
+
border: 1px solid var(--nc-line-1);
|
|
4178
|
+
border-radius: 12px;
|
|
4179
|
+
background: var(--nc-ink-2);
|
|
4180
|
+
}
|
|
4181
|
+
.installStep strong {
|
|
4182
|
+
display: block;
|
|
4183
|
+
margin-bottom: 4px;
|
|
4184
|
+
font: 600 13px/1.3 var(--nc-font-sans);
|
|
4185
|
+
color: var(--nc-fg-1);
|
|
4186
|
+
}
|
|
4187
|
+
.installArt {
|
|
4188
|
+
width: 100%;
|
|
4189
|
+
height: auto;
|
|
4190
|
+
display: block;
|
|
4191
|
+
border-radius: 10px;
|
|
4192
|
+
background: var(--nc-ink-1);
|
|
4193
|
+
}
|
|
4194
|
+
@media (max-width: 560px) {
|
|
4195
|
+
.installStep {
|
|
4196
|
+
grid-template-columns: 84px minmax(0, 1fr);
|
|
4197
|
+
gap: 11px;
|
|
4198
|
+
}
|
|
4199
|
+
}
|
|
4059
4200
|
.tickerGroup {
|
|
4060
4201
|
display: flex;
|
|
4061
4202
|
flex-direction: column;
|
|
@@ -5396,6 +5537,61 @@
|
|
|
5396
5537
|
word-break: break-word;
|
|
5397
5538
|
}
|
|
5398
5539
|
|
|
5540
|
+
.bodyFileImage {
|
|
5541
|
+
display: block;
|
|
5542
|
+
max-width: 100%;
|
|
5543
|
+
max-height: 72vh;
|
|
5544
|
+
margin: 4px 0;
|
|
5545
|
+
border-radius: 10px;
|
|
5546
|
+
border: 1px solid var(--nc-line-1);
|
|
5547
|
+
object-fit: contain;
|
|
5548
|
+
background: var(--nc-ink-1);
|
|
5549
|
+
}
|
|
5550
|
+
|
|
5551
|
+
.bodyFileFrame {
|
|
5552
|
+
display: block;
|
|
5553
|
+
width: 100%;
|
|
5554
|
+
height: min(72vh, 900px);
|
|
5555
|
+
margin: 4px 0;
|
|
5556
|
+
border: 1px solid var(--nc-line-1);
|
|
5557
|
+
border-radius: 10px;
|
|
5558
|
+
background: var(--nc-ink-1);
|
|
5559
|
+
}
|
|
5560
|
+
|
|
5561
|
+
.bodyFileAudio {
|
|
5562
|
+
display: block;
|
|
5563
|
+
width: 100%;
|
|
5564
|
+
margin: 12px 0;
|
|
5565
|
+
}
|
|
5566
|
+
|
|
5567
|
+
.bodyFileCard {
|
|
5568
|
+
display: flex;
|
|
5569
|
+
align-items: center;
|
|
5570
|
+
gap: 12px;
|
|
5571
|
+
margin: 4px 0;
|
|
5572
|
+
padding: 16px 18px;
|
|
5573
|
+
border: 1px solid var(--nc-line-1);
|
|
5574
|
+
border-radius: 12px;
|
|
5575
|
+
color: inherit;
|
|
5576
|
+
text-decoration: none;
|
|
5577
|
+
}
|
|
5578
|
+
|
|
5579
|
+
.bodyFileCard:hover { border-color: var(--nc-violet-400); }
|
|
5580
|
+
.bodyFileCard span { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
|
|
5581
|
+
.bodyFileCard strong { font: 600 13.5px/1.35 var(--nc-font-sans); overflow-wrap: anywhere; }
|
|
5582
|
+
.bodyFileCard small { font: 400 12px/1.4 var(--nc-font-sans); color: var(--nc-fg-3); }
|
|
5583
|
+
|
|
5584
|
+
.bodyFileGlyph {
|
|
5585
|
+
display: grid;
|
|
5586
|
+
place-items: center;
|
|
5587
|
+
width: 34px;
|
|
5588
|
+
height: 34px;
|
|
5589
|
+
flex-shrink: 0;
|
|
5590
|
+
border-radius: 9px;
|
|
5591
|
+
background: var(--nc-ink-3);
|
|
5592
|
+
color: var(--nc-fg-2);
|
|
5593
|
+
}
|
|
5594
|
+
|
|
5399
5595
|
.confirmField {
|
|
5400
5596
|
display: flex;
|
|
5401
5597
|
flex-direction: column;
|