# **Front-End Styling (CSS)**

| Field   | Value              |
| ------- | ------------------ |
| Version | 1.0.0              |
| Author  | Rakesh Lokhande    |
| Target  | All Frontend Teams |
| Scope   | CSS, SCSS, LESS    |

### **1. Core Principles**
* **Maintainability over Brevity**: Code is read far more often than it is written. Explicit class names and structures are preferred over clever hacks.
* **Component-Based**: Styles should be scoped to components, avoiding global pollution.
* **Mobile-First**: Design for the smallest screen first, then use min-width media queries to enhance the layout for larger screens.
* **Predictability**: A developer should be able to look at a class name and know exactly what it does and where it belongs.

### **2. Formatting & Syntax**
Consistency in formatting makes the codebase easier to scan and debug.
* **Indentation**: Use 2 spaces (soft tabs).
* **Brackets**:
    * Opening brace `{` on the same line as the selector, preceded by one space.
    * Closing brace `}` on its own line.
* **Spacing**:
    * Include a space after the colon `:` in properties.
    * Separate multiple selectors with a newline.
    * Separate rulesets with an empty line.
* **Quotes**: Use double quotes `""` for attribute selectors and content strings.
* **Zero Units**: Do not use units for zero values (e.g., `margin: 0; not margin: 0px;`).
* **Generic Font Families**: The requirement to always include a generic fallback (e.g., `sans-serif`)
**Example**
```
/* ✅ DO */
.card,
.card-alt {
  display: block;
  margin-bottom: 20px;
  padding: 1rem;
  background-color: #ffffff;
}

/* ❌ DON'T */
.card, .card-alt {
    display:block;
    margin-bottom: 20px;
    padding: 1rem;
    background-color: #fff
}
```

### **3. Naming Conventions (BEM)**
We strictly follow the BEM (Block Element Modifier) methodology to keep specificity low and semantic meaning high.
  * **Block**: The standalone component (e.g., .btn, .modal).
  * **Element**: A child part of the block, denoted by two underscores (e.g., .btn__icon, .modal__header).
  * **Modifier**: A variation, denoted by two hyphens (e.g., .btn--primary, .modal--large).

**Specificity Rules**
   * **No IDs**: Never use ID selectors (#header) for styling. IDs are reserved for JavaScript hooks and anchor links.
   * **No Type Selectors**: Avoid unqualified type selectors (e.g., div, span, h1) in component styles to prevent style leakage.
   * **JavaScript Hooks**: Do not use BEM classes for JS bindings. Use a dedicated js- prefixed class (e.g., .js-toggle-modal) which should have no styles attached.

### **4. Pre-processor Specifics (SCSS & LESS)**
#### **4.1. Variables**
* **Naming**: Use kebab-case (e.g., $brand-primary, @font-size-base).
* **Usage**:
    * Define all colors, fonts, z-indexes, and spacing measurements in a centralized variables file.
    * Never use "magic numbers" or hardcoded hex values in component files.
**SCSS Example:**
```
// variables.scss
$spacing-md: 16px;
$color-error: #e74c3c;

// component.scss
.alert {
  padding: $spacing-md; // ✅ Good
  color: $color-error;  // ✅ Good
  margin: 15px;         // ❌ Bad (Magic number)
}
```
#### **4.2 Nesting**
* **Depth Limit**: Do not nest more than 3 levels deep. Deep nesting increases file size and creates specificity wars.
* **Usage**: Use nesting primarily for BEM element targeting and pseudo-states (:hover, :focus).
**The "Inception" Rule:**
```
/* ✅ DO */
.nav {
  &__item {
    color: red;
  }
}

/* ❌ DON'T */
.nav {
  ul {
    li {
      a {
        span { ... } /* Too deep! */
      }
    }
  }
}
```
#### **4.3. Mixins vs. Extend**
* **Mixins**: Preferred. Use for grouping properties or handling vendor prefixes.
* **Extend**: Avoid. @extend breaks the source order of CSS and can group selectors unexpectedly, leading to difficult debugging and bloated files.

### **5. Architecture (The 7-1 Pattern)**
Structure your Sass/Less directories into 7 folders and 1 main file.
1. **abstracts/:** Variables, Mixins, Functions (outputs no CSS).
2. **base/:** Reset, Typography, global rules.
3. **components/:** Specific UI widgets (Buttons, Cards, Modals).
4. **layout/:** Global layout regions (Header, Footer, Grid, Sidebar).
5. **pages/:** Page-specific styles (keep this minimal).
6. **themes/:** Distinct themes (e.g., Dark Mode, Admin).
7. **vendors/:** Third-party CSS (Bootstrap, jQuery UI).
8. **main.scss:** The entry point that imports all above.

### **6. Responsive Design & Units**
* **Layout**: Use relative units (%, vw, vh, fr) for containers.
* **Typography**: Use rem for font-size. This respects the user's browser settings.
* **Spacing**: Use rem or em for padding/margin to ensure spacing scales with typography.
* **Media Queries**:
    * Write min-width queries (Mobile First).
    * Nest media queries inside the selector they modify.
```
.sidebar {
  width: 100%;

  @media (min-width: 768px) {
    width: 250px;
  }
}



Css
.sidebar {
width: 100%;
}
@media (min-width: 768px) {
  .sidebar {
    width: 250px;
  }
}
```

### **7. Performance**
* **Animation**: Only animate transform and opacity. Animating properties like width, height, top, or left causes expensive browser reflows.
* **Selectors**: Avoid the universal selector * inside complex components.
* **Imports**:
    * **CSS**: Avoid @import in plain CSS (blocks parallel loading).
    * **SCSS/LESS**: @import (or @use) is acceptable as it compiles to a single file.

### **8. Accessibility (A11y)**
* **Hiding Content**: Do not use display: none for content meant for screen readers. Use a .visually-hidden utility class.
* **Focus**: Never set outline: 0 or outline: none on focusable elements without providing a visible replacement style.
* **Contrast**: Ensure text color contrast ratios meet WCAG AA standards (4.5:1 for normal text).

**Document** - [CSS](https://docs.google.com/document/d/1CU_KDWtQcGuYa6LDK_kU0E_EjqR0AlTed7-1o-iiT3s/edit?usp=sharing)
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9