# Plan: Migrar bordes de inline styles a SCSS ## Contexto El CI falla porque el componente `Button` usa inline styles (`style={{ borderWidth, borderStyle, borderColor }}`) para los bordes. Los tests (Jest y Cypress) esperan clases CSS como `border-gold` y `border-black` que ya no se generan. El usuario quiere que los estilos se escriban con SCSS en lugar de inline styles. ## Cambios necesarios ### 1. Crear `src/components/Button/Button.scss` Crear archivo SCSS con clases por variante para bordes. Cada variante que tenga borde (todos excepto `primary`) recibe: - `border-width: 3px` - `border-style: solid` - `border-color` con el color correspondiente ```scss $border-width: 3px; $gold: #EABF2D; $amber: #D4880F; $black: #1A1A2E; $white: #FFFFFF; $danger: #DE3626; .btn { // variantes con borde &.w-btnOutlineGold, &.w-btnOutline, &.w-btnOutlineLight, &.w-btnCircle, &.w-btnIcon, &.file-upload { border-width: $border-width; border-style: solid; } &.w-btnOutlineGold { border-color: $gold; } &.w-btnOutline { border-color: $black; } &.w-btnOutlineLight { border-color: $white; } &.w-btnCircle { border-color: $black; } &.w-btnIcon { // icon-edit usa gold, icon-delete usa danger — se maneja con clases adicionales } &.file-upload { border-color: $gold; } // icon-edit específico &.w-btnIcon--edit { border-color: $gold; } // icon-delete específico &.w-btnIcon--delete { border-color: $danger; } } ``` **Reflexión:** El componente actual no tiene clases separadas para icon-edit vs icon-delete en el border-color. Ambas comparten `w-btnIcon` pero tienen bordes distintos (gold vs danger). Necesito revisar si se puede resolver con clases adicionales o con un approach diferente. Mirando el código actual: - `icon-edit` → `border-color: var(--color-gold, #EABF2D)` (inline style) - `icon-delete` → `border-color: var(--color-danger, #DE3626)` (inline style) Opción A: Agregar clases `border-gold` y `border-danger` al button y manejar el color con CSS custom properties o clases específicas. Opción B: Usar `data-variant` attribute y selector `[data-variant="icon-edit"]`. Opción C: Agregar clases específicas `btn--icon-edit` y `btn--icon-delete`. La opción C es la más limpia y consistente con el patr Tailwind del proyecto. ### 2. Actualizar `src/components/Button/index.tsx` - **Eliminar** `BORDER_WIDTH`, `variantBorders`, `variantBorderColors`, `getButtonStyle()` - **Eliminar** `style={getButtonStyle(variant)}` de los elementos renderizados - **Agregar** clases CSS específicas para bordes: - `outline-gold` → `border-gold` - `outline-dark` → `border-black` - `outline-light` → `border-white` - `ghost` → `border-black` - `circular` → `border-black` - `icon-edit` → `border-gold` - `icon-delete` → `border-danger` - `file-upload` → `border-gold` - **Importar** el SCSS al inicio del archivo: `import './Button.scss';` ### 3. Actualizar tests **`Button.test.tsx`** (Jest): - Línea 58: `expect(outlineGoldBtn).toHaveClass('border-gold')` → ya funciona con la nueva clase - Línea 62: `expect(outlineDarkBtn).toHaveClass('border-black')` → ya funciona con la nueva clase **`Button.test.cy.tsx`** (Cypress): - Línea 13: `cy.get('button').should('have.class', 'border-gold')` → ya funciona - Línea 19: `cy.get('button').should('have.class', 'border-black')` → ya funciona Los tests de Cypress también verifican `border-top-width` con `have.css` — eso seguirá funcionando porque el border-width se define en SCSS. ### 4. Actualizar Storybook - `Button.stories.tsx`: Agregar `border-gold` y `border-black` como opciones de control si aplica ## Archivos a modificar | Archivo | Acción | |---------|--------| | `src/components/Button/Button.scss` | **Crear** — clases SCSS para bordes | | `src/components/Button/index.tsx` | **Editar** — eliminar inline styles, agregar clases CSS, importar SCSS | | `src/components/Button/Button.stories.tsx` | **Editar** — actualizar si es necesario | ## Verificación 1. `npm test` — todos los tests deben pasar (incluyendo las assertions de `border-gold` y `border-black`) 2. `npm run build-storybook` — Storybook debe compilar sin errores 3. `npm run build` — el bundle debe generar correctamente 4. CI: Push a la rama y verificar que Gitea Actions pase en ambos jobs