diff --git a/dashboard/habits.html b/dashboard/habits.html index 1b64cdd..554bd0f 100644 --- a/dashboard/habits.html +++ b/dashboard/habits.html @@ -249,6 +249,279 @@ .priority-low { background: var(--success); } + + /* Modal overlay */ + .modal-overlay { + display: none; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.7); + z-index: 1000; + align-items: center; + justify-content: center; + padding: var(--space-4); + } + + .modal-overlay.active { + display: flex; + } + + .modal { + background: var(--bg-surface); + border-radius: var(--radius-lg); + max-width: 600px; + width: 100%; + max-height: 90vh; + overflow-y: auto; + box-shadow: var(--shadow-lg); + } + + .modal-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: var(--space-4); + border-bottom: 1px solid var(--border); + } + + .modal-title { + font-size: var(--text-lg); + font-weight: 600; + color: var(--text-primary); + } + + .modal-close { + background: none; + border: none; + color: var(--text-muted); + cursor: pointer; + padding: var(--space-1); + display: flex; + align-items: center; + justify-content: center; + border-radius: var(--radius-md); + transition: all var(--transition-base); + } + + .modal-close:hover { + background: var(--bg-hover); + color: var(--text-primary); + } + + .modal-close svg { + width: 20px; + height: 20px; + } + + .modal-body { + padding: var(--space-4); + } + + .modal-footer { + display: flex; + justify-content: flex-end; + gap: var(--space-2); + padding: var(--space-4); + border-top: 1px solid var(--border); + } + + /* Form fields */ + .form-field { + margin-bottom: var(--space-4); + } + + .form-label { + display: block; + font-size: var(--text-sm); + font-weight: 500; + color: var(--text-primary); + margin-bottom: var(--space-1); + } + + .form-label.required::after { + content: '*'; + color: var(--error); + margin-left: var(--space-1); + } + + .form-input, + .form-select, + .form-textarea { + width: 100%; + padding: var(--space-2); + border: 1px solid var(--border); + border-radius: var(--radius-md); + background: var(--bg-base); + color: var(--text-primary); + font-size: var(--text-sm); + transition: all var(--transition-base); + } + + .form-input:focus, + .form-select:focus, + .form-textarea:focus { + outline: none; + border-color: var(--accent); + box-shadow: 0 0 0 3px var(--accent-muted); + } + + .form-textarea { + min-height: 80px; + resize: vertical; + font-family: inherit; + } + + /* Color picker */ + .color-picker-swatches { + display: grid; + grid-template-columns: repeat(8, 1fr); + gap: var(--space-2); + margin-bottom: var(--space-2); + } + + .color-swatch { + width: 100%; + aspect-ratio: 1; + border: 2px solid transparent; + border-radius: var(--radius-md); + cursor: pointer; + transition: all var(--transition-base); + } + + .color-swatch:hover { + transform: scale(1.1); + } + + .color-swatch.selected { + border-color: var(--text-primary); + box-shadow: 0 0 0 2px var(--bg-surface), 0 0 0 4px var(--accent); + } + + /* Icon picker */ + .icon-picker-grid { + display: grid; + grid-template-columns: repeat(6, 1fr); + gap: var(--space-2); + max-height: 250px; + overflow-y: auto; + padding: var(--space-2); + border: 1px solid var(--border); + border-radius: var(--radius-md); + background: var(--bg-base); + } + + .icon-option { + aspect-ratio: 1; + display: flex; + align-items: center; + justify-content: center; + border: 2px solid transparent; + border-radius: var(--radius-md); + cursor: pointer; + transition: all var(--transition-base); + background: var(--bg-surface); + } + + .icon-option:hover { + background: var(--bg-hover); + transform: scale(1.1); + } + + .icon-option.selected { + border-color: var(--accent); + background: var(--accent-muted); + } + + .icon-option svg { + width: 20px; + height: 20px; + color: var(--text-primary); + } + + /* Frequency params */ + .frequency-params { + margin-top: var(--space-2); + } + + .day-checkboxes { + display: grid; + grid-template-columns: repeat(7, 1fr); + gap: var(--space-2); + } + + .day-checkbox-label { + display: flex; + flex-direction: column; + align-items: center; + gap: var(--space-1); + padding: var(--space-2); + border: 1px solid var(--border); + border-radius: var(--radius-md); + cursor: pointer; + transition: all var(--transition-base); + font-size: var(--text-xs); + } + + .day-checkbox-label:has(input:checked) { + background: var(--accent-muted); + border-color: var(--accent); + } + + .day-checkbox-label input { + margin: 0; + } + + /* Toast notification */ + .toast { + position: fixed; + bottom: var(--space-4); + right: var(--space-4); + padding: var(--space-3) var(--space-4); + border-radius: var(--radius-md); + background: var(--bg-surface); + border: 1px solid var(--border); + box-shadow: var(--shadow-lg); + z-index: 2000; + display: flex; + align-items: center; + gap: var(--space-2); + animation: slideIn 0.3s ease-out; + } + + @keyframes slideIn { + from { + transform: translateX(100%); + opacity: 0; + } + to { + transform: translateX(0); + opacity: 1; + } + } + + .toast.success { + border-color: var(--success); + } + + .toast.error { + border-color: var(--error); + } + + .toast svg { + width: 20px; + height: 20px; + } + + .toast.success svg { + color: var(--success); + } + + .toast.error svg { + color: var(--error); + } @@ -301,6 +574,91 @@ + + +