@@ -35,13 +37,25 @@ const DAYS: { key: string; es: string; ca: string }[] = [
Nueva rutina
-
@@ -60,6 +74,20 @@ const DAYS: { key: string; es: string; ca: string }[] = [
`,
+ styles: [
+ `
+ .field { margin-bottom: var(--space-4); }
+ .field__label { display: flex; align-items: center; gap: 6px; font-weight: 700; color: var(--text-1); margin-bottom: 6px; }
+ .field__info { cursor: help; color: var(--text-4); font-size: 0.85rem; }
+ .field__input {
+ font-family: var(--font-body); font-size: 1rem; padding: 12px 14px;
+ border: 2px solid var(--border-2); border-radius: var(--radius-sm);
+ background: var(--surface); color: var(--text-strong); width: 100%; box-sizing: border-box;
+ }
+ .grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-4); }
+ @media (max-width: 520px) { .grid2 { grid-template-columns: 1fr; } }
+ `,
+ ],
})
export class RoutinesTabComponent {
@Input({ required: true }) set childId(value: number) {
@@ -78,10 +106,11 @@ export class RoutinesTabComponent {
this.routines().filter((r) => r.dayOfWeek === this.day()),
);
+ protected readonly routineIcons = ['🎒', '🥪', '📝', '🎹', '🍽️', '🛁', '🦷', '📚', '🧹', '🐕', '🛏️', '🎨', '⚽', '🧺'];
protected icon = '';
protected labelEs = '';
protected labelCa = '';
- protected color = '#a78bd0';
+ protected color = '#A78BD0';
private reload(): void {
this.api.listRoutines(this._childId).subscribe((l) => this.routines.set(l));
diff --git a/frontend/src/app/shared/color-picker.component.ts b/frontend/src/app/shared/color-picker.component.ts
new file mode 100644
index 0000000..5bb54d1
--- /dev/null
+++ b/frontend/src/app/shared/color-picker.component.ts
@@ -0,0 +1,44 @@
+import { Component, model } from '@angular/core';
+
+/** Selector de color de acento: paleta del handoff, clicable. Two-way con [(value)]. */
+@Component({
+ selector: 'app-color-picker',
+ imports: [],
+ template: `
+
+ @for (c of colors; track c) {
+
+ }
+
+ `,
+ styles: [
+ `
+ .picker { display: flex; flex-wrap: wrap; gap: 8px; }
+ .swatch {
+ all: unset;
+ cursor: pointer;
+ width: 36px;
+ height: 36px;
+ border-radius: 50%;
+ box-shadow: var(--shadow-card);
+ border: 3px solid transparent;
+ transition: transform 0.1s;
+ }
+ .swatch:hover { transform: scale(1.1); }
+ .swatch--sel { border-color: var(--text-strong); transform: scale(1.1); }
+ `,
+ ],
+})
+export class ColorPickerComponent {
+ /** Color seleccionado (hex). Por defecto el primero de la paleta. */
+ readonly value = model
('#F2A65A');
+
+ protected readonly colors = ['#F2A65A', '#5B8DEF', '#A78BD0', '#7FBF6B', '#5BC0BE', '#F4C95D', '#EC8FA4'];
+}
diff --git a/frontend/src/app/shared/emoji-picker.component.ts b/frontend/src/app/shared/emoji-picker.component.ts
new file mode 100644
index 0000000..a5bdd2c
--- /dev/null
+++ b/frontend/src/app/shared/emoji-picker.component.ts
@@ -0,0 +1,43 @@
+import { Component, input, model } from '@angular/core';
+
+/** Selector de emoji clicable a partir de una lista de opciones. Two-way con [(value)]. */
+@Component({
+ selector: 'app-emoji-picker',
+ imports: [],
+ template: `
+
+ @for (e of options(); track e) {
+
+ {{ e }}
+
+ }
+
+ `,
+ styles: [
+ `
+ .picker { display: flex; flex-wrap: wrap; gap: 8px; }
+ .emoji {
+ all: unset;
+ cursor: pointer;
+ width: 48px;
+ height: 48px;
+ border-radius: 14px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 26px;
+ background: var(--surface-soft);
+ border: 2px solid transparent;
+ transition: transform 0.1s, border-color 0.15s;
+ }
+ .emoji:hover { transform: scale(1.08); }
+ .emoji--sel { border-color: var(--accent-blue); background: color-mix(in srgb, var(--accent-blue) 12%, #fff); }
+ `,
+ ],
+})
+export class EmojiPickerComponent {
+ /** Emoji seleccionado. */
+ readonly value = model('');
+ /** Lista de emojis ofrecidos. */
+ readonly options = input([]);
+}