feat: fix backend SQL columns, add dark/light theme, fix legacy CSS

- Fix 7 backend controllers: rename columns to match actual DB schema
  (name_room→room_number, id_room→id, bed_type→room_type,
   id_employee→id, status_employee→status)
- Fix 10 frontend files with matching property renames
- Add ThemeContext with dark/light toggle (localStorage persisted)
- Redesign theme.css with [data-theme] attribute selectors
- Add Google Fonts (Syne, DM Sans, JetBrains Mono)
- Redesign sidebar, topbar, and login page CSS
- Migrate ~44 legacy CSS files from hardcoded colors to CSS variables
- Remove Dashboards/Tableros section from menu
- Clean up commented-out CSS blocks across codebase

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-15 03:05:16 +00:00
parent 98e04de0be
commit 1828311b3a
76 changed files with 1847 additions and 2506 deletions

View File

@@ -7,7 +7,26 @@
"Bash(git commit:*)", "Bash(git commit:*)",
"Bash(git remote add:*)", "Bash(git remote add:*)",
"Bash(git push:*)", "Bash(git push:*)",
"Bash(cat:*)" "Bash(cat:*)",
"Bash(git -C /root/SistemaHotel status)",
"Bash(git -C /root/SistemaHotel add backend/hotel_hacienda/src/db/migrations/001_front_office_tables.sql)",
"Bash(git -C /root/SistemaHotel commit -m \"$\\(cat <<''EOF''\nfeat: add database migration for front-office tables\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\nEOF\n\\)\")",
"Bash(git -C /root/SistemaHotel check-ignore -v backend/hotel_hacienda/src/db/migrations/001_front_office_tables.sql)",
"Bash(git -C /root/SistemaHotel add backend/hotel_hacienda/src/db/migrations/001_front_office_tables.sql .gitignore)",
"Bash(git -C /root/SistemaHotel log --oneline -3)",
"Bash(npm install:*)",
"Bash(git init:*)",
"Bash(git -C /root/SistemaHotel log --oneline -5)",
"Bash(git -C /root/SistemaHotel diff backend/hotel_hacienda/src/app.js frontend/Frontend-Hotel/src/App.jsx frontend/Frontend-Hotel/src/constants/menuconfig.js)",
"Bash(psql:*)",
"Bash(systemctl is-active:*)",
"Bash(service docker:*)",
"Bash(ip addr:*)",
"Bash(docker compose:*)",
"Bash(apt-get update:*)",
"Bash(apt-get:*)",
"Bash(docker:*)",
"Bash(python3:*)"
] ]
} }
} }

View File

@@ -10,11 +10,14 @@
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"axios": "^1.13.2", "axios": "^1.13.2",
"bcryptjs": "^2.4.3",
"cookie-parser": "^1.4.7",
"cors": "^2.8.5", "cors": "^2.8.5",
"csv-parser": "^3.2.0", "csv-parser": "^3.2.0",
"dotenv": "^17.2.2", "dotenv": "^17.2.2",
"express": "^5.1.0", "express": "^5.1.0",
"express-validator": "^7.2.1", "express-validator": "^7.2.1",
"jsonwebtoken": "^9.0.2",
"nodemailer": "^7.0.10", "nodemailer": "^7.0.10",
"pg": "^8.16.3", "pg": "^8.16.3",
"stripe": "^20.1.2", "stripe": "^20.1.2",
@@ -84,6 +87,12 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/bcryptjs": {
"version": "2.4.3",
"resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
"integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==",
"license": "MIT"
},
"node_modules/binary-extensions": { "node_modules/binary-extensions": {
"version": "2.3.0", "version": "2.3.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
@@ -141,6 +150,12 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/buffer-equal-constant-time": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
"integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
"license": "BSD-3-Clause"
},
"node_modules/bytes": { "node_modules/bytes": {
"version": "3.1.2", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
@@ -275,6 +290,25 @@
"node": ">= 0.6" "node": ">= 0.6"
} }
}, },
"node_modules/cookie-parser": {
"version": "1.4.7",
"resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz",
"integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==",
"license": "MIT",
"dependencies": {
"cookie": "0.7.2",
"cookie-signature": "1.0.6"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/cookie-parser/node_modules/cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
"license": "MIT"
},
"node_modules/cookie-signature": { "node_modules/cookie-signature": {
"version": "1.2.2", "version": "1.2.2",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
@@ -382,6 +416,15 @@
"node": ">= 0.4" "node": ">= 0.4"
} }
}, },
"node_modules/ecdsa-sig-formatter": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
"integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
"license": "Apache-2.0",
"dependencies": {
"safe-buffer": "^5.0.1"
}
},
"node_modules/ee-first": { "node_modules/ee-first": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -872,12 +915,97 @@
"integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/jsonwebtoken": {
"version": "9.0.3",
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz",
"integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==",
"license": "MIT",
"dependencies": {
"jws": "^4.0.1",
"lodash.includes": "^4.3.0",
"lodash.isboolean": "^3.0.3",
"lodash.isinteger": "^4.0.4",
"lodash.isnumber": "^3.0.3",
"lodash.isplainobject": "^4.0.6",
"lodash.isstring": "^4.0.1",
"lodash.once": "^4.0.0",
"ms": "^2.1.1",
"semver": "^7.5.4"
},
"engines": {
"node": ">=12",
"npm": ">=6"
}
},
"node_modules/jwa": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz",
"integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==",
"license": "MIT",
"dependencies": {
"buffer-equal-constant-time": "^1.0.1",
"ecdsa-sig-formatter": "1.0.11",
"safe-buffer": "^5.0.1"
}
},
"node_modules/jws": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz",
"integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==",
"license": "MIT",
"dependencies": {
"jwa": "^2.0.1",
"safe-buffer": "^5.0.1"
}
},
"node_modules/lodash": { "node_modules/lodash": {
"version": "4.17.21", "version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/lodash.includes": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
"integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
"license": "MIT"
},
"node_modules/lodash.isboolean": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
"integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
"license": "MIT"
},
"node_modules/lodash.isinteger": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
"integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",
"license": "MIT"
},
"node_modules/lodash.isnumber": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
"integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",
"license": "MIT"
},
"node_modules/lodash.isplainobject": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
"integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
"license": "MIT"
},
"node_modules/lodash.isstring": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
"integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
"license": "MIT"
},
"node_modules/lodash.once": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
"integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
"license": "MIT"
},
"node_modules/math-intrinsics": { "node_modules/math-intrinsics": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -1070,7 +1198,6 @@
"resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz",
"integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"pg-connection-string": "^2.9.1", "pg-connection-string": "^2.9.1",
"pg-pool": "^3.10.1", "pg-pool": "^3.10.1",
@@ -1331,7 +1458,6 @@
"version": "7.7.2", "version": "7.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"dev": true,
"license": "ISC", "license": "ISC",
"bin": { "bin": {
"semver": "bin/semver.js" "semver": "bin/semver.js"

View File

@@ -5,11 +5,11 @@ const getGuests = async (req, res) => {
const { search, limit = 50, offset = 0 } = req.query; const { search, limit = 50, offset = 0 } = req.query;
let query = ` let query = `
SELECT g.*, SELECT g.*,
r.room_id, rm.name_room, r.room_id, rm.room_number,
r.check_in as current_check_in r.check_in as current_check_in
FROM guests g FROM guests g
LEFT JOIN reservations r ON r.guest_id = g.id AND r.status = 'checked_in' LEFT JOIN reservations r ON r.guest_id = g.id AND r.status = 'checked_in'
LEFT JOIN rooms rm ON rm.id_room = r.room_id LEFT JOIN rooms rm ON rm.id = r.room_id
`; `;
const params = []; const params = [];
let paramIndex = 1; let paramIndex = 1;
@@ -38,10 +38,10 @@ const getGuestById = async (req, res) => {
try { try {
const { id } = req.params; const { id } = req.params;
const guest = await pool.query(` const guest = await pool.query(`
SELECT g.*, r.room_id, rm.name_room, r.check_in as current_check_in, r.check_out as current_check_out SELECT g.*, r.room_id, rm.room_number, r.check_in as current_check_in, r.check_out as current_check_out
FROM guests g FROM guests g
LEFT JOIN reservations r ON r.guest_id = g.id AND r.status = 'checked_in' LEFT JOIN reservations r ON r.guest_id = g.id AND r.status = 'checked_in'
LEFT JOIN rooms rm ON rm.id_room = r.room_id LEFT JOIN rooms rm ON rm.id = r.room_id
WHERE g.id = $1 WHERE g.id = $1
`, [id]); `, [id]);
@@ -92,9 +92,9 @@ const getGuestStays = async (req, res) => {
try { try {
const { id } = req.params; const { id } = req.params;
const result = await pool.query(` const result = await pool.query(`
SELECT gs.*, rm.name_room, rm.bed_type SELECT gs.*, rm.room_number, rm.room_type
FROM guest_stays gs FROM guest_stays gs
LEFT JOIN rooms rm ON rm.id_room = gs.room_id LEFT JOIN rooms rm ON rm.id = gs.room_id
WHERE gs.guest_id = $1 WHERE gs.guest_id = $1
ORDER BY gs.check_in DESC ORDER BY gs.check_in DESC
`, [id]); `, [id]);

View File

@@ -4,12 +4,12 @@ const getTasks = async (req, res) => {
try { try {
const { status, priority, assigned_to } = req.query; const { status, priority, assigned_to } = req.query;
let query = ` let query = `
SELECT ht.*, rm.name_room, rm.floor, SELECT ht.*, rm.room_number, rm.floor,
CASE WHEN ht.assigned_to IS NOT NULL THEN CASE WHEN ht.assigned_to IS NOT NULL THEN
(SELECT e.first_name || ' ' || e.last_name FROM employees e WHERE e.id_employee = ht.assigned_to) (SELECT e.first_name || ' ' || e.last_name FROM employees e WHERE e.id = ht.assigned_to)
END as assigned_name END as assigned_name
FROM housekeeping_tasks ht FROM housekeeping_tasks ht
LEFT JOIN rooms rm ON rm.id_room = ht.room_id LEFT JOIN rooms rm ON rm.id = ht.room_id
WHERE 1=1 WHERE 1=1
`; `;
const params = []; const params = [];
@@ -62,7 +62,7 @@ const updateTask = async (req, res) => {
updates.status = 'completed'; updates.status = 'completed';
updates.completed_at = new Date(); updates.completed_at = new Date();
// Set room to available // Set room to available
await pool.query("UPDATE rooms SET status = 'available' WHERE id_room = $1", [task.room_id]); await pool.query("UPDATE rooms SET status = 'available' WHERE id = $1", [task.room_id]);
await pool.query( await pool.query(
'INSERT INTO room_status_log (room_id, previous_status, new_status, changed_by) VALUES ($1, $2, $3, $4)', 'INSERT INTO room_status_log (room_id, previous_status, new_status, changed_by) VALUES ($1, $2, $3, $4)',
[task.room_id, 'cleaning', 'available', req.user?.user_id] [task.room_id, 'cleaning', 'available', req.user?.user_id]
@@ -91,10 +91,10 @@ const getStaff = async (req, res) => {
// Get employees from housekeeping-related areas // Get employees from housekeeping-related areas
// Note: the employees table structure uses stored functions, so we query directly // Note: the employees table structure uses stored functions, so we query directly
const result = await pool.query(` const result = await pool.query(`
SELECT e.id_employee, e.first_name, e.last_name, SELECT e.id, e.first_name, e.last_name,
(SELECT COUNT(*) FROM housekeeping_tasks ht WHERE ht.assigned_to = e.id_employee AND ht.status = 'in_progress') as active_tasks (SELECT COUNT(*) FROM housekeeping_tasks ht WHERE ht.assigned_to = e.id AND ht.status = 'in_progress') as active_tasks
FROM employees e FROM employees e
WHERE e.status_employee = true WHERE e.status = 'active'
ORDER BY e.first_name ORDER BY e.first_name
LIMIT 50 LIMIT 50
`); `);

View File

@@ -1,6 +1,6 @@
const pool = require('../db/connection'); const pool = require('../db/connection');
const axios = require('axios'); const axios = require('axios');
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY); const stripe = process.env.STRIPE_SECRET_KEY ? require('stripe')(process.env.STRIPE_SECRET_KEY) : null;
const getFacturas = async (initialDate, finalDate) => { const getFacturas = async (initialDate, finalDate) => {
try { try {
const response = await axios.get(process.env.FACTURAS_API_URL, { const response = await axios.get(process.env.FACTURAS_API_URL, {

View File

@@ -53,11 +53,11 @@ const getRevenueReport = async (req, res) => {
} }
const result = await pool.query(` const result = await pool.query(`
SELECT rm.bed_type as room_type, COALESCE(SUM(r.total_amount), 0) as revenue SELECT rm.room_type, COALESCE(SUM(r.total_amount), 0) as revenue
FROM reservations r FROM reservations r
JOIN rooms rm ON rm.id_room = r.room_id JOIN rooms rm ON rm.id = r.room_id
WHERE r.status = 'checked_out' AND r.check_out >= CURRENT_DATE - INTERVAL '${interval}' WHERE r.status = 'checked_out' AND r.check_out >= CURRENT_DATE - INTERVAL '${interval}'
GROUP BY rm.bed_type GROUP BY rm.room_type
ORDER BY revenue DESC ORDER BY revenue DESC
`); `);

View File

@@ -5,10 +5,10 @@ const getReservations = async (req, res) => {
const { status, from_date, to_date, search } = req.query; const { status, from_date, to_date, search } = req.query;
let query = ` let query = `
SELECT r.*, g.first_name, g.last_name, g.phone, g.email, SELECT r.*, g.first_name, g.last_name, g.phone, g.email,
rm.name_room, rm.bed_type rm.room_number, rm.room_type
FROM reservations r FROM reservations r
JOIN guests g ON g.id = r.guest_id JOIN guests g ON g.id = r.guest_id
LEFT JOIN rooms rm ON rm.id_room = r.room_id LEFT JOIN rooms rm ON rm.id = r.room_id
WHERE 1=1 WHERE 1=1
`; `;
const params = []; const params = [];
@@ -128,7 +128,7 @@ const updateReservationStatus = async (req, res) => {
// Cascading side effects // Cascading side effects
if (status === 'checked_in') { if (status === 'checked_in') {
// Set room to occupied // Set room to occupied
await pool.query("UPDATE rooms SET status = 'occupied' WHERE id_room = $1", [reservation.room_id]); await pool.query("UPDATE rooms SET status = 'occupied' WHERE id = $1", [reservation.room_id]);
await pool.query( await pool.query(
'INSERT INTO room_status_log (room_id, previous_status, new_status, changed_by) VALUES ($1, $2, $3, $4)', 'INSERT INTO room_status_log (room_id, previous_status, new_status, changed_by) VALUES ($1, $2, $3, $4)',
[reservation.room_id, 'available', 'occupied', userId] [reservation.room_id, 'available', 'occupied', userId]
@@ -142,7 +142,7 @@ const updateReservationStatus = async (req, res) => {
if (status === 'checked_out') { if (status === 'checked_out') {
// Set room to cleaning // Set room to cleaning
await pool.query("UPDATE rooms SET status = 'cleaning' WHERE id_room = $1", [reservation.room_id]); await pool.query("UPDATE rooms SET status = 'cleaning' WHERE id = $1", [reservation.room_id]);
await pool.query( await pool.query(
'INSERT INTO room_status_log (room_id, previous_status, new_status, changed_by) VALUES ($1, $2, $3, $4)', 'INSERT INTO room_status_log (room_id, previous_status, new_status, changed_by) VALUES ($1, $2, $3, $4)',
[reservation.room_id, 'occupied', 'cleaning', userId] [reservation.room_id, 'occupied', 'cleaning', userId]
@@ -162,7 +162,7 @@ const updateReservationStatus = async (req, res) => {
if (status === 'cancelled') { if (status === 'cancelled') {
// Free room if it was occupied // Free room if it was occupied
if (reservation.status === 'checked_in') { if (reservation.status === 'checked_in') {
await pool.query("UPDATE rooms SET status = 'available' WHERE id_room = $1", [reservation.room_id]); await pool.query("UPDATE rooms SET status = 'available' WHERE id = $1", [reservation.room_id]);
} }
} }

View File

@@ -10,9 +10,9 @@ const getRoomsWithStatus = async (req, res) => {
res.check_in, res.check_in,
res.check_out res.check_out
FROM rooms r FROM rooms r
LEFT JOIN reservations res ON res.room_id = r.id_room AND res.status = 'checked_in' LEFT JOIN reservations res ON res.room_id = r.id AND res.status = 'checked_in'
LEFT JOIN guests g ON g.id = res.guest_id LEFT JOIN guests g ON g.id = res.guest_id
ORDER BY r.floor, r.name_room ORDER BY r.floor, r.room_number
`); `);
res.json({ rooms: result.rows }); res.json({ rooms: result.rows });
} catch (error) { } catch (error) {
@@ -32,13 +32,13 @@ const updateRoomStatus = async (req, res) => {
return res.status(400).json({ message: 'Estado invalido' }); return res.status(400).json({ message: 'Estado invalido' });
} }
const current = await pool.query('SELECT status FROM rooms WHERE id_room = $1', [id]); const current = await pool.query('SELECT status FROM rooms WHERE id = $1', [id]);
if (current.rows.length === 0) { if (current.rows.length === 0) {
return res.status(404).json({ message: 'Habitacion no encontrada' }); return res.status(404).json({ message: 'Habitacion no encontrada' });
} }
const previousStatus = current.rows[0].status; const previousStatus = current.rows[0].status;
await pool.query('UPDATE rooms SET status = $1 WHERE id_room = $2', [status, id]); await pool.query('UPDATE rooms SET status = $1 WHERE id = $2', [status, id]);
await pool.query( await pool.query(
'INSERT INTO room_status_log (room_id, previous_status, new_status, changed_by) VALUES ($1, $2, $3, $4)', 'INSERT INTO room_status_log (room_id, previous_status, new_status, changed_by) VALUES ($1, $2, $3, $4)',

View File

@@ -4,10 +4,10 @@ const getOrders = async (req, res) => {
try { try {
const { status } = req.query; const { status } = req.query;
let query = ` let query = `
SELECT rso.*, rm.name_room, g.first_name || ' ' || g.last_name as guest_name, SELECT rso.*, rm.room_number, g.first_name || ' ' || g.last_name as guest_name,
json_agg(json_build_object('id', oi.id, 'name', mi.name, 'quantity', oi.quantity, 'price', oi.price, 'notes', oi.notes)) as items json_agg(json_build_object('id', oi.id, 'name', mi.name, 'quantity', oi.quantity, 'price', oi.price, 'notes', oi.notes)) as items
FROM room_service_orders rso FROM room_service_orders rso
LEFT JOIN rooms rm ON rm.id_room = rso.room_id LEFT JOIN rooms rm ON rm.id = rso.room_id
LEFT JOIN guests g ON g.id = rso.guest_id LEFT JOIN guests g ON g.id = rso.guest_id
LEFT JOIN order_items oi ON oi.order_id = rso.id LEFT JOIN order_items oi ON oi.order_id = rso.id
LEFT JOIN menu_items mi ON mi.id = oi.menu_item_id LEFT JOIN menu_items mi ON mi.id = oi.menu_item_id
@@ -19,7 +19,7 @@ const getOrders = async (req, res) => {
} else { } else {
query += " WHERE rso.status NOT IN ('delivered', 'cancelled')"; query += " WHERE rso.status NOT IN ('delivered', 'cancelled')";
} }
query += ' GROUP BY rso.id, rm.name_room, g.first_name, g.last_name ORDER BY rso.created_at DESC'; query += ' GROUP BY rso.id, rm.room_number, g.first_name, g.last_name ORDER BY rso.created_at DESC';
const result = await pool.query(query, params); const result = await pool.query(query, params);
res.json({ orders: result.rows }); res.json({ orders: result.rows });

View File

@@ -11,7 +11,7 @@ const getSchedules = async (req, res) => {
let query = ` let query = `
SELECT es.*, e.first_name, e.last_name SELECT es.*, e.first_name, e.last_name
FROM employee_schedules es FROM employee_schedules es
JOIN employees e ON e.id_employee = es.employee_id JOIN employees e ON e.id = es.employee_id
WHERE es.schedule_date BETWEEN $1 AND $2 WHERE es.schedule_date BETWEEN $1 AND $2
`; `;
const params = [week_start, weekEnd.toISOString().split('T')[0]]; const params = [week_start, weekEnd.toISOString().split('T')[0]];
@@ -67,7 +67,7 @@ const getEmployeeSchedule = async (req, res) => {
const getEmployeesForScheduling = async (req, res) => { const getEmployeesForScheduling = async (req, res) => {
try { try {
const result = await pool.query( const result = await pool.query(
'SELECT id_employee, first_name, last_name FROM employees WHERE status_employee = true ORDER BY first_name LIMIT 100' "SELECT id, first_name, last_name FROM employees WHERE status = 'active' ORDER BY first_name LIMIT 100"
); );
res.json({ employees: result.rows }); res.json({ employees: result.rows });
} catch (error) { } catch (error) {

View File

@@ -36,7 +36,7 @@ services:
EMAIL_PORT: 587 EMAIL_PORT: 587
EMAIL_USER: ${EMAIL_USER} EMAIL_USER: ${EMAIL_USER}
EMAIL_PASS: ${EMAIL_PASS} EMAIL_PASS: ${EMAIL_PASS}
URL_CORS: https://hotel.consultoria-as.com URL_CORS: http://192.168.10.229:5172
BANXICO_TOKEN: ${BANXICO_TOKEN} BANXICO_TOKEN: ${BANXICO_TOKEN}
depends_on: depends_on:
postgres: postgres:
@@ -49,7 +49,7 @@ services:
ports: ports:
- "5172:5172" - "5172:5172"
environment: environment:
VITE_API_BASE_URL: http://backend:4000/api VITE_API_BASE_URL: http://192.168.10.229:4000/api
depends_on: depends_on:
- backend - backend

View File

@@ -11,11 +11,14 @@
"@hookform/resolvers": "^5.2.2", "@hookform/resolvers": "^5.2.2",
"axios": "^1.11.0", "axios": "^1.11.0",
"bootstrap": "^5.3.8", "bootstrap": "^5.3.8",
"i18next": "^23.16.8",
"i18next-browser-languagedetector": "^8.0.4",
"multer": "^2.0.2", "multer": "^2.0.2",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
"react": "^19.1.1", "react": "^19.1.1",
"react-dom": "^19.1.1", "react-dom": "^19.1.1",
"react-hook-form": "^7.66.1", "react-hook-form": "^7.66.1",
"react-i18next": "^15.4.1",
"react-icons": "^5.5.0", "react-icons": "^5.5.0",
"react-router-dom": "^7.8.2", "react-router-dom": "^7.8.2",
"xlsx": "^0.18.5", "xlsx": "^0.18.5",
@@ -71,7 +74,6 @@
"integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@babel/code-frame": "^7.27.1", "@babel/code-frame": "^7.27.1",
"@babel/generator": "^7.28.5", "@babel/generator": "^7.28.5",
@@ -233,6 +235,15 @@
"node": ">=6.0.0" "node": ">=6.0.0"
} }
}, },
"node_modules/@babel/runtime": {
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz",
"integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/template": { "node_modules/@babel/template": {
"version": "7.27.2", "version": "7.27.2",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
@@ -1518,7 +1529,6 @@
"integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@babel/core": "^7.21.3", "@babel/core": "^7.21.3",
"@svgr/babel-preset": "8.1.0", "@svgr/babel-preset": "8.1.0",
@@ -1821,7 +1831,6 @@
"integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"csstype": "^3.2.2" "csstype": "^3.2.2"
} }
@@ -1859,7 +1868,6 @@
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"bin": { "bin": {
"acorn": "bin/acorn" "acorn": "bin/acorn"
}, },
@@ -2218,7 +2226,6 @@
} }
], ],
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"baseline-browser-mapping": "^2.9.0", "baseline-browser-mapping": "^2.9.0",
"caniuse-lite": "^1.0.30001759", "caniuse-lite": "^1.0.30001759",
@@ -2953,7 +2960,6 @@
"integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1", "@eslint-community/regexpp": "^4.12.1",
@@ -3622,6 +3628,47 @@
"node": ">= 0.4" "node": ">= 0.4"
} }
}, },
"node_modules/html-parse-stringify": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
"integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==",
"license": "MIT",
"dependencies": {
"void-elements": "3.1.0"
}
},
"node_modules/i18next": {
"version": "23.16.8",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.8.tgz",
"integrity": "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==",
"funding": [
{
"type": "individual",
"url": "https://locize.com"
},
{
"type": "individual",
"url": "https://locize.com/i18next.html"
},
{
"type": "individual",
"url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
}
],
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.23.2"
}
},
"node_modules/i18next-browser-languagedetector": {
"version": "8.2.1",
"resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.2.1.tgz",
"integrity": "sha512-bZg8+4bdmaOiApD7N7BPT9W8MLZG+nPTOFlLiJiT8uzKXFjhxw4v2ierCXOwB5sFDMtuA5G4kgYZ0AznZxQ/cw==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.23.2"
}
},
"node_modules/ignore": { "node_modules/ignore": {
"version": "5.3.2", "version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
@@ -4685,7 +4732,6 @@
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"engines": { "engines": {
"node": ">=12" "node": ">=12"
}, },
@@ -4723,7 +4769,6 @@
} }
], ],
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"nanoid": "^3.3.11", "nanoid": "^3.3.11",
"picocolors": "^1.1.1", "picocolors": "^1.1.1",
@@ -4804,7 +4849,6 @@
"resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz",
"integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==",
"license": "MIT", "license": "MIT",
"peer": true,
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
} }
@@ -4814,7 +4858,6 @@
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz",
"integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"scheduler": "^0.27.0" "scheduler": "^0.27.0"
}, },
@@ -4827,7 +4870,6 @@
"resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.68.0.tgz", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.68.0.tgz",
"integrity": "sha512-oNN3fjrZ/Xo40SWlHf1yCjlMK417JxoSJVUXQjGdvdRCU07NTFei1i1f8ApUAts+IVh14e4EdakeLEA+BEAs/Q==", "integrity": "sha512-oNN3fjrZ/Xo40SWlHf1yCjlMK417JxoSJVUXQjGdvdRCU07NTFei1i1f8ApUAts+IVh14e4EdakeLEA+BEAs/Q==",
"license": "MIT", "license": "MIT",
"peer": true,
"engines": { "engines": {
"node": ">=18.0.0" "node": ">=18.0.0"
}, },
@@ -4839,6 +4881,32 @@
"react": "^16.8.0 || ^17 || ^18 || ^19" "react": "^16.8.0 || ^17 || ^18 || ^19"
} }
}, },
"node_modules/react-i18next": {
"version": "15.7.4",
"resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.7.4.tgz",
"integrity": "sha512-nyU8iKNrI5uDJch0z9+Y5XEr34b0wkyYj3Rp+tfbahxtlswxSCjcUL9H0nqXo9IR3/t5Y5PKIA3fx3MfUyR9Xw==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.27.6",
"html-parse-stringify": "^3.0.1"
},
"peerDependencies": {
"i18next": ">= 23.4.0",
"react": ">= 16.8.0",
"typescript": "^5"
},
"peerDependenciesMeta": {
"react-dom": {
"optional": true
},
"react-native": {
"optional": true
},
"typescript": {
"optional": true
}
}
},
"node_modules/react-icons": { "node_modules/react-icons": {
"version": "5.5.0", "version": "5.5.0",
"resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz", "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz",
@@ -5710,7 +5778,6 @@
"integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"esbuild": "^0.25.0", "esbuild": "^0.25.0",
"fdir": "^6.5.0", "fdir": "^6.5.0",
@@ -5795,6 +5862,15 @@
"vite": ">=2.6.0" "vite": ">=2.6.0"
} }
}, },
"node_modules/void-elements": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
"integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/which": { "node_modules/which": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",

View File

@@ -5,38 +5,6 @@
text-align: center; text-align: center;
} }
.logo {
height: 6em;
padding: 1.5em;
will-change: filter;
transition: filter 300ms;
}
.logo:hover {
filter: drop-shadow(0 0 2em #646cffaa);
}
.logo.react:hover {
filter: drop-shadow(0 0 2em #61dafbaa);
}
@keyframes logo-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
@media (prefers-reduced-motion: no-preference) {
a:nth-of-type(2) .logo {
animation: logo-spin infinite 20s linear;
}
}
.card {
padding: 2em;
}
.read-the-docs { .read-the-docs {
color: #888; color: var(--text-muted);
} }

View File

@@ -3,27 +3,26 @@
padding: 10px 20px; padding: 10px 20px;
font-size: 1rem; font-size: 1rem;
font-weight: bold; font-weight: bold;
border-radius: 999px; /* Súper redondo */ border-radius: 999px;
background-color: #521414; background-color: var(--accent-gold);
font-family: 'Roboto', sans-serif; font-family: var(--font-sans);
cursor: pointer; cursor: pointer;
color: #ffffff; color: var(--bg-primary);
transition: all 0.3s ease; transition: all 0.3s ease;
box-shadow: 0px 8px 15px rgba(0, 0, 0, 0.2); box-shadow: var(--shadow-md);
width: 100%; width: 100%;
max-width: 400px; max-width: 400px;
text-align: center; text-align: center;
transition: all 0.3s ease;
} }
.btn.primary { .btn.primary {
background-color: #4a0d0d; background-color: var(--accent-gold);
color: white; color: var(--bg-primary);
} }
.btn.primary:hover { .btn.primary:hover {
transform: translateY(-2px); transform: translateY(-2px);
box-shadow: 0px 12px 20px rgba(0, 0, 0, 0.3); box-shadow: var(--shadow-lg);
} }
.btn.secundary { .btn.secundary {
@@ -32,10 +31,10 @@
font-size: 1.8rem; font-size: 1.8rem;
font-weight: bold; font-weight: bold;
border-radius: 999px; border-radius: 999px;
background-color: #eeeeee; background-color: var(--bg-elevated);
cursor: pointer; cursor: pointer;
color: #555555; color: var(--text-primary);
box-shadow: 0px 8px 15px rgba(0, 0, 0, 0.15); box-shadow: var(--shadow-md);
width: 100%; width: 100%;
max-width: 400px; max-width: 400px;
text-align: center; text-align: center;
@@ -44,7 +43,7 @@
.btn.secundary:hover { .btn.secundary:hover {
transform: translateY(-2px); transform: translateY(-2px);
box-shadow: 0px 12px 20px rgba(0, 0, 0, 0.2); box-shadow: var(--shadow-lg);
} }
.button-group { .button-group {
@@ -54,36 +53,3 @@
margin-top: 30px; margin-top: 30px;
align-items: center; align-items: center;
} }
/*
.button-group {
display: flex;
flex-direction: column;
gap: 20px;
margin-top: 30px;
align-items: center;
}
.input-field {
background-color: #eeeeee;
color: #555;
font-size: 1.8rem;
font-weight: bold;
border-radius: 999px;
padding: 20px 40px;
box-shadow: 0px 8px 15px rgba(0, 0, 0, 0.15);
border: none;
width: 100%;
max-width: 400px;
text-align: center;
outline: none;
}
.btn.gray {
background-color: #ccc;
color: #333;
}
*/

View File

@@ -15,8 +15,8 @@
.date-label { .date-label {
font-size: 14px; font-size: 14px;
font-weight: 600; font-weight: 600;
color: #333; color: var(--text-primary);
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; font-family: var(--font-sans);
white-space: nowrap; white-space: nowrap;
} }
@@ -24,12 +24,12 @@
padding: 10px 16px; padding: 10px 16px;
border: none; border: none;
border-radius: 30px; border-radius: 30px;
background-color: white; background-color: var(--bg-elevated);
box-shadow: 0 0 0 2px #f4f4f4; box-shadow: 0 0 0 2px var(--border-color);
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
min-width: 150px; min-width: 150px;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; font-family: var(--font-sans);
font-weight: 600; font-weight: 600;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: all 0.2s ease;
@@ -39,11 +39,11 @@
.date-input:focus { .date-input:focus {
outline: none; outline: none;
box-shadow: 0 0 0 2px #fcd200; box-shadow: 0 0 0 2px var(--accent-gold);
} }
.date-input:hover { .date-input:hover {
box-shadow: 0 0 0 2px #e6e6e6; box-shadow: 0 0 0 2px var(--accent-gold-muted);
} }
@media (max-width: 768px) { @media (max-width: 768px) {
@@ -61,4 +61,3 @@
flex: 1; flex: 1;
} }
} }

View File

@@ -1,5 +1,3 @@
/* src/styles/Filters.css */
.page-header { .page-header {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
@@ -8,37 +6,37 @@
} }
.page-title { .page-title {
color: #1a1a1a; color: var(--text-primary);
font-size: 28px; font-size: 28px;
font-weight: 700; font-weight: 700;
margin: 0; margin: 0;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; font-family: var(--font-sans);
letter-spacing: -0.5px; letter-spacing: -0.5px;
} }
.new-payment-btn { .new-payment-btn {
background-color: #FFD700; background-color: var(--accent-gold);
color: #800000; color: var(--bg-primary);
font-weight: bold; font-weight: bold;
padding: 10px 20px; padding: 10px 20px;
border-radius: 20px; border-radius: 20px;
border: none; border: none;
cursor: pointer; cursor: pointer;
font-size: 14px; font-size: 14px;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; font-family: var(--font-sans);
transition: all 0.2s ease; transition: all 0.2s ease;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-sm);
} }
.new-payment-btn:hover { .new-payment-btn:hover {
background-color: #fcd200; background-color: var(--accent-gold-hover);
transform: translateY(-1px); transform: translateY(-1px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15); box-shadow: var(--shadow-md);
} }
.new-payment-btn:active { .new-payment-btn:active {
transform: translateY(0); transform: translateY(0);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-sm);
} }
.report-page { .report-page {
@@ -55,36 +53,24 @@ input[type="date"] {
padding: 10px 16px; padding: 10px 16px;
border: none; border: none;
border-radius: 30px; border-radius: 30px;
background-color: white; background-color: var(--bg-elevated);
box-shadow: 0 0 0 2px #f4f4f4; box-shadow: 0 0 0 2px var(--border-color);
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
max-width: 250px; max-width: 250px;
min-width: 150px; min-width: 150px;
width: auto; width: auto;
flex: 0 1 auto; flex: 0 1 auto;
/* appearance: none; font-family: var(--font-sans);
-webkit-appearance: none;
-moz-appearance: none; */
/* background-image: url("data:image/svg+xml,%3Csvg fill='gold' viewBox='0 0 24 24' width='24' height='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7 10l5 5 5-5z'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 2px center;
background-size: 18px 18px; */
font-family:'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
font-weight: bold; font-weight: bold;
cursor: pointer; cursor: pointer;
box-sizing: border-box; box-sizing: border-box;
/* display: flex;
justify-content: flex-end;
gap: 10px;
margin-bottom: 15px; */
} }
select:focus, select:focus,
input[type="date"]:focus { input[type="date"]:focus {
outline: none; outline: none;
box-shadow: 0 0 0 2px #fcd200; box-shadow: 0 0 0 2px var(--accent-gold);
} }
.filters { .filters {
@@ -100,15 +86,14 @@ input[type="date"]:focus {
} }
.filter-select, .filter-date { .filter-select, .filter-date {
background-color: white; background-color: var(--bg-elevated);
border: none; border: none;
border-radius: 2rem; border-radius: 2rem;
padding: 0.5rem 1rem; padding: 0.5rem 1rem;
font-size: 1rem; font-size: 1rem;
color: #333; color: var(--text-primary);
box-shadow: 0 0 3px rgba(0,0,0,0.1); box-shadow: var(--shadow-sm);
appearance: none; appearance: none;
background-image: url('data:image/svg+xml;utf8,<svg fill="gold" ...>...</svg>'); /* usa ícono amarillo aquí */
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: right 0.75rem center; background-position: right 0.75rem center;
background-size: 1rem; background-size: 1rem;
@@ -116,13 +101,13 @@ input[type="date"]:focus {
.filter-select:focus, .filter-date:focus { .filter-select:focus, .filter-date:focus {
outline: none; outline: none;
box-shadow: 0 0 0 2px #FFD700; box-shadow: 0 0 0 2px var(--accent-gold);
} }
.status-button { .status-button {
border: 2px solid; border: 2px solid;
padding: 4px 10px; padding: 4px 10px;
border-radius: 6px; border-radius: var(--radius-sm);
font-weight: bold; font-weight: bold;
text-transform: uppercase; text-transform: uppercase;
font-size: 12px; font-size: 12px;
@@ -130,48 +115,48 @@ input[type="date"]:focus {
} }
.status-button.approve { .status-button.approve {
color: #28a745; color: var(--success);
border-color: #28a745; border-color: var(--success);
background-color: #e6fff0; background-color: rgba(34, 197, 94, 0.12);
} }
.status-button.approved { .status-button.approved {
color: #28a745; color: var(--success);
border-color: #28a745; border-color: var(--success);
background-color: #e6fff0; background-color: rgba(34, 197, 94, 0.12);
} }
.status-button.reject { .status-button.reject {
color: #dc3545; color: var(--error);
border-color: #dc3545; border-color: var(--error);
background-color: #ffe6e6; background-color: rgba(239, 68, 68, 0.12);
} }
.status-button.rejected { .status-button.rejected {
color: #dc3545; color: var(--error);
border-color: #dc3545; border-color: var(--error);
background-color: #ffe6e6; background-color: rgba(239, 68, 68, 0.12);
} }
.status-button.pending { .status-button.pending {
color: #f0ad4e; color: var(--warning);
border-color: #f0ad4e; border-color: var(--warning);
background-color: #fff7e6; background-color: rgba(234, 179, 8, 0.12);
} }
.status-button.paid { .status-button.paid {
color: #28a745; color: var(--success);
border-color: #28a745; border-color: var(--success);
background-color: #e6fff0; background-color: rgba(34, 197, 94, 0.12);
} }
.income-card { .income-card {
background-color: white; background-color: var(--bg-secondary);
border-radius: 15px; border-radius: var(--radius-lg);
padding: 15px 20px; padding: 15px 20px;
min-width: 140px; min-width: 140px;
text-align: center; text-align: center;
box-shadow: 0 1px 4px rgba(0,0,0,0.1); box-shadow: var(--shadow-sm);
align-items: center; align-items: center;
} }
@@ -181,37 +166,26 @@ input[type="date"]:focus {
margin-bottom: 20px; margin-bottom: 20px;
} }
/* .summary-card {
background: #ffffff;
border-radius: 10px;
padding: 10px 20px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
font-size: 1rem;
min-width: 160px;
} */
.summary-card { .summary-card {
background-color: white; background-color: var(--bg-secondary);
border-radius: 12px; border-radius: var(--radius-md);
padding: 15px 25px; padding: 15px 25px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-sm);
min-width: 140px; min-width: 140px;
text-align: center; text-align: center;
color: #333; color: var(--text-primary);
align-items: center; align-items: center;
display: block; display: block;
} }
/*Date*/
.date-filter { .date-filter {
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
align-items: center; align-items: center;
margin-bottom: 20px; margin-bottom: 20px;
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
font-family:'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; font-family: var(--font-sans);
font-weight: bold; font-weight: bold;
} }
@@ -223,17 +197,6 @@ input[type="date"]:focus {
display: flex; display: flex;
align-items: center; align-items: center;
} }
/*
.status-button.approve {
background-color: #8bed92;
border: 1.5px solid #33a544;
color: #33a544;
border-radius: 20px;
padding: 5px 15px;
font-weight: bold;
pointer-events: none;
} */
.page-filters { .page-filters {
display: flex; display: flex;
@@ -245,21 +208,3 @@ input[type="date"]:focus {
.approved-page h2 { .approved-page h2 {
margin-bottom: 10px; margin-bottom: 10px;
} }
/*
.status-button {
border: 2px solid #28a745;
color: #28a745;
padding: 4px 10px;
border-radius: 6px;
font-weight: bold;
background-color: #e6fff0;
}
.status-button.inactive {
border-color: #dc3545;
color: #dc3545;
background-color: #ffe6e6;
}
*/

View File

@@ -2,7 +2,10 @@
width: 100%; width: 100%;
padding: 12px; padding: 12px;
margin: 8px 0; margin: 8px 0;
border-radius: 12px; border-radius: var(--radius-md);
border: 1px solid #ccc; border: 1px solid var(--border-color);
font-size: 1rem; font-size: 1rem;
background-color: var(--bg-elevated);
color: var(--text-primary);
font-family: var(--font-sans);
} }

View File

@@ -5,13 +5,14 @@ import { useNavigate } from 'react-router-dom';
import "../styles/Dashboard.css"; import "../styles/Dashboard.css";
import { AuthContext } from "../context/AuthContext"; import { AuthContext } from "../context/AuthContext";
import { langContext } from "../context/LenguageContext"; import { langContext } from "../context/LenguageContext";
import { useTheme } from "../context/ThemeContext";
import { FaSignOutAlt } from "react-icons/fa"; import { FaSignOutAlt } from "react-icons/fa";
import { menuConfig } from "../constants/menuconfig"; import { menuConfig } from "../constants/menuconfig";
export default function Layout() { export default function Layout() {
const { toggleLang, lang } = useContext(langContext); const { toggleLang, lang } = useContext(langContext);
const { user, logout } = useContext(AuthContext); const { user, logout } = useContext(AuthContext);
console.log('user', user); const { theme, toggleTheme } = useTheme();
const handleLogout = () => { const handleLogout = () => {
logout(); logout();
navigate("/"); navigate("/");
@@ -19,7 +20,6 @@ export default function Layout() {
const menuConfigWithPermissions = Object.values(menuConfig).map(section => ({ const menuConfigWithPermissions = Object.values(menuConfig).map(section => ({
...section, ...section,
hidden: hidden:
section.label === "Dashboards" ? (user >= 1 && user <= 2 ? false : true) :
section.label === "Expenses to be approved" ? (user === 1 || user === 2 ? false : true) : section.label === "Expenses to be approved" ? (user === 1 || user === 2 ? false : true) :
section.label === "Expenses" ? (user >= 1 && user <= 5 ? false : true) : section.label === "Expenses" ? (user >= 1 && user <= 5 ? false : true) :
section.label === "Inventory" ? (user >= 1 && user <= 5 ? false : true) : section.label === "Inventory" ? (user >= 1 && user <= 5 ? false : true) :
@@ -137,10 +137,15 @@ export default function Layout() {
{/* Iconos a la derecha */} {/* Iconos a la derecha */}
<div className="topbar-icons" style={{ display: "flex", alignItems: "center", gap: "1rem" }}> <div className="topbar-icons" style={{ display: "flex", alignItems: "center", gap: "10px" }}>
<button
className="theme-toggle"
onClick={toggleTheme}
title={theme === "dark" ? "Switch to light mode" : "Switch to dark mode"}
>
{theme === "dark" ? "\u2600" : "\u263E"}
</button>
<select <select
className="language-select" className="language-select"
onChange={toggleLang} onChange={toggleLang}
> >
@@ -154,7 +159,7 @@ export default function Layout() {
alignItems: "center", alignItems: "center",
gap: "6px", gap: "6px",
background: "transparent", background: "transparent",
color: "#ffffffff", color: "var(--text-primary)",
border: "none", border: "none",
fontWeight: "bold", fontWeight: "bold",
cursor: "pointer" cursor: "pointer"
@@ -204,7 +209,7 @@ export default function Layout() {
/> />
<p style={{ <p style={{
fontSize: '1.25rem', fontSize: '1.25rem',
color: '#666', color: 'var(--text-secondary)',
textAlign: 'center', textAlign: 'center',
maxWidth: '600px', maxWidth: '600px',
padding: '0 1rem' padding: '0 1rem'
@@ -222,216 +227,3 @@ export default function Layout() {
</div> </div>
); );
} }
// // Layout.jsx
// import React, { use, useContext, useState } from "react";
// import { Outlet, NavLink, useLocation } from "react-router-dom";
// import { useNavigate } from 'react-router-dom';
// import { FaBell, FaCog } from "react-icons/fa";
// import "../styles/Dashboard.css";
// import { AuthContext } from "../context/AuthContext";
// import { langContext } from "../context/LenguageContext";
// import { FaSignOutAlt } from "react-icons/fa";
// export default function Layout() {
// const { toggleLang } = useContext(langContext);
// const { user, logout } = useContext(AuthContext);
// const handleLogout = () => {
// logout();
// navigate("/");
// };
// // const {lang, setLang} = useContext(AuthContext);
// // console.log(lang);
// const menuConfig = [
// {
// label: "Dashboards",
// basePath: "/app/income",
// submenu: [
// { label: "Income", route: "/app/income" },
// // { label: "Expenses", route: "/app/expenses" },
// // { label: "Cost per room", route: "/app/cost-per-room" },
// // { label: "Budget", route: "/app/budget" },
// ],
// hidden: user === 1 ? false : true //Solo admin puede ver dashboards,
// },
// {
// label: "Expenses to be approved",
// basePath: "/app/pending-approval",
// submenu: [
// { label: "Pending approval", route: "/app/pending-approval" },
// { label: "Approved", route: "/app/approved" },
// { label: "Rejected", route: "/app/rejected" },
// ],
// hidden: user === 1 ? false : true
// },
// {
// label: "Expenses",
// basePath: "/app/report-expense",
// submenu: [
// { label: "Report", route: "/app/report-expense" },
// { label: "New Expense", route: "/app/new-expense" },
// { label: "Payments", route: "/app/payments" },
// { label: "Monthly Payments", route: "/app/monthly-payments" },
// { label: "New Monthly Payments", route: "/app/new-monthly" },
// { label: "Purchase Entries", route: "/app/purchase-entries" },
// ],
// hidden: user >= 1 && user <= 3 ? false : true
// },
// {
// label: "Inventory",
// basePath: "/app/products",
// submenu: [
// { label: "Products", route: "/app/products", hidden: user === 5 ? true : false },
// { label: "New Product", route: "/app/new-product", hidden: user === 5 ? true : false },
// { label: "Report", route: "/app/inventory-report", hidden: user === 5 ? true : false },
// { label: "Discard Product", route: "/app/discard-product", hidden: user === 5 ? true : false },
// { label: "Adjustments", route: "/app/product-adjustments", hidden: user === 5 ? true : false }
// ],
// hidden: user >= 1 && user <= 4 ? false : true
// },
// {
// label: "Payroll",
// basePath: "/app/payroll",
// submenu: [
// { label: "Report", route: "/app/payroll" },
// { label: "New Contract", route: "/app/payroll/NewPayRoll"},
// { label: "Attendance", route: "/app/payroll/attendance" },
// { label: "Employees", route: "/app/payroll/employees" },
// { label: "New Employee", route: "/app/payroll/newemployee" },
// ],
// hidden: user >= 1 && user <= 3 ? false : true
// },
// {
// label: "Hotel",
// basePath: "/app/properties",
// submenu: [
// { label: "Properties", route: "/app/properties" },
// ],
// hidden: user === 1 ? false : true
// },
// //SECCIÓN "OCULTA" PARA SETTINGS
// {
// label: "Settings",
// basePath: "/app/settings",
// submenu: [
// { label: "General", route: "/app/settings" },
// { label: "Users", route: "/app/settings/users" },
// { label: "Units", route: "/app/settings/roles" },
// { label: "Room management", route: "/app/settings/room-management" },
// ],
// hidden: true, //etiqueta para ignorar en sidebar
// },
// ];
// const navigate = useNavigate();
// const location = useLocation();
// const [isSidebarOpen, setSidebarOpen] = useState(true);
// const toggleSidebar = () => setSidebarOpen(!isSidebarOpen);
// const isDetailPage = /^\/app\/properties\/\d+$/.test(location.pathname);
// //Identificar la sección activa, incluyendo settings
// const activeSection = menuConfig.find(section =>
// section.submenu.some(item => location.pathname.startsWith(item.route))
// );
// const activeSubmenu = activeSection?.submenu || [];
// return (
// <div className="dashboard-layout">
// {/* Sidebar */}
// {isSidebarOpen && (
// <aside className="sidebar">
// <nav>
// {/*sSolo se muestran secciones que no están ocultas */}
// {menuConfig
// .filter(section => !section.hidden)
// .map((section, index) => (
// <NavLink key={index} to={section.basePath}>
// {section.label}
// </NavLink>
// ))}
// </nav>
// </aside>
// )}
// {/* Main content */}
// <div className="main-content">
// {/* Topbar */}
// <div className="topbar">
// <div className="topbar-header" style={{ display: "flex", justifyContent: "space-between", alignItems: "center" }}>
// {/* Botón + Título (alineados a la izquierda) */}
// <div style={{ display: "flex", alignItems: "center", gap: "1rem" }}>
// <button onClick={toggleSidebar} className="sidebar-toggle-button">
// ☰
// </button>
// <div className="topbar-title">{activeSection?.label}</div>
// </div>
// {/* Iconos a la derecha */}
// <div className="topbar-icons" style={{ display: "flex", alignItems: "center", gap: "1rem" }}>
// <FaBell className="topbar-icon" />
// <FaCog
// className="topbar-icon cursor-pointer"
// onClick={() => navigate("/app/settings")}
// />
// <select
// className="language-select"
// onChange={toggleLang}
// >
// <option value="en">EN</option>
// <option value="es">ES</option>
// </select>
// <button
// onClick={handleLogout}
// style={{
// display: "flex",
// alignItems: "center",
// gap: "6px",
// background: "transparent",
// color: "#ffffffff",
// border: "none",
// fontWeight: "bold",
// cursor: "pointer"
// }}
// >
// <FaSignOutAlt className="topbar-icon" />
// </button>
// </div>
// </div>
// {/* Submenú (solo si no es página de detalle) */}
// {!isDetailPage && (
// <div className="topbar-submenu">
// {activeSubmenu.filter(section => !section.hidden).map((item, index) => (
// <NavLink
// key={index}
// to={item.route}
// className={({ isActive }) =>
// isActive ? "submenu-link active" : "submenu-link"
// }
// >
// {item.label}
// </NavLink>
// ))}
// </div>
// )}
// </div>
// {/* Página actual */}
// <div className="content">
// <Outlet />
// </div>
// </div>
// </div>
// );
// }

View File

@@ -1,12 +1,10 @@
/* components/Modals/ConfirmationModal.css */
.modal-overlay { .modal-overlay {
position: fixed; position: fixed;
top: 0; top: 0;
left: 0; left: 0;
width: 100%; width: 100%;
height: 100%; height: 100%;
background-color: rgba(122, 0, 41, 0.6); background-color: rgba(0, 0, 0, 0.6);
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@@ -14,29 +12,30 @@
} }
.modal { .modal {
background: white; background: var(--bg-secondary);
padding: 30px; padding: 30px;
border-radius: 6px; border-radius: var(--radius-sm);
width: 450px; width: 450px;
max-width: 95%; max-width: 95%;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.4); box-shadow: var(--shadow-lg);
border: 5px solid #7a0029; border: 2px solid var(--accent-gold);
} }
.modal-header { .modal-header {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
color: white; color: var(--bg-primary);
background-color: #7a0029; background-color: var(--accent-gold);
padding: 15px 20px; padding: 15px 20px;
border-radius: 5px 5px 0 0; border-radius: var(--radius-sm) var(--radius-sm) 0 0;
} }
.modal-body { .modal-body {
padding: 20px; padding: 20px;
font-size: 16px; font-size: 16px;
text-align: center; text-align: center;
color: var(--text-primary);
} }
.modal-buttons { .modal-buttons {
@@ -50,24 +49,24 @@
padding: 10px 25px; padding: 10px 25px;
font-size: 18px; font-size: 18px;
border-radius: 30px; border-radius: 30px;
border: 2px solid #7a0029; border: 2px solid var(--accent-gold);
cursor: pointer; cursor: pointer;
min-width: 100px; min-width: 100px;
} }
.modal-button.yes { .modal-button.yes {
color: green; color: var(--success);
background-color: white; background-color: var(--bg-secondary);
} }
.modal-button.no { .modal-button.no {
color: #7a0029; color: var(--accent-gold);
background-color: white; background-color: var(--bg-secondary);
} }
.close-button { .close-button {
font-size: 24px; font-size: 24px;
color: white; color: var(--bg-primary);
background: none; background: none;
border: none; border: none;
cursor: pointer; cursor: pointer;

View File

@@ -13,19 +13,19 @@
} }
.discard-modal-box { .discard-modal-box {
background: white; background: var(--bg-secondary);
padding: 0; padding: 0;
border-radius: 12px; border-radius: var(--radius-md);
width: 450px; width: 450px;
max-width: 90%; max-width: 90%;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); box-shadow: var(--shadow-lg);
animation: slideUp 0.3s ease-out; animation: slideUp 0.3s ease-out;
overflow: hidden; overflow: hidden;
} }
.discard-modal-header { .discard-modal-header {
background-color: #7a0029; background-color: var(--accent-gold);
color: white; color: var(--bg-primary);
padding: 20px; padding: 20px;
text-align: center; text-align: center;
} }
@@ -39,7 +39,7 @@
.discard-modal-body { .discard-modal-body {
padding: 24px; padding: 24px;
text-align: center; text-align: center;
color: #213547; color: var(--text-primary);
font-size: 1rem; font-size: 1rem;
line-height: 1.5; line-height: 1.5;
} }
@@ -52,13 +52,13 @@
display: flex; display: flex;
gap: 12px; gap: 12px;
padding: 20px 24px; padding: 20px 24px;
border-top: 1px solid #e2e8f0; border-top: 1px solid var(--border-color);
justify-content: flex-end; justify-content: flex-end;
} }
.discard-modal-button { .discard-modal-button {
padding: 10px 24px; padding: 10px 24px;
border-radius: 8px; border-radius: var(--radius-sm);
font-size: 1rem; font-size: 1rem;
font-weight: 600; font-weight: 600;
cursor: pointer; cursor: pointer;
@@ -68,21 +68,21 @@
} }
.discard-modal-button-cancel { .discard-modal-button-cancel {
background-color: #e2e8f0; background-color: var(--bg-elevated);
color: #4a5568; color: var(--text-secondary);
} }
.discard-modal-button-cancel:hover { .discard-modal-button-cancel:hover {
background-color: #cbd5e0; background-color: var(--border-color);
} }
.discard-modal-button-confirm { .discard-modal-button-confirm {
background-color: #7a0029; background-color: var(--accent-gold);
color: white; color: var(--bg-primary);
} }
.discard-modal-button-confirm:hover { .discard-modal-button-confirm:hover {
background-color: #5a001f; background-color: var(--accent-gold-hover);
} }
.discard-modal-button:active { .discard-modal-button:active {
@@ -108,4 +108,3 @@
transform: translateY(0); transform: translateY(0);
} }
} }

View File

@@ -12,18 +12,18 @@
} }
.modal-box { .modal-box {
background: white; background: var(--bg-secondary);
padding: 30px; padding: 30px;
border-radius: 10px; border-radius: var(--radius-md);
width: 350px; width: 350px;
max-width: 90%; max-width: 90%;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25); box-shadow: var(--shadow-lg);
} }
.modal-box h3 { .modal-box h3 {
margin-top: 0; margin-top: 0;
margin-bottom: 15px; margin-bottom: 15px;
color: #111; color: var(--text-primary);
text-align: center; text-align: center;
} }
@@ -32,26 +32,27 @@
padding: 12px; padding: 12px;
margin-bottom: 15px; margin-bottom: 15px;
border: none; border: none;
border-radius: 12px; border-radius: var(--radius-md);
background: #f1f1f1; background: var(--bg-elevated);
font-size: 14px; font-size: 14px;
color: var(--text-primary);
} }
.btn { .btn {
width: 100%; width: 100%;
padding: 12px; padding: 12px;
border: none; border: none;
border-radius: 6px; border-radius: var(--radius-sm);
font-weight: 600; font-weight: 600;
margin-bottom: 10px; margin-bottom: 10px;
cursor: pointer; cursor: pointer;
} }
.btn--primary { .btn--primary {
background-color: #8b0000; background-color: var(--accent-gold);
color: white; color: var(--bg-primary);
} }
.btn--primary:hover { .btn--primary:hover {
background-color: #a00000; background-color: var(--accent-gold-hover);
} }

View File

@@ -1,12 +1,10 @@
z/* src/styles/Navbar.css */
.navbar { .navbar {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
background-color: #4a0d0d; /* Marrón oscuro */ background-color: var(--bg-surface);
padding: 12px 20px; padding: 12px 20px;
color: white; color: var(--text-primary);
} }
.navbar__brand { .navbar__brand {
@@ -20,13 +18,13 @@ z/* src/styles/Navbar.css */
} }
.nav__link { .nav__link {
color: white; color: var(--text-primary);
text-decoration: none; text-decoration: none;
font-size: 0.95rem; font-size: 0.95rem;
} }
.nav__link.active { .nav__link.active {
border-bottom: 2px solid #f8d47b; /* Amarillo suave */ border-bottom: 2px solid var(--accent-gold);
} }
.navbar__actions { .navbar__actions {
@@ -37,17 +35,17 @@ z/* src/styles/Navbar.css */
.btn { .btn {
padding: 6px 12px; padding: 6px 12px;
border: none; border: none;
border-radius: 6px; border-radius: var(--radius-sm);
cursor: pointer; cursor: pointer;
font-size: 0.9rem; font-size: 0.9rem;
} }
.btn--primary { .btn--primary {
background-color: #f8d47b; /* Amarillo */ background-color: var(--accent-gold);
color: #4a0d0d; color: var(--bg-primary);
} }
.btn--secondary { .btn--secondary {
background-color: #ddd; background-color: var(--bg-elevated);
color: #333; color: var(--text-primary);
} }

View File

@@ -1,23 +1,23 @@
.summary-card-enhanced { .summary-card-enhanced {
background: linear-gradient(145deg, #ffffff, #f8f9fa); background: var(--bg-secondary);
border-radius: 16px; border-radius: var(--radius-lg);
padding: 20px 24px; padding: 20px 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-sm);
min-width: 180px; min-width: 180px;
flex: 1; flex: 1;
transition: all 0.3s ease; transition: all 0.3s ease;
border: 1px solid rgba(0, 0, 0, 0.05); border: 1px solid var(--border-color);
} }
.summary-card-enhanced:hover { .summary-card-enhanced:hover {
transform: translateY(-2px); transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12); box-shadow: var(--shadow-md);
} }
.summary-card-enhanced.primary { .summary-card-enhanced.primary {
background: linear-gradient(145deg, #ffffff, #f8f9fa); background: var(--bg-secondary);
color: #333; color: var(--text-primary);
border: 1px solid rgba(0, 0, 0, 0.05); border: 1px solid var(--border-color);
} }
.card-header { .card-header {
@@ -32,13 +32,13 @@
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.5px; letter-spacing: 0.5px;
margin: 0; margin: 0;
color: #666; color: var(--text-secondary);
} }
.card-amount { .card-amount {
font-size: 28px; font-size: 28px;
font-weight: 700; font-weight: 700;
color: #333; color: var(--text-primary);
margin: 8px 0; margin: 8px 0;
line-height: 1.2; line-height: 1.2;
} }
@@ -46,10 +46,10 @@
.card-percentage { .card-percentage {
font-size: 16px; font-size: 16px;
font-weight: 600; font-weight: 600;
color: #28a745; color: var(--success);
margin-top: 8px; margin-top: 8px;
padding-top: 8px; padding-top: 8px;
border-top: 1px solid rgba(0, 0, 0, 0.1); border-top: 1px solid var(--border-color);
} }
.card-loading { .card-loading {
@@ -62,8 +62,8 @@
.loading-spinner { .loading-spinner {
width: 40px; width: 40px;
height: 40px; height: 40px;
border: 4px solid rgba(0, 0, 0, 0.1); border: 4px solid var(--border-color);
border-top-color: #fcd200; border-top-color: var(--accent-gold);
border-radius: 50%; border-radius: 50%;
animation: spin 0.8s linear infinite; animation: spin 0.8s linear infinite;
} }
@@ -97,4 +97,3 @@
font-size: 12px; font-size: 12px;
} }
} }

View File

@@ -1,167 +1,98 @@
/* .custom-table {
width: 100%;
border-collapse: collapse;
font-family:'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif;
}
.custom-table thead tr {
background-color: #7b001a;
color: white;
}
.custom-table th,
.custom-table td {
padding: 10px 15px;
border: 2px solid #ffcc00;
text-align: left;
}
.custom-table tbody tr {
background-color: #ffffff;
color: black;
}
.status-badge {
padding: 5px 10px;
border-radius: 14px;
font-weight: bold;
display: inline-block;
text-align: center;
}
.status-badge.active {
color: green;
border: 1px solid green;
background-color: rgba(0, 128, 0, 0.192);
}
.status-badge.reject {
color: red;
border: 1px solid rgb(190, 4, 4);
background-color: rgba(255, 0, 0, 0.171);
}
.status-badge.pending {
color: rgb(128, 83, 0);
border: 1px solid rgb(235, 158, 15);
background-color: rgba(248, 176, 42, 0.76);
}
.status-button.approve {
background-color: #009e2db0;
color: white;
border: none;
padding: 4px 12px;
border-radius: 2px;
font-weight: bold;
}
.status-button.reject {
background-color: #d80404b0;
color: white;
border: none;
padding: 4px 12px;
border-radius: 2px;
font-weight: bold;
} */
.custom-table { .custom-table {
width: 100%; width: 100%;
border-collapse: collapse; border-collapse: collapse;
/* font-family:'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif; */ font-family: var(--font-sans);
font-family: 'Franklin Gothic', 'Arial Narrow', Monserrat, sans-serif
} }
.custom-table thead tr { .custom-table thead tr {
background-color: #7b001a; background-color: var(--accent-gold);
color: white; color: var(--bg-primary);
} }
/*Bordes de línea*/
.custom-table th, .custom-table th,
.custom-table td { .custom-table td {
padding: 10px 15px; padding: 10px 15px;
border: 2px solid #ffcc00; border: 2px solid var(--accent-gold);
text-align: left; text-align: left;
} }
.custom-table tbody tr { .custom-table tbody tr {
font-family: montserrat; font-family: var(--font-sans);
background-color: #ffffff; background-color: var(--bg-secondary);
color: #515151; color: var(--text-primary);
} }
.status-badge { .status-badge {
padding: 5px 10px; padding: 5px 10px;
border-radius: 14px; border-radius: var(--radius-lg);
font-weight: bold; font-weight: bold;
display: inline-block; display: inline-block;
text-align: center; text-align: center;
} }
.status-badge.active { .status-badge.active {
color: green; color: var(--success);
border: 1px solid green; border: 1px solid var(--success);
background-color: rgba(0, 128, 0, 0.192); background-color: rgba(34, 197, 94, 0.12);
} }
.status-badge.reject { .status-badge.reject {
color: red; color: var(--error);
border: 1px solid rgb(190, 4, 4); border: 1px solid var(--error);
background-color: rgba(255, 0, 0, 0.171); background-color: rgba(239, 68, 68, 0.12);
} }
.status-badge.pending { .status-badge.pending {
color: rgb(128, 83, 0); color: var(--warning);
border: 1px solid rgb(235, 158, 15); border: 1px solid var(--warning);
background-color: rgba(248, 176, 42, 0.76); background-color: rgba(234, 179, 8, 0.12);
} }
.status-badge.paid { .status-badge.paid {
color: green; color: var(--success);
border: 1px solid green; border: 1px solid var(--success);
background-color: rgba(0, 128, 0, 0.192); background-color: rgba(34, 197, 94, 0.12);
} }
.status-button.approve { .status-button.approve {
background-color: #009e2db0; background-color: var(--success);
color: white; color: var(--bg-primary);
border: none; border: none;
padding: 4px 12px; padding: 4px 12px;
border-radius: 2px; border-radius: var(--radius-sm);
font-weight: bold; font-weight: bold;
} }
.status-button.reject { .status-button.reject {
background-color: #d80404b0; background-color: var(--error);
color: white; color: var(--bg-primary);
border: none; border: none;
padding: 4px 12px; padding: 4px 12px;
border-radius: 2px; border-radius: var(--radius-sm);
font-weight: bold; font-weight: bold;
} }
.status-button.pending { .status-button.pending {
background-color: #e2c000; background-color: var(--warning);
color: white; color: var(--bg-primary);
border: none; border: none;
padding: 4px 12px; padding: 4px 12px;
border-radius: 2px; border-radius: var(--radius-sm);
font-weight: bold; font-weight: bold;
} }
.status-button.paid { .status-button.paid {
background-color: #009e2db0; background-color: var(--success);
color: white; color: var(--bg-primary);
border: none; border: none;
padding: 4px 12px; padding: 4px 12px;
border-radius: 2px; border-radius: var(--radius-sm);
font-weight: bold; font-weight: bold;
} }
.add-button { .add-button {
background-color: transparent; background-color: transparent;
color: #7b001a; color: var(--accent-gold);
font-weight: bold; font-weight: bold;
border: none; border: none;
cursor: pointer; cursor: pointer;
@@ -172,10 +103,8 @@
text-decoration: underline; text-decoration: underline;
} }
/*Icono de flecha*/
.custom-table a:hover { .custom-table a:hover {
color: #0055aa; color: var(--info);
} }
.custom-table a:hover svg { .custom-table a:hover svg {

View File

@@ -11,20 +11,6 @@ export const menuConfig = {
{ label: "Guests", spanish_label: "Huespedes", route: "/app/guests" }, { label: "Guests", spanish_label: "Huespedes", route: "/app/guests" },
], ],
}, },
dashboards: {
label: "Dashboards",
spanish_label: "Tableros",
basePath: "/app/income",
submenu: [
{ label: "Little Hotelier", spanish_label: "Little Hotelier", route: "/app/income" },
{ label: "Hotel P&L", spanish_label: "P&L Hotel", route: "/app/hotelpl" },
{ label: "Room Analysis", spanish_label: "Análisis de Habitaciones", route: "/app/room-analysis" },
{ label: "P&L Restaurant", spanish_label: "P&L Restaurante", route: "/app/restaurantpl" },
{ label: "Restaurant Analysis", spanish_label: "Análisis de Restaurante", route: "/app/restaurant-analysis" },
// { label: "Budget", spanish_label: "Presupuesto", route: "/app/budget" },
// { label: "Expenses", spanish_label: "Gastos", route: "/app/expenses" },
],
},
housekeeper: { housekeeper: {
label: "Housekeeper", label: "Housekeeper",
spanish_label: "Cuidador de Habitaciones", spanish_label: "Cuidador de Habitaciones",

View File

@@ -0,0 +1,30 @@
import React, { createContext, useContext, useState, useEffect } from "react";
const ThemeContext = createContext();
export function ThemeProvider({ children }) {
const [theme, setTheme] = useState(() => {
return localStorage.getItem("hotel-theme") || "dark";
});
useEffect(() => {
document.documentElement.setAttribute("data-theme", theme);
localStorage.setItem("hotel-theme", theme);
}, [theme]);
const toggleTheme = () => {
setTheme((prev) => (prev === "dark" ? "light" : "dark"));
};
return (
<ThemeContext.Provider value={{ theme, toggleTheme }}>
{children}
</ThemeContext.Provider>
);
}
export function useTheme() {
const ctx = useContext(ThemeContext);
if (!ctx) throw new Error("useTheme must be used within ThemeProvider");
return ctx;
}

View File

@@ -1,19 +1,21 @@
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap'); @import url('https://fonts.googleapis.com/css2?family=Syne:wght@400;500;600;700;800&family=DM+Sans:ital,opsz,wght@0,9..40,100..1000;1,9..40,100..1000&family=JetBrains+Mono:wght@400;500;600;700&display=swap');
@tailwind base; @tailwind base;
@tailwind components; @tailwind components;
@tailwind utilities; @tailwind utilities;
*,
*::before,
*::after {
box-sizing: border-box;
}
:root { body {
font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; margin: 0;
line-height: 1.5; padding: 0;
font-weight: 400; min-width: 320px;
min-height: 100vh;
color-scheme: light dark; overflow-x: hidden;
color: rgba(255, 255, 255, 0.87);
background-color: #242424;
font-synthesis: none; font-synthesis: none;
text-rendering: optimizeLegibility; text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
@@ -22,76 +24,16 @@
a { a {
font-weight: 500; font-weight: 500;
color: #cc0404de; color: var(--accent-gold);
text-decoration: inherit; text-decoration: none;
} }
a:hover { a:hover {
color: #ff8513; color: var(--accent-gold-hover);
}
/*
body {
margin: 0;
display: flex;
place-items: center;
min-width: 320px;
min-height: 100vh;
margin: 0;
padding: 0;
overflow: hidden;
height: 100vh;
}
*/
body {
margin: 0;
padding: 0;
min-width: 320px;
min-height: 100vh;
height: auto;
overflow-x: hidden;
background-color: #f5f5f5;
display: block;
} }
h1 { h1 {
font-size: 3.2em; font-size: 2.4rem;
line-height: 1.1; line-height: 1.1;
} font-family: var(--font-display);
button {
border-radius: 8px;
border: 1px solid transparent;
padding: 0.6em 1.2em;
font-size: 1em;
font-weight: 500;
font-family: inherit;
background-color: #1a1a1a;
cursor: pointer;
transition: border-color 0.25s;
}
button:hover {
border-color: #791002;
}
button:focus,
button:focus-visible {
outline: 4px auto -webkit-focus-ring-color;
}
@media (prefers-color-scheme: light) {
:root {
color: #213547;
background-color: #ffffff;
}
a:hover {
color: #640f04;
}
button {
background-color: #f9f9f9;
}
} }

View File

@@ -3,14 +3,14 @@ import React from "react";
import ReactDOM from "react-dom/client"; import ReactDOM from "react-dom/client";
import { BrowserRouter } from "react-router-dom"; import { BrowserRouter } from "react-router-dom";
import App from "./App.jsx"; import App from "./App.jsx";
//import { AuthProvider } from "./context/AuthContext.jsx";
import "./styles/global.css"; import "./styles/global.css";
import './index.css'; // o './styles/tailwind.css' import './index.css';
import { AuthProvider } from "./context/AuthContext.jsx"; import { AuthProvider } from "./context/AuthContext.jsx";
import { LangProvider } from "./context/LenguageContext.jsx"; import { LangProvider } from "./context/LenguageContext.jsx";
import { ThemeProvider } from "./context/ThemeContext.jsx";
ReactDOM.createRoot(document.getElementById("root")).render( ReactDOM.createRoot(document.getElementById("root")).render(
<ThemeProvider>
<LangProvider> <LangProvider>
<AuthProvider> <AuthProvider>
<BrowserRouter> <BrowserRouter>
@@ -18,5 +18,5 @@ ReactDOM.createRoot(document.getElementById("root")).render(
</BrowserRouter> </BrowserRouter>
</AuthProvider> </AuthProvider>
</LangProvider> </LangProvider>
</ThemeProvider>
); );

View File

@@ -8,7 +8,7 @@
} }
.page-title { .page-title {
color: #1a1a1a; color: var(--text-primary);
font-size: 28px; font-size: 28px;
font-weight: 700; font-weight: 700;
margin: 0; margin: 0;
@@ -21,14 +21,14 @@
justify-content: center; justify-content: center;
align-items: center; align-items: center;
padding: 60px 20px; padding: 60px 20px;
color: #666; color: var(--text-secondary);
} }
.loading-spinner { .loading-spinner {
width: 40px; width: 40px;
height: 40px; height: 40px;
border: 4px solid #f3f3f3; border: 4px solid var(--border-color);
border-top: 4px solid #5D1A2A; border-top: 4px solid var(--accent-gold);
border-radius: 50%; border-radius: 50%;
animation: spin 1s linear infinite; animation: spin 1s linear infinite;
} }
@@ -46,19 +46,19 @@
} }
.pl-section { .pl-section {
background-color: white; background-color: var(--bg-secondary);
border-radius: 8px; border-radius: var(--radius-sm);
padding: 24px; padding: 24px;
box-shadow: 0 1px 3px rgba(0,0,0,0.1); box-shadow: var(--shadow-sm);
border: 1px solid #e5e7eb; border: 1px solid var(--border-color);
} }
.section-title { .section-title {
margin: 0 0 20px 0; margin: 0 0 20px 0;
font-size: 22px; font-size: 22px;
font-weight: 600; font-weight: 600;
color: #374151; color: var(--text-primary);
border-bottom: 2px solid #5D1A2A; border-bottom: 2px solid var(--accent-gold);
padding-bottom: 10px; padding-bottom: 10px;
} }
@@ -68,7 +68,7 @@
gap: 16px; gap: 16px;
align-items: center; align-items: center;
margin: 0 0 20px 0; margin: 0 0 20px 0;
border-bottom: 2px solid #5D1A2A; border-bottom: 2px solid var(--accent-gold);
padding-bottom: 10px; padding-bottom: 10px;
} }
@@ -81,7 +81,7 @@
.section-header-percentage { .section-header-percentage {
font-size: 16px; font-size: 16px;
font-weight: 700; font-weight: 700;
color: #5D1A2A; color: var(--accent-gold);
text-align: left; text-align: left;
padding-left: 212px; padding-left: 212px;
} }
@@ -111,38 +111,37 @@
.form-label { .form-label {
font-weight: 600; font-weight: 600;
font-size: 16px; font-size: 16px;
color: #374151; color: var(--text-primary);
min-width: 200px; min-width: 200px;
flex-shrink: 0; flex-shrink: 0;
} }
.form-label.label-bold { .form-label.label-bold {
font-weight: 900; font-weight: 900;
color: #000; color: var(--text-primary);
font-size: 18px; font-size: 18px;
} }
.form-input { .form-input {
width: 100%; width: 100%;
padding: 10px 12px; padding: 10px 12px;
border: 1px solid #d1d5db; border: 1px solid var(--border-color);
border-radius: 6px; border-radius: var(--radius-sm);
font-size: 16px; font-size: 16px;
background-color: #f9fafb; background-color: var(--bg-elevated);
color: #111827; color: var(--text-primary);
font-weight: 500; font-weight: 500;
box-sizing: border-box; box-sizing: border-box;
} }
.form-input:focus { .form-input:focus {
outline: none; outline: none;
border-color: #5D1A2A; border-color: var(--accent-gold);
} }
.form-input.highlight { .form-input.highlight {
background-color: #fef3c7; background-color: var(--accent-gold-muted);
border-color: #fbbf24; border-color: var(--accent-gold);
font-weight: 700; font-weight: 700;
font-size: 15px; font-size: 15px;
} }
@@ -150,7 +149,7 @@
.no-data-message { .no-data-message {
text-align: center; text-align: center;
padding: 40px 20px; padding: 40px 20px;
color: #9ca3af; color: var(--text-muted);
font-size: 14px; font-size: 14px;
} }
@@ -209,7 +208,6 @@
} }
} }
/* Metrics Grid Styles */
.metrics-grid { .metrics-grid {
display: grid; display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
@@ -218,21 +216,21 @@
} }
.metric-card { .metric-card {
background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%); background: var(--bg-secondary);
border-radius: 16px; border-radius: var(--radius-lg);
padding: 24px; padding: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: var(--shadow-sm);
border: 1px solid rgba(0, 0, 0, 0.05); border: 1px solid var(--border-color);
transition: all 0.2s ease; transition: all 0.2s ease;
} }
.metric-card:hover { .metric-card:hover {
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-md);
transform: translateY(-2px); transform: translateY(-2px);
} }
.metric-card h3 { .metric-card h3 {
color: #1a1a1a; color: var(--text-primary);
font-size: 16px; font-size: 16px;
font-weight: 600; font-weight: 600;
margin: 0 0 16px 0; margin: 0 0 16px 0;
@@ -251,29 +249,29 @@
.count-value { .count-value {
font-size: 32px; font-size: 32px;
font-weight: 700; font-weight: 700;
color: #1a1a1a; color: var(--text-primary);
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
} }
.currency-value { .currency-value {
font-size: 28px; font-size: 28px;
font-weight: 700; font-weight: 700;
color: #1a1a1a; color: var(--text-primary);
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
} }
.total-value { .total-value {
color: #5D1A2A; color: var(--accent-gold);
font-size: 32px; font-size: 32px;
} }
.loading-skeleton { .loading-skeleton {
width: 120px; width: 120px;
height: 40px; height: 40px;
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%); background: linear-gradient(90deg, var(--bg-elevated) 25%, var(--border-color) 50%, var(--bg-elevated) 75%);
background-size: 200% 100%; background-size: 200% 100%;
animation: loading 1.5s infinite; animation: loading 1.5s infinite;
border-radius: 4px; border-radius: var(--radius-sm);
} }
@keyframes loading { @keyframes loading {

View File

@@ -8,7 +8,7 @@
} }
.page-title { .page-title {
color: #1a1a1a; color: var(--text-primary);
font-size: 28px; font-size: 28px;
font-weight: 700; font-weight: 700;
margin: 0; margin: 0;
@@ -17,12 +17,12 @@
} }
.summary-section { .summary-section {
background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%); background: var(--bg-primary);
border-radius: 20px; border-radius: var(--radius-xl);
padding: 24px; padding: 24px;
margin-bottom: 32px; margin-bottom: 32px;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06); box-shadow: var(--shadow-sm);
border: 1px solid rgba(0, 0, 0, 0.05); border: 1px solid var(--border-color);
} }
.summary-cards-wrapper { .summary-cards-wrapper {
@@ -32,10 +32,10 @@
} }
.table-section { .table-section {
background: white; background: var(--bg-secondary);
border-radius: 16px; border-radius: var(--radius-lg);
padding: 24px; padding: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-sm);
min-height: 400px; min-height: 400px;
} }
@@ -51,14 +51,14 @@
.loading-spinner-large { .loading-spinner-large {
width: 60px; width: 60px;
height: 60px; height: 60px;
border: 5px solid rgba(0, 0, 0, 0.1); border: 5px solid var(--border-color);
border-top-color: #fcd200; border-top-color: var(--accent-gold);
border-radius: 50%; border-radius: 50%;
animation: spin 0.8s linear infinite; animation: spin 0.8s linear infinite;
} }
.table-loading p { .table-loading p {
color: #666; color: var(--text-secondary);
font-size: 16px; font-size: 16px;
font-weight: 500; font-weight: 500;
margin: 0; margin: 0;
@@ -105,7 +105,7 @@
.summary-section { .summary-section {
padding: 16px; padding: 16px;
border-radius: 16px; border-radius: var(--radius-lg);
} }
.summary-cards-wrapper { .summary-cards-wrapper {
@@ -115,7 +115,7 @@
.table-section { .table-section {
padding: 16px; padding: 16px;
border-radius: 12px; border-radius: var(--radius-md);
} }
.table-loading { .table-loading {
@@ -141,4 +141,3 @@
padding: 12px; padding: 12px;
} }
} }

View File

@@ -1,12 +1,13 @@
.new-expense-container { .new-expense-container {
color: #333; color: var(--text-primary);
padding: 20px;
} }
.form-card { .form-card {
background-color: #fff; background-color: var(--bg-secondary);
border-radius: 10px; border-radius: var(--radius-sm);
padding: 20px; padding: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-sm);
} }
.form-header { .form-header {
@@ -19,33 +20,11 @@
.form-id { .form-id {
font-weight: bold; font-weight: bold;
font-size: 18px; font-size: 18px;
} margin-bottom: 10px;
.back-button {
background-color: #6c757d;
color: #fff;
border: none;
padding: 8px 16px;
border-radius: 4px;
cursor: pointer;
display: flex;
align-items: center;
gap: 5px;
font-size: 14px;
transition: background-color 0.2s;
}
.back-button:hover {
background-color: #5a6268;
}
.back-button:active {
background-color: #545b62;
} }
.form-grid { .form-grid {
display: grid; display: grid;
/* grid-template-columns: repeat(3, 1fr); */
grid-template-columns: 1fr 1fr; grid-template-columns: 1fr 1fr;
gap: 15px; gap: 15px;
margin-bottom: 30px; margin-bottom: 30px;
@@ -56,72 +35,42 @@
font-size: 14px; font-size: 14px;
margin-bottom: 5px; margin-bottom: 5px;
display: block; display: block;
color: #333; color: var(--text-primary);
} }
.form-grid input, .form-grid input,
.form-grid select { .form-grid select {
width: 100%; width: 100%;
padding: 6px 4px; padding: 6px 4px;
border: 1px solid #ccc; border: 1px solid var(--border-color);
border-radius: 6px; border-radius: var(--radius-sm);
font-size: 14px; font-size: 14px;
background-color: #f9f9f9; background-color: var(--bg-elevated);
color: var(--text-primary);
} }
.save-button-wrapper { .back-button {
display: flex; background-color: var(--bg-elevated);
justify-content: flex-end; color: var(--text-primary);
margin-top: 20px;
}
.save-button {
background-color: #ffcb05;
color: #fff;
padding: 10px 30px;
font-weight: bold;
border: none; border: none;
border-radius: 25px; padding: 8px 16px;
font-size: 16px; border-radius: var(--radius-sm);
cursor: pointer; cursor: pointer;
transition: background-color 0.3s ease; display: flex;
align-items: center;
gap: 5px;
font-size: 14px;
transition: background-color 0.2s;
} }
.save-button:hover { .back-button:hover {
background-color: #f4b400; background-color: var(--bg-surface);
} }
.product-table-section { .back-button:active {
margin-top: 25px; background-color: var(--bg-surface);
} }
/*Actualización de New Expense con tabla*/
/* src/pages/Expenses/NewExpense.css */
.new-expense-container {
padding: 20px;
}
.form-card {
background-color: #fff;
border-radius: 8px;
padding: 24px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
.form-id {
font-weight: bold;
margin-bottom: 10px;
}
/* .form-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 20px;
} */
.save-button-wrapper { .save-button-wrapper {
margin-top: 20px; margin-top: 20px;
display: flex; display: flex;
@@ -129,13 +78,18 @@
} }
.save-button { .save-button {
background-color: #ffc107; /* amarillo/dorado */ background-color: var(--accent-gold);
color: #000; /* ajustar según contraste */ color: #000;
border: none; border: none;
padding: 10px 24px; padding: 10px 24px;
border-radius: 20px; border-radius: 20px;
font-weight: bold; font-weight: bold;
cursor: pointer; cursor: pointer;
transition: background-color 0.3s ease;
}
.save-button:hover {
background-color: var(--accent-gold-hover);
} }
.product-table-section { .product-table-section {
@@ -149,34 +103,34 @@
} }
.product-table th, .product-table td { .product-table th, .product-table td {
border: 1px solid #d4af37; /* dorado */ border: 1px solid var(--accent-gold);
padding: 8px; padding: 8px;
text-align: center; text-align: center;
} }
.product-table th { .product-table th {
background-color: #800020; /* bordo/morado oscuro, según tus imágenes */ background-color: var(--accent-gold);
color: white; color: #000;
font-weight: bold; font-weight: bold;
} }
.add-product-row { .add-product-row {
cursor: pointer; cursor: pointer;
color: #d4af37; /* dorado */ color: var(--accent-gold);
text-align: center; text-align: center;
padding: 10px; padding: 10px;
font-style: italic; font-style: italic;
} }
.tax-pill { .tax-pill {
background-color: white; background-color: var(--bg-secondary);
border: 1px solid #d4af37; border: 1px solid var(--accent-gold);
border-radius: 12px; border-radius: 12px;
padding: 2px 6px; padding: 2px 6px;
color: #800020; color: var(--accent-gold);
} }
.product-table tfoot td { .product-table tfoot td {
border-top: 2px solid #d4af37; border-top: 2px solid var(--accent-gold);
padding: 8px; padding: 8px;
} }

View File

@@ -1,24 +1,23 @@
.expense-detail { .expense-detail {
background-color: #fff; background-color: var(--bg-secondary);
padding: 2rem; padding: 2rem;
font-family: 'Montserrat'; font-family: 'Montserrat';
max-width: 1000px; max-width: 1000px;
margin: 2rem auto; margin: 2rem auto;
border-radius: 16px; border-radius: var(--radius-lg);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06); box-shadow: var(--shadow-sm);
border: 1px solid #e0e0e0; border: 1px solid var(--border-color);
} }
.expense-detail h2 { .expense-detail h2 {
color: #000; color: var(--text-primary);
margin-bottom: 1.5rem; margin-bottom: 1.5rem;
font-weight: 700; font-weight: 700;
font-size: 1.8rem; font-size: 1.8rem;
} }
.expense-detail h3 { .expense-detail h3 {
color: #000; color: var(--text-primary);
} }
.expense-detail-grid { .expense-detail-grid {
@@ -30,13 +29,13 @@
.expense-detail label { .expense-detail label {
font-weight: 600; font-weight: 600;
color: #000; color: var(--text-primary);
margin-bottom: 0.4rem; margin-bottom: 0.4rem;
display: block; display: block;
} }
.expense-detail p { .expense-detail p {
color: #000; color: var(--text-primary);
} }
.expense-detail input[type="text"], .expense-detail input[type="text"],
@@ -45,36 +44,37 @@
width: 90%; width: 90%;
max-width: 280px; max-width: 280px;
padding: 10px 14px; padding: 10px 14px;
border: 1px solid #ccc; border: 1px solid var(--border-color);
border-radius: 10px; border-radius: var(--radius-md);
font-size: 14px; font-size: 14px;
font-family: 'Montserrat'; font-family: 'Montserrat';
background-color: #f9f9f9; background-color: var(--bg-elevated);
color: var(--text-primary);
transition: border-color 0.3s ease; transition: border-color 0.3s ease;
} }
.expense-detail input:focus { .expense-detail input:focus {
outline: none; outline: none;
border-color: #f1c40f; border-color: var(--accent-gold);
background-color: #fff; background-color: var(--bg-secondary);
box-shadow: 0 0 0 2px rgba(241, 196, 15, 0.2); box-shadow: 0 0 0 2px var(--accent-gold-muted);
} }
.expense-detail button { .expense-detail button {
margin-top: 2rem; margin-top: 2rem;
padding: 12px 24px; padding: 12px 24px;
background-color: #f1c40f; background-color: var(--accent-gold);
border: none; border: none;
color: #000; color: #000;
font-weight: 700; font-weight: 700;
font-size: 16px; font-size: 16px;
border-radius: 16px; border-radius: var(--radius-lg);
cursor: pointer; cursor: pointer;
transition: background-color 0.3s ease; transition: background-color 0.3s ease;
} }
.expense-detail button:hover { .expense-detail button:hover {
background-color: #d4ac0d; background-color: var(--accent-gold-hover);
} }
.products-section { .products-section {
@@ -84,43 +84,45 @@
.products-section h3 { .products-section h3 {
margin-bottom: 1rem; margin-bottom: 1rem;
font-weight: 700; font-weight: 700;
color: #333; color: var(--text-primary);
} }
.product-table { .product-table {
width: 100%; width: 100%;
border-collapse: collapse; border-collapse: collapse;
font-size: 14px; font-size: 14px;
border: 1px solid #f1c40f; border: 1px solid var(--accent-gold);
} }
.product-table th, .product-table th,
.product-table td { .product-table td {
border: 1px solid #f1c40f; border: 1px solid var(--accent-gold);
padding: 12px; padding: 12px;
text-align: center; text-align: center;
} }
.product-table th { .product-table th {
background-color: #800020; background-color: var(--accent-gold);
color: #fff; color: #000;
font-weight: 700; font-weight: 700;
} }
.product-table td { .product-table td {
background-color: #fff; background-color: var(--bg-secondary);
} }
.product-table input[type="number"] { .product-table input[type="number"] {
width: 80px; width: 80px;
padding: 6px; padding: 6px;
text-align: center; text-align: center;
border-radius: 8px; border-radius: var(--radius-sm);
border: 1px solid #ccc; border: 1px solid var(--border-color);
background-color: var(--bg-elevated);
color: var(--text-primary);
} }
.success-message { .success-message {
color: green; color: var(--success);
margin-top: 1rem; margin-top: 1rem;
font-weight: 600; font-weight: 600;
} }
@@ -133,69 +135,5 @@
} }
.error { .error {
color: red; color: var(--error);
}
/* .expense-detail-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1.5rem;
margin-bottom: 2rem;
} */
/* .expense-detail-container {
>>>>>>> Stashed changes
padding: 2rem;
max-width: 900px;
margin: auto;
background: white;
border-radius: 12px;
}
.expense-form {
display: flex;
flex-wrap: wrap;
gap: 1.5rem;
}
.form-group {
flex: 1 1 45%;
display: flex;
flex-direction: column;
}
label {
margin-bottom: 0.3rem;
font-weight: 600;
}
input, select {
padding: 0.5rem;
border-radius: 6px;
border: 1px solid #ccc;
}
.save-button {
margin-top: 1rem;
padding: 0.75rem 2rem;
background-color: #f4b400;
color: white;
border: none;
border-radius: 8px;
cursor: not-allowed;
}
.amount-warning-banner {
background-color: #fff3cd;
color: #856404;
border: 1px solid #ffeeba;
padding: 1rem;
border-radius: 8px;
margin-bottom: 1rem;
font-weight: 500;
}
.amount-warning-banner::before {
content: "⚠️";
margin-right: 0.5rem;
} }

View File

@@ -1,10 +1,10 @@
.monthly-payments-page .page-filters { .monthly-payments-page .page-filters {
background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%); background: var(--bg-elevated);
border-radius: 16px; border-radius: var(--radius-lg);
padding: 20px; padding: 20px;
margin-bottom: 24px; margin-bottom: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: var(--shadow-sm);
border: 1px solid rgba(0, 0, 0, 0.05); border: 1px solid var(--border-color);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 12px; gap: 12px;
@@ -43,7 +43,7 @@
@media (max-width: 768px) { @media (max-width: 768px) {
.monthly-payments-page .page-filters { .monthly-payments-page .page-filters {
padding: 12px; padding: 12px;
border-radius: 12px; border-radius: var(--radius-md);
gap: 10px; gap: 10px;
} }

View File

@@ -1,10 +1,10 @@
.monthly-report-page .filters-section { .monthly-report-page .filters-section {
background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%); background: var(--bg-elevated);
border-radius: 16px; border-radius: var(--radius-lg);
padding: 20px; padding: 20px;
margin-bottom: 24px; margin-bottom: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: var(--shadow-sm);
border: 1px solid rgba(0, 0, 0, 0.05); border: 1px solid var(--border-color);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 12px; gap: 12px;
@@ -36,11 +36,10 @@
padding: 10px 16px; padding: 10px 16px;
border: none; border: none;
border-radius: 30px; border-radius: 30px;
background-color: white; background-color: var(--bg-secondary);
box-shadow: 0 0 0 2px #f4f4f4; box-shadow: 0 0 0 2px var(--border-color);
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
font-weight: 600; font-weight: 600;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: all 0.2s ease;
@@ -50,11 +49,11 @@
.monthly-report-page .filters-row.second-row .clear-filters-btn:focus { .monthly-report-page .filters-row.second-row .clear-filters-btn:focus {
outline: none; outline: none;
box-shadow: 0 0 0 2px #fcd200; box-shadow: 0 0 0 2px var(--accent-gold);
} }
.monthly-report-page .filters-row.second-row .clear-filters-btn:hover { .monthly-report-page .filters-row.second-row .clear-filters-btn:hover {
box-shadow: 0 0 0 2px #e6e6e6; box-shadow: 0 0 0 2px var(--border-color);
} }
.monthly-report-page .filters-row .filter-search { .monthly-report-page .filters-row .filter-search {
@@ -64,11 +63,10 @@
padding: 10px 16px; padding: 10px 16px;
border: none; border: none;
border-radius: 30px; border-radius: 30px;
background-color: white; background-color: var(--bg-secondary);
box-shadow: 0 0 0 2px #f4f4f4; box-shadow: 0 0 0 2px var(--border-color);
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
font-weight: 600; font-weight: 600;
transition: all 0.2s ease; transition: all 0.2s ease;
height: 42px; height: 42px;
@@ -78,11 +76,11 @@
.monthly-report-page .filters-row .filter-search:focus { .monthly-report-page .filters-row .filter-search:focus {
outline: none; outline: none;
box-shadow: 0 0 0 2px #fcd200; box-shadow: 0 0 0 2px var(--accent-gold);
} }
.monthly-report-page .filters-row .filter-search:hover { .monthly-report-page .filters-row .filter-search:hover {
box-shadow: 0 0 0 2px #e6e6e6; box-shadow: 0 0 0 2px var(--border-color);
} }
.monthly-report-page .date-input-group { .monthly-report-page .date-input-group {
@@ -95,21 +93,19 @@
.monthly-report-page .date-label { .monthly-report-page .date-label {
font-size: 11px; font-size: 11px;
font-weight: 700; font-weight: 700;
color: #666; color: var(--text-secondary);
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.5px; letter-spacing: 0.5px;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
} }
.monthly-report-page .date-input { .monthly-report-page .date-input {
padding: 10px 16px; padding: 10px 16px;
border: none; border: none;
border-radius: 30px; border-radius: 30px;
background-color: white; background-color: var(--bg-secondary);
box-shadow: 0 0 0 2px #f4f4f4; box-shadow: 0 0 0 2px var(--border-color);
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
font-weight: 600; font-weight: 600;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: all 0.2s ease;
@@ -119,17 +115,17 @@
.monthly-report-page .date-input:focus { .monthly-report-page .date-input:focus {
outline: none; outline: none;
box-shadow: 0 0 0 2px #fcd200; box-shadow: 0 0 0 2px var(--accent-gold);
} }
.monthly-report-page .date-input:hover { .monthly-report-page .date-input:hover {
box-shadow: 0 0 0 2px #e6e6e6; box-shadow: 0 0 0 2px var(--border-color);
} }
@media (max-width: 768px) { @media (max-width: 768px) {
.monthly-report-page .filters-section { .monthly-report-page .filters-section {
padding: 12px; padding: 12px;
border-radius: 12px; border-radius: var(--radius-md);
gap: 10px; gap: 10px;
} }
@@ -152,11 +148,10 @@
padding: 10px 16px; padding: 10px 16px;
border: none; border: none;
border-radius: 30px; border-radius: 30px;
background-color: white; background-color: var(--bg-secondary);
box-shadow: 0 0 0 2px #f4f4f4; box-shadow: 0 0 0 2px var(--border-color);
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
font-weight: 600; font-weight: 600;
transition: all 0.2s ease; transition: all 0.2s ease;
height: 42px; height: 42px;
@@ -166,11 +161,11 @@
.monthly-report-page .filter-search:focus { .monthly-report-page .filter-search:focus {
outline: none; outline: none;
box-shadow: 0 0 0 2px #fcd200; box-shadow: 0 0 0 2px var(--accent-gold);
} }
.monthly-report-page .filter-search:hover { .monthly-report-page .filter-search:hover {
box-shadow: 0 0 0 2px #e6e6e6; box-shadow: 0 0 0 2px var(--border-color);
} }
@@ -198,11 +193,10 @@
padding: 10px 16px; padding: 10px 16px;
border: none; border: none;
border-radius: 30px; border-radius: 30px;
background-color: white; background-color: var(--bg-secondary);
box-shadow: 0 0 0 2px #f4f4f4; box-shadow: 0 0 0 2px var(--border-color);
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
font-weight: 600; font-weight: 600;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: all 0.2s ease;
@@ -212,10 +206,10 @@
.monthly-report-page .clear-filters-btn:focus { .monthly-report-page .clear-filters-btn:focus {
outline: none; outline: none;
box-shadow: 0 0 0 2px #fcd200; box-shadow: 0 0 0 2px var(--accent-gold);
} }
.monthly-report-page .clear-filters-btn:hover { .monthly-report-page .clear-filters-btn:hover {
box-shadow: 0 0 0 2px #e6e6e6; box-shadow: 0 0 0 2px var(--border-color);
} }
} }

View File

@@ -3,7 +3,7 @@
} }
.new-expense-container { .new-expense-container {
color: #333; color: var(--text-primary);
padding: 20px; padding: 20px;
} }
@@ -12,10 +12,10 @@
} }
.form-card { .form-card {
background-color: #fff; background-color: var(--bg-secondary);
border-radius: 10px; border-radius: var(--radius-md);
padding: 24px; padding: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-sm);
} }
.form-header { .form-header {
@@ -31,11 +31,11 @@
} }
.back-button { .back-button {
background-color: #6c757d; background-color: var(--bg-elevated);
color: #fff; color: var(--text-primary);
border: none; border: none;
padding: 8px 16px; padding: 8px 16px;
border-radius: 4px; border-radius: var(--radius-sm);
cursor: pointer; cursor: pointer;
display: flex; display: flex;
align-items: center; align-items: center;
@@ -45,11 +45,11 @@
} }
.back-button:hover { .back-button:hover {
background-color: #5a6268; background-color: var(--bg-surface);
} }
.back-button:active { .back-button:active {
background-color: #545b62; background-color: var(--bg-surface);
} }
.form-grid { .form-grid {
@@ -70,17 +70,18 @@
font-size: 14px; font-size: 14px;
margin-bottom: 5px; margin-bottom: 5px;
display: block; display: block;
color: #333; color: var(--text-primary);
} }
.form-grid input, .form-grid input,
.form-grid select { .form-grid select {
width: 100%; width: 100%;
padding: 8px 10px; padding: 8px 10px;
border: 1px solid #ccc; border: 1px solid var(--border-color);
border-radius: 6px; border-radius: var(--radius-sm);
font-size: 14px; font-size: 14px;
background-color: #f9f9f9; background-color: var(--bg-elevated);
color: var(--text-primary);
transition: border-color 0.2s, background-color 0.2s; transition: border-color 0.2s, background-color 0.2s;
box-sizing: border-box; box-sizing: border-box;
-webkit-box-sizing: border-box; -webkit-box-sizing: border-box;
@@ -90,13 +91,13 @@
.form-grid input:focus, .form-grid input:focus,
.form-grid select:focus { .form-grid select:focus {
outline: none; outline: none;
border-color: #5D1A2A; border-color: var(--accent-gold);
background-color: #fff; background-color: var(--bg-secondary);
} }
.form-grid input:disabled, .form-grid input:disabled,
.form-grid select:disabled { .form-grid select:disabled {
background-color: #e9ecef; background-color: var(--bg-surface);
cursor: not-allowed; cursor: not-allowed;
opacity: 0.7; opacity: 0.7;
} }
@@ -132,7 +133,7 @@
margin-bottom: 0 !important; margin-bottom: 0 !important;
font-weight: bold; font-weight: bold;
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
line-height: 1; line-height: 1;
} }
@@ -142,7 +143,7 @@
min-width: 14px; min-width: 14px;
min-height: 14px; min-height: 14px;
cursor: pointer; cursor: pointer;
accent-color: #5D1A2A; accent-color: var(--accent-gold);
flex-shrink: 0; flex-shrink: 0;
margin: 0; margin: 0;
} }
@@ -154,7 +155,7 @@
} }
.save-button { .save-button {
background-color: #ffc107; background-color: var(--accent-gold);
color: #000; color: #000;
padding: 10px 30px; padding: 10px 30px;
font-weight: bold; font-weight: bold;
@@ -166,7 +167,7 @@
} }
.save-button:hover { .save-button:hover {
background-color: #f4b400; background-color: var(--accent-gold-hover);
transform: translateY(-1px); transform: translateY(-1px);
} }
@@ -175,8 +176,8 @@
} }
.save-button:disabled { .save-button:disabled {
background-color: #e0e0e0; background-color: var(--border-color);
color: #999; color: var(--text-muted);
cursor: not-allowed; cursor: not-allowed;
transform: none; transform: none;
} }
@@ -192,35 +193,35 @@
} }
.product-table th, .product-table td { .product-table th, .product-table td {
border: 1px solid #d4af37; border: 1px solid var(--accent-gold);
padding: 8px; padding: 8px;
text-align: center; text-align: center;
} }
.product-table th { .product-table th {
background-color: #800020; background-color: var(--accent-gold);
color: white; color: #000;
font-weight: bold; font-weight: bold;
} }
.add-product-row { .add-product-row {
cursor: pointer; cursor: pointer;
color: #d4af37; color: var(--accent-gold);
text-align: center; text-align: center;
padding: 10px; padding: 10px;
font-style: italic; font-style: italic;
} }
.tax-pill { .tax-pill {
background-color: white; background-color: var(--bg-secondary);
border: 1px solid #d4af37; border: 1px solid var(--accent-gold);
border-radius: 12px; border-radius: 12px;
padding: 2px 6px; padding: 2px 6px;
color: #800020; color: var(--accent-gold);
} }
.product-table tfoot td { .product-table tfoot td {
border-top: 2px solid #d4af37; border-top: 2px solid var(--accent-gold);
padding: 8px; padding: 8px;
} }
@@ -228,11 +229,11 @@
width: 100%; width: 100%;
margin-top: 30px; margin-top: 30px;
padding-top: 20px; padding-top: 20px;
border-top: 2px solid #e0e0e0; border-top: 2px solid var(--border-color);
} }
.add-products h3 { .add-products h3 {
color: #333; color: var(--text-primary);
font-size: 18px; font-size: 18px;
font-weight: bold; font-weight: bold;
margin-bottom: 15px; margin-bottom: 15px;

View File

@@ -1,86 +1,15 @@
.new-expense-container { .new-expense-container {
color: #333; color: var(--text-primary);
}
.form-card {
background-color: #fff;
border-radius: 10px;
padding: 20px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.form-id {
font-weight: bold;
margin-bottom: 20px;
font-size: 24px;
}
.form-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 15px;
margin-bottom: 30px;
}
.form-grid label {
font-weight: bold;
font-size: 14px;
margin-bottom: 5px;
display: block;
color: #333;
}
.form-grid input,
.form-grid select {
width: 100%;
padding: 6px 4px;
border: 1px solid #ccc;
border-radius: 6px;
font-size: 14px;
background-color: #f9f9f9;
}
.save-button-wrapper {
display: flex;
justify-content: flex-end;
margin-top: 20px;
}
.save-button {
background-color: #ffcb05;
color: #fff;
padding: 10px 30px;
font-weight: bold;
border: none;
border-radius: 25px;
font-size: 16px;
cursor: pointer;
transition: background-color 0.3s ease;
}
.save-button:hover {
background-color: #f4b400;
}
.product-table-section {
margin-top: 25px;
}
/*Actualización de New Expense con tabla*/
/* src/pages/Expenses/NewExpense.css */
.new-expense-container {
padding: 20px; padding: 20px;
} }
.form-card { .form-card {
background-color: #fff; background-color: var(--bg-secondary);
border-radius: 8px; border-radius: var(--radius-md);
padding: 24px; padding: 24px;
box-shadow: 0 0 10px rgba(0,0,0,0.1); box-shadow: var(--shadow-md);
border: 1px solid var(--border-color);
} }
.form-grid { .form-grid {
@@ -96,13 +25,43 @@
} }
.save-button { .save-button {
background-color: #ffc107; /* amarillo/dorado */ background-color: var(--accent-gold);
color: #000; /* ajustar según contraste */ color: #000;
border: none; border: none;
padding: 10px 24px; padding: 10px 24px;
border-radius: 20px; border-radius: var(--radius-xl);
font-weight: bold; font-weight: bold;
cursor: pointer; cursor: pointer;
transition: background-color 0.3s ease;
}
.save-button:hover {
background-color: var(--accent-gold-hover);
}
.form-id {
font-weight: bold;
margin-bottom: 20px;
font-size: 24px;
}
.form-grid label {
font-weight: bold;
font-size: 14px;
margin-bottom: 5px;
display: block;
color: var(--text-primary);
}
.form-grid input,
.form-grid select {
width: 100%;
padding: 6px 4px;
border: 1px solid var(--border-color);
border-radius: var(--radius-sm);
font-size: 14px;
background-color: var(--bg-elevated);
color: var(--text-primary);
} }
.product-table-section { .product-table-section {
@@ -116,34 +75,34 @@
} }
.product-table th, .product-table td { .product-table th, .product-table td {
border: 1px solid #d4af37; /* dorado */ border: 1px solid var(--accent-gold);
padding: 8px; padding: 8px;
text-align: center; text-align: center;
} }
.product-table th { .product-table th {
background-color: #800020; /* bordo/morado oscuro, según tus imágenes */ background-color: var(--accent-gold);
color: white; color: #000;
font-weight: bold; font-weight: bold;
} }
.add-product-row { .add-product-row {
cursor: pointer; cursor: pointer;
color: #d4af37; /* dorado */ color: var(--accent-gold);
text-align: center; text-align: center;
padding: 10px; padding: 10px;
font-style: italic; font-style: italic;
} }
.tax-pill { .tax-pill {
background-color: white; background-color: var(--bg-elevated);
border: 1px solid #d4af37; border: 1px solid var(--accent-gold);
border-radius: 12px; border-radius: 12px;
padding: 2px 6px; padding: 2px 6px;
color: #800020; color: var(--accent-gold);
} }
.product-table tfoot td { .product-table tfoot td {
border-top: 2px solid #d4af37; border-top: 2px solid var(--accent-gold);
padding: 8px; padding: 8px;
} }

View File

@@ -1,13 +1,14 @@
.new-supplier-container { .new-supplier-container {
padding: 20px; padding: 20px;
color: #333; color: var(--text-primary);
} }
.form-card { .form-card {
background-color: #fff; background-color: var(--bg-secondary);
border-radius: 10px; border-radius: var(--radius-md);
padding: 20px; padding: 20px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-md);
border: 1px solid var(--border-color);
} }
.form-id { .form-id {
@@ -28,16 +29,17 @@
font-size: 14px; font-size: 14px;
margin-bottom: 5px; margin-bottom: 5px;
display: block; display: block;
color: #333; color: var(--text-primary);
} }
.form-grid input { .form-grid input {
width: 100%; width: 100%;
padding: 6px 4px; padding: 6px 4px;
border: 1px solid #ccc; border: 1px solid var(--border-color);
border-radius: 6px; border-radius: var(--radius-sm);
font-size: 14px; font-size: 14px;
background-color: #f9f9f9; background-color: var(--bg-elevated);
color: var(--text-primary);
} }
.save-button-wrapper { .save-button-wrapper {
@@ -47,17 +49,17 @@
} }
.save-button { .save-button {
background-color: #ffcb05; background-color: var(--accent-gold);
color: #fff; color: #000;
padding: 10px 30px; padding: 10px 30px;
font-weight: bold; font-weight: bold;
border: none; border: none;
border-radius: 25px; border-radius: var(--radius-xl);
font-size: 16px; font-size: 16px;
cursor: pointer; cursor: pointer;
transition: background-color 0.3s ease; transition: background-color 0.3s ease;
} }
.save-button:hover { .save-button:hover {
background-color: #f4b400; background-color: var(--accent-gold-hover);
} }

View File

@@ -8,8 +8,9 @@
gap: 12px; gap: 12px;
margin: 20px 0; margin: 20px 0;
padding: 15px; padding: 15px;
background-color: #f8f9fa; background-color: var(--bg-elevated);
border-radius: 8px; border-radius: var(--radius-md);
border: 1px solid var(--border-color);
align-items: stretch; align-items: stretch;
} }
@@ -44,10 +45,11 @@
height: 38px; height: 38px;
box-sizing: border-box; box-sizing: border-box;
padding: 8px 12px; padding: 8px 12px;
border: 1px solid #ccc; border: 1px solid var(--border-color);
border-radius: 4px; border-radius: var(--radius-sm);
font-size: 14px; font-size: 14px;
background-color: #fff; background-color: var(--bg-secondary);
color: var(--text-primary);
margin: 0; margin: 0;
} }
@@ -56,10 +58,11 @@
height: 38px; height: 38px;
box-sizing: border-box; box-sizing: border-box;
padding: 8px 12px; padding: 8px 12px;
border: 1px solid #ccc; border: 1px solid var(--border-color);
border-radius: 30px; border-radius: 30px;
font-size: 14px; font-size: 14px;
background-color: #fff; background-color: var(--bg-secondary);
color: var(--text-primary);
margin: 0; margin: 0;
line-height: normal; line-height: normal;
} }
@@ -74,31 +77,32 @@
font-weight: bold; font-weight: bold;
font-size: 14px; font-size: 14px;
margin-bottom: 5px; margin-bottom: 5px;
color: #333; color: var(--text-primary);
} }
.filter-group select, .filter-group select,
.filter-group input { .filter-group input {
padding: 8px 12px; padding: 8px 12px;
border: 1px solid #ccc; border: 1px solid var(--border-color);
border-radius: 4px; border-radius: var(--radius-sm);
font-size: 14px; font-size: 14px;
background-color: #fff; background-color: var(--bg-secondary);
color: var(--text-primary);
} }
.filter-group select:focus, .filter-group select:focus,
.filter-group input:focus { .filter-group input:focus {
outline: none; outline: none;
border-color: #007bff; border-color: var(--accent-gold);
box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25); box-shadow: 0 0 0 2px var(--accent-gold-muted);
} }
.clear-filters-btn { .clear-filters-btn {
background-color: #6c757d; background-color: var(--bg-elevated);
color: white; color: var(--text-secondary);
border: none; border: 1px solid var(--border-color);
padding: 8px 16px; padding: 8px 16px;
border-radius: 4px; border-radius: var(--radius-sm);
cursor: pointer; cursor: pointer;
font-size: 14px; font-size: 14px;
align-self: end; align-self: end;
@@ -106,13 +110,14 @@
} }
.clear-filters-btn:hover { .clear-filters-btn:hover {
background-color: #5a6268; background-color: var(--bg-surface);
color: var(--text-primary);
} }
@media (max-width: 768px) { @media (max-width: 768px) {
.page-filters { .page-filters {
padding: 12px; padding: 12px;
border-radius: 12px; border-radius: var(--radius-md);
gap: 10px; gap: 10px;
} }
@@ -134,10 +139,11 @@
height: 38px; height: 38px;
box-sizing: border-box; box-sizing: border-box;
padding: 8px 12px; padding: 8px 12px;
border: 1px solid #ccc; border: 1px solid var(--border-color);
border-radius: 4px; border-radius: var(--radius-sm);
font-size: 14px; font-size: 14px;
background-color: #fff; background-color: var(--bg-secondary);
color: var(--text-primary);
margin: 0; margin: 0;
} }
@@ -146,10 +152,11 @@
height: 38px; height: 38px;
box-sizing: border-box; box-sizing: border-box;
padding: 8px 12px; padding: 8px 12px;
border: 1px solid #ccc; border: 1px solid var(--border-color);
border-radius: 4px; border-radius: var(--radius-sm);
font-size: 14px; font-size: 14px;
background-color: #fff; background-color: var(--bg-secondary);
color: var(--text-primary);
margin: 0; margin: 0;
line-height: normal; line-height: normal;
} }
@@ -182,30 +189,31 @@
} }
.summary-card { .summary-card {
background-color: #fff; background-color: var(--bg-secondary);
padding: 20px; padding: 20px;
border-radius: 8px; border-radius: var(--radius-md);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-sm);
border: 1px solid var(--border-color);
text-align: center; text-align: center;
} }
.summary-card strong { .summary-card strong {
display: block; display: block;
font-size: 14px; font-size: 14px;
color: #666; color: var(--text-secondary);
margin-bottom: 10px; margin-bottom: 10px;
} }
.summary-card div { .summary-card div {
font-size: 24px; font-size: 24px;
font-weight: bold; font-weight: bold;
color: #333; color: var(--text-primary);
} }
.status-badge { .status-badge {
padding: 6px 12px; padding: 6px 12px;
border: none; border: none;
border-radius: 4px; border-radius: var(--radius-sm);
cursor: pointer; cursor: pointer;
font-size: 12px; font-size: 12px;
font-weight: bold; font-weight: bold;
@@ -213,43 +221,43 @@
} }
.status-badge.active { .status-badge.active {
background-color: #28a745; background-color: rgba(34, 197, 94, 0.15);
color: white; color: var(--success);
} }
.status-badge.active:hover { .status-badge.active:hover {
background-color: #218838; background-color: rgba(34, 197, 94, 0.25);
} }
.status-badge.reject { .status-badge.reject {
background-color: #dc3545; background-color: rgba(239, 68, 68, 0.15);
color: white; color: var(--error);
} }
.status-badge.reject:hover { .status-badge.reject:hover {
background-color: #c82333; background-color: rgba(239, 68, 68, 0.25);
} }
.status-button { .status-button {
padding: 4px 8px; padding: 4px 8px;
border: none; border: none;
border-radius: 4px; border-radius: var(--radius-sm);
font-size: 12px; font-size: 12px;
font-weight: bold; font-weight: bold;
text-transform: uppercase; text-transform: uppercase;
} }
.status-button.approved { .status-button.approved {
background-color: #28a745; background-color: rgba(34, 197, 94, 0.15);
color: white; color: var(--success);
} }
.status-button.pending { .status-button.pending {
background-color: #ffc107; background-color: rgba(234, 179, 8, 0.15);
color: black; color: var(--warning);
} }
.status-button.rejected { .status-button.rejected {
background-color: #dc3545; background-color: rgba(239, 68, 68, 0.15);
color: white; color: var(--error);
} }

View File

@@ -8,19 +8,18 @@
} }
.page-title { .page-title {
color: #1a1a1a; color: var(--text-primary);
font-size: 28px; font-size: 28px;
font-weight: 700; font-weight: 700;
margin: 0; margin: 0;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
letter-spacing: -0.5px; letter-spacing: -0.5px;
} }
.report-page .filters-section { .report-page .filters-section {
background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%); background: var(--bg-elevated);
border-radius: 16px; border-radius: var(--radius-lg);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: var(--shadow-sm);
border: 1px solid rgba(0, 0, 0, 0.05); border: 1px solid var(--border-color);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 12px; gap: 12px;
@@ -53,11 +52,10 @@
padding: 10px 16px; padding: 10px 16px;
border: none; border: none;
border-radius: 30px; border-radius: 30px;
background-color: white; background-color: var(--bg-secondary);
box-shadow: 0 0 0 2px #f4f4f4; box-shadow: 0 0 0 2px var(--border-color);
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
font-weight: 600; font-weight: 600;
transition: all 0.2s ease; transition: all 0.2s ease;
height: 42px; height: 42px;
@@ -79,11 +77,10 @@
padding: 10px 16px; padding: 10px 16px;
border: none; border: none;
border-radius: 30px; border-radius: 30px;
background-color: white; background-color: var(--bg-secondary);
box-shadow: 0 0 0 2px #f4f4f4; box-shadow: 0 0 0 2px var(--border-color);
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
font-weight: 600; font-weight: 600;
transition: all 0.2s ease; transition: all 0.2s ease;
height: 42px; height: 42px;
@@ -92,28 +89,27 @@
} }
.filter-search::placeholder { .filter-search::placeholder {
color: #999; color: var(--text-muted);
} }
.filter-search:focus { .filter-search:focus {
outline: none; outline: none;
box-shadow: 0 0 0 2px #fcd200; box-shadow: 0 0 0 2px var(--accent-gold);
} }
.filter-search:hover { .filter-search:hover {
box-shadow: 0 0 0 2px #e6e6e6; box-shadow: 0 0 0 2px var(--border-color);
} }
.filter-select { .filter-select {
padding: 10px 16px; padding: 10px 16px;
border: none; border: none;
border-radius: 30px; border-radius: 30px;
background-color: white; background-color: var(--bg-secondary);
box-shadow: 0 0 0 2px #f4f4f4; box-shadow: 0 0 0 2px var(--border-color);
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
min-width: 180px; min-width: 180px;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
font-weight: 600; font-weight: 600;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: all 0.2s ease;
@@ -123,11 +119,11 @@
.filter-select:focus { .filter-select:focus {
outline: none; outline: none;
box-shadow: 0 0 0 2px #fcd200; box-shadow: 0 0 0 2px var(--accent-gold);
} }
.filter-select:hover { .filter-select:hover {
box-shadow: 0 0 0 2px #e6e6e6; box-shadow: 0 0 0 2px var(--border-color);
} }
.date-filter-group { .date-filter-group {
@@ -139,10 +135,9 @@
.date-filter-label { .date-filter-label {
font-size: 11px; font-size: 11px;
font-weight: 700; font-weight: 700;
color: #666; color: var(--text-secondary);
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.5px; letter-spacing: 0.5px;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
} }
.date-inputs { .date-inputs {
@@ -154,12 +149,11 @@
padding: 10px 16px; padding: 10px 16px;
border: none; border: none;
border-radius: 30px; border-radius: 30px;
background-color: white; background-color: var(--bg-secondary);
box-shadow: 0 0 0 2px #f4f4f4; box-shadow: 0 0 0 2px var(--border-color);
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
min-width: 145px; min-width: 145px;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
font-weight: 600; font-weight: 600;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: all 0.2s ease;
@@ -169,32 +163,31 @@
.date-input:focus { .date-input:focus {
outline: none; outline: none;
box-shadow: 0 0 0 2px #fcd200; box-shadow: 0 0 0 2px var(--accent-gold);
} }
.date-input:hover { .date-input:hover {
box-shadow: 0 0 0 2px #e6e6e6; box-shadow: 0 0 0 2px var(--border-color);
} }
.clear-filters-btn { .clear-filters-btn {
padding: 10px 20px; padding: 10px 20px;
background-color: white; background-color: var(--bg-secondary);
border: 2px solid #e0e0e0; border: 2px solid var(--border-color);
border-radius: 30px; border-radius: 30px;
cursor: pointer; cursor: pointer;
font-size: 14px; font-size: 14px;
font-weight: 600; font-weight: 600;
color: #666; color: var(--text-secondary);
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
transition: all 0.2s ease; transition: all 0.2s ease;
height: 42px; height: 42px;
box-sizing: border-box; box-sizing: border-box;
} }
.clear-filters-btn:hover { .clear-filters-btn:hover {
background-color: #f5f5f5; background-color: var(--bg-elevated);
border-color: #ccc; border-color: var(--border-color);
color: #333; color: var(--text-primary);
} }
.summary-actions-section { .summary-actions-section {
@@ -213,19 +206,19 @@
} }
.info-card { .info-card {
background: linear-gradient(145deg, #ffffff, #f8f9fa); background: var(--bg-secondary);
border-radius: 16px; border-radius: var(--radius-lg);
padding: 20px 24px; padding: 20px 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-sm);
min-width: 180px; min-width: 180px;
flex: 1; flex: 1;
transition: all 0.3s ease; transition: all 0.3s ease;
border: 1px solid rgba(0, 0, 0, 0.05); border: 1px solid var(--border-color);
} }
.info-card:hover { .info-card:hover {
transform: translateY(-2px); transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12); box-shadow: var(--shadow-md);
} }
.info-card .card-title { .info-card .card-title {
@@ -234,22 +227,23 @@
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.5px; letter-spacing: 0.5px;
margin: 0 0 12px 0; margin: 0 0 12px 0;
color: #666; color: var(--text-secondary);
} }
.info-card .card-value { .info-card .card-value {
font-size: 28px; font-size: 28px;
font-weight: 700; font-weight: 700;
color: #333; color: var(--text-primary);
line-height: 1.2; line-height: 1.2;
} }
.table-section { .table-section {
background: white; background: var(--bg-secondary);
border-radius: 16px; border-radius: var(--radius-lg);
padding: 24px; padding: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-sm);
border: 1px solid var(--border-color);
min-height: 400px; min-height: 400px;
} }
@@ -274,7 +268,7 @@
.report-page .filters-section { .report-page .filters-section {
padding: 12px; padding: 12px;
border-radius: 12px; border-radius: var(--radius-md);
gap: 10px; gap: 10px;
} }
@@ -297,11 +291,10 @@
padding: 10px 16px; padding: 10px 16px;
border: none; border: none;
border-radius: 30px; border-radius: 30px;
background-color: white; background-color: var(--bg-secondary);
box-shadow: 0 0 0 2px #f4f4f4; box-shadow: 0 0 0 2px var(--border-color);
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
font-weight: 600; font-weight: 600;
transition: all 0.2s ease; transition: all 0.2s ease;
height: 42px; height: 42px;
@@ -346,7 +339,7 @@
.table-section { .table-section {
padding: 16px; padding: 16px;
border-radius: 12px; border-radius: var(--radius-md);
} }
} }
@@ -359,4 +352,3 @@
padding: 12px; padding: 12px;
} }
} }

View File

@@ -8,7 +8,7 @@
} }
.page-title { .page-title {
color: #1a1a1a; color: var(--text-primary);
font-size: 28px; font-size: 28px;
font-weight: 700; font-weight: 700;
margin: 0; margin: 0;
@@ -17,12 +17,12 @@
} }
.filters-section { .filters-section {
background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%); background: var(--bg-primary);
border-radius: 16px; border-radius: var(--radius-lg);
padding: 20px; padding: 20px;
margin-bottom: 24px; margin-bottom: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: var(--shadow-sm);
border: 1px solid rgba(0, 0, 0, 0.05); border: 1px solid var(--border-color);
display: flex; display: flex;
justify-content: center; justify-content: center;
flex-wrap: wrap; flex-wrap: wrap;
@@ -38,10 +38,10 @@
padding: 10px 16px; padding: 10px 16px;
border: none; border: none;
border-radius: 30px; border-radius: 30px;
background-color: white; background-color: var(--bg-elevated);
box-shadow: 0 0 0 2px #f4f4f4; box-shadow: 0 0 0 2px var(--border-color);
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
min-width: 200px; min-width: 200px;
max-width: 300px; max-width: 300px;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
@@ -54,26 +54,26 @@
} }
.filter-search::placeholder { .filter-search::placeholder {
color: #999; color: var(--text-muted);
} }
.filter-search:focus { .filter-search:focus {
outline: none; outline: none;
box-shadow: 0 0 0 2px #fcd200; box-shadow: 0 0 0 2px var(--accent-gold);
} }
.filter-search:hover { .filter-search:hover {
box-shadow: 0 0 0 2px #e6e6e6; box-shadow: 0 0 0 2px var(--border-color);
} }
.filter-select { .filter-select {
padding: 10px 16px; padding: 10px 16px;
border: none; border: none;
border-radius: 30px; border-radius: 30px;
background-color: white; background-color: var(--bg-elevated);
box-shadow: 0 0 0 2px #f4f4f4; box-shadow: 0 0 0 2px var(--border-color);
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
min-width: 180px; min-width: 180px;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
font-weight: 600; font-weight: 600;
@@ -85,22 +85,22 @@
.filter-select:focus { .filter-select:focus {
outline: none; outline: none;
box-shadow: 0 0 0 2px #fcd200; box-shadow: 0 0 0 2px var(--accent-gold);
} }
.filter-select:hover { .filter-select:hover {
box-shadow: 0 0 0 2px #e6e6e6; box-shadow: 0 0 0 2px var(--border-color);
} }
.clear-filters-btn { .clear-filters-btn {
padding: 10px 20px; padding: 10px 20px;
background-color: white; background-color: var(--bg-elevated);
border: 2px solid #e0e0e0; border: 2px solid var(--border-color);
border-radius: 30px; border-radius: 30px;
cursor: pointer; cursor: pointer;
font-size: 14px; font-size: 14px;
font-weight: 600; font-weight: 600;
color: #666; color: var(--text-secondary);
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
transition: all 0.2s ease; transition: all 0.2s ease;
height: 42px; height: 42px;
@@ -109,9 +109,9 @@
} }
.clear-filters-btn:hover { .clear-filters-btn:hover {
background-color: #f5f5f5; background-color: var(--bg-secondary);
border-color: #ccc; border-color: var(--border-color);
color: #333; color: var(--text-primary);
} }
.summary-cards-wrapper { .summary-cards-wrapper {
@@ -122,19 +122,19 @@
} }
.info-card { .info-card {
background: linear-gradient(145deg, #ffffff, #f8f9fa); background: var(--bg-secondary);
border-radius: 16px; border-radius: var(--radius-lg);
padding: 20px 24px; padding: 20px 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-sm);
min-width: 180px; min-width: 180px;
flex: 1; flex: 1;
transition: all 0.3s ease; transition: all 0.3s ease;
border: 1px solid rgba(0, 0, 0, 0.05); border: 1px solid var(--border-color);
} }
.info-card:hover { .info-card:hover {
transform: translateY(-2px); transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12); box-shadow: var(--shadow-md);
} }
.info-card .card-title { .info-card .card-title {
@@ -143,21 +143,21 @@
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.5px; letter-spacing: 0.5px;
margin: 0 0 12px 0; margin: 0 0 12px 0;
color: #666; color: var(--text-secondary);
} }
.info-card .card-value { .info-card .card-value {
font-size: 28px; font-size: 28px;
font-weight: 700; font-weight: 700;
color: #333; color: var(--text-primary);
line-height: 1.2; line-height: 1.2;
} }
.table-section { .table-section {
background: white; background: var(--bg-secondary);
border-radius: 16px; border-radius: var(--radius-lg);
padding: 24px; padding: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-sm);
min-height: 400px; min-height: 400px;
} }
@@ -186,7 +186,7 @@
.filters-section { .filters-section {
padding: 12px; padding: 12px;
border-radius: 12px; border-radius: var(--radius-md);
flex-direction: column; flex-direction: column;
align-items: stretch; align-items: stretch;
gap: 10px; gap: 10px;
@@ -211,7 +211,7 @@
.table-section { .table-section {
padding: 16px; padding: 16px;
border-radius: 12px; border-radius: var(--radius-md);
} }
} }
@@ -228,4 +228,3 @@
padding: 12px; padding: 12px;
} }
} }

View File

@@ -8,7 +8,7 @@
} }
.page-title { .page-title {
color: #1a1a1a; color: var(--text-primary);
font-size: 28px; font-size: 28px;
font-weight: 700; font-weight: 700;
margin: 0; margin: 0;
@@ -17,12 +17,12 @@
} }
.filters-section { .filters-section {
background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%); background: var(--bg-primary);
border-radius: 16px; border-radius: var(--radius-lg);
padding: 20px; padding: 20px;
margin-bottom: 24px; margin-bottom: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: var(--shadow-sm);
border: 1px solid rgba(0, 0, 0, 0.05); border: 1px solid var(--border-color);
display: flex; display: flex;
justify-content: center; justify-content: center;
flex-wrap: wrap; flex-wrap: wrap;
@@ -38,10 +38,10 @@
padding: 10px 16px; padding: 10px 16px;
border: none; border: none;
border-radius: 30px; border-radius: 30px;
background-color: white; background-color: var(--bg-elevated);
box-shadow: 0 0 0 2px #f4f4f4; box-shadow: 0 0 0 2px var(--border-color);
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
min-width: 200px; min-width: 200px;
max-width: 300px; max-width: 300px;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
@@ -54,26 +54,26 @@
} }
.filter-search::placeholder { .filter-search::placeholder {
color: #999; color: var(--text-muted);
} }
.filter-search:focus { .filter-search:focus {
outline: none; outline: none;
box-shadow: 0 0 0 2px #fcd200; box-shadow: 0 0 0 2px var(--accent-gold);
} }
.filter-search:hover { .filter-search:hover {
box-shadow: 0 0 0 2px #e6e6e6; box-shadow: 0 0 0 2px var(--border-color);
} }
.filter-select { .filter-select {
padding: 10px 16px; padding: 10px 16px;
border: none; border: none;
border-radius: 30px; border-radius: 30px;
background-color: white; background-color: var(--bg-elevated);
box-shadow: 0 0 0 2px #f4f4f4; box-shadow: 0 0 0 2px var(--border-color);
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
min-width: 180px; min-width: 180px;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
font-weight: 600; font-weight: 600;
@@ -85,22 +85,22 @@
.filter-select:focus { .filter-select:focus {
outline: none; outline: none;
box-shadow: 0 0 0 2px #fcd200; box-shadow: 0 0 0 2px var(--accent-gold);
} }
.filter-select:hover { .filter-select:hover {
box-shadow: 0 0 0 2px #e6e6e6; box-shadow: 0 0 0 2px var(--border-color);
} }
.clear-filters-btn { .clear-filters-btn {
padding: 10px 20px; padding: 10px 20px;
background-color: white; background-color: var(--bg-elevated);
border: 2px solid #e0e0e0; border: 2px solid var(--border-color);
border-radius: 30px; border-radius: 30px;
cursor: pointer; cursor: pointer;
font-size: 14px; font-size: 14px;
font-weight: 600; font-weight: 600;
color: #666; color: var(--text-secondary);
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
transition: all 0.2s ease; transition: all 0.2s ease;
height: 42px; height: 42px;
@@ -109,9 +109,9 @@
} }
.clear-filters-btn:hover { .clear-filters-btn:hover {
background-color: #f5f5f5; background-color: var(--bg-secondary);
border-color: #ccc; border-color: var(--border-color);
color: #333; color: var(--text-primary);
} }
.summary-cards-wrapper { .summary-cards-wrapper {
@@ -122,19 +122,19 @@
} }
.info-card { .info-card {
background: linear-gradient(145deg, #ffffff, #f8f9fa); background: var(--bg-secondary);
border-radius: 16px; border-radius: var(--radius-lg);
padding: 20px 24px; padding: 20px 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-sm);
min-width: 180px; min-width: 180px;
flex: 1; flex: 1;
transition: all 0.3s ease; transition: all 0.3s ease;
border: 1px solid rgba(0, 0, 0, 0.05); border: 1px solid var(--border-color);
} }
.info-card:hover { .info-card:hover {
transform: translateY(-2px); transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12); box-shadow: var(--shadow-md);
} }
.info-card .card-title { .info-card .card-title {
@@ -143,21 +143,21 @@
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.5px; letter-spacing: 0.5px;
margin: 0 0 12px 0; margin: 0 0 12px 0;
color: #666; color: var(--text-secondary);
} }
.info-card .card-value { .info-card .card-value {
font-size: 28px; font-size: 28px;
font-weight: 700; font-weight: 700;
color: #333; color: var(--text-primary);
line-height: 1.2; line-height: 1.2;
} }
.table-section { .table-section {
background: white; background: var(--bg-secondary);
border-radius: 16px; border-radius: var(--radius-lg);
padding: 24px; padding: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-sm);
min-height: 400px; min-height: 400px;
} }
@@ -186,7 +186,7 @@
.filters-section { .filters-section {
padding: 12px; padding: 12px;
border-radius: 12px; border-radius: var(--radius-md);
flex-direction: column; flex-direction: column;
align-items: stretch; align-items: stretch;
gap: 10px; gap: 10px;
@@ -211,7 +211,7 @@
.table-section { .table-section {
padding: 16px; padding: 16px;
border-radius: 12px; border-radius: var(--radius-md);
} }
} }
@@ -228,4 +228,3 @@
padding: 12px; padding: 12px;
} }
} }

View File

@@ -100,7 +100,7 @@ export default function GuestDetail() {
</div> </div>
{/* Current Room Banner */} {/* Current Room Banner */}
{guest.name_room && ( {guest.room_number && (
<div <div
className="card" className="card"
style={{ style={{
@@ -115,7 +115,7 @@ export default function GuestDetail() {
<span style={{ color: "var(--text-muted)", fontSize: "0.75rem", textTransform: "uppercase", fontWeight: 600 }}> <span style={{ color: "var(--text-muted)", fontSize: "0.75rem", textTransform: "uppercase", fontWeight: 600 }}>
{t("guests.currentRoom")} {t("guests.currentRoom")}
</span> </span>
<h3 style={{ margin: "4px 0 0", color: "var(--text-primary)" }}>{guest.name_room}</h3> <h3 style={{ margin: "4px 0 0", color: "var(--text-primary)" }}>{guest.room_number}</h3>
</div> </div>
<div style={{ textAlign: "right" }}> <div style={{ textAlign: "right" }}>
<span style={{ fontSize: "0.8rem", color: "var(--text-secondary)" }}> <span style={{ fontSize: "0.8rem", color: "var(--text-secondary)" }}>
@@ -337,10 +337,10 @@ export default function GuestDetail() {
{stays.map((stay, idx) => ( {stays.map((stay, idx) => (
<tr key={stay.id || idx}> <tr key={stay.id || idx}>
<td> <td>
<span style={{ fontWeight: 600 }}>{stay.name_room || "-"}</span> <span style={{ fontWeight: 600 }}>{stay.room_number || "-"}</span>
{stay.bed_type && ( {stay.room_type && (
<span style={{ display: "block", fontSize: "0.75rem", color: "var(--text-muted)" }}> <span style={{ display: "block", fontSize: "0.75rem", color: "var(--text-muted)" }}>
{stay.bed_type} {stay.room_type}
</span> </span>
)} )}
</td> </td>

View File

@@ -152,10 +152,10 @@ export default function Guests() {
)} )}
</div> </div>
</div> </div>
{guest.name_room && ( {guest.room_number && (
<div style={{ marginTop: "var(--space-sm)" }}> <div style={{ marginTop: "var(--space-sm)" }}>
<span className="badge badge-info" style={{ fontSize: "0.7rem" }}> <span className="badge badge-info" style={{ fontSize: "0.7rem" }}>
{guest.name_room} {guest.room_number}
</span> </span>
</div> </div>
)} )}

View File

@@ -6,9 +6,9 @@
.property-info-box { .property-info-box {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
background-color: #f8f8f8; background-color: var(--bg-elevated);
padding: 20px; padding: 20px;
border-radius: 10px; border-radius: var(--radius-md);
margin-bottom: 30px; margin-bottom: 30px;
} }
@@ -24,17 +24,19 @@
input, select { input, select {
padding: 5px; padding: 5px;
margin-left: 10px; margin-left: 10px;
border: 1px solid #ccc; border: 1px solid var(--border-color);
border-radius: 4px; border-radius: var(--radius-sm);
background-color: var(--bg-elevated);
color: var(--text-primary);
} }
.save-button { .save-button {
background-color: #f2c300; background-color: var(--accent-gold);
border: none; border: none;
padding: 10px 20px; padding: 10px 20px;
border-radius: 20px; border-radius: 20px;
font-weight: bold; font-weight: bold;
color: white; color: #000;
cursor: pointer; cursor: pointer;
} }

View File

@@ -142,7 +142,7 @@ export default function Housekeeping() {
color: "var(--text-primary)", color: "var(--text-primary)",
}} }}
> >
{task.name_room || `Room ${task.room_id}`} {task.room_number || `Room ${task.room_id}`}
</h3> </h3>
{task.floor && ( {task.floor && (
<span <span
@@ -263,7 +263,7 @@ export default function Housekeeping() {
{t("housekeeping.assignTo")}... {t("housekeeping.assignTo")}...
</option> </option>
{staff.map((s) => ( {staff.map((s) => (
<option key={s.id_employee} value={s.id_employee}> <option key={s.id} value={s.id}>
{s.first_name} {s.last_name} {s.first_name} {s.last_name}
</option> </option>
))} ))}
@@ -332,7 +332,7 @@ export default function Housekeeping() {
</h3> </h3>
<div className="grid-3"> <div className="grid-3">
{staff.map((s) => ( {staff.map((s) => (
<div key={s.id_employee} className="card"> <div key={s.id} className="card">
<div <div
style={{ style={{
display: "flex", display: "flex",

View File

@@ -8,32 +8,31 @@
} }
.page-title { .page-title {
color: #1a1a1a; color: var(--text-primary);
font-size: 28px; font-size: 28px;
font-weight: 700; font-weight: 700;
margin: 0; margin: 0;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
letter-spacing: -0.5px; letter-spacing: -0.5px;
} }
.error-message { .error-message {
padding: 12px 16px; padding: 12px 16px;
background-color: #ffebee; background-color: rgba(239, 68, 68, 0.1);
color: #c62828; color: var(--error);
border-radius: 12px; border-radius: var(--radius-md);
margin-bottom: 20px; margin-bottom: 20px;
border: 1px solid #ef9a9a; border: 1px solid rgba(239, 68, 68, 0.2);
font-size: 14px; font-size: 14px;
font-weight: 500; font-weight: 500;
} }
.filters-section { .filters-section {
background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%); background: var(--bg-elevated);
border-radius: 16px; border-radius: var(--radius-lg);
padding: 20px; padding: 20px;
margin-bottom: 24px; margin-bottom: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: var(--shadow-sm);
border: 1px solid rgba(0, 0, 0, 0.05); border: 1px solid var(--border-color);
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
flex-wrap: wrap; flex-wrap: wrap;
@@ -49,12 +48,11 @@
padding: 10px 16px; padding: 10px 16px;
border: none; border: none;
border-radius: 30px; border-radius: 30px;
background-color: white; background-color: var(--bg-secondary);
box-shadow: 0 0 0 2px #f4f4f4; box-shadow: 0 0 0 2px var(--border-color);
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
min-width: 180px; min-width: 180px;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
font-weight: 600; font-weight: 600;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: all 0.2s ease;
@@ -64,23 +62,22 @@
.filter-select:focus { .filter-select:focus {
outline: none; outline: none;
box-shadow: 0 0 0 2px #fcd200; box-shadow: 0 0 0 2px var(--accent-gold);
} }
.filter-select:hover { .filter-select:hover {
box-shadow: 0 0 0 2px #e6e6e6; box-shadow: 0 0 0 2px var(--border-color);
} }
.clear-filters-btn { .clear-filters-btn {
padding: 10px 20px; padding: 10px 20px;
background-color: white; background-color: var(--bg-secondary);
border: 2px solid #e0e0e0; border: 2px solid var(--border-color);
border-radius: 30px; border-radius: 30px;
cursor: pointer; cursor: pointer;
font-size: 14px; font-size: 14px;
font-weight: 600; font-weight: 600;
color: #666; color: var(--text-secondary);
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
transition: all 0.2s ease; transition: all 0.2s ease;
height: 42px; height: 42px;
box-sizing: border-box; box-sizing: border-box;
@@ -88,9 +85,9 @@
} }
.clear-filters-btn:hover { .clear-filters-btn:hover {
background-color: #f5f5f5; background-color: var(--bg-elevated);
border-color: #ccc; border-color: var(--border-color);
color: #333; color: var(--text-primary);
} }
.summary-actions-section { .summary-actions-section {
@@ -109,29 +106,29 @@
.new-income-btn { .new-income-btn {
padding: 12px 24px; padding: 12px 24px;
background-color: #5d1a2a; background-color: var(--accent-gold);
color: white; color: #000;
text-decoration: none; text-decoration: none;
border-radius: 30px; border-radius: 30px;
font-weight: 600; font-weight: 600;
font-size: 14px; font-size: 14px;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
transition: all 0.3s ease; transition: all 0.3s ease;
box-shadow: 0 2px 8px rgba(93, 26, 42, 0.3); box-shadow: var(--shadow-sm);
white-space: nowrap; white-space: nowrap;
} }
.new-income-btn:hover { .new-income-btn:hover {
background-color: #7a2236; background-color: var(--accent-gold-hover);
transform: translateY(-2px); transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(93, 26, 42, 0.4); box-shadow: var(--shadow-md);
} }
.table-section { .table-section {
background: white; background: var(--bg-secondary);
border-radius: 16px; border-radius: var(--radius-lg);
padding: 24px; padding: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-sm);
border: 1px solid var(--border-color);
min-height: 400px; min-height: 400px;
} }
@@ -147,14 +144,14 @@
.loading-spinner-large { .loading-spinner-large {
width: 60px; width: 60px;
height: 60px; height: 60px;
border: 5px solid rgba(0, 0, 0, 0.1); border: 5px solid var(--border-color);
border-top-color: #5d1a2a; border-top-color: var(--accent-gold);
border-radius: 50%; border-radius: 50%;
animation: spin 0.8s linear infinite; animation: spin 0.8s linear infinite;
} }
.table-loading p { .table-loading p {
color: #666; color: var(--text-secondary);
font-size: 16px; font-size: 16px;
font-weight: 500; font-weight: 500;
margin: 0; margin: 0;
@@ -195,7 +192,7 @@
.filters-section { .filters-section {
padding: 12px; padding: 12px;
border-radius: 12px; border-radius: var(--radius-md);
flex-direction: column; flex-direction: column;
align-items: stretch; align-items: stretch;
gap: 10px; gap: 10px;
@@ -225,7 +222,7 @@
.table-section { .table-section {
padding: 16px; padding: 16px;
border-radius: 12px; border-radius: var(--radius-md);
} }
.table-loading { .table-loading {

View File

@@ -1,5 +1,5 @@
.new-income-container { .new-income-container {
color: #333; color: var(--text-primary);
width: 100%; width: 100%;
max-width: 100vw; max-width: 100vw;
margin: 0 auto; margin: 0 auto;
@@ -9,10 +9,11 @@
} }
.form-card { .form-card {
background-color: #fff; background-color: var(--bg-secondary);
border-radius: 10px; border-radius: var(--radius-md);
padding: 20px; padding: 20px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-md);
border: 1px solid var(--border-color);
} }
.form-header { .form-header {
@@ -25,16 +26,16 @@
.form-header h1 { .form-header h1 {
font-size: 24px; font-size: 24px;
font-weight: bold; font-weight: bold;
color: #333; color: var(--text-primary);
margin: 0; margin: 0;
} }
.back-button { .back-button {
background-color: #6c757d; background-color: var(--bg-elevated);
color: #fff; color: var(--text-primary);
border: none; border: 1px solid var(--border-color);
padding: 8px 16px; padding: 8px 16px;
border-radius: 4px; border-radius: var(--radius-sm);
cursor: pointer; cursor: pointer;
display: flex; display: flex;
align-items: center; align-items: center;
@@ -44,29 +45,29 @@
} }
.back-button:hover { .back-button:hover {
background-color: #5a6268; background-color: var(--bg-surface);
} }
.back-button:active { .back-button:active {
background-color: #545b62; background-color: var(--bg-elevated);
} }
.success-message { .success-message {
background-color: #d4edda; background-color: rgba(34, 197, 94, 0.1);
color: #155724; color: var(--success);
padding: 12px; padding: 12px;
border-radius: 6px; border-radius: var(--radius-sm);
margin-bottom: 20px; margin-bottom: 20px;
border: 1px solid #c3e6cb; border: 1px solid rgba(34, 197, 94, 0.2);
} }
.error-message { .error-message {
background-color: #f8d7da; background-color: rgba(239, 68, 68, 0.1);
color: #721c24; color: var(--error);
padding: 12px; padding: 12px;
border-radius: 6px; border-radius: var(--radius-sm);
margin-bottom: 20px; margin-bottom: 20px;
border: 1px solid #f5c6cb; border: 1px solid rgba(239, 68, 68, 0.2);
} }
.form-grid { .form-grid {
@@ -86,25 +87,26 @@
font-size: 14px; font-size: 14px;
margin-bottom: 5px; margin-bottom: 5px;
display: block; display: block;
color: #333; color: var(--text-primary);
} }
.form-grid input, .form-grid input,
.form-grid select { .form-grid select {
width: 100%; width: 100%;
padding: 8px 12px; padding: 8px 12px;
border: 1px solid #ccc; border: 1px solid var(--border-color);
border-radius: 6px; border-radius: var(--radius-sm);
font-size: 14px; font-size: 14px;
background-color: #f9f9f9; background-color: var(--bg-elevated);
color: var(--text-primary);
transition: border-color 0.2s ease; transition: border-color 0.2s ease;
} }
.form-grid input:focus, .form-grid input:focus,
.form-grid select:focus { .form-grid select:focus {
outline: none; outline: none;
border-color: #ffcb05; border-color: var(--accent-gold);
background-color: #fff; background-color: var(--bg-secondary);
} }
.form-grid input[type="number"] { .form-grid input[type="number"] {
@@ -118,23 +120,24 @@
} }
.save-button { .save-button {
background-color: #ffcb05; background-color: var(--accent-gold);
color: #fff !important; color: #000 !important;
padding: 12px 30px; padding: 12px 30px;
font-weight: bold; font-weight: bold;
border: none; border: none;
border-radius: 25px; border-radius: var(--radius-xl);
font-size: 16px; font-size: 16px;
cursor: pointer; cursor: pointer;
transition: background-color 0.3s ease; transition: background-color 0.3s ease;
} }
.save-button:hover:not(:disabled) { .save-button:hover:not(:disabled) {
background-color: #f4b400; background-color: var(--accent-gold-hover);
} }
.save-button:disabled { .save-button:disabled {
background-color: #ccc; background-color: var(--bg-elevated);
color: var(--text-muted) !important;
cursor: not-allowed; cursor: not-allowed;
} }
@@ -149,7 +152,7 @@
} }
.income-categories > div { .income-categories > div {
border: 1px solid #ccc; border: 1px solid var(--border-color);
padding: 10px; padding: 10px;
margin-top: 10px; margin-top: 10px;
width: 100%; width: 100%;
@@ -158,7 +161,7 @@
.income-categories .category-item { .income-categories .category-item {
margin-bottom: 10px; margin-bottom: 10px;
border-bottom: 1px dotted #eee; border-bottom: 1px dotted var(--border-color);
padding-bottom: 5px; padding-bottom: 5px;
display: grid; display: grid;
grid-template-columns: 1fr 1fr; grid-template-columns: 1fr 1fr;
@@ -177,31 +180,32 @@
font-size: 14px; font-size: 14px;
margin-bottom: 5px; margin-bottom: 5px;
display: block; display: block;
color: #333; color: var(--text-primary);
} }
.category-item select, .category-item select,
.category-item input { .category-item input {
width: 100%; width: 100%;
padding: 8px 12px; padding: 8px 12px;
border: 1px solid #ccc; border: 1px solid var(--border-color);
border-radius: 6px; border-radius: var(--radius-sm);
font-size: 14px; font-size: 14px;
background-color: #f9f9f9; background-color: var(--bg-elevated);
color: var(--text-primary);
transition: border-color 0.2s ease; transition: border-color 0.2s ease;
box-sizing: border-box; box-sizing: border-box;
} }
.category-item input[readonly] { .category-item input[readonly] {
background-color: #f5f5f5; background-color: var(--bg-surface);
cursor: not-allowed; cursor: not-allowed;
} }
.category-item input:focus, .category-item input:focus,
.category-item select:focus { .category-item select:focus {
outline: none; outline: none;
border-color: #ffcb05; border-color: var(--accent-gold);
background-color: #fff; background-color: var(--bg-secondary);
} }
.taxes-container { .taxes-container {
@@ -231,8 +235,8 @@
.total-income-summary { .total-income-summary {
margin-top: 20px; margin-top: 20px;
padding: 10px; padding: 10px;
border: 1px solid #ccc; border: 1px solid var(--border-color);
background-color: #f9f9f9; background-color: var(--bg-elevated);
width: 100%; width: 100%;
box-sizing: border-box; box-sizing: border-box;
} }
@@ -269,13 +273,13 @@
} }
.save-button.disabled-validation { .save-button.disabled-validation {
background-color: #808080 !important; background-color: var(--bg-elevated) !important;
color: #fff !important; color: var(--text-muted) !important;
cursor: not-allowed !important; cursor: not-allowed !important;
opacity: 0.6; opacity: 0.6;
} }
.save-button.disabled-validation:hover { .save-button.disabled-validation:hover {
background-color: #dc3545 !important; background-color: var(--error) !important;
transform: none !important; transform: none !important;
} }

View File

@@ -1,10 +1,10 @@
.adjustments-page-container { .adjustments-page-container {
padding: 20px; padding: 20px;
color: #213547; color: var(--text-primary);
} }
.adjustments-page-container h2 { .adjustments-page-container h2 {
color: #213547; color: var(--text-primary);
} }
.filters-section { .filters-section {
@@ -17,24 +17,24 @@
} }
.filters-section select { .filters-section select {
color: #213547; color: var(--text-primary);
background-color: white; background-color: var(--bg-secondary);
max-width: 250px; max-width: 250px;
min-width: 150px; min-width: 150px;
flex: 0 1 auto; flex: 0 1 auto;
} }
.filters-section input[type="date"] { .filters-section input[type="date"] {
color: #213547; color: var(--text-primary);
background-color: white; background-color: var(--bg-secondary);
max-width: 200px; max-width: 200px;
min-width: 150px; min-width: 150px;
flex: 0 1 auto; flex: 0 1 auto;
} }
.filters-section .filter-search { .filters-section .filter-search {
color: #213547; color: var(--text-primary);
background-color: white; background-color: var(--bg-secondary);
max-width: 300px; max-width: 300px;
min-width: 200px; min-width: 200px;
flex: 0 0 auto; flex: 0 0 auto;
@@ -43,11 +43,11 @@
.filters-section .save-button { .filters-section .save-button {
width: 120px; width: 120px;
background: #F2C300; background: var(--accent-gold);
color: #fff; color: #000;
font-weight: bold; font-weight: bold;
font-size: 14px; font-size: 14px;
border-radius: 25px; border-radius: var(--radius-xl);
padding: 10px 20px; padding: 10px 20px;
border: none; border: none;
cursor: pointer; cursor: pointer;
@@ -57,11 +57,12 @@
} }
.save-button:hover:not(:disabled) { .save-button:hover:not(:disabled) {
background: #ddb000; background: var(--accent-gold-hover);
} }
.save-button:disabled { .save-button:disabled {
background: #ccc; background: var(--bg-elevated);
color: var(--text-muted);
cursor: not-allowed; cursor: not-allowed;
opacity: 0.6; opacity: 0.6;
} }

View File

@@ -3,17 +3,17 @@
justify-content: flex-start; justify-content: flex-start;
align-items: flex-start; align-items: flex-start;
min-height: 100vh; min-height: 100vh;
background-color: #f0f2f5; background-color: var(--bg-primary);
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
padding: 20px; padding: 20px;
box-sizing: border-box; box-sizing: border-box;
} }
.form-card { .form-card {
background: white; background: var(--bg-secondary);
padding: 2rem; padding: 2rem;
border-radius: 12px; border-radius: var(--radius-md);
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-md);
border: 1px solid var(--border-color);
width: 100%; width: 100%;
} }
@@ -23,14 +23,14 @@
justify-content: space-between; justify-content: space-between;
margin-bottom: 1.5rem; margin-bottom: 1.5rem;
padding-bottom: 1rem; padding-bottom: 1rem;
border-bottom: 1px solid #e2e8f0; border-bottom: 1px solid var(--border-color);
} }
.form-id { .form-id {
font-size: 1.75rem; font-size: 1.75rem;
font-weight: bold; font-weight: bold;
margin-bottom: 0; margin-bottom: 0;
color: #1a202c; color: var(--text-primary);
border-bottom: none; border-bottom: none;
padding-bottom: 0; padding-bottom: 0;
} }
@@ -50,24 +50,26 @@
label { label {
font-weight: 600; font-weight: 600;
color: #4a5568; color: var(--text-secondary);
font-size: 0.9rem; font-size: 0.9rem;
} }
input, select { input, select {
padding: 0.8rem; padding: 0.8rem;
border: 1px solid #cbd5e0; border: 1px solid var(--border-color);
border-radius: 8px; border-radius: var(--radius-md);
font-size: 1rem; font-size: 1rem;
width: 100%; width: 100%;
box-sizing: border-box; box-sizing: border-box;
transition: border-color 0.2s, box-shadow 0.2s; transition: border-color 0.2s, box-shadow 0.2s;
background-color: var(--bg-elevated);
color: var(--text-primary);
} }
input:focus, select:focus { input:focus, select:focus {
outline: none; outline: none;
border-color: #3182ce; border-color: var(--accent-gold);
box-shadow: 0 0 0 2px rgba(66, 153, 225, 0.5); box-shadow: 0 0 0 2px var(--accent-gold-muted);
} }
select[multiple] { select[multiple] {
@@ -78,15 +80,15 @@ select[multiple] {
text-align: right; text-align: right;
margin-top: 2rem; margin-top: 2rem;
padding-top: 1.5rem; padding-top: 1.5rem;
border-top: 1px solid #e2e8f0; border-top: 1px solid var(--border-color);
} }
.save-button { .save-button {
background-color: #3182ce; background-color: var(--accent-gold);
color: white; color: #000;
border: none; border: none;
padding: 0.8rem 1.6rem; padding: 0.8rem 1.6rem;
border-radius: 8px; border-radius: var(--radius-md);
font-size: 1rem; font-size: 1rem;
font-weight: bold; font-weight: bold;
cursor: pointer; cursor: pointer;
@@ -94,7 +96,7 @@ select[multiple] {
} }
.save-button:hover { .save-button:hover {
background-color: #2b6cb0; background-color: var(--accent-gold-hover);
} }
.save-button:active { .save-button:active {
@@ -102,33 +104,34 @@ select[multiple] {
} }
.save-button:disabled { .save-button:disabled {
background-color: #a0aec0; background-color: var(--bg-elevated);
color: var(--text-muted);
cursor: not-allowed; cursor: not-allowed;
} }
.feedback-message { .feedback-message {
margin-top: 1rem; margin-top: 1rem;
padding: 0.75rem; padding: 0.75rem;
border-radius: 6px; border-radius: var(--radius-sm);
text-align: center; text-align: center;
} }
.feedback-message.success { .feedback-message.success {
background-color: #c6f6d5; background-color: rgba(34, 197, 94, 0.1);
color: #22543d; color: var(--success);
} }
.feedback-message.error { .feedback-message.error {
background-color: #fed7d7; background-color: rgba(239, 68, 68, 0.1);
color: #742a2a; color: var(--error);
} }
.back-button { .back-button {
background-color: #718096; background-color: var(--bg-elevated);
color: white; color: var(--text-primary);
border: none; border: 1px solid var(--border-color);
padding: 0.6rem 1.2rem; padding: 0.6rem 1.2rem;
border-radius: 8px; border-radius: var(--radius-md);
font-size: 0.9rem; font-size: 0.9rem;
font-weight: 600; font-weight: 600;
cursor: pointer; cursor: pointer;
@@ -140,10 +143,9 @@ select[multiple] {
} }
.back-button:hover { .back-button:hover {
background-color: #4a5568; background-color: var(--bg-surface);
} }
.back-button:active { .back-button:active {
transform: translateY(1px); transform: translateY(1px);
} }

View File

@@ -1,10 +1,10 @@
.report-page { .report-page {
padding: 20px; padding: 20px;
color: #213547; color: var(--text-primary);
} }
.report-page h2 { .report-page h2 {
color: #213547; color: var(--text-primary);
} }
.page-filters { .page-filters {
@@ -16,16 +16,16 @@
} }
.page-filters select { .page-filters select {
color: #213547; color: var(--text-primary);
background-color: white; background-color: var(--bg-secondary);
max-width: 250px; max-width: 250px;
min-width: 150px; min-width: 150px;
flex: 0 1 auto; flex: 0 1 auto;
} }
.page-filters input[type="date"] { .page-filters input[type="date"] {
color: #213547; color: var(--text-primary);
background-color: white; background-color: var(--bg-secondary);
max-width: 200px; max-width: 200px;
min-width: 150px; min-width: 150px;
flex: 0 1 auto; flex: 0 1 auto;
@@ -38,36 +38,37 @@
} }
.summary-card { .summary-card {
background-color: white; background-color: var(--bg-secondary);
border-radius: 12px; border-radius: var(--radius-md);
padding: 15px 25px; padding: 15px 25px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-sm);
border: 1px solid var(--border-color);
min-width: 180px; min-width: 180px;
text-align: center; text-align: center;
color: #213547; color: var(--text-primary);
align-items: center; align-items: center;
display: block; display: block;
} }
.summary-card strong { .summary-card strong {
color: #213547; color: var(--text-secondary);
display: block; display: block;
margin-bottom: 8px; margin-bottom: 8px;
} }
.summary-card div { .summary-card div {
color: #213547; color: var(--text-primary);
font-size: 1.2em; font-size: 1.2em;
font-weight: bold; font-weight: bold;
} }
.inventory-filters { .inventory-filters {
background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%); background: var(--bg-elevated);
border-radius: 16px; border-radius: var(--radius-lg);
padding: 20px; padding: 20px;
margin-bottom: 24px; margin-bottom: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: var(--shadow-sm);
border: 1px solid rgba(0, 0, 0, 0.05); border: 1px solid var(--border-color);
display: flex; display: flex;
gap: 12px; gap: 12px;
align-items: flex-end; align-items: flex-end;
@@ -94,21 +95,19 @@
font-weight: 600; font-weight: 600;
white-space: nowrap; white-space: nowrap;
flex-shrink: 0; flex-shrink: 0;
color: #666; color: var(--text-secondary);
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.5px; letter-spacing: 0.5px;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
} }
.inventory-filters .date-input { .inventory-filters .date-input {
padding: 10px 16px; padding: 10px 16px;
border: none; border: none;
border-radius: 30px; border-radius: 30px;
background-color: white; background-color: var(--bg-secondary);
box-shadow: 0 0 0 2px #f4f4f4; box-shadow: 0 0 0 2px var(--border-color);
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
font-weight: 600; font-weight: 600;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: all 0.2s ease;
@@ -118,17 +117,17 @@
.inventory-filters .date-input:focus { .inventory-filters .date-input:focus {
outline: none; outline: none;
box-shadow: 0 0 0 2px #fcd200; box-shadow: 0 0 0 2px var(--accent-gold);
} }
.inventory-filters .date-input:hover { .inventory-filters .date-input:hover {
box-shadow: 0 0 0 2px #e6e6e6; box-shadow: 0 0 0 2px var(--border-color);
} }
@media (max-width: 768px) { @media (max-width: 768px) {
.inventory-filters { .inventory-filters {
padding: 12px; padding: 12px;
border-radius: 12px; border-radius: var(--radius-md);
gap: 10px; gap: 10px;
} }

View File

@@ -1,53 +1,14 @@
/* .new-product-container {
padding: 20px;
max-width: 600px;
margin: 0 auto;
}
.new-product-form {
display: flex;
flex-direction: column;
gap: 16px;
}
.new-product-form label {
display: flex;
flex-direction: column;
font-weight: bold;
}
.new-product-form input,
.new-product-form select {
padding: 8px;
border: 1px solid #ccc;
border-radius: 4px;
}
.new-product-form button {
background-color: #007bff;
color: white;
padding: 10px;
border: none;
border-radius: 4px;
cursor: pointer;
}
.new-product-form button:hover {
background-color: #0056b3;
} */
.new-expense-container { .new-expense-container {
color: #213547; color: var(--text-primary);
padding: 20px; padding: 20px;
} }
.form-card { .form-card {
background-color: #fff; background-color: var(--bg-secondary);
border-radius: 10px; border-radius: var(--radius-md);
padding: 20px; padding: 20px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-sm);
color: #213547; color: var(--text-primary);
} }
.form-header { .form-header {
@@ -56,14 +17,14 @@
justify-content: space-between; justify-content: space-between;
margin-bottom: 20px; margin-bottom: 20px;
padding-bottom: 1rem; padding-bottom: 1rem;
border-bottom: 1px solid #e2e8f0; border-bottom: 1px solid var(--border-color);
} }
.form-id { .form-id {
font-weight: bold; font-weight: bold;
margin-bottom: 0; margin-bottom: 0;
font-size: 24px; font-size: 24px;
color: #213547; color: var(--text-primary);
border-bottom: none; border-bottom: none;
padding-bottom: 0; padding-bottom: 0;
} }
@@ -84,21 +45,21 @@
font-size: 14px; font-size: 14px;
margin-bottom: 5px; margin-bottom: 5px;
display: block; display: block;
color: #213547; color: var(--text-primary);
} }
.form-grid input, .form-grid input,
.form-grid select { .form-grid select {
width: 100%; width: 100%;
padding: 8px 12px; padding: 8px 12px;
border: 1px solid #ccc; border: 1px solid var(--border-color);
border-radius: 6px; border-radius: var(--radius-sm);
font-size: 14px; font-size: 14px;
background-color: #f9f9f9; background-color: var(--bg-elevated);
color: #213547; color: var(--text-primary);
box-sizing: border-box; box-sizing: border-box;
height: 38px; height: 38px;
min-width: 0; /* Prevent inputs from overflowing grid cells */ min-width: 0;
} }
.form-grid input[type="file"] { .form-grid input[type="file"] {
@@ -111,8 +72,8 @@
.form-grid input:focus, .form-grid input:focus,
.form-grid select:focus { .form-grid select:focus {
outline: none; outline: none;
border-color: #ffcb05; border-color: var(--accent-gold);
background-color: #fff; background-color: var(--bg-secondary);
} }
form > div:not(.form-grid):not(.save-button-wrapper) { form > div:not(.form-grid):not(.save-button-wrapper) {
@@ -122,11 +83,11 @@ form > div:not(.form-grid):not(.save-button-wrapper) {
form > div:not(.form-grid):not(.save-button-wrapper) input { form > div:not(.form-grid):not(.save-button-wrapper) input {
width: 100%; width: 100%;
padding: 8px 12px; padding: 8px 12px;
border: 1px solid #ccc; border: 1px solid var(--border-color);
border-radius: 6px; border-radius: var(--radius-sm);
font-size: 14px; font-size: 14px;
background-color: #f9f9f9; background-color: var(--bg-elevated);
color: #213547; color: var(--text-primary);
box-sizing: border-box; box-sizing: border-box;
height: 38px; height: 38px;
} }
@@ -144,7 +105,7 @@ form > div:not(.form-grid):not(.save-button-wrapper) label {
font-size: 14px; font-size: 14px;
margin-bottom: 5px; margin-bottom: 5px;
display: block; display: block;
color: #213547; color: var(--text-primary);
} }
.save-button-wrapper { .save-button-wrapper {
@@ -154,8 +115,8 @@ form > div:not(.form-grid):not(.save-button-wrapper) label {
} }
.save-button { .save-button {
background-color: #ffcb05; background-color: var(--accent-gold);
color: #fff; color: #000;
padding: 10px 30px; padding: 10px 30px;
font-weight: bold; font-weight: bold;
border: none; border: none;
@@ -166,21 +127,21 @@ form > div:not(.form-grid):not(.save-button-wrapper) label {
} }
.save-button:hover { .save-button:hover {
background-color: #f4b400; background-color: var(--accent-gold-hover);
} }
.save-button:disabled { .save-button:disabled {
background-color: #a0aec0; background-color: var(--bg-elevated);
cursor: not-allowed; cursor: not-allowed;
opacity: 0.6; opacity: 0.6;
} }
.back-button { .back-button {
background-color: #718096; background-color: var(--bg-elevated);
color: white; color: var(--text-primary);
border: none; border: none;
padding: 0.6rem 1.2rem; padding: 0.6rem 1.2rem;
border-radius: 8px; border-radius: var(--radius-sm);
font-size: 0.9rem; font-size: 0.9rem;
font-weight: 600; font-weight: 600;
cursor: pointer; cursor: pointer;
@@ -191,7 +152,7 @@ form > div:not(.form-grid):not(.save-button-wrapper) label {
} }
.back-button:hover { .back-button:hover {
background-color: #4a5568; background-color: var(--bg-surface);
} }
.back-button:active { .back-button:active {
@@ -201,18 +162,18 @@ form > div:not(.form-grid):not(.save-button-wrapper) label {
.feedback-message { .feedback-message {
margin-top: 1rem; margin-top: 1rem;
padding: 0.75rem; padding: 0.75rem;
border-radius: 6px; border-radius: var(--radius-sm);
text-align: center; text-align: center;
} }
.feedback-message.success { .feedback-message.success {
background-color: #c6f6d5; background-color: rgba(34, 197, 94, 0.1);
color: #22543d; color: var(--success);
} }
.feedback-message.error { .feedback-message.error {
background-color: #fed7d7; background-color: rgba(239, 68, 68, 0.1);
color: #742a2a; color: var(--error);
} }
.product-table-section { .product-table-section {
@@ -226,34 +187,34 @@ form > div:not(.form-grid):not(.save-button-wrapper) label {
} }
.product-table th, .product-table td { .product-table th, .product-table td {
border: 1px solid #d4af37; /* dorado */ border: 1px solid var(--accent-gold);
padding: 8px; padding: 8px;
text-align: center; text-align: center;
} }
.product-table th { .product-table th {
background-color: #800020; /* bordo/morado oscuro, según tus imágenes */ background-color: var(--accent-gold);
color: white; color: #000;
font-weight: bold; font-weight: bold;
} }
.add-product-row { .add-product-row {
cursor: pointer; cursor: pointer;
color: #d4af37; /* dorado */ color: var(--accent-gold);
text-align: center; text-align: center;
padding: 10px; padding: 10px;
font-style: italic; font-style: italic;
} }
.tax-pill { .tax-pill {
background-color: white; background-color: var(--bg-secondary);
border: 1px solid #d4af37; border: 1px solid var(--accent-gold);
border-radius: 12px; border-radius: 12px;
padding: 2px 6px; padding: 2px 6px;
color: #800020; color: var(--accent-gold);
} }
.product-table tfoot td { .product-table tfoot td {
border-top: 2px solid #d4af37; border-top: 2px solid var(--accent-gold);
padding: 8px; padding: 8px;
} }

View File

@@ -1,10 +1,10 @@
.outcomes-page .filters-section { .outcomes-page .filters-section {
background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%); background: var(--bg-elevated);
border-radius: 16px; border-radius: var(--radius-lg);
padding: 20px; padding: 20px;
margin-bottom: 24px; margin-bottom: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: var(--shadow-sm);
border: 1px solid rgba(0, 0, 0, 0.05); border: 1px solid var(--border-color);
display: flex; display: flex;
gap: 12px; gap: 12px;
align-items: center; align-items: center;
@@ -26,7 +26,7 @@
@media (max-width: 768px) { @media (max-width: 768px) {
.outcomes-page .filters-section { .outcomes-page .filters-section {
padding: 12px; padding: 12px;
border-radius: 12px; border-radius: var(--radius-md);
gap: 10px; gap: 10px;
} }

View File

@@ -1,12 +1,10 @@
/* src/pages/Inventory/Products.css */
.products-page-container { .products-page-container {
padding: 20px; padding: 20px;
color: #213547; color: var(--text-primary);
} }
.products-page-container h2 { .products-page-container h2 {
color: #213547; color: var(--text-primary);
} }
.products-grid { .products-grid {
@@ -17,15 +15,15 @@
} }
.product-card { .product-card {
background-color: white; background-color: var(--bg-secondary);
border: 1px solid #e2e2e2; border: 1px solid var(--border-color);
border-radius: 8px; border-radius: var(--radius-sm);
padding: 15px; padding: 15px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1); box-shadow: var(--shadow-sm);
cursor: pointer; cursor: pointer;
text-align: center; text-align: center;
transition: transform 0.2s; transition: transform 0.2s;
color: #213547; color: var(--text-primary);
} }
.product-card:hover { .product-card:hover {
@@ -37,7 +35,7 @@
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
color: #666; color: var(--text-secondary);
font-size: 1.2em; font-size: 1.2em;
font-weight: bold; font-weight: bold;
} }
@@ -60,13 +58,13 @@
.product-name { .product-name {
font-weight: bold; font-weight: bold;
margin-bottom: 5px; margin-bottom: 5px;
color: #213547; color: var(--text-primary);
} }
.product-price, .product-price,
.product-units { .product-units {
font-size: 0.9em; font-size: 0.9em;
color: #444; color: var(--text-secondary);
} }
.page-filters { .page-filters {
@@ -78,8 +76,8 @@
} }
.page-filters select { .page-filters select {
color: #213547; color: var(--text-primary);
background-color: white; background-color: var(--bg-elevated);
max-width: 250px; max-width: 250px;
min-width: 150px; min-width: 150px;
flex: 0 1 auto; flex: 0 1 auto;
@@ -87,15 +85,15 @@
.page-filters input[type="text"], .page-filters input[type="text"],
.page-filters .filter-search-input { .page-filters .filter-search-input {
color: #213547; color: var(--text-primary);
background-color: white; background-color: var(--bg-elevated);
max-width: 300px; max-width: 300px;
min-width: 200px; min-width: 200px;
flex: 0 1 auto; flex: 0 1 auto;
padding: 10px 16px; padding: 10px 16px;
border: none; border: none;
border-radius: 30px; border-radius: 30px;
box-shadow: 0 0 0 2px #f4f4f4; box-shadow: 0 0 0 2px var(--border-color);
font-size: 14px; font-size: 14px;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
font-weight: bold; font-weight: bold;
@@ -103,20 +101,20 @@
} }
.page-filters p { .page-filters p {
color: #213547; color: var(--text-primary);
} }
.products-page-container p { .products-page-container p {
color: #213547; color: var(--text-primary);
} }
.products-filters { .products-filters {
background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%); background: var(--bg-primary);
border-radius: 16px; border-radius: var(--radius-lg);
padding: 20px; padding: 20px;
margin-bottom: 24px; margin-bottom: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: var(--shadow-sm);
border: 1px solid rgba(0, 0, 0, 0.05); border: 1px solid var(--border-color);
display: flex; display: flex;
gap: 12px; gap: 12px;
align-items: center; align-items: center;
@@ -133,7 +131,7 @@
@media (max-width: 768px) { @media (max-width: 768px) {
.products-filters { .products-filters {
padding: 12px; padding: 12px;
border-radius: 12px; border-radius: var(--radius-md);
gap: 10px; gap: 10px;
} }

View File

@@ -111,11 +111,14 @@ export default function Login() {
{error && ( {error && (
<div <div
style={{ style={{
color: "red", color: "var(--error)",
fontSize: "14px", fontSize: "0.85rem",
fontWeight: "700", fontWeight: "600",
textAlign: "center", textAlign: "center",
marginBottom: "5px", padding: "8px",
background: "rgba(239, 68, 68, 0.1)",
borderRadius: "var(--radius-md)",
border: "1px solid rgba(239, 68, 68, 0.2)",
}} }}
> >
{error} {error}

View File

@@ -1,9 +1,10 @@
.contract-detail-container { .contract-detail-container {
background: #f9f9f9; background: var(--bg-elevated);
padding: 30px; padding: 30px;
border-radius: 12px; border-radius: var(--radius-md);
max-width: 1100px; max-width: 1100px;
margin: auto; margin: auto;
border: 1px solid var(--border-color);
} }
.form-grid { .form-grid {
@@ -16,14 +17,17 @@
font-weight: 600; font-weight: 600;
margin-bottom: 5px; margin-bottom: 5px;
display: block; display: block;
color: var(--text-primary);
} }
.form-grid input, .form-grid input,
.form-grid select { .form-grid select {
width: 100%; width: 100%;
padding: 8px; padding: 8px;
border-radius: 6px; border-radius: var(--radius-sm);
border: 1px solid #ccc; border: 1px solid var(--border-color);
background-color: var(--bg-secondary);
color: var(--text-primary);
} }
.uniforms-section { .uniforms-section {
@@ -42,124 +46,15 @@
} }
.save-button-container button { .save-button-container button {
background-color: #f0ad4e; background-color: var(--warning);
border: none; border: none;
color: white;
padding: 10px 20px;
border-radius: 8px;
font-size: 16px;
cursor: pointer;
}
.save-button-container button:hover {
background-color: #ec971f;
}
/* .uniforms-container {
display: grid;
grid-template-columns: 1.2fr 0.8fr;
align-items: start;
gap: 24px;
margin-top: 10px;
width: 100%;
max-width: 900px;
}
.uniform-checkbox-list {
display: flex;
flex-direction: column;
gap: 6px;
flex: 1;
}
.uniform-chips {
display: flex;
flex-wrap: wrap;
gap: 8px;
flex: 1;
justify-content: flex-start;
align-content: flex-start;
padding-top: 4px;
}
.uniforms-container label {
display: flex;
align-items: center;
gap: 8px;
}
.checkbox-item {
display: flex;
align-items: center;
gap: 8px;
font-size: 14px;
}
.checkbox-item input[type="checkbox"] {
width: 18px;
height: 18px;
cursor: pointer;
}
.chip {
background-color: #e0e0e0;
border-radius: 16px;
padding: 4px 10px;
display: flex;
align-items: center;
font-size: 14px;
}
.remove-chip {
background: transparent;
border: none;
font-size: 16px;
margin-left: 6px;
cursor: pointer;
color: #444;
}
.remove-chip:hover {
color: #d00;
}
.chip {
display: inline-flex;
align-items: center;
background-color: #f5f5f5;
border: 2px solid #ccc;
border-radius: 20px;
padding: 6px 12px;
font-size: 14px;
cursor: pointer;
transition: all 0.2s ease;
color: #333;
}
.chip.selected {
background-color: #ffcb05;
border-color: #e0b400;
color: #000; color: #000;
font-weight: bold; padding: 10px 20px;
} border-radius: var(--radius-md);
font-size: 16px;
.chip button {
background: transparent;
border: none;
color: #555;
margin-left: 6px;
font-size: 14px;
cursor: pointer; cursor: pointer;
} }
.chip button:hover { .save-button-container button:hover {
color: #b30000; background-color: var(--accent-gold-hover);
} }
.chip:hover {
background-color: #f0f0f0;
transform: translateY(-2px);
}
.chip.selected:hover {
background-color: #e6b800;
transform: translateY(-2px);
} */

View File

@@ -1,10 +1,10 @@
.payroll-page .filters-section { .payroll-page .filters-section {
background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%); background: var(--bg-primary);
border-radius: 16px; border-radius: var(--radius-lg);
padding: 20px; padding: 20px;
margin-bottom: 24px; margin-bottom: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: var(--shadow-sm);
border: 1px solid rgba(0, 0, 0, 0.05); border: 1px solid var(--border-color);
display: flex; display: flex;
gap: 12px; gap: 12px;
align-items: flex-end; align-items: flex-end;
@@ -29,7 +29,7 @@
.payroll-page .filters-section .date-label { .payroll-page .filters-section .date-label {
font-size: 12px; font-size: 12px;
font-weight: 600; font-weight: 600;
color: #666; color: var(--text-secondary);
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.5px; letter-spacing: 0.5px;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
@@ -41,10 +41,10 @@
padding: 10px 16px; padding: 10px 16px;
border: none; border: none;
border-radius: 30px; border-radius: 30px;
background-color: white; background-color: var(--bg-elevated);
box-shadow: 0 0 0 2px #f4f4f4; box-shadow: 0 0 0 2px var(--border-color);
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
font-weight: 600; font-weight: 600;
cursor: pointer; cursor: pointer;
@@ -55,11 +55,11 @@
.payroll-page .filters-section .date-input:focus { .payroll-page .filters-section .date-input:focus {
outline: none; outline: none;
box-shadow: 0 0 0 2px #fcd200; box-shadow: 0 0 0 2px var(--accent-gold);
} }
.payroll-page .filters-section .date-input:hover { .payroll-page .filters-section .date-input:hover {
box-shadow: 0 0 0 2px #e6e6e6; box-shadow: 0 0 0 2px var(--border-color);
} }
.payroll-page .filters-section .filter-select { .payroll-page .filters-section .filter-select {
@@ -74,7 +74,7 @@
@media (max-width: 768px) { @media (max-width: 768px) {
.payroll-page .filters-section { .payroll-page .filters-section {
padding: 12px; padding: 12px;
border-radius: 12px; border-radius: var(--radius-md);
gap: 10px; gap: 10px;
} }

View File

@@ -1,10 +1,10 @@
.payroll-attendance-page .filters-section { .payroll-attendance-page .filters-section {
background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%); background: var(--bg-elevated);
border-radius: 16px; border-radius: var(--radius-lg);
padding: 20px; padding: 20px;
margin-bottom: 24px; margin-bottom: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: var(--shadow-sm);
border: 1px solid rgba(0, 0, 0, 0.05); border: 1px solid var(--border-color);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 12px; gap: 12px;
@@ -46,10 +46,9 @@
.payroll-attendance-page .filters-section .date-label { .payroll-attendance-page .filters-section .date-label {
font-size: 12px; font-size: 12px;
font-weight: 600; font-weight: 600;
color: #666; color: var(--text-secondary);
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.5px; letter-spacing: 0.5px;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
white-space: nowrap; white-space: nowrap;
flex-shrink: 0; flex-shrink: 0;
} }
@@ -58,11 +57,10 @@
padding: 10px 16px; padding: 10px 16px;
border: none; border: none;
border-radius: 30px; border-radius: 30px;
background-color: white; background-color: var(--bg-secondary);
box-shadow: 0 0 0 2px #f4f4f4; box-shadow: 0 0 0 2px var(--border-color);
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
font-weight: 600; font-weight: 600;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: all 0.2s ease;
@@ -72,11 +70,11 @@
.payroll-attendance-page .filters-section .date-input:focus { .payroll-attendance-page .filters-section .date-input:focus {
outline: none; outline: none;
box-shadow: 0 0 0 2px #fcd200; box-shadow: 0 0 0 2px var(--accent-gold);
} }
.payroll-attendance-page .filters-section .date-input:hover { .payroll-attendance-page .filters-section .date-input:hover {
box-shadow: 0 0 0 2px #e6e6e6; box-shadow: 0 0 0 2px var(--border-color);
} }
.payroll-attendance-page .filters-section .filter-select { .payroll-attendance-page .filters-section .filter-select {
@@ -87,7 +85,7 @@
@media (max-width: 768px) { @media (max-width: 768px) {
.payroll-attendance-page .filters-section { .payroll-attendance-page .filters-section {
padding: 12px; padding: 12px;
border-radius: 12px; border-radius: var(--radius-md);
gap: 10px; gap: 10px;
} }

View File

@@ -1,10 +1,10 @@
.payroll-contract-page .filters-section { .payroll-contract-page .filters-section {
background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%); background: var(--bg-primary);
border-radius: 16px; border-radius: var(--radius-lg);
padding: 20px; padding: 20px;
margin-bottom: 24px; margin-bottom: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: var(--shadow-sm);
border: 1px solid rgba(0, 0, 0, 0.05); border: 1px solid var(--border-color);
display: flex; display: flex;
gap: 12px; gap: 12px;
align-items: flex-end; align-items: flex-end;
@@ -23,7 +23,7 @@
.payroll-contract-page .filters-section .date-label { .payroll-contract-page .filters-section .date-label {
font-size: 12px; font-size: 12px;
font-weight: 600; font-weight: 600;
color: #666; color: var(--text-secondary);
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.5px; letter-spacing: 0.5px;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
@@ -35,10 +35,10 @@
padding: 10px 16px; padding: 10px 16px;
border: none; border: none;
border-radius: 30px; border-radius: 30px;
background-color: white; background-color: var(--bg-elevated);
box-shadow: 0 0 0 2px #f4f4f4; box-shadow: 0 0 0 2px var(--border-color);
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
font-weight: 600; font-weight: 600;
cursor: pointer; cursor: pointer;
@@ -49,11 +49,11 @@
.payroll-contract-page .filters-section .date-input:focus { .payroll-contract-page .filters-section .date-input:focus {
outline: none; outline: none;
box-shadow: 0 0 0 2px #fcd200; box-shadow: 0 0 0 2px var(--accent-gold);
} }
.payroll-contract-page .filters-section .date-input:hover { .payroll-contract-page .filters-section .date-input:hover {
box-shadow: 0 0 0 2px #e6e6e6; box-shadow: 0 0 0 2px var(--border-color);
} }
.payroll-contract-page .filters-section .filter-select { .payroll-contract-page .filters-section .filter-select {
@@ -68,7 +68,7 @@
@media (max-width: 768px) { @media (max-width: 768px) {
.payroll-contract-page .filters-section { .payroll-contract-page .filters-section {
padding: 12px; padding: 12px;
border-radius: 12px; border-radius: var(--radius-md);
gap: 10px; gap: 10px;
} }

View File

@@ -1,10 +1,10 @@
.payroll-employees-page .filters-section { .payroll-employees-page .filters-section {
background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%); background: var(--bg-elevated);
border-radius: 16px; border-radius: var(--radius-lg);
padding: 20px; padding: 20px;
margin-bottom: 24px; margin-bottom: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: var(--shadow-sm);
border: 1px solid rgba(0, 0, 0, 0.05); border: 1px solid var(--border-color);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 12px; gap: 12px;
@@ -46,10 +46,9 @@
.payroll-employees-page .filters-section .date-label { .payroll-employees-page .filters-section .date-label {
font-size: 12px; font-size: 12px;
font-weight: 600; font-weight: 600;
color: #666; color: var(--text-secondary);
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.5px; letter-spacing: 0.5px;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
white-space: nowrap; white-space: nowrap;
flex-shrink: 0; flex-shrink: 0;
} }
@@ -58,11 +57,10 @@
padding: 10px 16px; padding: 10px 16px;
border: none; border: none;
border-radius: 30px; border-radius: 30px;
background-color: white; background-color: var(--bg-secondary);
box-shadow: 0 0 0 2px #f4f4f4; box-shadow: 0 0 0 2px var(--border-color);
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
font-weight: 600; font-weight: 600;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: all 0.2s ease;
@@ -72,11 +70,11 @@
.payroll-employees-page .filters-section .date-input:focus { .payroll-employees-page .filters-section .date-input:focus {
outline: none; outline: none;
box-shadow: 0 0 0 2px #fcd200; box-shadow: 0 0 0 2px var(--accent-gold);
} }
.payroll-employees-page .filters-section .date-input:hover { .payroll-employees-page .filters-section .date-input:hover {
box-shadow: 0 0 0 2px #e6e6e6; box-shadow: 0 0 0 2px var(--border-color);
} }
.payroll-employees-page .filters-section .filter-select { .payroll-employees-page .filters-section .filter-select {
@@ -87,7 +85,7 @@
@media (max-width: 768px) { @media (max-width: 768px) {
.payroll-employees-page .filters-section { .payroll-employees-page .filters-section {
padding: 12px; padding: 12px;
border-radius: 12px; border-radius: var(--radius-md);
gap: 10px; gap: 10px;
} }

View File

@@ -12,22 +12,22 @@
cursor: pointer; cursor: pointer;
user-select: none; user-select: none;
padding: 6px 12px; padding: 6px 12px;
border-radius: 6px; border-radius: var(--radius-sm);
border: 1px solid #e0e0e0; border: 1px solid var(--border-color);
background-color: #fafafa; background-color: var(--bg-elevated);
transition: all 0.2s ease; transition: all 0.2s ease;
font-size: 14px; font-size: 14px;
} }
.checkbox-item:hover { .checkbox-item:hover {
background-color: #f0f8ff; background-color: var(--bg-surface);
border-color: #fcd200; border-color: var(--accent-gold);
} }
.checkbox-item input[type="checkbox"] { .checkbox-item input[type="checkbox"] {
width: 16px; width: 16px;
height: 16px; height: 16px;
accent-color: #fcd200; accent-color: var(--accent-gold);
cursor: pointer; cursor: pointer;
margin: 0; margin: 0;
} }
@@ -40,20 +40,20 @@
} }
.chip { .chip {
background-color: #fcd200; background-color: var(--accent-gold);
color: #333; color: #000;
border-radius: 20px; border-radius: var(--radius-xl);
padding: 6px 12px; padding: 6px 12px;
display: flex; display: flex;
align-items: center; align-items: center;
font-size: 13px; font-size: 13px;
font-weight: 500; font-weight: 500;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-sm);
transition: all 0.2s ease; transition: all 0.2s ease;
} }
.chip:hover { .chip:hover {
background-color: #f4b400; background-color: var(--accent-gold-hover);
} }
.remove-chip { .remove-chip {
@@ -62,19 +62,19 @@
font-size: 18px; font-size: 18px;
margin-left: 8px; margin-left: 8px;
cursor: pointer; cursor: pointer;
color: #333; color: #000;
padding: 0; padding: 0;
line-height: 1; line-height: 1;
transition: color 0.2s ease; transition: color 0.2s ease;
} }
.remove-chip:hover { .remove-chip:hover {
color: #d00; color: var(--error);
transform: scale(1.1); transform: scale(1.1);
} }
.new-expense-container h2 { .new-expense-container h2 {
color: #333; color: var(--text-primary);
font-size: 24px; font-size: 24px;
font-weight: bold; font-weight: bold;
text-align: center; text-align: center;
@@ -89,9 +89,10 @@
} }
.form-card { .form-card {
background-color: #fff; background-color: var(--bg-secondary);
border-radius: 10px; border-radius: var(--radius-md);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-md);
border: 1px solid var(--border-color);
box-sizing: border-box; box-sizing: border-box;
} }
@@ -105,7 +106,7 @@
.form-grid label { .form-grid label {
font-weight: 600; font-weight: 600;
font-size: 14px; font-size: 14px;
color: #333; color: var(--text-primary);
margin-bottom: 6px; margin-bottom: 6px;
display: block; display: block;
} }
@@ -114,10 +115,11 @@
.form-grid select { .form-grid select {
width: 100%; width: 100%;
padding: 10px 12px; padding: 10px 12px;
border: 2px solid #e0e0e0; border: 2px solid var(--border-color);
border-radius: 8px; border-radius: var(--radius-md);
font-size: 14px; font-size: 14px;
background-color: #fff; background-color: var(--bg-secondary);
color: var(--text-primary);
transition: all 0.2s ease; transition: all 0.2s ease;
box-sizing: border-box; box-sizing: border-box;
} }
@@ -125,14 +127,14 @@
.form-grid input:focus, .form-grid input:focus,
.form-grid select:focus { .form-grid select:focus {
outline: none; outline: none;
border-color: #fcd200; border-color: var(--accent-gold);
box-shadow: 0 0 0 3px rgba(252, 210, 0, 0.1); box-shadow: 0 0 0 3px var(--accent-gold-muted);
} }
.form-grid input.readonly-input { .form-grid input.readonly-input {
background-color: #f8f9fa; background-color: var(--bg-elevated);
cursor: not-allowed; cursor: not-allowed;
color: #6c757d; color: var(--text-muted);
} }
.uniform-section { .uniform-section {
@@ -144,26 +146,26 @@
justify-content: flex-end; justify-content: flex-end;
margin-top: 24px; margin-top: 24px;
padding-top: 20px; padding-top: 20px;
border-top: 1px solid #e0e0e0; border-top: 1px solid var(--border-color);
} }
.save-button { .save-button {
background-color: #fcd200; background-color: var(--accent-gold);
color: #333; color: #000;
padding: 12px 24px; padding: 12px 24px;
font-weight: 600; font-weight: 600;
border: none; border: none;
border-radius: 8px; border-radius: var(--radius-md);
font-size: 16px; font-size: 16px;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: all 0.2s ease;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-sm);
} }
.save-button:hover { .save-button:hover {
background-color: #f4b400; background-color: var(--accent-gold-hover);
transform: translateY(-1px); transform: translateY(-1px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15); box-shadow: var(--shadow-md);
} }
.save-button:active { .save-button:active {

View File

@@ -8,7 +8,7 @@
} }
.page-title { .page-title {
color: #1a1a1a; color: var(--text-primary);
font-size: 28px; font-size: 28px;
font-weight: 700; font-weight: 700;
margin: 0; margin: 0;
@@ -17,10 +17,10 @@
} }
.table-section { .table-section {
background: white; background: var(--bg-secondary);
border-radius: 16px; border-radius: var(--radius-lg);
padding: 24px; padding: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-sm);
min-height: 400px; min-height: 400px;
} }
@@ -45,7 +45,7 @@
.table-section { .table-section {
padding: 16px; padding: 16px;
border-radius: 12px; border-radius: var(--radius-md);
} }
} }
@@ -58,4 +58,3 @@
padding: 12px; padding: 12px;
} }
} }

View File

@@ -114,8 +114,8 @@ export default function NewReservation() {
{rooms {rooms
.filter((rm) => rm.status === "available") .filter((rm) => rm.status === "available")
.map((rm) => ( .map((rm) => (
<option key={rm.id_room} value={rm.id_room}> <option key={rm.id} value={rm.id}>
{rm.name_room} - {rm.bed_type} {rm.room_number} - {rm.room_type}
</option> </option>
))} ))}
</select> </select>

View File

@@ -60,14 +60,14 @@ export default function ReservationCard({ reservation, onStatusChange }) {
</span> </span>
</div> </div>
{r.name_room && ( {r.room_number && (
<div> <div>
<span className="badge badge-info" style={{ fontSize: "0.7rem" }}> <span className="badge badge-info" style={{ fontSize: "0.7rem" }}>
{r.name_room} {r.room_number}
</span> </span>
{r.bed_type && ( {r.room_type && (
<span style={{ fontSize: "0.75rem", color: "var(--text-muted)", marginLeft: "var(--space-sm)" }}> <span style={{ fontSize: "0.75rem", color: "var(--text-muted)", marginLeft: "var(--space-sm)" }}>
{r.bed_type} {r.room_type}
</span> </span>
)} )}
</div> </div>

View File

@@ -20,7 +20,7 @@ export default function RoomDetailModal({ room, onClose, onStatusChange }) {
}} }}
> >
<h2 style={{ margin: 0 }}> <h2 style={{ margin: 0 }}>
{t("rooms.roomNumber")}: {room.name_room} {t("rooms.roomNumber")}: {room.room_number}
</h2> </h2>
<button <button
className="btn-outline btn-sm" className="btn-outline btn-sm"
@@ -42,7 +42,7 @@ export default function RoomDetailModal({ room, onClose, onStatusChange }) {
<div> <div>
<span className="label-dark">{t("rooms.roomType")}</span> <span className="label-dark">{t("rooms.roomType")}</span>
<p style={{ margin: 0, color: "var(--text-primary)" }}> <p style={{ margin: 0, color: "var(--text-primary)" }}>
{room.bed_type} {room.room_type}
</p> </p>
</div> </div>
<div> <div>
@@ -151,7 +151,7 @@ export default function RoomDetailModal({ room, onClose, onStatusChange }) {
{room.status === "available" && ( {room.status === "available" && (
<button <button
className="btn-danger" className="btn-danger"
onClick={() => onStatusChange(room.id_room, "maintenance")} onClick={() => onStatusChange(room.id, "maintenance")}
> >
{t("rooms.maintenance")} {t("rooms.maintenance")}
</button> </button>
@@ -159,7 +159,7 @@ export default function RoomDetailModal({ room, onClose, onStatusChange }) {
{room.status === "cleaning" && ( {room.status === "cleaning" && (
<button <button
className="btn-success" className="btn-success"
onClick={() => onStatusChange(room.id_room, "available")} onClick={() => onStatusChange(room.id, "available")}
> >
{t("rooms.available")} {t("rooms.available")}
</button> </button>
@@ -167,7 +167,7 @@ export default function RoomDetailModal({ room, onClose, onStatusChange }) {
{room.status === "maintenance" && ( {room.status === "maintenance" && (
<button <button
className="btn-success" className="btn-success"
onClick={() => onStatusChange(room.id_room, "available")} onClick={() => onStatusChange(room.id, "available")}
> >
{t("rooms.available")} {t("rooms.available")}
</button> </button>

View File

@@ -34,11 +34,11 @@ export default function RoomGrid({ rooms, onRoomClick }) {
<div className="grid-5"> <div className="grid-5">
{roomsByFloor[floor].map((room) => ( {roomsByFloor[floor].map((room) => (
<div <div
key={room.id_room} key={room.id}
className={`room-card ${room.status || "available"}`} className={`room-card ${room.status || "available"}`}
onClick={() => onRoomClick(room)} onClick={() => onRoomClick(room)}
> >
<div className="room-number">{room.name_room}</div> <div className="room-number">{room.room_number}</div>
{room.guest_name && ( {room.guest_name && (
<div className="room-info">{room.guest_name}</div> <div className="room-info">{room.guest_name}</div>
)} )}

View File

@@ -148,8 +148,8 @@ export default function NewOrder() {
> >
<option value="">{t("common.room")}...</option> <option value="">{t("common.room")}...</option>
{rooms.map((room) => ( {rooms.map((room) => (
<option key={room.id_room} value={room.id_room}> <option key={room.id} value={room.id}>
{room.name_room} - {t("rooms.floor")} {room.floor} {room.room_number} - {t("rooms.floor")} {room.floor}
</option> </option>
))} ))}
</select> </select>

View File

@@ -130,7 +130,7 @@ export default function RoomServiceOrders() {
color: "var(--text-primary)", color: "var(--text-primary)",
}} }}
> >
{order.name_room || `Room ${order.room_id}`} {order.room_number || `Room ${order.room_id}`}
</h3> </h3>
{order.guest_name && ( {order.guest_name && (
<p <p

View File

@@ -57,9 +57,9 @@ export default function Schedules() {
const schedules = schedRes.data.schedules || []; const schedules = schedRes.data.schedules || [];
const newGrid = {}; const newGrid = {};
for (const emp of emps) { for (const emp of emps) {
newGrid[emp.id_employee] = {}; newGrid[emp.id] = {};
for (const wd of weekDates) { for (const wd of weekDates) {
newGrid[emp.id_employee][formatDate(wd)] = "off"; newGrid[emp.id][formatDate(wd)] = "off";
} }
} }
for (const s of schedules) { for (const s of schedules) {
@@ -237,14 +237,14 @@ export default function Schedules() {
</tr> </tr>
) : ( ) : (
employees.map((emp) => ( employees.map((emp) => (
<tr key={emp.id_employee}> <tr key={emp.id}>
<td style={{ fontWeight: 600 }}> <td style={{ fontWeight: 600 }}>
{emp.first_name} {emp.last_name} {emp.first_name} {emp.last_name}
</td> </td>
{weekDates.map((wd) => { {weekDates.map((wd) => {
const dateStr = formatDate(wd); const dateStr = formatDate(wd);
const shift = grid[emp.id_employee]?.[dateStr] || "off"; const shift = grid[emp.id]?.[dateStr] || "off";
const changeKey = `${emp.id_employee}_${dateStr}`; const changeKey = `${emp.id}_${dateStr}`;
const isChanged = changes[changeKey] !== undefined; const isChanged = changes[changeKey] !== undefined;
return ( return (
@@ -256,7 +256,7 @@ export default function Schedules() {
userSelect: "none", userSelect: "none",
position: "relative", position: "relative",
}} }}
onClick={() => handleCellClick(emp.id_employee, dateStr)} onClick={() => handleCellClick(emp.id, dateStr)}
> >
<span <span
className={getShiftClass(shift)} className={getShiftClass(shift)}

View File

@@ -6,26 +6,26 @@
.room-table { .room-table {
width: 100%; width: 100%;
border-collapse: collapse; border-collapse: collapse;
background-color: white; background-color: var(--bg-secondary);
font-size: 0.95rem; font-size: 0.95rem;
} }
.room-table th { .room-table th {
background-color: #791313; background-color: var(--accent-gold);
color: white; color: #000;
padding: 0.75rem; padding: 0.75rem;
text-align: left; text-align: left;
font-weight: bold; font-weight: bold;
border: 1px solid #e3b600; border: 1px solid var(--accent-gold);
} }
.room-table td { .room-table td {
padding: 0.75rem; padding: 0.75rem;
border: 1px solid #e3b600; border: 1px solid var(--accent-gold);
text-align: left; text-align: left;
} }
.room-table td a { .room-table td a {
color: #791313; color: var(--accent-gold);
text-decoration: underline; text-decoration: underline;
} }

View File

@@ -9,10 +9,10 @@
} }
.form-card { .form-card {
background-color: #ffffff; background-color: var(--bg-secondary);
border-radius: 12px; border-radius: var(--radius-md);
padding: 1.5rem; padding: 1.5rem;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-sm);
font-family: Montserrat; font-family: Montserrat;
} }
@@ -32,8 +32,10 @@
.form-grid select { .form-grid select {
width: 80%; width: 80%;
padding: 8px; padding: 8px;
border-radius: 6px; border-radius: var(--radius-sm);
border: 1px solid #ccc; border: 1px solid var(--border-color);
background-color: var(--bg-elevated);
color: var(--text-primary);
font-family: Montserrat; font-family: Montserrat;
} }
@@ -61,8 +63,8 @@
} }
.save-button { .save-button {
background-color: #e3b600; background-color: var(--accent-gold);
color: white; color: #000;
padding: 10px 20px; padding: 10px 20px;
border: none; border: none;
font-weight: bold; font-weight: bold;
@@ -71,5 +73,5 @@
} }
.save-button:hover { .save-button:hover {
background-color: #c9a300; background-color: var(--accent-gold-hover);
} }

View File

@@ -1,176 +1,178 @@
/* ========================================
DASHBOARD LAYOUT
======================================== */
/* Contenedor principal */
.dashboard-layout { .dashboard-layout {
display: flex; display: flex;
font-family: sans-serif; font-family: var(--font-sans);
min-height: 100vh; min-height: 100vh;
height: auto;
} }
/* ========================================
SIDEBAR
======================================== */
.sidebar { .sidebar {
background: linear-gradient(to bottom, var(--bg-secondary), var(--bg-primary)); background: var(--sidebar-bg);
color: white; border-right: 1px solid var(--border-color);
width: 200px; color: var(--text-primary);
width: 220px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
padding: 20px; padding: var(--space-lg) var(--space-md);
min-height: 100vh; min-height: 100vh;
justify-content: flex-start; flex-shrink: 0;
}
.sidebar nav {
display: flex;
flex-direction: column;
gap: 2px;
} }
.sidebar nav a { .sidebar nav a {
display: flex; display: block;
flex-direction: column; color: var(--text-secondary);
color: #ffffff;
text-decoration: none; text-decoration: none;
padding: 8px; padding: 10px 14px;
border-radius: 6px; border-radius: var(--radius-md);
font-size: x-large; font-size: 0.95rem;
font-weight: 500; font-weight: 500;
transition: color 0.2s; transition: all 0.2s ease;
font-family: Georgia, 'Times New Roman', Times, serif; font-family: var(--font-sans);
border-left: 3px solid transparent;
} }
.sidebar nav a:hover { .sidebar nav a:hover {
background: var(--accent-gold-muted); background: var(--sidebar-hover);
color: var(--accent-gold); color: var(--accent-gold);
} }
.sidebar-header { .sidebar nav a.active {
display: flex; background: var(--sidebar-active);
align-items: center;
gap: 10px;
margin-bottom: 1rem;
}
.sidebar-toggle-button {
font-size: 1rem;
background: none;
border: none;
color: white;
cursor: pointer;
border-radius: 38px;
}
.sidebar-toggle-button:focus {
outline: none;
background: var(--accent-gold-muted);
box-shadow: 0 0 0 3px var(--accent-gold);
background-color: var(--accent-gold-muted);
}
.menu-btn {
background: none;
border: none;
font-size: 1.5rem;
color: white;
cursor: pointer;
}
.sidebar-title {
font-size: 1.2rem;
font-weight: bold;
}
/* Menú */
.menu-items {
display: flex;
flex-direction: column;
gap: 1rem;
}
.menu-items a {
color: white;
text-decoration: none;
font-size: 1rem;
padding: 5px 10px;
border-radius: 5px;
}
.menu-items a:hover {
background-color: var(--accent-gold-muted);
color: var(--accent-gold); color: var(--accent-gold);
border-left-color: var(--accent-gold);
font-weight: 600;
} }
/* Área principal */ /* ========================================
MAIN CONTENT
======================================== */
.main-content { .main-content {
flex: 1; flex: 1;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
overflow: auto; overflow: auto;
min-height: 100vh; min-height: 100vh;
min-width: 0;
} }
.content { .content {
padding: 2rem; padding: var(--space-xl);
background-color: var(--bg-primary); background-color: var(--bg-primary);
flex: 1; flex: 1;
overflow-y: auto; /* Permite scroll vertical si es necesario */ overflow-y: auto;
} }
/* ========================================
TOPBAR
======================================== */
.topbar { .topbar {
background-color: var(--bg-secondary); background: var(--glass-bg);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
padding: 0.1rem 0.4rem; padding: 0.4rem 1rem;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); border-bottom: 1px solid var(--border-color);
border-bottom: 2px solid var(--accent-gold); position: sticky;
top: 0;
z-index: 100;
} }
.topbar-header { .topbar-header {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
margin-bottom: 0rem;
} }
.topbar-title { .topbar-title {
font-size: 1.2rem; font-size: 1.1rem;
font-weight: 600; font-weight: 600;
color: #ffffff; color: var(--text-primary);
font-family: var(--font-display);
} }
.topbar-submenu { .topbar-submenu {
display: flex; display: flex;
font-family:'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif; gap: 6px;
gap: 15px;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: center; justify-content: center;
margin-top: 0; padding: 4px 0;
padding: 0.2rem 0;
} }
.submenu-link { .submenu-link {
font-size: 1.2rem; font-size: 0.8rem;
padding: 3px 6px; padding: 4px 12px;
border-radius: 4px; border-radius: 20px;
background: var(--accent-gold-muted); background: var(--accent-gold-muted);
color: var(--accent-gold); color: var(--accent-gold);
font-weight: 600; font-weight: 600;
text-decoration: none; text-decoration: none;
transition: background-color 0.5s ease; transition: all 0.2s ease;
font-family: var(--font-sans);
} }
.submenu-link:hover { .submenu-link:hover {
background-color: rgba(212, 165, 116, 0.25); background: rgba(212, 165, 116, 0.2);
} }
.topbar-left { .submenu-link.active {
display: flex; background: var(--accent-gold);
align-items: center; color: #000;
gap: 1rem;
} }
/* ========================================
SIDEBAR TOGGLE
======================================== */
.sidebar-toggle-button {
font-size: 1.1rem;
background: none;
border: none;
color: var(--text-primary);
cursor: pointer;
border-radius: var(--radius-md);
padding: 6px 8px;
transition: all 0.2s ease;
}
.sidebar-toggle-button:hover {
background: var(--accent-gold-muted);
color: var(--accent-gold);
}
.sidebar-toggle-button:focus {
outline: none;
box-shadow: 0 0 0 2px var(--accent-gold);
}
/* ========================================
TOPBAR ICONS
======================================== */
.topbar-icons { .topbar-icons {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 20px; gap: 12px;
} }
.topbar-icon { .topbar-icon {
font-size: 1.6rem; font-size: 1.2rem;
cursor: pointer; cursor: pointer;
color: #ffffff; color: var(--text-secondary);
transition: color 0.2s ease; transition: color 0.2s ease;
} }
@@ -178,204 +180,78 @@
color: var(--accent-gold); color: var(--accent-gold);
} }
.submenu-link:hover { /* ========================================
background-color: rgba(212, 165, 116, 0.25); LANGUAGE SELECT
} ======================================== */
.language-select { .language-select {
padding: 6px 10px; padding: 5px 10px;
border-radius: 20px; border-radius: 20px;
background-color: var(--bg-elevated); background-color: var(--bg-elevated);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
font-size: 0.9rem; font-size: 0.8rem;
font-weight: bold; font-weight: 600;
color: var(--text-primary); color: var(--text-primary);
cursor: pointer; cursor: pointer;
transition: background-color 0.3s ease; transition: all 0.2s ease;
box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); font-family: var(--font-sans);
} }
.language-select:hover { .language-select:hover {
background-color: var(--accent-gold-muted); border-color: var(--accent-gold);
color: var(--accent-gold); color: var(--accent-gold);
} }
.language-select:focus { .language-select:focus {
outline: none; outline: none;
box-shadow: 0 0 0 2px var(--accent-gold); box-shadow: 0 0 0 2px var(--accent-gold-muted);
} }
/* /* ========================================
.submenu-link { THEME TOGGLE
font-size: 1.2rem; ======================================== */
padding: 3px 6px;
border-radius: 4px;
background-color: #f5d400cc;
} */
.theme-toggle {
/* .submenu-link.active { background: var(--bg-elevated);
background-color: #791313; border: 1px solid var(--border-color);
color: white; color: var(--text-secondary);
font-weight: 600; cursor: pointer;
} */ border-radius: 20px;
padding: 5px 10px;
/* font-size: 1rem;
.topbar { transition: all 0.2s ease;
background-color: #e3b600;
display: flex; display: flex;
align-items: center;
justify-content: center;
line-height: 1;
}
.theme-toggle:hover {
border-color: var(--accent-gold);
color: var(--accent-gold);
}
/* ========================================
MOBILE RESPONSIVE
======================================== */
@media (max-width: 768px) {
.sidebar {
position: fixed;
left: 0;
top: 0;
z-index: 200;
width: 240px;
box-shadow: var(--shadow-lg);
transform: translateX(0);
transition: transform 0.3s ease;
}
.dashboard-layout {
flex-direction: column; flex-direction: column;
padding: 0.8rem 1.5rem;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
} }
.topbar-header { .content {
display: flex; padding: var(--space-md);
justify-content: space-between;
align-items: center;
} }
.topbar-title {
font-size: 1.2rem;
font-weight: bold;
color: #ffffff;
} }
.topbar-submenu {
display: flex;
gap: 15px;
margin-top: 0.5rem;
flex-wrap: wrap;
justify-content: center;
}
.submenu-link {
font-size: 1rem;
color: #ffffff;
text-decoration: none;
padding: 5px 10px;
border-radius: 4px;
background-color: #f5d400cc;
font-weight: 500;
}
.submenu-link.active {
background-color: #791313;
color: white;
font-weight: bold;
}
*/
/* .sidebar-toggle-button {
font-size: 1.5rem;
background: none;
border: none;
color: white;
cursor: pointer;
outline: none;
}
.sidebar-toggle-button:focus {
outline: none;
box-shadow: 0 0 0 3px #ffcf30;
border-radius: 4px;
}
*/
/* .sidebar-toggle-button:focus {
outline: 3px solid #ffcf30;
outline-offset: 2px;
border-radius: 4px;
background-color: rgba(255, 207, 48, 0.021);
} */
/* .sidebar-toggle-button:focus {
outline: 20px solid #ffcf30;
outline-offset: 8px;
} */
/* .sidebar-toggle-button:focus {
outline: none;
} */
/* Header */
/* .topbar {
background-color: #e3b600;
font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif;
align-items: center;
justify-content: space-between;
padding-top: 0.8rem;
padding-right: 1.5rem;
padding-bottom: 0.8rem;
padding-left: 1.5rem;
flex-wrap: wrap;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
}
.topbar-title {
font-size: 1.2rem;
font-weight: bold;
color: #ffffff;
justify-content: flex-start;
}
.topbar-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.topbar-icons {
display: flex;
gap: 20px;
align-items:end;
}
.topbar-icon {
font-size: 1.4rem;
cursor: pointer;
color: #ffffff;
transition: color 0.2s ease;
}
.topbar-icon:hover {
color: #791313;
}
.topbar-submenu {
flex: 2;
justify-content: center;
display: flex;
gap: 1.2rem;
flex-wrap: wrap;
} */
/* .submenu-link {
font-size: 1rem;
color: #ffffff;
text-decoration: none;
padding: 5px 10px;
border-radius: 4px;
transition: background 0.3s;
background-color: #f5d400cc;
font-weight: 500;
}
.submenu-link:hover {
background-color: #f5d600;
}
.submenu-link.active {
background-color: #791313;
color: white;
font-weight: bold;
} */
/* .topbar-center {
flex: 2;
justify-content: center;
display: flex;
gap: 15px;
flex-wrap: wrap;
} */

View File

@@ -6,19 +6,13 @@
} }
.main { .main {
margin-left: 220px; /* espacio del sidebar */ margin-left: 220px;
padding: 20px; padding: 20px;
margin-top: 50px; /* espacio del navbar */ margin-top: 50px;
} }
/* .topbar {
display: flex;
justify-content: flex-end;
margin-bottom: 20px;
} */
.content { .content {
background-color: white; background-color: var(--bg-primary);
padding: 20px; padding: 20px;
border-radius: 8px; border-radius: var(--radius-md);
} }

View File

@@ -1,29 +1,31 @@
/* CONTENEDOR PRINCIPAL */ /* ========================================
LOGIN PAGE
======================================== */
.login-page { .login-page {
background-color: #e4bd00; background-color: var(--login-bg);
min-height: 100vh; min-height: 100vh;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
overflow: hidden; padding: var(--space-lg);
} }
/* TARJETA BLANCA */
.login-container { .login-container {
background-color: white; background: var(--login-card-bg);
padding: 100px; border: 1px solid var(--border-color);
border-radius: 1px; padding: 48px;
box-shadow: 0 0 30px rgba(0, 0, 0, 0.15); border-radius: var(--radius-xl);
box-shadow: var(--shadow-lg);
display: flex; display: flex;
gap: 20px; gap: 48px;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
max-width: 1000px; max-width: 800px;
width: 100%; width: 100%;
overflow: hidden;
} }
/* LOGO */ /* Logo */
.logo-box { .logo-box {
flex: 1; flex: 1;
display: flex; display: flex;
@@ -32,142 +34,129 @@
} }
.logo { .logo {
width: 250px; width: 200px;
height: auto; height: auto;
opacity: 0.9;
} }
/* FORMULARIO */ /* Form */
.login-form { .login-form {
flex: 1; flex: 1;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: stretch;
gap: 10px; gap: 14px;
width: 100%; width: 100%;
} }
.login-form input.custom-input { .login-form input.custom-input {
width: 170%; width: 100%;
padding: 12px; padding: 12px 16px;
border: none; border: 1px solid var(--border-color);
border-radius: 20px; border-radius: var(--radius-md);
background-color: #d1d5db; background-color: var(--login-input-bg);
/* color: #ed0404; */ color: var(--text-primary);
font-size: 15px; font-size: 0.9rem;
font-weight: 500; font-weight: 500;
font-family: var(--font-sans);
outline: none;
transition: border-color 0.2s ease, box-shadow 0.2s ease;
box-sizing: border-box;
}
.login-form input.custom-input:focus {
border-color: var(--accent-gold);
box-shadow: 0 0 0 3px var(--accent-gold-muted);
} }
.login-form input::placeholder { .login-form input::placeholder {
color: ed0404; color: var(--text-muted);
} }
/* BOTONES */ /* Buttons */
.login-buttons { .login-buttons {
display: flex; display: flex;
justify-content: space-between;
gap: 10px; gap: 10px;
width: 180%; width: 100%;
margin-top: var(--space-sm);
} }
.login-buttons button { .login-buttons button {
flex: 1; flex: 1;
padding: 12px; padding: 12px;
font-weight: 600; font-weight: 600;
border-radius: 20px; border-radius: var(--radius-md);
border: none; border: none;
background-color: #6a0e0e;
color: white;
cursor: pointer; cursor: pointer;
box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.2); font-family: var(--font-sans);
font-size: 0.85rem;
transition: all 0.2s ease;
} }
/* Opcional: efecto hover */ .login-buttons button[type="submit"],
.login-buttons button:hover { .login-buttons .btn-primary {
background-color: #8b0e0e; background-color: var(--accent-gold);
color: #000;
} }
.custom-input { .login-buttons button[type="submit"]:hover,
width: 100%; .login-buttons .btn-primary:hover {
padding: 16px 24px; background-color: var(--accent-gold-hover);
/*border: none;*/ transform: translateY(-1px);
border-radius: 16px;
background-color: #ce0f0f;
box-shadow: 0 4px 6px rgba(255, 255, 255, 0.1);
font-family: 'Roboto', sans-serif;
/* font-size: 16px; */
font-weight: bold;
font-size: 1.2rem;
color: #505050 !important;
/* Gris oscuro */
text-align: center;
outline: none;
transition: box-shadow 0.3s ease;
} }
.custom-input::placeholder { .login-buttons .btn-secondary,
color: #888; .login-buttons button[type="button"] {
font-weight: bold; background-color: var(--bg-elevated);
color: var(--text-secondary);
border: 1px solid var(--border-color);
} }
.custom-input:focus { .login-buttons .btn-secondary:hover,
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); .login-buttons button[type="button"]:hover {
border-color: var(--accent-gold);
color: var(--accent-gold);
} }
.custom2-input:focus { /* Modal (recover password) */
background-color: #d5d8de;
}
.login-button,
.recover-button {
background-color: #5b1410;
color: white;
border: none;
border-radius: 30px;
padding: 14px;
font-weight: bold;
cursor: pointer;
box-shadow: 2px 4px 6px rgba(0, 0, 0, 0.2);
}
.recover-button {
background-color: #5b1410;
}
.recover-input {
width: 200px;
padding: 10px;
margin: 0 auto 15px auto; /* Centrado + espacio debajo */
border: none;
border-radius: 30px;
background-color: #d1d5db;
color: #111;
font-size: 14px;
display: block;
text-align: center;
}
.modal-title { .modal-title {
font-family: 'Roboto', sans-serif; font-family: var(--font-display);
font-size: 20px; font-size: 1.2rem;
font-weight: 600; font-weight: 600;
color: #5D1A2A; color: var(--text-primary);
text-align: center; text-align: center;
margin-bottom: 20px; margin-bottom: 20px;
} }
.modal-form input.recover-input { .recover-input {
width: 100% !important; width: 100%;
padding: 12px 16px; padding: 12px 16px;
margin: 0 0 20px 0; border: 1px solid var(--border-color);
border: none; border-radius: var(--radius-md);
border-radius: 25px; background-color: var(--login-input-bg);
background-color: #d1d5db; color: var(--text-primary);
color: #111;
font-size: 14px; font-size: 14px;
display: block; display: block;
text-align: center; text-align: center;
box-sizing: border-box; box-sizing: border-box;
outline: none;
}
.recover-input:focus {
border-color: var(--accent-gold);
box-shadow: 0 0 0 3px var(--accent-gold-muted);
}
.modal-form input.recover-input {
width: 100%;
padding: 12px 16px;
margin: 0 0 20px 0;
border: 1px solid var(--border-color);
border-radius: var(--radius-md);
background-color: var(--login-input-bg);
color: var(--text-primary);
font-size: 14px;
box-sizing: border-box;
} }
.modal-actions { .modal-actions {
@@ -181,126 +170,46 @@
flex: 1; flex: 1;
padding: 12px 20px; padding: 12px 20px;
border: none; border: none;
border-radius: 25px; border-radius: var(--radius-md);
font-weight: 600; font-weight: 600;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: all 0.2s ease;
font-family: var(--font-sans);
} }
.modal-actions .btn-primary { .modal-actions .btn-primary {
background-color: #5D1A2A; background-color: var(--accent-gold);
color: white; color: #000;
} }
.modal-actions .btn-primary:hover { .modal-actions .btn-primary:hover {
background-color: #7a2336; background-color: var(--accent-gold-hover);
} }
.modal-actions .btn-secondary { .modal-actions .btn-secondary {
background-color: #6c757d; background-color: var(--bg-elevated);
color: white; color: var(--text-secondary);
border: 1px solid var(--border-color);
} }
.modal-actions .btn-secondary:hover { .modal-actions .btn-secondary:hover {
background-color: #5a6268; border-color: var(--accent-gold);
} color: var(--accent-gold);
/*
.modal-form input {
width: 100%;
padding: 12px;
margin-bottom: 15px;
border: none;
border-radius: 30px;
background-color: #d1d5db;
color: #111;
font-size: 14px;
} */
/*
.btn {
flex: 1;
padding: 12px;
border: none;
border-radius: 20px;
font-weight: bold;
cursor: pointer;
}
.btn--primary {
background-color: #8b0000;
color: white;
} */
/*--------------------------------------*/
/* .login-container {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: #fff;
} */
/* .login-form {
display: flex;
flex-direction: column;
gap: 16px;
width: 300px;
} */
/*
.btn--primary:hover {
background-color: #a00000;
}
.btn--secondary {
background-color: #b22222;
color: white;
}
.btn--secondary:hover {
background-color: #cc0000;
} */
/*
.login-page {
background-color: #e3b400;
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
} }
/* Responsive */
@media (max-width: 640px) {
.login-container { .login-container {
background-color: white; flex-direction: column;
padding: 40px; padding: 32px 24px;
border-radius: 10px; gap: 24px;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);
max-width: 900px;
width: 100%;
display: flex;
flex-direction: row;
gap: 40px;
align-items: center;
justify-content: center;
}
.logo-box {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
} }
.logo { .logo {
max-width: 150px; width: 150px;
height: auto;
} }
.login-form { .login-buttons {
flex: 1;
display: flex;
flex-direction: column; flex-direction: column;
gap: 20px;
} }
*/ }

View File

@@ -9,14 +9,16 @@
} }
.login-box { .login-box {
background: rgba(255, 255, 255, 0.85); /* Fondo blanco semi-transparente */ background: var(--glass-bg);
backdrop-filter: blur(12px);
padding: 40px; padding: 40px;
border-radius: 12px; border-radius: var(--radius-lg);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); box-shadow: var(--shadow-lg);
border: 1px solid var(--border-color);
width: 320px; width: 320px;
} }
.btn--primary { .btn--primary {
background-color: #8b0000; background-color: var(--accent-gold);
color: white; color: #000;
} }

View File

@@ -1,7 +1,6 @@
@import './theme.css'; @import './theme.css';
.app { .app {
background-color: rgba(255, 223, 0, 0.85);
display: flex; display: flex;
min-height: 100vh; min-height: 100vh;
} }
@@ -12,82 +11,51 @@
flex-direction: column; flex-direction: column;
} }
/* .topbar {
padding: 12px;
background: #fdd700;
display: flex;
justify-content: flex-end;
align-items: center;
font-size: 1rem;
color: white;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
} */
button:hover {
background-color: #ddbf16;
}
/*
button {
background-color: #4a0d0d;
color: white;
padding: 10px;
border-radius: 6px;
border: none;
cursor: pointer;
}
*/
.content { .content {
padding: var(--space-lg); padding: var(--space-lg);
} }
/* Fondo del modal */ /* Modal overlay (legacy pages) */
.modal-overlay { .modal-overlay {
position: fixed; position: fixed;
top: 0; top: 0;
left: 0; left: 0;
width: 100%; width: 100%;
height: 100%; height: 100%;
background: rgba(0, 0, 0, 0.55); background: rgba(0, 0, 0, 0.6);
backdrop-filter: blur(4px);
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
z-index: 100; z-index: 100;
} }
/* Caja del modal */
.modal-box { .modal-box {
background: white; background: var(--bg-secondary);
padding: 30px; padding: 30px;
border-radius: 12px; border-radius: var(--radius-lg);
width: 350px; width: 380px;
max-width: 90%; max-width: 90%;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); box-shadow: var(--shadow-lg);
border: 1px solid var(--border-color);
animation: fadeIn 0.3s ease-in-out; animation: fadeIn 0.3s ease-in-out;
} }
/* Agregar un fondo semi-transparente al modal */
.modal-overlay {
background: rgba(0, 0, 0, 0.7);
z-index: 100;
}
.modal-box h3 { .modal-box h3 {
margin-top: 0; margin-top: 0;
margin-bottom: 15px; margin-bottom: 15px;
color: #111; color: var(--text-primary);
text-align: center; text-align: center;
} }
/* Formulario del modal */
.modal-form input { .modal-form input {
width: 100%; width: 100%;
padding: 10px; padding: 10px;
margin-bottom: 15px; margin-bottom: 15px;
border: none; border: 1px solid var(--border-color);
border-radius: 6px; border-radius: var(--radius-md);
background: #d1d5db; background: var(--bg-elevated);
color: #111; color: var(--text-primary);
font-size: 14px; font-size: 14px;
} }
@@ -97,63 +65,7 @@ button {
gap: 10px; gap: 10px;
} }
/* Animación */
@keyframes fadeIn { @keyframes fadeIn {
from { from { opacity: 0; transform: scale(0.95); }
opacity: 0; to { opacity: 1; transform: scale(1); }
transform: scale(0.95);
} }
to {
opacity: 1;
transform: scale(1);
}
}
/*Login.css*/
/* Fondo amarillo opaco */
/*
.login-page {
background-color: rgba(255, 223, 0, 0.85);
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
} */
/* Cuadro central blanco */
.login-box {
background: white;
padding: 40px;
border-radius: 12px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
width: 320px;
}
/* Botones tintos */
/* .btn {
width: 100%;
padding: 12px;
border: none;
border-radius: 6px;
font-weight: 600;
margin-bottom: 10px;
cursor: pointer;
}
.btn--primary {
background-color: #8b0000;
color: white;
}
.btn--primary:hover {
background-color: #a00000;
}
.btn--secondary {
background-color: #b22222;
color: white;
}
.btn--secondary:hover {
background-color: #cc0000;
} */

View File

@@ -1,19 +1,38 @@
:root { /* ========================================
THEME SYSTEM — Dark (default) + Light
======================================== */
:root,
[data-theme="dark"] {
/* Background layers */ /* Background layers */
--bg-primary: #0a0a0a; --bg-primary: #0a0a0f;
--bg-secondary: #1a1a1a; --bg-secondary: #12121a;
--bg-elevated: #2a2a2a; --bg-elevated: #1e1e2a;
--bg-surface: #1e1e1e; --bg-surface: #16161f;
/* Glass / transparency */
--glass-bg: rgba(18, 18, 26, 0.8);
--glass-border: rgba(212, 165, 116, 0.08);
/* Sidebar */
--sidebar-bg: #0d0d14;
--sidebar-hover: rgba(212, 165, 116, 0.08);
--sidebar-active: rgba(212, 165, 116, 0.12);
/* Login */
--login-bg: #0a0a0f;
--login-card-bg: #12121a;
--login-input-bg: #1e1e2a;
/* Accent */ /* Accent */
--accent-gold: #d4a574; --accent-gold: #d4a574;
--accent-gold-hover: #e0b88a; --accent-gold-hover: #e0b88a;
--accent-gold-muted: rgba(212, 165, 116, 0.15); --accent-gold-muted: rgba(212, 165, 116, 0.12);
/* Text */ /* Text */
--text-primary: #ffffff; --text-primary: #f0ece4;
--text-secondary: #a0a0a0; --text-secondary: #9a948a;
--text-muted: #666666; --text-muted: #5a564e;
/* Status colors */ /* Status colors */
--status-available: #22c55e; --status-available: #22c55e;
@@ -28,19 +47,20 @@
--info: #3b82f6; --info: #3b82f6;
/* Borders */ /* Borders */
--border-color: #333333; --border-color: rgba(255, 255, 255, 0.06);
--border-subtle: #2a2a2a; --border-subtle: rgba(255, 255, 255, 0.03);
/* Shadows */ /* Shadows */
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3); --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4);
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.4); --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.5);
--shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.5); --shadow-lg: 0 12px 40px rgba(0, 0, 0, 0.6);
--shadow-glow: 0 0 20px rgba(212, 165, 116, 0.08);
/* Border radius */ /* Border radius */
--radius-sm: 6px; --radius-sm: 6px;
--radius-md: 8px; --radius-md: 10px;
--radius-lg: 12px; --radius-lg: 14px;
--radius-xl: 16px; --radius-xl: 20px;
/* Spacing */ /* Spacing */
--space-xs: 4px; --space-xs: 4px;
@@ -50,23 +70,74 @@
--space-xl: 32px; --space-xl: 32px;
/* Typography */ /* Typography */
--font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; --font-display: 'Syne', 'Inter', system-ui, sans-serif;
--font-sans: 'DM Sans', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
--font-mono: 'JetBrains Mono', 'Fira Code', monospace; --font-mono: 'JetBrains Mono', 'Fira Code', monospace;
} }
[data-theme="light"] {
--bg-primary: #f5f3ef;
--bg-secondary: #ffffff;
--bg-elevated: #f0ece6;
--bg-surface: #faf8f5;
--glass-bg: rgba(255, 255, 255, 0.85);
--glass-border: rgba(0, 0, 0, 0.06);
--sidebar-bg: #faf8f5;
--sidebar-hover: rgba(196, 148, 78, 0.08);
--sidebar-active: rgba(196, 148, 78, 0.12);
--login-bg: #f5f3ef;
--login-card-bg: #ffffff;
--login-input-bg: #f0ece6;
--accent-gold: #c4944e;
--accent-gold-hover: #b5853f;
--accent-gold-muted: rgba(196, 148, 78, 0.10);
--text-primary: #1a1815;
--text-secondary: #6b6560;
--text-muted: #a09a94;
--border-color: rgba(0, 0, 0, 0.08);
--border-subtle: rgba(0, 0, 0, 0.04);
--shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.06);
--shadow-md: 0 4px 12px rgba(0, 0, 0, 0.08);
--shadow-lg: 0 12px 40px rgba(0, 0, 0, 0.10);
--shadow-glow: 0 0 20px rgba(196, 148, 78, 0.06);
}
/* ========================================
BASE
======================================== */
body { body {
background-color: var(--bg-primary); background-color: var(--bg-primary);
color: var(--text-primary); color: var(--text-primary);
font-family: var(--font-sans); font-family: var(--font-sans);
margin: 0; margin: 0;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
} }
/* === Card Components === */ /* ========================================
CARDS
======================================== */
.card { .card {
background: var(--bg-secondary); background: var(--bg-secondary);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: var(--radius-lg); border-radius: var(--radius-lg);
padding: var(--space-lg); padding: var(--space-lg);
transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
}
.card:hover {
transform: translateY(-2px);
box-shadow: var(--shadow-md);
border-color: var(--glass-border);
} }
.card-elevated { .card-elevated {
@@ -76,48 +147,67 @@ body {
padding: var(--space-lg); padding: var(--space-lg);
} }
/* === Status Badges === */ /* ========================================
BADGES
======================================== */
.badge { .badge {
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
padding: 2px 10px; padding: 3px 10px;
border-radius: 20px; border-radius: 20px;
font-size: 0.75rem; font-size: 0.7rem;
font-weight: 600; font-weight: 600;
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.05em; letter-spacing: 0.05em;
font-family: var(--font-sans);
} }
.badge-available { background: rgba(34, 197, 94, 0.15); color: var(--status-available); } .badge-available { background: rgba(34, 197, 94, 0.12); color: var(--status-available); }
.badge-occupied { background: rgba(59, 130, 246, 0.15); color: var(--status-occupied); } .badge-occupied { background: rgba(59, 130, 246, 0.12); color: var(--status-occupied); }
.badge-cleaning { background: rgba(234, 179, 8, 0.15); color: var(--status-cleaning); } .badge-cleaning { background: rgba(234, 179, 8, 0.12); color: var(--status-cleaning); }
.badge-maintenance { background: rgba(239, 68, 68, 0.15); color: var(--status-maintenance); } .badge-maintenance { background: rgba(239, 68, 68, 0.12); color: var(--status-maintenance); }
.badge-pending { background: rgba(234, 179, 8, 0.15); color: var(--status-cleaning); } .badge-pending { background: rgba(234, 179, 8, 0.12); color: var(--status-cleaning); }
.badge-confirmed { background: rgba(59, 130, 246, 0.15); color: var(--status-occupied); } .badge-confirmed { background: rgba(59, 130, 246, 0.12); color: var(--status-occupied); }
.badge-success { background: rgba(34, 197, 94, 0.15); color: var(--success); } .badge-success { background: rgba(34, 197, 94, 0.12); color: var(--success); }
.badge-error { background: rgba(239, 68, 68, 0.15); color: var(--error); } .badge-error { background: rgba(239, 68, 68, 0.12); color: var(--error); }
.badge-info { background: rgba(59, 130, 246, 0.15); color: var(--info); } .badge-info { background: rgba(59, 130, 246, 0.12); color: var(--info); }
.badge-warning { background: rgba(234, 179, 8, 0.12); color: var(--warning); }
/* ========================================
KPI CARDS
======================================== */
/* === KPI Cards === */
.kpi-card { .kpi-card {
background: var(--bg-secondary); background: var(--bg-secondary);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-top: 3px solid var(--accent-gold);
border-radius: var(--radius-lg); border-radius: var(--radius-lg);
padding: var(--space-lg); padding: var(--space-lg);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: var(--space-sm); gap: var(--space-sm);
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.kpi-card:hover {
transform: translateY(-2px);
box-shadow: var(--shadow-glow);
} }
.kpi-card .kpi-value { .kpi-card .kpi-value {
font-size: 2rem; font-size: 2rem;
font-weight: 700; font-weight: 700;
color: var(--text-primary); color: var(--text-primary);
font-family: var(--font-display);
} }
.kpi-card .kpi-label { .kpi-card .kpi-label {
font-size: 0.875rem; font-size: 0.8rem;
color: var(--text-secondary); color: var(--text-secondary);
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.04em;
} }
.kpi-card .kpi-trend { .kpi-card .kpi-trend {
@@ -128,7 +218,10 @@ body {
.kpi-trend.positive { color: var(--success); } .kpi-trend.positive { color: var(--success); }
.kpi-trend.negative { color: var(--error); } .kpi-trend.negative { color: var(--error); }
/* === Buttons === */ /* ========================================
BUTTONS
======================================== */
.btn-gold { .btn-gold {
background: var(--accent-gold); background: var(--accent-gold);
color: #000; color: #000;
@@ -137,12 +230,15 @@ body {
border-radius: var(--radius-md); border-radius: var(--radius-md);
font-weight: 600; font-weight: 600;
cursor: pointer; cursor: pointer;
transition: background 0.2s; transition: all 0.2s ease;
font-size: 0.875rem; font-size: 0.85rem;
font-family: var(--font-sans);
} }
.btn-gold:hover { .btn-gold:hover {
background: var(--accent-gold-hover); background: var(--accent-gold-hover);
transform: translateY(-1px);
box-shadow: var(--shadow-sm);
} }
.btn-outline { .btn-outline {
@@ -152,13 +248,15 @@ body {
padding: 10px 20px; padding: 10px 20px;
border-radius: var(--radius-md); border-radius: var(--radius-md);
cursor: pointer; cursor: pointer;
transition: all 0.2s; transition: all 0.2s ease;
font-size: 0.875rem; font-size: 0.85rem;
font-family: var(--font-sans);
} }
.btn-outline:hover { .btn-outline:hover {
border-color: var(--accent-gold); border-color: var(--accent-gold);
color: var(--accent-gold); color: var(--accent-gold);
transform: translateY(-1px);
} }
.btn-sm { .btn-sm {
@@ -167,51 +265,60 @@ body {
} }
.btn-danger { .btn-danger {
background: rgba(239, 68, 68, 0.15); background: rgba(239, 68, 68, 0.1);
color: var(--error); color: var(--error);
border: 1px solid rgba(239, 68, 68, 0.3); border: 1px solid rgba(239, 68, 68, 0.2);
padding: 10px 20px; padding: 10px 20px;
border-radius: var(--radius-md); border-radius: var(--radius-md);
cursor: pointer; cursor: pointer;
transition: all 0.2s; transition: all 0.2s ease;
font-size: 0.875rem; font-size: 0.85rem;
font-family: var(--font-sans);
} }
.btn-danger:hover { .btn-danger:hover {
background: rgba(239, 68, 68, 0.25); background: rgba(239, 68, 68, 0.2);
transform: translateY(-1px);
} }
.btn-success { .btn-success {
background: rgba(34, 197, 94, 0.15); background: rgba(34, 197, 94, 0.1);
color: var(--success); color: var(--success);
border: 1px solid rgba(34, 197, 94, 0.3); border: 1px solid rgba(34, 197, 94, 0.2);
padding: 10px 20px; padding: 10px 20px;
border-radius: var(--radius-md); border-radius: var(--radius-md);
cursor: pointer; cursor: pointer;
transition: all 0.2s; transition: all 0.2s ease;
font-size: 0.875rem; font-size: 0.85rem;
font-family: var(--font-sans);
} }
.btn-success:hover { .btn-success:hover {
background: rgba(34, 197, 94, 0.25); background: rgba(34, 197, 94, 0.2);
transform: translateY(-1px);
} }
/* === Form Inputs === */ /* ========================================
FORM INPUTS
======================================== */
.input-dark { .input-dark {
background: var(--bg-elevated); background: var(--bg-elevated);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
color: var(--text-primary); color: var(--text-primary);
padding: 10px 14px; padding: 10px 14px;
border-radius: var(--radius-md); border-radius: var(--radius-md);
font-size: 0.875rem; font-size: 0.85rem;
width: 100%; width: 100%;
outline: none; outline: none;
transition: border-color 0.2s; transition: border-color 0.2s ease, box-shadow 0.2s ease;
box-sizing: border-box; box-sizing: border-box;
font-family: var(--font-sans);
} }
.input-dark:focus { .input-dark:focus {
border-color: var(--accent-gold); border-color: var(--accent-gold);
box-shadow: 0 0 0 3px var(--accent-gold-muted);
} }
.input-dark::placeholder { .input-dark::placeholder {
@@ -224,27 +331,33 @@ body {
color: var(--text-primary); color: var(--text-primary);
padding: 10px 14px; padding: 10px 14px;
border-radius: var(--radius-md); border-radius: var(--radius-md);
font-size: 0.875rem; font-size: 0.85rem;
width: 100%; width: 100%;
outline: none; outline: none;
cursor: pointer; cursor: pointer;
font-family: var(--font-sans);
} }
.select-dark:focus { .select-dark:focus {
border-color: var(--accent-gold); border-color: var(--accent-gold);
box-shadow: 0 0 0 3px var(--accent-gold-muted);
} }
.label-dark { .label-dark {
color: var(--text-secondary); color: var(--text-secondary);
font-size: 0.75rem; font-size: 0.7rem;
font-weight: 600; font-weight: 600;
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.05em; letter-spacing: 0.06em;
margin-bottom: var(--space-xs); margin-bottom: var(--space-xs);
display: block; display: block;
font-family: var(--font-sans);
} }
/* === Tables === */ /* ========================================
TABLES
======================================== */
.table-dark { .table-dark {
width: 100%; width: 100%;
border-collapse: collapse; border-collapse: collapse;
@@ -254,25 +367,29 @@ body {
text-align: left; text-align: left;
padding: 12px 16px; padding: 12px 16px;
color: var(--text-secondary); color: var(--text-secondary);
font-size: 0.75rem; font-size: 0.7rem;
font-weight: 600; font-weight: 600;
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.05em; letter-spacing: 0.06em;
border-bottom: 1px solid var(--border-color); border-bottom: 1px solid var(--border-color);
font-family: var(--font-sans);
} }
.table-dark td { .table-dark td {
padding: 12px 16px; padding: 12px 16px;
border-bottom: 1px solid var(--border-subtle); border-bottom: 1px solid var(--border-subtle);
color: var(--text-primary); color: var(--text-primary);
font-size: 0.875rem; font-size: 0.85rem;
} }
.table-dark tr:hover { .table-dark tr:hover {
background: var(--bg-elevated); background: var(--bg-elevated);
} }
/* === Grid Layouts === */ /* ========================================
GRID LAYOUTS
======================================== */
.grid-2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--space-lg); } .grid-2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--space-lg); }
.grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-lg); } .grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-lg); }
.grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--space-lg); } .grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--space-lg); }
@@ -287,20 +404,24 @@ body {
.grid-2, .grid-3, .grid-4, .grid-5 { grid-template-columns: 1fr; } .grid-2, .grid-3, .grid-4, .grid-5 { grid-template-columns: 1fr; }
} }
/* === Room Grid Cards === */ /* ========================================
ROOM GRID CARDS
======================================== */
.room-card { .room-card {
background: var(--bg-secondary); background: var(--bg-secondary);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: var(--radius-md); border-radius: var(--radius-md);
padding: var(--space-md); padding: var(--space-md);
cursor: pointer; cursor: pointer;
transition: all 0.2s; transition: all 0.25s ease;
border-left: 4px solid var(--border-color); border-left: 4px solid var(--border-color);
} }
.room-card:hover { .room-card:hover {
background: var(--bg-elevated); background: var(--bg-elevated);
transform: translateY(-1px); transform: translateY(-2px);
box-shadow: var(--shadow-md);
} }
.room-card.available { border-left-color: var(--status-available); } .room-card.available { border-left-color: var(--status-available); }
@@ -312,6 +433,7 @@ body {
font-size: 1.125rem; font-size: 1.125rem;
font-weight: 700; font-weight: 700;
color: var(--text-primary); color: var(--text-primary);
font-family: var(--font-display);
} }
.room-card .room-info { .room-card .room-info {
@@ -320,14 +442,18 @@ body {
margin-top: var(--space-xs); margin-top: var(--space-xs);
} }
/* === Modal === */ /* ========================================
MODAL
======================================== */
.modal-overlay-dark { .modal-overlay-dark {
position: fixed; position: fixed;
top: 0; top: 0;
left: 0; left: 0;
width: 100%; width: 100%;
height: 100%; height: 100%;
background: rgba(0, 0, 0, 0.7); background: rgba(0, 0, 0, 0.6);
backdrop-filter: blur(4px);
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@@ -345,6 +471,7 @@ body {
max-height: 85vh; max-height: 85vh;
overflow-y: auto; overflow-y: auto;
box-shadow: var(--shadow-lg); box-shadow: var(--shadow-lg);
animation: slideUp 0.3s ease-out;
} }
.modal-content-dark h2 { .modal-content-dark h2 {
@@ -352,9 +479,23 @@ body {
margin-top: 0; margin-top: 0;
margin-bottom: var(--space-lg); margin-bottom: var(--space-lg);
font-size: 1.25rem; font-size: 1.25rem;
font-family: var(--font-display);
} }
/* === Search Input === */ @keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes slideUp {
from { opacity: 0; transform: translateY(16px); }
to { opacity: 1; transform: translateY(0); }
}
/* ========================================
SEARCH BAR
======================================== */
.search-bar { .search-bar {
display: flex; display: flex;
align-items: center; align-items: center;
@@ -362,11 +503,12 @@ body {
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: var(--radius-md); border-radius: var(--radius-md);
padding: 0 var(--space-md); padding: 0 var(--space-md);
transition: border-color 0.2s; transition: border-color 0.2s ease, box-shadow 0.2s ease;
} }
.search-bar:focus-within { .search-bar:focus-within {
border-color: var(--accent-gold); border-color: var(--accent-gold);
box-shadow: 0 0 0 3px var(--accent-gold-muted);
} }
.search-bar input { .search-bar input {
@@ -376,14 +518,18 @@ body {
padding: 10px; padding: 10px;
flex: 1; flex: 1;
outline: none; outline: none;
font-size: 0.875rem; font-size: 0.85rem;
font-family: var(--font-sans);
} }
.search-bar input::placeholder { .search-bar input::placeholder {
color: var(--text-muted); color: var(--text-muted);
} }
/* === Tab/Filter Pills === */ /* ========================================
FILTER PILLS
======================================== */
.filter-pills { .filter-pills {
display: flex; display: flex;
gap: var(--space-sm); gap: var(--space-sm);
@@ -396,15 +542,17 @@ body {
font-size: 0.8rem; font-size: 0.8rem;
font-weight: 500; font-weight: 500;
cursor: pointer; cursor: pointer;
transition: all 0.2s; transition: all 0.2s ease;
background: var(--bg-elevated); background: var(--bg-elevated);
color: var(--text-secondary); color: var(--text-secondary);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
font-family: var(--font-sans);
} }
.filter-pill:hover { .filter-pill:hover {
color: var(--accent-gold); color: var(--accent-gold);
border-color: var(--accent-gold); border-color: var(--accent-gold);
transform: translateY(-1px);
} }
.filter-pill.active { .filter-pill.active {
@@ -413,7 +561,10 @@ body {
border-color: var(--accent-gold); border-color: var(--accent-gold);
} }
/* === Page Header === */ /* ========================================
PAGE HEADER
======================================== */
.page-header { .page-header {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
@@ -426,22 +577,38 @@ body {
font-size: 1.5rem; font-size: 1.5rem;
font-weight: 700; font-weight: 700;
margin: 0; margin: 0;
font-family: var(--font-display);
} }
/* === Empty State === */ /* ========================================
EMPTY STATE
======================================== */
.empty-state { .empty-state {
text-align: center; text-align: center;
padding: var(--space-xl) * 2; padding: var(--space-xl);
color: var(--text-muted); color: var(--text-muted);
} }
.empty-state p { .empty-state p {
font-size: 1rem; font-size: 0.95rem;
margin-top: var(--space-md); margin-top: var(--space-md);
} }
/* === Shift Schedule Colors === */ /* ========================================
.shift-morning { background: rgba(234, 179, 8, 0.2); color: #eab308; } SHIFT SCHEDULE
.shift-afternoon { background: rgba(59, 130, 246, 0.2); color: #3b82f6; } ======================================== */
.shift-night { background: rgba(168, 85, 247, 0.2); color: #a855f7; }
.shift-off { background: rgba(107, 114, 128, 0.2); color: #6b7280; } .shift-morning { background: rgba(234, 179, 8, 0.15); color: #eab308; }
.shift-afternoon { background: rgba(59, 130, 246, 0.15); color: #3b82f6; }
.shift-night { background: rgba(168, 85, 247, 0.15); color: #a855f7; }
.shift-off { background: rgba(107, 114, 128, 0.15); color: #6b7280; }
/* ========================================
FINANCIAL VALUES
======================================== */
.money-value {
font-family: var(--font-mono);
font-variant-numeric: tabular-nums;
}