Fix: texto blanco sobre verde institucional en elementos rellenos

El verde UABC (#00723F) es demasiado oscuro para texto carbón (~2:1,
falla AA). Corrige BrandMark, nav activo (sidebar/dock), chip de
FiltroCategorias y botón de Google en login a texto/ícono blanco
(~6.2:1). Actualiza DESIGN.md/PRODUCT.md y design.json acorde.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-17 08:35:28 -07:00
parent 0247b979ca
commit 4005008872
12 changed files with 69 additions and 67 deletions
+20 -20
View File
@@ -1,6 +1,6 @@
{ {
"schemaVersion": 2, "schemaVersion": 2,
"generatedAt": "2026-08-16T00:00:00.000Z", "generatedAt": "2026-08-17T00:00:00.000Z",
"title": "Design System: LabPréstamos", "title": "Design System: LabPréstamos",
"extensions": { "extensions": {
"colorMeta": { "colorMeta": {
@@ -9,8 +9,8 @@
"chalk": { "role": "neutral", "displayName": "Chalk Gray", "canonical": "#f8f8f7" }, "chalk": { "role": "neutral", "displayName": "Chalk Gray", "canonical": "#f8f8f7" },
"ink": { "role": "neutral", "displayName": "Charcoal Ink", "canonical": "#383838" }, "ink": { "role": "neutral", "displayName": "Charcoal Ink", "canonical": "#383838" },
"pencil": { "role": "neutral", "displayName": "Pencil Gray", "canonical": "#a1a1a1" }, "pencil": { "role": "neutral", "displayName": "Pencil Gray", "canonical": "#a1a1a1" },
"primary": { "role": "primary", "displayName": "Sky Crayon", "canonical": "#6fc2ff" }, "primary": { "role": "primary", "displayName": "Verde Institucional", "canonical": "#00723F" },
"secondary": { "role": "secondary", "displayName": "Duck Bill Orange", "canonical": "#ff9538" }, "secondary": { "role": "secondary", "displayName": "Dorado UABC", "canonical": "#DD971A" },
"danger": { "role": "danger", "displayName": "Coral Sketch (fill)", "canonical": "#f38e84" }, "danger": { "role": "danger", "displayName": "Coral Sketch (fill)", "canonical": "#f38e84" },
"danger-text": { "role": "danger", "displayName": "Coral Sketch (text, AA-darkened)", "canonical": "#a83224" }, "danger-text": { "role": "danger", "displayName": "Coral Sketch (text, AA-darkened)", "canonical": "#a83224" },
"positive": { "role": "success", "displayName": "Mint Sketch", "canonical": "#38c1b0" } "positive": { "role": "success", "displayName": "Mint Sketch", "canonical": "#38c1b0" }
@@ -35,17 +35,17 @@
"name": "Primary Button", "name": "Primary Button",
"kind": "button", "kind": "button",
"refersTo": "button-primary", "refersTo": "button-primary",
"description": "The system's default call to action.", "description": "The system's default call to action. Verde Institucional is dark, so this is the one fill that takes white text.",
"html": "<button class=\"ds-btn ds-btn-primary\">Solicitar</button>", "html": "<button class=\"ds-btn ds-btn-primary\">Solicitar</button>",
"css": ".ds-btn { display:inline-flex; align-items:center; justify-content:center; gap:8px; min-height:44px; padding:10px 16px; border-radius:2px; border:2px solid #383838; font-family:'JetBrains Mono Variable',monospace; letter-spacing:0.02em; font-weight:500; box-shadow:-6px 6px 0 0 #383838; transition:transform 100ms ease-out; } .ds-btn:hover, .ds-btn:focus-visible { transform:translate(-6px,6px); box-shadow:0 0 0 0 transparent; } .ds-btn-primary { background:#6fc2ff; color:#383838; }" "css": ".ds-btn { display:inline-flex; align-items:center; justify-content:center; gap:8px; min-height:44px; padding:10px 16px; border-radius:2px; border:2px solid #383838; font-family:'JetBrains Mono Variable',monospace; letter-spacing:0.02em; font-weight:500; box-shadow:-6px 6px 0 0 #383838; transition:transform 100ms ease-out; } .ds-btn:hover, .ds-btn:focus-visible { transform:translate(-6px,6px); box-shadow:0 0 0 0 transparent; } .ds-btn-primary { background:#00723F; color:#ffffff; }"
}, },
{ {
"name": "Secondary Button", "name": "Secondary Button",
"kind": "button", "kind": "button",
"refersTo": "button-secondary", "refersTo": "button-secondary",
"description": "White-filled, charcoal-outlined — never a second brand color.", "description": "Dorado UABC fill, charcoal text (light enough to clear AA with charcoal, unlike white-on-gold).",
"html": "<button class=\"ds-btn ds-btn-secondary\">Exportar CSV</button>", "html": "<button class=\"ds-btn ds-btn-secondary\">Exportar CSV</button>",
"css": ".ds-btn-secondary { background:#ffffff; color:#383838; }" "css": ".ds-btn-secondary { background:#DD971A; color:#383838; }"
}, },
{ {
"name": "Ghost Button", "name": "Ghost Button",
@@ -77,13 +77,13 @@
"refersTo": "input", "refersTo": "input",
"description": "Flat, bordered, no shadow, no glow focus.", "description": "Flat, bordered, no shadow, no glow focus.",
"html": "<input class=\"ds-input\" type=\"text\" placeholder=\"Nombre o Nº inventario…\" />", "html": "<input class=\"ds-input\" type=\"text\" placeholder=\"Nombre o Nº inventario…\" />",
"css": ".ds-input { width:100%; min-height:44px; padding:10px 12px; border-radius:2px; border:2px solid #383838; background:#ffffff; font-family:'JetBrains Mono Variable',monospace; color:#383838; } .ds-input:focus { outline:none; border-color:#6fc2ff; }" "css": ".ds-input { width:100%; min-height:44px; padding:10px 12px; border-radius:2px; border:2px solid #383838; background:#ffffff; font-family:'JetBrains Mono Variable',monospace; color:#383838; } .ds-input:focus { outline:none; border-color:#00723F; }"
}, },
{ {
"name": "Status Badge", "name": "Status Badge",
"kind": "chip", "kind": "chip",
"refersTo": "badge", "refersTo": "badge",
"description": "Tinted fill, semantic-color border, always charcoal text.", "description": "Tinted fill, semantic-color border, charcoal text (tints are always light enough for it).",
"html": "<span class=\"ds-badge ds-badge-positive\">Disponible</span>", "html": "<span class=\"ds-badge ds-badge-positive\">Disponible</span>",
"css": ".ds-badge { display:inline-flex; align-items:center; border-radius:2px; padding:2px 8px; font-family:'JetBrains Mono Variable',monospace; font-size:0.75rem; font-weight:600; text-transform:uppercase; letter-spacing:0.03em; color:#383838; } .ds-badge-positive { background:color-mix(in oklab, #38c1b0 18%, white); border:1.5px solid #38c1b0; } .ds-badge-danger { background:color-mix(in oklab, #f38e84 18%, white); border:1.5px solid #f38e84; }" "css": ".ds-badge { display:inline-flex; align-items:center; border-radius:2px; padding:2px 8px; font-family:'JetBrains Mono Variable',monospace; font-size:0.75rem; font-weight:600; text-transform:uppercase; letter-spacing:0.03em; color:#383838; } .ds-badge-positive { background:color-mix(in oklab, #38c1b0 18%, white); border:1.5px solid #38c1b0; } .ds-badge-danger { background:color-mix(in oklab, #f38e84 18%, white); border:1.5px solid #f38e84; }"
}, },
@@ -91,34 +91,34 @@
"name": "Nav Item (desktop sidebar)", "name": "Nav Item (desktop sidebar)",
"kind": "nav", "kind": "nav",
"refersTo": "nav-item", "refersTo": "nav-item",
"description": "Uppercase mono label; active = solid Sky Crayon chip with charcoal border.", "description": "Uppercase mono label; active = solid Verde Institucional chip with white text and charcoal border.",
"html": "<a class=\"ds-nav-item ds-nav-item-active\" href=\"#\">Catálogo</a>", "html": "<a class=\"ds-nav-item ds-nav-item-active\" href=\"#\">Catálogo</a>",
"css": ".ds-nav-item { display:flex; align-items:center; gap:12px; padding:10px 12px; border-radius:2px; border:2px solid transparent; font-family:'JetBrains Mono Variable',monospace; text-transform:uppercase; letter-spacing:0.02em; font-size:0.875rem; color:#383838; } .ds-nav-item-active { background:#6fc2ff; border-color:#383838; } .ds-nav-item:not(.ds-nav-item-active):hover { background:#f8f8f7; }" "css": ".ds-nav-item { display:flex; align-items:center; gap:12px; padding:10px 12px; border-radius:2px; border:2px solid transparent; font-family:'JetBrains Mono Variable',monospace; text-transform:uppercase; letter-spacing:0.02em; font-size:0.875rem; color:#383838; } .ds-nav-item-active { background:#00723F; color:#ffffff; border-color:#383838; } .ds-nav-item:not(.ds-nav-item-active):hover { background:#f8f8f7; }"
} }
], ],
"narrative": { "narrative": {
"northStar": "The Equipment Tag on a Terminal Readout", "northStar": "The Equipment Tag on a Terminal Readout",
"overview": "LabPréstamos was rebuilt against a fully pinned external brief (MotherDuck's crayon-terminal-on-cream neobrutalism), translated from a marketing site's vocabulary into an operational lab tool's. The identity keeps the source system's mechanics intact — a warm cream canvas, monospace type standing in for a terminal readout, hard 2px corners, and a flat charcoal-offset shadow that never blurs — while dropping what only belonged to marketing (hand-drawn duck illustrations, scrolling marquees, testimonial cards). What replaces the duck is the product's own mark: a loan tag with a punch-hole, echoing the paper ticket this system replaced. Depth here is binary, not a hierarchy: an element either sits flat on the page or it's a discrete raised object that presses into its own shadow on hover. Color plays a stricter role than in the source brief: Sky Crayon blue is reserved for actionable, filled controls; Mint Sketch was pulled from the source's decorative rainbow set and fixed as the positive-status color; Coral Sketch was fixed as the sole danger color, split into a light fill and a separately darkened AA-compliant text variant.", "overview": "LabPréstamos runs the mechanics of a fully pinned external brief (MotherDuck's crayon-terminal-on-cream neobrutalism) — cream canvas, monospace type, hard 2px corners, a flat charcoal-offset shadow that never blurs — while carrying UABC's own institutional green and gold as its identity colors instead of the source brief's blue and orange. The first pass used the source's literal palette wholesale; that was corrected once the user flagged it — adopting a design language is not the same as adopting someone else's brand colors, and UABC's green/gold predate this redesign and outrank it. Depth is binary: an element either sits flat on the page or is a discrete raised object that presses into its own shadow on hover. Because Verde Institucional is dark and saturated (unlike the source brief's light blue), it is the one fill in the system that takes white text rather than charcoal — every other fill (Dorado, the status tints, the danger fill) stays with charcoal text because that's what actually clears AA contrast.",
"keyCharacteristics": [ "keyCharacteristics": [
"Cream page canvas, white card surfaces, charcoal (never pure black) as the universal line, border, and text color", "Cream page canvas, white card surfaces, charcoal (never pure black) as the universal line and border color",
"Every corner is 2px — no pills, no circles, no rounded-full anywhere", "Every corner is 2px — no pills, no circles, no rounded-full anywhere",
"One shadow, one behavior: -6px 6px 0 0 charcoal, hard-edged, flattens into the element on hover/focus", "One shadow, one behavior: -6px 6px 0 0 charcoal, hard-edged, flattens into the element on hover/focus",
"JetBrains Mono Variable everywhere, 0.02em tracking, uppercase on structural labels only", "JetBrains Mono Variable everywhere, 0.02em tracking, uppercase on structural labels only",
"Status pills are tinted fills with a matching-color border and always-charcoal text", "UABC Verde Institucional carries every filled action (white text); Dorado UABC carries the secondary action and a handful of accents (charcoal text)",
"Dense, repeated surfaces stay flat and bordered; only discrete, single-instance elements carry the shadow" "Dense, repeated surfaces stay flat and bordered; only discrete, single-instance elements carry the shadow"
], ],
"rules": [ "rules": [
{ "name": "The Charcoal Text Rule", "body": "No filled or tinted surface ever carries white or colored text — text is always Charcoal Ink. Color differentiates status and action through background fill and border only.", "section": "colors" }, { "name": "The Text-on-Fill Rule", "body": "Text/icon color on any filled surface is whichever of Charcoal Ink or white actually clears AA contrast against that fill — never a blanket choice. White on Verde Institucional (dark); Charcoal Ink everywhere else.", "section": "colors" },
{ "name": "The One Shadow Rule", "body": "-6px 6px 0 0 var(--color-ink) is the only shadow value in the system. It never blurs, never softens, never gets a second 'subtle' variant.", "section": "colors" }, { "name": "The One Shadow Rule", "body": "-6px 6px 0 0 var(--color-ink) is the only shadow value in the system. It never blurs, never softens, never gets a second 'subtle' variant.", "section": "colors" },
{ "name": "The Tabular Numbers Rule", "body": "Any figure representing a count carries font-variant-numeric: tabular-nums.", "section": "typography" }, { "name": "The Tabular Numbers Rule", "body": "Any figure representing a count carries font-variant-numeric: tabular-nums.", "section": "typography" },
{ "name": "The Press Rule", "body": "Every raised element's hover state is the same transform: translate exactly the shadow's own offset, so the shadow disappears under the element. No brightness filter, no color darken.", "section": "elevation" }, { "name": "The Press Rule", "body": "Every raised element's hover state is the same transform: translate exactly the shadow's own offset, so the shadow disappears under the element. No brightness filter, no color darken.", "section": "elevation" },
{ "name": "The Tinted-Fill-Bordered Rule", "body": "Badge background = the semantic color mixed 18-25% into white; border = the semantic color at full strength; text = Charcoal Ink always.", "section": "components" } { "name": "The Tinted-Fill-Bordered Rule", "body": "Badge background = the semantic color mixed 18-25% into white; border = the semantic color at full strength; text = Charcoal Ink (tints are always light enough for it).", "section": "components" }
], ],
"dos": [ "dos": [
"Do use the exact shadow -6px 6px 0 0 var(--color-ink) for every raised element, and the exact press transform translate(-6px, 6px) on hover/focus.", "Do use the exact shadow -6px 6px 0 0 var(--color-ink) for every raised element, and the exact press transform translate(-6px, 6px) on hover/focus.",
"Do keep every radius at 2px — buttons, cards, inputs, dialogs, badges, chips.", "Do keep every radius at 2px — buttons, cards, inputs, dialogs, badges, chips.",
"Do keep text Charcoal Ink on every fill, tint, or border color.", "Do check contrast per fill before choosing text color — don't assume charcoal always works.",
"Do reserve Sky Crayon for actionable, filled controls; use Positive/Danger/Secondary for status.", "Do keep Verde Institucional for actionable, filled controls; use Positive/Danger/Secondary for status.",
"Do keep dense/repeated surfaces flat and bordered; reserve the hard shadow for discrete, singular surfaces.", "Do keep dense/repeated surfaces flat and bordered; reserve the hard shadow for discrete, singular surfaces.",
"Do draw every icon as an SVG — never a unicode glyph or emoji.", "Do draw every icon as an SVG — never a unicode glyph or emoji.",
"Do apply font-variant-numeric: tabular-nums to every numeric quantity, stock figure, or date.", "Do apply font-variant-numeric: tabular-nums to every numeric quantity, stock figure, or date.",
@@ -127,8 +127,8 @@
"donts": [ "donts": [
"Don't use blur, glass, or a soft ambient shadow anywhere.", "Don't use blur, glass, or a soft ambient shadow anywhere.",
"Don't introduce a radius above 2px, or a pill/circle shape, anywhere.", "Don't introduce a radius above 2px, or a pill/circle shape, anywhere.",
"Don't use a second filled brand color for secondary actions.", "Don't adopt a borrowed style system's literal brand colors — take its shape/shadow/type mechanics, keep the project's own identity colors in them.",
"Don't reuse Sky Crayon for status pills.", "Don't reuse Verde Institucional for status pills.",
"Don't introduce a second typeface.", "Don't introduce a second typeface.",
"Don't stand a unicode glyph in for an icon." "Don't stand a unicode glyph in for an icon."
] ]
+31 -30
View File
@@ -9,10 +9,10 @@ colors:
ink: "#383838" ink: "#383838"
pencil: "#a1a1a1" pencil: "#a1a1a1"
graphite: "#818181" graphite: "#818181"
primary: "#6fc2ff" primary: "#00723F"
primary-hover: "#56b4f7" primary-hover: "#005f34"
secondary: "#ff9538" secondary: "#DD971A"
secondary-hover: "#ef8526" secondary-hover: "#c78614"
danger: "#f38e84" danger: "#f38e84"
danger-hover: "#ec7469" danger-hover: "#ec7469"
danger-text: "#a83224" danger-text: "#a83224"
@@ -41,11 +41,11 @@ spacing:
components: components:
button-primary: button-primary:
backgroundColor: "{colors.primary}" backgroundColor: "{colors.primary}"
textColor: "{colors.ink}" textColor: "#ffffff"
rounded: "{rounded.control}" rounded: "{rounded.control}"
padding: "10px 16px" padding: "10px 16px"
button-secondary: button-secondary:
backgroundColor: "{colors.frost}" backgroundColor: "{colors.secondary}"
textColor: "{colors.ink}" textColor: "{colors.ink}"
rounded: "{rounded.control}" rounded: "{rounded.control}"
padding: "10px 16px" padding: "10px 16px"
@@ -72,43 +72,44 @@ components:
**Creative North Star: "The Equipment Tag on a Terminal Readout"** **Creative North Star: "The Equipment Tag on a Terminal Readout"**
LabPréstamos was rebuilt against a fully pinned external brief (MotherDuck's crayon-terminal-on-cream neobrutalism), translated from a marketing site's vocabulary into an operational lab tool's. The identity keeps the source system's mechanics intact — a warm cream canvas, monospace type standing in for a terminal readout, hard 2px corners, and a flat charcoal-offset shadow that never blurs — while dropping what only belonged to marketing (hand-drawn duck illustrations, scrolling marquees, testimonial cards). What replaces the duck is the product's own mark: a loan tag with a punch-hole, echoing the paper ticket this system replaced. LabPréstamos runs the *mechanics* of a fully pinned external brief (MotherDuck's crayon-terminal-on-cream neobrutalism) — a warm cream canvas, monospace type standing in for a terminal readout, hard 2px corners, and a flat charcoal-offset shadow that never blurs — while carrying UABC's own institutional green and gold as its identity colors instead of the source brief's blue and orange. The first pass at this system used the source's literal palette wholesale; that was corrected once the user flagged it — adopting a design *language* is not the same as adopting someone else's brand colors, and UABC's green/gold predate this redesign and outrank it. What replaces MotherDuck's duck mascot is the product's own mark: a loan tag with a punch-hole, echoing the paper ticket this system replaced.
Depth here is binary, not a hierarchy: an element either sits flat on the page (bordered, no shadow — tables, list rows, inputs, the nav) or it's a discrete raised object that "presses" into its own shadow on hover (buttons, standalone cards, modals, the login card). There is no soft, no blur, no ambient glow anywhere in the system — every visual weight decision reads as a hard yes/no. Depth here is binary, not a hierarchy: an element either sits flat on the page (bordered, no shadow — tables, list rows, inputs, the nav) or it's a discrete raised object that "presses" into its own shadow on hover (buttons, standalone cards, modals, the login card). There is no soft, no blur, no ambient glow anywhere in the system — every visual weight decision reads as a hard yes/no.
Color plays a stricter role here than in the source brief. Sky Crayon blue is reserved for actionable, filled controls — never for status. A teal (Mint Sketch) was pulled out of the source's decorative rainbow set and fixed as the system's "positive/available" status color, because an operational tool needs that distinction and a marketing site never did. Coral Sketch was likewise fixed as the sole danger color, with a separately darkened text variant (`--color-danger-text`, `#a83224`) for body copy, because the source coral fails AA contrast on white at normal text weight — the fill stays light and loud, the text goes dark and readable. Color plays a stricter role here than in the source brief. Verde Institucional is reserved for actionable, filled controls — never for status. A teal (Mint Sketch, from the source brief's decorative rainbow set) is fixed as the system's "positive/available" status color, kept distinct from the primary action color because an operational tool needs that distinction and a marketing site never did. Coral Sketch is fixed as the sole danger color, with a separately darkened text variant (`--color-danger-text`, `#a83224`) for body copy, because the coral fill fails AA contrast on white at normal text weight — the fill stays light and loud, the text goes dark and readable. Because Verde Institucional is a dark, saturated green (unlike the source brief's light Sky Crayon), it is the one fill in the system that takes white text rather than charcoal — see the Text-on-Fill Rule below.
**Key Characteristics:** **Key Characteristics:**
- Cream page canvas, white card surfaces, charcoal (`#383838`, never pure black) as the universal line, border, and text color - Cream page canvas, white card surfaces, charcoal (`#383838`, never pure black) as the universal line and border color
- Every corner is 2px — buttons, cards, inputs, dialogs, badges, the brand mark's own chip. No pills, no circles, no `rounded-full` anywhere in the system - Every corner is 2px — buttons, cards, inputs, dialogs, badges, the brand mark's own chip. No pills, no circles, no `rounded-full` anywhere in the system
- One shadow, one behavior: `-6px 6px 0 0 var(--color-ink)`, hard-edged, zero blur, on every button, standalone card, toast, and modal — and it flattens into the element on hover/focus (`translate(-6px, 6px)`) - One shadow, one behavior: `-6px 6px 0 0 var(--color-ink)`, hard-edged, zero blur, on every button, standalone card, toast, and modal — and it flattens into the element on hover/focus (`translate(-6px, 6px)`)
- JetBrains Mono Variable everywhere, 0.02em tracking, uppercase treatment on nav labels, button labels, section labels, and headlines - JetBrains Mono Variable everywhere, 0.02em tracking, uppercase treatment on nav labels, button labels, section labels, and headlines
- Status pills and count badges are tinted fills with a matching-color 1.5px border and always-charcoal text — color differentiates via background and border, never via colored type - UABC Verde Institucional carries every filled action (white text); UABC Dorado carries the secondary action and a handful of accents (charcoal text)
- Status pills and count badges are tinted or solid fills with a matching-color border — text stays whichever of charcoal/white actually clears contrast against that fill, never picked by habit
- Dense, repeated surfaces (tables, list-item cards, form inputs) stay flat and bordered; only discrete, single-instance elements carry the shadow - Dense, repeated surfaces (tables, list-item cards, form inputs) stay flat and bordered; only discrete, single-instance elements carry the shadow
## Colors ## Colors
The palette is inherited near-verbatim from the pinned MotherDuck brief; only the semantic *assignment* changes to fit an operational tool instead of a marketing site. The shape/shadow/type system is inherited from the pinned MotherDuck brief; the color *values* are UABC's own institutional palette, carried into that system's roles.
### Primary ### Primary
- **Sky Crayon** (`#6fc2ff`): the system's only filled-action color. Primary buttons, active nav state, focused/selected chips, "Solicitar"/"Aprobar"/"Filtrar"/"Continuar con Google." Text on it is always Charcoal Ink, never white — matching every other filled control in the system. - **Verde Institucional** (`#00723F`): the system's primary filled-action color — unchanged from the project's pre-redesign identity. Primary buttons, active nav state, focused/selected chips, "Solicitar"/"Aprobar"/"Filtrar"/"Continuar con Google," the brand mark's chip fill. Dark enough that it always pairs with **white** text/icons, not charcoal — the one fill in the system where that's true.
### Secondary ### Secondary
- **Duck Bill Orange** (`#ff9538`): sparse accent, repurposed from the source's "illustration/marquee" role (this app has neither) into the operational tool's low-emphasis-but-real accent — "Exportar CSV," "Mantenimiento" status tint, the "En préstamo" KPI tone. - **Dorado UABC** (`#DD971A`): the institutional gold, carried over unchanged. Secondary buttons ("Exportar CSV," "Marcar devuelto"), "Mantenimiento" status tint, the "En préstamo" KPI tone. Light enough to pair with charcoal text (passes AA; white on gold does not).
### Neutral ### Neutral
- **Cream Paper** (`#f4efea`): the page canvas — every screen's base layer. - **Cream Paper** (`#f4efea`): the page canvas — every screen's base layer.
- **Frost White** (`#ffffff`): card, dialog, sidebar, and nav surfaces — the raised layer on cream. - **Frost White** (`#ffffff`): card, dialog, sidebar, and nav surfaces — the raised layer on cream.
- **Chalk Gray** (`#f8f8f7`): hover wash on flat (non-shadowed) interactive rows, and the neutral badge fill for "Baja"/inactive states. - **Chalk Gray** (`#f8f8f7`): hover wash on flat (non-shadowed) interactive rows, and the neutral badge fill for "Baja"/inactive states.
- **Charcoal Ink** (`#383838`): the universal line — every border, every default text color, the shadow color itself. Never pure black. - **Charcoal Ink** (`#383838`): the universal line — every border, most default text, the shadow color itself. Never pure black.
- **Pencil Gray** (`#a1a1a1`): secondary/muted text (labels under headings, metadata, roles) — a real token, not an opacity trick. - **Pencil Gray** (`#a1a1a1`): secondary/muted text (labels under headings, metadata, roles) — a real token, not an opacity trick.
### Status colors (extension beyond the source brief) ### Status colors (extension beyond the source brief)
- **Mint Sketch → Positive** (`#38c1b0`): "disponible," "aprobado," "devuelto en préstamo" status. Pulled out of the source's decorative rainbow-button palette because the operational tool needs a status color distinct from the primary action color; the source brief, built for a marketing site, never had this problem. - **Mint Sketch → Positive** (`#38c1b0`): "disponible," "aprobado," "devuelto" status. Pulled out of the source brief's decorative rainbow-button palette because the operational tool needs a status color distinct from the primary action color; the source brief, built for a marketing site, never had this problem.
- **Coral Sketch → Danger** (`#f38e84` fill / `#a83224` text): "rechazado," "vencido," destructive actions. Split into two values because the fill color (used for badge backgrounds, borders, button fills) is deliberately light and loud, while body text needs the darker `-text` variant to clear 4.5:1 contrast on white. - **Coral Sketch → Danger** (`#f38e84` fill / `#a83224` text): "rechazado," "vencido," destructive actions. Split into two values because the fill color (used for badge backgrounds, borders, button fills) is deliberately light and loud, while body text needs the darker `-text` variant to clear 4.5:1 contrast on white.
### Named Rules ### Named Rules
**The Charcoal Text Rule.** No filled or tinted surface ever carries white or colored text — text is always Charcoal Ink, full stop. Color differentiates status and action through background fill and border only. This is a deliberate tightening of the source brief, which used white nav-button text as an exception; LabPréstamos has no exception. **The Text-on-Fill Rule.** Text and icon color on any filled surface is whichever of Charcoal Ink or white actually clears AA contrast against that specific fill — never a blanket choice. In practice: white on Verde Institucional (dark), Charcoal Ink on everything else (Dorado, the status tints, the danger fill), because that's what the numbers say for each color. Never pick by habit; check the fill.
**The One Shadow Rule.** `-6px 6px 0 0 var(--color-ink)` is the only shadow value in the system. It never blurs, never softens, never gets a second variant for "subtle" elevation — an element either has this exact shadow or it has none. **The One Shadow Rule.** `-6px 6px 0 0 var(--color-ink)` is the only shadow value in the system. It never blurs, never softens, never gets a second variant for "subtle" elevation — an element either has this exact shadow or it has none.
@@ -151,15 +152,15 @@ One radius for the entire system: **2px** (`--radius-card`, and Tailwind's `roun
### Buttons ### Buttons
- **Shape:** 2px radius, 2px Charcoal Ink border, 44px minimum height, `touch-action: manipulation`. - **Shape:** 2px radius, 2px Charcoal Ink border, 44px minimum height, `touch-action: manipulation`.
- **Primary:** Sky Crayon fill, Charcoal Ink text, hard shadow. The default call to action. - **Primary:** Verde Institucional fill, **white** text, hard shadow. The default call to action.
- **Secondary:** Frost White fill (not a second brand color — the source brief is explicit that Sky Crayon is the sole filled-action color), Charcoal Ink border and text, hard shadow. - **Secondary:** Dorado UABC fill, Charcoal Ink text, hard shadow. "Exportar CSV," "Marcar devuelto."
- **Ghost:** transparent fill, Charcoal Ink text, a lighter border (35% ink-mix), no shadow. Used for "Cancelar"/"Limpiar." - **Ghost:** transparent fill, Charcoal Ink text, a lighter border (35% ink-mix), no shadow. Used for "Cancelar"/"Limpiar."
- **Hover / Focus / Active:** see Elevation → The Press Rule. - **Hover / Focus / Active:** see Elevation → The Press Rule.
### Badges / Status Pills ### Badges / Status Pills
- **Style:** 2px radius, 1.5px border in the semantic color, uppercase text at 0.03em tracking, always Charcoal Ink. - **Style:** 2px radius, 1.5px border in the semantic color, uppercase text at 0.03em tracking.
- **The Tinted-Fill-Bordered Rule.** Background = the semantic color mixed 1825% into white; border = the semantic color at full strength; text = Charcoal Ink always. Count badges (the "N pendientes" chip beside a heading) use a solid semantic fill instead of a tint, bordered in Charcoal Ink — the one place a badge goes solid. - **The Tinted-Fill-Bordered Rule.** Background = the semantic color mixed 1825% into white; border = the semantic color at full strength; text = Charcoal Ink (the tinted backgrounds are always light enough for it). Count badges (the "N pendientes" chip beside a heading) use a **solid** semantic fill instead of a tint, bordered in Charcoal Ink — text on those follows the Text-on-Fill Rule (white on a solid Verde Institucional count badge, Charcoal Ink on a solid Positive/mint one).
- **Semantic mapping:** disponible / aprobado / devuelto → Positive (mint). mantenimiento / en préstamo (KPI) → Secondary (orange). rechazado / vencido → Danger (coral). baja / neutral counts → Chalk Gray with a graphite border. - **Semantic mapping:** disponible / aprobado / devuelto → Positive (mint). mantenimiento / en préstamo (KPI) → Secondary (Dorado). rechazado / vencido → Danger (coral). baja / neutral counts → Chalk Gray with a graphite border.
### Cards / Containers ### Cards / Containers
- **Corner:** 2px. - **Corner:** 2px.
@@ -170,18 +171,18 @@ One radius for the entire system: **2px** (`--radius-card`, and Tailwind's `roun
### Inputs / Fields ### Inputs / Fields
- **Style:** Frost White background, 2px Charcoal Ink border, 2px radius, 44px minimum height. No shadow — inputs are always flat, matching the source brief's own Text Input spec. - **Style:** Frost White background, 2px Charcoal Ink border, 2px radius, 44px minimum height. No shadow — inputs are always flat, matching the source brief's own Text Input spec.
- **Focus:** border color shifts to Sky Crayon; no glow, no ring. - **Focus:** border color shifts to Verde Institucional; no glow, no ring.
- **Label:** `.label` — uppercase, 0.75rem, 0.05em tracking, Charcoal Ink. - **Label:** `.label` — uppercase, 0.75rem, 0.05em tracking, Charcoal Ink.
- **Error:** inline `role="alert"` text in Danger-text below the field. - **Error:** inline `role="alert"` text in Danger-text below the field.
### Navigation ### Navigation
- **Desktop sidebar:** Frost White panel (not a colored panel — a deliberate departure from the prior UABC-green sidebar, matching the source brief's flat white nav bar), 2px Charcoal Ink right border. Active item = solid Sky Crayon chip with a 2px Charcoal border; inactive = transparent with a Chalk Gray hover wash. Uppercase labels throughout. Collapsible, same mechanism as before (localStorage + blocking inline script, no flash). - **Desktop sidebar:** Frost White panel (a deliberate departure from the pre-redesign solid-green sidebar, matching the source brief's flat white nav-bar structure — the *color* identity moved to the active-state chip instead of the whole panel), 2px Charcoal Ink right border. Active item = solid Verde Institucional chip with white text and a 2px Charcoal border; inactive = transparent with a Chalk Gray hover wash. Uppercase labels throughout. Collapsible, same mechanism as before (localStorage + blocking inline script, no flash).
- **Mobile nav:** a flush, full-width bottom bar (not a floating pill), Frost White, 2px Charcoal top border, no shadow — flat, matching the source brief's "nav buttons are flat" rule. Active icon = a 2px-radius Sky Crayon square with Charcoal border. - **Mobile nav:** a flush, full-width bottom bar (not a floating pill), Frost White, 2px Charcoal top border, no shadow — flat, matching the source brief's "nav buttons are flat" rule. Active icon = a 2px-radius Verde Institucional square with white icon and Charcoal border.
- **Brand mark chip:** on colored (Sky Crayon) or panel backgrounds, a 2px-radius chip with a 2px Charcoal border; on the white sidebar/mobile header it's a translucent white wash instead, avoiding a third solid color competing with the mark itself. - **Brand mark chip:** a Verde Institucional fill with a white glyph and a 2px Charcoal border, used identically on the sidebar header, mobile header, login screen, and 404 page. The 403 page uses the same chip shape in the Danger color instead.
### Toasts ### Toasts
- Frost White, 2px Charcoal Ink border, hard shadow, 2px radius (down from the prior system's blurred glass `rounded-2xl` treatment — MotherDuck bans blur and ambient shadow outright). - Frost White, 2px Charcoal Ink border, hard shadow, 2px radius (down from the prior system's blurred glass `rounded-2xl` treatment — MotherDuck bans blur and ambient shadow outright).
- A 2px-bordered color chip (36px) leads each toast: Positive for success, Danger for error, Secondary for info — Charcoal Ink stroke icon, not white. - A 2px-bordered color chip (36px) leads each toast: Positive for success, Danger for error, Secondary (Dorado) for info — Charcoal Ink stroke icon (all three chip colors clear contrast with charcoal).
- Entrance: 260ms translate+fade, same timing as before; still respects `prefers-reduced-motion`; still survives `location.reload()` via the sessionStorage queue. - Entrance: 260ms translate+fade, same timing as before; still respects `prefers-reduced-motion`; still survives `location.reload()` via the sessionStorage queue.
### Modals ### Modals
@@ -193,8 +194,8 @@ One radius for the entire system: **2px** (`--radius-card`, and Tailwind's `roun
### Do: ### Do:
- **Do** use the exact shadow `-6px 6px 0 0 var(--color-ink)` (`--shadow-hard`) for every raised element, and the exact press transform `translate(-6px, 6px)` on its hover/focus state. - **Do** use the exact shadow `-6px 6px 0 0 var(--color-ink)` (`--shadow-hard`) for every raised element, and the exact press transform `translate(-6px, 6px)` on its hover/focus state.
- **Do** keep every radius at 2px — buttons, cards, inputs, dialogs, badges, chips. No exceptions, no emphasis tier. - **Do** keep every radius at 2px — buttons, cards, inputs, dialogs, badges, chips. No exceptions, no emphasis tier.
- **Do** keep text Charcoal Ink on every fill, tint, or border color. Never white, never the semantic color itself. - **Do** check contrast per fill before choosing text color (Text-on-Fill Rule) — don't assume charcoal always works.
- **Do** reserve Sky Crayon for actionable, filled controls; use Positive (mint), Danger (coral), or Secondary (orange) for status and non-primary accents. - **Do** keep Verde Institucional for actionable, filled controls; use Positive (mint), Danger (coral), or Secondary (Dorado) for status and non-primary accents.
- **Do** keep dense/repeated surfaces (tables, list cards, inputs, nav) flat and bordered; reserve the hard shadow for discrete, singular, actionable surfaces. - **Do** keep dense/repeated surfaces (tables, list cards, inputs, nav) flat and bordered; reserve the hard shadow for discrete, singular, actionable surfaces.
- **Do** draw every icon as an SVG in the shared heroicons-outline language (or the `BrandMark` glyph for identity) — never a unicode glyph or emoji standing in for one. - **Do** draw every icon as an SVG in the shared heroicons-outline language (or the `BrandMark` glyph for identity) — never a unicode glyph or emoji standing in for one.
- **Do** apply `font-variant-numeric: tabular-nums` to every numeric quantity, stock figure, or date. - **Do** apply `font-variant-numeric: tabular-nums` to every numeric quantity, stock figure, or date.
@@ -203,7 +204,7 @@ One radius for the entire system: **2px** (`--radius-card`, and Tailwind's `roun
### Don't: ### Don't:
- **Don't** use blur, glass, or a soft ambient shadow anywhere — every shadow is the one hard-edged offset value, or there is no shadow. - **Don't** use blur, glass, or a soft ambient shadow anywhere — every shadow is the one hard-edged offset value, or there is no shadow.
- **Don't** introduce a radius above 2px, or a pill/circle shape, anywhere in the UI. - **Don't** introduce a radius above 2px, or a pill/circle shape, anywhere in the UI.
- **Don't** use a second filled brand color for "secondary" actions — Secondary buttons are white-filled and charcoal-outlined, never a second solid color. - **Don't** adopt a borrowed style system's literal brand colors — take its shape/shadow/type mechanics, keep the project's own identity colors in them. This system exists because that line was crossed once and had to be corrected.
- **Don't** reuse Sky Crayon for status pills — status has its own colors (Positive/Danger/Secondary); Sky Crayon means "you can act on this." - **Don't** reuse Verde Institucional for status pills — status has its own colors (Positive/Danger/Secondary); Verde Institucional means "you can act on this."
- **Don't** introduce a second typeface. JetBrains Mono Variable carries every role through weight, size, and case. - **Don't** introduce a second typeface. JetBrains Mono Variable carries every role through weight, size, and case.
- **Don't** stand a unicode glyph in for an icon. - **Don't** stand a unicode glyph in for an icon.
+2 -2
View File
@@ -41,8 +41,8 @@ Herramienta interna de un solo laboratorio (Laboratorio de Sistemas Computaciona
## Brand Commitments ## Brand Commitments
- **2026-08-16: identidad visual reemplazada por decisión explícita del usuario.** La paleta institucional UABC verde/dorada (60/30/10) fue retirada del sistema de diseño; se conserva únicamente como posible insumo para una futura marca oficial si el usuario la reintroduce. El sistema actual sigue un brief externo fijado por el usuario (estilo MotherDuck: "crayon-coded terminal on cream paper", neobrutalista) — ver `DESIGN.md` para los tokens completos y su justificación de por qué cada valor se adaptó a una herramienta operativa en vez de un sitio de marketing. - **2026-08-16/17: mecánica visual reemplazada (MotherDuck), colores de identidad UABC conservados.** El sistema de diseño adoptó la mecánica neobrutalista de un brief externo fijado por el usuario (estilo MotherDuck: "crayon-coded terminal on cream paper" — tipografía mono, radio 2px, sombra dura única, canvas crema) — ver `DESIGN.md` para los tokens completos. La primera pasada también reemplazó los colores de acción por la paleta literal del brief (azul/naranja); el usuario corrigió esto el 2026-08-17: **la paleta institucional UABC (verde `#00723F` primario, dorado `#DD971A` secundario) es la identidad de color activa**, llevada dentro del lenguaje visual nuevo — no reemplazada por él. Verde institucional es lo bastante oscuro para requerir texto blanco (no carbón) en los rellenos, a diferencia del azul claro del brief original.
- Paleta activa: canvas crema `#f4efea`, superficie blanca `#ffffff`, tinta carbón `#383838` (nunca negro puro), acción primaria azul cielo `#6fc2ff`, acento secundario naranja `#ff9538`, positivo/disponible menta `#38c1b0`, peligro coral `#f38e84` (texto `#a83224` para contraste AA). - Paleta activa: canvas crema `#f4efea`, superficie blanca `#ffffff`, tinta carbón `#383838` (nunca negro puro), acción primaria verde institucional `#00723F` (texto blanco), acento secundario dorado UABC `#DD971A` (texto carbón), positivo/disponible menta `#38c1b0`, peligro coral `#f38e84` (texto `#a83224` para contraste AA).
- Tipografía: JetBrains Mono Variable (sustituto abierto de Aeonik Mono, la fuente con licencia que nombra el brief original), monoespaciada en todo el sistema, tracking 0.02em. - Tipografía: JetBrains Mono Variable (sustituto abierto de Aeonik Mono, la fuente con licencia que nombra el brief original), monoespaciada en todo el sistema, tracking 0.02em.
- Radios de esquina: 2px en todo — sin píldoras, sin círculos, sin `rounded-full`. Sombra dura única `-6px 6px 0 0` en tinta carbón sobre elementos elevados; superficies densas/repetidas quedan planas con borde. - Radios de esquina: 2px en todo — sin píldoras, sin círculos, sin `rounded-full`. Sombra dura única `-6px 6px 0 0` en tinta carbón sobre elementos elevados; superficies densas/repetidas quedan planas con borde.
- La identidad visual usa un glifo propio de producto (`BrandMark`, una ficha/etiqueta con perforación — evoca la ficha de préstamo física) como wordmark gráfico y favicon; no es ni pretende ser el escudo/sello oficial de UABC o del laboratorio. **Existe un logo institucional oficial** pendiente de integrar — el usuario lo proporcionará como asset; hasta entonces no inventar ni aproximar ese escudo. - La identidad visual usa un glifo propio de producto (`BrandMark`, una ficha/etiqueta con perforación — evoca la ficha de préstamo física) como wordmark gráfico y favicon; no es ni pretende ser el escudo/sello oficial de UABC o del laboratorio. **Existe un logo institucional oficial** pendiente de integrar — el usuario lo proporcionará como asset; hasta entonces no inventar ni aproximar ese escudo.
+1 -1
View File
@@ -46,7 +46,7 @@ export default function FiltroCategorias({ categorias }: Props) {
const chipStyle = (v: string): React.CSSProperties => const chipStyle = (v: string): React.CSSProperties =>
v === active v === active
? { background: 'var(--color-primary)', color: 'var(--color-ink)', minHeight: '40px', paddingBlock: '0.375rem' } ? { background: 'var(--color-primary)', color: 'white', minHeight: '40px', paddingBlock: '0.375rem' }
: { minHeight: '40px', paddingBlock: '0.375rem' }; : { minHeight: '40px', paddingBlock: '0.375rem' };
return ( return (
+3 -3
View File
@@ -64,7 +64,7 @@ const activeCheck = (item: NavItem) => {
<aside id="app-sidebar" class="hidden md:flex md:fixed md:top-0 md:left-0 md:w-64 md:h-screen bg-white text-[color:var(--color-ink)] md:flex-col md:z-40 sidebar-panel transition-transform duration-200 ease-out" style="border-right: 2px solid var(--color-ink);"> <aside id="app-sidebar" class="hidden md:flex md:fixed md:top-0 md:left-0 md:w-64 md:h-screen bg-white text-[color:var(--color-ink)] md:flex-col md:z-40 sidebar-panel transition-transform duration-200 ease-out" style="border-right: 2px solid var(--color-ink);">
<a href="/" class="p-6 flex items-center gap-3 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color:var(--color-ink)]" aria-label="LabPréstamos — Inicio" style="border-bottom: 2px solid var(--color-ink);"> <a href="/" class="p-6 flex items-center gap-3 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color:var(--color-ink)]" aria-label="LabPréstamos — Inicio" style="border-bottom: 2px solid var(--color-ink);">
<div class="w-9 h-9 rounded-[2px] bg-[color:var(--color-primary)] grid place-items-center p-2" style="border: 2px solid var(--color-ink);" aria-hidden="true"> <div class="w-9 h-9 rounded-[2px] bg-[color:var(--color-primary)] grid place-items-center p-2" style="border: 2px solid var(--color-ink);" aria-hidden="true">
<BrandMark class="w-full h-full" /> <BrandMark class="w-full h-full text-white" />
</div> </div>
<div> <div>
<div class="font-semibold leading-tight uppercase tracking-wide text-sm">LabPréstamos</div> <div class="font-semibold leading-tight uppercase tracking-wide text-sm">LabPréstamos</div>
@@ -77,7 +77,7 @@ const activeCheck = (item: NavItem) => {
href={item.href} href={item.href}
class:list={[ class:list={[
'flex items-center gap-3 px-3 py-2.5 rounded-[2px] text-sm font-medium uppercase tracking-wide whitespace-nowrap transition-colors', 'flex items-center gap-3 px-3 py-2.5 rounded-[2px] text-sm font-medium uppercase tracking-wide whitespace-nowrap transition-colors',
activeCheck(item) ? 'bg-[color:var(--color-primary)]' : 'hover:bg-[color:var(--color-chalk)]' activeCheck(item) ? 'bg-[color:var(--color-primary)] text-white' : 'hover:bg-[color:var(--color-chalk)]'
]} ]}
style={activeCheck(item) ? 'border: 2px solid var(--color-ink);' : 'border: 2px solid transparent;'} style={activeCheck(item) ? 'border: 2px solid var(--color-ink);' : 'border: 2px solid transparent;'}
aria-current={activeCheck(item) ? 'page' : undefined} aria-current={activeCheck(item) ? 'page' : undefined}
@@ -154,7 +154,7 @@ const activeCheck = (item: NavItem) => {
<span <span
class:list={[ class:list={[
'grid place-items-center rounded-[2px] w-11 h-11 transition-[background-color,transform] duration-100 motion-safe:active:scale-95', 'grid place-items-center rounded-[2px] w-11 h-11 transition-[background-color,transform] duration-100 motion-safe:active:scale-95',
active ? 'bg-[color:var(--color-primary)]' : '' active ? 'bg-[color:var(--color-primary)] text-white' : ''
]} ]}
style={active ? 'border: 2px solid var(--color-ink);' : ''} style={active ? 'border: 2px solid var(--color-ink);' : ''}
> >
+1 -1
View File
@@ -8,7 +8,7 @@ Astro.response.status = 404;
<main id="main" class="min-h-screen grid place-items-center p-4"> <main id="main" class="min-h-screen grid place-items-center p-4">
<div class="w-full max-w-md text-center"> <div class="w-full max-w-md text-center">
<div class="inline-grid place-items-center w-16 h-16 rounded-[2px] bg-[color:var(--color-primary)] mb-4 p-4" style="border: 2px solid var(--color-ink); box-shadow: var(--shadow-hard);"> <div class="inline-grid place-items-center w-16 h-16 rounded-[2px] bg-[color:var(--color-primary)] mb-4 p-4" style="border: 2px solid var(--color-ink); box-shadow: var(--shadow-hard);">
<BrandMark class="w-full h-full" /> <BrandMark class="w-full h-full text-white" />
</div> </div>
<h1 class="text-2xl font-semibold uppercase tracking-wide">Página no encontrada</h1> <h1 class="text-2xl font-semibold uppercase tracking-wide">Página no encontrada</h1>
<p class="text-sm mt-2" style="color: var(--color-pencil);">La dirección no existe o cambió de lugar.</p> <p class="text-sm mt-2" style="color: var(--color-pencil);">La dirección no existe o cambió de lugar.</p>
+2 -2
View File
@@ -17,7 +17,7 @@ const googleAuthUrl = '/api/auth/signin';
<div class="w-full max-w-md"> <div class="w-full max-w-md">
<div class="text-center mb-8"> <div class="text-center mb-8">
<div class="inline-grid place-items-center w-16 h-16 rounded-[2px] bg-[color:var(--color-primary)] p-4 mb-4 motion-safe:animate-[fadein_.4s_ease-out]" style="border: 2px solid var(--color-ink); box-shadow: var(--shadow-hard);"> <div class="inline-grid place-items-center w-16 h-16 rounded-[2px] bg-[color:var(--color-primary)] p-4 mb-4 motion-safe:animate-[fadein_.4s_ease-out]" style="border: 2px solid var(--color-ink); box-shadow: var(--shadow-hard);">
<BrandMark class="w-full h-full" /> <BrandMark class="w-full h-full text-white" />
</div> </div>
<h1 class="text-2xl md:text-3xl font-semibold uppercase tracking-wide">Sistema de Préstamos</h1> <h1 class="text-2xl md:text-3xl font-semibold uppercase tracking-wide">Sistema de Préstamos</h1>
<p class="text-sm mt-2" style="color: var(--color-pencil);">Laboratorio de Sistemas Computacionales · UABC</p> <p class="text-sm mt-2" style="color: var(--color-pencil);">Laboratorio de Sistemas Computacionales · UABC</p>
@@ -29,7 +29,7 @@ const googleAuthUrl = '/api/auth/signin';
<a href={googleAuthUrl} class="btn btn-primary w-full"> <a href={googleAuthUrl} class="btn btn-primary w-full">
<svg width="18" height="18" viewBox="0 0 48 48" aria-hidden="true" focusable="false"> <svg width="18" height="18" viewBox="0 0 48 48" aria-hidden="true" focusable="false">
<path fill="var(--color-ink)" d="M44.5 20H24v8.5h11.7C34.4 33.4 29.7 36 24 36c-6.6 0-12-5.4-12-12s5.4-12 12-12c2.9 0 5.5 1 7.6 2.7l6.2-6.2C33.8 5.1 29.2 3 24 3 12.4 3 3 12.4 3 24s9.4 21 21 21c11 0 20-8 20-21 0-1.4-.1-2.7-.5-4z"/> <path fill="white" d="M44.5 20H24v8.5h11.7C34.4 33.4 29.7 36 24 36c-6.6 0-12-5.4-12-12s5.4-12 12-12c2.9 0 5.5 1 7.6 2.7l6.2-6.2C33.8 5.1 29.2 3 24 3 12.4 3 3 12.4 3 24s9.4 21 21 21c11 0 20-8 20-21 0-1.4-.1-2.7-.5-4z"/>
</svg> </svg>
Continuar con Google Continuar con Google
</a> </a>
+9 -8
View File
@@ -2,7 +2,7 @@
@import "@fontsource-variable/jetbrains-mono"; @import "@fontsource-variable/jetbrains-mono";
@theme { @theme {
/* MotherDuck-derived palette, remapped to LabPréstamos' semantics */ /* MotherDuck-derived system (shadow/radius/type mechanics); identity colors are UABC's own */
--color-cream: #f4efea; --color-cream: #f4efea;
--color-frost: #ffffff; --color-frost: #ffffff;
--color-chalk: #f8f8f7; --color-chalk: #f8f8f7;
@@ -12,10 +12,11 @@
--color-pencil: #a1a1a1; --color-pencil: #a1a1a1;
--color-graphite: #818181; --color-graphite: #818181;
--color-primary: #6fc2ff; /* UABC institutional green/gold — dark enough that primary needs white text, not charcoal */
--color-primary-hover: #56b4f7; --color-primary: #00723F;
--color-secondary: #ff9538; --color-primary-hover: #005f34;
--color-secondary-hover: #ef8526; --color-secondary: #DD971A;
--color-secondary-hover: #c78614;
--color-danger: #f38e84; --color-danger: #f38e84;
--color-danger-hover: #ec7469; --color-danger-hover: #ec7469;
/* AA-contrast text variant of Coral Sketch — the fill color reads ~2:1 on white, too light for body text */ /* AA-contrast text variant of Coral Sketch — the fill color reads ~2:1 on white, too light for body text */
@@ -57,7 +58,7 @@
} }
::selection { ::selection {
background: var(--color-primary); background: var(--color-primary);
color: var(--color-ink); color: white;
} }
/* Tabular data keeps real square corners even where a nested control forgets to ask */ /* Tabular data keeps real square corners even where a nested control forgets to ask */
table { table {
@@ -88,10 +89,10 @@
} }
.btn-primary { .btn-primary {
background: var(--color-primary); background: var(--color-primary);
color: var(--color-ink); color: white;
} }
.btn-secondary { .btn-secondary {
background: var(--color-frost); background: var(--color-secondary);
color: var(--color-ink); color: var(--color-ink);
} }
.btn-ghost { .btn-ghost {