@rapidmx/web-client 0.2.0
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/LICENSE +382 -0
- package/apps/admin/_404.tsx +9 -0
- package/apps/admin/_500.tsx +9 -0
- package/apps/admin/_layout.tsx +41 -0
- package/apps/admin/audit-log/index.tsx +187 -0
- package/apps/admin/branding/index.tsx +404 -0
- package/apps/admin/distribution-lists/[uid].tsx +70 -0
- package/apps/admin/distribution-lists/index.tsx +115 -0
- package/apps/admin/distribution-lists/new/index.tsx +114 -0
- package/apps/admin/domains/[uid].tsx +259 -0
- package/apps/admin/domains/index.tsx +125 -0
- package/apps/admin/domains/new/index.tsx +84 -0
- package/apps/admin/index.tsx +82 -0
- package/apps/admin/ingest-queue/index.tsx +116 -0
- package/apps/admin/mailboxes/[uid].tsx +126 -0
- package/apps/admin/mailboxes/new/index.tsx +291 -0
- package/apps/admin/quarantine/index.tsx +171 -0
- package/apps/admin/transport-rules/[uid].tsx +143 -0
- package/apps/admin/transport-rules/_transportRuleConfig.tsx +75 -0
- package/apps/admin/transport-rules/index.tsx +117 -0
- package/apps/admin/transport-rules/new/index.tsx +105 -0
- package/apps/shared/components/admin/distributionLists/MemberListCard.tsx +117 -0
- package/apps/shared/components/admin/layout/AdminShell.tsx +186 -0
- package/apps/shared/components/admin/mailboxes/MailboxTable.tsx +73 -0
- package/apps/shared/components/admin/mailboxes/ResourceSettingsCard.tsx +154 -0
- package/apps/shared/components/admin/mailboxes/ShareAccessCard.tsx +124 -0
- package/apps/shared/components/booking/AvailabilityEditor.tsx +118 -0
- package/apps/shared/components/calendar/CalendarListSidebar.tsx +119 -0
- package/apps/shared/components/calendar/EventModal.tsx +513 -0
- package/apps/shared/components/calendar/MonthView.tsx +139 -0
- package/apps/shared/components/calendar/RecurrenceEditor.tsx +180 -0
- package/apps/shared/components/calendar/ResourcePicker.tsx +80 -0
- package/apps/shared/components/calendar/SplitDayView.tsx +137 -0
- package/apps/shared/components/calendar/TimeGridView.tsx +198 -0
- package/apps/shared/components/calendar/layout/CalendarShell.tsx +211 -0
- package/apps/shared/components/contacts/ContactDetailPane.tsx +99 -0
- package/apps/shared/components/contacts/ContactForm.tsx +314 -0
- package/apps/shared/components/contacts/ContactsSidebar.tsx +242 -0
- package/apps/shared/components/contacts/ContactsToolbar.tsx +115 -0
- package/apps/shared/components/contacts/layout/ContactsShell.tsx +197 -0
- package/apps/shared/components/layout/AppShell.tsx +165 -0
- package/apps/shared/components/layout/BrandingChrome.tsx +25 -0
- package/apps/shared/components/layout/MailboxProvisioning.tsx +110 -0
- package/apps/shared/components/layout/UserMenu.tsx +150 -0
- package/apps/shared/components/mail/ConversationList.tsx +61 -0
- package/apps/shared/components/mail/ConversationThreadPane.tsx +174 -0
- package/apps/shared/components/mail/MessageDetailPane.tsx +390 -0
- package/apps/shared/components/mail/compose/ComposeContext.tsx +114 -0
- package/apps/shared/components/mail/compose/ComposeToolbar.tsx +418 -0
- package/apps/shared/components/mail/compose/ComposeWindow.tsx +518 -0
- package/apps/shared/components/mail/compose/EmojiPicker.tsx +64 -0
- package/apps/shared/components/mail/compose/GifPicker.tsx +82 -0
- package/apps/shared/components/mail/compose/RichTextEditor.tsx +83 -0
- package/apps/shared/components/mail/compose/ScheduleSendPicker.tsx +64 -0
- package/apps/shared/components/mail/layout/MailShell.tsx +287 -0
- package/apps/shared/components/rules/RuleBuilder.tsx +276 -0
- package/apps/shared/components/settings/layout/SettingsShell.tsx +223 -0
- package/apps/shared/components/tasks/TasksSidebar.tsx +201 -0
- package/apps/shared/components/tasks/TasksToolbar.tsx +68 -0
- package/apps/shared/components/tasks/layout/TasksShell.tsx +199 -0
- package/apps/shared/styles/app.css +265 -0
- package/apps/www/_404.tsx +9 -0
- package/apps/www/_500.tsx +9 -0
- package/apps/www/_layout.tsx +45 -0
- package/apps/www/calendar/index.tsx +407 -0
- package/apps/www/contacts/[uid].tsx +88 -0
- package/apps/www/contacts/index.tsx +436 -0
- package/apps/www/index.tsx +375 -0
- package/apps/www/messages/[uid].tsx +70 -0
- package/apps/www/settings/auto-reply/index.tsx +129 -0
- package/apps/www/settings/booking-types/[uid].tsx +300 -0
- package/apps/www/settings/booking-types/index.tsx +98 -0
- package/apps/www/settings/booking-types/new/index.tsx +212 -0
- package/apps/www/settings/filters/[uid].tsx +155 -0
- package/apps/www/settings/filters/_mailFilterRuleConfig.tsx +102 -0
- package/apps/www/settings/filters/index.tsx +99 -0
- package/apps/www/settings/filters/new/index.tsx +126 -0
- package/apps/www/settings/focused-inbox/index.tsx +148 -0
- package/apps/www/settings/read-receipts/index.tsx +125 -0
- package/apps/www/settings/signatures/[uid].tsx +167 -0
- package/apps/www/settings/signatures/index.tsx +85 -0
- package/apps/www/settings/signatures/new/index.tsx +129 -0
- package/apps/www/settings/signatures/signatureDefaults.ts +36 -0
- package/apps/www/tasks/index.tsx +530 -0
- package/dist/apps/admin/_404.js +4 -0
- package/dist/apps/admin/_500.js +4 -0
- package/dist/apps/admin/_layout.js +10 -0
- package/dist/apps/admin/audit-log/index.js +66 -0
- package/dist/apps/admin/branding/index.js +126 -0
- package/dist/apps/admin/distribution-lists/[uid].js +34 -0
- package/dist/apps/admin/distribution-lists/index.js +31 -0
- package/dist/apps/admin/distribution-lists/new/index.js +51 -0
- package/dist/apps/admin/domains/[uid].js +102 -0
- package/dist/apps/admin/domains/index.js +31 -0
- package/dist/apps/admin/domains/new/index.js +41 -0
- package/dist/apps/admin/index.js +32 -0
- package/dist/apps/admin/ingest-queue/index.js +48 -0
- package/dist/apps/admin/mailboxes/[uid].js +59 -0
- package/dist/apps/admin/mailboxes/new/index.js +93 -0
- package/dist/apps/admin/quarantine/index.js +66 -0
- package/dist/apps/admin/transport-rules/[uid].js +87 -0
- package/dist/apps/admin/transport-rules/_transportRuleConfig.js +37 -0
- package/dist/apps/admin/transport-rules/index.js +32 -0
- package/dist/apps/admin/transport-rules/new/index.js +50 -0
- package/dist/apps/shared/components/admin/distributionLists/MemberListCard.js +64 -0
- package/dist/apps/shared/components/admin/layout/AdminShell.js +94 -0
- package/dist/apps/shared/components/admin/mailboxes/MailboxTable.js +16 -0
- package/dist/apps/shared/components/admin/mailboxes/ResourceSettingsCard.js +59 -0
- package/dist/apps/shared/components/admin/mailboxes/ShareAccessCard.js +67 -0
- package/dist/apps/shared/components/booking/AvailabilityEditor.js +45 -0
- package/dist/apps/shared/components/calendar/CalendarListSidebar.js +44 -0
- package/dist/apps/shared/components/calendar/EventModal.js +167 -0
- package/dist/apps/shared/components/calendar/MonthView.js +38 -0
- package/dist/apps/shared/components/calendar/RecurrenceEditor.js +55 -0
- package/dist/apps/shared/components/calendar/ResourcePicker.js +36 -0
- package/dist/apps/shared/components/calendar/SplitDayView.js +44 -0
- package/dist/apps/shared/components/calendar/TimeGridView.js +58 -0
- package/dist/apps/shared/components/calendar/layout/CalendarShell.js +96 -0
- package/dist/apps/shared/components/contacts/ContactDetailPane.js +11 -0
- package/dist/apps/shared/components/contacts/ContactForm.js +85 -0
- package/dist/apps/shared/components/contacts/ContactsSidebar.js +105 -0
- package/dist/apps/shared/components/contacts/ContactsToolbar.js +32 -0
- package/dist/apps/shared/components/contacts/layout/ContactsShell.js +93 -0
- package/dist/apps/shared/components/layout/AppShell.js +68 -0
- package/dist/apps/shared/components/layout/BrandingChrome.js +18 -0
- package/dist/apps/shared/components/layout/MailboxProvisioning.js +75 -0
- package/dist/apps/shared/components/layout/UserMenu.js +59 -0
- package/dist/apps/shared/components/mail/ConversationList.js +17 -0
- package/dist/apps/shared/components/mail/ConversationThreadPane.js +112 -0
- package/dist/apps/shared/components/mail/MessageDetailPane.js +153 -0
- package/dist/apps/shared/components/mail/compose/ComposeContext.js +55 -0
- package/dist/apps/shared/components/mail/compose/ComposeToolbar.js +88 -0
- package/dist/apps/shared/components/mail/compose/ComposeWindow.js +261 -0
- package/dist/apps/shared/components/mail/compose/EmojiPicker.js +25 -0
- package/dist/apps/shared/components/mail/compose/GifPicker.js +36 -0
- package/dist/apps/shared/components/mail/compose/RichTextEditor.js +60 -0
- package/dist/apps/shared/components/mail/compose/ScheduleSendPicker.js +33 -0
- package/dist/apps/shared/components/mail/layout/MailShell.js +139 -0
- package/dist/apps/shared/components/rules/RuleBuilder.js +78 -0
- package/dist/apps/shared/components/settings/layout/SettingsShell.js +100 -0
- package/dist/apps/shared/components/tasks/TasksSidebar.js +81 -0
- package/dist/apps/shared/components/tasks/TasksToolbar.js +15 -0
- package/dist/apps/shared/components/tasks/layout/TasksShell.js +92 -0
- package/dist/apps/shared/styles/app.css +265 -0
- package/dist/apps/www/_404.js +4 -0
- package/dist/apps/www/_500.js +4 -0
- package/dist/apps/www/_layout.js +8 -0
- package/dist/apps/www/calendar/index.js +228 -0
- package/dist/apps/www/contacts/[uid].js +62 -0
- package/dist/apps/www/contacts/index.js +262 -0
- package/dist/apps/www/index.js +228 -0
- package/dist/apps/www/messages/[uid].js +47 -0
- package/dist/apps/www/settings/auto-reply/index.js +54 -0
- package/dist/apps/www/settings/booking-types/[uid].js +129 -0
- package/dist/apps/www/settings/booking-types/index.js +29 -0
- package/dist/apps/www/settings/booking-types/new/index.js +86 -0
- package/dist/apps/www/settings/filters/[uid].js +94 -0
- package/dist/apps/www/settings/filters/_mailFilterRuleConfig.js +65 -0
- package/dist/apps/www/settings/filters/index.js +30 -0
- package/dist/apps/www/settings/filters/new/index.js +61 -0
- package/dist/apps/www/settings/focused-inbox/index.js +69 -0
- package/dist/apps/www/settings/read-receipts/index.js +51 -0
- package/dist/apps/www/settings/signatures/[uid].js +96 -0
- package/dist/apps/www/settings/signatures/index.js +34 -0
- package/dist/apps/www/settings/signatures/new/index.js +63 -0
- package/dist/apps/www/settings/signatures/signatureDefaults.js +30 -0
- package/dist/apps/www/tasks/index.js +280 -0
- package/package.json +87 -0
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* RapidMX mail-server UI — Tailwind entry point.
|
|
3
|
+
*
|
|
4
|
+
* Design tokens are still defined as plain CSS custom properties (ported from auth-server's
|
|
5
|
+
* `public/styles/globals.css`, itself from rapidrest.dev's Infima-based cyan/gold palette) rather than
|
|
6
|
+
* inside the `@theme` block directly, so the existing `prefers-color-scheme`/`[data-theme]` dark-mode
|
|
7
|
+
* mechanism keeps working exactly as before. The `@theme` block below just aliases Tailwind's own color/
|
|
8
|
+
* radius/shadow/font tokens to these variables, so `bg-primary`, `text-muted`, `rounded-md`, `shadow-card`,
|
|
9
|
+
* etc. resolve through the same live-swappable custom properties instead of static values.
|
|
10
|
+
*/
|
|
11
|
+
@import "tailwindcss";
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
* Tailwind v4's automatic content scanning excludes `node_modules` by default, which is exactly where
|
|
15
|
+
* `@rapidmx/react-shared`'s components live from every consumer's perspective (a `link:`-ed sibling) -
|
|
16
|
+
* without this, none of its Tailwind classnames (Modal/Drawer/Button/Alert/Skeleton/FormField/
|
|
17
|
+
* PopoverPortal/ContactAvatar/MiniDatePicker/BottomTabBar) would ever be scanned.
|
|
18
|
+
*/
|
|
19
|
+
@source "../../node_modules/@rapidmx/react-shared/src";
|
|
20
|
+
|
|
21
|
+
/*
|
|
22
|
+
* `server`'s own build (unlike `electron-client`, which already explicitly sourced this same tree in
|
|
23
|
+
* its own `styles.css`) has no explicit `@source` for this package's *own* `apps/**` tree at all,
|
|
24
|
+
* relying entirely on Tailwind's "automatic" module-graph-based detection - confirmed empirically to
|
|
25
|
+
* be incomplete here: `server`'s `vite.config.ts` (`@rapidrest/react`'s `createViteConfig`) builds one
|
|
26
|
+
* independent Rollup entry per page (dozens of them, one per `www`/`admin` route), and Tailwind's
|
|
27
|
+
* per-css-module content scan only picked up classnames from whichever ONE chunk's reachable graph
|
|
28
|
+
* `app.css` first got attached to - e.g. every `admin`-only utility (`justify-between`, `px-6`,
|
|
29
|
+
* `max-w-md`, ...) used by `AdminShell.tsx` (which has its own, separate `import "./app.css"`) was
|
|
30
|
+
* silently absent from the built stylesheet, even though `AdminShell.tsx` itself was very much in the
|
|
31
|
+
* bundle - verified directly by diffing every classname `AdminShell.tsx` uses against the actual built
|
|
32
|
+
* CSS. An explicit `@source` here makes the scan independent of Vite's per-entry chunking, the same
|
|
33
|
+
* fix this file already applies to `react-shared`, just for this package's own source too.
|
|
34
|
+
*/
|
|
35
|
+
@source "../../";
|
|
36
|
+
|
|
37
|
+
/*
|
|
38
|
+
* Self-hosted display typeface — the four weights shipped in `public/fonts/`. Matches the
|
|
39
|
+
* Book/Medium/Bold/Heavy naming + 400/500/700/800 weight mapping from the brand style guide
|
|
40
|
+
* (https://powerlevel.gg/style-guide/): Blender Pro is for headings/display/short UI labels only —
|
|
41
|
+
* never long-form body copy, which stays on `--font-sans` (Inter) below.
|
|
42
|
+
*/
|
|
43
|
+
@font-face {
|
|
44
|
+
font-family: "Blender Pro";
|
|
45
|
+
src: url("/fonts/Blender-Pro-Book.ttf") format("truetype");
|
|
46
|
+
font-weight: 400;
|
|
47
|
+
font-style: normal;
|
|
48
|
+
font-display: swap;
|
|
49
|
+
}
|
|
50
|
+
@font-face {
|
|
51
|
+
font-family: "Blender Pro";
|
|
52
|
+
src: url("/fonts/Blender-Pro-Medium.ttf") format("truetype");
|
|
53
|
+
font-weight: 500;
|
|
54
|
+
font-style: normal;
|
|
55
|
+
font-display: swap;
|
|
56
|
+
}
|
|
57
|
+
@font-face {
|
|
58
|
+
font-family: "Blender Pro";
|
|
59
|
+
src: url("/fonts/Blender-Pro-Bold.ttf") format("truetype");
|
|
60
|
+
font-weight: 700;
|
|
61
|
+
font-style: normal;
|
|
62
|
+
font-display: swap;
|
|
63
|
+
}
|
|
64
|
+
@font-face {
|
|
65
|
+
font-family: "Blender Pro";
|
|
66
|
+
src: url("/fonts/Blender-Pro-Heavy.ttf") format("truetype");
|
|
67
|
+
font-weight: 800;
|
|
68
|
+
font-style: normal;
|
|
69
|
+
font-display: swap;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
:root {
|
|
73
|
+
/* Teal — the primary structural/brand color (nav, links, active states, focus rings), sampled
|
|
74
|
+
* from the new logo's glass-cube color. Same 7-step shape the old cyan scale used (600/700/800/
|
|
75
|
+
* 900/500/400/300), just re-hued. */
|
|
76
|
+
--rr-color-primary: #0d9488;
|
|
77
|
+
--rr-color-primary-dark: #0f766e;
|
|
78
|
+
--rr-color-primary-darker: #115e59;
|
|
79
|
+
--rr-color-primary-darkest: #134e4a;
|
|
80
|
+
--rr-color-primary-light: #14b8a6;
|
|
81
|
+
--rr-color-primary-lighter: #2dd4bf;
|
|
82
|
+
--rr-color-primary-lightest: #5eead4;
|
|
83
|
+
|
|
84
|
+
/* Gold — the action/highlight color (primary buttons, hover accents), sampled from the new
|
|
85
|
+
* logo's envelope. Values taken directly from the brand style guide's gold palette
|
|
86
|
+
* (https://powerlevel.gg/style-guide/), which is already vetted for WCAG AA contrast. */
|
|
87
|
+
--rr-color-accent: #a3690a;
|
|
88
|
+
--rr-color-accent-dark: #7a4e08;
|
|
89
|
+
--rr-color-accent-soft: #c98a1d;
|
|
90
|
+
--rr-color-accent-pale: #fbe9c2;
|
|
91
|
+
--rr-color-text-on-accent: #1c2526;
|
|
92
|
+
|
|
93
|
+
--rr-color-danger: #dc2626;
|
|
94
|
+
--rr-color-danger-bg: #fef2f2;
|
|
95
|
+
--rr-color-success: #16a34a;
|
|
96
|
+
--rr-color-warning: #f0b429;
|
|
97
|
+
--rr-color-warning-contrast: #1c2526;
|
|
98
|
+
|
|
99
|
+
--rr-color-bg: #ffffff;
|
|
100
|
+
--rr-color-surface: #ffffff;
|
|
101
|
+
--rr-color-surface-alt: #f5f7f8;
|
|
102
|
+
--rr-color-border: #e3e8ea;
|
|
103
|
+
--rr-color-text: #1c2526;
|
|
104
|
+
--rr-color-text-muted: #5a6b6e;
|
|
105
|
+
--rr-color-text-on-primary: #ffffff;
|
|
106
|
+
|
|
107
|
+
--rr-radius-sm: 0.4rem;
|
|
108
|
+
--rr-radius-md: 0.8rem;
|
|
109
|
+
--rr-radius-lg: 1rem;
|
|
110
|
+
--rr-radius-pill: 999px;
|
|
111
|
+
|
|
112
|
+
--rr-shadow-lw: 0 1px 2px 0 rgba(0, 0, 0, 0.1);
|
|
113
|
+
--rr-shadow-md: 0 5px 40px rgba(0, 0, 0, 0.12);
|
|
114
|
+
|
|
115
|
+
/* Inter (loaded via Google Fonts in each app's `_layout.tsx`) is body copy's typeface per the
|
|
116
|
+
* style guide; `--rr-font-display` (Blender Pro) is applied separately, to headings/short UI
|
|
117
|
+
* labels only — see the global `h1`-`h6` rule near the bottom of this file. */
|
|
118
|
+
--rr-font-family: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, Ubuntu, Cantarell, "Noto Sans",
|
|
119
|
+
sans-serif, BlinkMacSystemFont;
|
|
120
|
+
--rr-font-display: "Blender Pro", var(--rr-font-family);
|
|
121
|
+
|
|
122
|
+
color-scheme: light;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
@media (prefers-color-scheme: dark) {
|
|
126
|
+
:root:not([data-theme="light"]) {
|
|
127
|
+
--rr-color-primary: #2dd4bf;
|
|
128
|
+
--rr-color-primary-dark: #14b8a6;
|
|
129
|
+
--rr-color-primary-darker: #0d9488;
|
|
130
|
+
--rr-color-primary-darkest: #0f766e;
|
|
131
|
+
--rr-color-primary-light: #5eead4;
|
|
132
|
+
--rr-color-primary-lighter: #99f6e4;
|
|
133
|
+
--rr-color-primary-lightest: #ccfbf1;
|
|
134
|
+
|
|
135
|
+
--rr-color-accent: #f2af0d;
|
|
136
|
+
--rr-color-accent-dark: #c98a0a;
|
|
137
|
+
--rr-color-accent-soft: #f6ca5f;
|
|
138
|
+
--rr-color-accent-pale: #fce9ba;
|
|
139
|
+
--rr-color-text-on-accent: #1c2526;
|
|
140
|
+
|
|
141
|
+
--rr-color-danger: #f87171;
|
|
142
|
+
--rr-color-danger-bg: #3f1d1d;
|
|
143
|
+
--rr-color-success: #4ade80;
|
|
144
|
+
--rr-color-warning: #fbbf24;
|
|
145
|
+
--rr-color-warning-contrast: #1c2526;
|
|
146
|
+
|
|
147
|
+
--rr-color-bg: #14181a;
|
|
148
|
+
--rr-color-surface: #1b2022;
|
|
149
|
+
--rr-color-surface-alt: #20262a;
|
|
150
|
+
--rr-color-border: #313a3d;
|
|
151
|
+
--rr-color-text: #eef2f3;
|
|
152
|
+
--rr-color-text-muted: #9fb0b3;
|
|
153
|
+
--rr-color-text-on-primary: #0b1416;
|
|
154
|
+
|
|
155
|
+
color-scheme: dark;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
:root[data-theme="dark"] {
|
|
160
|
+
--rr-color-primary: #2dd4bf;
|
|
161
|
+
--rr-color-primary-dark: #14b8a6;
|
|
162
|
+
--rr-color-primary-darker: #0d9488;
|
|
163
|
+
--rr-color-primary-darkest: #0f766e;
|
|
164
|
+
--rr-color-primary-light: #5eead4;
|
|
165
|
+
--rr-color-primary-lighter: #99f6e4;
|
|
166
|
+
--rr-color-primary-lightest: #ccfbf1;
|
|
167
|
+
|
|
168
|
+
--rr-color-accent: #f2af0d;
|
|
169
|
+
--rr-color-accent-dark: #c98a0a;
|
|
170
|
+
--rr-color-accent-soft: #f6ca5f;
|
|
171
|
+
--rr-color-accent-pale: #fce9ba;
|
|
172
|
+
--rr-color-text-on-accent: #1c2526;
|
|
173
|
+
|
|
174
|
+
--rr-color-danger: #f87171;
|
|
175
|
+
--rr-color-danger-bg: #3f1d1d;
|
|
176
|
+
--rr-color-success: #4ade80;
|
|
177
|
+
--rr-color-warning: #fbbf24;
|
|
178
|
+
--rr-color-warning-contrast: #1c2526;
|
|
179
|
+
|
|
180
|
+
--rr-color-bg: #14181a;
|
|
181
|
+
--rr-color-surface: #1b2022;
|
|
182
|
+
--rr-color-surface-alt: #20262a;
|
|
183
|
+
--rr-color-border: #313a3d;
|
|
184
|
+
--rr-color-text: #eef2f3;
|
|
185
|
+
--rr-color-text-muted: #9fb0b3;
|
|
186
|
+
--rr-color-text-on-primary: #0b1416;
|
|
187
|
+
|
|
188
|
+
color-scheme: dark;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
@theme {
|
|
192
|
+
--color-primary: var(--rr-color-primary);
|
|
193
|
+
--color-primary-dark: var(--rr-color-primary-dark);
|
|
194
|
+
--color-primary-darker: var(--rr-color-primary-darker);
|
|
195
|
+
--color-primary-darkest: var(--rr-color-primary-darkest);
|
|
196
|
+
--color-primary-light: var(--rr-color-primary-light);
|
|
197
|
+
--color-primary-lighter: var(--rr-color-primary-lighter);
|
|
198
|
+
--color-primary-lightest: var(--rr-color-primary-lightest);
|
|
199
|
+
--color-accent: var(--rr-color-accent);
|
|
200
|
+
--color-accent-dark: var(--rr-color-accent-dark);
|
|
201
|
+
--color-accent-soft: var(--rr-color-accent-soft);
|
|
202
|
+
--color-accent-pale: var(--rr-color-accent-pale);
|
|
203
|
+
--color-text-on-accent: var(--rr-color-text-on-accent);
|
|
204
|
+
|
|
205
|
+
--color-danger: var(--rr-color-danger);
|
|
206
|
+
--color-danger-bg: var(--rr-color-danger-bg);
|
|
207
|
+
--color-success: var(--rr-color-success);
|
|
208
|
+
--color-warning: var(--rr-color-warning);
|
|
209
|
+
--color-warning-contrast: var(--rr-color-warning-contrast);
|
|
210
|
+
|
|
211
|
+
--color-bg: var(--rr-color-bg);
|
|
212
|
+
--color-surface: var(--rr-color-surface);
|
|
213
|
+
--color-surface-alt: var(--rr-color-surface-alt);
|
|
214
|
+
--color-border: var(--rr-color-border);
|
|
215
|
+
--color-text: var(--rr-color-text);
|
|
216
|
+
--color-text-muted: var(--rr-color-text-muted);
|
|
217
|
+
--color-text-on-primary: var(--rr-color-text-on-primary);
|
|
218
|
+
|
|
219
|
+
--radius-sm: var(--rr-radius-sm);
|
|
220
|
+
--radius-md: var(--rr-radius-md);
|
|
221
|
+
--radius-lg: var(--rr-radius-lg);
|
|
222
|
+
--radius-pill: var(--rr-radius-pill);
|
|
223
|
+
|
|
224
|
+
--shadow-card: var(--rr-shadow-lw);
|
|
225
|
+
--shadow-modal: var(--rr-shadow-md);
|
|
226
|
+
|
|
227
|
+
--font-sans: var(--rr-font-family);
|
|
228
|
+
--font-display: var(--rr-font-display);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
*,
|
|
232
|
+
*::before,
|
|
233
|
+
*::after {
|
|
234
|
+
box-sizing: border-box;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
html,
|
|
238
|
+
body {
|
|
239
|
+
margin: 0;
|
|
240
|
+
padding: 0;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
body {
|
|
244
|
+
font-family: var(--rr-font-family);
|
|
245
|
+
background: var(--rr-color-bg);
|
|
246
|
+
color: var(--rr-color-text);
|
|
247
|
+
line-height: 1.5;
|
|
248
|
+
-webkit-font-smoothing: antialiased;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/* Blender Pro is the brand's display typeface (see the style guide linked at the top of this file) —
|
|
252
|
+
* applied to every heading regardless of its content, since a font swap alone never hurts even
|
|
253
|
+
* dynamic content (a contact's name, an email subject). Uppercase/wide-tracking treatment is
|
|
254
|
+
* deliberately NOT applied blanket here — it reads fine on short, static UI chrome ("Mailboxes",
|
|
255
|
+
* "Tasks") but turns a real name or subject line into shouty all-caps, so that's opted into per
|
|
256
|
+
* element instead (`uppercase tracking-wide`), matching the style guide's own body-text warning
|
|
257
|
+
* ("Blender Pro set in long paragraphs reads as shouting") applied to short user content too. */
|
|
258
|
+
h1,
|
|
259
|
+
h2,
|
|
260
|
+
h3,
|
|
261
|
+
h4,
|
|
262
|
+
h5,
|
|
263
|
+
h6 {
|
|
264
|
+
font-family: var(--rr-font-display);
|
|
265
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
+
import React from "react";
|
|
6
|
+
|
|
7
|
+
export default function NotFoundPage() {
|
|
8
|
+
return <p>Page not found</p>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
+
import React from "react";
|
|
6
|
+
|
|
7
|
+
export default function ErrorPage() {
|
|
8
|
+
return <p>Internal server error</p>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
+
import React, { PropsWithChildren } from "react";
|
|
6
|
+
import { Branding } from "@rapidmx/react-shared/branding/brandingApi.js";
|
|
7
|
+
import { CUSTOM_STYLESHEET_LINK_ID } from "@rapidmx/react-shared/branding/useBranding.js";
|
|
8
|
+
|
|
9
|
+
export interface LayoutProps {
|
|
10
|
+
/**
|
|
11
|
+
* Supplied by `WwwRoute`'s `fetchProps()` override (`src/mongo/routes/wwwRoute.ts`/
|
|
12
|
+
* `src/sql/routes/wwwRoute.ts`) - `@rapidrest/react` spreads the same merged page props onto this
|
|
13
|
+
* layout as onto the page it wraps, so it renders correctly server-side on the very first byte of the
|
|
14
|
+
* response: no client-side flash from the stock defaults below, and a crawler reading the raw HTML
|
|
15
|
+
* sees the real branding too. `undefined` only on the framework's unwrapped `_500` fallback path,
|
|
16
|
+
* which doesn't receive props at all - falling back to the stock defaults there is acceptable.
|
|
17
|
+
*/
|
|
18
|
+
branding?: Branding;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export default function Layout({ children, branding }: PropsWithChildren<LayoutProps>) {
|
|
22
|
+
const title = branding?.title || branding?.companyName ? `${branding?.title || branding?.companyName}: Mail` : "RapidMX: Mail";
|
|
23
|
+
const iconHref = branding?.iconUrl || branding?.logoUrl || "/images/logo.svg";
|
|
24
|
+
const stylesheetHref = branding?.stylesheetUrl;
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<html lang="en">
|
|
28
|
+
<head>
|
|
29
|
+
<meta charSet="utf-8" />
|
|
30
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
31
|
+
<title>{title}</title>
|
|
32
|
+
<link rel="icon" type="image/svg+xml" href={iconHref} />
|
|
33
|
+
<link rel="alternate icon" href="/favicon.ico" />
|
|
34
|
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
35
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin="anonymous" />
|
|
36
|
+
<link
|
|
37
|
+
rel="stylesheet"
|
|
38
|
+
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap"
|
|
39
|
+
/>
|
|
40
|
+
{stylesheetHref && <link rel="stylesheet" href={stylesheetHref} id={CUSTOM_STYLESHEET_LINK_ID} />}
|
|
41
|
+
</head>
|
|
42
|
+
<body>{children}</body>
|
|
43
|
+
</html>
|
|
44
|
+
);
|
|
45
|
+
}
|