diff --git a/ui/COMPONENTS.md b/ui/COMPONENTS.md
new file mode 100644
index 0000000..7f2d6ad
--- /dev/null
+++ b/ui/COMPONENTS.md
@@ -0,0 +1,1139 @@
+# SimpleNote Web - Reusable Components
+
+Component library for SimpleNote Web. All components use CSS custom properties for theming.
+
+---
+
+## 1. Buttons
+
+### 1.1 Primary Button
+```html
+
+```
+```css
+.btn-primary {
+ background: var(--color-accent);
+ color: var(--color-bg);
+ border: none;
+ padding: 0.5rem 1rem;
+ border-radius: 6px;
+ font-weight: 600;
+ cursor: pointer;
+ transition: background 0.15s, transform 0.1s;
+}
+.btn-primary:hover { background: var(--color-accent-hover); }
+.btn-primary:active { transform: scale(0.98); }
+.btn-primary:disabled { opacity: 0.5; cursor: not-allowed; }
+```
+
+### 1.2 Secondary Button
+```html
+
+```
+```css
+.btn-secondary {
+ background: transparent;
+ color: var(--color-text);
+ border: 1px solid var(--color-border);
+ padding: 0.5rem 1rem;
+ border-radius: 6px;
+ cursor: pointer;
+ transition: background 0.15s, border-color 0.15s;
+}
+.btn-secondary:hover {
+ background: var(--color-hover);
+ border-color: var(--color-text-muted);
+}
+```
+
+### 1.3 Ghost Button (icon-only)
+```html
+
+```
+```css
+.btn-ghost {
+ background: transparent;
+ border: none;
+ color: var(--color-text-muted);
+ padding: 0.5rem;
+ border-radius: 6px;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition: background 0.15s, color 0.15s;
+}
+.btn-ghost:hover {
+ background: var(--color-hover);
+ color: var(--color-text);
+}
+```
+
+### 1.4 Danger Button
+```html
+
+```
+```css
+.btn-danger {
+ background: var(--color-danger);
+ color: white;
+ border: none;
+ padding: 0.5rem 1rem;
+ border-radius: 6px;
+ font-weight: 600;
+ cursor: pointer;
+}
+.btn-danger:hover { background: var(--color-danger-hover); }
+```
+
+### 1.5 Icon Button with Label
+```html
+
+```
+```css
+.btn-icon-label {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ background: var(--color-accent);
+ color: var(--color-bg);
+ border: none;
+ padding: 0.5rem 1rem;
+ border-radius: 6px;
+ font-weight: 600;
+ cursor: pointer;
+}
+```
+
+---
+
+## 2. Inputs
+
+### 2.1 Text Input
+```html
+
+
+
+
+```
+```css
+.input-group {
+ display: flex;
+ flex-direction: column;
+ gap: 0.25rem;
+}
+.input-group label {
+ font-size: 0.875rem;
+ font-weight: 500;
+ color: var(--color-text-muted);
+}
+.input {
+ background: var(--color-surface);
+ border: 1px solid var(--color-border);
+ color: var(--color-text);
+ padding: 0.625rem 0.875rem;
+ border-radius: 6px;
+ font-size: 1rem;
+ transition: border-color 0.15s, box-shadow 0.15s;
+}
+.input:focus {
+ outline: none;
+ border-color: var(--color-accent);
+ box-shadow: 0 0 0 3px var(--color-accent-alpha);
+}
+.input::placeholder { color: var(--color-text-muted); }
+.input:disabled { opacity: 0.5; cursor: not-allowed; }
+.input.error { border-color: var(--color-danger); }
+```
+
+### 2.2 Search Input
+```html
+
+
+
+
+
+```
+```css
+.search-input {
+ position: relative;
+ display: flex;
+ align-items: center;
+}
+.search-input .input {
+ padding-left: 2.5rem;
+ padding-right: 2.5rem;
+ width: 100%;
+}
+.search-icon {
+ position: absolute;
+ left: 0.75rem;
+ color: var(--color-text-muted);
+ pointer-events: none;
+}
+.search-clear {
+ position: absolute;
+ right: 0.5rem;
+ background: transparent;
+ border: none;
+ color: var(--color-text-muted);
+ cursor: pointer;
+ padding: 0.25rem;
+ border-radius: 4px;
+ display: none;
+}
+.search-input.has-value .search-clear { display: block; }
+.search-clear:hover { color: var(--color-text); }
+```
+
+### 2.3 Select / Dropdown
+```html
+
+
+
+
+```
+```css
+.select {
+ background: var(--color-surface);
+ border: 1px solid var(--color-border);
+ color: var(--color-text);
+ padding: 0.625rem 2rem 0.625rem 0.875rem;
+ border-radius: 6px;
+ font-size: 1rem;
+ cursor: pointer;
+ appearance: none;
+ background-image: url("data:image/svg+xml,...");
+ background-repeat: no-repeat;
+ background-position: right 0.75rem center;
+ background-size: 1rem;
+}
+.select:focus {
+ outline: none;
+ border-color: var(--color-accent);
+ box-shadow: 0 0 0 3px var(--color-accent-alpha);
+}
+```
+
+### 2.4 Tags Input (Chip-style)
+```html
+
+```
+```css
+.tags-input {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+ padding: 0.5rem;
+ background: var(--color-surface);
+ border: 1px solid var(--color-border);
+ border-radius: 6px;
+ min-height: 42px;
+}
+.tags-input:focus-within {
+ border-color: var(--color-accent);
+ box-shadow: 0 0 0 3px var(--color-accent-alpha);
+}
+.tags-chips { display: flex; flex-wrap: wrap; gap: 0.5rem; }
+.tag-chip {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.25rem;
+ background: var(--color-accent-alpha);
+ color: var(--color-accent);
+ padding: 0.25rem 0.5rem;
+ border-radius: 4px;
+ font-size: 0.875rem;
+}
+.tag-remove {
+ background: transparent;
+ border: none;
+ color: inherit;
+ cursor: pointer;
+ padding: 0;
+ font-size: 1rem;
+ line-height: 1;
+}
+.tag-remove:hover { color: var(--color-danger); }
+.tags-input-field {
+ flex: 1;
+ min-width: 100px;
+ background: transparent;
+ border: none;
+ color: var(--color-text);
+ padding: 0.25rem;
+ font-size: 0.875rem;
+}
+.tags-input-field:focus { outline: none; }
+```
+
+### 2.5 Textarea (Markdown Editor)
+```html
+
+```
+```css
+.textarea-editor {
+ width: 100%;
+ background: var(--color-surface);
+ border: 1px solid var(--color-border);
+ color: var(--color-text);
+ padding: 1rem;
+ border-radius: 6px;
+ font-family: var(--font-mono);
+ font-size: 0.9375rem;
+ line-height: 1.6;
+ resize: vertical;
+ tab-size: 2;
+}
+.textarea-editor:focus {
+ outline: none;
+ border-color: var(--color-accent);
+ box-shadow: 0 0 0 3px var(--color-accent-alpha);
+}
+```
+
+---
+
+## 3. Cards
+
+### 3.1 Document Card
+```html
+
+
+
+
+
+
+
+
+ π
Mar 28
+ π€ agent-001
+ β draft
+ π΄ high
+
+
+```
+```css
+.doc-card {
+ background: var(--color-surface);
+ border: 1px solid var(--color-border);
+ border-radius: 8px;
+ padding: 1rem;
+ cursor: pointer;
+ transition: border-color 0.15s, box-shadow 0.15s, transform 0.1s;
+}
+.doc-card:hover {
+ border-color: var(--color-accent);
+ box-shadow: 0 2px 8px rgba(0,0,0,0.1);
+ transform: translateY(-1px);
+}
+.doc-card-header {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ margin-bottom: 0.75rem;
+}
+.doc-type-badge {
+ background: var(--color-accent-alpha);
+ color: var(--color-accent);
+ font-size: 0.75rem;
+ font-weight: 700;
+ padding: 0.125rem 0.5rem;
+ border-radius: 4px;
+ flex-shrink: 0;
+}
+.doc-title {
+ font-size: 1rem;
+ font-weight: 600;
+ color: var(--color-text);
+ margin: 0;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.doc-tags {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+ margin-bottom: 0.75rem;
+}
+.doc-meta {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.75rem;
+ font-size: 0.8125rem;
+ color: var(--color-text-muted);
+}
+```
+
+### 3.2 Library Card
+```html
+
+ π
+
+
Backend Requirements
+ 12 documents Β· 3 sub-libraries
+
+
+
+```
+```css
+.lib-card {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+ background: var(--color-surface);
+ border: 1px solid var(--color-border);
+ border-radius: 8px;
+ padding: 1rem;
+ cursor: pointer;
+ transition: background 0.15s;
+}
+.lib-card:hover { background: var(--color-hover); }
+.lib-icon { font-size: 1.5rem; }
+.lib-info { flex: 1; min-width: 0; }
+.lib-name {
+ font-size: 1rem;
+ font-weight: 600;
+ margin: 0 0 0.25rem;
+}
+.lib-count { font-size: 0.8125rem; color: var(--color-text-muted); }
+```
+
+---
+
+## 4. Tags & Badges
+
+### 4.1 Tag Pill (Clickable)
+```html
+
+```
+```css
+.tag-pill {
+ background: var(--color-accent-alpha);
+ color: var(--color-accent);
+ border: none;
+ padding: 0.25rem 0.625rem;
+ border-radius: 9999px;
+ font-size: 0.8125rem;
+ cursor: pointer;
+ transition: background 0.15s, transform 0.1s;
+}
+.tag-pill:hover {
+ background: var(--color-accent);
+ color: var(--color-bg);
+ transform: scale(1.05);
+}
+.tag-pill.active {
+ background: var(--color-accent);
+ color: var(--color-bg);
+}
+```
+
+### 4.2 Status Badge
+```html
+draft
+approved
+implemented
+```
+```css
+.status-badge {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.25rem;
+ padding: 0.125rem 0.5rem;
+ border-radius: 4px;
+ font-size: 0.75rem;
+ font-weight: 600;
+ text-transform: uppercase;
+}
+.status-draft {
+ background: var(--color-warning-bg);
+ color: var(--color-warning);
+}
+.status-approved {
+ background: var(--color-info-bg);
+ color: var(--color-info);
+}
+.status-implemented {
+ background: var(--color-success-bg);
+ color: var(--color-success);
+}
+```
+
+### 4.3 Priority Indicator
+```html
+π΄
+π‘
+π’
+```
+```css
+.priority { font-size: 0.875rem; }
+```
+
+### 4.4 Type Badge
+```html
+REQ
+NOTE
+SPEC
+DOC
+```
+```css
+.type-badge {
+ background: var(--color-surface);
+ border: 1px solid var(--color-border);
+ padding: 0.125rem 0.375rem;
+ border-radius: 4px;
+ font-size: 0.6875rem;
+ font-weight: 700;
+ letter-spacing: 0.05em;
+}
+.type-requirement { border-color: var(--color-accent); color: var(--color-accent); }
+.type-note { border-color: var(--color-info); color: var(--color-info); }
+.type-spec { border-color: var(--color-purple); color: var(--color-purple); }
+.type-general { border-color: var(--color-text-muted); color: var(--color-text-muted); }
+```
+
+---
+
+## 5. Navigation
+
+### 5.1 Sidebar
+```html
+
+```
+```css
+.sidebar {
+ width: 280px;
+ height: 100%;
+ background: var(--color-surface);
+ border-right: 1px solid var(--color-border);
+ overflow-y: auto;
+ padding: 1rem;
+ display: flex;
+ flex-direction: column;
+ gap: 1.5rem;
+}
+.sidebar-section { display: flex; flex-direction: column; gap: 0.5rem; }
+.sidebar-title {
+ font-size: 0.75rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+ color: var(--color-text-muted);
+ margin: 0;
+}
+@media (max-width: 768px) {
+ .sidebar {
+ display: none; /* Hidden on mobile, shown via bottom nav */
+ }
+}
+```
+
+### 5.2 Library Tree Item
+```html
+
+
+ π
+ Backend Requirements
+ (12)
+
+
+
+
+```
+```css
+.tree-item {
+ display: flex;
+ align-items: center;
+ gap: 0.375rem;
+ padding: 0.375rem 0.5rem;
+ border-radius: 6px;
+ cursor: pointer;
+ font-size: 0.875rem;
+ color: var(--color-text);
+}
+.tree-item:hover { background: var(--color-hover); }
+.tree-item.active { background: var(--color-accent-alpha); color: var(--color-accent); }
+.tree-toggle {
+ background: transparent;
+ border: none;
+ color: var(--color-text-muted);
+ cursor: pointer;
+ padding: 0;
+ font-size: 0.625rem;
+ width: 1rem;
+ transition: transform 0.15s;
+}
+.tree-toggle.collapsed { transform: rotate(-90deg); }
+.tree-icon { font-size: 1rem; }
+.tree-name { flex: 1; }
+.tree-count { color: var(--color-text-muted); font-size: 0.75rem; }
+.tree-children {
+ padding-left: 1.25rem;
+ border-left: 1px solid var(--color-border);
+ margin-left: 0.625rem;
+}
+```
+
+### 5.3 Breadcrumbs
+```html
+
+```
+```css
+.breadcrumbs {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ font-size: 0.875rem;
+ flex-wrap: wrap;
+}
+.breadcrumb {
+ color: var(--color-text-muted);
+ text-decoration: none;
+}
+.breadcrumb:hover { color: var(--color-accent); }
+.breadcrumb-sep { color: var(--color-border); }
+.breadcrumb-current {
+ color: var(--color-text);
+ font-weight: 500;
+}
+```
+
+### 5.4 Bottom Navigation (Mobile)
+```html
+
+```
+```css
+.bottom-nav {
+ display: none;
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ background: var(--color-surface);
+ border-top: 1px solid var(--color-border);
+ padding: 0.5rem 1rem;
+ justify-content: space-around;
+ z-index: 100;
+}
+@media (max-width: 768px) {
+ .bottom-nav { display: flex; }
+}
+.bottom-nav-item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 0.25rem;
+ background: transparent;
+ border: none;
+ color: var(--color-text-muted);
+ padding: 0.5rem;
+ cursor: pointer;
+ font-size: 0.6875rem;
+}
+.bottom-nav-item.active { color: var(--color-accent); }
+.bottom-nav-item svg { width: 1.5rem; height: 1.5rem; }
+.bottom-nav-item-primary {
+ background: var(--color-accent);
+ color: var(--color-bg);
+ border-radius: 50%;
+ width: 3rem;
+ height: 3rem;
+ margin-top: -1rem;
+ box-shadow: 0 4px 12px rgba(0,0,0,0.2);
+}
+.bottom-nav-item-primary svg { width: 1.75rem; height: 1.75rem; }
+```
+
+---
+
+## 6. Modals
+
+### 6.1 Modal Base
+```html
+
+
+
+
+
Delete "Document Title"?
+
+
+
+
+```
+```css
+.modal-overlay {
+ position: fixed;
+ inset: 0;
+ background: rgba(0,0,0,0.6);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 1000;
+ padding: 1rem;
+ opacity: 0;
+ visibility: hidden;
+ transition: opacity 0.2s, visibility 0.2s;
+}
+.modal-overlay.active {
+ opacity: 1;
+ visibility: visible;
+}
+.modal {
+ background: var(--color-surface);
+ border-radius: 12px;
+ width: 100%;
+ max-width: 400px;
+ box-shadow: 0 20px 60px rgba(0,0,0,0.3);
+ transform: scale(0.95);
+ transition: transform 0.2s;
+}
+.modal-overlay.active .modal { transform: scale(1); }
+.modal-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 1rem 1.25rem;
+ border-bottom: 1px solid var(--color-border);
+}
+.modal-title { margin: 0; font-size: 1.125rem; }
+.modal-body { padding: 1.25rem; }
+.modal-footer {
+ display: flex;
+ justify-content: flex-end;
+ gap: 0.75rem;
+ padding: 1rem 1.25rem;
+ border-top: 1px solid var(--color-border);
+}
+```
+
+---
+
+## 7. Feedback
+
+### 7.1 Toast Notification
+```html
+
+ β
+ Document saved
+
+
+```
+```css
+.toast {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ background: var(--color-surface);
+ border: 1px solid var(--color-border);
+ border-radius: 8px;
+ padding: 0.875rem 1rem;
+ box-shadow: 0 4px 12px rgba(0,0,0,0.15);
+ min-width: 280px;
+ max-width: 400px;
+ animation: slideIn 0.2s ease-out;
+}
+@keyframes slideIn {
+ from { transform: translateX(100%); opacity: 0; }
+ to { transform: translateX(0); opacity: 1; }
+}
+.toast-success { border-left: 4px solid var(--color-success); }
+.toast-error { border-left: 4px solid var(--color-danger); }
+.toast-info { border-left: 4px solid var(--color-info); }
+.toast-icon { font-size: 1.125rem; }
+.toast-message { flex: 1; }
+.toast-close {
+ background: transparent;
+ border: none;
+ color: var(--color-text-muted);
+ cursor: pointer;
+ padding: 0.25rem;
+}
+.toast-close:hover { color: var(--color-text); }
+```
+
+### 7.2 Loading Spinner
+```html
+
+ Loading...
+
+```
+```css
+.spinner {
+ width: 1.5rem;
+ height: 1.5rem;
+ border: 2px solid var(--color-border);
+ border-top-color: var(--color-accent);
+ border-radius: 50%;
+ animation: spin 0.8s linear infinite;
+}
+@keyframes spin {
+ to { transform: rotate(360deg); }
+}
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0,0,0,0);
+ border: 0;
+}
+```
+
+### 7.3 Empty State
+```html
+
+
π
+
No documents yet
+
Create your first document to get started
+
+
+```
+```css
+.empty-state {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ padding: 3rem 1.5rem;
+ gap: 1rem;
+}
+.empty-icon { font-size: 3rem; opacity: 0.5; }
+.empty-title { margin: 0; font-size: 1.25rem; color: var(--color-text); }
+.empty-description { margin: 0; color: var(--color-text-muted); }
+```
+
+### 7.4 Skeleton Loader
+```html
+
+```
+```css
+.skeleton {
+ background: linear-gradient(
+ 90deg,
+ var(--color-border) 25%,
+ var(--color-hover) 50%,
+ var(--color-border) 75%
+ );
+ background-size: 200% 100%;
+ animation: shimmer 1.5s infinite;
+ border-radius: 4px;
+}
+@keyframes shimmer {
+ 0% { background-position: 200% 0; }
+ 100% { background-position: -200% 0; }
+}
+.skeleton-badge { width: 3rem; height: 1.25rem; }
+.skeleton-title { width: 70%; height: 1.5rem; }
+.skeleton-tags { width: 50%; height: 1.25rem; }
+.skeleton-meta { width: 40%; height: 1rem; }
+```
+
+---
+
+## 8. Layout
+
+### 8.1 App Layout
+```html
+
+```
+```css
+.app-layout {
+ display: flex;
+ flex-direction: column;
+ height: 100vh;
+ overflow: hidden;
+}
+.app-body {
+ display: flex;
+ flex: 1;
+ overflow: hidden;
+}
+.main-content {
+ flex: 1;
+ overflow-y: auto;
+ padding: 1.5rem;
+ background: var(--color-bg);
+}
+@media (max-width: 768px) {
+ .main-content {
+ padding: 1rem;
+ padding-bottom: 5rem; /* space for bottom nav */
+ }
+}
+```
+
+### 8.2 Toolbar
+```html
+
+```
+```css
+.toolbar {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 1rem;
+ margin-bottom: 1.5rem;
+ flex-wrap: wrap;
+}
+.toolbar-left { display: flex; align-items: baseline; gap: 0.75rem; }
+.toolbar-title { margin: 0; font-size: 1.5rem; font-weight: 600; }
+.toolbar-count { color: var(--color-text-muted); font-size: 0.875rem; }
+.toolbar-right { display: flex; align-items: center; gap: 0.5rem; }
+.toolbar-divider { width: 1px; height: 1.5rem; background: var(--color-border); margin: 0 0.5rem; }
+@media (max-width: 768px) {
+ .toolbar-right .btn span { display: none; }
+}
+```
+
+### 8.3 Split Pane (Editor + Preview)
+```html
+
+```
+```css
+.split-pane {
+ display: flex;
+ height: 100%;
+ gap: 1px;
+ background: var(--color-border);
+}
+.split-editor,
+.split-preview {
+ flex: 1;
+ overflow-y: auto;
+ background: var(--color-bg);
+}
+.split-resize-handle {
+ width: 4px;
+ background: var(--color-border);
+ cursor: col-resize;
+}
+.split-resize-handle:hover { background: var(--color-accent); }
+@media (max-width: 768px) {
+ .split-pane { flex-direction: column; }
+ .split-resize-handle {
+ width: 100%;
+ height: 4px;
+ cursor: row-resize;
+ }
+}
+```
+
+---
+
+## 9. Form Components
+
+### 9.1 Metadata Panel
+```html
+
+```
+```css
+.metadata-panel {
+ width: 280px;
+ background: var(--color-surface);
+ border-left: 1px solid var(--color-border);
+ padding: 1rem;
+ overflow-y: auto;
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+}
+.meta-section { display: flex; flex-direction: column; gap: 0.75rem; }
+.meta-title {
+ font-size: 0.75rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+ color: var(--color-text-muted);
+ margin: 0;
+}
+.meta-row {
+ display: flex;
+ flex-direction: column;
+ gap: 0.25rem;
+}
+.meta-label {
+ font-size: 0.8125rem;
+ color: var(--color-text-muted);
+}
+.meta-value {
+ font-size: 0.875rem;
+ color: var(--color-text);
+}
+@media (max-width: 1024px) {
+ .metadata-panel {
+ width: 100%;
+ border-left: none;
+ border-top: 1px solid var(--color-border);
+ }
+}
+```
+
+---
+
+## 10. Utility Classes
+
+```css
+/* Text utilities */
+.text-muted { color: var(--color-text-muted); }
+.text-accent { color: var(--color-accent); }
+.text-danger { color: var(--color-danger); }
+.text-success { color: var(--color-success); }
+.text-sm { font-size: 0.875rem; }
+.text-xs { font-size: 0.75rem; }
+.font-mono { font-family: var(--font-mono); }
+.font-bold { font-weight: 600; }
+
+/* Spacing */
+.gap-1 { gap: 0.25rem; }
+.gap-2 { gap: 0.5rem; }
+.gap-3 { gap: 0.75rem; }
+.gap-4 { gap: 1rem; }
+.p-2 { padding: 0.5rem; }
+.p-4 { padding: 1rem; }
+.mt-2 { margin-top: 0.5rem; }
+.mt-4 { margin-top: 1rem; }
+.mb-2 { margin-bottom: 0.5rem; }
+.mb-4 { margin-bottom: 1rem; }
+
+/*
\ No newline at end of file
diff --git a/ui/STYLES.md b/ui/STYLES.md
new file mode 100644
index 0000000..72df30b
--- /dev/null
+++ b/ui/STYLES.md
@@ -0,0 +1,1029 @@
+# SimpleNote Web - Style Guide
+
+## 1. Design Tokens
+
+Design tokens are CSS custom properties that define the visual language. They enable theming (dark/light modes) and ensure consistency.
+
+### 1.1 Color Palette
+
+```css
+:root {
+ /* === Dark Theme (Default) === */
+ /* Backgrounds */
+ --color-bg: #0f1117;
+ --color-surface: #1a1d26;
+ --color-surface-raised: #22262f;
+ --color-hover: rgba(255, 255, 255, 0.05);
+ --color-active: rgba(255, 255, 255, 0.08);
+
+ /* Text */
+ --color-text: #e4e6eb;
+ --color-text-secondary: #b0b3b8;
+ --color-text-muted: #65676b;
+
+ /* Borders */
+ --color-border: #303338;
+ --color-border-light: #404249;
+
+ /* Accent (Primary brand color - cyan/teal) */
+ --color-accent: #00d4aa;
+ --color-accent-hover: #00e8bb;
+ --color-accent-alpha: rgba(0, 212, 170, 0.15);
+
+ /* Semantic Colors */
+ --color-success: #31a065;
+ --color-success-bg: rgba(49, 160, 101, 0.15);
+ --color-warning: #cf9d2c;
+ --color-warning-bg: rgba(207, 157, 44, 0.15);
+ --color-danger: #cf4a4a;
+ --color-danger-hover: #e05555;
+ --color-info: #4a90cf;
+ --color-info-bg: rgba(74, 144, 207, 0.15);
+
+ /* Type-specific colors */
+ --color-requirement: #00d4aa; /* Matches accent */
+ --color-note: #4a90cf;
+ --color-spec: #9b59b6;
+ --color-general: #65676b;
+
+ /* Priority */
+ --color-priority-high: #cf4a4a;
+ --color-priority-medium: #cf9d2c;
+ --color-priority-low: #31a065;
+
+ /* Shadows */
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
+ --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.25);
+ --shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.3);
+ --shadow-xl: 0 20px 60px rgba(0, 0, 0, 0.4);
+
+ /* Focus ring */
+ --focus-ring: 0 0 0 3px rgba(0, 212, 170, 0.4);
+}
+
+/* === Light Theme === */
+[data-theme="light"] {
+ --color-bg: #f5f6f8;
+ --color-surface: #ffffff;
+ --color-surface-raised: #f0f1f3;
+ --color-hover: rgba(0, 0, 0, 0.04);
+ --color-active: rgba(0, 0, 0, 0.06);
+
+ --color-text: #1a1d26;
+ --color-text-secondary: #4a4f5c;
+ --color-text-muted: #8b919d;
+
+ --color-border: #e1e3e8;
+ --color-border-light: #ebedf2;
+
+ --color-accent: #00a884;
+ --color-accent-hover: #00c49a;
+ --color-accent-alpha: rgba(0, 168, 132, 0.12);
+
+ --color-success: #22863a;
+ --color-success-bg: rgba(34, 134, 58, 0.1);
+ --color-warning: #b08800;
+ --color-warning-bg: rgba(176, 136, 0, 0.1);
+ --color-danger: #cb2431;
+ --color-danger-hover: #d93542;
+ --color-info: #0366d6;
+ --color-info-bg: rgba(3, 102, 214, 0.1);
+
+ --color-requirement: #00a884;
+ --color-note: #0366d6;
+ --color-spec: #6f42c1;
+ --color-general: #6a737d;
+
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.06);
+ --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.08);
+ --shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.1);
+ --shadow-xl: 0 20px 60px rgba(0, 0, 0, 0.15);
+
+ --focus-ring: 0 0 0 3px rgba(0, 168, 132, 0.35);
+}
+```
+
+### 1.2 Typography
+
+```css
+:root {
+ /* Font Families */
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
+ --font-mono: 'JetBrains Mono', 'Fira Code', 'Monaco', 'Consolas', monospace;
+
+ /* Font Sizes (1.25 scale) */
+ --text-xs: 0.64rem; /* 10.24px */
+ --text-sm: 0.8rem; /* 12.8px */
+ --text-base: 1rem; /* 16px */
+ --text-lg: 1.25rem; /* 20px */
+ --text-xl: 1.563rem; /* 25px */
+ --text-2xl: 1.953rem; /* 31.25px */
+ --text-3xl: 2.441rem; /* 39px */
+
+ /* Line Heights */
+ --leading-tight: 1.25;
+ --leading-normal: 1.5;
+ --leading-relaxed: 1.75;
+
+ /* Font Weights */
+ --font-normal: 400;
+ --font-medium: 500;
+ --font-semibold: 600;
+ --font-bold: 700;
+
+ /* Letter Spacing */
+ --tracking-tight: -0.025em;
+ --tracking-normal: 0;
+ --tracking-wide: 0.025em;
+ --tracking-wider: 0.05em;
+}
+
+/* Google Fonts Import */
+@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');
+```
+
+#### Typography Scale
+
+| Element | Size | Weight | Line Height |
+|---------|------|--------|-------------|
+| H1 | 2rem (32px) | 700 | 1.2 |
+| H2 | 1.5rem (24px) | 600 | 1.25 |
+| H3 | 1.25rem (20px) | 600 | 1.3 |
+| H4 | 1rem (16px) | 600 | 1.4 |
+| Body | 1rem (16px) | 400 | 1.5 |
+| Small | 0.875rem (14px) | 400 | 1.5 |
+| Caption | 0.75rem (12px) | 400 | 1.4 |
+| Code | 0.9375rem (15px) | 400 | 1.6 |
+
+### 1.3 Spacing
+
+```css
+:root {
+ /* Spacing scale (4px base) */
+ --space-0: 0;
+ --space-1: 0.25rem; /* 4px */
+ --space-2: 0.5rem; /* 8px */
+ --space-3: 0.75rem; /* 12px */
+ --space-4: 1rem; /* 16px */
+ --space-5: 1.25rem; /* 20px */
+ --space-6: 1.5rem; /* 24px */
+ --space-8: 2rem; /* 32px */
+ --space-10: 2.5rem; /* 40px */
+ --space-12: 3rem; /* 48px */
+ --space-16: 4rem; /* 64px */
+ --space-20: 5rem; /* 80px */
+
+ /* Border Radius */
+ --radius-sm: 4px;
+ --radius-md: 6px;
+ --radius-lg: 8px;
+ --radius-xl: 12px;
+ --radius-2xl: 16px;
+ --radius-full: 9999px;
+
+ /* Transitions */
+ --transition-fast: 0.1s ease;
+ --transition-normal: 0.15s ease;
+ --transition-slow: 0.25s ease;
+ --transition-spring: 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
+}
+```
+
+### 1.4 Z-Index Scale
+
+```css
+:root {
+ --z-base: 0;
+ --z-dropdown: 100;
+ --z-sticky: 200;
+ --z-modal-backdrop: 500;
+ --z-modal: 600;
+ --z-toast: 700;
+ --z-tooltip: 800;
+ --z-max: 9999;
+}
+```
+
+---
+
+## 2. Global Styles
+
+### 2.1 CSS Reset
+
+```css
+*, *::before, *::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+html {
+ font-size: 16px;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ text-rendering: optimizeLegibility;
+}
+
+body {
+ font-family: var(--font-sans);
+ font-size: var(--text-base);
+ line-height: var(--leading-normal);
+ color: var(--color-text);
+ background: var(--color-bg);
+ min-height: 100vh;
+}
+
+img, svg {
+ display: block;
+ max-width: 100%;
+}
+
+button {
+ font: inherit;
+ cursor: pointer;
+}
+
+input, textarea, select {
+ font: inherit;
+}
+
+a {
+ color: var(--color-accent);
+ text-decoration: none;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+ul, ol {
+ list-style: none;
+}
+
+/* Scrollbar styling */
+::-webkit-scrollbar {
+ width: 8px;
+ height: 8px;
+}
+
+::-webkit-scrollbar-track {
+ background: var(--color-surface);
+}
+
+::-webkit-scrollbar-thumb {
+ background: var(--color-border);
+ border-radius: var(--radius-full);
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: var(--color-text-muted);
+}
+
+/* Selection */
+::selection {
+ background: var(--color-accent-alpha);
+ color: var(--color-text);
+}
+```
+
+### 2.2 Focus Styles
+
+```css
+:focus {
+ outline: none;
+}
+
+:focus-visible {
+ outline: none;
+ box-shadow: var(--focus-ring);
+ border-radius: var(--radius-sm);
+}
+```
+
+### 2.3 Smooth Scrolling
+
+```css
+html {
+ scroll-behavior: smooth;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ html {
+ scroll-behavior: auto;
+ }
+
+ *, *::before, *::after {
+ animation-duration: 0.01ms !important;
+ animation-iteration-count: 1 !important;
+ transition-duration: 0.01ms !important;
+ }
+}
+```
+
+---
+
+## 3. Typography Components
+
+### 3.1 Headings
+
+```css
+h1, .h1 {
+ font-size: var(--text-2xl);
+ font-weight: var(--font-bold);
+ line-height: var(--leading-tight);
+ letter-spacing: var(--tracking-tight);
+ color: var(--color-text);
+}
+
+h2, .h2 {
+ font-size: var(--text-xl);
+ font-weight: var(--font-semibold);
+ line-height: 1.25;
+ letter-spacing: var(--tracking-tight);
+}
+
+h3, .h3 {
+ font-size: var(--text-lg);
+ font-weight: var(--font-semibold);
+ line-height: 1.3;
+}
+
+h4, .h4 {
+ font-size: var(--text-base);
+ font-weight: var(--font-semibold);
+ line-height: 1.4;
+}
+```
+
+### 3.2 Body Text
+
+```css
+p {
+ margin-bottom: var(--space-4);
+}
+
+p:last-child {
+ margin-bottom: 0;
+}
+
+.text-sm {
+ font-size: var(--text-sm);
+}
+
+.text-xs {
+ font-size: var(--text-xs);
+}
+
+.text-muted {
+ color: var(--color-text-muted);
+}
+
+.text-secondary {
+ color: var(--color-text-secondary);
+}
+
+.font-mono {
+ font-family: var(--font-mono);
+}
+```
+
+### 3.3 Prose (Markdown Content)
+
+```css
+.prose {
+ max-width: 70ch;
+ color: var(--color-text);
+}
+
+.prose h1 { /* ... */ }
+.prose h2 { /* ... */ }
+.prose h3 { /* ... */ }
+.prose h4 { /* ... */ }
+
+.prose p {
+ margin-bottom: 1em;
+ line-height: 1.7;
+}
+
+.prose ul,
+.prose ol {
+ margin-bottom: 1em;
+ padding-left: 1.5em;
+}
+
+.prose ul { list-style-type: disc; }
+.prose ol { list-style-type: decimal; }
+
+.prose li {
+ margin-bottom: 0.25em;
+ line-height: 1.6;
+}
+
+.prose code {
+ font-family: var(--font-mono);
+ font-size: 0.875em;
+ background: var(--color-surface);
+ padding: 0.125em 0.375em;
+ border-radius: var(--radius-sm);
+ color: var(--color-accent);
+}
+
+.prose pre {
+ background: var(--color-surface);
+ border: 1px solid var(--color-border);
+ border-radius: var(--radius-lg);
+ padding: 1rem;
+ overflow-x: auto;
+ margin-bottom: 1em;
+}
+
+.prose pre code {
+ background: transparent;
+ padding: 0;
+ color: var(--color-text);
+ font-size: 0.875rem;
+ line-height: 1.6;
+}
+
+.prose blockquote {
+ border-left: 4px solid var(--color-accent);
+ padding-left: 1rem;
+ margin: 1em 0;
+ color: var(--color-text-secondary);
+ font-style: italic;
+}
+
+.prose table {
+ width: 100%;
+ border-collapse: collapse;
+ margin-bottom: 1em;
+}
+
+.prose th,
+.prose td {
+ padding: 0.5rem 0.75rem;
+ border: 1px solid var(--color-border);
+ text-align: left;
+}
+
+.prose th {
+ background: var(--color-surface);
+ font-weight: var(--font-semibold);
+}
+
+.prose tr:hover td {
+ background: var(--color-hover);
+}
+
+/* Task list checkboxes */
+.prose input[type="checkbox"] {
+ margin-right: 0.5em;
+ accent-color: var(--color-accent);
+}
+
+.prose a {
+ color: var(--color-accent);
+ text-decoration: underline;
+}
+
+.prose img {
+ max-width: 100%;
+ border-radius: var(--radius-lg);
+ margin: 1em 0;
+}
+
+.prose hr {
+ border: none;
+ border-top: 1px solid var(--color-border);
+ margin: 2em 0;
+}
+```
+
+---
+
+## 4. Animation Guidelines
+
+### 4.1 Motion Principles
+
+1. **Purposeful**: Animation should communicate state changes, not decorate
+2. **Quick**: Most transitions should be 150-250ms
+3. **Responsive**: Motion should feel immediate to user input
+4. **Respectful**: Don't animate if user prefers reduced motion
+
+### 4.2 Standard Animations
+
+```css
+/* Fade in */
+@keyframes fadeIn {
+ from { opacity: 0; }
+ to { opacity: 1; }
+}
+
+/* Slide in from bottom */
+@keyframes slideInUp {
+ from {
+ opacity: 0;
+ transform: translateY(10px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+/* Slide in from right (toasts) */
+@keyframes slideInRight {
+ from {
+ opacity: 0;
+ transform: translateX(100%);
+ }
+ to {
+ opacity: 1;
+ transform: translateX(0);
+ }
+}
+
+/* Scale in (modals) */
+@keyframes scaleIn {
+ from {
+ opacity: 0;
+ transform: scale(0.95);
+ }
+ to {
+ opacity: 1;
+ transform: scale(1);
+ }
+}
+
+/* Pulse (saving indicator) */
+@keyframes pulse {
+ 0%, 100% { opacity: 1; }
+ 50% { opacity: 0.5; }
+}
+
+/* Spin (loading) */
+@keyframes spin {
+ to { transform: rotate(360deg); }
+}
+
+/* Shimmer (skeleton) */
+@keyframes shimmer {
+ 0% { background-position: 200% 0; }
+ 100% { background-position: -200% 0; }
+}
+```
+
+### 4.3 Reduced Motion
+
+```css
+@media (prefers-reduced-motion: reduce) {
+ *,
+ *::before,
+ *::after {
+ animation-duration: 0.01ms !important;
+ animation-iteration-count: 1 !important;
+ transition-duration: 0.01ms !important;
+ }
+}
+```
+
+---
+
+## 5. Responsive Breakpoints
+
+```css
+/* Mobile first breakpoints */
+/* sm: 640px - Large phones */
+/* md: 768px - Tablets */
+/* lg: 1024px - Laptops */
+/* xl: 1280px - Desktops */
+/* 2xl: 1536px - Large screens */
+
+@media (min-width: 640px) {
+ /* sm */
+}
+
+@media (min-width: 768px) {
+ /* md */
+}
+
+@media (min-width: 1024px) {
+ /* lg */
+}
+
+@media (min-width: 1280px) {
+ /* xl */
+}
+
+@media (min-width: 1536px) {
+ /* 2xl */
+}
+
+/* Mobile-only (no breakpoint, mobile first) */
+/* styles apply to all, tablet+ override below */
+
+/* Tablet and up */
+@media (min-width: 768px) {
+ .hide-tablet { display: none; }
+}
+
+/* Desktop only */
+@media (min-width: 1024px) {
+ .hide-desktop { display: none; }
+}
+```
+
+---
+
+## 6. Icon Guidelines
+
+### 6.1 Icon System
+
+Using Lucide Icons (SVG-based, MIT licensed).
+
+```html
+
+
+
+
+
+
+```
+
+### 6.2 Icon Usage
+
+```css
+.icon {
+ display: inline-block;
+ vertical-align: middle;
+ flex-shrink: 0;
+}
+
+.icon-sm { width: 1rem; height: 1rem; }
+.icon-md { width: 1.25rem; height: 1.25rem; }
+.icon-lg { width: 1.5rem; height: 1.5rem; }
+
+/* Buttons with icons */
+.btn-icon {
+ display: inline-flex;
+ align-items: center;
+ gap: var(--space-2);
+}
+
+/* Icon-only buttons need proper sizing */
+.btn-icon-only {
+ width: 2.5rem;
+ height: 2.5rem;
+ padding: 0;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+}
+```
+
+### 6.3 Common Icons
+
+| Icon | Use Case |
+|------|----------|
+| `search` | Search input |
+| `plus` | Create new items |
+| `folder-plus` | Create library |
+| `file-plus` | Create document |
+| `edit` / `pencil` | Edit |
+| `trash-2` | Delete |
+| `download` | Export |
+| `chevron-down` | Dropdown toggle |
+| `chevron-right` | Tree expand |
+| `x` | Close, dismiss |
+| `check` | Confirm, saved |
+| `alert-circle` | Error |
+| `info` | Info toast |
+| `settings` | Settings |
+| `moon` | Dark mode |
+| `sun` | Light mode |
+| `home` | Dashboard |
+| `folder` | Library |
+| `file-text` | Document |
+| `tag` | Tag |
+| `link` | Internal link |
+| `external-link` | External link |
+| `copy` | Copy to clipboard |
+| `eye` | Preview |
+| `eye-off` | Hide |
+| `keyboard` | Shortcuts |
+
+---
+
+## 7. Form Styling
+
+### 7.1 Form Layouts
+
+```css
+/* Vertical form (default) */
+.form-vertical {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-4);
+}
+
+.form-horizontal {
+ display: flex;
+ flex-wrap: wrap;
+ gap: var(--space-4);
+ align-items: flex-start;
+}
+
+.form-horizontal .form-group {
+ flex: 1;
+ min-width: 200px;
+}
+
+/* Inline form */
+.form-inline {
+ display: flex;
+ gap: var(--space-2);
+ align-items: center;
+}
+```
+
+### 7.2 Fieldset & Legend
+
+```css
+fieldset {
+ border: 1px solid var(--color-border);
+ border-radius: var(--radius-lg);
+ padding: var(--space-4);
+ margin-bottom: var(--space-4);
+}
+
+legend {
+ font-size: var(--text-sm);
+ font-weight: var(--font-semibold);
+ color: var(--color-text-muted);
+ text-transform: uppercase;
+ letter-spacing: var(--tracking-wider);
+ padding: 0 var(--space-2);
+}
+```
+
+### 7.3 Help Text & Errors
+
+```css
+.help-text {
+ font-size: var(--text-sm);
+ color: var(--color-text-muted);
+ margin-top: var(--space-1);
+}
+
+.error-message {
+ font-size: var(--text-sm);
+ color: var(--color-danger);
+ margin-top: var(--space-1);
+ display: flex;
+ align-items: center;
+ gap: var(--space-1);
+}
+
+.input:invalid,
+.input.error {
+ border-color: var(--color-danger);
+}
+
+.input:invalid:focus,
+.input.error:focus {
+ box-shadow: 0 0 0 3px rgba(207, 74, 74, 0.25);
+}
+```
+
+---
+
+## 8. Status & State Colors
+
+### 8.1 Status Badge Colors
+
+| Status | Background | Text | Border |
+|--------|------------|------|--------|
+| draft | `var(--color-warning-bg)` | `var(--color-warning)` | none |
+| approved | `var(--color-info-bg)` | `var(--color-info)` | none |
+| implemented | `var(--color-success-bg)` | `var(--color-success)` | none |
+
+### 8.2 Priority Colors
+
+| Priority | Color | Emoji |
+|----------|-------|-------|
+| high | `var(--color-priority-high)` | π΄ |
+| medium | `var(--color-priority-medium)` | π‘ |
+| low | `var(--color-priority-low)` | π’ |
+
+### 8.3 Type Badge Colors
+
+| Type | Border | Text |
+|------|--------|------|
+| requirement | `var(--color-requirement)` | `var(--color-requirement)` |
+| note | `var(--color-note)` | `var(--color-note)` |
+| spec | `var(--color-spec)` | `var(--color-spec)` |
+| general | `var(--color-border)` | `var(--color-text-muted)` |
+
+---
+
+## 9. Loading & Skeleton States
+
+### 9.1 Skeleton Colors
+
+```css
+.skeleton {
+ background: linear-gradient(
+ 90deg,
+ var(--color-border) 25%,
+ var(--color-hover) 50%,
+ var(--color-border) 75%
+ );
+ background-size: 200% 100%;
+ animation: shimmer 1.5s infinite;
+}
+
+@keyframes shimmer {
+ 0% { background-position: 200% 0; }
+ 100% { background-position: -200% 0; }
+}
+
+/* Dark mode adjustment */
+[data-theme="dark"] .skeleton {
+ background: linear-gradient(
+ 90deg,
+ var(--color-surface) 25%,
+ var(--color-surface-raised) 50%,
+ var(--color-surface) 75%
+ );
+ background-size: 200% 100%;
+}
+```
+
+### 9.2 Loading Overlay
+
+```css
+.loading-overlay {
+ position: absolute;
+ inset: 0;
+ background: rgba(var(--color-bg), 0.8);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: var(--z-sticky);
+}
+
+[data-theme="dark"] .loading-overlay {
+ background: rgba(15, 17, 23, 0.8);
+}
+```
+
+---
+
+## 10. Dark Mode Implementation
+
+### 10.1 Theme Toggle
+
+```javascript
+// Theme toggle component
+function ThemeToggle() {
+ const toggle = () => {
+ const current = document.documentElement.getAttribute('data-theme');
+ const next = current === 'light' ? 'dark' : 'light';
+ document.documentElement.setAttribute('data-theme', next);
+ localStorage.setItem('theme', next);
+ };
+
+ return `
+
+ `;
+}
+
+// Initialize theme on load
+function initTheme() {
+ const saved = localStorage.getItem('theme');
+ const preferred = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
+ const theme = saved || preferred;
+ document.documentElement.setAttribute('data-theme', theme);
+}
+```
+
+### 10.2 CSS Variables at :root vs [data-theme]
+
+```css
+/* Default (dark) - no selector needed */
+:root {
+ --color-bg: #0f1117;
+ /* ... */
+}
+
+/* Light theme - explicit selector */
+[data-theme="light"] {
+ --color-bg: #f5f6f8;
+ /* ... */
+}
+```
+
+---
+
+## 11. Code Syntax Highlighting
+
+Using highlight.js or Prism for code blocks within markdown.
+
+```css
+/* Code highlighting tokens - dark theme */
+.hljs {
+ background: var(--color-surface);
+ color: var(--color-text);
+}
+
+.hljs-keyword { color: #c678dd; }
+.hljs-string { color: #98c379; }
+.hljs-number { color: #d19a66; }
+.hljs-function { color: #61afef; }
+.hljs-comment { color: #5c6370; font-style: italic; }
+.hljs-variable { color: #e06c75; }
+.hljs-attr { color: #d19a66; }
+.hljs-tag { color: #e06c75; }
+.hljs-attribute { color: #d19a66; }
+
+/* Code highlighting - light theme adjustments */
+[data-theme="light"] .hljs-keyword { color: #a626a4; }
+[data-theme="light"] .hljs-string { color: #50a14f; }
+[data-theme="light"] .hljs-number { color: #986801; }
+[data-theme="light"] .hljs-function { color: #4078f2; }
+[data-theme="light"] .hljs-comment { color: #a0a1a7; }
+[data-theme="light"] .hljs-variable { color: #e45649; }
+[data-theme="light"] .hljs-attr { color: #986801; }
+[data-theme="light"] .hljs-tag { color: #e45649; }
+[data-theme="light"] .hljs-attribute { color: #986801; }
+```
+
+---
+
+## 12. Print Styles
+
+```css
+@media print {
+ /* Hide navigation, sidebars, buttons */
+ .sidebar,
+ .app-header,
+ .toolbar,
+ .bottom-nav,
+ .btn,
+ .btn-ghost {
+ display: none !important;
+ }
+
+ /* Expand content */
+ .main-content {
+ width: 100% !important;
+ padding: 0 !important;
+ }
+
+ /* Adjust colors for print */
+ body {
+ background: white;
+ color: black;
+ }
+
+ /* Ensure links show URLs */
+ a[href^="http"]::after {
+ content: " (" attr(href) ")";
+ font-size: 0.8em;
+ }
+
+ /* Avoid page breaks inside elements */
+ .doc-card,
+ .prose h1,
+ .prose h2,
+ .prose h3,
+ .prose table {
+ break-inside: avoid;
+ }
+}
+```
+
+---
+
+## 13. Accessibility Checklist
+
+- [ ] All interactive elements have visible focus indicators
+- [ ] Color contrast ratio β₯ 4.5:1 for text
+- [ ] All images have alt text (or aria-hidden="true")
+- [ ] Form inputs have associated labels
+- [ ] Buttons have accessible names
+- [ ] Icons have aria-label or visible text
+- [ ] Modals trap focus and can be closed with Escape
+- [ ] Toast notifications use role="alert" or role="status"
+- [ ] Loading states announce to screen readers
+- [ ] Reduced motion is respected
+- [ ] Skip-to-content link is provided
+- [ ] Semantic HTML is used (nav, main, aside, article, etc.)
diff --git a/ui/VIEWS.md b/ui/VIEWS.md
new file mode 100644
index 0000000..94eb381
--- /dev/null
+++ b/ui/VIEWS.md
@@ -0,0 +1,541 @@
+# SimpleNote Web - Wireframes
+
+Text-based wireframes for each view. Uses ASCII-style box-drawing to represent layout.
+
+---
+
+## View 1: Dashboard / Main View
+
+### Desktop Layout (>1024px)
+
+```
+βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
+β [β‘] SimpleNote π Search documents... [π] [βοΈ] [π€] β
+βββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
+β β Documents [+ Doc] [+ Lib] [β] [β‘] β
+β π Libraries ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
+β ββ Backend β β
+β β ββ API β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
+β β ββ Auth β β REQ-001 Β· API Authentication Design β β
+β ββ Frontend β β π·οΈ backend π·οΈ api π·οΈ auth β β
+β ββ DevOps β β π
Mar 28 Β· π€ agent-001 Β· β draft Β· π΄ high β β
+β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
+β βββββββββββββ β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
+β β β NOTE-002 Β· Deployment Checklist β β
+β π·οΈ Tags β β π·οΈ devops π·οΈ deployment β β
+β ββ backend (5) β β π
Mar 27 Β· π€ agent-002 Β· β approved β β
+β ββ api (3) β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
+β ββ auth (2) β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
+β ββ devops (4) β β SPEC-003 Β· Database Schema v2 β β
+β ββ frontend(2) β β π·οΈ backend π·οΈ database β β
+β β β π
Mar 26 Β· π€ agent-001 Β· β implemented Β· π‘ med β β
+β βββββββββββββ β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
+β β β
+β Quick Links β Showing 12 of 42 documents β
+β ββ All Docs β β
+β ββ Recent (7) β β
+β ββ Favorites β β
+βββββββββββββββββββ΄ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
+```
+
+### Mobile Layout (<768px)
+
+```
+βββββββββββββββββββββββββββββββ
+β [β‘] SimpleNote [π][π] β
+βββββββββββββββββββββββββββββββ€
+β π Search... β
+βββββββββββββββββββββββββββββββ€
+β β
+β ββββββββββββββββββββββββββββ
+β β API Authentication ββ
+β β REQ-001 Β· π΄ High ββ
+β β π·οΈ backend Β· api ββ
+β ββββββββββββββββββββββββββββ
+β ββββββββββββββββββββββββββββ
+β β Deployment Checklist ββ
+β β NOTE-002 Β· β Approved ββ
+β β π·οΈ devops ββ
+β ββββββββββββββββββββββββββββ
+β ββββββββββββββββββββββββββββ
+β β Database Schema v2 ββ
+β β SPEC-003 Β· β Done ββ
+β β π·οΈ backend Β· database ββ
+β ββββββββββββββββββββββββββββ
+β β
+β 12 of 42 documents β
+β β
+βββββββββββββββββββββββββββββββ€
+β [π ] [π] [+π] [βοΈ] β
+βββββββββββββββββββββββββββββββ
+```
+
+### States
+
+**Loading State**:
+```
+β ... Loading documents... β
+β βββββββββββββββββββββ 60% β
+```
+
+**Empty State**:
+```
+β β
+β π β
+β No documents yet β
+β β
+β Create your first document β
+β [+ Create Doc] β
+β β
+```
+
+**Search Results**:
+```
+β π "authentication" β
+β Clear β β
+β βββββββββββββββββββββββββ β
+β 3 results for "auth..." β
+β ββββββββββββββββββββββββββββ
+β β API Authentication ββ
+β β ...supports **auth**... ββ
+β ββββββββββββββββββββββββββββ
+```
+
+---
+
+## View 2: Document Viewer
+
+### Desktop Layout
+
+```
+βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
+β β Back API Authentication Design [βοΈ] [β] [ποΈ] β
+βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬ββββββββ€
+β β Type β
+β # API Authentication Design β REQ β
+β βββββββββ€
+β ## DescripciΓ³n βStatus β
+β El sistema debe soportar autenticaciΓ³n via tokens Bearer... β draft β
+β βββββββββ€
+β ## Criterios de AceptaciΓ³n βPriorityβ
+β - [ ] Endpoint POST /api/v1/auth/token acepta credenciales... β π΄ β
+β - [ ] Middleware extrae token del header... β High β
+β - [ ] Middleware retorna 401 si header ausente... βββββββββ€
+β - [ ] Token tiene prefijo `snk_`... β Tags β
+β β [backend]β
+β ## Notas β [api] β
+β Tokens en esta versiΓ³n son secretos compartidos... β [auth] β
+β β β
+β ```javascript βββββββββ€
+β // authMiddleware.js βAuthor β
+β const token = req.headers.authorization?.replace('Bearer ', ''); βagent- β
+β ``` β001 β
+β βββββββββ€
+β βCreatedβ
+β βMar 28 β
+β β10:00 β
+β βββββββββ€
+β βUpdatedβ
+β βMar 28 β
+β β12:30 β
+βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ΄ββββββββ
+```
+
+### Mobile Layout (Metadata collapses to top)
+
+```
+βββββββββββββββββββββββββββββββββββ
+β β Back [βοΈ] [β] [ποΈ] β
+βββββββββββββββββββββββββββββββββββ€
+β REQ Β· draft Β· π΄ High β
+β π·οΈ backend π·οΈ api π·οΈ auth β
+βββββββββββββββββββββββββββββββββββ€
+β β
+β # API Authentication Design β
+β β
+β ## DescripciΓ³n β
+β El sistema debe soportar... β
+β β
+β ## Criterios de AceptaciΓ³n β
+β - [ ] Endpoint POST... β
+β - [ ] Middleware extrae... β
+β β
+β ## Notas β
+β Tokens en esta versiΓ³n... β
+β β
+β ```javascript β
+β const token = req.headers... β
+β ``` β
+β β
+β Author: agent-001 β
+β Created: Mar 28, 2026 β
+βββββββββββββββββββββββββββββββββββ
+```
+
+### Delete Confirmation Modal
+
+```
+βββββββββββββββββββββββββββββββββββββββ
+β β οΈ Confirm Delete β
+β β
+β Delete "API Authentication"? β
+β β
+β This will permanently remove: β
+β β’ Document content β
+β β’ All metadata β
+β β’ Tag associations β
+β β
+β [Cancel] [Delete] β
+βββββββββββββββββββββββββββββββββββββββ
+```
+
+---
+
+## View 3: Document Editor
+
+### Desktop Layout (Split View)
+
+```
+βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
+β Cancel Editing: API Authentication [Template βΌ] [Save] β
+ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββ€
+β Title: [API Authentication Design ] β Auto-saved β β
+β Library: [Backend Requirements βΌ] β β
+β Type: [Requirement βΌ] Status: [Draft βΌ] Priority: [High βΌ] β β
+ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β
+β Tags: [+ Add tag...] β β
+β [backend Γ] [api Γ] [auth Γ] β β
+ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ΄βββββββββββββββββ€
+β [B] [I] [H1] [H2] [H3] [β’] [1.] [β] [>] [π] [π·] [Table] β [Preview βΌ] β
+ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββ€
+β β β
+β ## DescripciΓ³n β ## DescripciΓ³nβ
+β El sistema debe soportar autenticaciΓ³n via tokens β β
+β Bearer para todas las rutas protegidas... β ## Criterios β
+β β de AceptaciΓ³n β
+β ## Criterios de AceptaciΓ³n β β
+β - [ ] Endpoint POST /api/v1/auth/token β β’ [ ] Criterioβ
+β - [ ] Middleware extrae token β 1 β
+β - [ ] Middleware retorna 401 β β’ [ ] Criterioβ
+β - [ ] Token tiene prefijo `snk_` β 2 β
+β β β
+β ## Notas β β
+β Tokens en esta versiΓ³n son secretos compartidos... β β
+β β β
+β ```javascript β β
+β const token = req.headers... β β
+β ``` β β
+β β β
+ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ΄βββββββββββββββββ€
+β Write Preview β
+βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
+```
+
+### Mobile Layout (Tabbed)
+
+```
+βββββββββββββββββββββββββββββββββββ
+β [β] Edit Document [Save] β
+βββββββββββββββββββββββββββββββββββ€
+β [Write] [Preview] [Meta] β
+βββββββββββββββββββββββββββββββββββ€
+β β
+β Title: β
+β ββββββββββββββββββββββββββββββββ
+β β API Authentication Design ββ
+β ββββββββββββββββββββββββββββββββ
+β β
+β Content: β
+β ββββββββββββββββββββββββββββββββ
+β β ## DescripciΓ³n ββ
+β β El sistema debe soportar... ββ
+β β ββ
+β β ## Criterios de AceptaciΓ³n ββ
+β β - [ ] Endpoint POST... ββ
+β β ββ
+β ββββββββββββββββββββββββββββββββ
+β β
+β [+] Add tag: [____________] β
+β [backend Γ] [api Γ] [auth Γ] β
+β β
+β Type: [Requirement βΌ] β
+β Status: [Draft βΌ] β
+β Priority: [High βΌ] β
+β Library: [Backend βΌ] β
+β β
+β Auto-saved β β
+βββββββββββββββββββββββββββββββββββ
+```
+
+### Template Picker Dropdown
+
+```
+β [Template βΌ] β
+β ββββββββββββββββββββββββββββββββ
+β β π Requirement Document ββ
+β β π General Note ββ
+β β π Specification ββ
+β β π Blank Document ββ
+β ββββββββββββββββββββββββββββββββ
+```
+
+### Requirement Template Content (inserted)
+
+```
+---
+id: REQ-XXX
+title: New Requirement
+type: requirement
+priority: medium
+status: draft
+tags: []
+createdBy: user
+createdAt: YYYY-MM-DD
+---
+
+# New Requirement
+
+## DescripciΓ³n
+[DescripciΓ³n clara del requerimiento]
+
+## Criterios de AceptaciΓ³n
+- [ ] Criterio 1
+- [ ] Criterio 2
+
+## Notas
+[Notas adicionales]
+```
+
+### Unsaved Changes Warning Modal
+
+```
+βββββββββββββββββββββββββββββββββββββββ
+β β οΈ Unsaved Changes β
+β β
+β You have unsaved changes. β
+β β
+β [Discard] [Save & Close] β
+βββββββββββββββββββββββββββββββββββββββ
+```
+
+---
+
+## View 4: Library Browser
+
+### Desktop Layout
+
+```
+βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
+β Home / Backend / API [+ Doc] [+ Lib] β
+βββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
+β β β
+β π Libraries β π API 3 docs β
+β ββ π΅ Backend β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
+β β ββ βͺ API β β π REST API Endpoints REQ-010 β β
+β β ββ βͺ Auth β β π·οΈ api Β· π·οΈ rest Β· π
Mar 28 β β
+β ββ π΅ Frontendβ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
+β ββ π΅ DevOps β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
+β β β π Authentication Flow SPEC-005 β β
+β βββββββββββββ β β π·οΈ api Β· π·οΈ auth Β· π
Mar 27 β β
+β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
+β π API β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
+β ββ REST β β π Rate Limiting NOTE-012 β β
+β ββ GraphQL β β π·οΈ api Β· π
Mar 26 β β
+β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
+β βββββββββββββ β β
+β β βββββββββββββββ Sub-libraries βββββββββββββββ β
+β Quick Links β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
+β ββ All Docs β β π REST [+ Doc] [+ Lib] ββ
+β ββ Recent β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
+β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
+β β β π GraphQL [+ Doc] [+ Lib]ββ
+β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
+βββββββββββββββββββ΄ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
+```
+
+### Mobile Layout
+
+```
+βββββββββββββββββββββββββββββββββββ
+β β Home / Backend / API β
+βββββββββββββββββββββββββββββββββββ€
+β β
+β π API β
+β 3 documents Β· 2 sub-libs β
+β β
+β [+] Doc [+] Lib β
+β β
+β ββββββββββββββββββββββββββββββββ
+β β π REST API Endpoints ββ
+β β REQ-010 Β· π·οΈ api ββ
+β ββββββββββββββββββββββββββββββββ
+β ββββββββββββββββββββββββββββββββ
+β β π Authentication Flow ββ
+β β SPEC-005 Β· π·οΈ api Β· π·οΈ auth ββ
+β ββββββββββββββββββββββββββββββββ
+β β
+β π Sub-libraries β
+β ββ π REST β
+β ββ π GraphQL β
+β β
+βββββββββββββββββββββββββββββββββββ€
+β [π ] [π] [+π] [βοΈ] β
+βββββββββββββββββββββββββββββββββββ
+```
+
+### Create Library Modal
+
+```
+βββββββββββββββββββββββββββββββββββββββ
+β π New Library β
+β β
+β Name: β
+β βββββββββββββββββββββββββββββββ β
+β β My New Library β β
+β βββββββββββββββββββββββββββββββ β
+β β
+β Parent: [Backend Requirements βΌ] β
+β β
+β [Cancel] [Create] β
+βββββββββββββββββββββββββββββββββββββββ
+```
+
+### Rename Library Modal
+
+```
+βββββββββββββββββββββββββββββββββββββββ
+β βοΈ Rename Library β
+β β
+β Name: β
+β βββββββββββββββββββββββββββββββ β
+β β API Requirements β β
+β βββββββββββββββββββββββββββββββ β
+β β
+β [Cancel] [Rename] β
+βββββββββββββββββββββββββββββββββββββββ
+```
+
+### Delete Library Modal
+
+```
+βββββββββββββββββββββββββββββββββββββββ
+β β οΈ Confirm Delete β
+β β
+β Delete library "API"? β
+β β
+β β οΈ This will also delete: β
+β β’ 3 documents β
+β β’ 2 sub-libraries β
+β β’ 5 total documents β
+β β
+β [Cancel] [Delete] β
+βββββββββββββββββββββββββββββββββββββββ
+```
+
+---
+
+## Context Menu (Right-click / Long-press)
+
+```
+β π REST API Endpoints β
+β βββ [Right-click] β β
+β β
+β βββββββββββββββββββββββββββ β
+β β βοΈ Edit β β
+β β π Open β β
+β β π Duplicate β β
+β β π Move to Library β β
+β β βββββββββββββββββββββββ β β
+β β ποΈ Delete β β
+β βββββββββββββββββββββββββββ β
+```
+
+---
+
+## Toast Notifications
+
+```
+β ββββββββββββββββ
+β β β Saved ββ
+β ββββββββββββββββ
+β βββββββββββββββββββββββ β
+β β β Failed to save β β
+β β [Retry] β β
+β βββββββββββββββββββββββ β
+```
+
+---
+
+## Settings Panel
+
+```
+βββββββββββββββββββββββββββββββββββββββ
+β βοΈ Settings β
+βββββββββββββββββββββββββββββββββββββββ€
+β β
+β Appearance β
+β Theme: [Dark βΌ] [Light] [System] β
+β β
+β βββββββββββββββββββββββββββββββββ β
+β β
+β API Configuration β
+β API URL: β
+β ββββββββββββββββββββββββββββββββββββ
+β β http://localhost:3000/api/v1 ββ
+β ββββββββββββββββββββββββββββββββββββ
+β β
+β API Token: β
+β ββββββββββββββββββββββββββββββββββββ
+β β snk_xxxxxxxxxxxxxxxxxxxxxxxx ββ
+β ββββββββββββββββββββββββββββββββββββ
+β β
+β [Test Connection] [Save] β
+β β
+β βββββββββββββββββββββββββββββββββ β
+β β
+β Data β
+β [Clear Local Cache] β
+β β
+β βββββββββββββββββββββββββββββββββ β
+β β
+β About β
+β SimpleNote Web v0.1.0 β
+β β
+β [β] β
+βββββββββββββββββββββββββββββββββββββββ
+```
+
+---
+
+## Keyboard Shortcuts Reference
+
+```
+βββββββββββββββββββββββββββββββββββββββββββββββ
+β Global β
+βββββββββββββββββββββββββββββββββββββββββββββββ€
+β Ctrl/Cmd + K Focus search β
+β Ctrl/Cmd + N New document β
+β Ctrl/Cmd + Shift + N New library β
+β Escape Close/Clear β
+βββββββββββββββββββββββββββββββββββββββββββββββ€
+β Document Editor β
+βββββββββββββββββββββββββββββββββββββββββββββββ€
+β Ctrl/Cmd + S Save β
+β Ctrl/Cmd + B Bold β
+β Ctrl/Cmd + I Italic β
+β Ctrl/Cmd + K Insert link β
+β Ctrl/Cmd + Shift + P Toggle preview β
+βββββββββββββββββββββββββββββββββββββββββββββββ€
+β Document Viewer β
+βββββββββββββββββββββββββββββββββββββββββββββββ€
+β E Edit document β
+β X Export markdown β
+β Delete Delete (confirm) β
+βββββββββββββββββββββββββββββββββββββββββββββββ€
+β Library Browser β
+βββββββββββββββββββββββββββββββββββββββββββββββ€
+β R Rename β
+β Delete Delete (confirm) β
+β Backspace Go to parent β
+βββββββββββββββββββββββββββββββββββββββββββββββ
+```