From 343ba1675e3329093947c214cb26e701eef66066 Mon Sep 17 00:00:00 2001 From: Cesar Mendivil Date: Wed, 5 Nov 2025 18:12:54 -0700 Subject: [PATCH] feat: Mejora del componente Dropdown y ajustes en estilos de la tabla de transmisiones --- .../src/components/Dropdown.module.css | 83 ++++++++++++++-- .../src/components/Dropdown.tsx | 79 +++++++++------ .../NewTransmissionModal.module.css | 10 +- .../src/components/PageContainer.module.css | 31 +++++- .../src/components/PageContainer.tsx | 98 ++++++++++--------- .../components/TransmissionsTable.module.css | 36 ++++++- .../src/components/TransmissionsTable.tsx | 28 ++++-- 7 files changed, 260 insertions(+), 105 deletions(-) diff --git a/packages/broadcast-panel/src/components/Dropdown.module.css b/packages/broadcast-panel/src/components/Dropdown.module.css index 5878e60..fa1842b 100644 --- a/packages/broadcast-panel/src/components/Dropdown.module.css +++ b/packages/broadcast-panel/src/components/Dropdown.module.css @@ -5,18 +5,35 @@ .dropdownMenu { position: absolute; - top: calc(100% + 8px); + top: calc(100% + 6px); right: 0; background-color: var(--surface-color); - border: 1px solid rgba(255,255,255,0.04); + border: 1px solid rgba(0,0,0,0.04); border-radius: 8px; - box-shadow: 0 12px 30px rgba(2,6,23,0.6); - min-width: 260px; - padding: 8px 0; + /* lighter shadow so it's less pronounced */ + box-shadow: 0 6px 14px rgba(2,6,23,0.10); + /* match the create-card min width (220px) so menus align visually */ + width: 220px; + padding: 4px 0; z-index: 1200; animation: slideDown 0.18s cubic-bezier(.2,.9,.2,1); } +/* caret (little pointer) under the trigger */ +.dropdownMenu::before { + content: ''; + position: absolute; + top: -6px; + /* horizontal offset from the right edge; configurable via --dropdown-caret-right */ + right: var(--dropdown-caret-right, 16px); + width: 12px; + height: 12px; + background: var(--surface-color); + transform: rotate(45deg); + border-left: 1px solid rgba(0,0,0,0.04); + border-top: 1px solid rgba(0,0,0,0.04); +} + @keyframes slideDown { from { opacity: 0; @@ -32,8 +49,8 @@ width: 100%; display: flex; align-items: center; - gap: 12px; - padding: 10px 16px; + gap: 10px; + padding: 8px 14px; background: transparent; border: none; color: var(--text-primary); @@ -46,6 +63,23 @@ background-color: var(--border-light); } +/* Ensure delete item doesn't take native button appearance and stays menu-like */ +.dropdownItem.deleteItem, +.dropdownItem.deleteItem:hover { + background: transparent; + border: none; + color: var(--danger-600); +} + +.dropdownItem.deleteItem:hover { + background-color: rgba(234,67,53,0.04); +} + +.dropdownItem:focus { + outline: none; + box-shadow: 0 0 0 3px rgba(59,130,246,0.12); +} + /* ensure header (non-interactive) doesn't get hover background */ .dropdownHeader:hover { background: transparent; @@ -66,7 +100,7 @@ display: flex; align-items: center; gap: 12px; - padding: 10px 16px; + padding: 8px 14px; color: var(--text-primary); font-size: 14px; opacity: 0.90; /* user requested opacity */ @@ -80,6 +114,37 @@ .divider { height: 1px; - background-color: rgba(255,255,255,0.03); + background-color: var(--border-light); margin: 8px 0; } + +/* slightly reduce icon size and align spacing like the screenshot */ +.dropdownItem .icon { + display: flex; + align-items: center; + font-size: 16px; + color: var(--text-secondary); +} + +/* when a container has .deleteItem, ensure child icon and label inherit danger color */ +.deleteItem .icon, +.deleteItem span { + color: var(--danger-600); +} + +/* make delete icon sit inside a small rounded red box like the screenshot */ +.deleteItem .icon { + background: rgba(234,67,53,0.08); /* subtle red bg */ + padding: 4px; + border-radius: 6px; + display: inline-flex; + align-items: center; + justify-content: center; +} + +/* tighten divider */ +.divider { + height: 1px; + background-color: rgba(0,0,0,0.04); + margin: 6px 0; +} diff --git a/packages/broadcast-panel/src/components/Dropdown.tsx b/packages/broadcast-panel/src/components/Dropdown.tsx index 6ab1eec..8543403 100644 --- a/packages/broadcast-panel/src/components/Dropdown.tsx +++ b/packages/broadcast-panel/src/components/Dropdown.tsx @@ -46,39 +46,54 @@ export const Dropdown: React.FC = ({ trigger, items }) => {
{items.map((item, index) => ( - {item.divider &&
} - {item.disabled ? ( -
- {item.icon && {item.icon}} - { - // merge className for the header label - (() => { - const lp = item.labelProps || {}; - const { className: lpClassName, ...lpOther } = lp as any; - const classes = [styles.dropdownHeaderLabel, lpClassName].filter(Boolean).join(' '); - return {item.label}; - })() - } -
+ {item.divider ? ( +
+ ) : item.disabled ? ( + (() => { + const cp = item.containerProps || {}; + const { className: cpClassName, ...cpRest } = cp as any; + const headerClasses = [styles.dropdownHeader, cpClassName].filter(Boolean).join(' '); + return ( +
+ {item.icon && {item.icon}} + { + // merge className for the header label + (() => { + const lp = item.labelProps || {}; + const { className: lpClassName, ...lpOther } = lp as any; + const classes = [styles.dropdownHeaderLabel, lpClassName].filter(Boolean).join(' '); + return {item.label}; + })() + } +
+ ); + })() ) : ( - + (() => { + const cp = item.containerProps || {}; + const { className: cpClassName, ...cpRest } = cp as any; + const btnClasses = [styles.dropdownItem, cpClassName].filter(Boolean).join(' '); + return ( + + ); + })() )} ))} diff --git a/packages/broadcast-panel/src/components/NewTransmissionModal.module.css b/packages/broadcast-panel/src/components/NewTransmissionModal.module.css index 4e83622..1580856 100644 --- a/packages/broadcast-panel/src/components/NewTransmissionModal.module.css +++ b/packages/broadcast-panel/src/components/NewTransmissionModal.module.css @@ -115,10 +115,11 @@ } .submitButton { + /* Match header .planButton visual: transparent with primary border, fill on hover */ padding: 10px 20px; - background-color: var(--primary-blue); - border: none; - color: white; + background-color: transparent; + border: 1px solid var(--primary-blue); + color: var(--primary-blue); border-radius: 6px; font-size: 14px; font-weight: 500; @@ -127,7 +128,8 @@ } .submitButton:hover { - background-color: var(--primary-blue-hover); + background-color: var(--primary-blue); + color: white; } @keyframes fadeIn { diff --git a/packages/broadcast-panel/src/components/PageContainer.module.css b/packages/broadcast-panel/src/components/PageContainer.module.css index 0bd8607..89534ed 100644 --- a/packages/broadcast-panel/src/components/PageContainer.module.css +++ b/packages/broadcast-panel/src/components/PageContainer.module.css @@ -19,9 +19,28 @@ overflow-y: auto; } +/* two-column container: left column holds the two sections, right column reserved for secondary content + --left-col-width can be adjusted by container or page to control the left column width */ +.wrapContent { + display: grid; + grid-template-columns: var(--left-col-width, 980px) 1fr; + gap: 24px; + align-items: start; +} + +.leftStack { + display: flex; + flex-direction: column; + gap: 24px; +} + +.rightStack { + display: block; +} + .createGrid { display: grid; - grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); + grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 16px; } @@ -58,6 +77,16 @@ .mainContent { margin-left: 0; } + .wrapContent { + grid-template-columns: 1fr; + } +} + +/* wider screens show the create cards in columns; keeps flexibility */ +@media (max-width: 768px) { + .createGrid { + grid-template-columns: 1fr; + } } @media (max-width: 768px) { diff --git a/packages/broadcast-panel/src/components/PageContainer.tsx b/packages/broadcast-panel/src/components/PageContainer.tsx index 321ee6f..467f3d2 100644 --- a/packages/broadcast-panel/src/components/PageContainer.tsx +++ b/packages/broadcast-panel/src/components/PageContainer.tsx @@ -59,56 +59,64 @@ const PageContainer: React.FC = () => {
- {/* Sección Crear */} -
-

Crear

- {isLoading ? ( -
- - - -
- ) : ( -
- + ) : ( +
+ - + +
- Grabación - + )} +
- -
- )} - + {/* Sección Transmisiones y grabaciones */} +
+

+ Transmisiones y grabaciones +

+ +
+
- {/* Sección Transmisiones y grabaciones */} -
-

- Transmisiones y grabaciones -

- -
+
+ {/* espacio para contenido secundario o ads, vacío por ahora */} +
+
= ({ transmissions, onDelete, onUpdate
-
- - -
+
+ + + } + items={[ + { label: 'Agregar invitados', icon: , onClick: () => console.log('Agregar invitados', t.id) }, + { label: 'Editar', icon: , onClick: () => {/* editar */} }, + { divider: true, label: '', disabled: false }, + { label: 'Ver en YouTube', icon: , onClick: () => {/* abrir */} }, + { divider: true, label: '', disabled: false }, + { label: 'Eliminar transmisión', icon: , onClick: () => onDelete(t.id), containerProps: { className: styles.deleteItem }, labelProps: { className: styles.dangerLabel } } + ]} + /> +