Notion: La Revolución Basada en Bloques
Cómo Notion hizo la complejidad componible: arquitectura basada en bloques, revelación progresiva, comandos slash y lienzo infinito. Con patrones de implementación CSS y TypeScript.
Notion: La Revolución Basada en Bloques
“Queremos lograr que todos puedan adaptar el software que usan, cada día, a sus necesidades exactas.” — Ivan Zhao, CEO de Notion
Notion transformó el software de productividad al convertir todo en un bloque. Esta abstracción aparentemente simple creó una flexibilidad infinita manteniendo la usabilidad—un desafío de diseño que la mayoría consideraba imposible.
Por Qué Notion Importa
Notion demostró que la complejidad puede ser componible. En lugar de funciones rígidas, crearon bloques de construcción que los usuarios combinan de maneras que los diseñadores nunca anticiparon.
Logros clave: - Hizo las bases de datos accesibles para no desarrolladores - Creó un lienzo infinito que resulta familiar - Demostró que flexibilidad y usabilidad no son opuestos - Fue pionero en la edición colaborativa de documentos a escala
Conclusiones Clave
- Todo es un bloque - El enfoque de unidad atómica significa que cada pieza de contenido (texto, imágenes, bases de datos) se comporta de manera idéntica: arrastrable, transformable, enlazable
- La revelación progresiva escala la complejidad - Los comandos de barra diagonal revelan funciones avanzadas solo cuando se invocan; los principiantes ven simplicidad, los expertos encuentran profundidad
- La consistencia supera a la astucia - Cada bloque tiene el mismo controlador, el mismo comportamiento de arrastre y puede convertirse en cualquier otro tipo
- El lienzo infinito elimina restricciones - Las páginas contienen páginas, las bases de datos contienen páginas, todo se enlaza con todo—sin jerarquía artificial
- La tipografía serena deja brillar al contenido - Un diseño sobrio con generoso interlineado (1.7) y un ancho de lectura cómodo (720px) mantiene el foco en el contenido del usuario
Principios Fundamentales de Diseño
1. Todo es un Bloque
La unidad atómica de Notion es el bloque. Cada pieza de contenido es un bloque que puede ser: - Movido - Transformado - Referenciado - Embebido
TRADITIONAL DOCUMENT:
┌─────────────────────────────────────┐
│ [Fixed header] │
│ ───────────────────────────────── │
│ Paragraph of text that's just text │
│ and can only be text. │
│ │
│ [Fixed image] │
│ │
│ Another paragraph, same deal. │
└─────────────────────────────────────┘
NOTION'S BLOCK MODEL:
┌─────────────────────────────────────┐
│ ⋮⋮ [Heading block - H1] │ ← Drag to reorder
│ ───────────────────────────────── │
│ ⋮⋮ [Text block] │ ← Turn into toggle, callout, etc.
│ Paragraph that can transform │
│ ⋮⋮ [Image block] │ ← Resize, caption, link
│ [caption] │
│ ⋮⋮ [Database block] │ ← Full database, inline
│ │ Task │ Status │ Due │ │
│ ⋮⋮ [Text block] │
│ Another paragraph │
└─────────────────────────────────────┘
La genialidad: Cada bloque tiene el mismo controlador (⋮⋮), el mismo comportamiento de arrastre y puede convertirse en cualquier otro tipo de bloque.
Patrón CSS (Block Handle):
.block {
position: relative;
padding-left: var(--block-indent);
}
.block-handle {
position: absolute;
left: 0;
opacity: 0;
transition: opacity 0.15s ease;
cursor: grab;
}
.block:hover .block-handle,
.block-handle:focus {
opacity: 1;
}
/* Universal block spacing */
.block + .block {
margin-top: var(--space-2);
}
Patrón SwiftUI:
struct BlockView: View {
@State private var isHovering = false
let block: Block
var body: some View {
HStack(alignment: .top, spacing: 4) {
// Universal handle
Image(systemName: "line.3.horizontal")
.opacity(isHovering ? 1 : 0)
.animation(.easeOut(duration: 0.15), value: isHovering)
// Block content (polymorphic)
BlockContentView(block: block)
}
.onHover { isHovering = $0 }
}
}
2. Revelación Progresiva
Notion revela la complejidad solo cuando es necesario. El estado predeterminado es limpio; las funciones avanzadas emergen bajo demanda.
El Menú “/”:
User types: /
↓
┌────────────────────────────────┐
│ BASIC BLOCKS │
│ [T] Text │
│ [P] Page │
│ [x] To-do list │
│ * Bulleted list │
│ │
│ DATABASE │
│ [=] Table │
│ [#] Board │
│ [D] Calendar │
│ │
│ MEDIA │
│ [I] Image │
│ [V] Video │
│ [@] File │
└────────────────────────────────┘
Complejidad Progresiva:
Level 1: Just type (text block)
Level 2: "/" for block types
Level 3: "@" for mentions and links
Level 4: "[" for inline databases
Level 5: Templates and formulas
Principio de Implementación:
/* Hidden until needed */
.property-options,
.advanced-settings,
.formula-builder {
display: none;
}
/* Revealed by explicit action */
.block.selected .property-options,
.settings-expanded .advanced-settings,
.formula-mode .formula-builder {
display: block;
animation: fadeSlideIn 0.2s ease-out;
}
3. El Lienzo Infinito
Las páginas contienen páginas. Las bases de datos contienen páginas. Las páginas se enlazan con todo. El espacio de trabajo no tiene muros.
TRADITIONAL HIERARCHY:
Folders → Documents → Content
│
└── Rigid, one location per doc
NOTION'S CANVAS:
Everything → Links to → Everything
│
└── Page can exist anywhere
└── Same data, multiple views
└── Inline or full-page
Idea clave: No existe un “sistema de archivos.” Existe un grafo de contenido conectado.
Patrón - Inline vs Página Completa:
/* Same content, different containers */
.database-inline {
max-height: 400px;
overflow-y: auto;
border: 1px solid var(--border-light);
border-radius: var(--radius-md);
}
.database-fullpage {
height: 100%;
border: none;
}
/* Content adapts to container */
.database-view {
display: flex;
flex-direction: column;
height: 100%;
}
4. Tipografía Serena
La tipografía de Notion es deliberadamente sobria. Deja que el contenido brille.
HIERARCHY THROUGH SIZE AND WEIGHT:
Page Title ← 40px, Bold, little personality
═══════════════════════════════════════════════
Heading 1 ← 30px, Semibold
───────────────────────────────────────────────
Heading 2 ← 24px, Semibold
. . . . . . . . . . . . . . . . . . . . . . .
Heading 3 ← 20px, Semibold
Body text flows naturally at 16px with ← 16px, Regular
generous line-height (1.7) and comfortable
measure. Long-form content remains readable.
Sistema Tipográfico:
:root {
/* Notion-inspired scale */
--font-title: 40px;
--font-h1: 30px;
--font-h2: 24px;
--font-h3: 20px;
--font-body: 16px;
--font-small: 14px;
/* Generous line height for readability */
--line-height-tight: 1.3;
--line-height-normal: 1.5;
--line-height-relaxed: 1.7;
/* Neutral, readable font stack */
--font-family: -apple-system, BlinkMacSystemFont,
'Segoe UI', 'Roboto', sans-serif;
}
.page-content {
max-width: 720px; /* Comfortable reading measure */
margin: 0 auto;
font-family: var(--font-family);
line-height: var(--line-height-relaxed);
}
Patrones transferibles
Patrón 1: Slash Commands
El mecanismo: Escribe “/” para revelar acciones contextuales.
// Slash command registry
interface SlashCommand {
trigger: string;
icon: string;
label: string;
shortcut?: string;
action: () => void;
}
const commands: SlashCommand[] = [
{ trigger: 'h1', icon: 'H1', label: 'Heading 1', action: createH1 },
{ trigger: 'bullet', icon: '•', label: 'Bullet list', action: createBullet },
{ trigger: 'todo', icon: '☐', label: 'To-do', action: createTodo },
];
// Filter as user types
function filterCommands(query: string): SlashCommand[] {
return commands.filter(cmd =>
cmd.trigger.includes(query.toLowerCase()) ||
cmd.label.toLowerCase().includes(query.toLowerCase())
);
}
Patrón 2: Transformación de bloques
El mecanismo: Cualquier bloque puede convertirse en cualquier otro bloque.
enum BlockType: CaseIterable {
case text, heading1, heading2, heading3
case bulletList, numberedList, toggleList, todo
case quote, callout, divider
case image, video, embed
var icon: String {
switch self {
case .text: return "text.alignleft"
case .heading1: return "textformat.size.larger"
// ...
}
}
}
struct BlockTransformMenu: View {
let currentBlock: Block
let onTransform: (BlockType) -> Void
var body: some View {
Menu {
ForEach(BlockType.allCases, id: \.self) { type in
Button {
onTransform(type)
} label: {
Label(type.label, systemImage: type.icon)
}
}
} label: {
Image(systemName: "arrow.triangle.turn.up.right.circle")
}
}
}
Patrón 3: Menciones en línea
El mecanismo: “@” para enlazar a cualquier elemento del espacio de trabajo.
.mention {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 2px 6px;
background: var(--bg-mention);
border-radius: var(--radius-sm);
color: var(--text-link);
text-decoration: none;
cursor: pointer;
}
.mention:hover {
background: var(--bg-mention-hover);
}
.mention-icon {
width: 16px;
height: 16px;
}
Lecciones de Diseño
- Composabilidad por encima de funcionalidades: Construir bloques que se combinan, no herramientas monolíticas
- Revelación progresiva: Simple por defecto, potente bajo demanda
- Interacciones consistentes: Cada bloque funciona de la misma manera
- Interfaz serena: Que el contenido sea el protagonista, no el marco visual
- Flexibilidad infinita: Sin restricciones artificiales en la estructura
Preguntas Frecuentes
¿Qué es la arquitectura basada en bloques de Notion?
Cada pieza de contenido en Notion es un "bloque": texto, imágenes, bases de datos, elementos embebidos e incluso las propias páginas. Cada bloque tiene un comportamiento idéntico: un controlador para arrastrar, la capacidad de transformarse en otros tipos de bloque y un espaciado consistente. Este enfoque atómico significa que los usuarios aprenden un solo patrón de interacción que se aplica en todas partes.
¿Cómo funciona el sistema de slash commands de Notion?
Al escribir "/" se abre un menú contextual con todos los tipos de bloque disponibles. El menú se filtra a medida que el usuario escribe (por ejemplo, "/todo" muestra la lista de tareas). Este patrón combina descubribilidad (ver todas las opciones) con velocidad (los usuarios avanzados escriben atajos directamente). El slash command se ha convertido en un patrón estándar de la industria.
¿Qué es la revelación progresiva y cómo la utiliza Notion?
La revelación progresiva consiste en mostrar la complejidad solo cuando es necesaria. En Notion, el Nivel 1 es simplemente escribir (crea un bloque de texto), el Nivel 2 es "/" para tipos de bloque, el Nivel 3 es "@" para menciones, el Nivel 4 es "[" para bases de datos, y el Nivel 5 son plantillas y fórmulas. Los principiantes nunca ven opciones abrumadoras.
¿En qué se diferencia el lienzo infinito de Notion de la estructura de documentos tradicional?
Las aplicaciones tradicionales usan jerarquías de carpetas donde cada documento existe en una sola ubicación. Notion trata el contenido como un grafo: las páginas contienen páginas, las bases de datos contienen páginas, y cualquier cosa puede enlazar con cualquier otra. La misma base de datos puede aparecer en línea dentro de múltiples páginas, y las páginas no tienen una "ubicación" fija en un sistema de archivos.
¿Por qué Notion utiliza una tipografía tan discreta?
La tipografía serena de Notion (fuentes del sistema, 16px para el cuerpo, 1.7 de interlineado, 720px de ancho máximo) evita deliberadamente tener personalidad propia. Los usuarios crean contenido muy diverso —notas de reuniones, wikis, gestores de proyectos— por lo que la interfaz debe ser un lienzo neutral que permita que cualquier tipo de contenido se sienta nativo.
Recursos
- Sitio web: notion.so
- Blog de diseño: Las decisiones de diseño detrás de escena de Notion
- Galería de plantillas: Patrones y casos de uso de la comunidad
- Documentación de la API: Construir con el modelo de bloques de Notion