bitflags::bitflags! {
    #[derive(Debug, Clone, Copy, PartialEq, Eq)]
    /// Tracks which aspects of a component need updating.
    ///
    /// Dirty flags propagate information through the runtime so it knows whether
    /// to repaint, relayout, or rebuild the component tree. Multiple flags can
    /// be set simultaneously.
    ///
    /// | Flag | Meaning |
    /// |------|---------|
    /// | `PAINT` | Visual output is stale; repaint needed. |
    /// | `LAYOUT` | Layout geometry is stale; relayout + repaint needed. |
    /// | `TREE` | The component tree structure may have changed. |
    pub struct Dirty: u8 {
        /// Nothing needs updating.
        const NONE   = 0;
        /// Repaint only — geometry is still valid.
        const PAINT  = 0b0001;
        /// Relayout required — geometry may have changed.
        const LAYOUT = 0b0010;
        /// Tree structure may have changed (children added/removed).
        const TREE   = 0b0100;
    }
}
