The scaffold had the brand right and nothing behind it: the login was a 600ms setTimeout with a TODO, and three pieces of the frontgen deploy contract were missing. - Sign in against POST /usr/login (org_id as a STRING — a number is rejected by the gateway) with the session in a provider; surface the gateway's own message rather than a generic "invalid credentials", because a wrong password and a user without access to this app look identical from here and are not. - Runtime config: the API URL is read from the config.js the server writes at placement, never compiled in, and requireConfigValue throws so a build with no config.js fails loudly instead of calling whichever backend built it. - base: './' plus a router basename taken from <base href>, so one build serves any mount path. - Move the fonts and logo from public/ into src/assets/ — Vite rewrites bundled asset URLs to be relative, while a public/ file referenced as "/fonts/..." stays absolute and 404s under the /zurich-kotak/ mount. - API client for recordview / detailview / form-screens / start / activity, and the pipeline shell whose sidebar is the state machine in the order a lead moves. Queue and lead-file data wait on the record and detail views. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
75 lines
1.5 KiB
CSS
75 lines
1.5 KiB
CSS
/* ── Zurich Kotak brand typeface ───────────────────────────── */
|
|
@font-face {
|
|
font-family: 'Zurich Sans';
|
|
src: url('./assets/fonts/ZurichSans-Light.otf') format('opentype');
|
|
font-weight: 300;
|
|
font-style: normal;
|
|
font-display: swap;
|
|
}
|
|
@font-face {
|
|
font-family: 'Zurich Sans';
|
|
src: url('./assets/fonts/ZurichSans-Regular.otf') format('opentype');
|
|
font-weight: 400;
|
|
font-style: normal;
|
|
font-display: swap;
|
|
}
|
|
@font-face {
|
|
font-family: 'Zurich Sans';
|
|
src: url('./assets/fonts/ZurichSans-Medium.otf') format('opentype');
|
|
font-weight: 500;
|
|
font-style: normal;
|
|
font-display: swap;
|
|
}
|
|
|
|
:root {
|
|
/* Brand palette lifted from zurichkotak.com */
|
|
--zk-blue: #2167ae;
|
|
--zk-blue-dark: #1a5490;
|
|
--zk-blue-deep: #1a528b;
|
|
--zk-navy: #23366f;
|
|
--zk-blue-mid: #5495cf;
|
|
--zk-blue-light: #91bfe3;
|
|
--zk-cyan: #c7ebf9;
|
|
|
|
--zk-ink: #2b2e31;
|
|
--zk-muted: #5d6162;
|
|
--zk-grey: #a6adaf;
|
|
--zk-line: #dde4e3;
|
|
--zk-line-soft: #eceeef;
|
|
--zk-tint: #f4f9fc;
|
|
--zk-tint-blue: #ebf3fb;
|
|
--zk-white: #fff;
|
|
--zk-danger: #d32f2f;
|
|
|
|
--font-zurich: 'Zurich Sans', Arial, Helvetica, sans-serif;
|
|
|
|
font-family: var(--font-zurich);
|
|
font-size: 16px;
|
|
line-height: 1.5;
|
|
color: var(--zk-ink);
|
|
background: var(--zk-white);
|
|
-webkit-font-smoothing: antialiased;
|
|
-moz-osx-font-smoothing: grayscale;
|
|
text-rendering: optimizeLegibility;
|
|
}
|
|
|
|
* {
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
html,
|
|
body,
|
|
#root {
|
|
height: 100%;
|
|
}
|
|
|
|
body {
|
|
margin: 0;
|
|
}
|
|
|
|
button,
|
|
input {
|
|
font: inherit;
|
|
color: inherit;
|
|
}
|