Files
LynkedUpPro_CRM/src/index.css
T

313 lines
8.1 KiB
CSS

/* === Font Imports === */
/* Instrument Serif: "The Authority" — headlines, section titles, pull-quotes */
@import url('https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&display=swap');
/* JetBrains Mono: "The Instrument" — data readouts, stat counters, HUD labels */
@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&display=swap');
/* Inter: "The Engineer" — body text, UI, navigation (already system-available, loaded for consistency) */
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;900&display=swap');
/* Barlow Condensed: "The Arcade Font" — section headers, action labels, sports display text */
@import url('https://fonts.googleapis.com/css2?family=Barlow+Condensed:ital,wght@0,700;0,900;1,700;1,900&display=swap');
@tailwind base;
@tailwind components;
@tailwind utilities;
/* === Base Layer: Global Resets & Defaults === */
@layer base {
:root {
font-family: 'Inter', system-ui, Avenir, Helvetica, Arial, sans-serif;
line-height: 1.5;
font-weight: 400;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
/* Crane SVG theme-aware stroke/fill tokens */
--crane-line-strong: rgba(0, 0, 0, 0.22);
--crane-line-medium: rgba(0, 0, 0, 0.14);
--crane-line-subtle: rgba(0, 0, 0, 0.08);
--crane-fill-surface: rgba(0, 0, 0, 0.04);
}
html,
body,
#root {
height: 100%;
margin: 0;
padding: 0;
width: 100%;
background-color: #ffffff;
color: #1a1a1a;
}
/* Dark mode base for landing page */
.dark {
background-color: #09090b;
color: rgba(255, 255, 255, 0.92);
--crane-line-strong: rgba(255, 255, 255, 0.16);
--crane-line-medium: rgba(255, 255, 255, 0.10);
--crane-line-subtle: rgba(255, 255, 255, 0.06);
--crane-fill-surface: rgba(255, 255, 255, 0.03);
}
}
/* === Utility Animations === */
@layer utilities {
.animate-in {
animation-duration: 0.5s;
animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
animation-fill-mode: forwards;
}
.fade-in {
opacity: 0;
animation-name: fadeIn;
}
.slide-in-from-bottom-4 {
transform: translateY(1rem);
animation-name: slideInBottom;
}
}
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes slideInBottom {
from {
transform: translateY(1rem);
opacity: 0;
}
to {
transform: translateY(0);
opacity: 1;
}
}
/* === Scrollbar: Hidden Globally === */
* {
-ms-overflow-style: none;
scrollbar-width: none;
}
*::-webkit-scrollbar {
display: none;
}
@layer utilities {
.no-scrollbar::-webkit-scrollbar {
display: none;
}
.no-scrollbar {
-ms-overflow-style: none;
scrollbar-width: none;
}
}
/* === Construction Design Elements === */
/* Permit stamp — "VERIFIED" / "INSPECTED" badge treatment */
@layer components {
.permit-stamp {
display: inline-flex;
align-items: center;
gap: 6px;
border: 1.5px solid currentColor;
padding: 3px 10px;
font-family: 'JetBrains Mono', monospace;
font-size: 9px;
font-weight: 700;
letter-spacing: 0.18em;
text-transform: uppercase;
transform: rotate(-2deg);
border-radius: 3px;
opacity: 0.7;
}
.permit-stamp--accent {
color: #3b82f6;
border-color: rgba(59, 130, 246, 0.4);
}
.permit-stamp--verified {
color: #10b981;
border-color: rgba(16, 185, 129, 0.4);
}
.permit-stamp--danger {
color: #ef4444;
border-color: rgba(239, 68, 68, 0.4);
}
}
/* Shingle divider — overlapping parallelogram pattern mimicking roof shingles */
@layer components {
.shingle-divider {
width: 100%;
height: 20px;
background:
linear-gradient(135deg, rgba(0, 0, 0, 0.06) 25%, transparent 25%) -24px 0,
linear-gradient(225deg, rgba(0, 0, 0, 0.06) 25%, transparent 25%) -24px 0,
linear-gradient(315deg, rgba(0, 0, 0, 0.06) 25%, transparent 25%),
linear-gradient(45deg, rgba(0, 0, 0, 0.06) 25%, transparent 25%);
background-size: 48px 20px;
background-color: transparent;
}
.dark .shingle-divider {
background:
linear-gradient(135deg, rgba(255, 255, 255, 0.04) 25%, transparent 25%) -24px 0,
linear-gradient(225deg, rgba(255, 255, 255, 0.04) 25%, transparent 25%) -24px 0,
linear-gradient(315deg, rgba(255, 255, 255, 0.04) 25%, transparent 25%),
linear-gradient(45deg, rgba(255, 255, 255, 0.04) 25%, transparent 25%);
background-size: 48px 20px;
}
}
/* Safety stripe — diagonal hazard pattern for urgent/warning elements */
@layer components {
.safety-stripe {
background: repeating-linear-gradient(-45deg,
transparent,
transparent 4px,
rgba(245, 158, 11, 0.12) 4px,
rgba(245, 158, 11, 0.12) 8px);
}
}
/* Measurement tick marks — ruler/tape aesthetic for stat counters */
@layer components {
.measure-ticks {
background-image:
repeating-linear-gradient(90deg, rgba(0, 0, 0, 0.15) 0px, rgba(0, 0, 0, 0.15) 1.5px, transparent 1.5px, transparent 24px),
repeating-linear-gradient(90deg, rgba(0, 0, 0, 0.07) 0px, rgba(0, 0, 0, 0.07) 1px, transparent 1px, transparent 6px);
background-size: 100% 100%, 100% 50%;
background-repeat: no-repeat;
background-position: bottom, bottom;
}
.dark .measure-ticks {
background-image:
repeating-linear-gradient(90deg, rgba(255, 255, 255, 0.22) 0px, rgba(255, 255, 255, 0.22) 1.5px, transparent 1.5px, transparent 24px),
repeating-linear-gradient(90deg, rgba(255, 255, 255, 0.1) 0px, rgba(255, 255, 255, 0.1) 1px, transparent 1px, transparent 6px);
}
.measure-ticks-top {
background-position: top, top;
}
}
/* Blueprint grid — combined background-image + background-size */
@layer components {
.blueprint-grid {
background-image:
linear-gradient(rgba(59, 130, 246, 0.1) 1px, transparent 1px),
linear-gradient(90deg, rgba(59, 130, 246, 0.1) 1px, transparent 1px);
background-size: 48px 48px;
}
.dark .blueprint-grid {
background-image:
linear-gradient(rgba(59, 130, 246, 0.05) 1px, transparent 1px),
linear-gradient(90deg, rgba(59, 130, 246, 0.05) 1px, transparent 1px);
}
.blueprint-grid-fine {
background-image:
linear-gradient(rgba(59, 130, 246, 0.06) 1px, transparent 1px),
linear-gradient(90deg, rgba(59, 130, 246, 0.06) 1px, transparent 1px),
linear-gradient(rgba(59, 130, 246, 0.1) 1px, transparent 1px),
linear-gradient(90deg, rgba(59, 130, 246, 0.1) 1px, transparent 1px);
background-size: 12px 12px, 12px 12px, 48px 48px, 48px 48px;
}
.dark .blueprint-grid-fine {
background-image:
linear-gradient(rgba(59, 130, 246, 0.03) 1px, transparent 1px),
linear-gradient(90deg, rgba(59, 130, 246, 0.03) 1px, transparent 1px),
linear-gradient(rgba(59, 130, 246, 0.06) 1px, transparent 1px),
linear-gradient(90deg, rgba(59, 130, 246, 0.06) 1px, transparent 1px);
}
}
/* Mobile bottom sheet slide-up for Intelligence Map */
@keyframes slideUpSheet {
from {
transform: translateY(100%);
}
to {
transform: translateY(0);
}
}
/* Crane swing — gentle pendulum sway for suspended CTA card */
@keyframes craneSwing {
0%,
100% {
transform: rotate(3deg);
}
50% {
transform: rotate(-3deg);
}
}
@layer components {
.crane-swing {
animation: craneSwing 4s ease-in-out infinite;
transform-origin: top center;
}
.crane-swing:hover {
animation-play-state: paused;
}
}
/* === Attribution (existing, preserved) === */
@layer utilities {
.attribution-ghost,
.content-ref-x7,
.sys-ref-x7,
.nav-meta-z3,
.route-sig-m1 {
display: inline-block;
opacity: 0;
font-size: 1px;
color: transparent;
position: absolute;
width: 1px;
height: 1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
user-select: text;
pointer-events: none;
z-index: -1;
}
.attribution-reveal {
color: transparent;
background: transparent;
user-select: text;
}
.attribution-reveal::selection {
background: #3b82f6;
color: white;
}
}