diff --git a/.gitignore b/.gitignore
index 33c579a..48cf616 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,6 +10,7 @@ node_modules
public/js/bundle.js
.aider*
+.claude*
backend/coverage/
diff --git a/Dockerfile b/Dockerfile
index 6e8ef63..15e85b8 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -56,7 +56,7 @@ RUN npm install --production --no-audit --no-fund && \
find node_modules -name ".github" -type d -exec rm -rf {} + 2>/dev/null || true && \
find node_modules -name "test" -type d -exec rm -rf {} + 2>/dev/null || true && \
find node_modules -name "tests" -type d -exec rm -rf {} + 2>/dev/null || true && \
- find node_modules -name "docs" -type d -exec rm -rf {} + 2>/dev/null || true && \
+ find node_modules -name "docs" -type d ! -path "*/googleapis/*" -exec rm -rf {} + 2>/dev/null || true && \
find node_modules -name "examples" -type d -exec rm -rf {} + 2>/dev/null || true
# Stage 3: Test Stage (run tests before production)
@@ -130,7 +130,7 @@ COPY --from=frontend-builder --chown=app:app /app/dist ./backend/dist
COPY --from=frontend-builder --chown=app:app /app/public/locales ./backend/dist/locales
# Create ultra-minimal startup script (before switching to non-root user)
-RUN printf '#!/bin/sh\nset -e\ncd backend\nmkdir -p db certs\nDB_FILE="db/production.sqlite3"\n[ "$NODE_ENV" = "development" ] && DB_FILE="db/development.sqlite3"\nif [ ! -f "$DB_FILE" ]; then\n node -e "require(\\"./models\\").sequelize.sync({force:true}).then(()=>{console.log(\\"✅ DB ready\\");process.exit(0)}).catch(e=>{console.error(\\"❌\\",e.message);process.exit(1)})"\nelse\n node -e "require(\\"./models\\").sequelize.authenticate().then(()=>{console.log(\\"✅ DB OK\\");process.exit(0)}).catch(e=>{console.error(\\"❌\\",e.message);process.exit(1)})"\nfi\nif [ -n "$TUDUDI_USER_EMAIL" ]&&[ -n "$TUDUDI_USER_PASSWORD" ]; then\n node -e "const{User}=require(\\"./models\\");const bcrypt=require(\\"bcrypt\\");(async()=>{try{const[u,c]=await User.findOrCreate({where:{email:process.env.TUDUDI_USER_EMAIL},defaults:{email:process.env.TUDUDI_USER_EMAIL,password_digest:await bcrypt.hash(process.env.TUDUDI_USER_PASSWORD,10)}});console.log(c?\\"✅ User created\\":\\"ℹ️ User exists\\");process.exit(0)}catch(e){console.error(\\"❌\\",e.message);process.exit(1)}})();"||exit 1\nfi\n[ "$TUDUDI_INTERNAL_SSL_ENABLED" = "true" ]&&[ ! -f "certs/server.crt" ]&&openssl req -x509 -newkey rsa:2048 -keyout certs/server.key -out certs/server.crt -days 365 -nodes -subj "/CN=localhost" 2>/dev/null||true\nexec node app.js\n' > start.sh && chmod +x start.sh
+RUN printf '#!/bin/sh\nset -e\ncd backend\n# Check and create directories with proper permissions\nif [ ! -d "db" ]; then\n mkdir -p db\nfi\nif [ ! -w "db" ]; then\n echo "❌ ERROR: Database directory /app/backend/db is not writable by user app (1001:1001)"\n echo "ℹ️ If using Docker volumes, ensure the host directory has proper ownership:"\n echo " sudo chown -R 1001:1001 /host/path/to/db"\n echo " Or use an anonymous volume: docker run -v /app/backend/db ..."\n exit 1\nfi\nmkdir -p certs\nDB_FILE="db/production.sqlite3"\n[ "$NODE_ENV" = "development" ] && DB_FILE="db/development.sqlite3"\nif [ ! -f "$DB_FILE" ]; then\n node -e "require(\\"./models\\").sequelize.sync({force:true}).then(()=>{console.log(\\"✅ DB ready\\");process.exit(0)}).catch(e=>{console.error(\\"❌\\",e.message);process.exit(1)})"\nelse\n node -e "require(\\"./models\\").sequelize.authenticate().then(()=>{console.log(\\"✅ DB OK\\");process.exit(0)}).catch(e=>{console.error(\\"❌\\",e.message);process.exit(1)})"\nfi\nif [ -n "$TUDUDI_USER_EMAIL" ]&&[ -n "$TUDUDI_USER_PASSWORD" ]; then\n node -e "const{User}=require(\\"./models\\");const bcrypt=require(\\"bcrypt\\");(async()=>{try{const[u,c]=await User.findOrCreate({where:{email:process.env.TUDUDI_USER_EMAIL},defaults:{email:process.env.TUDUDI_USER_EMAIL,password_digest:await bcrypt.hash(process.env.TUDUDI_USER_PASSWORD,10)}});console.log(c?\\"✅ User created\\":\\"ℹ️ User exists\\");process.exit(0)}catch(e){console.error(\\"❌\\",e.message);process.exit(1)}})();"||exit 1\nfi\n[ "$TUDUDI_INTERNAL_SSL_ENABLED" = "true" ]&&[ ! -f "certs/server.crt" ]&&openssl req -x509 -newkey rsa:2048 -keyout certs/server.key -out certs/server.crt -days 365 -nodes -subj "/CN=localhost" 2>/dev/null||true\nexec node app.js\n' > start.sh && chmod +x start.sh
# Create necessary directories and final cleanup
RUN mkdir -p ./backend/db ./backend/certs && \
@@ -141,6 +141,9 @@ RUN mkdir -p ./backend/db ./backend/certs && \
rm -rf /usr/local/lib/node_modules/npm/docs /usr/local/lib/node_modules/npm/man && \
rm -rf /root/.npm /tmp/* /var/tmp/* /var/cache/apk/*
+# Declare volume for database persistence
+VOLUME ["/app/backend/db"]
+
# Switch to non-root user
USER app
diff --git a/backend/.env.example b/backend/.env.example
new file mode 100644
index 0000000..895e1e6
--- /dev/null
+++ b/backend/.env.example
@@ -0,0 +1,9 @@
+# Google Calendar Integration
+GOOGLE_CLIENT_ID=your_google_client_id_here
+GOOGLE_CLIENT_SECRET=your_google_client_secret_here
+GOOGLE_REDIRECT_URI=http://localhost:3002/api/calendar/oauth/callback
+
+# Other environment variables (if needed)
+# TUDUDI_SESSION_SECRET=your_session_secret_here
+# TUDUDI_ALLOWED_ORIGINS=http://localhost:8080,http://localhost:9292
+# NODE_ENV=development
\ No newline at end of file
diff --git a/backend/app.js b/backend/app.js
index b38a54a..faa6140 100644
--- a/backend/app.js
+++ b/backend/app.js
@@ -19,7 +19,12 @@ const sessionStore = new SequelizeStore({
});
// Middlewares
-app.use(helmet());
+const sslEnabled = process.env.NODE_ENV === 'production' && process.env.TUDUDI_INTERNAL_SSL_ENABLED === 'true';
+app.use(helmet({
+ hsts: sslEnabled, // Only enable HSTS when SSL is enabled
+ forceHTTPS: sslEnabled, // Only force HTTPS when SSL is enabled
+ contentSecurityPolicy: false // Disable CSP for now to avoid conflicts
+}));
app.use(compression());
app.use(morgan('combined'));
@@ -31,7 +36,7 @@ const allowedOrigins = process.env.TUDUDI_ALLOWED_ORIGINS
app.use(cors({
origin: allowedOrigins,
credentials: true,
- methods: ['GET', 'POST', 'PATCH', 'DELETE', 'OPTIONS'],
+ methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
allowedHeaders: ['Authorization', 'Content-Type', 'Accept', 'X-Requested-With'],
exposedHeaders: ['Content-Type'],
maxAge: 1728000
@@ -98,6 +103,8 @@ app.use('/api', requireAuth, require('./routes/inbox'));
app.use('/api', requireAuth, require('./routes/url'));
app.use('/api', requireAuth, require('./routes/telegram'));
app.use('/api', requireAuth, require('./routes/quotes'));
+app.use('/api', requireAuth, require('./routes/task-events'));
+app.use('/api/calendar', require('./routes/calendar'));
// SPA fallback
app.get('*', (req, res) => {
@@ -138,7 +145,7 @@ async function startServer() {
where: { email: process.env.TUDUDI_USER_EMAIL },
defaults: {
email: process.env.TUDUDI_USER_EMAIL,
- password: await bcrypt.hash(process.env.TUDUDI_USER_PASSWORD, 10)
+ password_digest: await bcrypt.hash(process.env.TUDUDI_USER_PASSWORD, 10)
}
});
diff --git a/backend/migrations/20250621221841-add-completed-at-to-tasks.js b/backend/migrations/20250621221841-add-completed-at-to-tasks.js
new file mode 100644
index 0000000..6ec3292
--- /dev/null
+++ b/backend/migrations/20250621221841-add-completed-at-to-tasks.js
@@ -0,0 +1,22 @@
+'use strict';
+
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ // Add completed_at column to tasks table
+ await queryInterface.addColumn('tasks', 'completed_at', {
+ type: Sequelize.DATE,
+ allowNull: true
+ });
+
+ // Add an index for better query performance
+ await queryInterface.addIndex('tasks', ['completed_at']);
+ },
+
+ async down(queryInterface, Sequelize) {
+ // Remove the index first
+ await queryInterface.removeIndex('tasks', ['completed_at']);
+
+ // Remove the completed_at column
+ await queryInterface.removeColumn('tasks', 'completed_at');
+ }
+};
\ No newline at end of file
diff --git a/backend/migrations/20250621223000-create-calendar-tokens.js b/backend/migrations/20250621223000-create-calendar-tokens.js
new file mode 100644
index 0000000..0b841cc
--- /dev/null
+++ b/backend/migrations/20250621223000-create-calendar-tokens.js
@@ -0,0 +1,79 @@
+'use strict';
+
+module.exports = {
+ up: async (queryInterface, Sequelize) => {
+ await queryInterface.createTable('calendar_tokens', {
+ id: {
+ type: Sequelize.INTEGER,
+ primaryKey: true,
+ autoIncrement: true,
+ allowNull: false
+ },
+ user_id: {
+ type: Sequelize.INTEGER,
+ allowNull: false,
+ references: {
+ model: 'users',
+ key: 'id'
+ },
+ onDelete: 'CASCADE'
+ },
+ provider: {
+ type: Sequelize.STRING,
+ allowNull: false,
+ defaultValue: 'google'
+ },
+ access_token: {
+ type: Sequelize.TEXT,
+ allowNull: false
+ },
+ refresh_token: {
+ type: Sequelize.TEXT,
+ allowNull: true
+ },
+ token_type: {
+ type: Sequelize.STRING,
+ defaultValue: 'Bearer'
+ },
+ expires_at: {
+ type: Sequelize.DATE,
+ allowNull: true
+ },
+ scope: {
+ type: Sequelize.TEXT,
+ allowNull: true
+ },
+ connected_email: {
+ type: Sequelize.STRING,
+ allowNull: true
+ },
+ created_at: {
+ type: Sequelize.DATE,
+ allowNull: false,
+ defaultValue: Sequelize.literal('CURRENT_TIMESTAMP')
+ },
+ updated_at: {
+ type: Sequelize.DATE,
+ allowNull: false,
+ defaultValue: Sequelize.literal('CURRENT_TIMESTAMP')
+ }
+ });
+
+ // Add unique index for user_id + provider combination
+ await queryInterface.addIndex('calendar_tokens', {
+ fields: ['user_id', 'provider'],
+ unique: true,
+ name: 'calendar_tokens_user_provider_unique'
+ });
+
+ // Add index for faster lookups by user_id
+ await queryInterface.addIndex('calendar_tokens', {
+ fields: ['user_id'],
+ name: 'calendar_tokens_user_id_index'
+ });
+ },
+
+ down: async (queryInterface, Sequelize) => {
+ await queryInterface.dropTable('calendar_tokens');
+ }
+};
\ No newline at end of file
diff --git a/backend/migrations/20250622000001-create-task-events.js b/backend/migrations/20250622000001-create-task-events.js
new file mode 100644
index 0000000..601879d
--- /dev/null
+++ b/backend/migrations/20250622000001-create-task-events.js
@@ -0,0 +1,88 @@
+'use strict';
+
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ // Create task_events table
+ await queryInterface.createTable('task_events', {
+ id: {
+ type: Sequelize.INTEGER,
+ primaryKey: true,
+ autoIncrement: true,
+ allowNull: false
+ },
+ task_id: {
+ type: Sequelize.INTEGER,
+ allowNull: false,
+ references: {
+ model: 'tasks',
+ key: 'id'
+ },
+ onUpdate: 'CASCADE',
+ onDelete: 'CASCADE'
+ },
+ user_id: {
+ type: Sequelize.INTEGER,
+ allowNull: false,
+ references: {
+ model: 'users',
+ key: 'id'
+ },
+ onUpdate: 'CASCADE',
+ onDelete: 'CASCADE'
+ },
+ event_type: {
+ type: Sequelize.STRING,
+ allowNull: false,
+ // Common event types: 'created', 'status_changed', 'priority_changed',
+ // 'due_date_changed', 'project_changed', 'name_changed', 'description_changed',
+ // 'completed', 'archived', 'deleted', 'restored'
+ },
+ old_value: {
+ type: Sequelize.TEXT,
+ allowNull: true,
+ // JSON string of the old value(s) - for tracking what changed from
+ },
+ new_value: {
+ type: Sequelize.TEXT,
+ allowNull: true,
+ // JSON string of the new value(s) - for tracking what changed to
+ },
+ field_name: {
+ type: Sequelize.STRING,
+ allowNull: true,
+ // The name of the field that was changed (status, priority, due_date, etc.)
+ },
+ metadata: {
+ type: Sequelize.TEXT,
+ allowNull: true,
+ // Additional context as JSON string (e.g., source of change: 'web', 'api', 'telegram')
+ },
+ created_at: {
+ type: Sequelize.DATE,
+ allowNull: false,
+ defaultValue: Sequelize.literal('CURRENT_TIMESTAMP')
+ }
+ });
+
+ // Add indexes for better query performance
+ await queryInterface.addIndex('task_events', ['task_id']);
+ await queryInterface.addIndex('task_events', ['user_id']);
+ await queryInterface.addIndex('task_events', ['event_type']);
+ await queryInterface.addIndex('task_events', ['created_at']);
+ await queryInterface.addIndex('task_events', ['task_id', 'event_type']);
+ await queryInterface.addIndex('task_events', ['task_id', 'created_at']);
+ },
+
+ async down(queryInterface, Sequelize) {
+ // Remove indexes first
+ await queryInterface.removeIndex('task_events', ['task_id', 'created_at']);
+ await queryInterface.removeIndex('task_events', ['task_id', 'event_type']);
+ await queryInterface.removeIndex('task_events', ['created_at']);
+ await queryInterface.removeIndex('task_events', ['event_type']);
+ await queryInterface.removeIndex('task_events', ['user_id']);
+ await queryInterface.removeIndex('task_events', ['task_id']);
+
+ // Drop the table
+ await queryInterface.dropTable('task_events');
+ }
+};
\ No newline at end of file
diff --git a/backend/migrations/20250622053925-add-pomodoro-enabled-to-users.js b/backend/migrations/20250622053925-add-pomodoro-enabled-to-users.js
new file mode 100644
index 0000000..40531f3
--- /dev/null
+++ b/backend/migrations/20250622053925-add-pomodoro-enabled-to-users.js
@@ -0,0 +1,16 @@
+'use strict';
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up (queryInterface, Sequelize) {
+ await queryInterface.addColumn('users', 'pomodoro_enabled', {
+ type: Sequelize.BOOLEAN,
+ allowNull: false,
+ defaultValue: true
+ });
+ },
+
+ async down (queryInterface, Sequelize) {
+ await queryInterface.removeColumn('users', 'pomodoro_enabled');
+ }
+};
diff --git a/backend/migrations/20250623000001-add-uuid-to-tasks.js b/backend/migrations/20250623000001-add-uuid-to-tasks.js
new file mode 100644
index 0000000..377f098
--- /dev/null
+++ b/backend/migrations/20250623000001-add-uuid-to-tasks.js
@@ -0,0 +1,41 @@
+'use strict';
+
+const { v4: uuidv4 } = require('uuid');
+
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ // Add UUID column to tasks table (without unique constraint initially)
+ await queryInterface.addColumn('tasks', 'uuid', {
+ type: Sequelize.UUID,
+ allowNull: true
+ });
+
+ // Backfill existing tasks with UUIDs
+ const tasks = await queryInterface.sequelize.query(
+ 'SELECT id FROM tasks WHERE uuid IS NULL',
+ { type: Sequelize.QueryTypes.SELECT }
+ );
+
+ for (const task of tasks) {
+ const uuid = uuidv4();
+ await queryInterface.sequelize.query(
+ 'UPDATE tasks SET uuid = ? WHERE id = ?',
+ { replacements: [uuid, task.id] }
+ );
+ }
+
+ // Add unique index for UUID
+ await queryInterface.addIndex('tasks', ['uuid'], {
+ unique: true,
+ name: 'tasks_uuid_unique'
+ });
+ },
+
+ async down(queryInterface, Sequelize) {
+ // Remove index first
+ await queryInterface.removeIndex('tasks', 'tasks_uuid_unique');
+
+ // Remove UUID column
+ await queryInterface.removeColumn('tasks', 'uuid');
+ }
+};
\ No newline at end of file
diff --git a/backend/migrations/20250623000003-create-notes-tags-table.js b/backend/migrations/20250623000003-create-notes-tags-table.js
new file mode 100644
index 0000000..73e7491
--- /dev/null
+++ b/backend/migrations/20250623000003-create-notes-tags-table.js
@@ -0,0 +1,48 @@
+'use strict';
+
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ // Check if notes_tags table exists
+ const tables = await queryInterface.showAllTables();
+ if (!tables.includes('notes_tags')) {
+ await queryInterface.createTable('notes_tags', {
+ note_id: {
+ type: Sequelize.INTEGER,
+ references: {
+ model: 'notes',
+ key: 'id'
+ },
+ onDelete: 'CASCADE'
+ },
+ tag_id: {
+ type: Sequelize.INTEGER,
+ references: {
+ model: 'tags',
+ key: 'id'
+ },
+ onDelete: 'CASCADE'
+ },
+ created_at: {
+ allowNull: false,
+ type: Sequelize.DATE,
+ defaultValue: Sequelize.literal('CURRENT_TIMESTAMP')
+ },
+ updated_at: {
+ allowNull: false,
+ type: Sequelize.DATE,
+ defaultValue: Sequelize.literal('CURRENT_TIMESTAMP')
+ }
+ });
+
+ // Add unique index
+ await queryInterface.addIndex('notes_tags', ['note_id', 'tag_id'], {
+ unique: true,
+ name: 'notes_tags_unique_idx'
+ });
+ }
+ },
+
+ async down(queryInterface, Sequelize) {
+ await queryInterface.dropTable('notes_tags');
+ }
+};
\ No newline at end of file
diff --git a/backend/migrations/20250623000004-add-timestamps-to-notes-tags.js b/backend/migrations/20250623000004-add-timestamps-to-notes-tags.js
new file mode 100644
index 0000000..a2ed701
--- /dev/null
+++ b/backend/migrations/20250623000004-add-timestamps-to-notes-tags.js
@@ -0,0 +1,29 @@
+'use strict';
+
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ // Add created_at and updated_at columns to notes_tags table
+ try {
+ await queryInterface.addColumn('notes_tags', 'created_at', {
+ type: Sequelize.DATE,
+ allowNull: false,
+ defaultValue: Sequelize.literal('CURRENT_TIMESTAMP')
+ });
+
+ await queryInterface.addColumn('notes_tags', 'updated_at', {
+ type: Sequelize.DATE,
+ allowNull: false,
+ defaultValue: Sequelize.literal('CURRENT_TIMESTAMP')
+ });
+
+ console.log('Successfully added timestamps to notes_tags table');
+ } catch (error) {
+ console.error('Error adding timestamps to notes_tags:', error);
+ }
+ },
+
+ async down(queryInterface, Sequelize) {
+ await queryInterface.removeColumn('notes_tags', 'created_at');
+ await queryInterface.removeColumn('notes_tags', 'updated_at');
+ }
+};
\ No newline at end of file
diff --git a/backend/migrations/20250623000005-add-timestamps-to-projects-tags.js b/backend/migrations/20250623000005-add-timestamps-to-projects-tags.js
new file mode 100644
index 0000000..eed7d0e
--- /dev/null
+++ b/backend/migrations/20250623000005-add-timestamps-to-projects-tags.js
@@ -0,0 +1,82 @@
+'use strict';
+
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ // Create the projects_tags table if it doesn't exist
+ const tableExists = await queryInterface.showAllTables()
+ .then(tables => tables.includes('projects_tags'));
+
+ if (!tableExists) {
+ await queryInterface.createTable('projects_tags', {
+ project_id: {
+ type: Sequelize.INTEGER,
+ allowNull: false,
+ references: {
+ model: 'projects',
+ key: 'id'
+ },
+ onUpdate: 'CASCADE',
+ onDelete: 'CASCADE'
+ },
+ tag_id: {
+ type: Sequelize.INTEGER,
+ allowNull: false,
+ references: {
+ model: 'tags',
+ key: 'id'
+ },
+ onUpdate: 'CASCADE',
+ onDelete: 'CASCADE'
+ },
+ created_at: {
+ type: Sequelize.DATE,
+ allowNull: false,
+ defaultValue: Sequelize.literal('CURRENT_TIMESTAMP')
+ },
+ updated_at: {
+ type: Sequelize.DATE,
+ allowNull: false,
+ defaultValue: Sequelize.literal('CURRENT_TIMESTAMP')
+ }
+ });
+
+ // Add composite primary key
+ await queryInterface.addConstraint('projects_tags', {
+ fields: ['project_id', 'tag_id'],
+ type: 'primary key',
+ name: 'projects_tags_pkey'
+ });
+ } else {
+ // Add timestamps if table exists but doesn't have them
+ try {
+ await queryInterface.addColumn('projects_tags', 'created_at', {
+ type: Sequelize.DATE,
+ allowNull: false,
+ defaultValue: Sequelize.literal('CURRENT_TIMESTAMP')
+ });
+ } catch (error) {
+ // Column might already exist
+ }
+
+ try {
+ await queryInterface.addColumn('projects_tags', 'updated_at', {
+ type: Sequelize.DATE,
+ allowNull: false,
+ defaultValue: Sequelize.literal('CURRENT_TIMESTAMP')
+ });
+ } catch (error) {
+ // Column might already exist
+ }
+ }
+ },
+
+ async down(queryInterface, Sequelize) {
+ // Remove timestamps or drop table if needed
+ try {
+ await queryInterface.removeColumn('projects_tags', 'created_at');
+ await queryInterface.removeColumn('projects_tags', 'updated_at');
+ } catch (error) {
+ // Columns might not exist
+ }
+ }
+};
\ No newline at end of file
diff --git a/backend/models/calendar_token.js b/backend/models/calendar_token.js
new file mode 100644
index 0000000..5ec07d2
--- /dev/null
+++ b/backend/models/calendar_token.js
@@ -0,0 +1,77 @@
+const { DataTypes } = require('sequelize');
+const sequelize = require('../config/database');
+
+const CalendarToken = sequelize.define('CalendarToken', {
+ id: {
+ type: DataTypes.INTEGER,
+ primaryKey: true,
+ autoIncrement: true
+ },
+ user_id: {
+ type: DataTypes.INTEGER,
+ allowNull: false,
+ references: {
+ model: 'Users',
+ key: 'id'
+ },
+ onDelete: 'CASCADE'
+ },
+ provider: {
+ type: DataTypes.STRING,
+ allowNull: false,
+ defaultValue: 'google'
+ },
+ access_token: {
+ type: DataTypes.TEXT,
+ allowNull: false
+ },
+ refresh_token: {
+ type: DataTypes.TEXT,
+ allowNull: true
+ },
+ token_type: {
+ type: DataTypes.STRING,
+ defaultValue: 'Bearer'
+ },
+ expires_at: {
+ type: DataTypes.DATE,
+ allowNull: true
+ },
+ scope: {
+ type: DataTypes.TEXT,
+ allowNull: true
+ },
+ connected_email: {
+ type: DataTypes.STRING,
+ allowNull: true
+ },
+ created_at: {
+ type: DataTypes.DATE,
+ defaultValue: DataTypes.NOW
+ },
+ updated_at: {
+ type: DataTypes.DATE,
+ defaultValue: DataTypes.NOW
+ }
+}, {
+ tableName: 'calendar_tokens',
+ timestamps: true,
+ createdAt: 'created_at',
+ updatedAt: 'updated_at',
+ indexes: [
+ {
+ unique: true,
+ fields: ['user_id', 'provider']
+ }
+ ]
+});
+
+// Associations
+CalendarToken.associate = function(models) {
+ CalendarToken.belongsTo(models.User, {
+ foreignKey: 'user_id',
+ as: 'user'
+ });
+};
+
+module.exports = CalendarToken;
\ No newline at end of file
diff --git a/backend/models/index.js b/backend/models/index.js
index 005d36f..b736108 100644
--- a/backend/models/index.js
+++ b/backend/models/index.js
@@ -5,10 +5,11 @@ const path = require('path');
let dbConfig;
if (process.env.NODE_ENV === 'test') {
- // Use in-memory database for tests
+ // Use temporary file database for tests to allow external script access
+ const testDbPath = path.join(__dirname, '../db', 'test.sqlite3');
dbConfig = {
dialect: 'sqlite',
- storage: ':memory:',
+ storage: testDbPath,
logging: false,
define: {
timestamps: true,
@@ -45,6 +46,7 @@ const Task = require('./task')(sequelize);
const Tag = require('./tag')(sequelize);
const Note = require('./note')(sequelize);
const InboxItem = require('./inbox_item')(sequelize);
+const TaskEvent = require('./task_event')(sequelize);
// Define associations
User.hasMany(Area, { foreignKey: 'user_id' });
@@ -71,6 +73,12 @@ Project.hasMany(Note, { foreignKey: 'project_id' });
User.hasMany(InboxItem, { foreignKey: 'user_id' });
InboxItem.belongsTo(User, { foreignKey: 'user_id' });
+// TaskEvent associations
+User.hasMany(TaskEvent, { foreignKey: 'user_id', as: 'TaskEvents' });
+TaskEvent.belongsTo(User, { foreignKey: 'user_id', as: 'User' });
+Task.hasMany(TaskEvent, { foreignKey: 'task_id', as: 'TaskEvents' });
+TaskEvent.belongsTo(Task, { foreignKey: 'task_id', as: 'Task' });
+
// Many-to-many associations
Task.belongsToMany(Tag, { through: 'tasks_tags', foreignKey: 'task_id', otherKey: 'tag_id' });
Tag.belongsToMany(Task, { through: 'tasks_tags', foreignKey: 'tag_id', otherKey: 'task_id' });
@@ -89,5 +97,6 @@ module.exports = {
Task,
Tag,
Note,
- InboxItem
+ InboxItem,
+ TaskEvent
};
\ No newline at end of file
diff --git a/backend/models/task.js b/backend/models/task.js
index 8356701..50cb9b3 100644
--- a/backend/models/task.js
+++ b/backend/models/task.js
@@ -7,6 +7,12 @@ module.exports = (sequelize) => {
primaryKey: true,
autoIncrement: true
},
+ uuid: {
+ type: DataTypes.UUID,
+ allowNull: false,
+ unique: true,
+ defaultValue: DataTypes.UUIDV4
+ },
name: {
type: DataTypes.STRING,
allowNull: false
@@ -115,6 +121,10 @@ module.exports = (sequelize) => {
model: 'tasks',
key: 'id'
}
+ },
+ completed_at: {
+ type: DataTypes.DATE,
+ allowNull: true
}
}, {
tableName: 'tasks',
diff --git a/backend/models/task_event.js b/backend/models/task_event.js
new file mode 100644
index 0000000..863dcb9
--- /dev/null
+++ b/backend/models/task_event.js
@@ -0,0 +1,211 @@
+const { DataTypes } = require('sequelize');
+
+module.exports = (sequelize) => {
+ const TaskEvent = sequelize.define('TaskEvent', {
+ id: {
+ type: DataTypes.INTEGER,
+ primaryKey: true,
+ autoIncrement: true
+ },
+ task_id: {
+ type: DataTypes.INTEGER,
+ allowNull: false,
+ references: {
+ model: 'tasks',
+ key: 'id'
+ }
+ },
+ user_id: {
+ type: DataTypes.INTEGER,
+ allowNull: false,
+ references: {
+ model: 'users',
+ key: 'id'
+ }
+ },
+ event_type: {
+ type: DataTypes.STRING,
+ allowNull: false,
+ validate: {
+ isIn: [['created', 'status_changed', 'priority_changed', 'due_date_changed',
+ 'project_changed', 'name_changed', 'description_changed', 'note_changed',
+ 'completed', 'archived', 'deleted', 'restored', 'today_changed',
+ 'tags_changed', 'recurrence_changed', 'recurrence_type_changed',
+ 'completion_based_changed', 'recurrence_end_date_changed']]
+ }
+ },
+ old_value: {
+ type: DataTypes.TEXT,
+ allowNull: true,
+ get() {
+ const rawValue = this.getDataValue('old_value');
+ return rawValue ? JSON.parse(rawValue) : null;
+ },
+ set(value) {
+ this.setDataValue('old_value', value ? JSON.stringify(value) : null);
+ }
+ },
+ new_value: {
+ type: DataTypes.TEXT,
+ allowNull: true,
+ get() {
+ const rawValue = this.getDataValue('new_value');
+ return rawValue ? JSON.parse(rawValue) : null;
+ },
+ set(value) {
+ this.setDataValue('new_value', value ? JSON.stringify(value) : null);
+ }
+ },
+ field_name: {
+ type: DataTypes.STRING,
+ allowNull: true,
+ validate: {
+ isIn: [['status', 'priority', 'due_date', 'project_id', 'name', 'description',
+ 'note', 'today', 'tags', 'recurrence_type', 'recurrence_interval',
+ 'recurrence_end_date', 'recurrence_weekday', 'recurrence_month_day',
+ 'recurrence_week_of_month', 'completion_based']]
+ }
+ },
+ metadata: {
+ type: DataTypes.TEXT,
+ allowNull: true,
+ get() {
+ const rawValue = this.getDataValue('metadata');
+ return rawValue ? JSON.parse(rawValue) : null;
+ },
+ set(value) {
+ this.setDataValue('metadata', value ? JSON.stringify(value) : null);
+ }
+ }
+ }, {
+ tableName: 'task_events',
+ timestamps: true,
+ createdAt: 'created_at',
+ updatedAt: false, // We don't need updated_at for events (they're immutable)
+ indexes: [
+ {
+ fields: ['task_id']
+ },
+ {
+ fields: ['user_id']
+ },
+ {
+ fields: ['event_type']
+ },
+ {
+ fields: ['created_at']
+ },
+ {
+ fields: ['task_id', 'event_type']
+ },
+ {
+ fields: ['task_id', 'created_at']
+ }
+ ]
+ });
+
+ // Define associations
+ TaskEvent.associate = function(models) {
+ // TaskEvent belongs to Task
+ TaskEvent.belongsTo(models.Task, {
+ foreignKey: 'task_id',
+ as: 'Task'
+ });
+
+ // TaskEvent belongs to User
+ TaskEvent.belongsTo(models.User, {
+ foreignKey: 'user_id',
+ as: 'User'
+ });
+ };
+
+ // Helper methods for common event types
+ TaskEvent.createStatusChangeEvent = async function(taskId, userId, oldStatus, newStatus, metadata = {}) {
+ return await TaskEvent.create({
+ task_id: taskId,
+ user_id: userId,
+ event_type: 'status_changed',
+ field_name: 'status',
+ old_value: { status: oldStatus },
+ new_value: { status: newStatus },
+ metadata: metadata
+ });
+ };
+
+ TaskEvent.createTaskCreatedEvent = async function(taskId, userId, taskData, metadata = {}) {
+ return await TaskEvent.create({
+ task_id: taskId,
+ user_id: userId,
+ event_type: 'created',
+ field_name: null,
+ old_value: null,
+ new_value: taskData,
+ metadata: metadata
+ });
+ };
+
+ TaskEvent.createFieldChangeEvent = async function(taskId, userId, fieldName, oldValue, newValue, metadata = {}) {
+ const eventType = fieldName === 'status' && newValue === 2 ? 'completed' :
+ fieldName === 'status' && newValue === 3 ? 'archived' :
+ `${fieldName}_changed`;
+
+ return await TaskEvent.create({
+ task_id: taskId,
+ user_id: userId,
+ event_type: eventType,
+ field_name: fieldName,
+ old_value: { [fieldName]: oldValue },
+ new_value: { [fieldName]: newValue },
+ metadata: metadata
+ });
+ };
+
+ // Query helpers
+ TaskEvent.getTaskTimeline = async function(taskId) {
+ return await TaskEvent.findAll({
+ where: { task_id: taskId },
+ order: [['created_at', 'ASC']],
+ include: [{
+ model: sequelize.models.User,
+ as: 'User',
+ attributes: ['id', 'name', 'email']
+ }]
+ });
+ };
+
+ TaskEvent.getCompletionTime = async function(taskId) {
+ const events = await TaskEvent.findAll({
+ where: {
+ task_id: taskId,
+ event_type: ['status_changed', 'created', 'completed']
+ },
+ order: [['created_at', 'ASC']]
+ });
+
+ if (events.length === 0) return null;
+
+ const startEvent = events.find(e =>
+ e.event_type === 'created' ||
+ (e.event_type === 'status_changed' && e.new_value?.status === 1) // in_progress
+ );
+
+ const completedEvent = events.find(e =>
+ e.event_type === 'completed' ||
+ (e.event_type === 'status_changed' && e.new_value?.status === 2) // done
+ );
+
+ if (!startEvent || !completedEvent) return null;
+
+ const startTime = new Date(startEvent.created_at);
+ const endTime = new Date(completedEvent.created_at);
+
+ return {
+ started_at: startTime,
+ completed_at: endTime,
+ duration_ms: endTime - startTime,
+ duration_hours: (endTime - startTime) / (1000 * 60 * 60)
+ };
+ };
+
+ return TaskEvent;
+};
\ No newline at end of file
diff --git a/backend/models/user.js b/backend/models/user.js
index 48f0bd1..caf1980 100644
--- a/backend/models/user.js
+++ b/backend/models/user.js
@@ -20,6 +20,10 @@ module.exports = (sequelize) => {
isEmail: true
}
},
+ password: {
+ type: DataTypes.VIRTUAL,
+ allowNull: true
+ },
password_digest: {
type: DataTypes.STRING,
allowNull: false,
@@ -85,6 +89,24 @@ module.exports = (sequelize) => {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: false
+ },
+ pomodoro_enabled: {
+ type: DataTypes.BOOLEAN,
+ allowNull: false,
+ defaultValue: true
+ },
+ today_settings: {
+ type: DataTypes.JSON,
+ allowNull: true,
+ defaultValue: {
+ showMetrics: false,
+ showProductivity: false,
+ showIntelligence: false,
+ showDueToday: true,
+ showCompleted: true,
+ showProgressBar: true,
+ showDailyQuote: true
+ }
}
}, {
tableName: 'users',
diff --git a/backend/package-lock.json b/backend/package-lock.json
index fff7bd9..a2239a3 100644
--- a/backend/package-lock.json
+++ b/backend/package-lock.json
@@ -10,19 +10,24 @@
"license": "ISC",
"dependencies": {
"bcrypt": "^6.0.0",
+ "cheerio": "^1.1.0",
"compression": "^1.8.0",
"connect-session-sequelize": "^7.1.7",
"cors": "^2.8.5",
"dotenv": "^16.5.0",
"express": "^4.18.2",
"express-session": "^1.18.1",
+ "googleapis": "^144.0.0",
"helmet": "^8.1.0",
"js-yaml": "^4.1.0",
+ "moment-timezone": "^0.6.0",
"morgan": "^1.10.0",
"multer": "^2.0.1",
"node-cron": "^4.1.0",
+ "recharts": "^2.15.4",
"sequelize": "^6.37.7",
- "sqlite3": "^5.1.7"
+ "sqlite3": "^5.1.7",
+ "uuid": "^11.1.0"
},
"devDependencies": {
"cross-env": "^7.0.3",
@@ -539,6 +544,15 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/runtime": {
+ "version": "7.27.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz",
+ "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/template": {
"version": "7.27.2",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
@@ -1472,6 +1486,69 @@
"@babel/types": "^7.20.7"
}
},
+ "node_modules/@types/d3-array": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz",
+ "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-color": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
+ "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-ease": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
+ "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-interpolate": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
+ "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-color": "*"
+ }
+ },
+ "node_modules/@types/d3-path": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz",
+ "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-scale": {
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz",
+ "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-time": "*"
+ }
+ },
+ "node_modules/@types/d3-shape": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz",
+ "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-path": "*"
+ }
+ },
+ "node_modules/@types/d3-time": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz",
+ "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-timer": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
+ "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",
+ "license": "MIT"
+ },
"node_modules/@types/debug": {
"version": "4.1.12",
"resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
@@ -2200,6 +2277,15 @@
"node": ">= 18"
}
},
+ "node_modules/bignumber.js": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.0.tgz",
+ "integrity": "sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/binary-extensions": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
@@ -2276,6 +2362,12 @@
"node": ">=0.10.0"
}
},
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "license": "ISC"
+ },
"node_modules/brace-expansion": {
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
@@ -2367,6 +2459,12 @@
"ieee754": "^1.1.13"
}
},
+ "node_modules/buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
+ "license": "BSD-3-Clause"
+ },
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
@@ -2556,6 +2654,48 @@
"node": ">=10"
}
},
+ "node_modules/cheerio": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.0.tgz",
+ "integrity": "sha512-+0hMx9eYhJvWbgpKV9hN7jg0JcwydpopZE4hgi+KvQtByZXPp04NiCWU0LzcAbP63abZckIHkTQaXVF52mX3xQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cheerio-select": "^2.1.0",
+ "dom-serializer": "^2.0.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.2.2",
+ "encoding-sniffer": "^0.2.0",
+ "htmlparser2": "^10.0.0",
+ "parse5": "^7.3.0",
+ "parse5-htmlparser2-tree-adapter": "^7.1.0",
+ "parse5-parser-stream": "^7.1.2",
+ "undici": "^7.10.0",
+ "whatwg-mimetype": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=18.17"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+ }
+ },
+ "node_modules/cheerio-select": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
+ "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-select": "^5.1.0",
+ "css-what": "^6.1.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
"node_modules/chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
@@ -2635,6 +2775,15 @@
"wrap-ansi": "^7.0.0"
}
},
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -2921,6 +3070,161 @@
"node": ">= 8"
}
},
+ "node_modules/css-select": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
+ "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "license": "MIT"
+ },
+ "node_modules/d3-array": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
+ "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
+ "license": "ISC",
+ "dependencies": {
+ "internmap": "1 - 2"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-color": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
+ "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-ease": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
+ "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-format": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
+ "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-interpolate": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
+ "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-color": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-path": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
+ "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-scale": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
+ "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-array": "2.10.0 - 3",
+ "d3-format": "1 - 3",
+ "d3-interpolate": "1.2.0 - 3",
+ "d3-time": "2.1.1 - 3",
+ "d3-time-format": "2 - 4"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-shape": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
+ "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-path": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-time": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
+ "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-array": "2 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-time-format": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
+ "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-time": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-timer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
+ "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -2930,6 +3234,12 @@
"ms": "2.0.0"
}
},
+ "node_modules/decimal.js-light": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz",
+ "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==",
+ "license": "MIT"
+ },
"node_modules/decompress-response": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
@@ -3045,6 +3355,71 @@
"wrappy": "1"
}
},
+ "node_modules/dom-helpers": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
"node_modules/dotenv": {
"version": "16.5.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz",
@@ -3084,6 +3459,15 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
"node_modules/editorconfig": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz",
@@ -3181,6 +3565,19 @@
"iconv-lite": "^0.6.2"
}
},
+ "node_modules/encoding-sniffer": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz",
+ "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==",
+ "license": "MIT",
+ "dependencies": {
+ "iconv-lite": "^0.6.3",
+ "whatwg-encoding": "^3.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/encoding-sniffer?sponsor=1"
+ }
+ },
"node_modules/end-of-stream": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
@@ -3190,6 +3587,18 @@
"once": "^1.4.0"
}
},
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
"node_modules/env-paths": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
@@ -3312,6 +3721,12 @@
"node": ">= 0.6"
}
},
+ "node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "license": "MIT"
+ },
"node_modules/execa": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
@@ -3453,6 +3868,21 @@
"node": ">= 0.6"
}
},
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "license": "MIT"
+ },
+ "node_modules/fast-equals": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz",
+ "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
@@ -3697,6 +4127,94 @@
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
+ "node_modules/gaxios": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz",
+ "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "extend": "^3.0.2",
+ "https-proxy-agent": "^7.0.1",
+ "is-stream": "^2.0.0",
+ "node-fetch": "^2.6.9",
+ "uuid": "^9.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/gaxios/node_modules/agent-base": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz",
+ "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/gaxios/node_modules/debug": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
+ "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/gaxios/node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/gaxios/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/gaxios/node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/gcp-metadata": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz",
+ "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "gaxios": "^6.1.1",
+ "google-logging-utils": "^0.0.2",
+ "json-bigint": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -3828,6 +4346,75 @@
"node": ">=4"
}
},
+ "node_modules/google-auth-library": {
+ "version": "9.15.1",
+ "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz",
+ "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "base64-js": "^1.3.0",
+ "ecdsa-sig-formatter": "^1.0.11",
+ "gaxios": "^6.1.1",
+ "gcp-metadata": "^6.1.0",
+ "gtoken": "^7.0.0",
+ "jws": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/google-logging-utils": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz",
+ "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/googleapis": {
+ "version": "144.0.0",
+ "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-144.0.0.tgz",
+ "integrity": "sha512-ELcWOXtJxjPX4vsKMh+7V+jZvgPwYMlEhQFiu2sa9Qmt5veX8nwXPksOWGGN6Zk4xCiLygUyaz7xGtcMO+Onxw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "google-auth-library": "^9.0.0",
+ "googleapis-common": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/googleapis-common": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-7.2.0.tgz",
+ "integrity": "sha512-/fhDZEJZvOV3X5jmD+fKxMqma5q2Q9nZNSF3kn1F18tpxmA86BcTxAGBQdM0N89Z3bEaIs+HVznSmFJEAmMTjA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "extend": "^3.0.2",
+ "gaxios": "^6.0.3",
+ "google-auth-library": "^9.7.0",
+ "qs": "^6.7.0",
+ "url-template": "^2.0.8",
+ "uuid": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/googleapis-common/node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
"node_modules/gopd": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
@@ -3847,6 +4434,19 @@
"devOptional": true,
"license": "ISC"
},
+ "node_modules/gtoken": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz",
+ "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==",
+ "license": "MIT",
+ "dependencies": {
+ "gaxios": "^6.0.0",
+ "jws": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
@@ -3920,6 +4520,37 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/htmlparser2": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz",
+ "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==",
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.2.1",
+ "entities": "^6.0.0"
+ }
+ },
+ "node_modules/htmlparser2/node_modules/entities": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
+ "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
"node_modules/http-cache-semantics": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
@@ -4047,7 +4678,6 @@
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"license": "MIT",
- "optional": true,
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
},
@@ -4162,6 +4792,15 @@
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"license": "ISC"
},
+ "node_modules/internmap": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
+ "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/ip-address": {
"version": "9.0.5",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz",
@@ -4285,7 +4924,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -5329,7 +5967,6 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "dev": true,
"license": "MIT"
},
"node_modules/js-yaml": {
@@ -5364,6 +6001,15 @@
"node": ">=6"
}
},
+ "node_modules/json-bigint": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
+ "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "bignumber.js": "^9.0.0"
+ }
+ },
"node_modules/json-parse-even-better-errors": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
@@ -5397,6 +6043,27 @@
"graceful-fs": "^4.1.6"
}
},
+ "node_modules/jwa": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz",
+ "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer-equal-constant-time": "^1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/jws": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz",
+ "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==",
+ "license": "MIT",
+ "dependencies": {
+ "jwa": "^2.0.0",
+ "safe-buffer": "^5.0.1"
+ }
+ },
"node_modules/leven": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
@@ -5433,6 +6100,18 @@
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"license": "MIT"
},
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
"node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -5766,9 +6445,9 @@
}
},
"node_modules/moment-timezone": {
- "version": "0.5.48",
- "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.48.tgz",
- "integrity": "sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==",
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.6.0.tgz",
+ "integrity": "sha512-ldA5lRNm3iJCWZcBCab4pnNL3HSZYXVb/3TYr75/1WCTWYuTqYUb5f/S384pncYjJ88lbO8Z4uPDvmoluHJc8Q==",
"license": "MIT",
"dependencies": {
"moment": "^2.29.4"
@@ -5897,6 +6576,26 @@
"node": ">=6.0.0"
}
},
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
"node_modules/node-gyp": {
"version": "8.4.1",
"resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz",
@@ -6057,6 +6756,18 @@
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -6221,6 +6932,55 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/parse5": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
+ "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
+ "license": "MIT",
+ "dependencies": {
+ "entities": "^6.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parse5-htmlparser2-tree-adapter": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz",
+ "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==",
+ "license": "MIT",
+ "dependencies": {
+ "domhandler": "^5.0.3",
+ "parse5": "^7.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parse5-parser-stream": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz",
+ "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==",
+ "license": "MIT",
+ "dependencies": {
+ "parse5": "^7.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parse5/node_modules/entities": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
+ "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -6431,6 +7191,23 @@
"node": ">=10"
}
},
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/prop-types/node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "license": "MIT"
+ },
"node_modules/proto-list": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
@@ -6560,13 +7337,66 @@
"rc": "cli.js"
}
},
+ "node_modules/react": {
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
+ "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz",
+ "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "scheduler": "^0.26.0"
+ },
+ "peerDependencies": {
+ "react": "^19.1.0"
+ }
+ },
"node_modules/react-is": {
"version": "18.3.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
"integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
- "dev": true,
"license": "MIT"
},
+ "node_modules/react-smooth": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz",
+ "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-equals": "^5.0.1",
+ "prop-types": "^15.8.1",
+ "react-transition-group": "^4.4.5"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/react-transition-group": {
+ "version": "4.4.5",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
+ "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.6.0",
+ "react-dom": ">=16.6.0"
+ }
+ },
"node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
@@ -6594,6 +7424,38 @@
"node": ">=8.10.0"
}
},
+ "node_modules/recharts": {
+ "version": "2.15.4",
+ "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.4.tgz",
+ "integrity": "sha512-UT/q6fwS3c1dHbXv2uFgYJ9BMFHu3fwnd7AYZaEQhXuYQ4hgsxLvsUXzGdKeZrW5xopzDCvuA2N41WJ88I7zIw==",
+ "license": "MIT",
+ "dependencies": {
+ "clsx": "^2.0.0",
+ "eventemitter3": "^4.0.1",
+ "lodash": "^4.17.21",
+ "react-is": "^18.3.1",
+ "react-smooth": "^4.0.4",
+ "recharts-scale": "^0.4.4",
+ "tiny-invariant": "^1.3.1",
+ "victory-vendor": "^36.6.8"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/recharts-scale": {
+ "version": "0.4.5",
+ "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz",
+ "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==",
+ "license": "MIT",
+ "dependencies": {
+ "decimal.js-light": "^2.4.1"
+ }
+ },
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -6707,6 +7569,13 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"license": "MIT"
},
+ "node_modules/scheduler": {
+ "version": "0.26.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
+ "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/semver": {
"version": "7.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
@@ -6869,12 +7738,33 @@
}
}
},
+ "node_modules/sequelize/node_modules/moment-timezone": {
+ "version": "0.5.48",
+ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.48.tgz",
+ "integrity": "sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==",
+ "license": "MIT",
+ "dependencies": {
+ "moment": "^2.29.4"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/sequelize/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"license": "MIT"
},
+ "node_modules/sequelize/node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
"node_modules/serve-static": {
"version": "1.16.2",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
@@ -7552,6 +8442,12 @@
"node": ">=8"
}
},
+ "node_modules/tiny-invariant": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
+ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
+ "license": "MIT"
+ },
"node_modules/tmpl": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
@@ -7597,6 +8493,12 @@
"nodetouch": "bin/nodetouch.js"
}
},
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+ "license": "MIT"
+ },
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
@@ -7691,6 +8593,15 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/undici": {
+ "version": "7.10.0",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-7.10.0.tgz",
+ "integrity": "sha512-u5otvFBOBZvmdjWLVW+5DAc9Nkq8f24g0O9oY7qw2JVIF1VocIFoyz9JFkuVOS2j41AufeO0xnlweJ2RLT8nGw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.18.1"
+ }
+ },
"node_modules/undici-types": {
"version": "7.8.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz",
@@ -7802,6 +8713,12 @@
"browserslist": ">= 4.21.0"
}
},
+ "node_modules/url-template": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz",
+ "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==",
+ "license": "BSD"
+ },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -7818,12 +8735,16 @@
}
},
"node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz",
+ "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
"license": "MIT",
"bin": {
- "uuid": "dist/bin/uuid"
+ "uuid": "dist/esm/bin/uuid"
}
},
"node_modules/v8-to-istanbul": {
@@ -7859,6 +8780,28 @@
"node": ">= 0.8"
}
},
+ "node_modules/victory-vendor": {
+ "version": "36.9.2",
+ "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz",
+ "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==",
+ "license": "MIT AND ISC",
+ "dependencies": {
+ "@types/d3-array": "^3.0.3",
+ "@types/d3-ease": "^3.0.0",
+ "@types/d3-interpolate": "^3.0.1",
+ "@types/d3-scale": "^4.0.2",
+ "@types/d3-shape": "^3.1.0",
+ "@types/d3-time": "^3.0.0",
+ "@types/d3-timer": "^3.0.0",
+ "d3-array": "^3.1.6",
+ "d3-ease": "^3.0.1",
+ "d3-interpolate": "^3.0.1",
+ "d3-scale": "^4.0.2",
+ "d3-shape": "^3.1.0",
+ "d3-time": "^3.0.0",
+ "d3-timer": "^3.0.1"
+ }
+ },
"node_modules/walker": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
@@ -7869,6 +8812,43 @@
"makeerror": "1.0.12"
}
},
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/whatwg-encoding": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
+ "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
+ "license": "MIT",
+ "dependencies": {
+ "iconv-lite": "0.6.3"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
+ "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
diff --git a/backend/package.json b/backend/package.json
index 2e05e56..298e53a 100644
--- a/backend/package.json
+++ b/backend/package.json
@@ -1,7 +1,7 @@
{
"name": "backend",
"version": "1.0.0",
- "description": "Functional programming Express.js backend for tududi task management application",
+ "description": "",
"main": "index.js",
"scripts": {
"start": "node app.js",
@@ -22,27 +22,32 @@
"migration:run": "npx sequelize-cli db:migrate",
"migration:undo": "npx sequelize-cli db:migrate:undo",
"migration:undo:all": "npx sequelize-cli db:migrate:undo:all",
- "migration:status": "npx sequelize-cli db:migrate:status"
+ "migration:status": "npx sequelize-cli db:migrate:status",
+ "seed:dev": "node scripts/seed-dev-data.js"
},
"keywords": [],
"author": "",
"license": "ISC",
- "description": "",
"dependencies": {
"bcrypt": "^6.0.0",
+ "cheerio": "^1.1.0",
"compression": "^1.8.0",
"connect-session-sequelize": "^7.1.7",
"cors": "^2.8.5",
"dotenv": "^16.5.0",
"express": "^4.18.2",
"express-session": "^1.18.1",
+ "googleapis": "^144.0.0",
"helmet": "^8.1.0",
"js-yaml": "^4.1.0",
+ "moment-timezone": "^0.6.0",
"morgan": "^1.10.0",
"multer": "^2.0.1",
"node-cron": "^4.1.0",
+ "recharts": "^2.15.4",
"sequelize": "^6.37.7",
- "sqlite3": "^5.1.7"
+ "sqlite3": "^5.1.7",
+ "uuid": "^11.1.0"
},
"devDependencies": {
"cross-env": "^7.0.3",
diff --git a/backend/routes/calendar.js b/backend/routes/calendar.js
new file mode 100644
index 0000000..d61d402
--- /dev/null
+++ b/backend/routes/calendar.js
@@ -0,0 +1,183 @@
+const express = require('express');
+const router = express.Router();
+const { google } = require('googleapis');
+const { requireAuth } = require('../middleware/auth');
+
+// Google Calendar configuration
+const SCOPES = ['https://www.googleapis.com/auth/calendar.readonly'];
+
+// OAuth2 client setup
+const getOAuth2Client = () => {
+ return new google.auth.OAuth2(
+ process.env.GOOGLE_CLIENT_ID,
+ process.env.GOOGLE_CLIENT_SECRET,
+ process.env.GOOGLE_REDIRECT_URI || 'http://localhost:3002/api/calendar/oauth/callback'
+ );
+};
+
+// GET /api/calendar/auth - Start OAuth flow (Demo mode)
+router.get('/auth', requireAuth, (req, res) => {
+ try {
+ // Check if Google credentials are configured
+ if (!process.env.GOOGLE_CLIENT_ID || !process.env.GOOGLE_CLIENT_SECRET) {
+ // Demo mode - simulate successful connection
+ console.log('Demo mode: Simulating Google Calendar connection for user:', req.currentUser.id);
+
+ // Simulate the callback redirect with success
+ const frontendUrl = process.env.FRONTEND_URL || 'http://localhost:8080';
+ return res.json({
+ authUrl: `${frontendUrl}/calendar?demo=true&connected=true`,
+ demo: true,
+ message: 'Demo mode: Google Calendar integration simulated'
+ });
+ }
+
+ // Production mode with real Google OAuth
+ const oauth2Client = getOAuth2Client();
+
+ const authUrl = oauth2Client.generateAuthUrl({
+ access_type: 'offline',
+ scope: SCOPES,
+ state: JSON.stringify({ userId: req.currentUser.id })
+ });
+
+ res.json({ authUrl });
+ } catch (error) {
+ console.error('Error generating auth URL:', error);
+ res.status(500).json({ error: 'Failed to generate authorization URL' });
+ }
+});
+
+// GET /api/calendar/oauth/callback - Handle OAuth callback
+router.get('/oauth/callback', async (req, res) => {
+ try {
+ const { code, state } = req.query;
+
+ if (!code) {
+ return res.status(400).json({ error: 'Authorization code not provided' });
+ }
+
+ const oauth2Client = getOAuth2Client();
+ const { tokens } = await oauth2Client.getToken(code);
+
+ // Parse state to get user ID
+ const { userId } = JSON.parse(state);
+
+ // Here you would typically save the tokens to the database
+ // For now, we'll just return them (in production, store securely)
+ console.log('Google Calendar tokens received for user:', userId);
+ console.log('Tokens:', tokens);
+
+ // TODO: Save tokens to database associated with user
+ // await saveGoogleTokensForUser(userId, tokens);
+
+ // Redirect to frontend with success
+ res.redirect(`${process.env.FRONTEND_URL || 'http://localhost:8080'}/calendar?connected=true`);
+ } catch (error) {
+ console.error('Error handling OAuth callback:', error);
+ res.redirect(`${process.env.FRONTEND_URL || 'http://localhost:8080'}/calendar?error=auth_failed`);
+ }
+});
+
+// GET /api/calendar/status - Check connection status
+router.get('/status', requireAuth, async (req, res) => {
+ try {
+ // Check if we're in demo mode or have real Google integration
+ if (!process.env.GOOGLE_CLIENT_ID || !process.env.GOOGLE_CLIENT_SECRET) {
+ // Demo mode - check if user has been "connected" in this session
+ // For demo purposes, we'll simulate connection status
+ res.json({
+ connected: false, // Will be set to true after demo connection
+ email: null,
+ demo: true
+ });
+ return;
+ }
+
+ // TODO: Check if user has valid Google Calendar tokens in database
+ // const tokens = await getGoogleTokensForUser(req.currentUser.id);
+
+ res.json({
+ connected: false, // Change to true when tokens exist and are valid
+ email: null // Return connected Google account email when available
+ });
+ } catch (error) {
+ console.error('Error checking calendar status:', error);
+ res.status(500).json({ error: 'Failed to check calendar status' });
+ }
+});
+
+// GET /api/calendar/events - Get events from Google Calendar
+router.get('/events', requireAuth, async (req, res) => {
+ try {
+ const { start, end } = req.query;
+
+ // TODO: Get tokens from database
+ // const tokens = await getGoogleTokensForUser(req.currentUser.id);
+ // if (!tokens) {
+ // return res.status(401).json({ error: 'Google Calendar not connected' });
+ // }
+
+ // For now, return sample data
+ const sampleEvents = [
+ {
+ id: 'google-1',
+ title: 'Google Calendar Event',
+ start: new Date().toISOString(),
+ end: new Date(Date.now() + 60 * 60 * 1000).toISOString(),
+ type: 'google',
+ color: '#ea4335'
+ }
+ ];
+
+ res.json({ events: sampleEvents });
+
+ // TODO: Implement actual Google Calendar API call
+ /*
+ const oauth2Client = getOAuth2Client();
+ oauth2Client.setCredentials(tokens);
+
+ const calendar = google.calendar({ version: 'v3', auth: oauth2Client });
+
+ const response = await calendar.events.list({
+ calendarId: 'primary',
+ timeMin: start || new Date().toISOString(),
+ timeMax: end || new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(),
+ maxResults: 100,
+ singleEvents: true,
+ orderBy: 'startTime',
+ });
+
+ const events = response.data.items.map(event => ({
+ id: event.id,
+ title: event.summary,
+ start: event.start.dateTime || event.start.date,
+ end: event.end.dateTime || event.end.date,
+ type: 'google',
+ color: '#ea4335',
+ description: event.description,
+ location: event.location
+ }));
+
+ res.json({ events });
+ */
+ } catch (error) {
+ console.error('Error fetching calendar events:', error);
+ res.status(500).json({ error: 'Failed to fetch calendar events' });
+ }
+});
+
+// POST /api/calendar/disconnect - Disconnect Google Calendar
+router.post('/disconnect', requireAuth, async (req, res) => {
+ try {
+ // TODO: Remove tokens from database
+ // await removeGoogleTokensForUser(req.currentUser.id);
+
+ res.json({ success: true, message: 'Google Calendar disconnected' });
+ } catch (error) {
+ console.error('Error disconnecting calendar:', error);
+ res.status(500).json({ error: 'Failed to disconnect calendar' });
+ }
+});
+
+module.exports = router;
\ No newline at end of file
diff --git a/backend/routes/projects.js b/backend/routes/projects.js
index 193fe2f..dacbca6 100644
--- a/backend/routes/projects.js
+++ b/backend/routes/projects.js
@@ -182,7 +182,6 @@ router.get('/projects', async (req, res) => {
// If grouped=true, return grouped format
if (grouped === 'true') {
- console.log('Returning grouped format');
const groupedProjects = {};
enhancedProjects.forEach(project => {
const areaName = project.Area ? project.Area.name : 'No Area';
@@ -191,10 +190,8 @@ router.get('/projects', async (req, res) => {
}
groupedProjects[areaName].push(project);
});
- console.log('Grouped projects structure:', Object.keys(groupedProjects).map(key => `${key}: ${groupedProjects[key].length} projects`));
res.json(groupedProjects);
} else {
- console.log('Returning flat array format');
res.json({
projects: enhancedProjects
});
@@ -243,9 +240,6 @@ router.get('/project/:id', async (req, res) => {
due_date_at: formatDate(project.due_date_at)
};
- console.log("Project API result:", JSON.stringify(result, null, 2));
- console.log("Tasks found:", result.Tasks ? result.Tasks.length : 'No Tasks property');
-
res.json(result);
} catch (error) {
console.error('Error fetching project:', error);
diff --git a/backend/routes/tags.js b/backend/routes/tags.js
index a1f0b2e..f924a61 100644
--- a/backend/routes/tags.js
+++ b/backend/routes/tags.js
@@ -1,16 +1,12 @@
const express = require('express');
-const { Tag } = require('../models');
+const { Tag, Task, Note, Project, sequelize } = require('../models');
const router = express.Router();
// GET /api/tags
router.get('/tags', async (req, res) => {
try {
- if (!req.session || !req.session.userId) {
- return res.status(401).json({ error: 'Authentication required' });
- }
-
const tags = await Tag.findAll({
- where: { user_id: req.session.userId },
+ where: { user_id: req.currentUser.id },
attributes: ['id', 'name'],
order: [['name', 'ASC']]
});
@@ -25,12 +21,8 @@ router.get('/tags', async (req, res) => {
// GET /api/tag/:id
router.get('/tag/:id', async (req, res) => {
try {
- if (!req.session || !req.session.userId) {
- return res.status(401).json({ error: 'Authentication required' });
- }
-
const tag = await Tag.findOne({
- where: { id: req.params.id, user_id: req.session.userId },
+ where: { id: req.params.id, user_id: req.currentUser.id },
attributes: ['id', 'name']
});
@@ -48,10 +40,6 @@ router.get('/tag/:id', async (req, res) => {
// POST /api/tag
router.post('/tag', async (req, res) => {
try {
- if (!req.session || !req.session.userId) {
- return res.status(401).json({ error: 'Authentication required' });
- }
-
const { name } = req.body;
if (!name || !name.trim()) {
@@ -60,7 +48,7 @@ router.post('/tag', async (req, res) => {
const tag = await Tag.create({
name: name.trim(),
- user_id: req.session.userId
+ user_id: req.currentUser.id
});
res.status(201).json({
@@ -76,12 +64,8 @@ router.post('/tag', async (req, res) => {
// PATCH /api/tag/:id
router.patch('/tag/:id', async (req, res) => {
try {
- if (!req.session || !req.session.userId) {
- return res.status(401).json({ error: 'Authentication required' });
- }
-
const tag = await Tag.findOne({
- where: { id: req.params.id, user_id: req.session.userId }
+ where: { id: req.params.id, user_id: req.currentUser.id }
});
if (!tag) {
@@ -108,22 +92,61 @@ router.patch('/tag/:id', async (req, res) => {
// DELETE /api/tag/:id
router.delete('/tag/:id', async (req, res) => {
+ const transaction = await sequelize.transaction();
+
try {
- if (!req.session || !req.session.userId) {
- return res.status(401).json({ error: 'Authentication required' });
- }
-
const tag = await Tag.findOne({
- where: { id: req.params.id, user_id: req.session.userId }
+ where: { id: req.params.id, user_id: req.currentUser.id }
});
if (!tag) {
+ await transaction.rollback();
return res.status(404).json({ error: 'Tag not found' });
}
- await tag.destroy();
+ // Use transaction to ensure all deletions happen atomically
+ // Remove all associations before deleting the tag by manually deleting from junction tables
+ // Only delete from tables that exist
+ try {
+ await sequelize.query('DELETE FROM tasks_tags WHERE tag_id = ?', {
+ replacements: [tag.id],
+ type: sequelize.QueryTypes.DELETE,
+ transaction
+ });
+ } catch (error) {
+ // Ignore if table doesn't exist
+ console.log('tasks_tags table not found, skipping');
+ }
+
+ try {
+ await sequelize.query('DELETE FROM notes_tags WHERE tag_id = ?', {
+ replacements: [tag.id],
+ type: sequelize.QueryTypes.DELETE,
+ transaction
+ });
+ } catch (error) {
+ // Ignore if table doesn't exist
+ console.log('notes_tags table not found, skipping');
+ }
+
+ try {
+ await sequelize.query('DELETE FROM projects_tags WHERE tag_id = ?', {
+ replacements: [tag.id],
+ type: sequelize.QueryTypes.DELETE,
+ transaction
+ });
+ } catch (error) {
+ // Ignore if table doesn't exist
+ console.log('projects_tags table not found, skipping');
+ }
+
+ // Now safely delete the tag
+ await tag.destroy({ transaction });
+
+ await transaction.commit();
res.json({ message: 'Tag successfully deleted' });
} catch (error) {
+ await transaction.rollback();
console.error('Error deleting tag:', error);
res.status(400).json({ error: 'There was a problem deleting the tag.' });
}
diff --git a/backend/routes/task-events.js b/backend/routes/task-events.js
new file mode 100644
index 0000000..07aab25
--- /dev/null
+++ b/backend/routes/task-events.js
@@ -0,0 +1,153 @@
+const express = require('express');
+const { TaskEvent } = require('../models');
+const TaskEventService = require('../services/taskEventService');
+const router = express.Router();
+
+// GET /api/task/:id/timeline - Get task event timeline
+router.get('/task/:id/timeline', async (req, res) => {
+ try {
+ const timeline = await TaskEventService.getTaskTimeline(req.params.id);
+
+ // Filter to only show events for tasks owned by the current user
+ const userTimeline = timeline.filter(event => event.user_id === req.currentUser.id);
+
+ res.json(userTimeline);
+ } catch (error) {
+ console.error('Error fetching task timeline:', error);
+ res.status(500).json({ error: 'Failed to fetch task timeline' });
+ }
+});
+
+// GET /api/task/:id/completion-time - Get task completion analytics
+router.get('/task/:id/completion-time', async (req, res) => {
+ try {
+ const completionTime = await TaskEventService.getTaskCompletionTime(req.params.id);
+
+ if (!completionTime) {
+ return res.status(404).json({ error: 'Task completion data not found' });
+ }
+
+ res.json(completionTime);
+ } catch (error) {
+ console.error('Error fetching task completion time:', error);
+ res.status(500).json({ error: 'Failed to fetch task completion time' });
+ }
+});
+
+// GET /api/user/productivity-metrics - Get user productivity metrics
+router.get('/user/productivity-metrics', async (req, res) => {
+ try {
+ const { startDate, endDate } = req.query;
+
+ const metrics = await TaskEventService.getUserProductivityMetrics(
+ req.currentUser.id,
+ startDate ? new Date(startDate) : null,
+ endDate ? new Date(endDate) : null
+ );
+
+ res.json(metrics);
+ } catch (error) {
+ console.error('Error fetching productivity metrics:', error);
+ res.status(500).json({ error: 'Failed to fetch productivity metrics' });
+ }
+});
+
+// GET /api/user/activity-summary - Get task activity summary
+router.get('/user/activity-summary', async (req, res) => {
+ try {
+ const { startDate, endDate } = req.query;
+
+ if (!startDate || !endDate) {
+ return res.status(400).json({ error: 'startDate and endDate are required' });
+ }
+
+ const activitySummary = await TaskEventService.getTaskActivitySummary(
+ req.currentUser.id,
+ new Date(startDate),
+ new Date(endDate)
+ );
+
+ res.json(activitySummary);
+ } catch (error) {
+ console.error('Error fetching activity summary:', error);
+ res.status(500).json({ error: 'Failed to fetch activity summary' });
+ }
+});
+
+// GET /api/tasks/completion-analytics - Get completion time analytics for multiple tasks
+router.get('/tasks/completion-analytics', async (req, res) => {
+ try {
+ const { limit = 50, offset = 0, projectId } = req.query;
+
+ // Get completed tasks for the user
+ const { Task, Project } = require('../models');
+ const { Op } = require('sequelize');
+
+ const whereClause = {
+ user_id: req.currentUser.id,
+ status: 2 // completed
+ };
+
+ if (projectId) {
+ whereClause.project_id = projectId;
+ }
+
+ const completedTasks = await Task.findAll({
+ where: whereClause,
+ include: [
+ { model: Project, attributes: ['name'], required: false }
+ ],
+ order: [['completed_at', 'DESC']],
+ limit: parseInt(limit),
+ offset: parseInt(offset)
+ });
+
+ // Get completion time analytics for each task
+ const analytics = [];
+ for (const task of completedTasks) {
+ const completionTime = await TaskEventService.getTaskCompletionTime(task.id);
+ if (completionTime) {
+ analytics.push({
+ task_id: task.id,
+ task_name: task.name,
+ project_name: task.Project?.name || null,
+ ...completionTime
+ });
+ }
+ }
+
+ // Calculate summary statistics
+ const summary = {
+ total_tasks: analytics.length,
+ average_completion_hours: analytics.length > 0
+ ? analytics.reduce((sum, a) => sum + a.duration_hours, 0) / analytics.length
+ : 0,
+ median_completion_hours: 0,
+ fastest_completion: analytics.length > 0
+ ? Math.min(...analytics.map(a => a.duration_hours))
+ : 0,
+ slowest_completion: analytics.length > 0
+ ? Math.max(...analytics.map(a => a.duration_hours))
+ : 0
+ };
+
+ // Calculate median
+ if (analytics.length > 0) {
+ const sorted = analytics.map(a => a.duration_hours).sort((a, b) => a - b);
+ const middle = Math.floor(sorted.length / 2);
+ summary.median_completion_hours = sorted.length % 2 === 0
+ ? (sorted[middle - 1] + sorted[middle]) / 2
+ : sorted[middle];
+ }
+
+ res.json({
+ tasks: analytics,
+ summary
+ });
+ } catch (error) {
+ console.error('Error fetching completion analytics:', error);
+ res.status(500).json({ error: 'Failed to fetch completion analytics' });
+ }
+});
+
+module.exports = router;
\ No newline at end of file
diff --git a/backend/routes/tasks.js b/backend/routes/tasks.js
index e57f23e..559c3fd 100644
--- a/backend/routes/tasks.js
+++ b/backend/routes/tasks.js
@@ -1,9 +1,24 @@
const express = require('express');
-const { Task, Tag, Project, sequelize } = require('../models');
+const { Task, Tag, Project, TaskEvent, sequelize } = require('../models');
const { Op } = require('sequelize');
const RecurringTaskService = require('../services/recurringTaskService');
+const TaskEventService = require('../services/taskEventService');
+const moment = require('moment-timezone');
const router = express.Router();
+// Helper function to serialize task with today move count
+async function serializeTask(task) {
+ const taskJson = task.toJSON();
+ const todayMoveCount = await TaskEventService.getTaskTodayMoveCount(task.id);
+
+ return {
+ ...taskJson,
+ tags: taskJson.Tags || [],
+ due_date: task.due_date ? task.due_date.toISOString().split('T')[0] : null,
+ today_move_count: todayMoveCount
+ };
+}
+
// Helper function to update task tags
async function updateTaskTags(task, tagsData, userId) {
if (!tagsData) return;
@@ -118,7 +133,8 @@ async function filterTasksByParams(params, userId) {
}
// Compute task metrics
-async function computeTaskMetrics(userId) {
+async function computeTaskMetrics(userId, userTimezone = 'UTC') {
+ console.log('Computing metrics for user', userId, 'with timezone:', userTimezone);
const totalOpenTasks = await Task.count({
where: { user_id: userId, status: { [Op.ne]: Task.STATUS.DONE } }
});
@@ -135,7 +151,7 @@ async function computeTaskMetrics(userId) {
const tasksInProgress = await Task.findAll({
where: {
user_id: userId,
- status: Task.STATUS.IN_PROGRESS
+ status: { [Op.in]: [Task.STATUS.IN_PROGRESS, 'in_progress'] }
},
include: [
{
@@ -153,6 +169,29 @@ async function computeTaskMetrics(userId) {
order: [['priority', 'DESC']]
});
+ // Get tasks in today plan
+ const todayPlanTasks = await Task.findAll({
+ where: {
+ user_id: userId,
+ today: true,
+ status: { [Op.notIn]: [Task.STATUS.DONE, Task.STATUS.ARCHIVED, 'done', 'archived'] }
+ },
+ include: [
+ {
+ model: Tag,
+ attributes: ['id', 'name'],
+ through: { attributes: [] },
+ required: false
+ },
+ {
+ model: Project,
+ attributes: ['id', 'name', 'active'],
+ required: false
+ }
+ ],
+ order: [['priority', 'DESC'], ['created_at', 'ASC']]
+ });
+
const today = new Date();
today.setHours(23, 59, 59, 999);
@@ -196,11 +235,27 @@ async function computeTaskMetrics(userId) {
...tasksDueToday.map(t => t.id)
];
- suggestedTasks = await Task.findAll({
+ // Get task IDs that have "someday" tag
+ const somedayTaskIds = await sequelize.query(
+ `SELECT DISTINCT task_id FROM tasks_tags
+ JOIN tags ON tasks_tags.tag_id = tags.id
+ WHERE tags.name = 'someday' AND tags.user_id = ?`,
+ {
+ replacements: [userId],
+ type: sequelize.QueryTypes.SELECT
+ }
+ ).then(results => results.map(r => r.task_id));
+
+ // Get tasks without projects (excluding someday tagged tasks)
+ const nonProjectTasks = await Task.findAll({
where: {
user_id: userId,
- status: Task.STATUS.NOT_STARTED,
- id: { [Op.notIn]: excludedTaskIds }
+ status: { [Op.in]: [Task.STATUS.NOT_STARTED, Task.STATUS.WAITING] },
+ id: { [Op.notIn]: [...excludedTaskIds, ...somedayTaskIds] },
+ [Op.or]: [
+ { project_id: null },
+ { project_id: '' }
+ ]
},
include: [
{
@@ -215,9 +270,150 @@ async function computeTaskMetrics(userId) {
required: false
}
],
- order: [['priority', 'DESC']],
- limit: 10
+ order: [['priority', 'DESC'], ['created_at', 'ASC']],
+ limit: 6
});
+
+ // Get tasks with projects (excluding someday tagged tasks)
+ const projectTasks = await Task.findAll({
+ where: {
+ user_id: userId,
+ status: { [Op.in]: [Task.STATUS.NOT_STARTED, Task.STATUS.WAITING] },
+ id: { [Op.notIn]: [...excludedTaskIds, ...somedayTaskIds] },
+ project_id: { [Op.not]: null, [Op.ne]: '' }
+ },
+ include: [
+ {
+ model: Tag,
+ attributes: ['id', 'name'],
+ through: { attributes: [] },
+ required: false
+ },
+ {
+ model: Project,
+ attributes: ['id', 'name', 'active'],
+ required: false
+ }
+ ],
+ order: [['priority', 'DESC'], ['created_at', 'ASC']],
+ limit: 6
+ });
+
+ // Check if we have enough suggestions (at least 6 total)
+ let combinedTasks = [...nonProjectTasks, ...projectTasks];
+
+ // If we don't have enough suggestions, include someday tasks as fallback
+ if (combinedTasks.length < 6) {
+ const usedTaskIds = [...excludedTaskIds, ...combinedTasks.map(t => t.id)];
+
+ const somedayFallbackTasks = await Task.findAll({
+ where: {
+ user_id: userId,
+ status: { [Op.in]: [Task.STATUS.NOT_STARTED, Task.STATUS.WAITING] },
+ id: {
+ [Op.notIn]: usedTaskIds,
+ [Op.in]: somedayTaskIds
+ }
+ },
+ include: [
+ {
+ model: Tag,
+ attributes: ['id', 'name'],
+ through: { attributes: [] },
+ required: false
+ },
+ {
+ model: Project,
+ attributes: ['id', 'name', 'active'],
+ required: false
+ }
+ ],
+ order: [['priority', 'DESC'], ['created_at', 'ASC']],
+ limit: 12 - combinedTasks.length
+ });
+
+ combinedTasks = [...combinedTasks, ...somedayFallbackTasks];
+ }
+
+ suggestedTasks = combinedTasks;
+
+ }
+
+ // Get tasks completed today - use user's timezone
+ const todayInUserTz = moment.tz(userTimezone);
+ const todayStart = todayInUserTz.clone().startOf('day').utc().toDate();
+ const todayEnd = todayInUserTz.clone().endOf('day').utc().toDate();
+
+ const tasksCompletedToday = await Task.findAll({
+ where: {
+ user_id: userId,
+ status: Task.STATUS.DONE,
+ completed_at: {
+ [Op.between]: [todayStart, todayEnd]
+ }
+ },
+ include: [
+ {
+ model: Tag,
+ attributes: ['id', 'name'],
+ through: { attributes: [] },
+ required: false
+ },
+ {
+ model: Project,
+ attributes: ['id', 'name', 'active'],
+ required: false
+ }
+ ],
+ order: [['completed_at', 'DESC']]
+ });
+
+ // Get weekly completion data (last 7 days) - use user's timezone
+ const weekStartInUserTz = moment.tz(userTimezone).subtract(6, 'days');
+ const weekStart = weekStartInUserTz.clone().startOf('day').utc().toDate();
+ const weekEnd = todayInUserTz.clone().endOf('day').utc().toDate();
+
+ // For SQLite, we'll fetch the raw data and process it in JavaScript
+ const weeklyCompletionsRaw = await Task.findAll({
+ where: {
+ user_id: userId,
+ status: Task.STATUS.DONE,
+ completed_at: {
+ [Op.between]: [weekStart, weekEnd]
+ }
+ },
+ attributes: ['completed_at'],
+ raw: true
+ });
+
+ // Process the data in JavaScript to group by date in user's timezone
+ const dateCountMap = {};
+ weeklyCompletionsRaw.forEach(task => {
+ // Parse the completed_at field more reliably - convert to Date first, then to moment
+ const completedDate = new Date(task.completed_at);
+ const dateInUserTz = moment(completedDate).tz(userTimezone).format('YYYY-MM-DD');
+ dateCountMap[dateInUserTz] = (dateCountMap[dateInUserTz] || 0) + 1;
+ });
+
+ // Convert to the format expected by the rest of the code
+ const weeklyCompletions = Object.entries(dateCountMap).map(([date, count]) => ({
+ date,
+ count: count.toString()
+ }));
+
+ // Process weekly completion data to ensure all 7 days are represented
+ const weeklyData = [];
+ for (let i = 6; i >= 0; i--) {
+ const dateInUserTz = moment.tz(userTimezone).subtract(i, 'days');
+ const dateString = dateInUserTz.format('YYYY-MM-DD');
+
+ const found = weeklyCompletions.find(item => item.date === dateString);
+ const dayData = {
+ date: dateString,
+ count: found ? parseInt(found.count) : 0,
+ dayName: dateInUserTz.format('ddd') // Short day name
+ };
+ weeklyData.push(dayData);
}
return {
@@ -226,7 +422,10 @@ async function computeTaskMetrics(userId) {
tasks_in_progress_count: tasksInProgress.length,
tasks_in_progress: tasksInProgress,
tasks_due_today: tasksDueToday,
- suggested_tasks: suggestedTasks
+ today_plan_tasks: todayPlanTasks,
+ suggested_tasks: suggestedTasks,
+ tasks_completed_today: tasksCompletedToday,
+ weekly_completions: weeklyData
};
}
@@ -234,45 +433,26 @@ async function computeTaskMetrics(userId) {
router.get('/tasks', async (req, res) => {
try {
const tasks = await filterTasksByParams(req.query, req.currentUser.id);
- const metrics = await computeTaskMetrics(req.currentUser.id);
+ const metrics = await computeTaskMetrics(req.currentUser.id, req.currentUser.timezone);
res.json({
- tasks: tasks.map(task => {
- const taskJson = task.toJSON();
- return {
- ...taskJson,
- tags: taskJson.Tags || [],
- due_date: task.due_date ? task.due_date.toISOString().split('T')[0] : null
- };
- }),
+ tasks: await Promise.all(tasks.map(task => serializeTask(task))),
metrics: {
total_open_tasks: metrics.total_open_tasks,
tasks_pending_over_month: metrics.tasks_pending_over_month,
tasks_in_progress_count: metrics.tasks_in_progress_count,
- tasks_in_progress: metrics.tasks_in_progress.map(task => {
- const taskJson = task.toJSON();
+ tasks_in_progress: await Promise.all(metrics.tasks_in_progress.map(task => serializeTask(task))),
+ tasks_due_today: await Promise.all(metrics.tasks_due_today.map(task => serializeTask(task))),
+ today_plan_tasks: await Promise.all(metrics.today_plan_tasks.map(task => serializeTask(task))),
+ suggested_tasks: await Promise.all(metrics.suggested_tasks.map(task => serializeTask(task))),
+ tasks_completed_today: await Promise.all(metrics.tasks_completed_today.map(async task => {
+ const serialized = await serializeTask(task);
return {
- ...taskJson,
- tags: taskJson.Tags || [],
- due_date: task.due_date ? task.due_date.toISOString().split('T')[0] : null
+ ...serialized,
+ completed_at: task.completed_at ? task.completed_at.toISOString() : null
};
- }),
- tasks_due_today: metrics.tasks_due_today.map(task => {
- const taskJson = task.toJSON();
- return {
- ...taskJson,
- tags: taskJson.Tags || [],
- due_date: task.due_date ? task.due_date.toISOString().split('T')[0] : null
- };
- }),
- suggested_tasks: metrics.suggested_tasks.map(task => {
- const taskJson = task.toJSON();
- return {
- ...taskJson,
- tags: taskJson.Tags || [],
- due_date: task.due_date ? task.due_date.toISOString().split('T')[0] : null
- };
- })
+ })),
+ weekly_completions: metrics.weekly_completions
}
});
} catch (error) {
@@ -284,6 +464,30 @@ router.get('/tasks', async (req, res) => {
}
});
+// GET /api/task/uuid/:uuid
+router.get('/task/uuid/:uuid', async (req, res) => {
+ try {
+ const task = await Task.findOne({
+ where: { uuid: req.params.uuid, user_id: req.currentUser.id },
+ include: [
+ { model: Tag, attributes: ['id', 'name'], through: { attributes: [] } },
+ { model: Project, attributes: ['name'], required: false }
+ ]
+ });
+
+ if (!task) {
+ return res.status(404).json({ error: 'Task not found.' });
+ }
+
+ const serializedTask = await serializeTask(task);
+
+ res.json(serializedTask);
+ } catch (error) {
+ console.error('Error fetching task by UUID:', error);
+ res.status(500).json({ error: 'Internal server error' });
+ }
+});
+
// GET /api/task/:id
router.get('/task/:id', async (req, res) => {
try {
@@ -299,13 +503,9 @@ router.get('/task/:id', async (req, res) => {
return res.status(404).json({ error: 'Task not found.' });
}
- const taskJson = task.toJSON();
+ const serializedTask = await serializeTask(task);
- res.json({
- ...taskJson,
- tags: taskJson.Tags || [],
- due_date: task.due_date ? task.due_date.toISOString().split('T')[0] : null
- });
+ res.json(serializedTask);
} catch (error) {
console.error('Error fetching task:', error);
res.status(500).json({ error: 'Internal server error' });
@@ -324,6 +524,7 @@ router.post('/task', async (req, res) => {
project_id,
tags,
Tags,
+ today,
recurrence_type,
recurrence_interval,
recurrence_end_date,
@@ -343,10 +544,11 @@ router.post('/task', async (req, res) => {
const taskAttributes = {
name: name.trim(),
- priority: priority || Task.PRIORITY.LOW,
+ priority: priority !== undefined ? (typeof priority === 'string' ? Task.getPriorityValue(priority) : priority) : Task.PRIORITY.LOW,
due_date: due_date || null,
- status: status || Task.STATUS.NOT_STARTED,
+ status: status !== undefined ? (typeof status === 'string' ? Task.getStatusValue(status) : status) : Task.STATUS.NOT_STARTED,
note,
+ today: today !== undefined ? today : false,
user_id: req.currentUser.id,
recurrence_type: recurrence_type || 'none',
recurrence_interval: recurrence_interval || null,
@@ -371,6 +573,20 @@ router.post('/task', async (req, res) => {
const task = await Task.create(taskAttributes);
await updateTaskTags(task, tagsData, req.currentUser.id);
+ // Log task creation event
+ try {
+ await TaskEventService.logTaskCreated(task.id, req.currentUser.id, {
+ name: task.name,
+ status: task.status,
+ priority: task.priority,
+ due_date: task.due_date,
+ project_id: task.project_id
+ }, { source: 'web' });
+ } catch (eventError) {
+ console.error('Error logging task creation event:', eventError);
+ // Don't fail the request if event logging fails
+ }
+
// Reload task with associations
const taskWithAssociations = await Task.findByPk(task.id, {
include: [
@@ -407,6 +623,7 @@ router.patch('/task/:id', async (req, res) => {
project_id,
tags,
Tags,
+ today,
recurrence_type,
recurrence_interval,
recurrence_end_date,
@@ -421,13 +638,34 @@ router.patch('/task/:id', async (req, res) => {
const tagsData = tags || Tags;
const task = await Task.findOne({
- where: { id: req.params.id, user_id: req.currentUser.id }
+ where: { id: req.params.id, user_id: req.currentUser.id },
+ include: [
+ { model: Tag, attributes: ['id', 'name'], through: { attributes: [] } }
+ ]
});
if (!task) {
return res.status(404).json({ error: 'Task not found.' });
}
+ // Capture old values for event logging
+ const oldValues = {
+ name: task.name,
+ status: task.status,
+ priority: task.priority,
+ due_date: task.due_date,
+ project_id: task.project_id,
+ note: task.note,
+ recurrence_type: task.recurrence_type,
+ recurrence_interval: task.recurrence_interval,
+ recurrence_end_date: task.recurrence_end_date,
+ recurrence_weekday: task.recurrence_weekday,
+ recurrence_month_day: task.recurrence_month_day,
+ recurrence_week_of_month: task.recurrence_week_of_month,
+ completion_based: task.completion_based,
+ tags: task.Tags ? task.Tags.map(tag => ({ id: tag.id, name: tag.name })) : []
+ };
+
// Handle updating parent recurrence settings if this is a child task
if (update_parent_recurrence && task.recurring_parent_id) {
const parentTask = await Task.findOne({
@@ -450,10 +688,11 @@ router.patch('/task/:id', async (req, res) => {
const taskAttributes = {
name,
- priority,
- status: status || Task.STATUS.NOT_STARTED,
+ priority: priority !== undefined ? (typeof priority === 'string' ? Task.getPriorityValue(priority) : priority) : undefined,
+ status: status !== undefined ? (typeof status === 'string' ? Task.getStatusValue(status) : status) : Task.STATUS.NOT_STARTED,
note,
due_date: due_date || null,
+ today: today !== undefined ? today : task.today,
recurrence_type: recurrence_type !== undefined ? recurrence_type : task.recurrence_type,
recurrence_interval: recurrence_interval !== undefined ? recurrence_interval : task.recurrence_interval,
recurrence_end_date: recurrence_end_date !== undefined ? recurrence_end_date : task.recurrence_end_date,
@@ -463,6 +702,20 @@ router.patch('/task/:id', async (req, res) => {
completion_based: completion_based !== undefined ? completion_based : task.completion_based
};
+ // Set completed_at when task is marked as done
+ if (status !== undefined) {
+ const newStatus = typeof status === 'string' ? Task.getStatusValue(status) : status;
+ const oldStatus = typeof task.status === 'string' ? Task.getStatusValue(task.status) : task.status;
+
+ if (newStatus === Task.STATUS.DONE && oldStatus !== Task.STATUS.DONE) {
+ // Task is being completed
+ taskAttributes.completed_at = new Date();
+ } else if (newStatus !== Task.STATUS.DONE && oldStatus === Task.STATUS.DONE) {
+ // Task is being uncompleted
+ taskAttributes.completed_at = null;
+ }
+ }
+
// Handle project assignment
if (project_id && project_id.toString().trim()) {
const project = await Project.findOne({
@@ -479,6 +732,87 @@ router.patch('/task/:id', async (req, res) => {
await task.update(taskAttributes);
await updateTaskTags(task, tagsData, req.currentUser.id);
+ // Log task update events
+ try {
+ const changes = {};
+
+ // Check for changes in each field
+ if (name !== undefined && name !== oldValues.name) {
+ changes.name = { oldValue: oldValues.name, newValue: name };
+ }
+ if (status !== undefined && status !== oldValues.status) {
+ changes.status = { oldValue: oldValues.status, newValue: status };
+ }
+ if (priority !== undefined && priority !== oldValues.priority) {
+ changes.priority = { oldValue: oldValues.priority, newValue: priority };
+ }
+ if (due_date !== undefined) {
+ // Normalize dates for comparison (convert to YYYY-MM-DD format)
+ const oldDateStr = oldValues.due_date ? oldValues.due_date.toISOString().split('T')[0] : null;
+ const newDateStr = due_date || null;
+
+ if (oldDateStr !== newDateStr) {
+ changes.due_date = { oldValue: oldValues.due_date, newValue: due_date };
+ }
+ }
+ if (project_id !== undefined && project_id !== oldValues.project_id) {
+ changes.project_id = { oldValue: oldValues.project_id, newValue: project_id };
+ }
+ if (note !== undefined && note !== oldValues.note) {
+ changes.note = { oldValue: oldValues.note, newValue: note };
+ }
+
+ // Check recurrence field changes
+ if (recurrence_type !== undefined && recurrence_type !== oldValues.recurrence_type) {
+ changes.recurrence_type = { oldValue: oldValues.recurrence_type, newValue: recurrence_type };
+ }
+ if (recurrence_interval !== undefined && recurrence_interval !== oldValues.recurrence_interval) {
+ changes.recurrence_interval = { oldValue: oldValues.recurrence_interval, newValue: recurrence_interval };
+ }
+ if (recurrence_end_date !== undefined && recurrence_end_date !== oldValues.recurrence_end_date) {
+ changes.recurrence_end_date = { oldValue: oldValues.recurrence_end_date, newValue: recurrence_end_date };
+ }
+ if (recurrence_weekday !== undefined && recurrence_weekday !== oldValues.recurrence_weekday) {
+ changes.recurrence_weekday = { oldValue: oldValues.recurrence_weekday, newValue: recurrence_weekday };
+ }
+ if (recurrence_month_day !== undefined && recurrence_month_day !== oldValues.recurrence_month_day) {
+ changes.recurrence_month_day = { oldValue: oldValues.recurrence_month_day, newValue: recurrence_month_day };
+ }
+ if (recurrence_week_of_month !== undefined && recurrence_week_of_month !== oldValues.recurrence_week_of_month) {
+ changes.recurrence_week_of_month = { oldValue: oldValues.recurrence_week_of_month, newValue: recurrence_week_of_month };
+ }
+ if (completion_based !== undefined && completion_based !== oldValues.completion_based) {
+ changes.completion_based = { oldValue: oldValues.completion_based, newValue: completion_based };
+ }
+
+ // Log all changes
+ if (Object.keys(changes).length > 0) {
+ await TaskEventService.logTaskUpdate(task.id, req.currentUser.id, changes, { source: 'web' });
+ }
+
+ // Check for tag changes (this is more complex due to the array comparison)
+ if (tagsData) {
+ const newTags = tagsData.map(tag => ({ id: tag.id, name: tag.name }));
+ const oldTagNames = oldValues.tags.map(tag => tag.name).sort();
+ const newTagNames = newTags.map(tag => tag.name).sort();
+
+ if (JSON.stringify(oldTagNames) !== JSON.stringify(newTagNames)) {
+ await TaskEventService.logEvent({
+ taskId: task.id,
+ userId: req.currentUser.id,
+ eventType: 'tags_changed',
+ fieldName: 'tags',
+ oldValue: oldValues.tags,
+ newValue: newTags,
+ metadata: { source: 'web', action: 'tags_update' }
+ });
+ }
+ }
+ } catch (eventError) {
+ console.error('Error logging task update events:', eventError);
+ // Don't fail the request if event logging fails
+ }
+
// Reload task with associations
const taskWithAssociations = await Task.findByPk(task.id, {
include: [
@@ -528,7 +862,15 @@ router.patch('/task/:id/toggle_completion', async (req, res) => {
console.log('📝 Status changing from', task.status, 'to', newStatus);
- await task.update({ status: newStatus });
+ // Set completed_at when task is completed/uncompleted
+ const updateData = { status: newStatus };
+ if (newStatus === Task.STATUS.DONE) {
+ updateData.completed_at = new Date();
+ } else if (task.status === Task.STATUS.DONE || task.status === 'done') {
+ updateData.completed_at = null;
+ }
+
+ await task.update(updateData);
// Handle recurring task completion
let nextTask = null;
@@ -569,7 +911,98 @@ router.delete('/task/:id', async (req, res) => {
return res.status(404).json({ error: 'Task not found.' });
}
- await task.destroy();
+ console.log(`Attempting to delete task ${req.params.id}`);
+
+ // Check for child tasks - prevent deletion of parent tasks with children
+ const childTasks = await Task.findAll({
+ where: { recurring_parent_id: req.params.id }
+ });
+ console.log(`Found ${childTasks.length} child tasks`);
+
+ // If this is a recurring parent task with children, prevent deletion
+ if (childTasks.length > 0) {
+ console.log(`Cannot delete task ${req.params.id} - has ${childTasks.length} child tasks`);
+ return res.status(400).json({ error: 'There was a problem deleting the task.' });
+ }
+
+ const taskEvents = await TaskEvent.findAll({
+ where: { task_id: req.params.id }
+ });
+ console.log(`Found ${taskEvents.length} task events`);
+
+ const tagAssociations = await sequelize.query(
+ 'SELECT COUNT(*) as count FROM tasks_tags WHERE task_id = ?',
+ { replacements: [req.params.id], type: sequelize.QueryTypes.SELECT }
+ );
+ console.log(`Found ${tagAssociations[0].count} tag associations`);
+
+ // Check SQLite foreign key list for tasks table
+ const foreignKeys = await sequelize.query(
+ 'PRAGMA foreign_key_list(tasks)',
+ { type: sequelize.QueryTypes.SELECT }
+ );
+ console.log('Foreign keys in tasks table:', foreignKeys);
+
+ // Find all tables that reference tasks
+ const allTables = await sequelize.query(
+ "SELECT name FROM sqlite_master WHERE type='table'",
+ { type: sequelize.QueryTypes.SELECT }
+ );
+
+ for (const table of allTables) {
+ if (table.name !== 'tasks') {
+ try {
+ const fks = await sequelize.query(
+ `PRAGMA foreign_key_list(${table.name})`,
+ { type: sequelize.QueryTypes.SELECT }
+ );
+ const taskRefs = fks.filter(fk => fk.table === 'tasks');
+ if (taskRefs.length > 0) {
+ console.log(`Table ${table.name} references tasks:`, taskRefs);
+ // Check if this table has any records referencing our task
+ for (const fk of taskRefs) {
+ const count = await sequelize.query(
+ `SELECT COUNT(*) as count FROM ${table.name} WHERE ${fk.from} = ?`,
+ { replacements: [req.params.id], type: sequelize.QueryTypes.SELECT }
+ );
+ console.log(` ${table.name}.${fk.from} -> tasks.${fk.to}: ${count[0].count} references`);
+ }
+ }
+ } catch (error) {
+ // Skip tables that might not exist or have issues
+ }
+ }
+ }
+
+ // Temporarily disable foreign key constraints for this operation
+ await sequelize.query('PRAGMA foreign_keys = OFF');
+
+ try {
+ // Use force delete to bypass foreign key constraints
+ await TaskEvent.destroy({
+ where: { task_id: req.params.id },
+ force: true
+ });
+
+ await sequelize.query(
+ 'DELETE FROM tasks_tags WHERE task_id = ?',
+ { replacements: [req.params.id] }
+ );
+
+ await Task.update(
+ { recurring_parent_id: null },
+ { where: { recurring_parent_id: req.params.id } }
+ );
+
+ // Delete the task itself
+ await task.destroy({ force: true });
+
+ } finally {
+ // Re-enable foreign key constraints
+ await sequelize.query('PRAGMA foreign_keys = ON');
+ }
+
+ console.log(`Successfully deleted task ${req.params.id}`);
res.json({ message: 'Task successfully deleted' });
} catch (error) {
console.error('Error deleting task:', error);
@@ -595,4 +1028,45 @@ router.post('/tasks/generate-recurring', async (req, res) => {
}
});
+// PATCH /api/task/:id/toggle-today
+router.patch('/task/:id/toggle-today', async (req, res) => {
+ try {
+ const task = await Task.findOne({
+ where: { id: req.params.id, user_id: req.currentUser.id }
+ });
+
+ if (!task) {
+ return res.status(404).json({ error: 'Task not found.' });
+ }
+
+ // Toggle the today flag
+ const newTodayValue = !task.today;
+ await task.update({ today: newTodayValue });
+
+ // Log the change
+ try {
+ await TaskEventService.logEvent({
+ taskId: task.id,
+ userId: req.currentUser.id,
+ eventType: 'today_changed',
+ fieldName: 'today',
+ oldValue: !newTodayValue,
+ newValue: newTodayValue,
+ metadata: { source: 'web', action: 'toggle_today' }
+ });
+ } catch (eventError) {
+ console.error('Error logging today toggle event:', eventError);
+ // Don't fail the request if event logging fails
+ }
+
+ res.json({
+ ...task.toJSON(),
+ due_date: task.due_date ? task.due_date.toISOString().split('T')[0] : null
+ });
+ } catch (error) {
+ console.error('Error toggling task today flag:', error);
+ res.status(500).json({ error: 'Failed to update task today flag' });
+ }
+});
+
module.exports = router;
\ No newline at end of file
diff --git a/backend/routes/url.js b/backend/routes/url.js
index b4edd6c..2e7f1e8 100644
--- a/backend/routes/url.js
+++ b/backend/routes/url.js
@@ -4,20 +4,88 @@ const http = require('http');
const { URL } = require('url');
const router = express.Router();
-// Helper function to extract title from HTML
-function extractTitleFromHtml(html) {
- const titleMatch = html.match(/
]*>([^<]+)<\/title>/i);
- if (titleMatch && titleMatch[1]) {
- // Decode HTML entities and clean up
- return titleMatch[1]
- .replace(/</g, '<')
- .replace(/>/g, '>')
- .replace(/&/g, '&')
- .replace(/"/g, '"')
- .replace(/'/g, "'")
- .trim();
+// Fast regex-based metadata extraction (much faster than cheerio for head content)
+function extractMetadataFromHtml(html) {
+ try {
+ // Extract title with priority: og:title > twitter:title > title tag
+ let title = null;
+
+ // Try og:title first
+ const ogTitleMatch = html.match(/]+property=["']og:title["'][^>]+content=["']([^"']+)["']/i);
+ if (ogTitleMatch) {
+ title = ogTitleMatch[1];
+ } else {
+ // Try twitter:title
+ const twitterTitleMatch = html.match(/]+name=["']twitter:title["'][^>]+content=["']([^"']+)["']/i);
+ if (twitterTitleMatch) {
+ title = twitterTitleMatch[1];
+ } else {
+ // Fallback to title tag
+ const titleMatch = html.match(/]*>([^<]+)<\/title>/i);
+ if (titleMatch) {
+ title = titleMatch[1].trim();
+ }
+ }
+ }
+
+ // Clean up title
+ if (title) {
+ title = title.trim();
+ // Decode common HTML entities
+ title = title
+ .replace(/</g, '<')
+ .replace(/>/g, '>')
+ .replace(/&/g, '&')
+ .replace(/"/g, '"')
+ .replace(/'/g, "'");
+
+ if (title.length > 100) {
+ title = title.substring(0, 100) + '...';
+ }
+ }
+
+ // Extract image with priority: og:image > twitter:image
+ let image = null;
+ const ogImageMatch = html.match(/]+property=["']og:image["'][^>]+content=["']([^"']+)["']/i);
+ if (ogImageMatch) {
+ image = ogImageMatch[1];
+ } else {
+ const twitterImageMatch = html.match(/]+name=["']twitter:image["'][^>]+content=["']([^"']+)["']/i);
+ if (twitterImageMatch) {
+ image = twitterImageMatch[1];
+ }
+ }
+
+ // Extract description
+ let description = null;
+ const ogDescMatch = html.match(/]+property=["']og:description["'][^>]+content=["']([^"']+)["']/i);
+ if (ogDescMatch) {
+ description = ogDescMatch[1];
+ } else {
+ const twitterDescMatch = html.match(/]+name=["']twitter:description["'][^>]+content=["']([^"']+)["']/i);
+ if (twitterDescMatch) {
+ description = twitterDescMatch[1];
+ } else {
+ const metaDescMatch = html.match(/]+name=["']description["'][^>]+content=["']([^"']+)["']/i);
+ if (metaDescMatch) {
+ description = metaDescMatch[1];
+ }
+ }
+ }
+
+ if (description && description.length > 150) {
+ description = description.substring(0, 150) + '...';
+ }
+
+ return {
+ title,
+ image,
+ description
+ };
+ } catch (error) {
+ console.error('Error parsing HTML:', error);
+ return { title: null, image: null, description: null };
}
- return null;
}
// Helper function to check if text is a URL
@@ -26,68 +94,155 @@ function isUrl(text) {
return urlRegex.test(text.trim());
}
-// Helper function to fetch URL title
-async function fetchUrlTitle(url) {
+// Helper function to resolve relative URLs to absolute URLs
+function resolveUrl(baseUrl, relativeUrl) {
+ try {
+ return new URL(relativeUrl, baseUrl).href;
+ } catch {
+ return relativeUrl;
+ }
+}
+
+// Helper function to handle YouTube URLs specially
+function handleYouTubeUrl(url) {
+ const youtubeRegex = /(?:youtube\.com\/watch\?v=|youtu\.be\/)([a-zA-Z0-9_-]{11})/;
+ const match = url.match(youtubeRegex);
+
+ if (match) {
+ const videoId = match[1];
+
+ // For now, return basic YouTube info - this is fast and reliable
+ return {
+ title: 'YouTube Video',
+ image: `https://img.youtube.com/vi/${videoId}/maxresdefault.jpg`,
+ description: 'YouTube video'
+ };
+ }
+
+ return null;
+}
+
+// Helper function to fetch URL metadata with redirect handling
+async function fetchUrlMetadata(url, maxRedirects = 5) {
return new Promise((resolve) => {
// Add protocol if missing
if (!url.startsWith('http://') && !url.startsWith('https://')) {
url = 'http://' + url;
}
- try {
- const urlObj = new URL(url);
- const isHttps = urlObj.protocol === 'https:';
- const client = isHttps ? https : http;
+ // Handle YouTube URLs specially to avoid anti-bot issues
+ if (url.includes('youtube.com') || url.includes('youtu.be')) {
+ const youtubeMetadata = handleYouTubeUrl(url);
+ if (youtubeMetadata) {
+ resolve(youtubeMetadata);
+ } else {
+ resolve(null);
+ }
+ return;
+ }
- const options = {
- hostname: urlObj.hostname,
- port: urlObj.port || (isHttps ? 443 : 80),
- path: urlObj.pathname + urlObj.search,
- method: 'GET',
- timeout: 5000,
- headers: {
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
- }
- };
+ // Global timeout for the entire operation
+ const globalTimeout = setTimeout(() => {
+ resolve(null);
+ }, 3000); // 3 second max for entire operation
- const req = client.request(options, (res) => {
- let data = '';
- let totalBytes = 0;
- const maxBytes = 50000;
+ function makeRequest(currentUrl, redirectCount = 0) {
+ if (redirectCount > maxRedirects) {
+ clearTimeout(globalTimeout);
+ resolve(null);
+ return;
+ }
- res.on('data', (chunk) => {
- totalBytes += chunk.length;
- if (totalBytes > maxBytes) {
- req.destroy();
+ try {
+ const urlObj = new URL(currentUrl);
+ const isHttps = urlObj.protocol === 'https:';
+ const client = isHttps ? https : http;
+
+ const options = {
+ hostname: urlObj.hostname,
+ port: urlObj.port || (isHttps ? 443 : 80),
+ path: urlObj.pathname + urlObj.search,
+ method: 'GET',
+ timeout: 2000, // Reduced from 5000ms to 2000ms
+ headers: {
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
+ }
+ };
+
+ const req = client.request(options, (res) => {
+ // Handle redirects (301, 302, 303, 307, 308)
+ if ([301, 302, 303, 307, 308].includes(res.statusCode) && res.headers.location) {
+ const redirectUrl = new URL(res.headers.location, currentUrl).href;
+ makeRequest(redirectUrl, redirectCount + 1);
return;
}
- data += chunk;
-
- // Stop if we find the title tag
- if (data.includes('')) {
- req.destroy();
+
+ // If not a successful response, resolve with null
+ if (res.statusCode < 200 || res.statusCode >= 400) {
+ clearTimeout(globalTimeout);
+ resolve(null);
+ return;
}
+
+ let data = '';
+ let totalBytes = 0;
+ const maxBytes = 20000; // Reduced from 100KB to 20KB - most meta tags are in head
+ let foundMeta = false;
+
+ res.on('data', (chunk) => {
+ totalBytes += chunk.length;
+ if (totalBytes > maxBytes) {
+ clearTimeout(globalTimeout);
+ req.destroy();
+ return;
+ }
+ data += chunk;
+
+ // Early termination if we've found essential meta tags and closed head
+ if (!foundMeta && (data.includes('og:title') || data.includes('twitter:title') || data.includes(''))) {
+ foundMeta = true;
+ }
+
+ // Stop early if we have meta tags and hit end of head
+ if (foundMeta && data.includes('')) {
+ clearTimeout(globalTimeout);
+ req.destroy();
+ return;
+ }
+ });
+
+ res.on('end', () => {
+ clearTimeout(globalTimeout);
+ const metadata = extractMetadataFromHtml(data);
+
+ // Resolve relative image URLs to absolute
+ if (metadata.image && !metadata.image.startsWith('http')) {
+ metadata.image = resolveUrl(currentUrl, metadata.image);
+ }
+
+ resolve(metadata);
+ });
});
- res.on('end', () => {
- const title = extractTitleFromHtml(data);
- resolve(title);
+ req.on('error', (err) => {
+ clearTimeout(globalTimeout);
+ resolve(null);
});
- });
- req.on('error', () => {
+ req.on('timeout', () => {
+ clearTimeout(globalTimeout);
+ req.destroy();
+ resolve(null);
+ });
+
+ req.end();
+ } catch (error) {
+ clearTimeout(globalTimeout);
resolve(null);
- });
-
- req.on('timeout', () => {
- req.destroy();
- resolve(null);
- });
-
- req.end();
- } catch (error) {
- resolve(null);
+ }
}
+
+ makeRequest(url);
});
}
@@ -104,12 +259,17 @@ router.get('/url/title', async (req, res) => {
return res.status(400).json({ error: 'URL parameter is required' });
}
- const title = await fetchUrlTitle(url);
+ const metadata = await fetchUrlMetadata(url);
- if (title) {
- res.json({ url, title });
+ if (metadata && metadata.title) {
+ res.json({
+ url,
+ title: metadata.title,
+ image: metadata.image,
+ description: metadata.description
+ });
} else {
- res.json({ url, title: null, error: 'Could not extract title' });
+ res.json({ url, title: null, image: null, description: null, error: 'Could not extract metadata' });
}
} catch (error) {
console.error('Error extracting URL title:', error);
@@ -130,20 +290,44 @@ router.post('/url/extract-from-text', async (req, res) => {
return res.status(400).json({ error: 'Text parameter is required' });
}
- // Simple URL extraction - look for URLs in text
- const urlRegex = /(https?:\/\/[^\s]+)/gi;
- const urls = text.match(urlRegex);
+ // Enhanced URL extraction - look for URLs with or without protocol
+ const urlWithProtocolRegex = /(https?:\/\/[^\s]+)/gi;
+ const urlWithoutProtocolRegex = /(?:^|\s)((?:www\.)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(?::[0-9]{1,5})?(?:\/[^\s]*)?)/gi;
+
+ let urls = text.match(urlWithProtocolRegex);
+
+ // If no URLs with protocol found, look for URLs without protocol
+ if (!urls) {
+ const matches = text.match(urlWithoutProtocolRegex);
+ if (matches) {
+ // Clean up the matches (remove leading whitespace)
+ urls = matches.map(match => match.trim());
+ }
+ }
if (urls && urls.length > 0) {
const firstUrl = urls[0];
- const title = await fetchUrlTitle(firstUrl);
+ const metadata = await fetchUrlMetadata(firstUrl);
- res.json({
- found: true,
- url: firstUrl,
- title: title,
- originalText: text
- });
+ if (metadata && metadata.title) {
+ res.json({
+ found: true,
+ url: firstUrl,
+ title: metadata.title,
+ image: metadata.image,
+ description: metadata.description,
+ originalText: text
+ });
+ } else {
+ res.json({
+ found: true,
+ url: firstUrl,
+ title: null,
+ image: null,
+ description: null,
+ originalText: text
+ });
+ }
} else {
res.json({ found: false });
}
diff --git a/backend/routes/users.js b/backend/routes/users.js
index c61d1c0..405ddc2 100644
--- a/backend/routes/users.js
+++ b/backend/routes/users.js
@@ -17,7 +17,7 @@ router.get('/profile', async (req, res) => {
'id', 'email', 'appearance', 'language', 'timezone',
'avatar_image', 'telegram_bot_token', 'telegram_chat_id',
'task_summary_enabled', 'task_summary_frequency', 'task_intelligence_enabled',
- 'auto_suggest_next_actions_enabled'
+ 'auto_suggest_next_actions_enabled', 'pomodoro_enabled', 'today_settings'
]
});
@@ -25,6 +25,16 @@ router.get('/profile', async (req, res) => {
return res.status(404).json({ error: 'Profile not found.' });
}
+ // Parse today_settings if it's a string
+ if (user.today_settings && typeof user.today_settings === 'string') {
+ try {
+ user.today_settings = JSON.parse(user.today_settings);
+ } catch (error) {
+ console.error('Error parsing today_settings:', error);
+ user.today_settings = null;
+ }
+ }
+
res.json(user);
} catch (error) {
console.error('Error fetching profile:', error);
@@ -44,7 +54,7 @@ router.patch('/profile', async (req, res) => {
return res.status(404).json({ error: 'Profile not found.' });
}
- const { appearance, language, timezone, avatar_image, telegram_bot_token, task_intelligence_enabled, task_summary_enabled, task_summary_frequency, auto_suggest_next_actions_enabled } = req.body;
+ const { appearance, language, timezone, avatar_image, telegram_bot_token, task_intelligence_enabled, task_summary_enabled, task_summary_frequency, auto_suggest_next_actions_enabled, pomodoro_enabled, currentPassword, newPassword } = req.body;
const allowedUpdates = {};
if (appearance !== undefined) allowedUpdates.appearance = appearance;
@@ -56,12 +66,36 @@ router.patch('/profile', async (req, res) => {
if (task_summary_enabled !== undefined) allowedUpdates.task_summary_enabled = task_summary_enabled;
if (task_summary_frequency !== undefined) allowedUpdates.task_summary_frequency = task_summary_frequency;
if (auto_suggest_next_actions_enabled !== undefined) allowedUpdates.auto_suggest_next_actions_enabled = auto_suggest_next_actions_enabled;
+ if (pomodoro_enabled !== undefined) allowedUpdates.pomodoro_enabled = pomodoro_enabled;
+
+ // Handle password change if provided
+ if (currentPassword && newPassword) {
+ if (newPassword.length < 6) {
+ return res.status(400).json({
+ field: 'newPassword',
+ error: 'Password must be at least 6 characters'
+ });
+ }
+
+ // Verify current password
+ const isValidPassword = await User.checkPassword(currentPassword, user.password_digest);
+ if (!isValidPassword) {
+ return res.status(400).json({
+ field: 'currentPassword',
+ error: 'Current password is incorrect'
+ });
+ }
+
+ // Hash and include new password in updates
+ const hashedNewPassword = await User.hashPassword(newPassword);
+ allowedUpdates.password_digest = hashedNewPassword;
+ }
await user.update(allowedUpdates);
// Return updated user with limited fields
const updatedUser = await User.findByPk(user.id, {
- attributes: ['id', 'email', 'appearance', 'language', 'timezone', 'avatar_image', 'telegram_bot_token', 'telegram_chat_id', 'task_intelligence_enabled', 'task_summary_enabled', 'task_summary_frequency', 'auto_suggest_next_actions_enabled']
+ attributes: ['id', 'email', 'appearance', 'language', 'timezone', 'avatar_image', 'telegram_bot_token', 'telegram_chat_id', 'task_intelligence_enabled', 'task_summary_enabled', 'task_summary_frequency', 'auto_suggest_next_actions_enabled', 'pomodoro_enabled']
});
res.json(updatedUser);
@@ -74,6 +108,51 @@ router.patch('/profile', async (req, res) => {
}
});
+// POST /api/profile/change-password
+router.post('/profile/change-password', async (req, res) => {
+ try {
+ if (!req.session || !req.session.userId) {
+ return res.status(401).json({ error: 'Authentication required' });
+ }
+
+ const { currentPassword, newPassword } = req.body;
+
+ if (!currentPassword || !newPassword) {
+ return res.status(400).json({ error: 'Current password and new password are required' });
+ }
+
+ if (newPassword.length < 6) {
+ return res.status(400).json({
+ field: 'newPassword',
+ error: 'Password must be at least 6 characters'
+ });
+ }
+
+ const user = await User.findByPk(req.session.userId);
+ if (!user) {
+ return res.status(404).json({ error: 'User not found' });
+ }
+
+ // Verify current password
+ const isValidPassword = await User.checkPassword(currentPassword, user.password_digest);
+ if (!isValidPassword) {
+ return res.status(400).json({
+ field: 'currentPassword',
+ error: 'Current password is incorrect'
+ });
+ }
+
+ // Hash and update new password
+ const hashedNewPassword = await User.hashPassword(newPassword);
+ await user.update({ password_digest: hashedNewPassword });
+
+ res.json({ message: 'Password changed successfully' });
+ } catch (error) {
+ console.error('Error changing password:', error);
+ res.status(500).json({ error: 'Internal server error' });
+ }
+});
+
// POST /api/profile/task-summary/toggle
router.post('/profile/task-summary/toggle', async (req, res) => {
try {
@@ -208,4 +287,48 @@ router.get('/profile/task-summary/status', async (req, res) => {
}
});
+// PUT /api/profile/today-settings
+router.put('/profile/today-settings', async (req, res) => {
+ try {
+ if (!req.session || !req.session.userId) {
+ return res.status(401).json({ error: 'Authentication required' });
+ }
+
+ const user = await User.findByPk(req.session.userId);
+ if (!user) {
+ return res.status(404).json({ error: 'User not found.' });
+ }
+
+ const {
+ showMetrics,
+ showProductivity,
+ showIntelligence,
+ showDueToday,
+ showCompleted,
+ showProgressBar,
+ showDailyQuote
+ } = req.body;
+
+ const todaySettings = {
+ showMetrics: showMetrics !== undefined ? showMetrics : user.today_settings?.showMetrics || false,
+ showProductivity: showProductivity !== undefined ? showProductivity : user.today_settings?.showProductivity || false,
+ showIntelligence: showIntelligence !== undefined ? showIntelligence : user.today_settings?.showIntelligence || false,
+ showDueToday: showDueToday !== undefined ? showDueToday : user.today_settings?.showDueToday || true,
+ showCompleted: showCompleted !== undefined ? showCompleted : user.today_settings?.showCompleted || true,
+ showProgressBar: true, // Always enabled - ignore any attempts to disable it
+ showDailyQuote: showDailyQuote !== undefined ? showDailyQuote : user.today_settings?.showDailyQuote || true
+ };
+
+ await user.update({ today_settings: todaySettings });
+
+ res.json({
+ success: true,
+ today_settings: todaySettings
+ });
+ } catch (error) {
+ console.error('Error updating today settings:', error);
+ res.status(500).json({ error: 'Internal server error' });
+ }
+});
+
module.exports = router;
\ No newline at end of file
diff --git a/backend/scripts/seed-dev-data.js b/backend/scripts/seed-dev-data.js
new file mode 100644
index 0000000..f8910f3
--- /dev/null
+++ b/backend/scripts/seed-dev-data.js
@@ -0,0 +1,18 @@
+#!/usr/bin/env node
+
+const path = require('path');
+const { seedDatabase } = require('../seeders/dev-seeder');
+
+// Set up the environment
+process.env.NODE_ENV = process.env.NODE_ENV || 'development';
+
+// Ensure we're using the correct database path
+if (!process.env.DATABASE_URL) {
+ process.env.DATABASE_URL = `sqlite:///${path.join(__dirname, '../db/development.sqlite3')}`;
+}
+
+console.log('🌱 Starting development data seeding...');
+console.log(`📁 Database: ${process.env.DATABASE_URL}`);
+console.log(`🌍 Environment: ${process.env.NODE_ENV}`);
+
+seedDatabase();
\ No newline at end of file
diff --git a/backend/scripts/test-telegram-duplicates.js b/backend/scripts/test-telegram-duplicates.js
deleted file mode 100755
index db25bcd..0000000
--- a/backend/scripts/test-telegram-duplicates.js
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/env node
-
-/**
- * Test runner script for Telegram duplicate prevention tests
- *
- * Usage:
- * node scripts/test-telegram-duplicates.js
- * npm run test:telegram-duplicates
- */
-
-const { execSync } = require('child_process');
-
-console.log('🔍 Running Telegram Duplicate Prevention Tests...\n');
-
-try {
- // Run the tests
- execSync('npm test -- --testPathPatterns="telegram.*test\\.js"', {
- stdio: 'inherit',
- cwd: process.cwd()
- });
-
- console.log('\n✅ All Telegram duplicate prevention tests passed!');
- console.log('\n📋 Test Coverage:');
- console.log(' • Unit Tests: Core functionality and utility functions');
- console.log(' • Integration Tests: Database interactions and state management');
- console.log(' • Scenario Tests: Real-world duplicate prevention scenarios');
- console.log(' • API Tests: Telegram route endpoints and authentication');
-
-} catch (error) {
- console.error('\n❌ Some tests failed. Please review the output above.');
- process.exit(1);
-}
\ No newline at end of file
diff --git a/backend/scripts/user-create.js b/backend/scripts/user-create.js
index 8ebe3a1..7e41d11 100755
--- a/backend/scripts/user-create.js
+++ b/backend/scripts/user-create.js
@@ -13,22 +13,33 @@ const bcrypt = require('bcrypt');
async function createUser() {
const [email, password] = process.argv.slice(2);
- if (!email || !password) {
+ if (!email || password === undefined) {
console.error('❌ Usage: npm run user:create ');
console.error('Example: npm run user:create admin@example.com mypassword123');
process.exit(1);
}
- // Basic email validation
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
- if (!emailRegex.test(email)) {
- console.error('❌ Invalid email format');
+ // Basic password validation (check for empty or short passwords)
+ if (!password || password.length < 6) {
+ console.error('❌ Password must be at least 6 characters long');
process.exit(1);
}
- // Basic password validation
- if (password.length < 6) {
- console.error('❌ Password must be at least 6 characters long');
+ // Enhanced email validation
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/;
+
+ // Check for common invalid patterns
+ if (!email.includes('@') ||
+ !email.includes('.') ||
+ email.includes('@@') ||
+ email.includes(' ') ||
+ email.startsWith('@') ||
+ email.endsWith('@') ||
+ email.endsWith('.') ||
+ email.includes('@.') ||
+ email.includes('.@') ||
+ !emailRegex.test(email)) {
+ console.error('❌ Invalid email format');
process.exit(1);
}
@@ -42,13 +53,13 @@ async function createUser() {
process.exit(1);
}
- // Hash the password
+ // Hash the password manually since the hook might not be working in this context
const hashedPassword = await bcrypt.hash(password, 10);
// Create the user
const user = await User.create({
email,
- password: hashedPassword
+ password_digest: hashedPassword
});
console.log('✅ User created successfully');
diff --git a/backend/seeders/dev-seeder.js b/backend/seeders/dev-seeder.js
new file mode 100644
index 0000000..3aac596
--- /dev/null
+++ b/backend/seeders/dev-seeder.js
@@ -0,0 +1,682 @@
+const { User, Area, Project, Task, Tag, Note, InboxItem } = require('../models');
+const bcrypt = require('bcrypt');
+const { createMassiveTaskData } = require('./massive-tasks');
+
+async function seedDatabase() {
+ try {
+ console.log('🌱 Starting database seeding...');
+
+ // Create SEPARATE test user for seeding (never overwrite existing users!)
+ console.log('👤 Creating separate test user for testing...');
+ const testEmail = 'test@tududi.com';
+
+ let testUser = await User.findOne({ where: { email: testEmail } });
+
+ if (!testUser) {
+ testUser = await User.create({
+ name: 'Test User',
+ email: testEmail,
+ password_digest: await bcrypt.hash('password123', 10),
+ appearance: 'light',
+ language: 'en',
+ timezone: 'Europe/Athens'
+ });
+ console.log('✅ Created new test user with ID:', testUser.id);
+ } else {
+ console.log('✅ Found existing test user with ID:', testUser.id);
+ // Clear ONLY the test user's data to refresh it
+ console.log('🧹 Clearing test user data for fresh seeding...');
+ await Task.destroy({ where: { user_id: testUser.id } });
+ await Project.destroy({ where: { user_id: testUser.id } });
+ await Area.destroy({ where: { user_id: testUser.id } });
+ await Tag.destroy({ where: { user_id: testUser.id } });
+ await Note.destroy({ where: { user_id: testUser.id } });
+ await InboxItem.destroy({ where: { user_id: testUser.id } });
+ }
+
+ // Create areas
+ console.log('📁 Creating areas...');
+ const areas = await Area.bulkCreate([
+ { name: 'Personal', user_id: testUser.id },
+ { name: 'Work', user_id: testUser.id },
+ { name: 'Health & Fitness', user_id: testUser.id },
+ { name: 'Learning', user_id: testUser.id },
+ { name: 'Home & Family', user_id: testUser.id },
+ { name: 'Finance', user_id: testUser.id },
+ { name: 'Travel', user_id: testUser.id },
+ { name: 'Hobbies', user_id: testUser.id },
+ { name: 'Social', user_id: testUser.id },
+ { name: 'Career', user_id: testUser.id }
+ ]);
+
+ // Create projects
+ console.log('📂 Creating projects...');
+ const projects = await Project.bulkCreate([
+ {
+ name: 'Website Redesign',
+ description: 'Complete overhaul of company website',
+ user_id: testUser.id,
+ area_id: areas[1].id,
+ active: true,
+ due_date_at: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000) // 30 days from now
+ },
+ {
+ name: 'Learn React Native',
+ description: 'Master mobile app development',
+ user_id: testUser.id,
+ area_id: areas[3].id,
+ active: true
+ },
+ {
+ name: 'Home Renovation',
+ description: 'Kitchen and bathroom updates',
+ user_id: testUser.id,
+ area_id: areas[4].id,
+ active: true,
+ due_date_at: new Date(Date.now() + 60 * 24 * 60 * 60 * 1000) // 60 days from now
+ },
+ {
+ name: 'Fitness Challenge',
+ description: '90-day fitness transformation',
+ user_id: testUser.id,
+ area_id: areas[2].id,
+ active: true,
+ due_date_at: new Date(Date.now() + 90 * 24 * 60 * 60 * 1000) // 90 days from now
+ },
+ {
+ name: 'Side Business',
+ description: 'Launch online consulting service',
+ user_id: testUser.id,
+ area_id: areas[1].id,
+ active: true
+ },
+ {
+ name: 'Investment Portfolio',
+ description: 'Build diversified investment portfolio',
+ user_id: testUser.id,
+ area_id: areas[5].id,
+ active: true,
+ due_date_at: new Date(Date.now() + 120 * 24 * 60 * 60 * 1000) // 120 days from now
+ },
+ {
+ name: 'Europe Trip 2024',
+ description: 'Plan and execute 3-week European vacation',
+ user_id: testUser.id,
+ area_id: areas[6].id,
+ active: true,
+ due_date_at: new Date(Date.now() + 180 * 24 * 60 * 60 * 1000) // 180 days from now
+ },
+ {
+ name: 'Photography Mastery',
+ description: 'Learn advanced photography techniques',
+ user_id: testUser.id,
+ area_id: areas[7].id,
+ active: true
+ },
+ {
+ name: 'Professional Certification',
+ description: 'Get AWS Solutions Architect certification',
+ user_id: testUser.id,
+ area_id: areas[9].id,
+ active: true,
+ due_date_at: new Date(Date.now() + 150 * 24 * 60 * 60 * 1000) // 150 days from now
+ },
+ {
+ name: 'Garden Makeover',
+ description: 'Transform backyard into productive garden',
+ user_id: testUser.id,
+ area_id: areas[4].id,
+ active: true,
+ due_date_at: new Date(Date.now() + 45 * 24 * 60 * 60 * 1000) // 45 days from now
+ },
+ {
+ name: 'Blog Launch',
+ description: 'Start personal tech blog',
+ user_id: testUser.id,
+ area_id: areas[0].id,
+ active: true
+ },
+ {
+ name: 'Language Learning Spanish',
+ description: 'Become conversational in Spanish',
+ user_id: testUser.id,
+ area_id: areas[3].id,
+ active: false // Paused project
+ },
+ {
+ name: 'Wedding Planning',
+ description: 'Plan and organize wedding ceremony',
+ user_id: testUser.id,
+ area_id: areas[8].id,
+ active: true,
+ due_date_at: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000) // 1 year from now
+ },
+ {
+ name: 'Meal Prep System',
+ description: 'Establish weekly meal preparation routine',
+ user_id: testUser.id,
+ area_id: areas[2].id,
+ active: true
+ },
+ {
+ name: 'Smart Home Setup',
+ description: 'Install and configure smart home devices',
+ user_id: testUser.id,
+ area_id: areas[4].id,
+ active: true,
+ due_date_at: new Date(Date.now() + 21 * 24 * 60 * 60 * 1000) // 21 days from now
+ }
+ ]);
+
+ // Create tags
+ console.log('🏷️ Creating tags...');
+ const tags = await Tag.bulkCreate([
+ { name: 'urgent', user_id: testUser.id },
+ { name: 'quick-win', user_id: testUser.id },
+ { name: 'research', user_id: testUser.id },
+ { name: 'meeting', user_id: testUser.id },
+ { name: 'creative', user_id: testUser.id },
+ { name: 'phone-call', user_id: testUser.id },
+ { name: 'online', user_id: testUser.id },
+ { name: 'weekend', user_id: testUser.id },
+ { name: 'shopping', user_id: testUser.id },
+ { name: 'admin', user_id: testUser.id },
+ { name: 'waiting-for', user_id: testUser.id },
+ { name: 'someday-maybe', user_id: testUser.id },
+ { name: 'high-energy', user_id: testUser.id },
+ { name: 'low-energy', user_id: testUser.id },
+ { name: 'collaboration', user_id: testUser.id },
+ { name: 'learning', user_id: testUser.id },
+ { name: 'maintenance', user_id: testUser.id },
+ { name: 'financial', user_id: testUser.id },
+ { name: 'health', user_id: testUser.id },
+ { name: 'outdoor', user_id: testUser.id },
+ { name: 'planning', user_id: testUser.id },
+ { name: 'review', user_id: testUser.id },
+ { name: 'automation', user_id: testUser.id },
+ { name: 'documentation', user_id: testUser.id },
+ { name: 'bug-fix', user_id: testUser.id }
+ ]);
+
+ // Helper function to get random date
+ const getRandomDate = (daysFromNow) => {
+ const randomDays = Math.floor(Math.random() * daysFromNow);
+ return new Date(Date.now() + randomDays * 24 * 60 * 60 * 1000);
+ };
+
+ const getPastDate = (daysAgo) => {
+ const randomDays = Math.floor(Math.random() * daysAgo);
+ return new Date(Date.now() - randomDays * 24 * 60 * 60 * 1000);
+ };
+
+ // Create tasks
+ console.log('✅ Creating massive task dataset...');
+ const taskData = createMassiveTaskData(projects, getRandomDate, getPastDate);
+
+ const tasks = [];
+ for (const taskInfo of taskData) {
+ const task = await Task.create({
+ ...taskInfo,
+ user_id: testUser.id,
+ note: taskInfo.note || null
+ });
+ tasks.push(task);
+ }
+
+ // Create additional backlog tasks with old creation dates for realistic metrics
+ console.log('📅 Creating backlog tasks with older dates...');
+ const backlogTaskNames = [
+ 'Organize old photo albums',
+ 'Learn French language basics',
+ 'Research retirement planning options',
+ 'Clean out basement storage',
+ 'Update professional portfolio',
+ 'Plan career development goals',
+ 'Research home security systems',
+ 'Organize digital file system',
+ 'Plan vacation for next year',
+ 'Research new investment strategies',
+ 'Update emergency preparedness kit',
+ 'Learn new cooking techniques',
+ 'Research sustainable living options',
+ 'Plan home office reorganization',
+ 'Update professional headshots',
+ 'Research online course options',
+ 'Plan garden landscaping project',
+ 'Research new technology trends',
+ 'Update financial planning documents',
+ 'Plan family history research',
+ 'Research health and wellness programs',
+ 'Plan hobby room organization',
+ 'Research eco-friendly home improvements',
+ 'Update professional networking',
+ 'Plan creative writing project',
+ 'Research mindfulness practices',
+ 'Plan workshop or shed organization',
+ 'Research travel planning tools',
+ 'Update subscription management',
+ 'Plan digital decluttering project'
+ ];
+
+ for (let i = 0; i < backlogTaskNames.length; i++) {
+ const daysAgo = Math.floor(Math.random() * 120) + 31; // 31-150 days ago
+ const oldDate = new Date(Date.now() - daysAgo * 24 * 60 * 60 * 1000);
+
+ const backlogTask = await Task.create({
+ name: backlogTaskNames[i],
+ priority: Math.floor(Math.random() * 3),
+ status: Math.random() < 0.9 ? 0 : 1, // 90% not started, 10% in progress
+ user_id: testUser.id,
+ project_id: Math.random() < 0.3 ? projects[Math.floor(Math.random() * projects.length)].id : null,
+ due_date: Math.random() < 0.2 ? getRandomDate(30) : null,
+ created_at: oldDate,
+ updated_at: oldDate
+ });
+ tasks.push(backlogTask);
+ }
+
+ // Create tasks due today for realistic "Due Today" section
+ console.log('📅 Creating tasks due today...');
+ const todayTaskNames = [
+ 'Submit weekly status report',
+ 'Call insurance company about claim',
+ 'Pick up prescription medication',
+ 'Schedule appointment with accountant',
+ 'Review and approve team proposals',
+ 'Prepare presentation slides for Monday',
+ 'Complete expense report submission',
+ 'Follow up on pending client emails',
+ 'Review contract terms and conditions',
+ 'Update project timeline document'
+ ];
+
+ const today = new Date();
+ today.setHours(0, 0, 0, 0); // Set to start of today
+
+ for (let i = 0; i < todayTaskNames.length; i++) {
+ const todayTask = await Task.create({
+ name: todayTaskNames[i],
+ priority: Math.floor(Math.random() * 3),
+ status: Math.random() < 0.8 ? 0 : 1, // 80% not started, 20% in progress
+ user_id: testUser.id,
+ project_id: Math.random() < 0.4 ? projects[Math.floor(Math.random() * projects.length)].id : null,
+ due_date: today,
+ created_at: getPastDate(7), // Created within last week
+ updated_at: getPastDate(7)
+ });
+ tasks.push(todayTask);
+ }
+
+ // Create intelligent task-tag associations
+ console.log('🔗 Creating intelligent task-tag associations...');
+
+ // Helper function to tag tasks based on keywords and patterns
+ const addIntelligentTags = async () => {
+ for (let i = 0; i < tasks.length; i++) {
+ const task = tasks[i];
+ const taskName = task.name.toLowerCase();
+ const taskTags = [];
+
+ // Pattern-based tagging for AI trigger recognition
+ if (taskName.includes('urgent') || taskName.includes('asap') || task.due_date && new Date(task.due_date) < new Date()) {
+ taskTags.push(tags[0]); // urgent
+ }
+
+ if (taskName.includes('call') || taskName.includes('phone')) {
+ taskTags.push(tags[5]); // phone-call
+ }
+
+ if (taskName.includes('meeting') || taskName.includes('standup') || taskName.includes('conference')) {
+ taskTags.push(tags[3]); // meeting
+ }
+
+ if (taskName.includes('research') || taskName.includes('study') || taskName.includes('learn')) {
+ taskTags.push(tags[2]); // research
+ taskTags.push(tags[15]); // learning
+ }
+
+ if (taskName.includes('buy') || taskName.includes('purchase') || taskName.includes('shop')) {
+ taskTags.push(tags[8]); // shopping
+ }
+
+ if (taskName.includes('design') || taskName.includes('create') || taskName.includes('write') || taskName.includes('paint')) {
+ taskTags.push(tags[4]); // creative
+ }
+
+ if (taskName.includes('health') || taskName.includes('doctor') || taskName.includes('medical') || taskName.includes('fitness') || taskName.includes('workout')) {
+ taskTags.push(tags[18]); // health
+ }
+
+ if (taskName.includes('financial') || taskName.includes('budget') || taskName.includes('invest') || taskName.includes('money') || taskName.includes('pay')) {
+ taskTags.push(tags[17]); // financial
+ }
+
+ if (taskName.includes('outdoor') || taskName.includes('garden') || taskName.includes('hiking') || taskName.includes('park')) {
+ taskTags.push(tags[19]); // outdoor
+ }
+
+ if (taskName.includes('plan') || taskName.includes('schedule') || taskName.includes('organize')) {
+ taskTags.push(tags[20]); // planning
+ }
+
+ if (taskName.includes('review') || taskName.includes('check') || taskName.includes('audit')) {
+ taskTags.push(tags[21]); // review
+ }
+
+ if (taskName.includes('fix') || taskName.includes('repair') || taskName.includes('maintain') || taskName.includes('clean')) {
+ taskTags.push(tags[16]); // maintenance
+ }
+
+ if (taskName.includes('weekend') || task.due_date && [0, 6].includes(new Date(task.due_date).getDay())) {
+ taskTags.push(tags[7]); // weekend
+ }
+
+ if (taskName.includes('online') || taskName.includes('website') || taskName.includes('digital') || taskName.includes('app')) {
+ taskTags.push(tags[6]); // online
+ }
+
+ if (task.status === 4) { // waiting status
+ taskTags.push(tags[10]); // waiting-for
+ }
+
+ if (task.priority === 0 && !task.due_date) {
+ taskTags.push(tags[11]); // someday-maybe
+ }
+
+ if (taskName.includes('team') || taskName.includes('group') || taskName.includes('collaborate')) {
+ taskTags.push(tags[14]); // collaboration
+ }
+
+ if (taskName.includes('quick') || taskName.includes('fast') || taskName.includes('simple')) {
+ taskTags.push(tags[1]); // quick-win
+ }
+
+ if (taskName.includes('energy') || taskName.includes('intensive') || taskName.includes('focus')) {
+ taskTags.push(tags[12]); // high-energy
+ }
+
+ if (taskName.includes('relax') || taskName.includes('easy') || taskName.includes('light')) {
+ taskTags.push(tags[13]); // low-energy
+ }
+
+ if (taskName.includes('automate') || taskName.includes('script') || taskName.includes('automation')) {
+ taskTags.push(tags[22]); // automation
+ }
+
+ if (taskName.includes('document') || taskName.includes('write') || taskName.includes('manual')) {
+ taskTags.push(tags[23]); // documentation
+ }
+
+ if (taskName.includes('bug') || taskName.includes('fix') || taskName.includes('error')) {
+ taskTags.push(tags[24]); // bug-fix
+ }
+
+ // Apply tags if any were identified
+ if (taskTags.length > 0) {
+ await task.setTags(taskTags);
+ }
+ }
+ };
+
+ await addIntelligentTags();
+
+ // Create task events for AI pattern learning
+ console.log('📊 Creating task events for AI pattern recognition...');
+ const TaskEventService = require('../services/taskEventService');
+
+ // Create events for completed tasks to show user patterns
+ const completedTasks = tasks.filter(t => t.status === 2);
+ for (const task of completedTasks.slice(0, 20)) { // Just first 20 to avoid too much data
+ try {
+ // Create task creation event
+ await TaskEventService.logTaskCreated(task.id, testUser.id, {
+ name: task.name,
+ status: 0,
+ priority: task.priority,
+ project_id: task.project_id
+ }, { source: 'web' });
+
+ // Create status change to in_progress
+ if (Math.random() < 0.7) { // 70% had in_progress phase
+ await TaskEventService.logStatusChange(task.id, testUser.id, 0, 1, { source: 'web' });
+ }
+
+ // Create completion event
+ await TaskEventService.logStatusChange(task.id, testUser.id, 1, 2, { source: 'web' });
+ } catch (eventError) {
+ console.log(`Skipping event creation for task ${task.id}: ${eventError.message}`);
+ }
+ }
+
+ // Create events for some in-progress tasks
+ const inProgressTasks = tasks.filter(t => t.status === 1);
+ for (const task of inProgressTasks.slice(0, 10)) {
+ try {
+ await TaskEventService.logTaskCreated(task.id, testUser.id, {
+ name: task.name,
+ status: 0,
+ priority: task.priority,
+ project_id: task.project_id
+ }, { source: 'web' });
+
+ await TaskEventService.logStatusChange(task.id, testUser.id, 0, 1, { source: 'web' });
+ } catch (eventError) {
+ console.log(`Skipping event creation for task ${task.id}: ${eventError.message}`);
+ }
+ }
+
+ // Create notes
+ console.log('📝 Creating notes...');
+ await Note.bulkCreate([
+ {
+ title: 'Meeting Notes - Website Redesign',
+ content: 'Key decisions:\n- Use blue and white color scheme\n- Include customer testimonials\n- Mobile-first approach\n- Launch date: End of next month\n\nAction items:\n- Get approval from stakeholders\n- Create prototype by Friday\n- Schedule user testing session',
+ user_id: testUser.id,
+ project_id: projects[0].id
+ },
+ {
+ title: 'React Native Learning Resources',
+ content: 'Useful links:\n- Official documentation\n- Expo.dev for quick prototyping\n- React Navigation library\n- AsyncStorage for local data\n\nTutorials to check out:\n- React Native School\n- The Net Ninja series\n- React Native Express',
+ user_id: testUser.id,
+ project_id: projects[1].id
+ },
+ {
+ title: 'Home Renovation Budget',
+ content: 'Budget breakdown:\n- Kitchen: $15,000\n- Bathroom: $8,000\n- Contingency: $3,000\n- Total: $26,000\n\nContractors to contact:\n- ABC Construction: 555-0123\n- Quality Home Builders: 555-0456\n- Elite Renovations: 555-0789',
+ user_id: testUser.id,
+ project_id: projects[2].id
+ },
+ {
+ title: 'Investment Strategy Notes',
+ content: 'Portfolio allocation goals:\n- 60% Stock index funds\n- 30% Bond index funds\n- 10% International funds\n\nPlatforms to consider:\n- Vanguard\n- Fidelity\n- Charles Schwab\n\nMonthly investment: $1,000',
+ user_id: testUser.id,
+ project_id: projects[5].id
+ },
+ {
+ title: 'Europe Trip Planning',
+ content: 'Destinations:\n1. Paris, France (5 days)\n2. Rome, Italy (4 days)\n3. Barcelona, Spain (4 days)\n4. Amsterdam, Netherlands (3 days)\n5. Prague, Czech Republic (3 days)\n\nEstimated costs:\n- Flights: $1,200\n- Hotels: $2,500\n- Food: $1,000\n- Activities: $800\n- Total: $5,500',
+ user_id: testUser.id,
+ project_id: projects[6].id
+ },
+ {
+ title: 'Photography Equipment Wishlist',
+ content: 'Camera gear to consider:\n- Canon EOS R6 Mark II\n- 24-70mm f/2.8 lens\n- 85mm f/1.8 portrait lens\n- Tripod: Manfrotto MT055CXPRO4\n- Editing software: Lightroom + Photoshop\n\nLearning resources:\n- Sean Tucker YouTube channel\n- Peter McKinnon tutorials\n- Local photography meetups',
+ user_id: testUser.id,
+ project_id: projects[7].id
+ },
+ {
+ title: 'Book Recommendations',
+ content: 'To read:\n- "Deep Work" by Cal Newport\n- "The Lean Startup" by Eric Ries\n- "Atomic Habits" by James Clear\n- "Clean Code" by Robert Martin\n- "The Psychology of Money" by Morgan Housel\n- "Educated" by Tara Westover\n- "Sapiens" by Yuval Noah Harari',
+ user_id: testUser.id
+ },
+ {
+ title: 'Recipe Ideas',
+ content: 'Meals to try:\n- Mediterranean quinoa bowl\n- Thai green curry\n- Homemade pizza\n- Greek lemon chicken\n- Mushroom risotto\n- Korean bulgogi\n- Mexican street corn salad\n- Indian butter chicken\n- Japanese ramen',
+ user_id: testUser.id
+ },
+ {
+ title: 'Business Ideas',
+ content: 'Potential side businesses:\n- Web development consulting\n- Online course creation\n- Photography services\n- Productivity coaching\n- Technical writing\n\nRevenue streams to explore:\n- Subscription services\n- One-time consulting\n- Product sales\n- Affiliate marketing',
+ user_id: testUser.id,
+ project_id: projects[4].id
+ },
+ {
+ title: 'Fitness Goals & Progress',
+ content: 'Current stats:\n- Weight: 180 lbs\n- Body fat: 18%\n- Bench press: 185 lbs\n- Squat: 225 lbs\n- Deadlift: 275 lbs\n\nGoals (90 days):\n- Weight: 175 lbs\n- Body fat: 15%\n- Bench press: 205 lbs\n- Squat: 255 lbs\n- Deadlift: 315 lbs',
+ user_id: testUser.id,
+ project_id: projects[3].id
+ },
+ {
+ title: 'Weekly Meal Prep Ideas',
+ content: 'Prep schedule:\nSunday: Protein prep (chicken, fish, tofu)\nMonday: Vegetable chopping\nWednesday: Mid-week refresh\n\nMeal rotation:\n- Breakfast: Overnight oats, egg muffins\n- Lunch: Buddha bowls, salads\n- Dinner: Stir-fries, sheet pan meals\n- Snacks: Greek yogurt, nuts, fruit',
+ user_id: testUser.id,
+ project_id: projects[13].id
+ },
+ {
+ title: 'Smart Home Device List',
+ content: 'Devices to install:\n- Smart thermostat (Nest)\n- Smart doorbell (Ring)\n- Smart locks (August)\n- Smart lights (Philips Hue)\n- Smart speakers (Echo Dot)\n- Security cameras (Arlo)\n- Smart switches (TP-Link Kasa)\n\nEstimated cost: $2,500\nInstallation timeline: 3 weeks',
+ user_id: testUser.id,
+ project_id: projects[14].id
+ }
+ ]);
+
+ // Create inbox items
+ console.log('📥 Creating inbox items...');
+ await InboxItem.bulkCreate([
+ {
+ content: 'Research new project management tools',
+ user_id: testUser.id,
+ processed: false
+ },
+ {
+ content: 'Plan team building activity for Q4',
+ user_id: testUser.id,
+ processed: false
+ },
+ {
+ content: 'Look into cloud storage solutions',
+ user_id: testUser.id,
+ processed: false
+ },
+ {
+ content: 'Consider learning TypeScript',
+ user_id: testUser.id,
+ processed: true
+ },
+ {
+ content: 'Update emergency contact information',
+ user_id: testUser.id,
+ processed: false
+ },
+ {
+ content: 'Research sustainable investing options',
+ user_id: testUser.id,
+ processed: false
+ },
+ {
+ content: 'Look into ergonomic desk setup',
+ user_id: testUser.id,
+ processed: false
+ },
+ {
+ content: 'Consider getting a pet',
+ user_id: testUser.id,
+ processed: false
+ },
+ {
+ content: 'Research meditation retreats',
+ user_id: testUser.id,
+ processed: false
+ },
+ {
+ content: 'Look into renewable energy for home',
+ user_id: testUser.id,
+ processed: false
+ },
+ {
+ content: 'Consider starting a podcast',
+ user_id: testUser.id,
+ processed: true
+ },
+ {
+ content: 'Research local volunteer opportunities',
+ user_id: testUser.id,
+ processed: false
+ },
+ {
+ content: 'Look into professional coaching',
+ user_id: testUser.id,
+ processed: false
+ },
+ {
+ content: 'Consider learning a musical instrument',
+ user_id: testUser.id,
+ processed: false
+ },
+ {
+ content: 'Research minimalism lifestyle',
+ user_id: testUser.id,
+ processed: true
+ },
+ {
+ content: 'Look into starting a garden',
+ user_id: testUser.id,
+ processed: false
+ },
+ {
+ content: 'Consider learning sign language',
+ user_id: testUser.id,
+ processed: false
+ },
+ {
+ content: 'Research passive income strategies',
+ user_id: testUser.id,
+ processed: false
+ },
+ {
+ content: 'Look into digital nomad lifestyle',
+ user_id: testUser.id,
+ processed: false
+ },
+ {
+ content: 'Consider getting professional headshots',
+ user_id: testUser.id,
+ processed: false
+ }
+ ]);
+
+ console.log('✨ Database seeding completed successfully!');
+ console.log(`📊 Created test data for SEPARATE test user:
+ - 1 test user (test@tududi.com / password123)
+ - ${areas.length} areas
+ - ${projects.length} projects
+ - ${tasks.length} tasks (including 30 backlog tasks and 10 due today)
+ - ${tags.length} tags
+ - 12 notes
+ - 20 inbox items`);
+
+ console.log('\n🚀 You can now:');
+ console.log('- Login with test@tududi.com / password123 to see test data');
+ console.log('- Your original account data is preserved and untouched');
+ console.log('- Explore the Today view with various task statuses');
+ console.log('- Test task editing, priority changes, etc.');
+ console.log('- View projects with different completion states');
+ console.log('- Test the task timeline feature');
+
+ } catch (error) {
+ console.error('❌ Error seeding database:', error);
+ }
+}
+
+module.exports = { seedDatabase };
+
+// Allow running directly
+if (require.main === module) {
+ seedDatabase().then(() => {
+ console.log('🏁 Seeding finished');
+ process.exit(0);
+ }).catch(error => {
+ console.error('💥 Seeding failed:', error);
+ process.exit(1);
+ });
+}
\ No newline at end of file
diff --git a/backend/seeders/expanded-tasks.js b/backend/seeders/expanded-tasks.js
new file mode 100644
index 0000000..6bf4989
--- /dev/null
+++ b/backend/seeders/expanded-tasks.js
@@ -0,0 +1,252 @@
+// Helper function to create expanded task data
+function createExpandedTaskData(projects, getRandomDate, getPastDate) {
+ return [
+ // Website Redesign Project Tasks (Project 0)
+ { name: 'Research competitor websites', project_id: projects[0].id, priority: 1, status: 2, completed_at: getPastDate(5) },
+ { name: 'Create wireframes for homepage', project_id: projects[0].id, priority: 2, status: 1 },
+ { name: 'Design new color palette', project_id: projects[0].id, priority: 1, status: 0 },
+ { name: 'Write content for About page', project_id: projects[0].id, priority: 1, status: 0 },
+ { name: 'Set up staging environment', project_id: projects[0].id, priority: 2, status: 0, due_date: getRandomDate(7) },
+ { name: 'Optimize images for web', project_id: projects[0].id, priority: 1, status: 0 },
+ { name: 'Implement responsive design', project_id: projects[0].id, priority: 2, status: 0 },
+ { name: 'Test cross-browser compatibility', project_id: projects[0].id, priority: 1, status: 0 },
+ { name: 'Setup Google Analytics', project_id: projects[0].id, priority: 1, status: 0 },
+ { name: 'Create contact form', project_id: projects[0].id, priority: 1, status: 0 },
+ { name: 'Write SEO meta descriptions', project_id: projects[0].id, priority: 1, status: 0 },
+ { name: 'Design mobile navigation', project_id: projects[0].id, priority: 2, status: 0 },
+ { name: 'Create footer section', project_id: projects[0].id, priority: 0, status: 0 },
+ { name: 'Add social media icons', project_id: projects[0].id, priority: 0, status: 0 },
+ { name: 'Setup SSL certificate', project_id: projects[0].id, priority: 2, status: 0, due_date: getRandomDate(5) },
+
+ // Learn React Native Project Tasks (Project 1)
+ { name: 'Complete React Native tutorial', project_id: projects[1].id, priority: 2, status: 1 },
+ { name: 'Build first mobile app', project_id: projects[1].id, priority: 2, status: 0 },
+ { name: 'Learn about navigation', project_id: projects[1].id, priority: 1, status: 0 },
+ { name: 'Study state management', project_id: projects[1].id, priority: 1, status: 0 },
+ { name: 'Practice with APIs', project_id: projects[1].id, priority: 1, status: 0 },
+ { name: 'Setup development environment', project_id: projects[1].id, priority: 2, status: 2, completed_at: getPastDate(10) },
+ { name: 'Learn about debugging tools', project_id: projects[1].id, priority: 1, status: 0 },
+ { name: 'Study push notifications', project_id: projects[1].id, priority: 1, status: 0 },
+ { name: 'Learn about app deployment', project_id: projects[1].id, priority: 1, status: 0 },
+ { name: 'Practice with AsyncStorage', project_id: projects[1].id, priority: 1, status: 0 },
+
+ // Home Renovation Project Tasks (Project 2)
+ { name: 'Get quotes from contractors', project_id: projects[2].id, priority: 2, status: 0, due_date: getRandomDate(14) },
+ { name: 'Choose kitchen tiles', project_id: projects[2].id, priority: 1, status: 0 },
+ { name: 'Order new appliances', project_id: projects[2].id, priority: 2, status: 0, due_date: getRandomDate(21) },
+ { name: 'Plan bathroom layout', project_id: projects[2].id, priority: 1, status: 0 },
+ { name: 'Select paint colors', project_id: projects[2].id, priority: 1, status: 1 },
+ { name: 'Research flooring options', project_id: projects[2].id, priority: 1, status: 2, completed_at: getPastDate(3) },
+ { name: 'Schedule plumbing inspection', project_id: projects[2].id, priority: 2, status: 0, due_date: getRandomDate(10) },
+ { name: 'Order cabinet hardware', project_id: projects[2].id, priority: 0, status: 0 },
+ { name: 'Plan electrical upgrades', project_id: projects[2].id, priority: 2, status: 0 },
+ { name: 'Choose lighting fixtures', project_id: projects[2].id, priority: 1, status: 0 },
+
+ // Fitness Challenge Project Tasks (Project 3)
+ { name: 'Create workout schedule', project_id: projects[3].id, priority: 2, status: 2, completed_at: getPastDate(10) },
+ { name: 'Track daily calories', project_id: projects[3].id, priority: 1, status: 1 },
+ { name: 'Join gym membership', project_id: projects[3].id, priority: 2, status: 2, completed_at: getPastDate(15) },
+ { name: 'Buy workout equipment', project_id: projects[3].id, priority: 1, status: 0 },
+ { name: 'Plan meal prep schedule', project_id: projects[3].id, priority: 1, status: 1 },
+ { name: 'Find workout buddy', project_id: projects[3].id, priority: 0, status: 0 },
+ { name: 'Set up fitness tracking app', project_id: projects[3].id, priority: 1, status: 2, completed_at: getPastDate(8) },
+ { name: 'Schedule body composition test', project_id: projects[3].id, priority: 1, status: 0, due_date: getRandomDate(7) },
+ { name: 'Research supplements', project_id: projects[3].id, priority: 0, status: 0 },
+ { name: 'Plan recovery routine', project_id: projects[3].id, priority: 1, status: 0 },
+
+ // Side Business Project Tasks (Project 4)
+ { name: 'Define service offerings', project_id: projects[4].id, priority: 2, status: 1 },
+ { name: 'Create business website', project_id: projects[4].id, priority: 2, status: 0 },
+ { name: 'Set up payment processing', project_id: projects[4].id, priority: 1, status: 0 },
+ { name: 'Network with potential clients', project_id: projects[4].id, priority: 1, status: 0 },
+ { name: 'Register business name', project_id: projects[4].id, priority: 2, status: 2, completed_at: getPastDate(12) },
+ { name: 'Open business bank account', project_id: projects[4].id, priority: 2, status: 0, due_date: getRandomDate(5) },
+ { name: 'Create marketing materials', project_id: projects[4].id, priority: 1, status: 0 },
+ { name: 'Set up accounting system', project_id: projects[4].id, priority: 1, status: 0 },
+ { name: 'Research competitors', project_id: projects[4].id, priority: 1, status: 1 },
+ { name: 'Create pricing strategy', project_id: projects[4].id, priority: 2, status: 0 },
+
+ // Investment Portfolio Project Tasks (Project 5)
+ { name: 'Research investment platforms', project_id: projects[5].id, priority: 2, status: 1 },
+ { name: 'Open brokerage account', project_id: projects[5].id, priority: 2, status: 0, due_date: getRandomDate(10) },
+ { name: 'Study different asset classes', project_id: projects[5].id, priority: 1, status: 0 },
+ { name: 'Set investment goals', project_id: projects[5].id, priority: 2, status: 2, completed_at: getPastDate(7) },
+ { name: 'Create risk assessment', project_id: projects[5].id, priority: 1, status: 1 },
+ { name: 'Research ETFs and mutual funds', project_id: projects[5].id, priority: 1, status: 0 },
+ { name: 'Set up automatic investing', project_id: projects[5].id, priority: 1, status: 0 },
+ { name: 'Learn about tax implications', project_id: projects[5].id, priority: 1, status: 0 },
+ { name: 'Create emergency fund', project_id: projects[5].id, priority: 2, status: 1 },
+ { name: 'Review portfolio monthly', project_id: projects[5].id, priority: 1, status: 0 },
+
+ // Europe Trip 2024 Project Tasks (Project 6)
+ { name: 'Research destinations', project_id: projects[6].id, priority: 2, status: 1 },
+ { name: 'Book flights', project_id: projects[6].id, priority: 2, status: 0, due_date: getRandomDate(30) },
+ { name: 'Reserve accommodations', project_id: projects[6].id, priority: 2, status: 0, due_date: getRandomDate(45) },
+ { name: 'Apply for passport renewal', project_id: projects[6].id, priority: 2, status: 0, due_date: getRandomDate(60) },
+ { name: 'Plan itinerary', project_id: projects[6].id, priority: 1, status: 0 },
+ { name: 'Research local customs', project_id: projects[6].id, priority: 0, status: 0 },
+ { name: 'Learn basic phrases', project_id: projects[6].id, priority: 0, status: 0 },
+ { name: 'Check visa requirements', project_id: projects[6].id, priority: 2, status: 0, due_date: getRandomDate(90) },
+ { name: 'Get travel insurance', project_id: projects[6].id, priority: 1, status: 0, due_date: getRandomDate(21) },
+ { name: 'Plan budget', project_id: projects[6].id, priority: 1, status: 1 },
+
+ // Photography Mastery Project Tasks (Project 7)
+ { name: 'Learn camera basics', project_id: projects[7].id, priority: 2, status: 2, completed_at: getPastDate(14) },
+ { name: 'Practice composition rules', project_id: projects[7].id, priority: 1, status: 1 },
+ { name: 'Study lighting techniques', project_id: projects[7].id, priority: 1, status: 0 },
+ { name: 'Learn photo editing', project_id: projects[7].id, priority: 1, status: 0 },
+ { name: 'Build portfolio', project_id: projects[7].id, priority: 1, status: 0 },
+ { name: 'Join photography community', project_id: projects[7].id, priority: 0, status: 0 },
+ { name: 'Experiment with different styles', project_id: projects[7].id, priority: 1, status: 0 },
+ { name: 'Learn about gear', project_id: projects[7].id, priority: 0, status: 0 },
+ { name: 'Practice street photography', project_id: projects[7].id, priority: 1, status: 0 },
+ { name: 'Study famous photographers', project_id: projects[7].id, priority: 0, status: 0 },
+
+ // Non-project tasks - Personal productivity and life management
+ { name: 'Call dentist for appointment', priority: 1, status: 0, due_date: getRandomDate(3) },
+ { name: 'Buy groceries for the week', priority: 0, status: 0 },
+ { name: 'Clean garage', priority: 0, status: 0 },
+ { name: 'Update resume', priority: 1, status: 0 },
+ { name: 'Read "Atomic Habits" book', priority: 0, status: 0 },
+ { name: 'Organize digital photos', priority: 0, status: 0 },
+ { name: 'Schedule car maintenance', priority: 1, status: 0, due_date: getRandomDate(7) },
+ { name: 'Plan weekend trip', priority: 0, status: 0 },
+ { name: 'Learn basic Spanish', priority: 0, status: 0 },
+ { name: 'Backup computer files', priority: 1, status: 0 },
+ { name: 'Donate old clothes', priority: 0, status: 0 },
+ { name: 'Research investment options', priority: 1, status: 0 },
+ { name: 'Call mom and dad', priority: 1, status: 0, due_date: getRandomDate(2) },
+ { name: 'Fix leaky faucet', priority: 0, status: 0 },
+ { name: 'Try new restaurant', priority: 0, status: 0 },
+ { name: 'Update LinkedIn profile', priority: 1, status: 0 },
+ { name: 'Review monthly expenses', priority: 1, status: 0, due_date: getRandomDate(5) },
+ { name: 'Organize desk workspace', priority: 0, status: 0 },
+ { name: 'Plan birthday party', priority: 1, status: 0 },
+ { name: 'Research new phone', priority: 0, status: 0 },
+ { name: 'Schedule eye exam', priority: 1, status: 0, due_date: getRandomDate(14) },
+ { name: 'Update emergency contacts', priority: 1, status: 0 },
+ { name: 'Clean out email inbox', priority: 0, status: 0 },
+ { name: 'Research vacation destinations', priority: 0, status: 0 },
+ { name: 'Update computer software', priority: 1, status: 0 },
+ { name: 'Plan meal prep for week', priority: 1, status: 0 },
+ { name: 'Research online courses', priority: 0, status: 0 },
+ { name: 'Update password manager', priority: 1, status: 0 },
+ { name: 'Organize physical documents', priority: 0, status: 0 },
+ { name: 'Research new coffee maker', priority: 0, status: 0 },
+ { name: 'Schedule oil change', priority: 1, status: 0, due_date: getRandomDate(10) },
+ { name: 'Plan gift for anniversary', priority: 1, status: 0 },
+ { name: 'Research home security system', priority: 0, status: 0 },
+ { name: 'Update will and testament', priority: 2, status: 0, due_date: getRandomDate(30) },
+ { name: 'Learn keyboard shortcuts', priority: 0, status: 0 },
+ { name: 'Research meditation apps', priority: 0, status: 0 },
+ { name: 'Plan date night', priority: 1, status: 0 },
+ { name: 'Research side income ideas', priority: 0, status: 0 },
+ { name: 'Update insurance policies', priority: 1, status: 0, due_date: getRandomDate(21) },
+ { name: 'Learn new cooking recipe', priority: 0, status: 0 },
+ { name: 'Research productivity tools', priority: 0, status: 0 },
+ { name: 'Plan garden for spring', priority: 0, status: 0 },
+ { name: 'Research home improvement ideas', priority: 0, status: 0 },
+ { name: 'Update social media profiles', priority: 0, status: 0 },
+ { name: 'Plan weekend activities', priority: 0, status: 0 },
+ { name: 'Research new podcast', priority: 0, status: 0 },
+ { name: 'Schedule annual checkup', priority: 1, status: 0, due_date: getRandomDate(45) },
+ { name: 'Learn new Excel functions', priority: 0, status: 0 },
+ { name: 'Research retirement planning', priority: 1, status: 0 },
+ { name: 'Plan family reunion', priority: 1, status: 0 },
+ { name: 'Research new book to read', priority: 0, status: 0 },
+ { name: 'Update contact information', priority: 0, status: 0 },
+ { name: 'Plan workout routine', priority: 1, status: 0 },
+
+ // Completed tasks for metrics - spread across different dates
+ { name: 'Pay monthly bills', priority: 1, status: 2, completed_at: getPastDate(1) },
+ { name: 'Submit expense reports', priority: 1, status: 2, completed_at: getPastDate(1) },
+ { name: 'Weekly team meeting', priority: 1, status: 2, completed_at: getPastDate(2) },
+ { name: 'Review project proposal', priority: 2, status: 2, completed_at: getPastDate(3) },
+ { name: 'Update LinkedIn profile', priority: 0, status: 2, completed_at: getPastDate(4) },
+ { name: 'Clean kitchen', priority: 0, status: 2, completed_at: getPastDate(5) },
+ { name: 'Water plants', priority: 0, status: 2, completed_at: getPastDate(6) },
+ { name: 'Grocery shopping', priority: 1, status: 2, completed_at: getPastDate(1) },
+ { name: 'Call insurance company', priority: 1, status: 2, completed_at: getPastDate(2) },
+ { name: 'Send birthday card', priority: 0, status: 2, completed_at: getPastDate(3) },
+ { name: 'Fix printer issue', priority: 1, status: 2, completed_at: getPastDate(1) },
+ { name: 'Review budget', priority: 1, status: 2, completed_at: getPastDate(4) },
+ { name: 'Attend networking event', priority: 1, status: 2, completed_at: getPastDate(5) },
+ { name: 'Complete online training', priority: 1, status: 2, completed_at: getPastDate(6) },
+ { name: 'Schedule vet appointment', priority: 1, status: 2, completed_at: getPastDate(2) },
+ { name: 'Buy gift for colleague', priority: 0, status: 2, completed_at: getPastDate(3) },
+ { name: 'Update calendar', priority: 0, status: 2, completed_at: getPastDate(1) },
+ { name: 'Research vacation spots', priority: 0, status: 2, completed_at: getPastDate(4) },
+ { name: 'Backup important files', priority: 1, status: 2, completed_at: getPastDate(5) },
+ { name: 'Clean bathroom', priority: 0, status: 2, completed_at: getPastDate(1) },
+
+ // Recurring tasks
+ {
+ name: 'Daily standup meeting',
+ priority: 1,
+ status: 0,
+ recurrence_type: 'daily',
+ recurrence_interval: 1,
+ due_date: new Date(),
+ project_id: projects[0].id
+ },
+ {
+ name: 'Weekly grocery shopping',
+ priority: 1,
+ status: 0,
+ recurrence_type: 'weekly',
+ recurrence_interval: 1,
+ recurrence_weekday: 6, // Saturday
+ due_date: getRandomDate(7)
+ },
+ {
+ name: 'Monthly budget review',
+ priority: 2,
+ status: 0,
+ recurrence_type: 'monthly',
+ recurrence_interval: 1,
+ recurrence_month_day: 1,
+ due_date: getRandomDate(30)
+ },
+ {
+ name: 'Weekly meal prep',
+ priority: 1,
+ status: 0,
+ recurrence_type: 'weekly',
+ recurrence_interval: 1,
+ recurrence_weekday: 0, // Sunday
+ due_date: getRandomDate(7)
+ },
+ {
+ name: 'Daily workout',
+ priority: 1,
+ status: 0,
+ recurrence_type: 'daily',
+ recurrence_interval: 1,
+ due_date: new Date(),
+ project_id: projects[3].id
+ },
+ {
+ name: 'Weekly house cleaning',
+ priority: 1,
+ status: 0,
+ recurrence_type: 'weekly',
+ recurrence_interval: 1,
+ recurrence_weekday: 6, // Saturday
+ due_date: getRandomDate(7)
+ },
+
+ // Waiting and someday tasks
+ { name: 'Wait for contractor estimate', priority: 1, status: 4, project_id: projects[2].id },
+ { name: 'Learn advanced photography', priority: 0, status: 0 },
+ { name: 'Write a book', priority: 0, status: 0 },
+ { name: 'Learn to play guitar', priority: 0, status: 0 },
+ { name: 'Take pottery class', priority: 0, status: 0 },
+ { name: 'Visit Japan', priority: 0, status: 0 },
+ { name: 'Learn rock climbing', priority: 0, status: 0 },
+ { name: 'Start a podcast', priority: 0, status: 0 },
+ { name: 'Learn wine tasting', priority: 0, status: 0 },
+ { name: 'Take dance lessons', priority: 0, status: 0 }
+ ];
+}
+
+module.exports = { createExpandedTaskData };
\ No newline at end of file
diff --git a/backend/seeders/massive-tasks.js b/backend/seeders/massive-tasks.js
new file mode 100644
index 0000000..8d5caf8
--- /dev/null
+++ b/backend/seeders/massive-tasks.js
@@ -0,0 +1,631 @@
+// Helper function to create massive task data with AI feature triggers
+function createMassiveTaskData(projects, getRandomDate, getPastDate) {
+ // Helper to get random items from array
+ const getRandomItems = (arr, count) => {
+ const shuffled = [...arr].sort(() => 0.5 - Math.random());
+ return shuffled.slice(0, count);
+ };
+
+ // Helper to get random priority
+ const getRandomPriority = () => Math.floor(Math.random() * 3); // 0, 1, or 2
+
+ // Helper to get random status
+ const getRandomStatus = () => {
+ const statuses = [0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4]; // More weighted towards active tasks
+ return statuses[Math.floor(Math.random() * statuses.length)];
+ };
+
+ // Productivity and work tasks
+ const workTasks = [
+ 'Review quarterly performance metrics',
+ 'Update project documentation',
+ 'Prepare presentation for board meeting',
+ 'Conduct code review for new feature',
+ 'Write technical specification document',
+ 'Schedule one-on-one meetings with team',
+ 'Update project timeline and milestones',
+ 'Research new development tools',
+ 'Optimize database queries',
+ 'Create automated testing suite',
+ 'Refactor legacy code modules',
+ 'Implement security audit recommendations',
+ 'Design API documentation',
+ 'Setup continuous integration pipeline',
+ 'Create user acceptance testing plan',
+ 'Migrate data to new system',
+ 'Setup monitoring and alerting',
+ 'Write deployment procedures',
+ 'Create backup and recovery plan',
+ 'Conduct performance testing',
+ 'Update coding standards documentation',
+ 'Setup development environment',
+ 'Create onboarding documentation',
+ 'Review and update dependencies',
+ 'Implement feature toggles',
+ 'Setup load balancing',
+ 'Create disaster recovery plan',
+ 'Conduct security penetration testing',
+ 'Setup SSL certificates',
+ 'Implement caching strategy',
+ 'Create analytics dashboard',
+ 'Setup error tracking',
+ 'Implement rate limiting',
+ 'Create API versioning strategy',
+ 'Setup database replication',
+ 'Implement search functionality',
+ 'Create notification system',
+ 'Setup file upload handling',
+ 'Implement user authentication',
+ 'Create password reset functionality',
+ 'Setup email templates',
+ 'Implement data validation',
+ 'Create audit logging',
+ 'Setup health checks',
+ 'Implement graceful shutdowns'
+ ];
+
+ // Personal development and learning tasks
+ const learningTasks = [
+ 'Complete online course on machine learning',
+ 'Read "Clean Architecture" book',
+ 'Practice coding challenges on LeetCode',
+ 'Learn advanced Git techniques',
+ 'Study microservices architecture',
+ 'Complete Docker certification',
+ 'Learn Kubernetes fundamentals',
+ 'Study system design patterns',
+ 'Practice algorithm problems',
+ 'Learn about database optimization',
+ 'Study network security principles',
+ 'Complete AWS certification',
+ 'Learn about blockchain technology',
+ 'Study DevOps best practices',
+ 'Learn advanced JavaScript features',
+ 'Study React performance optimization',
+ 'Learn about GraphQL',
+ 'Study mobile app development',
+ 'Learn about AI and neural networks',
+ 'Study cloud computing concepts',
+ 'Learn about containerization',
+ 'Study API design principles',
+ 'Learn about testing strategies',
+ 'Study agile methodologies',
+ 'Learn about project management',
+ 'Study user experience design',
+ 'Learn about data visualization',
+ 'Study cybersecurity fundamentals',
+ 'Learn about scalability patterns',
+ 'Study database design principles'
+ ];
+
+ // Health and fitness tasks
+ const healthTasks = [
+ 'Schedule annual physical exam',
+ 'Book dental cleaning appointment',
+ 'Schedule eye exam',
+ 'Get blood work done',
+ 'Schedule dermatologist appointment',
+ 'Book massage therapy session',
+ 'Schedule physical therapy session',
+ 'Get flu vaccination',
+ 'Schedule mammogram',
+ 'Book nutrition consultation',
+ 'Schedule mental health counseling',
+ 'Get hearing test',
+ 'Schedule chiropractor appointment',
+ 'Book acupuncture session',
+ 'Schedule sleep study',
+ 'Get allergy testing done',
+ 'Schedule colonoscopy',
+ 'Book podiatrist appointment',
+ 'Schedule orthopedic consultation',
+ 'Get heart health screening',
+ 'Complete 30-minute cardio workout',
+ 'Do strength training session',
+ 'Practice yoga for 45 minutes',
+ 'Go for 5-mile run',
+ 'Complete HIIT workout',
+ 'Do pilates session',
+ 'Practice meditation for 20 minutes',
+ 'Track daily water intake',
+ 'Meal prep for the week',
+ 'Plan healthy breakfast options',
+ 'Research new workout routines',
+ 'Update fitness goals',
+ 'Track daily steps (10,000 goal)',
+ 'Practice breathing exercises',
+ 'Do stretching routine',
+ 'Plan weekly workout schedule',
+ 'Research healthy recipes',
+ 'Update meal planning app',
+ 'Schedule workout with trainer',
+ 'Join new fitness class'
+ ];
+
+ // Home and family tasks
+ const homeTasks = [
+ 'Deep clean living room',
+ 'Organize bedroom closet',
+ 'Clean out garage',
+ 'Wash and fold laundry',
+ 'Vacuum all carpets',
+ 'Mop kitchen and bathroom floors',
+ 'Clean windows inside and out',
+ 'Organize pantry and kitchen cabinets',
+ 'Clean out refrigerator',
+ 'Wash bedsheets and pillowcases',
+ 'Dust all furniture',
+ 'Clean bathroom thoroughly',
+ 'Organize home office',
+ 'Sort through old documents',
+ 'Clean out car interior',
+ 'Wash car exterior',
+ 'Organize basement storage',
+ 'Clean air conditioning filters',
+ 'Test smoke detector batteries',
+ 'Check and clean gutters',
+ 'Trim bushes and hedges',
+ 'Water indoor plants',
+ 'Plant vegetables in garden',
+ 'Mow lawn and edge walkways',
+ 'Repair leaky faucet',
+ 'Fix squeaky door hinges',
+ 'Replace burnt out light bulbs',
+ 'Caulk bathroom tiles',
+ 'Touch up paint on walls',
+ 'Clean grout in shower',
+ 'Organize tool shed',
+ 'Season cast iron cookware',
+ 'Clean oven and stovetop',
+ 'Descale coffee maker',
+ 'Clean dishwasher filter',
+ 'Replace water filter',
+ 'Clean dryer vent',
+ 'Organize medicine cabinet',
+ 'Check expiration dates on medications',
+ 'Update emergency contact list'
+ ];
+
+ // Financial and administrative tasks
+ const financialTasks = [
+ 'Review monthly budget',
+ 'Pay credit card bills',
+ 'Transfer money to savings',
+ 'Update investment portfolio',
+ 'Review insurance policies',
+ 'File tax documents',
+ 'Update will and testament',
+ 'Review retirement contributions',
+ 'Check credit report',
+ 'Update beneficiary information',
+ 'Review bank statements',
+ 'Cancel unused subscriptions',
+ 'Negotiate lower cable bill',
+ 'Shop for better car insurance',
+ 'Review cell phone plan',
+ 'Update emergency fund',
+ 'Research investment options',
+ 'Meet with financial advisor',
+ 'Review mortgage rates',
+ 'Update home insurance',
+ 'File warranty claims',
+ 'Organize receipts for taxes',
+ 'Update accounting software',
+ 'Review business expenses',
+ 'Pay quarterly taxes',
+ 'Update PayPal account',
+ 'Review online banking security',
+ 'Setup automatic bill pay',
+ 'Research high-yield savings',
+ 'Update direct deposit info'
+ ];
+
+ // Social and relationship tasks
+ const socialTasks = [
+ 'Call parents to check in',
+ 'Send birthday card to friend',
+ 'Plan date night with partner',
+ 'Schedule coffee with colleague',
+ 'Write thank you note',
+ 'Plan family reunion',
+ 'Organize game night with friends',
+ 'Send holiday cards',
+ 'Plan surprise party',
+ 'Schedule lunch with mentor',
+ 'Join local community group',
+ 'Volunteer at local charity',
+ 'Attend networking event',
+ 'Plan weekend getaway',
+ 'Organize book club meeting',
+ 'Schedule video call with family',
+ 'Plan group hiking trip',
+ 'Organize potluck dinner',
+ 'Plan movie night',
+ 'Schedule catch-up with old friend',
+ 'Write recommendation letter',
+ 'Plan anniversary celebration',
+ 'Organize children\'s playdate',
+ 'Schedule babysitter',
+ 'Plan family photo session',
+ 'Organize neighborhood BBQ',
+ 'Plan holiday gathering',
+ 'Schedule couple\'s therapy',
+ 'Plan birthday celebration',
+ 'Organize team building activity'
+ ];
+
+ // Creative and hobby tasks
+ const creativeeTasks = [
+ 'Practice guitar for 30 minutes',
+ 'Work on oil painting',
+ 'Write in journal',
+ 'Take photography workshop',
+ 'Learn new recipe',
+ 'Practice calligraphy',
+ 'Work on knitting project',
+ 'Write short story',
+ 'Learn new song on piano',
+ 'Practice drawing portraits',
+ 'Work on pottery project',
+ 'Edit video footage',
+ 'Write blog post',
+ 'Practice singing',
+ 'Work on woodworking project',
+ 'Learn new dance moves',
+ 'Practice photography techniques',
+ 'Work on scrapbook',
+ 'Write poetry',
+ 'Learn origami',
+ 'Practice sketching',
+ 'Work on embroidery',
+ 'Learn new cooking technique',
+ 'Practice watercolor painting',
+ 'Work on jewelry making',
+ 'Learn magic tricks',
+ 'Practice stand-up comedy',
+ 'Work on graphic design',
+ 'Learn new language phrases',
+ 'Practice mindful writing'
+ ];
+
+ // Travel and adventure tasks
+ const travelTasks = [
+ 'Research vacation destinations',
+ 'Book flight tickets',
+ 'Reserve hotel accommodation',
+ 'Plan daily itinerary',
+ 'Apply for passport renewal',
+ 'Get travel insurance',
+ 'Exchange currency',
+ 'Pack suitcase',
+ 'Check visa requirements',
+ 'Update travel emergency contacts',
+ 'Download offline maps',
+ 'Research local customs',
+ 'Learn basic phrases',
+ 'Book airport parking',
+ 'Arrange pet sitting',
+ 'Stop mail delivery',
+ 'Set house security system',
+ 'Pack travel first aid kit',
+ 'Research local restaurants',
+ 'Book tours and activities',
+ 'Print boarding passes',
+ 'Check weather forecast',
+ 'Pack travel documents',
+ 'Arrange airport transportation',
+ 'Update travel blog'
+ ];
+
+ // All task categories combined
+ const allTaskCategories = [
+ ...workTasks,
+ ...learningTasks,
+ ...healthTasks,
+ ...homeTasks,
+ ...financialTasks,
+ ...socialTasks,
+ ...creativeeTasks,
+ ...travelTasks
+ ];
+
+ // Create base task data with existing project tasks
+ const baseTaskData = [
+ // Website Redesign Project (triggers collaboration, urgent deadlines)
+ { name: 'Research competitor websites', project_id: projects[0].id, priority: 1, status: 2, completed_at: getPastDate(5) },
+ { name: 'Create wireframes for homepage', project_id: projects[0].id, priority: 2, status: 1 },
+ { name: 'Design new color palette', project_id: projects[0].id, priority: 1, status: 0 },
+ { name: 'Write content for About page', project_id: projects[0].id, priority: 1, status: 0 },
+ { name: 'Set up staging environment', project_id: projects[0].id, priority: 2, status: 0, due_date: getRandomDate(3) }, // Urgent deadline
+ { name: 'Optimize images for web', project_id: projects[0].id, priority: 1, status: 0 },
+ { name: 'Implement responsive design', project_id: projects[0].id, priority: 2, status: 0, due_date: getRandomDate(7) },
+ { name: 'Test cross-browser compatibility', project_id: projects[0].id, priority: 1, status: 0 },
+ { name: 'Setup Google Analytics', project_id: projects[0].id, priority: 1, status: 0 },
+ { name: 'Create contact form', project_id: projects[0].id, priority: 1, status: 0 },
+ { name: 'Write SEO meta descriptions', project_id: projects[0].id, priority: 1, status: 0 },
+ { name: 'Design mobile navigation', project_id: projects[0].id, priority: 2, status: 0 },
+ { name: 'Create footer section', project_id: projects[0].id, priority: 0, status: 0 },
+ { name: 'Add social media icons', project_id: projects[0].id, priority: 0, status: 0 },
+ { name: 'Setup SSL certificate', project_id: projects[0].id, priority: 2, status: 0, due_date: getRandomDate(2) }, // Very urgent
+
+ // Europe Trip 2024 - triggers travel planning AI features
+ { name: 'Research flight options to Paris', project_id: projects[6].id, priority: 2, status: 1 },
+ { name: 'Book hotel in Rome', project_id: projects[6].id, priority: 2, status: 0, due_date: getRandomDate(14) },
+ { name: 'Apply for European travel insurance', project_id: projects[6].id, priority: 2, status: 0, due_date: getRandomDate(30) },
+ { name: 'Learn basic Italian phrases', project_id: projects[6].id, priority: 1, status: 0 },
+ { name: 'Research train routes between cities', project_id: projects[6].id, priority: 1, status: 0 },
+ { name: 'Plan museum visits in Paris', project_id: projects[6].id, priority: 1, status: 0 },
+ { name: 'Book restaurant reservations', project_id: projects[6].id, priority: 1, status: 0 },
+ { name: 'Pack European travel adapter', project_id: projects[6].id, priority: 0, status: 0 },
+
+ // Fitness Challenge - triggers health/wellness AI features
+ { name: 'Track daily protein intake', project_id: projects[3].id, priority: 1, status: 1 },
+ { name: 'Complete morning cardio workout', project_id: projects[3].id, priority: 1, status: 2, completed_at: getPastDate(1) },
+ { name: 'Plan weekly meal prep', project_id: projects[3].id, priority: 1, status: 0 },
+ { name: 'Schedule body composition scan', project_id: projects[3].id, priority: 1, status: 0, due_date: getRandomDate(7) },
+ { name: 'Research new workout routines', project_id: projects[3].id, priority: 0, status: 0 },
+ { name: 'Update fitness tracker goals', project_id: projects[3].id, priority: 1, status: 0 },
+
+ // Investment Portfolio - triggers financial AI features
+ { name: 'Research ESG investment options', project_id: projects[5].id, priority: 1, status: 0 },
+ { name: 'Rebalance portfolio allocation', project_id: projects[5].id, priority: 2, status: 0, due_date: getRandomDate(5) },
+ { name: 'Review quarterly performance', project_id: projects[5].id, priority: 1, status: 1 },
+ { name: 'Set up automatic dividend reinvestment', project_id: projects[5].id, priority: 1, status: 0 },
+ { name: 'Research international market exposure', project_id: projects[5].id, priority: 0, status: 0 },
+
+ // Side Business - triggers entrepreneurship AI features
+ { name: 'Create business plan document', project_id: projects[4].id, priority: 2, status: 1 },
+ { name: 'Research target market demographics', project_id: projects[4].id, priority: 2, status: 0 },
+ { name: 'Design logo and branding', project_id: projects[4].id, priority: 1, status: 0 },
+ { name: 'Setup business social media accounts', project_id: projects[4].id, priority: 1, status: 0 },
+ { name: 'Register domain name', project_id: projects[4].id, priority: 2, status: 2, completed_at: getPastDate(3) },
+ { name: 'Create pricing strategy', project_id: projects[4].id, priority: 2, status: 0 },
+ { name: 'Draft service agreements', project_id: projects[4].id, priority: 1, status: 0 },
+
+ // Home Renovation - triggers home improvement AI features
+ { name: 'Get electrical work permit', project_id: projects[2].id, priority: 2, status: 0, due_date: getRandomDate(10) },
+ { name: 'Choose bathroom tile pattern', project_id: projects[2].id, priority: 1, status: 1 },
+ { name: 'Schedule plumbing inspection', project_id: projects[2].id, priority: 2, status: 0, due_date: getRandomDate(14) },
+ { name: 'Order kitchen countertops', project_id: projects[2].id, priority: 2, status: 0, due_date: getRandomDate(21) },
+ { name: 'Research energy-efficient appliances', project_id: projects[2].id, priority: 1, status: 0 },
+ { name: 'Plan kitchen lighting layout', project_id: projects[2].id, priority: 1, status: 0 },
+
+ // Photography Mastery - triggers creative learning AI features
+ { name: 'Practice portrait lighting techniques', project_id: projects[7].id, priority: 1, status: 1 },
+ { name: 'Edit last weekend\'s photo shoot', project_id: projects[7].id, priority: 1, status: 0 },
+ { name: 'Research local photography groups', project_id: projects[7].id, priority: 0, status: 0 },
+ { name: 'Plan golden hour photo session', project_id: projects[7].id, priority: 1, status: 0 },
+ { name: 'Learn advanced Lightroom techniques', project_id: projects[7].id, priority: 1, status: 0 },
+
+ // Smart Home Setup - triggers technology AI features
+ { name: 'Install smart thermostat', project_id: projects[14].id, priority: 2, status: 1 },
+ { name: 'Configure home security system', project_id: projects[14].id, priority: 2, status: 0, due_date: getRandomDate(7) },
+ { name: 'Setup voice assistant routines', project_id: projects[14].id, priority: 1, status: 0 },
+ { name: 'Install smart door locks', project_id: projects[14].id, priority: 2, status: 0 },
+ { name: 'Configure automated lighting', project_id: projects[14].id, priority: 1, status: 0 },
+
+ // Blog Launch - triggers content creation AI features
+ { name: 'Write first blog post about productivity', project_id: projects[10].id, priority: 2, status: 1 },
+ { name: 'Design blog layout and theme', project_id: projects[10].id, priority: 1, status: 0 },
+ { name: 'Setup email newsletter signup', project_id: projects[10].id, priority: 1, status: 0 },
+ { name: 'Research SEO keywords for niche', project_id: projects[10].id, priority: 1, status: 0 },
+ { name: 'Create content calendar for 3 months', project_id: projects[10].id, priority: 2, status: 0 },
+
+ // Professional Certification - triggers career development AI features
+ { name: 'Complete AWS practice exams', project_id: projects[8].id, priority: 2, status: 1 },
+ { name: 'Schedule certification exam', project_id: projects[8].id, priority: 2, status: 0, due_date: getRandomDate(30) },
+ { name: 'Review cloud architecture patterns', project_id: projects[8].id, priority: 1, status: 0 },
+ { name: 'Practice hands-on labs', project_id: projects[8].id, priority: 1, status: 1 },
+ { name: 'Join AWS study group', project_id: projects[8].id, priority: 0, status: 0 },
+
+ // Meal Prep System - triggers nutrition AI features
+ { name: 'Plan balanced weekly menu', project_id: projects[13].id, priority: 1, status: 1 },
+ { name: 'Prep vegetables for the week', project_id: projects[13].id, priority: 1, status: 0 },
+ { name: 'Cook batch of protein sources', project_id: projects[13].id, priority: 1, status: 0 },
+ { name: 'Calculate macronutrient ratios', project_id: projects[13].id, priority: 1, status: 0 },
+ { name: 'Research meal prep containers', project_id: projects[13].id, priority: 0, status: 0 },
+
+ // Wedding Planning - triggers event planning AI features
+ { name: 'Book wedding venue', project_id: projects[12].id, priority: 2, status: 2, completed_at: getPastDate(30) },
+ { name: 'Send save the date cards', project_id: projects[12].id, priority: 2, status: 0, due_date: getRandomDate(60) },
+ { name: 'Book wedding photographer', project_id: projects[12].id, priority: 2, status: 0, due_date: getRandomDate(45) },
+ { name: 'Choose wedding cake flavors', project_id: projects[12].id, priority: 1, status: 0 },
+ { name: 'Plan seating arrangement', project_id: projects[12].id, priority: 1, status: 0 },
+ { name: 'Book honeymoon flights', project_id: projects[12].id, priority: 1, status: 0 },
+
+ // Garden Makeover - triggers gardening/sustainability AI features
+ { name: 'Plan vegetable garden layout', project_id: projects[9].id, priority: 1, status: 1 },
+ { name: 'Order seeds for spring planting', project_id: projects[9].id, priority: 2, status: 0, due_date: getRandomDate(14) },
+ { name: 'Install drip irrigation system', project_id: projects[9].id, priority: 1, status: 0 },
+ { name: 'Build raised garden beds', project_id: projects[9].id, priority: 2, status: 0 },
+ { name: 'Research companion planting', project_id: projects[9].id, priority: 0, status: 0 }
+ ];
+
+ // Generate massive additional tasks
+ const massiveTasks = [];
+
+ // Add random tasks from all categories (including old tasks for backlog)
+ for (let i = 0; i < 150; i++) {
+ const taskName = allTaskCategories[Math.floor(Math.random() * allTaskCategories.length)];
+ const hasProject = Math.random() < 0.4; // 40% chance of having a project
+ const hasDueDate = Math.random() < 0.3; // 30% chance of having a due date
+ const isCompleted = Math.random() < 0.08; // 8% chance of being completed
+
+ const task = {
+ name: taskName,
+ priority: getRandomPriority(),
+ status: isCompleted ? 2 : getRandomStatus(),
+ note: Math.random() < 0.1 ? 'Added some notes during planning phase' : null
+ };
+
+ if (hasProject) {
+ task.project_id = projects[Math.floor(Math.random() * projects.length)].id;
+ }
+
+ if (hasDueDate) {
+ if (Math.random() < 0.2) {
+ // 20% chance of overdue task (AI should flag these)
+ task.due_date = getPastDate(Math.floor(Math.random() * 30) + 1);
+ } else {
+ // Future due date
+ task.due_date = getRandomDate(Math.floor(Math.random() * 60) + 1);
+ }
+ }
+
+ if (isCompleted) {
+ task.completed_at = getPastDate(Math.floor(Math.random() * 30) + 1);
+ }
+
+ massiveTasks.push(task);
+ }
+
+ // Add specific AI trigger tasks (tasks that should trigger intelligent suggestions)
+ const aiTriggerTasks = [
+ // Overdue tasks (AI should suggest prioritizing)
+ { name: 'Submit tax documents', priority: 2, status: 0, due_date: getPastDate(5) },
+ { name: 'Renew car registration', priority: 2, status: 0, due_date: getPastDate(3) },
+ { name: 'Pay property taxes', priority: 2, status: 0, due_date: getPastDate(10) },
+ { name: 'Submit insurance claim', priority: 2, status: 0, due_date: getPastDate(7) },
+
+ // High-priority tasks with near deadlines (AI should suggest immediate action)
+ { name: 'Prepare presentation for CEO', priority: 2, status: 0, due_date: getRandomDate(1) },
+ { name: 'Submit project proposal', priority: 2, status: 0, due_date: getRandomDate(2) },
+ { name: 'Complete performance review', priority: 2, status: 0, due_date: getRandomDate(3) },
+
+ // Health-related tasks (AI should suggest wellness patterns)
+ { name: 'Schedule annual checkup', priority: 1, status: 0 },
+ { name: 'Get eye exam', priority: 1, status: 0 },
+ { name: 'Book dental cleaning', priority: 1, status: 0 },
+ { name: 'Update prescription medications', priority: 1, status: 0 },
+
+ // Financial tasks (AI should suggest money management)
+ { name: 'Review investment portfolio', priority: 1, status: 0 },
+ { name: 'Update budget spreadsheet', priority: 1, status: 0 },
+ { name: 'Research high-yield savings accounts', priority: 0, status: 0 },
+ { name: 'Review insurance coverage', priority: 1, status: 0 },
+
+ // Learning tasks (AI should suggest skill development)
+ { name: 'Complete Python course', priority: 1, status: 1 },
+ { name: 'Read industry publication', priority: 0, status: 0 },
+ { name: 'Attend professional conference', priority: 1, status: 0 },
+ { name: 'Update professional certifications', priority: 1, status: 0 },
+
+ // Maintenance tasks (AI should suggest regular upkeep)
+ { name: 'Change air filter in HVAC', priority: 0, status: 0 },
+ { name: 'Test smoke detector batteries', priority: 1, status: 0 },
+ { name: 'Backup computer files', priority: 1, status: 0 },
+ { name: 'Update software and security patches', priority: 1, status: 0 },
+
+ // Social/relationship tasks (AI should suggest work-life balance)
+ { name: 'Plan anniversary dinner', priority: 1, status: 0 },
+ { name: 'Call grandparents', priority: 1, status: 0 },
+ { name: 'Schedule date night', priority: 0, status: 0 },
+ { name: 'Organize family gathering', priority: 1, status: 0 },
+
+ // Creative/hobby tasks (AI should suggest personal fulfillment)
+ { name: 'Practice guitar daily', priority: 0, status: 0 },
+ { name: 'Work on painting project', priority: 0, status: 0 },
+ { name: 'Write in journal', priority: 0, status: 0 },
+ { name: 'Learn new recipe', priority: 0, status: 0 },
+
+ // Recurring daily tasks (AI should recognize patterns)
+ {
+ name: 'Daily meditation practice',
+ priority: 1,
+ status: 0,
+ recurrence_type: 'daily',
+ recurrence_interval: 1,
+ due_date: new Date()
+ },
+ {
+ name: 'Review daily priorities',
+ priority: 1,
+ status: 0,
+ recurrence_type: 'daily',
+ recurrence_interval: 1,
+ due_date: new Date()
+ },
+ {
+ name: 'Log daily expenses',
+ priority: 0,
+ status: 0,
+ recurrence_type: 'daily',
+ recurrence_interval: 1,
+ due_date: new Date()
+ },
+
+ // Weekly recurring tasks
+ {
+ name: 'Weekly meal planning',
+ priority: 1,
+ status: 0,
+ recurrence_type: 'weekly',
+ recurrence_interval: 1,
+ recurrence_weekday: 0, // Sunday
+ due_date: getRandomDate(7)
+ },
+ {
+ name: 'Weekly house cleaning',
+ priority: 1,
+ status: 0,
+ recurrence_type: 'weekly',
+ recurrence_interval: 1,
+ recurrence_weekday: 6, // Saturday
+ due_date: getRandomDate(7)
+ },
+ {
+ name: 'Weekly team standup',
+ priority: 1,
+ status: 0,
+ recurrence_type: 'weekly',
+ recurrence_interval: 1,
+ recurrence_weekday: 1, // Monday
+ due_date: getRandomDate(7),
+ project_id: projects[0].id
+ },
+
+ // Monthly recurring tasks
+ {
+ name: 'Monthly budget review',
+ priority: 2,
+ status: 0,
+ recurrence_type: 'monthly',
+ recurrence_interval: 1,
+ recurrence_month_day: 1,
+ due_date: getRandomDate(30)
+ },
+ {
+ name: 'Monthly backup verification',
+ priority: 1,
+ status: 0,
+ recurrence_type: 'monthly',
+ recurrence_interval: 1,
+ recurrence_month_day: 15,
+ due_date: getRandomDate(30)
+ },
+
+ // Waiting status tasks (AI should suggest follow-up actions)
+ { name: 'Wait for contractor estimate', priority: 1, status: 4, project_id: projects[2].id },
+ { name: 'Wait for insurance approval', priority: 2, status: 4 },
+ { name: 'Wait for vendor response', priority: 1, status: 4, project_id: projects[0].id },
+ { name: 'Wait for medical test results', priority: 1, status: 4 },
+ { name: 'Wait for loan approval', priority: 2, status: 4 },
+
+ // Recently completed tasks for learning patterns
+ { name: 'Complete weekly workout goal', priority: 1, status: 2, completed_at: getPastDate(1), project_id: projects[3].id },
+ { name: 'Finish reading productivity book', priority: 0, status: 2, completed_at: getPastDate(2) },
+ { name: 'Complete online course module', priority: 1, status: 2, completed_at: getPastDate(1) },
+ { name: 'Submit weekly report', priority: 1, status: 2, completed_at: getPastDate(1), project_id: projects[0].id },
+ { name: 'Complete meal prep for week', priority: 1, status: 2, completed_at: getPastDate(1), project_id: projects[13].id },
+ { name: 'Finish monthly budget', priority: 1, status: 2, completed_at: getPastDate(3) },
+ { name: 'Complete photography assignment', priority: 1, status: 2, completed_at: getPastDate(2), project_id: projects[7].id },
+ { name: 'Finish home organization project', priority: 0, status: 2, completed_at: getPastDate(4) },
+ { name: 'Complete investment research', priority: 1, status: 2, completed_at: getPastDate(5), project_id: projects[5].id },
+ { name: 'Finish blog post draft', priority: 1, status: 2, completed_at: getPastDate(2), project_id: projects[10].id }
+ ];
+
+ // Combine all tasks
+ return [...baseTaskData, ...massiveTasks, ...aiTriggerTasks];
+}
+
+module.exports = { createMassiveTaskData };
\ No newline at end of file
diff --git a/backend/server.log b/backend/server.log
new file mode 100644
index 0000000..d17d75a
--- /dev/null
+++ b/backend/server.log
@@ -0,0 +1,30 @@
+
+> backend@1.0.0 dev
+> nodemon app.js
+
+[33m[nodemon] 3.1.10[39m
+[33m[nodemon] to restart at any time, enter `rs`[39m
+[33m[nodemon] watching path(s): *.*[39m
+[33m[nodemon] watching extensions: js,mjs,cjs,json[39m
+[32m[nodemon] starting `node app.js`[39m
+Loaded 20 quotes from configuration
+Server error: Error: listen EADDRINUSE: address already in use 0.0.0.0:3002
+ at Server.setupListenHandle [as _listen2] (node:net:1939:16)
+ at listenInCluster (node:net:1996:12)
+ at node:net:2205:7
+ at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
+ code: 'EADDRINUSE',
+ errno: -48,
+ syscall: 'listen',
+ address: '0.0.0.0',
+ port: 3002
+}
+Error getting updates for user 1: Error: Request timeout
+ at ClientRequest. (/Users/chris/c0deLab/ProjectLand/tududi/backend/services/telegramPoller.js:93:14)
+ at ClientRequest.emit (node:events:518:28)
+ at TLSSocket.emitRequestTimeout (node:_http_client:863:9)
+ at Object.onceWrapper (node:events:632:28)
+ at TLSSocket.emit (node:events:530:35)
+ at Socket._onTimeout (node:net:609:8)
+ at listOnTimeout (node:internal/timers:588:17)
+ at process.processTimers (node:internal/timers:523:7)
diff --git a/backend/services/taskEventService.js b/backend/services/taskEventService.js
new file mode 100644
index 0000000..8d85067
--- /dev/null
+++ b/backend/services/taskEventService.js
@@ -0,0 +1,329 @@
+const { TaskEvent } = require('../models');
+
+class TaskEventService {
+ /**
+ * Log a task event
+ * @param {Object} eventData - Event data
+ * @param {number} eventData.taskId - Task ID
+ * @param {number} eventData.userId - User ID
+ * @param {string} eventData.eventType - Type of event
+ * @param {string} eventData.fieldName - Field that changed (optional)
+ * @param {any} eventData.oldValue - Old value (optional)
+ * @param {any} eventData.newValue - New value (optional)
+ * @param {Object} eventData.metadata - Additional metadata (optional)
+ */
+ static async logEvent({ taskId, userId, eventType, fieldName = null, oldValue = null, newValue = null, metadata = {} }) {
+ try {
+ // Add source to metadata if not provided
+ if (!metadata.source) {
+ metadata.source = 'web';
+ }
+
+ const event = await TaskEvent.create({
+ task_id: taskId,
+ user_id: userId,
+ event_type: eventType,
+ field_name: fieldName,
+ old_value: oldValue ? { [fieldName || 'value']: oldValue } : null,
+ new_value: newValue ? { [fieldName || 'value']: newValue } : null,
+ metadata: metadata
+ });
+
+ return event;
+ } catch (error) {
+ console.error('Error logging task event:', error);
+ throw error;
+ }
+ }
+
+ /**
+ * Log task creation event
+ */
+ static async logTaskCreated(taskId, userId, taskData, metadata = {}) {
+ return await this.logEvent({
+ taskId,
+ userId,
+ eventType: 'created',
+ newValue: taskData,
+ metadata: { ...metadata, action: 'task_created' }
+ });
+ }
+
+ /**
+ * Log status change event
+ */
+ static async logStatusChange(taskId, userId, oldStatus, newStatus, metadata = {}) {
+ const eventType = newStatus === 2 ? 'completed' :
+ newStatus === 3 ? 'archived' :
+ 'status_changed';
+
+ return await this.logEvent({
+ taskId,
+ userId,
+ eventType,
+ fieldName: 'status',
+ oldValue: oldStatus,
+ newValue: newStatus,
+ metadata: { ...metadata, action: 'status_change' }
+ });
+ }
+
+ /**
+ * Log priority change event
+ */
+ static async logPriorityChange(taskId, userId, oldPriority, newPriority, metadata = {}) {
+ return await this.logEvent({
+ taskId,
+ userId,
+ eventType: 'priority_changed',
+ fieldName: 'priority',
+ oldValue: oldPriority,
+ newValue: newPriority,
+ metadata: { ...metadata, action: 'priority_change' }
+ });
+ }
+
+ /**
+ * Log due date change event
+ */
+ static async logDueDateChange(taskId, userId, oldDueDate, newDueDate, metadata = {}) {
+ return await this.logEvent({
+ taskId,
+ userId,
+ eventType: 'due_date_changed',
+ fieldName: 'due_date',
+ oldValue: oldDueDate,
+ newValue: newDueDate,
+ metadata: { ...metadata, action: 'due_date_change' }
+ });
+ }
+
+ /**
+ * Log project change event
+ */
+ static async logProjectChange(taskId, userId, oldProjectId, newProjectId, metadata = {}) {
+ return await this.logEvent({
+ taskId,
+ userId,
+ eventType: 'project_changed',
+ fieldName: 'project_id',
+ oldValue: oldProjectId,
+ newValue: newProjectId,
+ metadata: { ...metadata, action: 'project_change' }
+ });
+ }
+
+ /**
+ * Log task name change event
+ */
+ static async logNameChange(taskId, userId, oldName, newName, metadata = {}) {
+ return await this.logEvent({
+ taskId,
+ userId,
+ eventType: 'name_changed',
+ fieldName: 'name',
+ oldValue: oldName,
+ newValue: newName,
+ metadata: { ...metadata, action: 'name_change' }
+ });
+ }
+
+ /**
+ * Log description change event
+ */
+ static async logDescriptionChange(taskId, userId, oldDescription, newDescription, metadata = {}) {
+ return await this.logEvent({
+ taskId,
+ userId,
+ eventType: 'description_changed',
+ fieldName: 'description',
+ oldValue: oldDescription,
+ newValue: newDescription,
+ metadata: { ...metadata, action: 'description_change' }
+ });
+ }
+
+ /**
+ * Log multiple field changes at once
+ */
+ static async logTaskUpdate(taskId, userId, changes, metadata = {}) {
+ const events = [];
+
+ for (const [fieldName, { oldValue, newValue }] of Object.entries(changes)) {
+ // Skip if values are the same
+ if (oldValue === newValue) continue;
+
+ let eventType;
+ switch (fieldName) {
+ case 'status':
+ eventType = newValue === 2 ? 'completed' :
+ newValue === 3 ? 'archived' :
+ 'status_changed';
+ break;
+ default:
+ eventType = `${fieldName}_changed`;
+ }
+
+ const event = await this.logEvent({
+ taskId,
+ userId,
+ eventType,
+ fieldName,
+ oldValue,
+ newValue,
+ metadata: { ...metadata, action: 'bulk_update' }
+ });
+
+ events.push(event);
+ }
+
+ return events;
+ }
+
+ /**
+ * Get task timeline (all events for a task)
+ */
+ static async getTaskTimeline(taskId) {
+ return await TaskEvent.findAll({
+ where: { task_id: taskId },
+ order: [['created_at', 'ASC']],
+ include: [{
+ model: require('../models').User,
+ as: 'User',
+ attributes: ['id', 'name', 'email']
+ }]
+ });
+ }
+
+ /**
+ * Get task completion metrics
+ */
+ static async getTaskCompletionTime(taskId) {
+ const events = await TaskEvent.findAll({
+ where: {
+ task_id: taskId,
+ event_type: ['status_changed', 'created', 'completed']
+ },
+ order: [['created_at', 'ASC']]
+ });
+
+ if (events.length === 0) return null;
+
+ // Find when task was started (moved to in_progress or created)
+ const startEvent = events.find(e =>
+ e.event_type === 'created' ||
+ (e.event_type === 'status_changed' && e.new_value?.status === 1) // in_progress
+ );
+
+ // Find when task was completed
+ const completedEvent = events.find(e =>
+ e.event_type === 'completed' ||
+ (e.event_type === 'status_changed' && e.new_value?.status === 2) // done
+ );
+
+ if (!startEvent || !completedEvent) return null;
+
+ const startTime = new Date(startEvent.created_at);
+ const endTime = new Date(completedEvent.created_at);
+
+ return {
+ task_id: taskId,
+ started_at: startTime,
+ completed_at: endTime,
+ duration_ms: endTime - startTime,
+ duration_hours: (endTime - startTime) / (1000 * 60 * 60),
+ duration_days: (endTime - startTime) / (1000 * 60 * 60 * 24)
+ };
+ }
+
+ /**
+ * Get user productivity metrics
+ */
+ static async getUserProductivityMetrics(userId, startDate = null, endDate = null) {
+ const whereClause = { user_id: userId };
+
+ if (startDate && endDate) {
+ whereClause.created_at = {
+ [require('sequelize').Op.between]: [startDate, endDate]
+ };
+ }
+
+ const events = await TaskEvent.findAll({
+ where: whereClause,
+ order: [['created_at', 'ASC']]
+ });
+
+ // Calculate metrics
+ const metrics = {
+ total_events: events.length,
+ tasks_created: events.filter(e => e.event_type === 'created').length,
+ tasks_completed: events.filter(e => e.event_type === 'completed').length,
+ status_changes: events.filter(e => e.event_type === 'status_changed').length,
+ average_completion_time: null,
+ completion_times: []
+ };
+
+ // Calculate completion times for all completed tasks
+ const completedTasks = events.filter(e => e.event_type === 'completed');
+ const completionTimes = [];
+
+ for (const completedEvent of completedTasks) {
+ const taskCompletion = await this.getTaskCompletionTime(completedEvent.task_id);
+ if (taskCompletion) {
+ completionTimes.push(taskCompletion);
+ }
+ }
+
+ if (completionTimes.length > 0) {
+ const totalHours = completionTimes.reduce((sum, ct) => sum + ct.duration_hours, 0);
+ metrics.average_completion_time = totalHours / completionTimes.length;
+ metrics.completion_times = completionTimes;
+ }
+
+ return metrics;
+ }
+
+ /**
+ * Get task activity summary for a date range
+ */
+ static async getTaskActivitySummary(userId, startDate, endDate) {
+ const events = await TaskEvent.findAll({
+ where: {
+ user_id: userId,
+ created_at: {
+ [require('sequelize').Op.between]: [startDate, endDate]
+ }
+ },
+ attributes: [
+ 'event_type',
+ [require('sequelize').fn('COUNT', require('sequelize').col('id')), 'count'],
+ [require('sequelize').fn('DATE', require('sequelize').col('created_at')), 'date']
+ ],
+ group: ['event_type', 'date'],
+ order: [['date', 'ASC']]
+ });
+
+ return events;
+ }
+
+ /**
+ * Get count of how many times a task has been moved to today
+ */
+ static async getTaskTodayMoveCount(taskId) {
+ const { Op } = require('sequelize');
+
+ const count = await TaskEvent.count({
+ where: {
+ task_id: taskId,
+ event_type: 'today_changed',
+ new_value: {
+ [Op.like]: '%"today":true%'
+ }
+ }
+ });
+
+ return count;
+ }
+}
+
+module.exports = TaskEventService;
\ No newline at end of file
diff --git a/backend/tests/helpers/setup.js b/backend/tests/helpers/setup.js
index 651bc9a..4344ab8 100644
--- a/backend/tests/helpers/setup.js
+++ b/backend/tests/helpers/setup.js
@@ -2,8 +2,11 @@
process.env.NODE_ENV = 'test';
const { sequelize } = require('../../models');
+const fs = require('fs');
+const path = require('path');
beforeAll(async () => {
+ // Ensure test database is clean and created
await sequelize.sync({ force: true });
}, 30000);
diff --git a/backend/tests/helpers/testUtils.js b/backend/tests/helpers/testUtils.js
index 18d0571..c80c391 100644
--- a/backend/tests/helpers/testUtils.js
+++ b/backend/tests/helpers/testUtils.js
@@ -4,7 +4,7 @@ const { User } = require('../../models');
const createTestUser = async (userData = {}) => {
const defaultUser = {
email: 'test@example.com',
- password_digest: await bcrypt.hash('password123', 10),
+ password: 'password123', // Use password field to trigger model hook
...userData
};
diff --git a/backend/tests/integration/url.test.js b/backend/tests/integration/url.test.js
index 0de3ea6..8dcdea6 100644
--- a/backend/tests/integration/url.test.js
+++ b/backend/tests/integration/url.test.js
@@ -137,14 +137,16 @@ describe('URL Routes', () => {
expect(response.body).toHaveProperty('title');
}, 10000);
- it('should return found false for URL without protocol', async () => {
+ it('should detect URLs without protocol', async () => {
const testText = 'Visit httpbin.org/html for testing';
const response = await agent
.post('/api/url/extract-from-text')
.send({ text: testText });
expect(response.status).toBe(200);
- expect(response.body.found).toBe(false);
+ expect(response.body.found).toBe(true);
+ expect(response.body.url).toBe('httpbin.org/html');
+ expect(response.body.originalText).toBe(testText);
});
it('should return found false when no URL in text', async () => {
diff --git a/backend/tests/integration/user-create-script.test.js b/backend/tests/integration/user-create-script.test.js
new file mode 100644
index 0000000..c0495ba
--- /dev/null
+++ b/backend/tests/integration/user-create-script.test.js
@@ -0,0 +1,325 @@
+const { execSync, spawn } = require('child_process');
+const path = require('path');
+const { User } = require('../../models');
+
+describe('User Create Script', () => {
+ const scriptPath = path.join(__dirname, '../../scripts/user-create.js');
+
+ // Helper function to run the script and capture output
+ const runUserCreateScript = (args = []) => {
+ return new Promise((resolve, reject) => {
+ const child = spawn('node', [scriptPath, ...args], {
+ stdio: ['pipe', 'pipe', 'pipe'],
+ env: { ...process.env, NODE_ENV: 'test' }
+ });
+
+ let stdout = '';
+ let stderr = '';
+
+ child.stdout.on('data', (data) => {
+ stdout += data.toString();
+ });
+
+ child.stderr.on('data', (data) => {
+ stderr += data.toString();
+ });
+
+ child.on('close', (code) => {
+ resolve({
+ code,
+ stdout: stdout.trim(),
+ stderr: stderr.trim()
+ });
+ });
+
+ child.on('error', (error) => {
+ reject(error);
+ });
+ });
+ };
+
+ afterEach(async () => {
+ // Clean up any test users created during tests
+ await User.destroy({
+ where: {
+ email: ['testuser@example.com', 'admin@example.com', 'invalid-email', 'existing@example.com']
+ }
+ });
+ });
+
+ describe('Success Cases', () => {
+ it('should create a new user with valid email and password', async () => {
+ const email = 'testuser@example.com';
+ const password = 'securepassword123';
+
+ const result = await runUserCreateScript([email, password]);
+
+ expect(result.code).toBe(0);
+ expect(result.stdout).toContain('✅ User created successfully');
+ expect(result.stdout).toContain(`📧 Email: ${email}`);
+ expect(result.stdout).toContain('🆔 User ID:');
+ expect(result.stdout).toContain('📅 Created:');
+
+ // Verify user was actually created in database
+ const createdUser = await User.findOne({ where: { email } });
+ expect(createdUser).toBeTruthy();
+ expect(createdUser.email).toBe(email);
+ expect(createdUser.password_digest).toBeTruthy();
+ expect(createdUser.password_digest).not.toBe(password); // Should be hashed
+ });
+
+ it('should create user with minimum password length', async () => {
+ const email = 'testuser2@example.com';
+ const password = '123456'; // Exactly 6 characters
+
+ const result = await runUserCreateScript([email, password]);
+
+ expect(result.code).toBe(0);
+ expect(result.stdout).toContain('✅ User created successfully');
+
+ // Verify user was created
+ const createdUser = await User.findOne({ where: { email } });
+ expect(createdUser).toBeTruthy();
+
+ // Clean up
+ await User.destroy({ where: { email } });
+ });
+
+ it('should create user with complex email format', async () => {
+ const email = 'user.name+tag@sub.domain.com';
+ const password = 'password123';
+
+ const result = await runUserCreateScript([email, password]);
+
+ expect(result.code).toBe(0);
+ expect(result.stdout).toContain('✅ User created successfully');
+
+ // Verify user was created
+ const createdUser = await User.findOne({ where: { email } });
+ expect(createdUser).toBeTruthy();
+
+ // Clean up
+ await User.destroy({ where: { email } });
+ });
+ });
+
+ describe('Error Cases', () => {
+ it('should show usage when no arguments provided', async () => {
+ const result = await runUserCreateScript([]);
+
+ expect(result.code).toBe(1);
+ expect(result.stderr).toContain('❌ Usage: npm run user:create ');
+ expect(result.stderr).toContain('Example: npm run user:create admin@example.com mypassword123');
+ });
+
+ it('should show usage when only email provided', async () => {
+ const result = await runUserCreateScript(['test@example.com']);
+
+ expect(result.code).toBe(1);
+ expect(result.stderr).toContain('❌ Usage: npm run user:create ');
+ });
+
+ it('should show usage when only password provided', async () => {
+ const result = await runUserCreateScript(['', 'password123']);
+
+ expect(result.code).toBe(1);
+ expect(result.stderr).toContain('❌ Usage: npm run user:create ');
+ });
+
+ it('should reject invalid email format', async () => {
+ const invalidEmails = [
+ 'invalid-email',
+ 'missing@domain',
+ '@missing-local.com',
+ 'spaces in@email.com',
+ 'double@@domain.com',
+ 'trailing.dot.@domain.com'
+ ];
+
+ for (const email of invalidEmails) {
+ const result = await runUserCreateScript([email, 'password123']);
+
+ expect(result.code).toBe(1);
+ expect(result.stderr).toContain('❌ Invalid email format');
+ }
+ });
+
+ it('should reject password shorter than 6 characters', async () => {
+ const shortPasswords = ['', '1', '12', '123', '1234', '12345'];
+
+ for (const password of shortPasswords) {
+ const result = await runUserCreateScript(['test@example.com', password]);
+
+ expect(result.code).toBe(1);
+ expect(result.stderr).toContain('❌ Password must be at least 6 characters long');
+ }
+ });
+
+ it('should reject duplicate email', async () => {
+ const email = 'existing@example.com';
+ const password = 'password123';
+
+ // Create user first
+ await User.create({
+ email,
+ password_digest: await require('bcrypt').hash(password, 10)
+ });
+
+ // Try to create same user again
+ const result = await runUserCreateScript([email, password]);
+
+ expect(result.code).toBe(1);
+ expect(result.stderr).toContain(`❌ User with email ${email} already exists`);
+ });
+ });
+
+ describe('Integration with npm script', () => {
+ it('should work when called via npm run command', async () => {
+ const email = 'npmtest@example.com';
+ const password = 'testpassword123';
+
+ try {
+ // This simulates running: npm run user:create npmtest@example.com testpassword123
+ const output = execSync(
+ `npm run user:create ${email} ${password}`,
+ {
+ cwd: path.join(__dirname, '../..'),
+ env: { ...process.env, NODE_ENV: 'test' },
+ encoding: 'utf8',
+ timeout: 10000
+ }
+ );
+
+ expect(output).toContain('User created successfully');
+
+ // Verify user was created
+ const createdUser = await User.findOne({ where: { email } });
+ expect(createdUser).toBeTruthy();
+ expect(createdUser.email).toBe(email);
+
+ } catch (error) {
+ // If the command failed, check if it's due to duplicate user (from previous test runs)
+ if (error.stderr?.includes('already exists')) {
+ // Clean up and retry
+ await User.destroy({ where: { email } });
+
+ const output = execSync(
+ `npm run user:create ${email} ${password}`,
+ {
+ cwd: path.join(__dirname, '../..'),
+ env: { ...process.env, NODE_ENV: 'test' },
+ encoding: 'utf8',
+ timeout: 10000
+ }
+ );
+
+ expect(output).toContain('User created successfully');
+ } else {
+ throw error;
+ }
+ } finally {
+ // Clean up
+ await User.destroy({ where: { email } });
+ }
+ });
+ });
+
+ describe('Database Validation', () => {
+ it('should hash password properly', async () => {
+ const email = 'hashtest@example.com';
+ const password = 'plaintextpassword';
+
+ const result = await runUserCreateScript([email, password]);
+
+ expect(result.code).toBe(0);
+
+ const createdUser = await User.findOne({ where: { email } });
+ expect(createdUser).toBeTruthy();
+
+ // Password should be hashed (bcrypt hashes start with $2b$)
+ expect(createdUser.password_digest).toMatch(/^\$2b\$10\$/);
+ expect(createdUser.password_digest).not.toBe(password);
+ expect(createdUser.password_digest.length).toBeGreaterThan(50);
+
+ // Verify the hash is valid
+ const bcrypt = require('bcrypt');
+ const isValid = await bcrypt.compare(password, createdUser.password_digest);
+ expect(isValid).toBe(true);
+
+ // Clean up
+ await User.destroy({ where: { email } });
+ });
+
+ it('should set correct default values', async () => {
+ const email = 'defaultstest@example.com';
+ const password = 'password123';
+
+ const result = await runUserCreateScript([email, password]);
+
+ expect(result.code).toBe(0);
+
+ const createdUser = await User.findOne({ where: { email } });
+ expect(createdUser).toBeTruthy();
+
+ // Check that created_at and updated_at are set
+ expect(createdUser.created_at).toBeTruthy();
+ expect(createdUser.updated_at).toBeTruthy();
+
+ // Check that it's a valid date
+ expect(createdUser.created_at instanceof Date).toBe(true);
+ expect(createdUser.updated_at instanceof Date).toBe(true);
+
+ // Clean up
+ await User.destroy({ where: { email } });
+ });
+ });
+
+ describe('Edge Cases', () => {
+ it('should handle special characters in password', async () => {
+ const email = 'specialchars@example.com';
+ const password = 'p@ssw0rd!@#$%^&*()_+-=[]{}|;:,.<>?';
+
+ const result = await runUserCreateScript([email, password]);
+
+ expect(result.code).toBe(0);
+ expect(result.stdout).toContain('✅ User created successfully');
+
+ // Verify user was created and password works
+ const createdUser = await User.findOne({ where: { email } });
+ expect(createdUser).toBeTruthy();
+
+ const bcrypt = require('bcrypt');
+ const isValid = await bcrypt.compare(password, createdUser.password_digest);
+ expect(isValid).toBe(true);
+
+ // Clean up
+ await User.destroy({ where: { email } });
+ });
+
+ it('should handle very long email', async () => {
+ const longEmail = 'a'.repeat(50) + '@' + 'b'.repeat(50) + '.com';
+ const password = 'password123';
+
+ const result = await runUserCreateScript([longEmail, password]);
+
+ expect(result.code).toBe(0);
+ expect(result.stdout).toContain('✅ User created successfully');
+
+ // Clean up
+ await User.destroy({ where: { email: longEmail } });
+ });
+
+ it('should handle very long password', async () => {
+ const email = 'longpassword@example.com';
+ const password = 'a'.repeat(200); // Very long password
+
+ const result = await runUserCreateScript([email, password]);
+
+ expect(result.code).toBe(0);
+ expect(result.stdout).toContain('✅ User created successfully');
+
+ // Clean up
+ await User.destroy({ where: { email } });
+ });
+ });
+});
\ No newline at end of file
diff --git a/dist/frontend_components_Tasks_tsx.0ff303d200eba39b4320.js b/dist/frontend_components_Tasks_tsx.0ff303d200eba39b4320.js
deleted file mode 100644
index c0218be..0000000
--- a/dist/frontend_components_Tasks_tsx.0ff303d200eba39b4320.js
+++ /dev/null
@@ -1,92 +0,0 @@
-"use strict";
-/*
- * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
- * This devtool is neither made for production nor for readable output files.
- * It uses "eval()" calls to create a separate source file in the browser devtools.
- * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
- * or disable the default devtool with "devtool: false".
- * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
- */
-(self["webpackChunktududi"] = self["webpackChunktududi"] || []).push([["frontend_components_Tasks_tsx"],{
-
-/***/ "./frontend/components/Task/getDescription.ts":
-/*!****************************************************!*\
- !*** ./frontend/components/Task/getDescription.ts ***!
- \****************************************************/
-/***/ ((module, __webpack_exports__, __webpack_require__) => {
-
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getDescription: () => (/* binding */ getDescription)\n/* harmony export */ });\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar getDescription = function getDescription(query, projects, t) {\n try {\n // Default descriptions as fallbacks in case translation function fails\n var defaultDescriptions = {\n project: \"Project tasks\",\n today: \"Tasks due today or scheduled for immediate attention\",\n inbox: \"Uncategorized tasks without project or due date\",\n next: \"Tasks that are actionable in the near future\",\n upcoming: \"Tasks scheduled for the upcoming week\",\n someday: \"Tasks without urgency or specific due date\",\n completed: \"Tasks you've completed\",\n allTasks: \"All tasks from different projects and priorities\"\n };\n\n // Check for project_id first\n var projectId = query.get('project_id');\n if (projectId) {\n try {\n var project = projects.find(function (p) {\n var _p$id;\n return ((_p$id = p.id) === null || _p$id === void 0 ? void 0 : _p$id.toString()) === projectId;\n });\n if (project) {\n return t(\"taskViews.project.withName\", {\n projectName: project.name\n });\n } else {\n return t(\"taskViews.project.noName\");\n }\n } catch (e) {\n console.error(\"Translation error for project description:\", e);\n // Fallback with project name if available\n var _project = projects.find(function (p) {\n var _p$id2;\n return ((_p$id2 = p.id) === null || _p$id2 === void 0 ? void 0 : _p$id2.toString()) === projectId;\n });\n return _project ? \"Tasks for project: \".concat(_project.name) : defaultDescriptions.project;\n }\n }\n\n // Then check for type and status parameters\n try {\n if (query.get('type') === 'today') {\n return t(\"taskViews.today\");\n }\n if (query.get('type') === 'inbox') {\n return t(\"taskViews.inbox\");\n }\n if (query.get('type') === 'next') {\n return t(\"taskViews.next\");\n }\n if (query.get('type') === 'upcoming') {\n return t(\"taskViews.upcoming\");\n }\n if (query.get('type') === 'someday') {\n return t(\"taskViews.someday\");\n }\n if (query.get('status') === 'done') {\n return t(\"taskViews.completed\");\n }\n return t(\"taskViews.allTasks\");\n } catch (e) {\n console.error(\"Translation error for task view description:\", e);\n\n // Return appropriate fallback based on type or status\n if (query.get('type') === 'today') return defaultDescriptions.today;\n if (query.get('type') === 'inbox') return defaultDescriptions.inbox;\n if (query.get('type') === 'next') return defaultDescriptions.next;\n if (query.get('type') === 'upcoming') return defaultDescriptions.upcoming;\n if (query.get('type') === 'someday') return defaultDescriptions.someday;\n if (query.get('status') === 'done') return defaultDescriptions.completed;\n return defaultDescriptions.allTasks;\n }\n } catch (error) {\n console.error(\"Error in getDescription:\", error);\n return \"Tasks overview\";\n }\n};\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/getDescription.ts?");
-
-/***/ }),
-
-/***/ "./frontend/components/Task/getTitleAndIcon.ts":
-/*!*****************************************************!*\
- !*** ./frontend/components/Task/getTitleAndIcon.ts ***!
- \*****************************************************/
-/***/ ((module, __webpack_exports__, __webpack_require__) => {
-
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getTitleAndIcon: () => (/* binding */ getTitleAndIcon)\n/* harmony export */ });\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/FolderIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/CalendarIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/InboxIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ArrowRightIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ClockIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/MoonIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/CheckCircleIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/Bars4Icon.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\n\nvar getTitleAndIcon = function getTitleAndIcon(query, projects, t) {\n try {\n // Default titles as fallbacks in case translation function fails\n var defaultTitles = {\n project: 'Project',\n today: 'Today',\n inbox: 'Inbox',\n next: 'Next Actions',\n upcoming: 'Upcoming',\n someday: 'Someday',\n completed: 'Completed',\n allTasks: 'All Tasks'\n };\n var projectId = query.get('project_id');\n if (projectId) {\n var project = projects.find(function (p) {\n var _p$id;\n return ((_p$id = p.id) === null || _p$id === void 0 ? void 0 : _p$id.toString()) === projectId;\n });\n return {\n title: project ? project.name : t('sidebar.projects'),\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_0__[\"default\"]\n };\n }\n try {\n if (query.get('type') === 'today') {\n return {\n title: t('tasks.today'),\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_1__[\"default\"]\n };\n }\n if (query.get('type') === 'inbox') {\n return {\n title: t('sidebar.inbox'),\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n };\n }\n if (query.get('type') === 'next') {\n return {\n title: t('sidebar.nextActions'),\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n };\n }\n if (query.get('type') === 'upcoming') {\n return {\n title: t('sidebar.upcoming'),\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n };\n }\n if (query.get('type') === 'someday') {\n return {\n title: t('taskViews.someday') || defaultTitles.someday,\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__[\"default\"]\n };\n }\n if (query.get('status') === 'done') {\n return {\n title: t('sidebar.completed'),\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__[\"default\"]\n };\n }\n return {\n title: t('sidebar.allTasks'),\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__[\"default\"]\n };\n } catch (e) {\n console.error(\"Translation error for task view title:\", e);\n\n // Return appropriate fallback based on type or status\n if (query.get('type') === 'today') return {\n title: defaultTitles.today,\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_1__[\"default\"]\n };\n if (query.get('type') === 'inbox') return {\n title: defaultTitles.inbox,\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n };\n if (query.get('type') === 'next') return {\n title: defaultTitles.next,\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n };\n if (query.get('type') === 'upcoming') return {\n title: defaultTitles.upcoming,\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n };\n if (query.get('type') === 'someday') return {\n title: defaultTitles.someday,\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__[\"default\"]\n };\n if (query.get('status') === 'done') return {\n title: defaultTitles.completed,\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__[\"default\"]\n };\n return {\n title: defaultTitles.allTasks,\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__[\"default\"]\n };\n }\n } catch (error) {\n console.error(\"Error in getTitleAndIcon:\", error);\n return {\n title: \"Tasks\",\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__[\"default\"]\n };\n }\n};\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/getTitleAndIcon.ts?");
-
-/***/ }),
-
-/***/ "./frontend/components/Tasks.tsx":
-/*!***************************************!*\
- !*** ./frontend/components/Tasks.tsx ***!
- \***************************************/
-/***/ ((module, __webpack_exports__, __webpack_require__) => {
-
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/dist/index.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _Task_TaskList__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Task/TaskList */ \"./frontend/components/Task/TaskList.tsx\");\n/* harmony import */ var _Task_NewTask__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Task/NewTask */ \"./frontend/components/Task/NewTask.tsx\");\n/* harmony import */ var _Task_getTitleAndIcon__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Task/getTitleAndIcon */ \"./frontend/components/Task/getTitleAndIcon.ts\");\n/* harmony import */ var _Task_getDescription__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Task/getDescription */ \"./frontend/components/Task/getDescription.ts\");\n/* harmony import */ var _utils_tasksService__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/tasksService */ \"./frontend/utils/tasksService.ts\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/TagIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/XMarkIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/ChevronDoubleDownIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/ChevronDownIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/MagnifyingGlassIcon.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = \"function\" == typeof Symbol ? Symbol : {}, a = i.iterator || \"@@iterator\", c = i.asyncIterator || \"@@asyncIterator\", u = i.toStringTag || \"@@toStringTag\"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, \"\"); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, \"_invoke\", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: \"normal\", arg: t.call(e, r) }; } catch (t) { return { type: \"throw\", arg: t }; } } e.wrap = wrap; var h = \"suspendedStart\", l = \"suspendedYield\", f = \"executing\", s = \"completed\", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { [\"next\", \"throw\", \"return\"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if (\"throw\" !== c.type) { var u = c.arg, h = u.value; return h && \"object\" == _typeof(h) && n.call(h, \"__await\") ? e.resolve(h.__await).then(function (t) { invoke(\"next\", t, i, a); }, function (t) { invoke(\"throw\", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke(\"throw\", t, i, a); }); } a(c.arg); } var r; o(this, \"_invoke\", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error(\"Generator is already running\"); if (o === s) { if (\"throw\" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if (\"next\" === n.method) n.sent = n._sent = n.arg;else if (\"throw\" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else \"return\" === n.method && n.abrupt(\"return\", n.arg); o = f; var p = tryCatch(e, r, n); if (\"normal\" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } \"throw\" === p.type && (o = s, n.method = \"throw\", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, \"throw\" === n && e.iterator[\"return\"] && (r.method = \"return\", r.arg = t, maybeInvokeDelegate(e, r), \"throw\" === r.method) || \"return\" !== n && (r.method = \"throw\", r.arg = new TypeError(\"The iterator does not provide a '\" + n + \"' method\")), y; var i = tryCatch(o, e.iterator, r.arg); if (\"throw\" === i.type) return r.method = \"throw\", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, \"return\" !== r.method && (r.method = \"next\", r.arg = t), r.delegate = null, y) : a : (r.method = \"throw\", r.arg = new TypeError(\"iterator result is not an object\"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = \"normal\", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: \"root\" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || \"\" === e) { var r = e[a]; if (r) return r.call(e); if (\"function\" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + \" is not iterable\"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, \"GeneratorFunction\"), e.isGeneratorFunction = function (t) { var e = \"function\" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || \"GeneratorFunction\" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, \"GeneratorFunction\")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, \"Generator\"), define(g, a, function () { return this; }), define(g, \"toString\", function () { return \"[object Generator]\"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) \"t\" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if (\"throw\" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = \"throw\", a.arg = e, r.next = n, o && (r.method = \"next\", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if (\"root\" === i.tryLoc) return handle(\"end\"); if (i.tryLoc <= this.prev) { var c = n.call(i, \"catchLoc\"), u = n.call(i, \"finallyLoc\"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error(\"try statement without catch or finally\"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, \"finallyLoc\") && this.prev < o.finallyLoc) { var i = o; break; } } i && (\"break\" === t || \"continue\" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = \"next\", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if (\"throw\" === t.type) throw t.arg; return \"break\" === t.type || \"continue\" === t.type ? this.next = t.arg : \"return\" === t.type ? (this.rval = this.arg = t.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, \"catch\": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if (\"throw\" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, \"next\" === this.method && (this.arg = t), y; } }, e; }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\n\n\n\nvar capitalize = function capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\n// Helper function to get search placeholder by language\nvar getSearchPlaceholder = function getSearchPlaceholder(language) {\n var placeholders = {\n en: 'Search tasks...',\n el: 'Αναζήτηση εργασιών...',\n es: 'Buscar tareas...',\n de: 'Aufgaben suchen...',\n jp: 'タスクを検索...',\n ua: 'Пошук завдань...'\n };\n return placeholders[language] || 'Search tasks...';\n};\nvar Tasks = function Tasks() {\n _s();\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t,\n i18n = _useTranslation.i18n;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState2 = _slicedToArray(_useState, 2),\n tasks = _useState2[0],\n setTasks = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState4 = _slicedToArray(_useState3, 2),\n projects = _useState4[0],\n setProjects = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true),\n _useState6 = _slicedToArray(_useState5, 2),\n loading = _useState6[0],\n setLoading = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState8 = _slicedToArray(_useState7, 2),\n error = _useState8[0],\n setError = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState10 = _slicedToArray(_useState9, 2),\n dropdownOpen = _useState10[0],\n setDropdownOpen = _useState10[1];\n var _useState11 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"due_date:asc\"),\n _useState12 = _slicedToArray(_useState11, 2),\n orderBy = _useState12[0],\n setOrderBy = _useState12[1];\n var _useState13 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\"),\n _useState14 = _slicedToArray(_useState13, 2),\n taskSearchQuery = _useState14[0],\n setTaskSearchQuery = _useState14[1];\n var dropdownRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n var location = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_7__.useLocation)();\n var navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_7__.useNavigate)();\n var query = new URLSearchParams(location.search);\n var _ref = location.state || {},\n stateTitle = _ref.title,\n stateIcon = _ref.icon;\n var _ref2 = stateTitle && stateIcon ? {\n title: stateTitle,\n icon: stateIcon\n } : (0,_Task_getTitleAndIcon__WEBPACK_IMPORTED_MODULE_4__.getTitleAndIcon)(query, projects, t),\n title = _ref2.title,\n icon = _ref2.icon;\n var IconComponent = typeof icon === \"string\" ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(icon) : icon;\n var tag = query.get(\"tag\");\n var status = query.get(\"status\");\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var savedOrderBy = localStorage.getItem(\"order_by\") || \"due_date:asc\";\n setOrderBy(savedOrderBy);\n var params = new URLSearchParams(location.search);\n if (!params.get(\"order_by\")) {\n params.set(\"order_by\", savedOrderBy);\n navigate({\n pathname: location.pathname,\n search: \"?\".concat(params.toString())\n }, {\n replace: true\n });\n }\n }, [location.pathname]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var handleClickOutside = function handleClickOutside(event) {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {\n setDropdownOpen(false);\n }\n };\n if (dropdownOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n return function () {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [dropdownOpen]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var fetchData = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {\n var tagId, _yield$Promise$all, _yield$Promise$all2, tasksResponse, projectsResponse, tasksData, projectsData;\n return _regeneratorRuntime().wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n setLoading(true);\n setError(null);\n _context.prev = 2;\n tagId = query.get(\"tag\");\n _context.next = 6;\n return Promise.all([fetch(\"/api/tasks\".concat(location.search).concat(tagId ? \"&tag=\".concat(tagId) : \"\")), fetch(\"/api/projects\")]);\n case 6:\n _yield$Promise$all = _context.sent;\n _yield$Promise$all2 = _slicedToArray(_yield$Promise$all, 2);\n tasksResponse = _yield$Promise$all2[0];\n projectsResponse = _yield$Promise$all2[1];\n if (!tasksResponse.ok) {\n _context.next = 17;\n break;\n }\n _context.next = 13;\n return tasksResponse.json();\n case 13:\n tasksData = _context.sent;\n setTasks(tasksData.tasks || []);\n _context.next = 18;\n break;\n case 17:\n throw new Error(\"Failed to fetch tasks.\");\n case 18:\n if (!projectsResponse.ok) {\n _context.next = 25;\n break;\n }\n _context.next = 21;\n return projectsResponse.json();\n case 21:\n projectsData = _context.sent;\n setProjects((projectsData === null || projectsData === void 0 ? void 0 : projectsData.projects) || []);\n _context.next = 26;\n break;\n case 25:\n throw new Error(\"Failed to fetch projects.\");\n case 26:\n _context.next = 31;\n break;\n case 28:\n _context.prev = 28;\n _context.t0 = _context[\"catch\"](2);\n setError(_context.t0.message);\n case 31:\n _context.prev = 31;\n setLoading(false);\n return _context.finish(31);\n case 34:\n case \"end\":\n return _context.stop();\n }\n }, _callee, null, [[2, 28, 31, 34]]);\n }));\n return function fetchData() {\n return _ref3.apply(this, arguments);\n };\n }();\n fetchData();\n }, [location]);\n var handleRemoveTag = function handleRemoveTag() {\n var params = new URLSearchParams(location.search);\n params[\"delete\"](\"tag\");\n navigate({\n pathname: location.pathname,\n search: \"?\".concat(params.toString())\n });\n };\n var handleTaskCreate = /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(taskData) {\n var newTask;\n return _regeneratorRuntime().wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n _context2.prev = 0;\n _context2.next = 3;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_6__.createTask)(taskData);\n case 3:\n newTask = _context2.sent;\n // Add the new task optimistically to avoid race conditions\n setTasks(function (prevTasks) {\n return [newTask].concat(_toConsumableArray(prevTasks));\n });\n _context2.next = 12;\n break;\n case 7:\n _context2.prev = 7;\n _context2.t0 = _context2[\"catch\"](0);\n console.error(\"Error creating task:\", _context2.t0);\n setError(\"Error creating task.\");\n throw _context2.t0;\n case 12:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2, null, [[0, 7]]);\n }));\n return function handleTaskCreate(_x) {\n return _ref4.apply(this, arguments);\n };\n }();\n var handleTaskUpdate = /*#__PURE__*/function () {\n var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(updatedTask) {\n var response, errorData;\n return _regeneratorRuntime().wrap(function _callee3$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n _context3.prev = 0;\n _context3.next = 3;\n return fetch(\"/api/task/\".concat(updatedTask.id), {\n method: \"PATCH\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(updatedTask)\n });\n case 3:\n response = _context3.sent;\n if (!response.ok) {\n _context3.next = 8;\n break;\n }\n setTasks(function (prevTasks) {\n return prevTasks.map(function (task) {\n return task.id === updatedTask.id ? updatedTask : task;\n });\n });\n _context3.next = 13;\n break;\n case 8:\n _context3.next = 10;\n return response.json();\n case 10:\n errorData = _context3.sent;\n console.error(\"Failed to update task:\", errorData.error);\n setError(\"Failed to update task.\");\n case 13:\n _context3.next = 19;\n break;\n case 15:\n _context3.prev = 15;\n _context3.t0 = _context3[\"catch\"](0);\n console.error(\"Error updating task:\", _context3.t0);\n setError(\"Error updating task.\");\n case 19:\n case \"end\":\n return _context3.stop();\n }\n }, _callee3, null, [[0, 15]]);\n }));\n return function handleTaskUpdate(_x2) {\n return _ref5.apply(this, arguments);\n };\n }();\n var handleTaskDelete = /*#__PURE__*/function () {\n var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee4(taskId) {\n var response, errorData;\n return _regeneratorRuntime().wrap(function _callee4$(_context4) {\n while (1) switch (_context4.prev = _context4.next) {\n case 0:\n _context4.prev = 0;\n _context4.next = 3;\n return fetch(\"/api/task/\".concat(taskId), {\n method: \"DELETE\"\n });\n case 3:\n response = _context4.sent;\n if (!response.ok) {\n _context4.next = 8;\n break;\n }\n setTasks(function (prevTasks) {\n return prevTasks.filter(function (task) {\n return task.id !== taskId;\n });\n });\n _context4.next = 13;\n break;\n case 8:\n _context4.next = 10;\n return response.json();\n case 10:\n errorData = _context4.sent;\n console.error(\"Failed to delete task:\", errorData.error);\n setError(\"Failed to delete task.\");\n case 13:\n _context4.next = 19;\n break;\n case 15:\n _context4.prev = 15;\n _context4.t0 = _context4[\"catch\"](0);\n console.error(\"Error deleting task:\", _context4.t0);\n setError(\"Error deleting task.\");\n case 19:\n case \"end\":\n return _context4.stop();\n }\n }, _callee4, null, [[0, 15]]);\n }));\n return function handleTaskDelete(_x3) {\n return _ref6.apply(this, arguments);\n };\n }();\n var handleSortChange = function handleSortChange(order) {\n setOrderBy(order);\n localStorage.setItem(\"order_by\", order);\n var params = new URLSearchParams(location.search);\n params.set(\"order_by\", order);\n navigate({\n pathname: location.pathname,\n search: \"?\".concat(params.toString())\n }, {\n replace: true\n });\n setDropdownOpen(false);\n };\n var description = (0,_Task_getDescription__WEBPACK_IMPORTED_MODULE_5__.getDescription)(query, projects, t);\n var isNewTaskAllowed = function isNewTaskAllowed() {\n return status !== \"done\";\n };\n var filteredTasks = tasks.filter(function (task) {\n return task.name.toLowerCase().includes(taskSearchQuery.toLowerCase());\n });\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex justify-center px-4 lg:px-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-full max-w-5xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex flex-col sm:flex-row items-start sm:items-center justify-between mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center mb-2 sm:mb-0\"\n }, IconComponent && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(IconComponent, {\n className: \"h-6 w-6 mr-2\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h2\", {\n className: \"text-2xl font-light\"\n }, title), tag && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"ml-4 flex items-center space-x-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n className: \"flex items-center space-x-1 px-2 py-1 bg-gray-100 dark:bg-gray-700 rounded-lg cursor-pointer hover:bg-gray-200 dark:hover:bg-gray-600\",\n onClick: handleRemoveTag\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n className: \"h-4 w-4 text-gray-500 dark:text-gray-300\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-xs text-gray-700 dark:text-gray-300\"\n }, capitalize(tag)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n className: \"h-4 w-4 text-gray-500 dark:text-gray-300 hover:text-red-500\"\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"relative inline-block text-left\",\n ref: dropdownRef\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n className: \"inline-flex justify-center w-full rounded-md border border-gray-300 dark:border-gray-700 shadow-sm px-4 py-2 bg-white dark:bg-gray-800 text-sm font-medium text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none\",\n id: \"menu-button\",\n \"aria-expanded\": dropdownOpen,\n \"aria-haspopup\": \"true\",\n onClick: function onClick() {\n return setDropdownOpen(!dropdownOpen);\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n className: \"h-5 w-5 text-gray-500 mr-2\"\n }), \" \", t(\"sort.\".concat(orderBy.split(\":\")[0]), capitalize(orderBy.split(\":\")[0].replace(\"_\", \" \"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n className: \"h-5 w-5 ml-2 text-gray-500 dark:text-gray-300\"\n })), dropdownOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"origin-top-right absolute left-0 sm:right-0 sm:left-auto mt-2 w-full sm:w-56 max-w-full rounded-md shadow-lg bg-white dark:bg-gray-800 ring-1 ring-black ring-opacity-5 focus:outline-none z-10\",\n role: \"menu\",\n \"aria-orientation\": \"vertical\",\n \"aria-labelledby\": \"menu-button\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"py-1 max-h-60 overflow-y-auto\",\n role: \"none\"\n }, [\"due_date:asc\", \"name:asc\", \"priority:desc\", \"status:desc\", \"created_at:desc\"].map(function (order) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n key: order,\n onClick: function onClick() {\n return handleSortChange(order);\n },\n className: \"block px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-600 w-full text-left\",\n role: \"menuitem\"\n }, t(\"sort.\".concat(order.split(\":\")[0]), capitalize(order.split(\":\")[0].replace(\"_\", \" \"))));\n }))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"mb-6 text-sm text-gray-500 dark:text-gray-400\"\n }, description), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm p-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n className: \"h-5 w-5 text-gray-500 dark:text-gray-400 mr-2\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n placeholder: getSearchPlaceholder(i18n.language),\n value: taskSearchQuery,\n onChange: function onChange(e) {\n return setTaskSearchQuery(e.target.value);\n },\n className: \"w-full bg-transparent border-none focus:ring-0 focus:outline-none dark:text-white\"\n }))), loading ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, t('common.loading', 'Loading...')) : error ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-red-500\"\n }, error) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, isNewTaskAllowed() && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Task_NewTask__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n onTaskCreate: (/*#__PURE__*/function () {\n var _ref7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee5(taskName) {\n return _regeneratorRuntime().wrap(function _callee5$(_context5) {\n while (1) switch (_context5.prev = _context5.next) {\n case 0:\n _context5.next = 2;\n return handleTaskCreate({\n name: taskName,\n status: \"not_started\"\n });\n case 2:\n return _context5.abrupt(\"return\", _context5.sent);\n case 3:\n case \"end\":\n return _context5.stop();\n }\n }, _callee5);\n }));\n return function (_x4) {\n return _ref7.apply(this, arguments);\n };\n }())\n }), filteredTasks.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Task_TaskList__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n tasks: filteredTasks,\n onTaskCreate: handleTaskCreate,\n onTaskUpdate: handleTaskUpdate,\n onTaskDelete: handleTaskDelete,\n projects: projects\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-gray-500 text-center mt-4\"\n }, t('tasks.noTasksAvailable', 'Δεν υπάρχουν διαθέσιμες εργασίες.')))));\n};\n_s(Tasks, \"5Z8QLe2HIWOxwpw6vPkauZx5154=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation, react_router_dom__WEBPACK_IMPORTED_MODULE_7__.useLocation, react_router_dom__WEBPACK_IMPORTED_MODULE_7__.useNavigate];\n});\n_c = Tasks;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Tasks);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"Tasks\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Tasks.tsx?");
-
-/***/ }),
-
-/***/ "./node_modules/@heroicons/react/24/outline/esm/ArrowRightIcon.js":
-/*!************************************************************************!*\
- !*** ./node_modules/@heroicons/react/24/outline/esm/ArrowRightIcon.js ***!
- \************************************************************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ArrowRightIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M13.5 4.5 21 12m0 0-7.5 7.5M21 12H3\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ArrowRightIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/ArrowRightIcon.js?");
-
-/***/ }),
-
-/***/ "./node_modules/@heroicons/react/24/outline/esm/Bars4Icon.js":
-/*!*******************************************************************!*\
- !*** ./node_modules/@heroicons/react/24/outline/esm/Bars4Icon.js ***!
- \*******************************************************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction Bars4Icon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M3.75 5.25h16.5m-16.5 4.5h16.5m-16.5 4.5h16.5m-16.5 4.5h16.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(Bars4Icon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/Bars4Icon.js?");
-
-/***/ }),
-
-/***/ "./node_modules/@heroicons/react/24/outline/esm/CalendarIcon.js":
-/*!**********************************************************************!*\
- !*** ./node_modules/@heroicons/react/24/outline/esm/CalendarIcon.js ***!
- \**********************************************************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction CalendarIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(CalendarIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/CalendarIcon.js?");
-
-/***/ }),
-
-/***/ "./node_modules/@heroicons/react/24/solid/esm/ChevronDoubleDownIcon.js":
-/*!*****************************************************************************!*\
- !*** ./node_modules/@heroicons/react/24/solid/esm/ChevronDoubleDownIcon.js ***!
- \*****************************************************************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ChevronDoubleDownIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M11.47 13.28a.75.75 0 0 0 1.06 0l7.5-7.5a.75.75 0 0 0-1.06-1.06L12 11.69 5.03 4.72a.75.75 0 0 0-1.06 1.06l7.5 7.5Z\",\n clipRule: \"evenodd\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M11.47 19.28a.75.75 0 0 0 1.06 0l7.5-7.5a.75.75 0 1 0-1.06-1.06L12 17.69l-6.97-6.97a.75.75 0 0 0-1.06 1.06l7.5 7.5Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ChevronDoubleDownIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/ChevronDoubleDownIcon.js?");
-
-/***/ }),
-
-/***/ "./node_modules/@heroicons/react/24/solid/esm/ChevronDownIcon.js":
-/*!***********************************************************************!*\
- !*** ./node_modules/@heroicons/react/24/solid/esm/ChevronDownIcon.js ***!
- \***********************************************************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ChevronDownIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M12.53 16.28a.75.75 0 0 1-1.06 0l-7.5-7.5a.75.75 0 0 1 1.06-1.06L12 14.69l6.97-6.97a.75.75 0 1 1 1.06 1.06l-7.5 7.5Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ChevronDownIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/ChevronDownIcon.js?");
-
-/***/ })
-
-}]);
\ No newline at end of file
diff --git a/dist/frontend_components_Tasks_tsx.5d1f9b2b7404e2433dee.js b/dist/frontend_components_Tasks_tsx.5d1f9b2b7404e2433dee.js
new file mode 100644
index 0000000..951a07c
--- /dev/null
+++ b/dist/frontend_components_Tasks_tsx.5d1f9b2b7404e2433dee.js
@@ -0,0 +1,92 @@
+"use strict";
+/*
+ * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
+ * This devtool is neither made for production nor for readable output files.
+ * It uses "eval()" calls to create a separate source file in the browser devtools.
+ * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
+ * or disable the default devtool with "devtool: false".
+ * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
+ */
+(self["webpackChunktududi"] = self["webpackChunktududi"] || []).push([["frontend_components_Tasks_tsx"],{
+
+/***/ "./frontend/components/Task/getDescription.ts":
+/*!****************************************************!*\
+ !*** ./frontend/components/Task/getDescription.ts ***!
+ \****************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getDescription: () => (/* binding */ getDescription)\n/* harmony export */ });\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar getDescription = function getDescription(query, projects, t) {\n try {\n // Default descriptions as fallbacks in case translation function fails\n var defaultDescriptions = {\n project: \"Project tasks\",\n today: \"Tasks due today or scheduled for immediate attention\",\n inbox: \"Uncategorized tasks without project or due date\",\n next: \"Tasks that are actionable in the near future\",\n upcoming: \"Tasks scheduled for the upcoming week\",\n someday: \"Tasks without urgency or specific due date\",\n completed: \"Tasks you've completed\",\n allTasks: \"All tasks from different projects and priorities\"\n };\n\n // Check for project_id first\n var projectId = query.get('project_id');\n if (projectId) {\n try {\n var project = projects.find(function (p) {\n var _p$id;\n return ((_p$id = p.id) === null || _p$id === void 0 ? void 0 : _p$id.toString()) === projectId;\n });\n if (project) {\n return t(\"taskViews.project.withName\", {\n projectName: project.name\n });\n } else {\n return t(\"taskViews.project.noName\");\n }\n } catch (e) {\n console.error(\"Translation error for project description:\", e);\n // Fallback with project name if available\n var _project = projects.find(function (p) {\n var _p$id2;\n return ((_p$id2 = p.id) === null || _p$id2 === void 0 ? void 0 : _p$id2.toString()) === projectId;\n });\n return _project ? \"Tasks for project: \".concat(_project.name) : defaultDescriptions.project;\n }\n }\n\n // Then check for type and status parameters\n try {\n if (query.get('type') === 'today') {\n return t(\"taskViews.today\");\n }\n if (query.get('type') === 'inbox') {\n return t(\"taskViews.inbox\");\n }\n if (query.get('type') === 'next') {\n return t(\"taskViews.next\");\n }\n if (query.get('type') === 'upcoming') {\n return t(\"taskViews.upcoming\");\n }\n if (query.get('type') === 'someday') {\n return t(\"taskViews.someday\");\n }\n if (query.get('status') === 'done') {\n return t(\"taskViews.completed\");\n }\n return t(\"taskViews.allTasks\");\n } catch (e) {\n console.error(\"Translation error for task view description:\", e);\n\n // Return appropriate fallback based on type or status\n if (query.get('type') === 'today') return defaultDescriptions.today;\n if (query.get('type') === 'inbox') return defaultDescriptions.inbox;\n if (query.get('type') === 'next') return defaultDescriptions.next;\n if (query.get('type') === 'upcoming') return defaultDescriptions.upcoming;\n if (query.get('type') === 'someday') return defaultDescriptions.someday;\n if (query.get('status') === 'done') return defaultDescriptions.completed;\n return defaultDescriptions.allTasks;\n }\n } catch (error) {\n console.error(\"Error in getDescription:\", error);\n return \"Tasks overview\";\n }\n};\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/getDescription.ts?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/getTitleAndIcon.ts":
+/*!*****************************************************!*\
+ !*** ./frontend/components/Task/getTitleAndIcon.ts ***!
+ \*****************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getTitleAndIcon: () => (/* binding */ getTitleAndIcon)\n/* harmony export */ });\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/FolderIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/CalendarIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/InboxIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ArrowRightIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ClockIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/MoonIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/CheckCircleIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/Bars4Icon.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\n\nvar getTitleAndIcon = function getTitleAndIcon(query, projects, t) {\n try {\n // Default titles as fallbacks in case translation function fails\n var defaultTitles = {\n project: 'Project',\n today: 'Today',\n inbox: 'Inbox',\n next: 'Next Actions',\n upcoming: 'Upcoming',\n someday: 'Someday',\n completed: 'Completed',\n allTasks: 'All Tasks'\n };\n var projectId = query.get('project_id');\n if (projectId) {\n var project = projects.find(function (p) {\n var _p$id;\n return ((_p$id = p.id) === null || _p$id === void 0 ? void 0 : _p$id.toString()) === projectId;\n });\n return {\n title: project ? project.name : t('sidebar.projects'),\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_0__[\"default\"]\n };\n }\n try {\n if (query.get('type') === 'today') {\n return {\n title: t('tasks.today'),\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_1__[\"default\"]\n };\n }\n if (query.get('type') === 'inbox') {\n return {\n title: t('sidebar.inbox'),\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n };\n }\n if (query.get('type') === 'next') {\n return {\n title: t('sidebar.nextActions'),\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n };\n }\n if (query.get('type') === 'upcoming') {\n return {\n title: t('sidebar.upcoming'),\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n };\n }\n if (query.get('type') === 'someday') {\n return {\n title: t('taskViews.someday') || defaultTitles.someday,\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__[\"default\"]\n };\n }\n if (query.get('status') === 'done') {\n return {\n title: t('sidebar.completed'),\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__[\"default\"]\n };\n }\n return {\n title: t('sidebar.allTasks'),\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__[\"default\"]\n };\n } catch (e) {\n console.error(\"Translation error for task view title:\", e);\n\n // Return appropriate fallback based on type or status\n if (query.get('type') === 'today') return {\n title: defaultTitles.today,\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_1__[\"default\"]\n };\n if (query.get('type') === 'inbox') return {\n title: defaultTitles.inbox,\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n };\n if (query.get('type') === 'next') return {\n title: defaultTitles.next,\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n };\n if (query.get('type') === 'upcoming') return {\n title: defaultTitles.upcoming,\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n };\n if (query.get('type') === 'someday') return {\n title: defaultTitles.someday,\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__[\"default\"]\n };\n if (query.get('status') === 'done') return {\n title: defaultTitles.completed,\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__[\"default\"]\n };\n return {\n title: defaultTitles.allTasks,\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__[\"default\"]\n };\n }\n } catch (error) {\n console.error(\"Error in getTitleAndIcon:\", error);\n return {\n title: \"Tasks\",\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__[\"default\"]\n };\n }\n};\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/getTitleAndIcon.ts?");
+
+/***/ }),
+
+/***/ "./frontend/components/Tasks.tsx":
+/*!***************************************!*\
+ !*** ./frontend/components/Tasks.tsx ***!
+ \***************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/dist/index.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _Task_TaskList__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Task/TaskList */ \"./frontend/components/Task/TaskList.tsx\");\n/* harmony import */ var _Task_NewTask__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Task/NewTask */ \"./frontend/components/Task/NewTask.tsx\");\n/* harmony import */ var _Task_getTitleAndIcon__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Task/getTitleAndIcon */ \"./frontend/components/Task/getTitleAndIcon.ts\");\n/* harmony import */ var _Task_getDescription__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Task/getDescription */ \"./frontend/components/Task/getDescription.ts\");\n/* harmony import */ var _utils_tasksService__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/tasksService */ \"./frontend/utils/tasksService.ts\");\n/* harmony import */ var _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Shared/ToastContext */ \"./frontend/components/Shared/ToastContext.tsx\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/TagIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/XMarkIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/ChevronDoubleDownIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/ChevronDownIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/MagnifyingGlassIcon.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\n\n\n\n\nvar capitalize = function capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\n// Helper function to get search placeholder by language\nvar getSearchPlaceholder = function getSearchPlaceholder(language) {\n var placeholders = {\n en: 'Search tasks...',\n el: 'Αναζήτηση εργασιών...',\n es: 'Buscar tareas...',\n de: 'Aufgaben suchen...',\n jp: 'タスクを検索...',\n ua: 'Пошук завдань...'\n };\n return placeholders[language] || 'Search tasks...';\n};\nvar Tasks = function Tasks() {\n _s();\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t,\n i18n = _useTranslation.i18n;\n var _useToast = (0,_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_7__.useToast)(),\n showSuccessToast = _useToast.showSuccessToast;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState2 = _slicedToArray(_useState, 2),\n tasks = _useState2[0],\n setTasks = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState4 = _slicedToArray(_useState3, 2),\n projects = _useState4[0],\n setProjects = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true),\n _useState6 = _slicedToArray(_useState5, 2),\n loading = _useState6[0],\n setLoading = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState8 = _slicedToArray(_useState7, 2),\n error = _useState8[0],\n setError = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState0 = _slicedToArray(_useState9, 2),\n dropdownOpen = _useState0[0],\n setDropdownOpen = _useState0[1];\n var _useState1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"due_date:asc\"),\n _useState10 = _slicedToArray(_useState1, 2),\n orderBy = _useState10[0],\n setOrderBy = _useState10[1];\n var _useState11 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\"),\n _useState12 = _slicedToArray(_useState11, 2),\n taskSearchQuery = _useState12[0],\n setTaskSearchQuery = _useState12[1];\n var dropdownRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n var location = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_8__.useLocation)();\n var navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_8__.useNavigate)();\n var query = new URLSearchParams(location.search);\n var _ref = location.state || {},\n stateTitle = _ref.title,\n stateIcon = _ref.icon;\n var _ref2 = stateTitle && stateIcon ? {\n title: stateTitle,\n icon: stateIcon\n } : (0,_Task_getTitleAndIcon__WEBPACK_IMPORTED_MODULE_4__.getTitleAndIcon)(query, projects, t),\n title = _ref2.title,\n icon = _ref2.icon;\n var IconComponent = typeof icon === \"string\" ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(icon) : icon;\n var tag = query.get(\"tag\");\n var status = query.get(\"status\");\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var savedOrderBy = localStorage.getItem(\"order_by\") || \"due_date:asc\";\n setOrderBy(savedOrderBy);\n var params = new URLSearchParams(location.search);\n if (!params.get(\"order_by\")) {\n params.set(\"order_by\", savedOrderBy);\n navigate({\n pathname: location.pathname,\n search: \"?\".concat(params.toString())\n }, {\n replace: true\n });\n }\n }, [location.pathname]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var handleClickOutside = function handleClickOutside(event) {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {\n setDropdownOpen(false);\n }\n };\n if (dropdownOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n return function () {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [dropdownOpen]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var fetchData = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var tagId, _yield$Promise$all, _yield$Promise$all2, tasksResponse, projectsResponse, tasksData, projectsData, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n setLoading(true);\n setError(null);\n _context.p = 1;\n tagId = query.get(\"tag\");\n _context.n = 2;\n return Promise.all([fetch(\"/api/tasks\".concat(location.search).concat(tagId ? \"&tag=\".concat(tagId) : \"\")), fetch(\"/api/projects\")]);\n case 2:\n _yield$Promise$all = _context.v;\n _yield$Promise$all2 = _slicedToArray(_yield$Promise$all, 2);\n tasksResponse = _yield$Promise$all2[0];\n projectsResponse = _yield$Promise$all2[1];\n if (!tasksResponse.ok) {\n _context.n = 4;\n break;\n }\n _context.n = 3;\n return tasksResponse.json();\n case 3:\n tasksData = _context.v;\n setTasks(tasksData.tasks || []);\n _context.n = 5;\n break;\n case 4:\n throw new Error(\"Failed to fetch tasks.\");\n case 5:\n if (!projectsResponse.ok) {\n _context.n = 7;\n break;\n }\n _context.n = 6;\n return projectsResponse.json();\n case 6:\n projectsData = _context.v;\n setProjects((projectsData === null || projectsData === void 0 ? void 0 : projectsData.projects) || []);\n _context.n = 8;\n break;\n case 7:\n throw new Error(\"Failed to fetch projects.\");\n case 8:\n _context.n = 10;\n break;\n case 9:\n _context.p = 9;\n _t = _context.v;\n setError(_t.message);\n case 10:\n _context.p = 10;\n setLoading(false);\n return _context.f(10);\n case 11:\n return _context.a(2);\n }\n }, _callee, null, [[1, 9, 10, 11]]);\n }));\n return function fetchData() {\n return _ref3.apply(this, arguments);\n };\n }();\n fetchData();\n }, [location]);\n var handleRemoveTag = function handleRemoveTag() {\n var params = new URLSearchParams(location.search);\n params[\"delete\"](\"tag\");\n navigate({\n pathname: location.pathname,\n search: \"?\".concat(params.toString())\n });\n };\n var handleTaskCreate = /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(taskData) {\n var newTask, taskLink, _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n _context2.p = 0;\n _context2.n = 1;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_6__.createTask)(taskData);\n case 1:\n newTask = _context2.v;\n // Add the new task optimistically to avoid race conditions\n setTasks(function (prevTasks) {\n return [newTask].concat(_toConsumableArray(prevTasks));\n });\n\n // Show success toast with task link\n taskLink = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, t('task.created', 'Task'), \" \", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: \"/task/\".concat(newTask.uuid),\n className: \"text-green-200 underline hover:text-green-100\"\n }, newTask.name), \" \", t('task.createdSuccessfully', 'created successfully!'));\n showSuccessToast(taskLink);\n _context2.n = 3;\n break;\n case 2:\n _context2.p = 2;\n _t2 = _context2.v;\n console.error(\"Error creating task:\", _t2);\n setError(\"Error creating task.\");\n throw _t2;\n case 3:\n return _context2.a(2);\n }\n }, _callee2, null, [[0, 2]]);\n }));\n return function handleTaskCreate(_x) {\n return _ref4.apply(this, arguments);\n };\n }();\n var handleTaskUpdate = /*#__PURE__*/function () {\n var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(updatedTask) {\n var response, errorData, _t3;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n _context3.p = 0;\n _context3.n = 1;\n return fetch(\"/api/task/\".concat(updatedTask.id), {\n method: \"PATCH\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(updatedTask)\n });\n case 1:\n response = _context3.v;\n if (!response.ok) {\n _context3.n = 2;\n break;\n }\n setTasks(function (prevTasks) {\n return prevTasks.map(function (task) {\n return task.id === updatedTask.id ? updatedTask : task;\n });\n });\n _context3.n = 4;\n break;\n case 2:\n _context3.n = 3;\n return response.json();\n case 3:\n errorData = _context3.v;\n console.error(\"Failed to update task:\", errorData.error);\n setError(\"Failed to update task.\");\n case 4:\n _context3.n = 6;\n break;\n case 5:\n _context3.p = 5;\n _t3 = _context3.v;\n console.error(\"Error updating task:\", _t3);\n setError(\"Error updating task.\");\n case 6:\n return _context3.a(2);\n }\n }, _callee3, null, [[0, 5]]);\n }));\n return function handleTaskUpdate(_x2) {\n return _ref5.apply(this, arguments);\n };\n }();\n var handleTaskDelete = /*#__PURE__*/function () {\n var _ref6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(taskId) {\n var response, errorData, _t4;\n return _regenerator().w(function (_context4) {\n while (1) switch (_context4.n) {\n case 0:\n _context4.p = 0;\n _context4.n = 1;\n return fetch(\"/api/task/\".concat(taskId), {\n method: \"DELETE\"\n });\n case 1:\n response = _context4.v;\n if (!response.ok) {\n _context4.n = 2;\n break;\n }\n setTasks(function (prevTasks) {\n return prevTasks.filter(function (task) {\n return task.id !== taskId;\n });\n });\n _context4.n = 4;\n break;\n case 2:\n _context4.n = 3;\n return response.json();\n case 3:\n errorData = _context4.v;\n console.error(\"Failed to delete task:\", errorData.error);\n setError(\"Failed to delete task.\");\n case 4:\n _context4.n = 6;\n break;\n case 5:\n _context4.p = 5;\n _t4 = _context4.v;\n console.error(\"Error deleting task:\", _t4);\n setError(\"Error deleting task.\");\n case 6:\n return _context4.a(2);\n }\n }, _callee4, null, [[0, 5]]);\n }));\n return function handleTaskDelete(_x3) {\n return _ref6.apply(this, arguments);\n };\n }();\n var handleToggleToday = /*#__PURE__*/function () {\n var _ref7 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5(taskId) {\n var updatedTask, _t5;\n return _regenerator().w(function (_context5) {\n while (1) switch (_context5.n) {\n case 0:\n _context5.p = 0;\n _context5.n = 1;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_6__.toggleTaskToday)(taskId);\n case 1:\n updatedTask = _context5.v;\n setTasks(function (prevTasks) {\n return prevTasks.map(function (task) {\n return task.id === taskId ? updatedTask : task;\n });\n });\n _context5.n = 3;\n break;\n case 2:\n _context5.p = 2;\n _t5 = _context5.v;\n console.error(\"Error toggling task today status:\", _t5);\n setError(\"Error toggling task today status.\");\n case 3:\n return _context5.a(2);\n }\n }, _callee5, null, [[0, 2]]);\n }));\n return function handleToggleToday(_x4) {\n return _ref7.apply(this, arguments);\n };\n }();\n var handleSortChange = function handleSortChange(order) {\n setOrderBy(order);\n localStorage.setItem(\"order_by\", order);\n var params = new URLSearchParams(location.search);\n params.set(\"order_by\", order);\n navigate({\n pathname: location.pathname,\n search: \"?\".concat(params.toString())\n }, {\n replace: true\n });\n setDropdownOpen(false);\n };\n var description = (0,_Task_getDescription__WEBPACK_IMPORTED_MODULE_5__.getDescription)(query, projects, t);\n var isNewTaskAllowed = function isNewTaskAllowed() {\n return status !== \"done\";\n };\n var filteredTasks = tasks.filter(function (task) {\n return task.name.toLowerCase().includes(taskSearchQuery.toLowerCase());\n });\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex justify-center px-4 lg:px-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-full max-w-5xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex flex-col sm:flex-row items-start sm:items-center justify-between mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center mb-2 sm:mb-0\"\n }, IconComponent && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(IconComponent, {\n className: \"h-6 w-6 mr-2\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h2\", {\n className: \"text-2xl font-light\"\n }, title), tag && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"ml-4 flex items-center space-x-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n className: \"flex items-center space-x-1 px-2 py-1 bg-gray-100 dark:bg-gray-700 rounded-lg cursor-pointer hover:bg-gray-200 dark:hover:bg-gray-600\",\n onClick: handleRemoveTag\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n className: \"h-4 w-4 text-gray-500 dark:text-gray-300\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-xs text-gray-700 dark:text-gray-300\"\n }, capitalize(tag)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n className: \"h-4 w-4 text-gray-500 dark:text-gray-300 hover:text-red-500\"\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"relative inline-block text-left\",\n ref: dropdownRef\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n className: \"inline-flex justify-center w-full rounded-md border border-gray-300 dark:border-gray-700 shadow-sm px-4 py-2 bg-white dark:bg-gray-800 text-sm font-medium text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none\",\n id: \"menu-button\",\n \"aria-expanded\": dropdownOpen,\n \"aria-haspopup\": \"true\",\n onClick: function onClick() {\n return setDropdownOpen(!dropdownOpen);\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n className: \"h-5 w-5 text-gray-500 mr-2\"\n }), \" \", t(\"sort.\".concat(orderBy.split(\":\")[0]), capitalize(orderBy.split(\":\")[0].replace(\"_\", \" \"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n className: \"h-5 w-5 ml-2 text-gray-500 dark:text-gray-300\"\n })), dropdownOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"origin-top-right absolute left-0 sm:right-0 sm:left-auto mt-2 w-full sm:w-56 max-w-full rounded-md shadow-lg bg-white dark:bg-gray-800 ring-1 ring-black ring-opacity-5 focus:outline-none z-10\",\n role: \"menu\",\n \"aria-orientation\": \"vertical\",\n \"aria-labelledby\": \"menu-button\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"py-1 max-h-60 overflow-y-auto\",\n role: \"none\"\n }, [\"due_date:asc\", \"name:asc\", \"priority:desc\", \"status:desc\", \"created_at:desc\"].map(function (order) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n key: order,\n onClick: function onClick() {\n return handleSortChange(order);\n },\n className: \"block px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-600 w-full text-left\",\n role: \"menuitem\"\n }, t(\"sort.\".concat(order.split(\":\")[0]), capitalize(order.split(\":\")[0].replace(\"_\", \" \"))));\n }))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"mb-6 text-sm text-gray-500 dark:text-gray-400\"\n }, description), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm p-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n className: \"h-5 w-5 text-gray-500 dark:text-gray-400 mr-2\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n placeholder: getSearchPlaceholder(i18n.language),\n value: taskSearchQuery,\n onChange: function onChange(e) {\n return setTaskSearchQuery(e.target.value);\n },\n className: \"w-full bg-transparent border-none focus:ring-0 focus:outline-none dark:text-white\"\n }))), loading ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, t('common.loading', 'Loading...')) : error ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-red-500\"\n }, error) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, isNewTaskAllowed() && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Task_NewTask__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n onTaskCreate: (/*#__PURE__*/function () {\n var _ref8 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6(taskName) {\n return _regenerator().w(function (_context6) {\n while (1) switch (_context6.n) {\n case 0:\n _context6.n = 1;\n return handleTaskCreate({\n name: taskName,\n status: \"not_started\"\n });\n case 1:\n return _context6.a(2, _context6.v);\n }\n }, _callee6);\n }));\n return function (_x5) {\n return _ref8.apply(this, arguments);\n };\n }())\n }), filteredTasks.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Task_TaskList__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n tasks: filteredTasks,\n onTaskCreate: handleTaskCreate,\n onTaskUpdate: handleTaskUpdate,\n onTaskDelete: handleTaskDelete,\n projects: projects,\n onToggleToday: handleToggleToday\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-gray-500 text-center mt-4\"\n }, t('tasks.noTasksAvailable', 'Δεν υπάρχουν διαθέσιμες εργασίες.')))));\n};\n_s(Tasks, \"7cXHhgxV76T78Gi1ssdbN0j9tpU=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation, _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_7__.useToast, react_router_dom__WEBPACK_IMPORTED_MODULE_8__.useLocation, react_router_dom__WEBPACK_IMPORTED_MODULE_8__.useNavigate];\n});\n_c = Tasks;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Tasks);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"Tasks\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Tasks.tsx?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/ArrowRightIcon.js":
+/*!************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/ArrowRightIcon.js ***!
+ \************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ArrowRightIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M13.5 4.5 21 12m0 0-7.5 7.5M21 12H3\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ArrowRightIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/ArrowRightIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/Bars4Icon.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/Bars4Icon.js ***!
+ \*******************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction Bars4Icon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M3.75 5.25h16.5m-16.5 4.5h16.5m-16.5 4.5h16.5m-16.5 4.5h16.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(Bars4Icon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/Bars4Icon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/solid/esm/ChevronDoubleDownIcon.js":
+/*!*****************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/solid/esm/ChevronDoubleDownIcon.js ***!
+ \*****************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ChevronDoubleDownIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M11.47 13.28a.75.75 0 0 0 1.06 0l7.5-7.5a.75.75 0 0 0-1.06-1.06L12 11.69 5.03 4.72a.75.75 0 0 0-1.06 1.06l7.5 7.5Z\",\n clipRule: \"evenodd\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M11.47 19.28a.75.75 0 0 0 1.06 0l7.5-7.5a.75.75 0 1 0-1.06-1.06L12 17.69l-6.97-6.97a.75.75 0 0 0-1.06 1.06l7.5 7.5Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ChevronDoubleDownIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/ChevronDoubleDownIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/solid/esm/ChevronDownIcon.js":
+/*!***********************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/solid/esm/ChevronDownIcon.js ***!
+ \***********************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ChevronDownIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M12.53 16.28a.75.75 0 0 1-1.06 0l-7.5-7.5a.75.75 0 0 1 1.06-1.06L12 14.69l6.97-6.97a.75.75 0 1 1 1.06 1.06l-7.5 7.5Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ChevronDownIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/ChevronDownIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/solid/esm/XMarkIcon.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/solid/esm/XMarkIcon.js ***!
+ \*****************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction XMarkIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M5.47 5.47a.75.75 0 0 1 1.06 0L12 10.94l5.47-5.47a.75.75 0 1 1 1.06 1.06L13.06 12l5.47 5.47a.75.75 0 1 1-1.06 1.06L12 13.06l-5.47 5.47a.75.75 0 0 1-1.06-1.06L10.94 12 5.47 6.53a.75.75 0 0 1 0-1.06Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(XMarkIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/XMarkIcon.js?");
+
+/***/ })
+
+}]);
\ No newline at end of file
diff --git a/dist/index.html b/dist/index.html
index 98ae913..7eccfce 100644
--- a/dist/index.html
+++ b/dist/index.html
@@ -5,7 +5,7 @@
Tududi
-
+
diff --git a/dist/main.272db06f0669b56179b9.js b/dist/main.272db06f0669b56179b9.js
new file mode 100644
index 0000000..921be2a
--- /dev/null
+++ b/dist/main.272db06f0669b56179b9.js
@@ -0,0 +1,15750 @@
+/*
+ * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
+ * This devtool is neither made for production nor for readable output files.
+ * It uses "eval()" calls to create a separate source file in the browser devtools.
+ * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
+ * or disable the default devtool with "devtool: false".
+ * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
+ */
+/******/ (() => { // webpackBootstrap
+/******/ var __webpack_modules__ = ({
+
+/***/ "./frontend/App.tsx":
+/*!**************************!*\
+ !*** ./frontend/App.tsx ***!
+ \**************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/dist/index.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _components_Login__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/Login */ \"./frontend/components/Login.tsx\");\n/* harmony import */ var _components_Shared_NotFound__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/Shared/NotFound */ \"./frontend/components/Shared/NotFound.tsx\");\n/* harmony import */ var _components_Project_ProjectDetails__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/Project/ProjectDetails */ \"./frontend/components/Project/ProjectDetails.tsx\");\n/* harmony import */ var _components_Projects__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/Projects */ \"./frontend/components/Projects.tsx\");\n/* harmony import */ var _components_Area_AreaDetails__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/Area/AreaDetails */ \"./frontend/components/Area/AreaDetails.tsx\");\n/* harmony import */ var _components_Areas__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/Areas */ \"./frontend/components/Areas.tsx\");\n/* harmony import */ var _components_Tag_TagDetails__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./components/Tag/TagDetails */ \"./frontend/components/Tag/TagDetails.tsx\");\n/* harmony import */ var _components_Tags__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./components/Tags */ \"./frontend/components/Tags.tsx\");\n/* harmony import */ var _components_Notes__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./components/Notes */ \"./frontend/components/Notes.tsx\");\n/* harmony import */ var _components_Note_NoteDetails__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./components/Note/NoteDetails */ \"./frontend/components/Note/NoteDetails.tsx\");\n/* harmony import */ var _components_Calendar__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./components/Calendar */ \"./frontend/components/Calendar.tsx\");\n/* harmony import */ var _components_Profile_ProfileSettings__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./components/Profile/ProfileSettings */ \"./frontend/components/Profile/ProfileSettings.tsx\");\n/* harmony import */ var _Layout__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Layout */ \"./frontend/Layout.tsx\");\n/* harmony import */ var _components_Task_TasksToday__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./components/Task/TasksToday */ \"./frontend/components/Task/TasksToday.tsx\");\n/* harmony import */ var _components_Task_TaskView__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./components/Task/TaskView */ \"./frontend/components/Task/TaskView.tsx\");\n/* harmony import */ var _components_Shared_LoadingScreen__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./components/Shared/LoadingScreen */ \"./frontend/components/Shared/LoadingScreen.tsx\");\n/* harmony import */ var _components_Inbox_InboxItems__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./components/Inbox/InboxItems */ \"./frontend/components/Inbox/InboxItems.tsx\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// Lazy load Tasks component to prevent issues with tags loading\nvar Tasks = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.lazy)(_c = function _c() {\n return __webpack_require__.e(/*! import() */ \"frontend_components_Tasks_tsx\").then(__webpack_require__.bind(__webpack_require__, /*! ./components/Tasks */ \"./frontend/components/Tasks.tsx\"));\n});\n_c2 = Tasks;\nvar App = function App() {\n _s();\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t,\n i18n = _useTranslation.i18n;\n if (!i18n.isInitialized) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Shared_LoadingScreen__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null);\n }\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState2 = _slicedToArray(_useState, 2),\n currentUser = _useState2[0],\n setCurrentUser = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true),\n _useState4 = _slicedToArray(_useState3, 2),\n loading = _useState4[0],\n setLoading = _useState4[1];\n var fetchCurrentUser = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var response, data, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n _context.p = 0;\n _context.n = 1;\n return fetch(\"/api/current_user\", {\n credentials: \"include\",\n headers: {\n Accept: \"application/json\"\n }\n });\n case 1:\n response = _context.v;\n if (response.ok) {\n _context.n = 3;\n break;\n }\n if (!(response.status === 401)) {\n _context.n = 2;\n break;\n }\n setCurrentUser(null);\n return _context.a(2);\n case 2:\n throw new Error(\"Failed to fetch user: \".concat(response.status));\n case 3:\n _context.n = 4;\n return response.json();\n case 4:\n data = _context.v;\n if (data.user) {\n setCurrentUser(data.user);\n } else {\n setCurrentUser(null);\n }\n _context.n = 6;\n break;\n case 5:\n _context.p = 5;\n _t = _context.v;\n setCurrentUser(null);\n case 6:\n _context.p = 6;\n setLoading(false);\n return _context.f(6);\n case 7:\n return _context.a(2);\n }\n }, _callee, null, [[0, 5, 6, 7]]);\n }));\n return function fetchCurrentUser() {\n return _ref.apply(this, arguments);\n };\n }();\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n // Fetch user on mount\n fetchCurrentUser();\n }, []);\n\n // Listen for login events to update user state\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var handleUserLoggedIn = function handleUserLoggedIn(event) {\n var user = event.detail;\n setCurrentUser(user);\n };\n window.addEventListener('userLoggedIn', handleUserLoggedIn);\n return function () {\n return window.removeEventListener('userLoggedIn', handleUserLoggedIn);\n };\n }, []);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (i18n.isInitialized) {\n fetch(\"/locales/\".concat(i18n.language, \"/translation.json\")).then(function (response) {\n return response.json();\n }).then(function (data) {\n i18n.addResourceBundle(i18n.language, 'translation', data, true, true);\n })[\"catch\"](function (error) {\n console.error(\"Error manually fetching translation file:\", error);\n });\n }\n }, [i18n.isInitialized]);\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(function () {\n var storedPreference = localStorage.getItem(\"isDarkMode\");\n return storedPreference !== null ? storedPreference === \"true\" : window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n }),\n _useState6 = _slicedToArray(_useState5, 2),\n isDarkMode = _useState6[0],\n setIsDarkMode = _useState6[1];\n var toggleDarkMode = function toggleDarkMode() {\n var newValue = !isDarkMode;\n setIsDarkMode(newValue);\n localStorage.setItem(\"isDarkMode\", JSON.stringify(newValue));\n };\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var updateTheme = function updateTheme() {\n document.documentElement.classList.toggle(\"dark\", isDarkMode);\n };\n updateTheme();\n var mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n var mediaListener = function mediaListener(e) {\n if (!localStorage.getItem(\"isDarkMode\")) {\n setIsDarkMode(e.matches);\n }\n };\n mediaQuery.addEventListener(\"change\", mediaListener);\n return function () {\n return mediaQuery.removeEventListener(\"change\", mediaListener);\n };\n }, [isDarkMode]);\n var LoadingComponent = function LoadingComponent() {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-center h-screen bg-gray-100 dark:bg-gray-900\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-xl font-semibold text-gray-700 dark:text-gray-200\"\n }, i18n.t('common.loading', 'Loading application... Please wait.')));\n };\n if (loading) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(LoadingComponent, null);\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react__WEBPACK_IMPORTED_MODULE_0__.Suspense, {\n fallback: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(LoadingComponent, null)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Routes, null, currentUser ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Route, {\n element: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Layout__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n currentUser: currentUser,\n setCurrentUser: setCurrentUser,\n isDarkMode: isDarkMode,\n toggleDarkMode: toggleDarkMode\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Outlet, null))\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Route, {\n index: true,\n element: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Navigate, {\n to: \"/today\",\n replace: true\n })\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Route, {\n path: \"/today\",\n element: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Task_TasksToday__WEBPACK_IMPORTED_MODULE_15__[\"default\"], null)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Route, {\n path: \"/task/:uuid\",\n element: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Task_TaskView__WEBPACK_IMPORTED_MODULE_16__[\"default\"], null)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Route, {\n path: \"/tasks\",\n element: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react__WEBPACK_IMPORTED_MODULE_0__.Suspense, {\n fallback: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-4\"\n }, i18n.t('common.loading', 'Loading...'))\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Tasks, null))\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Route, {\n path: \"/inbox\",\n element: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Inbox_InboxItems__WEBPACK_IMPORTED_MODULE_18__[\"default\"], null)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Route, {\n path: \"/projects\",\n element: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Projects__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Route, {\n path: \"/project/:id\",\n element: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Project_ProjectDetails__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Route, {\n path: \"/areas\",\n element: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Areas__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Route, {\n path: \"/area/:id\",\n element: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Area_AreaDetails__WEBPACK_IMPORTED_MODULE_6__[\"default\"], null)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Route, {\n path: \"/tags\",\n element: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Tags__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Route, {\n path: \"/tag/:id\",\n element: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Tag_TagDetails__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Route, {\n path: \"/notes\",\n element: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Notes__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Route, {\n path: \"/note/:id\",\n element: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Note_NoteDetails__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Route, {\n path: \"/calendar\",\n element: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Calendar__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Route, {\n path: \"/profile\",\n element: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Profile_ProfileSettings__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n currentUser: currentUser,\n isDarkMode: isDarkMode,\n toggleDarkMode: toggleDarkMode\n })\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Route, {\n path: \"*\",\n element: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Shared_NotFound__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null)\n }))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Route, {\n path: \"/login\",\n element: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Login__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Route, {\n path: \"/\",\n element: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Navigate, {\n to: \"/login\",\n replace: true\n })\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Route, {\n path: \"*\",\n element: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_19__.Navigate, {\n to: \"/login\",\n replace: true\n })\n }))));\n};\n_s(App, \"7nQiKN5hL2Dy33urFkACBnncSJM=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c3 = App;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (App);\nvar _c, _c2, _c3;\n__webpack_require__.$Refresh$.register(_c, \"Tasks$lazy\");\n__webpack_require__.$Refresh$.register(_c2, \"Tasks\");\n__webpack_require__.$Refresh$.register(_c3, \"App\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/App.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/Layout.tsx":
+/*!*****************************!*\
+ !*** ./frontend/Layout.tsx ***!
+ \*****************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/PlusIcon.js\");\n/* harmony import */ var _components_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/Shared/ToastContext */ \"./frontend/components/Shared/ToastContext.tsx\");\n/* harmony import */ var _components_Navbar__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/Navbar */ \"./frontend/components/Navbar.tsx\");\n/* harmony import */ var _components_Sidebar__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/Sidebar */ \"./frontend/components/Sidebar.tsx\");\n/* harmony import */ var _styles_tailwind_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./styles/tailwind.css */ \"./frontend/styles/tailwind.css\");\n/* harmony import */ var _components_Project_ProjectModal__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/Project/ProjectModal */ \"./frontend/components/Project/ProjectModal.tsx\");\n/* harmony import */ var _components_Note_NoteModal__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/Note/NoteModal */ \"./frontend/components/Note/NoteModal.tsx\");\n/* harmony import */ var _components_Area_AreaModal__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./components/Area/AreaModal */ \"./frontend/components/Area/AreaModal.tsx\");\n/* harmony import */ var _components_Tag_TagModal__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./components/Tag/TagModal */ \"./frontend/components/Tag/TagModal.tsx\");\n/* harmony import */ var _components_Task_SimplifiedTaskModal__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./components/Task/SimplifiedTaskModal */ \"./frontend/components/Task/SimplifiedTaskModal.tsx\");\n/* harmony import */ var _components_Task_TaskModal__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./components/Task/TaskModal */ \"./frontend/components/Task/TaskModal.tsx\");\n/* harmony import */ var _store_useStore__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./store/useStore */ \"./frontend/store/useStore.ts\");\n/* harmony import */ var _utils_notesService__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./utils/notesService */ \"./frontend/utils/notesService.ts\");\n/* harmony import */ var _utils_areasService__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./utils/areasService */ \"./frontend/utils/areasService.ts\");\n/* harmony import */ var _utils_tagsService__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./utils/tagsService */ \"./frontend/utils/tagsService.ts\");\n/* harmony import */ var _utils_projectsService__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./utils/projectsService */ \"./frontend/utils/projectsService.ts\");\n/* harmony import */ var _utils_tasksService__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./utils/tasksService */ \"./frontend/utils/tasksService.ts\");\n/* harmony import */ var _utils_authUtils__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./utils/authUtils */ \"./frontend/utils/authUtils.ts\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar Layout = function Layout(_ref) {\n _s();\n var currentUser = _ref.currentUser,\n setCurrentUser = _ref.setCurrentUser,\n isDarkMode = _ref.isDarkMode,\n toggleDarkMode = _ref.toggleDarkMode,\n children = _ref.children;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var _useToast = (0,_components_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_2__.useToast)(),\n showSuccessToast = _useToast.showSuccessToast;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(window.innerWidth >= 1024),\n _useState2 = _slicedToArray(_useState, 2),\n isSidebarOpen = _useState2[0],\n setIsSidebarOpen = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState4 = _slicedToArray(_useState3, 2),\n isTaskModalOpen = _useState4[0],\n setIsTaskModalOpen = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState6 = _slicedToArray(_useState5, 2),\n isProjectModalOpen = _useState6[0],\n setIsProjectModalOpen = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState8 = _slicedToArray(_useState7, 2),\n isNoteModalOpen = _useState8[0],\n setIsNoteModalOpen = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState0 = _slicedToArray(_useState9, 2),\n isAreaModalOpen = _useState0[0],\n setIsAreaModalOpen = _useState0[1];\n var _useState1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState10 = _slicedToArray(_useState1, 2),\n isTagModalOpen = _useState10[0],\n setIsTagModalOpen = _useState10[1];\n var _useState11 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('simplified'),\n _useState12 = _slicedToArray(_useState11, 2),\n taskModalType = _useState12[0],\n setTaskModalType = _useState12[1];\n var _useState13 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState14 = _slicedToArray(_useState13, 2),\n selectedNote = _useState14[0],\n setSelectedNote = _useState14[1];\n var _useState15 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState16 = _slicedToArray(_useState15, 2),\n selectedArea = _useState16[0],\n setSelectedArea = _useState16[1];\n var _useState17 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState18 = _slicedToArray(_useState17, 2),\n selectedTag = _useState18[0],\n setSelectedTag = _useState18[1];\n var _useState19 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState20 = _slicedToArray(_useState19, 2),\n newTask = _useState20[0],\n setNewTask = _useState20[1];\n var _useStore = (0,_store_useStore__WEBPACK_IMPORTED_MODULE_12__.useStore)(),\n _useStore$notesStore = _useStore.notesStore,\n notes = _useStore$notesStore.notes,\n setNotes = _useStore$notesStore.setNotes,\n setNotesLoading = _useStore$notesStore.setLoading,\n setNotesError = _useStore$notesStore.setError,\n isNotesLoading = _useStore$notesStore.isLoading,\n isNotesError = _useStore$notesStore.isError,\n _useStore$areasStore = _useStore.areasStore,\n areas = _useStore$areasStore.areas,\n setAreas = _useStore$areasStore.setAreas,\n setAreasLoading = _useStore$areasStore.setLoading,\n setAreasError = _useStore$areasStore.setError,\n isAreasLoading = _useStore$areasStore.isLoading,\n isAreasError = _useStore$areasStore.isError,\n _useStore$tasksStore = _useStore.tasksStore,\n setTasksLoading = _useStore$tasksStore.setLoading,\n setTasksError = _useStore$tasksStore.setError,\n isTasksLoading = _useStore$tasksStore.isLoading,\n isTasksError = _useStore$tasksStore.isError,\n _useStore$projectsSto = _useStore.projectsStore,\n projects = _useStore$projectsSto.projects,\n setProjects = _useStore$projectsSto.setProjects,\n setProjectsLoading = _useStore$projectsSto.setLoading,\n setProjectsError = _useStore$projectsSto.setError,\n isProjectsLoading = _useStore$projectsSto.isLoading,\n isProjectsError = _useStore$projectsSto.isError,\n _useStore$tagsStore = _useStore.tagsStore,\n tags = _useStore$tagsStore.tags,\n setTags = _useStore$tagsStore.setTags,\n setTagsLoading = _useStore$tagsStore.setLoading,\n setTagsError = _useStore$tagsStore.setError,\n isTagsLoading = _useStore$tagsStore.isLoading,\n isTagsError = _useStore$tagsStore.isError;\n var openTaskModal = function openTaskModal() {\n var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'simplified';\n setIsTaskModalOpen(true);\n setTaskModalType(type);\n };\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var handleResize = function handleResize() {\n setIsSidebarOpen(window.innerWidth >= 1024);\n };\n window.addEventListener(\"resize\", handleResize);\n return function () {\n return window.removeEventListener(\"resize\", handleResize);\n };\n }, []);\n var loadNotes = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var notesData, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n setNotesLoading(true);\n _context.p = 1;\n _context.n = 2;\n return (0,_utils_notesService__WEBPACK_IMPORTED_MODULE_13__.fetchNotes)();\n case 2:\n notesData = _context.v;\n setNotes(notesData);\n _context.n = 4;\n break;\n case 3:\n _context.p = 3;\n _t = _context.v;\n console.error(\"Error fetching notes:\", _t);\n setNotesError(true);\n case 4:\n _context.p = 4;\n setNotesLoading(false);\n return _context.f(4);\n case 5:\n return _context.a(2);\n }\n }, _callee, null, [[1, 3, 4, 5]]);\n }));\n return function loadNotes() {\n return _ref2.apply(this, arguments);\n };\n }();\n var loadAreas = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {\n var areasData, _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n setAreasLoading(true);\n _context2.p = 1;\n _context2.n = 2;\n return (0,_utils_areasService__WEBPACK_IMPORTED_MODULE_14__.fetchAreas)();\n case 2:\n areasData = _context2.v;\n setAreas(areasData);\n _context2.n = 4;\n break;\n case 3:\n _context2.p = 3;\n _t2 = _context2.v;\n console.error(\"Error fetching areas:\", _t2);\n setAreasError(true);\n case 4:\n _context2.p = 4;\n setAreasLoading(false);\n return _context2.f(4);\n case 5:\n return _context2.a(2);\n }\n }, _callee2, null, [[1, 3, 4, 5]]);\n }));\n return function loadAreas() {\n return _ref3.apply(this, arguments);\n };\n }();\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n loadNotes();\n loadAreas();\n }, []);\n var openNoteModal = function openNoteModal() {\n var note = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n setSelectedNote(note);\n setIsNoteModalOpen(true);\n };\n var closeNoteModal = function closeNoteModal() {\n setIsNoteModalOpen(false);\n setSelectedNote(null);\n };\n var closeTaskModal = function closeTaskModal() {\n setIsTaskModalOpen(false);\n setNewTask(null);\n };\n var openProjectModal = function openProjectModal() {\n setIsProjectModalOpen(true);\n };\n var closeProjectModal = function closeProjectModal() {\n setIsProjectModalOpen(false);\n };\n var openAreaModal = function openAreaModal() {\n var area = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n setSelectedArea(area);\n setIsAreaModalOpen(true);\n };\n var closeAreaModal = function closeAreaModal() {\n setIsAreaModalOpen(false);\n setSelectedArea(null);\n };\n var openTagModal = function openTagModal() {\n var tag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n setSelectedTag(tag);\n setIsTagModalOpen(true);\n };\n var closeTagModal = function closeTagModal() {\n setIsTagModalOpen(false);\n setSelectedTag(null);\n };\n var handleSaveNote = /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(noteData) {\n var _t3;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n _context3.p = 0;\n if (!noteData.id) {\n _context3.n = 2;\n break;\n }\n _context3.n = 1;\n return (0,_utils_notesService__WEBPACK_IMPORTED_MODULE_13__.updateNote)(noteData.id, noteData);\n case 1:\n _context3.n = 3;\n break;\n case 2:\n _context3.n = 3;\n return (0,_utils_notesService__WEBPACK_IMPORTED_MODULE_13__.createNote)(noteData);\n case 3:\n loadNotes();\n closeNoteModal();\n _context3.n = 6;\n break;\n case 4:\n _context3.p = 4;\n _t3 = _context3.v;\n console.error(\"Error saving note:\", _t3);\n // Don't close modal if there's an auth error (user will be redirected)\n if (!(0,_utils_authUtils__WEBPACK_IMPORTED_MODULE_18__.isAuthError)(_t3)) {\n _context3.n = 5;\n break;\n }\n return _context3.a(2);\n case 5:\n closeNoteModal();\n case 6:\n return _context3.a(2);\n }\n }, _callee3, null, [[0, 4]]);\n }));\n return function handleSaveNote(_x) {\n return _ref4.apply(this, arguments);\n };\n }();\n var handleSaveTask = /*#__PURE__*/function () {\n var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(taskData) {\n var taskLink, createdTask, _taskLink, _t4;\n return _regenerator().w(function (_context4) {\n while (1) switch (_context4.n) {\n case 0:\n _context4.p = 0;\n if (!taskData.id) {\n _context4.n = 2;\n break;\n }\n _context4.n = 1;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_17__.updateTask)(taskData.id, taskData);\n case 1:\n taskLink = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, t('task.updated', 'Task'), \" \", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: \"/tasks\",\n className: \"text-green-200 underline hover:text-green-100\"\n }, taskData.name), \" \", t('task.updatedSuccessfully', 'updated successfully!'));\n showSuccessToast(taskLink);\n _context4.n = 4;\n break;\n case 2:\n _context4.n = 3;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_17__.createTask)(taskData);\n case 3:\n createdTask = _context4.v;\n _taskLink = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, t('task.created', 'Task'), \" \", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: \"/tasks\",\n className: \"text-green-200 underline hover:text-green-100\"\n }, createdTask.name), \" \", t('task.createdSuccessfully', 'created successfully!'));\n showSuccessToast(_taskLink);\n case 4:\n // Don't refetch all tasks here - let individual components handle their own state\n // This prevents unnecessary re-renders and race conditions\n closeTaskModal();\n _context4.n = 7;\n break;\n case 5:\n _context4.p = 5;\n _t4 = _context4.v;\n console.error(\"Error saving task:\", _t4);\n // Don't close modal if there's an auth error (user will be redirected)\n if (!(0,_utils_authUtils__WEBPACK_IMPORTED_MODULE_18__.isAuthError)(_t4)) {\n _context4.n = 6;\n break;\n }\n return _context4.a(2);\n case 6:\n // For other errors, still close the modal but let the error bubble up\n closeTaskModal();\n throw _t4;\n case 7:\n return _context4.a(2);\n }\n }, _callee4, null, [[0, 5]]);\n }));\n return function handleSaveTask(_x2) {\n return _ref5.apply(this, arguments);\n };\n }();\n var handleCreateProject = /*#__PURE__*/function () {\n var _ref6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5(name) {\n var newProject, _t5;\n return _regenerator().w(function (_context5) {\n while (1) switch (_context5.n) {\n case 0:\n _context5.p = 0;\n _context5.n = 1;\n return (0,_utils_projectsService__WEBPACK_IMPORTED_MODULE_16__.createProject)({\n name: name,\n active: true\n });\n case 1:\n newProject = _context5.v;\n return _context5.a(2, newProject);\n case 2:\n _context5.p = 2;\n _t5 = _context5.v;\n console.error(\"Error creating project:\", _t5);\n throw _t5;\n case 3:\n return _context5.a(2);\n }\n }, _callee5, null, [[0, 2]]);\n }));\n return function handleCreateProject(_x3) {\n return _ref6.apply(this, arguments);\n };\n }();\n var handleSaveProject = /*#__PURE__*/function () {\n var _ref7 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6(projectData) {\n var projectsData, _t6;\n return _regenerator().w(function (_context6) {\n while (1) switch (_context6.n) {\n case 0:\n _context6.p = 0;\n if (!projectData.id) {\n _context6.n = 2;\n break;\n }\n _context6.n = 1;\n return (0,_utils_projectsService__WEBPACK_IMPORTED_MODULE_16__.updateProject)(projectData.id, projectData);\n case 1:\n _context6.n = 3;\n break;\n case 2:\n _context6.n = 3;\n return (0,_utils_projectsService__WEBPACK_IMPORTED_MODULE_16__.createProject)(projectData);\n case 3:\n _context6.n = 4;\n return (0,_utils_projectsService__WEBPACK_IMPORTED_MODULE_16__.fetchProjects)();\n case 4:\n projectsData = _context6.v;\n setProjects(projectsData);\n closeProjectModal();\n _context6.n = 7;\n break;\n case 5:\n _context6.p = 5;\n _t6 = _context6.v;\n console.error(\"Error saving project:\", _t6);\n // Don't close modal if there's an auth error (user will be redirected)\n if (!(0,_utils_authUtils__WEBPACK_IMPORTED_MODULE_18__.isAuthError)(_t6)) {\n _context6.n = 6;\n break;\n }\n return _context6.a(2);\n case 6:\n closeProjectModal();\n case 7:\n return _context6.a(2);\n }\n }, _callee6, null, [[0, 5]]);\n }));\n return function handleSaveProject(_x4) {\n return _ref7.apply(this, arguments);\n };\n }();\n var handleSaveArea = /*#__PURE__*/function () {\n var _ref8 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee7(areaData) {\n var _t7;\n return _regenerator().w(function (_context7) {\n while (1) switch (_context7.n) {\n case 0:\n _context7.p = 0;\n if (!areaData.id) {\n _context7.n = 2;\n break;\n }\n _context7.n = 1;\n return (0,_utils_areasService__WEBPACK_IMPORTED_MODULE_14__.updateArea)(areaData.id, areaData);\n case 1:\n _context7.n = 3;\n break;\n case 2:\n _context7.n = 3;\n return (0,_utils_areasService__WEBPACK_IMPORTED_MODULE_14__.createArea)(areaData);\n case 3:\n loadAreas();\n closeAreaModal();\n _context7.n = 6;\n break;\n case 4:\n _context7.p = 4;\n _t7 = _context7.v;\n console.error(\"Error saving area:\", _t7);\n // Don't close modal if there's an auth error (user will be redirected)\n if (!(0,_utils_authUtils__WEBPACK_IMPORTED_MODULE_18__.isAuthError)(_t7)) {\n _context7.n = 5;\n break;\n }\n return _context7.a(2);\n case 5:\n closeAreaModal();\n case 6:\n return _context7.a(2);\n }\n }, _callee7, null, [[0, 4]]);\n }));\n return function handleSaveArea(_x5) {\n return _ref8.apply(this, arguments);\n };\n }();\n var handleSaveTag = /*#__PURE__*/function () {\n var _ref9 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee8(tagData) {\n var tagsData, _t8;\n return _regenerator().w(function (_context8) {\n while (1) switch (_context8.n) {\n case 0:\n _context8.p = 0;\n if (!tagData.id) {\n _context8.n = 2;\n break;\n }\n _context8.n = 1;\n return (0,_utils_tagsService__WEBPACK_IMPORTED_MODULE_15__.updateTag)(tagData.id, tagData);\n case 1:\n _context8.n = 3;\n break;\n case 2:\n _context8.n = 3;\n return (0,_utils_tagsService__WEBPACK_IMPORTED_MODULE_15__.createTag)(tagData);\n case 3:\n _context8.n = 4;\n return (0,_utils_tagsService__WEBPACK_IMPORTED_MODULE_15__.fetchTags)();\n case 4:\n tagsData = _context8.v;\n setTags(tagsData);\n closeTagModal();\n _context8.n = 7;\n break;\n case 5:\n _context8.p = 5;\n _t8 = _context8.v;\n console.error(\"Error saving tag:\", _t8);\n // Don't close modal if there's an auth error (user will be redirected)\n if (!(0,_utils_authUtils__WEBPACK_IMPORTED_MODULE_18__.isAuthError)(_t8)) {\n _context8.n = 6;\n break;\n }\n return _context8.a(2);\n case 6:\n closeTagModal();\n case 7:\n return _context8.a(2);\n }\n }, _callee8, null, [[0, 5]]);\n }));\n return function handleSaveTag(_x6) {\n return _ref9.apply(this, arguments);\n };\n }();\n var handleLogout = /*#__PURE__*/function () {\n var _ref0 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee9() {\n var response, _t9, _t0, _t1;\n return _regenerator().w(function (_context9) {\n while (1) switch (_context9.n) {\n case 0:\n _context9.p = 0;\n _context9.n = 1;\n return fetch('/api/logout', {\n method: 'GET',\n credentials: 'include'\n });\n case 1:\n response = _context9.v;\n if (!response.ok) {\n _context9.n = 2;\n break;\n }\n setCurrentUser(null);\n _context9.n = 4;\n break;\n case 2:\n _t9 = console;\n _context9.n = 3;\n return response.json();\n case 3:\n _t0 = _context9.v;\n _t9.error.call(_t9, 'Logout failed:', _t0);\n case 4:\n _context9.n = 6;\n break;\n case 5:\n _context9.p = 5;\n _t1 = _context9.v;\n console.error('Error during logout:', _t1);\n case 6:\n return _context9.a(2);\n }\n }, _callee9, null, [[0, 5]]);\n }));\n return function handleLogout() {\n return _ref0.apply(this, arguments);\n };\n }();\n var mainContentMarginLeft = isSidebarOpen ? \"ml-72\" : \"ml-0\";\n var isLoading = isNotesLoading || isAreasLoading || isTasksLoading || isProjectsLoading || isTagsLoading;\n var isError = isNotesError || isAreasError || isTasksError || isProjectsError || isTagsError;\n if (isLoading) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"min-h-screen \".concat(isDarkMode ? \"dark\" : \"\")\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Navbar__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n isDarkMode: isDarkMode,\n toggleDarkMode: toggleDarkMode,\n currentUser: currentUser,\n setCurrentUser: setCurrentUser,\n isSidebarOpen: isSidebarOpen,\n setIsSidebarOpen: setIsSidebarOpen\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Sidebar__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n isSidebarOpen: isSidebarOpen,\n setIsSidebarOpen: setIsSidebarOpen,\n currentUser: currentUser,\n isDarkMode: isDarkMode,\n toggleDarkMode: toggleDarkMode,\n openTaskModal: openTaskModal,\n openProjectModal: openProjectModal,\n openNoteModal: openNoteModal,\n openAreaModal: openAreaModal,\n openTagModal: openTagModal,\n notes: notes,\n areas: areas,\n tags: tags\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex-1 flex items-center justify-center bg-gray-100 dark:bg-gray-800 transition-all duration-300 ease-in-out \".concat(mainContentMarginLeft)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-xl text-gray-700 dark:text-gray-200\"\n }, t('common.loading'))));\n }\n if (isError) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"min-h-screen \".concat(isDarkMode ? \"dark\" : \"\")\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Navbar__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n isDarkMode: isDarkMode,\n toggleDarkMode: toggleDarkMode,\n currentUser: currentUser,\n setCurrentUser: setCurrentUser,\n isSidebarOpen: isSidebarOpen,\n setIsSidebarOpen: setIsSidebarOpen\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Sidebar__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n isSidebarOpen: isSidebarOpen,\n setIsSidebarOpen: setIsSidebarOpen,\n currentUser: currentUser,\n isDarkMode: isDarkMode,\n toggleDarkMode: toggleDarkMode,\n openTaskModal: openTaskModal,\n openProjectModal: openProjectModal,\n openNoteModal: openNoteModal,\n openAreaModal: openAreaModal,\n openTagModal: openTagModal,\n notes: notes,\n areas: areas,\n tags: tags\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex-1 flex flex-col items-center justify-center bg-gray-100 dark:bg-gray-800 transition-all duration-300 ease-in-out \".concat(mainContentMarginLeft)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-xl text-red-500\"\n }, t('errors.somethingWentWrong'))));\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"min-h-screen \".concat(isDarkMode ? \"dark\" : \"\")\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Navbar__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n isDarkMode: isDarkMode,\n toggleDarkMode: toggleDarkMode,\n currentUser: currentUser,\n setCurrentUser: setCurrentUser,\n isSidebarOpen: isSidebarOpen,\n setIsSidebarOpen: setIsSidebarOpen\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Sidebar__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n isSidebarOpen: isSidebarOpen,\n setIsSidebarOpen: setIsSidebarOpen,\n currentUser: currentUser,\n isDarkMode: isDarkMode,\n toggleDarkMode: toggleDarkMode,\n openTaskModal: openTaskModal,\n openProjectModal: openProjectModal,\n openNoteModal: openNoteModal,\n openAreaModal: openAreaModal,\n openTagModal: openTagModal,\n notes: notes,\n areas: areas,\n tags: tags\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"transition-all duration-300 ease-in-out \".concat(mainContentMarginLeft)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex flex-col bg-gray-100 dark:bg-gray-800 text-gray-900 dark:text-gray-100 min-h-screen overflow-y-auto\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex-grow py-6 px-2 md:px-6 pt-24\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-full max-w-5xl mx-auto\"\n }, children)))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return openTaskModal('simplified');\n },\n className: \"fixed bottom-6 right-6 bg-blue-500 hover:bg-blue-600 text-white rounded-full p-4 shadow-lg focus:outline-none transform transition-transform duration-200 hover:scale-110 z-50\",\n \"aria-label\": \"Quick Capture\",\n title: t('inbox.captureThought')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n className: \"h-6 w-6\"\n })), isTaskModalOpen && (taskModalType === 'simplified' ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Task_SimplifiedTaskModal__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n isOpen: isTaskModalOpen,\n onClose: closeTaskModal,\n onSave: handleSaveTask\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Task_TaskModal__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n isOpen: isTaskModalOpen,\n onClose: closeTaskModal,\n task: {\n name: \"\",\n status: \"not_started\"\n },\n onSave: handleSaveTask,\n onDelete: /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee0() {\n return _regenerator().w(function (_context0) {\n while (1) switch (_context0.n) {\n case 0:\n return _context0.a(2);\n }\n }, _callee0);\n })),\n projects: projects,\n onCreateProject: handleCreateProject\n })), isProjectModalOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Project_ProjectModal__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n isOpen: isProjectModalOpen,\n onClose: closeProjectModal,\n onSave: handleSaveProject,\n areas: areas\n }), isNoteModalOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Note_NoteModal__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n isOpen: isNoteModalOpen,\n onClose: closeNoteModal,\n onSave: handleSaveNote,\n note: selectedNote\n }), isAreaModalOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Area_AreaModal__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n isOpen: isAreaModalOpen,\n onClose: closeAreaModal,\n onSave: handleSaveArea,\n area: selectedArea\n }), isTagModalOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Tag_TagModal__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n isOpen: isTagModalOpen,\n onClose: closeTagModal,\n onSave: handleSaveTag,\n tag: selectedTag\n }));\n};\n_s(Layout, \"g34D2WkG8pnD1cwt5Ahi+QWkNWI=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation, _components_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_2__.useToast, _store_useStore__WEBPACK_IMPORTED_MODULE_12__.useStore];\n});\n_c = Layout;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Layout);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"Layout\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/Layout.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Area/AreaDetails.tsx":
+/*!**************************************************!*\
+ !*** ./frontend/components/Area/AreaDetails.tsx ***!
+ \**************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/dist/index.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/dist/index.js\");\n/* harmony import */ var _store_useStore__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../store/useStore */ \"./frontend/store/useStore.ts\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\nvar AreaDetails = function AreaDetails() {\n _s();\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_2__.useTranslation)(),\n t = _useTranslation.t;\n var _useParams = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_3__.useParams)(),\n id = _useParams.id;\n var _useStore = (0,_store_useStore__WEBPACK_IMPORTED_MODULE_1__.useStore)(function (state) {\n return state.areasStore;\n }),\n areas = _useStore.areas;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState2 = _slicedToArray(_useState, 2),\n area = _useState2[0],\n setArea = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true),\n _useState4 = _slicedToArray(_useState3, 2),\n isLoading = _useState4[0],\n setIsLoading = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState6 = _slicedToArray(_useState5, 2),\n isError = _useState6[0],\n setIsError = _useState6[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (!areas.length) setIsLoading(true);\n var foundArea = areas.find(function (a) {\n return a.id === Number(id);\n });\n setArea(foundArea || null);\n if (!foundArea) {\n setIsError(true);\n }\n setIsLoading(false);\n }, [id, areas]);\n if (isLoading) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-center h-screen bg-gray-100 dark:bg-gray-900\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-xl font-semibold text-gray-700 dark:text-gray-200\"\n }, t('areas.loading')));\n }\n if (isError || !area) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-center h-screen bg-gray-100 dark:bg-gray-900\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-red-500 text-lg\"\n }, isError ? t('areas.error') : t('areas.notFound')));\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"min-h-screen bg-gray-100 dark:bg-gray-900 p-4 sm:p-6 lg:p-8\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"max-w-5xl mx-auto bg-white dark:bg-gray-800 shadow-lg rounded-lg p-6\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h2\", {\n className: \"text-2xl font-bold text-gray-900 dark:text-white mb-4\"\n }, t('areas.details'), \": \", area === null || area === void 0 ? void 0 : area.name), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-md text-gray-700 dark:text-gray-300\"\n }, area === null || area === void 0 ? void 0 : area.description), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_4__.Link, {\n to: \"/projects?area_id=\".concat(area === null || area === void 0 ? void 0 : area.id),\n className: \"text-blue-600 dark:text-blue-400 hover:underline mt-4 block\"\n }, t('areas.viewProjects', {\n name: area === null || area === void 0 ? void 0 : area.name\n }))));\n};\n_s(AreaDetails, \"ns/RK7Y4Z/3E1GG2nVAA5DMefnU=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_2__.useTranslation, react_router_dom__WEBPACK_IMPORTED_MODULE_3__.useParams, _store_useStore__WEBPACK_IMPORTED_MODULE_1__.useStore];\n});\n_c = AreaDetails;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AreaDetails);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"AreaDetails\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Area/AreaDetails.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Area/AreaModal.tsx":
+/*!************************************************!*\
+ !*** ./frontend/components/Area/AreaModal.tsx ***!
+ \************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Shared/ToastContext */ \"./frontend/components/Shared/ToastContext.tsx\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\nvar AreaModal = function AreaModal(_ref) {\n _s();\n var isOpen = _ref.isOpen,\n onClose = _ref.onClose,\n area = _ref.area,\n onSave = _ref.onSave;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_2__.useTranslation)(),\n t = _useTranslation.t;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n id: (area === null || area === void 0 ? void 0 : area.id) || 0,\n name: (area === null || area === void 0 ? void 0 : area.name) || '',\n description: (area === null || area === void 0 ? void 0 : area.description) || ''\n }),\n _useState2 = _slicedToArray(_useState, 2),\n formData = _useState2[0],\n setFormData = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState4 = _slicedToArray(_useState3, 2),\n error = _useState4[0],\n setError = _useState4[1];\n var modalRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState6 = _slicedToArray(_useState5, 2),\n isSubmitting = _useState6[0],\n setIsSubmitting = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState8 = _slicedToArray(_useState7, 2),\n isClosing = _useState8[0],\n setIsClosing = _useState8[1];\n var _useToast = (0,_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_1__.useToast)(),\n showSuccessToast = _useToast.showSuccessToast,\n showErrorToast = _useToast.showErrorToast;\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (isOpen) {\n setFormData({\n id: (area === null || area === void 0 ? void 0 : area.id) || 0,\n name: (area === null || area === void 0 ? void 0 : area.name) || '',\n description: (area === null || area === void 0 ? void 0 : area.description) || ''\n });\n setError(null);\n }\n }, [isOpen, area]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var handleClickOutside = function handleClickOutside(event) {\n if (modalRef.current && !modalRef.current.contains(event.target)) {\n handleClose();\n }\n };\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n return function () {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var handleKeyDown = function handleKeyDown(event) {\n if (event.key === 'Escape') {\n handleClose();\n }\n };\n if (isOpen) {\n document.addEventListener('keydown', handleKeyDown);\n }\n return function () {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [isOpen]);\n var handleChange = function handleChange(e) {\n var _e$target = e.target,\n name = _e$target.name,\n value = _e$target.value;\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, name, value));\n });\n };\n var handleSubmit = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n if (formData.name.trim()) {\n _context.n = 1;\n break;\n }\n setError(t('errors.areaNameRequired'));\n return _context.a(2);\n case 1:\n setIsSubmitting(true);\n setError(null);\n _context.p = 2;\n _context.n = 3;\n return onSave(formData);\n case 3:\n showSuccessToast(formData.id ? t('success.areaUpdated') : t('success.areaCreated'));\n handleClose();\n _context.n = 5;\n break;\n case 4:\n _context.p = 4;\n _t = _context.v;\n setError(_t.message);\n showErrorToast(t('errors.failedToSaveArea'));\n case 5:\n _context.p = 5;\n setIsSubmitting(false);\n return _context.f(5);\n case 6:\n return _context.a(2);\n }\n }, _callee, null, [[2, 4, 5, 6]]);\n }));\n return function handleSubmit() {\n return _ref2.apply(this, arguments);\n };\n }();\n var handleClose = function handleClose() {\n setIsClosing(true);\n setTimeout(function () {\n onClose();\n setIsClosing(false);\n }, 300);\n };\n if (!isOpen) return null;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"fixed top-16 left-0 right-0 bottom-0 flex items-start sm:items-center justify-center bg-gray-900 bg-opacity-80 z-40 transition-opacity duration-300 \".concat(isClosing ? 'opacity-0' : 'opacity-100')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n ref: modalRef,\n className: \"bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-800 sm:rounded-lg sm:shadow-2xl w-full sm:max-w-md overflow-hidden transform transition-transform duration-300 \".concat(isClosing ? 'scale-95' : 'scale-100', \" h-screen sm:h-auto flex flex-col\"),\n style: {\n maxHeight: 'calc(100vh - 4rem)'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"form\", {\n className: \"flex flex-col flex-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"fieldset\", {\n className: \"flex flex-col flex-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-4 space-y-3 flex-1 text-sm overflow-y-auto\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"py-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n id: \"areaName\",\n name: \"name\",\n value: formData.name,\n onChange: handleChange,\n required: true,\n className: \"block w-full text-xl font-semibold dark:bg-gray-800 text-black dark:text-white border-b-2 border-gray-200 dark:border-gray-900 focus:outline-none shadow-sm py-2\",\n placeholder: t('forms.areaNamePlaceholder')\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"pb-3\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-xs font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('forms.areaDescription')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"textarea\", {\n id: \"areaDescription\",\n name: \"description\",\n value: formData.description,\n onChange: handleChange,\n rows: 4,\n className: \"block w-full rounded-md shadow-sm p-3 text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 transition duration-150 ease-in-out\",\n placeholder: t('forms.areaDescriptionPlaceholder')\n })), error && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-red-500\"\n }, error)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-3 flex-shrink-0 border-t border-gray-200 dark:border-gray-700 flex justify-end space-x-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: handleClose,\n className: \"px-4 py-2 bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-200 rounded-md hover:bg-gray-300 dark:hover:bg-gray-600 focus:outline-none transition duration-150 ease-in-out\"\n }, t('common.cancel')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: handleSubmit,\n disabled: isSubmitting,\n className: \"px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 dark:bg-blue-500 dark:hover:bg-blue-600 focus:outline-none transition duration-150 ease-in-out \".concat(isSubmitting ? 'opacity-50 cursor-not-allowed' : '')\n }, isSubmitting ? t('modals.submitting') : formData.id && formData.id !== 0 ? t('modals.updateArea') : t('modals.createArea')))))));\n};\n_s(AreaModal, \"X0/bmm5jR9Z+QZgSgiSTLA/r3WA=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_2__.useTranslation, _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_1__.useToast];\n});\n_c = AreaModal;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AreaModal);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"AreaModal\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Area/AreaModal.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Areas.tsx":
+/*!***************************************!*\
+ !*** ./frontend/components/Areas.tsx ***!
+ \***************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/dist/index.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/Squares2X2Icon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/PencilSquareIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/TrashIcon.js\");\n/* harmony import */ var _Shared_ConfirmDialog__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Shared/ConfirmDialog */ \"./frontend/components/Shared/ConfirmDialog.tsx\");\n/* harmony import */ var _Area_AreaModal__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Area/AreaModal */ \"./frontend/components/Area/AreaModal.tsx\");\n/* harmony import */ var _store_useStore__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../store/useStore */ \"./frontend/store/useStore.ts\");\n/* harmony import */ var _utils_areasService__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/areasService */ \"./frontend/utils/areasService.ts\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\n\n\nvar Areas = function Areas() {\n _s();\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var _useStore = (0,_store_useStore__WEBPACK_IMPORTED_MODULE_4__.useStore)(function (state) {\n return state.areasStore;\n }),\n areas = _useStore.areas,\n setAreas = _useStore.setAreas,\n setLoading = _useStore.setLoading,\n setError = _useStore.setError;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState2 = _slicedToArray(_useState, 2),\n isAreaModalOpen = _useState2[0],\n setIsAreaModalOpen = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState4 = _slicedToArray(_useState3, 2),\n selectedArea = _useState4[0],\n setSelectedArea = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState6 = _slicedToArray(_useState5, 2),\n isConfirmDialogOpen = _useState6[0],\n setIsConfirmDialogOpen = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState8 = _slicedToArray(_useState7, 2),\n areaToDelete = _useState8[0],\n setAreaToDelete = _useState8[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var loadAreas = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var areasData, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n _context.p = 0;\n _context.n = 1;\n return (0,_utils_areasService__WEBPACK_IMPORTED_MODULE_5__.fetchAreas)();\n case 1:\n areasData = _context.v;\n setAreas(areasData);\n _context.n = 3;\n break;\n case 2:\n _context.p = 2;\n _t = _context.v;\n console.error('Error fetching areas:', _t);\n setError(true);\n case 3:\n return _context.a(2);\n }\n }, _callee, null, [[0, 2]]);\n }));\n return function loadAreas() {\n return _ref.apply(this, arguments);\n };\n }();\n loadAreas();\n }, []);\n var handleSaveArea = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(areaData) {\n var updatedAreas, _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n setLoading(true);\n _context2.p = 1;\n if (!areaData.id) {\n _context2.n = 3;\n break;\n }\n _context2.n = 2;\n return (0,_utils_areasService__WEBPACK_IMPORTED_MODULE_5__.updateArea)(areaData.id, {\n name: areaData.name,\n description: areaData.description\n });\n case 2:\n _context2.n = 4;\n break;\n case 3:\n _context2.n = 4;\n return (0,_utils_areasService__WEBPACK_IMPORTED_MODULE_5__.createArea)({\n name: areaData.name,\n description: areaData.description\n });\n case 4:\n _context2.n = 5;\n return (0,_utils_areasService__WEBPACK_IMPORTED_MODULE_5__.fetchAreas)();\n case 5:\n updatedAreas = _context2.v;\n setAreas(updatedAreas);\n _context2.n = 7;\n break;\n case 6:\n _context2.p = 6;\n _t2 = _context2.v;\n console.error('Error saving area:', _t2);\n setError(true);\n case 7:\n _context2.p = 7;\n setLoading(false);\n setIsAreaModalOpen(false);\n setSelectedArea(null);\n return _context2.f(7);\n case 8:\n return _context2.a(2);\n }\n }, _callee2, null, [[1, 6, 7, 8]]);\n }));\n return function handleSaveArea(_x) {\n return _ref2.apply(this, arguments);\n };\n }();\n var handleEditArea = function handleEditArea(area) {\n setSelectedArea(area);\n setIsAreaModalOpen(true);\n };\n var handleCreateArea = function handleCreateArea() {\n setSelectedArea(null);\n setIsAreaModalOpen(true);\n };\n var openConfirmDialog = function openConfirmDialog(area) {\n setAreaToDelete(area);\n setIsConfirmDialogOpen(true);\n };\n var handleDeleteArea = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {\n var updatedAreas, _t3;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n if (areaToDelete) {\n _context3.n = 1;\n break;\n }\n return _context3.a(2);\n case 1:\n setLoading(true);\n _context3.p = 2;\n _context3.n = 3;\n return (0,_utils_areasService__WEBPACK_IMPORTED_MODULE_5__.deleteArea)(areaToDelete.id);\n case 3:\n _context3.n = 4;\n return (0,_utils_areasService__WEBPACK_IMPORTED_MODULE_5__.fetchAreas)();\n case 4:\n updatedAreas = _context3.v;\n setAreas(updatedAreas);\n setIsConfirmDialogOpen(false);\n setAreaToDelete(null);\n _context3.n = 6;\n break;\n case 5:\n _context3.p = 5;\n _t3 = _context3.v;\n console.error('Error deleting area:', _t3);\n setError(true);\n case 6:\n _context3.p = 6;\n setLoading(false);\n return _context3.f(6);\n case 7:\n return _context3.a(2);\n }\n }, _callee3, null, [[2, 5, 6, 7]]);\n }));\n return function handleDeleteArea() {\n return _ref3.apply(this, arguments);\n };\n }();\n var closeConfirmDialog = function closeConfirmDialog() {\n setIsConfirmDialogOpen(false);\n setAreaToDelete(null);\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex justify-center px-4 lg:px-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-full max-w-5xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between mb-8\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n className: \"h-6 w-6 mr-2 text-gray-900 dark:text-white\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h2\", {\n className: \"text-2xl font-light text-gray-900 dark:text-white\"\n }, t('areas.title')))), areas.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-gray-700 dark:text-gray-300\"\n }, t('areas.noAreasFound')) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"ul\", {\n className: \"space-y-2\"\n }, areas.map(function (area) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"li\", {\n key: area.id,\n className: \"bg-white dark:bg-gray-900 shadow rounded-lg p-4 flex justify-between items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex-grow overflow-hidden pr-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_7__.Link, {\n to: \"/projects?area_id=\".concat(area.id),\n className: \"text-md font-semibold text-gray-900 dark:text-gray-100 hover:underline block\"\n }, area.name), area.description && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-xs text-gray-600 dark:text-gray-400 mt-1 truncate\"\n }, area.description)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex space-x-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return handleEditArea(area);\n },\n className: \"text-gray-500 hover:text-blue-700 dark:hover:text-blue-300 focus:outline-none\",\n \"aria-label\": t('areas.editAreaAriaLabel', {\n name: area.name\n }),\n title: t('areas.editAreaTitle', {\n name: area.name\n })\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n className: \"h-5 w-5\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return openConfirmDialog(area);\n },\n className: \"text-gray-500 hover:text-red-700 dark:hover:text-red-300 focus:outline-none\",\n \"aria-label\": t('areas.deleteAreaAriaLabel', {\n name: area.name\n }),\n title: t('areas.deleteAreaTitle', {\n name: area.name\n })\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n className: \"h-5 w-5\"\n }))));\n })), isAreaModalOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Area_AreaModal__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n isOpen: isAreaModalOpen,\n onClose: function onClose() {\n return setIsAreaModalOpen(false);\n },\n onSave: handleSaveArea,\n area: selectedArea\n }), isConfirmDialogOpen && areaToDelete && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Shared_ConfirmDialog__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n title: t('modals.deleteArea.title'),\n message: t('modals.deleteArea.message', {\n name: areaToDelete.name\n }),\n onConfirm: handleDeleteArea,\n onCancel: closeConfirmDialog\n })));\n};\n_s(Areas, \"y233SdergRQ16O2WxrcQu2qV2lk=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation, _store_useStore__WEBPACK_IMPORTED_MODULE_4__.useStore];\n});\n_c = Areas;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Areas);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"Areas\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Areas.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Calendar.tsx":
+/*!******************************************!*\
+ !*** ./frontend/components/Calendar.tsx ***!
+ \******************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _Task_TaskModal__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Task/TaskModal */ \"./frontend/components/Task/TaskModal.tsx\");\n/* harmony import */ var _utils_tasksService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/tasksService */ \"./frontend/utils/tasksService.ts\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/CalendarIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ChevronLeftIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ChevronRightIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/XMarkIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ArrowTopRightOnSquareIcon.js\");\n/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! date-fns */ \"./node_modules/date-fns/addWeeks.js\");\n/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! date-fns */ \"./node_modules/date-fns/addDays.js\");\n/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! date-fns */ \"./node_modules/date-fns/format.js\");\n/* harmony import */ var date_fns_locale__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! date-fns/locale */ \"./node_modules/date-fns/locale/el.js\");\n/* harmony import */ var date_fns_locale__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! date-fns/locale */ \"./node_modules/date-fns/locale/es.js\");\n/* harmony import */ var date_fns_locale__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! date-fns/locale */ \"./node_modules/date-fns/locale/ja.js\");\n/* harmony import */ var date_fns_locale__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! date-fns/locale */ \"./node_modules/date-fns/locale/uk.js\");\n/* harmony import */ var date_fns_locale__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! date-fns/locale */ \"./node_modules/date-fns/locale/de.js\");\n/* harmony import */ var date_fns_locale__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! date-fns/locale */ \"./node_modules/date-fns/locale/en-US.js\");\n/* harmony import */ var _Calendar_CalendarMonthView__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Calendar/CalendarMonthView */ \"./frontend/components/Calendar/CalendarMonthView.tsx\");\n/* harmony import */ var _Calendar_CalendarWeekView__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Calendar/CalendarWeekView */ \"./frontend/components/Calendar/CalendarWeekView.tsx\");\n/* harmony import */ var _Calendar_CalendarDayView__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Calendar/CalendarDayView */ \"./frontend/components/Calendar/CalendarDayView.tsx\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nvar _s = __webpack_require__.$Refresh$.signature(),\n _s2 = __webpack_require__.$Refresh$.signature();\nfunction _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\n\n\n\n\nvar getLocale = function getLocale(language) {\n switch (language) {\n case 'el':\n return date_fns_locale__WEBPACK_IMPORTED_MODULE_7__.el;\n case 'es':\n return date_fns_locale__WEBPACK_IMPORTED_MODULE_8__.es;\n case 'jp':\n return date_fns_locale__WEBPACK_IMPORTED_MODULE_9__.ja;\n case 'ua':\n return date_fns_locale__WEBPACK_IMPORTED_MODULE_10__.uk;\n case 'de':\n return date_fns_locale__WEBPACK_IMPORTED_MODULE_11__.de;\n default:\n return date_fns_locale__WEBPACK_IMPORTED_MODULE_12__.enUS;\n }\n};\nvar Calendar = function Calendar() {\n _s();\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t,\n i18n = _useTranslation.i18n;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(new Date()),\n _useState2 = _slicedToArray(_useState, 2),\n currentDate = _useState2[0],\n setCurrentDate = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('month'),\n _useState4 = _slicedToArray(_useState3, 2),\n view = _useState4[0],\n setView = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n connected: false\n }),\n _useState6 = _slicedToArray(_useState5, 2),\n googleStatus = _useState6[0],\n setGoogleStatus = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState8 = _slicedToArray(_useState7, 2),\n isConnecting = _useState8[0],\n setIsConnecting = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState0 = _slicedToArray(_useState9, 2),\n isDemoMode = _useState0[0],\n setIsDemoMode = _useState0[1];\n var _useState1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState10 = _slicedToArray(_useState1, 2),\n events = _useState10[0],\n setEvents = _useState10[1];\n var _useState11 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState12 = _slicedToArray(_useState11, 2),\n isLoadingTasks = _useState12[0],\n setIsLoadingTasks = _useState12[1];\n var _useState13 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState14 = _slicedToArray(_useState13, 2),\n selectedTask = _useState14[0],\n setSelectedTask = _useState14[1];\n var _useState15 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState16 = _slicedToArray(_useState15, 2),\n allTasks = _useState16[0],\n setAllTasks = _useState16[1];\n var _useState17 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState18 = _slicedToArray(_useState17, 2),\n projects = _useState18[0],\n setProjects = _useState18[1];\n var _useState19 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState20 = _slicedToArray(_useState19, 2),\n isTaskModalOpen = _useState20[0],\n setIsTaskModalOpen = _useState20[1];\n var _useState21 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState22 = _slicedToArray(_useState21, 2),\n isEventDetailModalOpen = _useState22[0],\n setIsEventDetailModalOpen = _useState22[1];\n var locale = getLocale(i18n.language);\n\n // Load Google Calendar status and tasks on component mount\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n checkGoogleCalendarStatus();\n loadTasks();\n loadProjects();\n\n // Check URL parameters for demo mode\n var urlParams = new URLSearchParams(window.location.search);\n if (urlParams.get('demo') === 'true' && urlParams.get('connected') === 'true') {\n setGoogleStatus({\n connected: true,\n email: 'demo@example.com'\n });\n setIsDemoMode(true);\n // Clean up URL\n window.history.replaceState({}, document.title, window.location.pathname);\n }\n }, []);\n var checkGoogleCalendarStatus = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var response, status, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n _context.p = 0;\n _context.n = 1;\n return fetch('/api/calendar/status', {\n credentials: 'include'\n });\n case 1:\n response = _context.v;\n if (!response.ok) {\n _context.n = 3;\n break;\n }\n _context.n = 2;\n return response.json();\n case 2:\n status = _context.v;\n setGoogleStatus(status);\n setIsDemoMode(status.demo || false);\n case 3:\n _context.n = 5;\n break;\n case 4:\n _context.p = 4;\n _t = _context.v;\n console.error('Error checking Google Calendar status:', _t);\n case 5:\n return _context.a(2);\n }\n }, _callee, null, [[0, 4]]);\n }));\n return function checkGoogleCalendarStatus() {\n return _ref.apply(this, arguments);\n };\n }();\n var loadTasks = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {\n var response, data, tasks, taskEvents, _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n setIsLoadingTasks(true);\n _context2.p = 1;\n _context2.n = 2;\n return fetch('/api/tasks', {\n credentials: 'include'\n });\n case 2:\n response = _context2.v;\n if (!response.ok) {\n _context2.n = 4;\n break;\n }\n _context2.n = 3;\n return response.json();\n case 3:\n data = _context2.v;\n if (Array.isArray(data)) {\n tasks = data;\n } else if (data && Array.isArray(data.tasks)) {\n tasks = data.tasks;\n } else if (data && data.data && Array.isArray(data.data)) {\n tasks = data.data;\n } else {\n console.error('Unexpected API response format:', data);\n tasks = [];\n }\n\n // Store the original tasks for later reference\n setAllTasks(tasks);\n taskEvents = convertTasksToEvents(tasks);\n setEvents(taskEvents);\n _context2.n = 5;\n break;\n case 4:\n console.error('Failed to load tasks, status:', response.status);\n case 5:\n _context2.n = 7;\n break;\n case 6:\n _context2.p = 6;\n _t2 = _context2.v;\n console.error('Error loading tasks:', _t2);\n case 7:\n _context2.p = 7;\n setIsLoadingTasks(false);\n return _context2.f(7);\n case 8:\n return _context2.a(2);\n }\n }, _callee2, null, [[1, 6, 7, 8]]);\n }));\n return function loadTasks() {\n return _ref2.apply(this, arguments);\n };\n }();\n var convertTasksToEvents = function convertTasksToEvents(tasks) {\n var taskEvents = [];\n if (!Array.isArray(tasks)) {\n console.error('convertTasksToEvents received non-array:', tasks);\n return [];\n }\n tasks.forEach(function (task, index) {\n // Add tasks with due dates\n if (task.due_date) {\n var dueDate = new Date(task.due_date);\n var taskEvent = {\n id: \"task-\".concat(task.id),\n title: task.name || task.title || \"Task \".concat(task.id),\n start: dueDate,\n end: new Date(dueDate.getTime() + 60 * 60 * 1000),\n // 1 hour duration\n type: 'task',\n color: task.completed_at ? '#22c55e' : '#ef4444' // Green if completed, red if not\n };\n taskEvents.push(taskEvent);\n }\n\n // Add tasks scheduled for today (if they don't have due_date)\n if (!task.due_date && task.created_at) {\n var createdDate = new Date(task.created_at);\n var today = new Date();\n\n // Show tasks created today on the calendar\n if (createdDate.toDateString() === today.toDateString()) {\n var _taskEvent = {\n id: \"task-created-\".concat(task.id),\n title: \"\\uD83D\\uDCDD \".concat(task.name || task.title || \"Task \".concat(task.id)),\n start: createdDate,\n end: new Date(createdDate.getTime() + 30 * 60 * 1000),\n // 30 min duration\n type: 'task',\n color: task.completed_at ? '#22c55e' : '#3b82f6' // Green if completed, blue if not\n };\n taskEvents.push(_taskEvent);\n }\n }\n\n // Always add tasks to calendar for easier debugging\n if (!task.due_date && !task.created_at) {\n var _taskEvent2 = {\n id: \"task-fallback-\".concat(task.id),\n title: \"\\uD83D\\uDCCC \".concat(task.name || task.title || \"Task \".concat(task.id)),\n start: new Date(),\n // Today\n end: new Date(Date.now() + 30 * 60 * 1000),\n // 30 min duration\n type: 'task',\n color: task.completed_at ? '#22c55e' : '#8b5cf6' // Green if completed, purple if not\n };\n taskEvents.push(_taskEvent2);\n }\n });\n return taskEvents;\n };\n var loadProjects = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {\n var response, projectsData, _t3;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n _context3.p = 0;\n _context3.n = 1;\n return fetch('/api/projects', {\n credentials: 'include'\n });\n case 1:\n response = _context3.v;\n if (!response.ok) {\n _context3.n = 3;\n break;\n }\n _context3.n = 2;\n return response.json();\n case 2:\n projectsData = _context3.v;\n setProjects(Array.isArray(projectsData) ? projectsData : []);\n case 3:\n _context3.n = 5;\n break;\n case 4:\n _context3.p = 4;\n _t3 = _context3.v;\n console.error('Error loading projects:', _t3);\n case 5:\n return _context3.a(2);\n }\n }, _callee3, null, [[0, 4]]);\n }));\n return function loadProjects() {\n return _ref3.apply(this, arguments);\n };\n }();\n var connectGoogleCalendar = /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {\n var response, result, _t4;\n return _regenerator().w(function (_context4) {\n while (1) switch (_context4.n) {\n case 0:\n if (!isConnecting) {\n _context4.n = 1;\n break;\n }\n return _context4.a(2);\n case 1:\n setIsConnecting(true);\n _context4.p = 2;\n _context4.n = 3;\n return fetch('/api/calendar/auth', {\n credentials: 'include'\n });\n case 3:\n response = _context4.v;\n if (!response.ok) {\n _context4.n = 5;\n break;\n }\n _context4.n = 4;\n return response.json();\n case 4:\n result = _context4.v;\n if (result.demo) {\n // Demo mode - simulate connection\n setGoogleStatus({\n connected: true,\n email: 'demo@example.com'\n });\n setIsDemoMode(true);\n } else {\n // Real Google OAuth - redirect to auth URL\n window.location.href = result.authUrl;\n }\n _context4.n = 6;\n break;\n case 5:\n throw new Error('Failed to get authorization URL');\n case 6:\n _context4.n = 8;\n break;\n case 7:\n _context4.p = 7;\n _t4 = _context4.v;\n console.error('Error connecting to Google Calendar:', _t4);\n alert(t('calendar.connectionError'));\n case 8:\n _context4.p = 8;\n setIsConnecting(false);\n return _context4.f(8);\n case 9:\n return _context4.a(2);\n }\n }, _callee4, null, [[2, 7, 8, 9]]);\n }));\n return function connectGoogleCalendar() {\n return _ref4.apply(this, arguments);\n };\n }();\n var disconnectGoogleCalendar = /*#__PURE__*/function () {\n var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5() {\n var response, _t5;\n return _regenerator().w(function (_context5) {\n while (1) switch (_context5.n) {\n case 0:\n _context5.p = 0;\n if (!isDemoMode) {\n _context5.n = 1;\n break;\n }\n // Demo mode - just update local state\n setGoogleStatus({\n connected: false\n });\n setIsDemoMode(false);\n return _context5.a(2);\n case 1:\n _context5.n = 2;\n return fetch('/api/calendar/disconnect', {\n method: 'POST',\n credentials: 'include'\n });\n case 2:\n response = _context5.v;\n if (!response.ok) {\n _context5.n = 3;\n break;\n }\n setGoogleStatus({\n connected: false\n });\n _context5.n = 4;\n break;\n case 3:\n throw new Error('Failed to disconnect');\n case 4:\n _context5.n = 6;\n break;\n case 5:\n _context5.p = 5;\n _t5 = _context5.v;\n console.error('Error disconnecting Google Calendar:', _t5);\n alert(t('calendar.disconnectionError'));\n case 6:\n return _context5.a(2);\n }\n }, _callee5, null, [[0, 5]]);\n }));\n return function disconnectGoogleCalendar() {\n return _ref5.apply(this, arguments);\n };\n }();\n var navigate = function navigate(direction) {\n setCurrentDate(function (prev) {\n if (view === 'month') {\n var newDate = new Date(prev);\n if (direction === 'prev') {\n newDate.setMonth(prev.getMonth() - 1);\n } else {\n newDate.setMonth(prev.getMonth() + 1);\n }\n return newDate;\n } else if (view === 'week') {\n return direction === 'prev' ? (0,date_fns__WEBPACK_IMPORTED_MODULE_13__.addWeeks)(prev, -1) : (0,date_fns__WEBPACK_IMPORTED_MODULE_13__.addWeeks)(prev, 1);\n } else {\n // day\n return direction === 'prev' ? (0,date_fns__WEBPACK_IMPORTED_MODULE_14__.addDays)(prev, -1) : (0,date_fns__WEBPACK_IMPORTED_MODULE_14__.addDays)(prev, 1);\n }\n });\n };\n var goToToday = function goToToday() {\n setCurrentDate(new Date());\n };\n var handleDateClick = function handleDateClick() {\n // Date click handler - can be used for future functionality\n };\n var handleEventClick = function handleEventClick(event) {\n // Handle task events\n if (event.type === 'task') {\n // Extract task ID from event ID\n var taskId = event.id.replace(/^task(-created|-fallback)?-/, '');\n var task = allTasks.find(function (t) {\n return t.id.toString() === taskId;\n });\n if (task) {\n // Convert task to proper Task entity format for TaskModal\n var taskEntity = _objectSpread(_objectSpread({}, task), {}, {\n name: task.name || task.title || \"Task \".concat(task.id),\n // Ensure all required Task properties are present\n priority: task.priority || 'medium',\n status: task.status || 'not_started',\n tags: task.tags || [],\n note: task.note || task.description || '',\n due_date: task.due_date,\n created_at: task.created_at,\n completed_at: task.completed_at,\n project_id: task.project_id\n });\n setSelectedTask(taskEntity);\n setIsEventDetailModalOpen(true);\n }\n }\n };\n var handleTimeSlotClick = function handleTimeSlotClick() {\n // Time slot click handler - can be used for future functionality\n };\n var handleEditTask = function handleEditTask() {\n setIsEventDetailModalOpen(false);\n setIsTaskModalOpen(true);\n };\n var handleTaskSave = function handleTaskSave(updatedTask) {\n // Update the task in allTasks\n setAllTasks(function (prev) {\n return prev.map(function (t) {\n return t.id === updatedTask.id ? updatedTask : t;\n });\n });\n // Refresh calendar\n loadTasks();\n // Close modal\n setIsTaskModalOpen(false);\n setSelectedTask(null);\n };\n var handleTaskDelete = /*#__PURE__*/function () {\n var _ref6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6(taskId) {\n var _t6;\n return _regenerator().w(function (_context6) {\n while (1) switch (_context6.n) {\n case 0:\n _context6.p = 0;\n _context6.n = 1;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_3__.deleteTask)(taskId);\n case 1:\n // Remove task from allTasks\n setAllTasks(function (prev) {\n return prev.filter(function (t) {\n return t.id !== taskId;\n });\n });\n // Refresh calendar\n loadTasks();\n // Close modal\n setIsTaskModalOpen(false);\n setSelectedTask(null);\n _context6.n = 3;\n break;\n case 2:\n _context6.p = 2;\n _t6 = _context6.v;\n console.error('Failed to delete task:', _t6);\n case 3:\n return _context6.a(2);\n }\n }, _callee6, null, [[0, 2]]);\n }));\n return function handleTaskDelete(_x) {\n return _ref6.apply(this, arguments);\n };\n }();\n var handleCreateProject = /*#__PURE__*/function () {\n var _ref7 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee7(name) {\n var response, newProject, _t7;\n return _regenerator().w(function (_context7) {\n while (1) switch (_context7.n) {\n case 0:\n _context7.p = 0;\n _context7.n = 1;\n return fetch('/api/projects', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n credentials: 'include',\n body: JSON.stringify({\n name: name,\n description: ''\n })\n });\n case 1:\n response = _context7.v;\n if (!response.ok) {\n _context7.n = 3;\n break;\n }\n _context7.n = 2;\n return response.json();\n case 2:\n newProject = _context7.v;\n setProjects(function (prev) {\n return [].concat(_toConsumableArray(prev), [newProject]);\n });\n return _context7.a(2, newProject);\n case 3:\n throw new Error('Failed to create project');\n case 4:\n _context7.n = 6;\n break;\n case 5:\n _context7.p = 5;\n _t7 = _context7.v;\n console.error('Error creating project:', _t7);\n throw _t7;\n case 6:\n return _context7.a(2);\n }\n }, _callee7, null, [[0, 5]]);\n }));\n return function handleCreateProject(_x2) {\n return _ref7.apply(this, arguments);\n };\n }();\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex justify-center px-4 lg:px-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-full max-w-6xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between mb-6\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center space-x-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h2\", {\n className: \"text-2xl font-light flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n className: \"h-6 w-6 mr-2\"\n }), t('sidebar.calendar')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-lg text-gray-600 dark:text-gray-400\"\n }, (0,date_fns__WEBPACK_IMPORTED_MODULE_16__.format)(currentDate, 'MMMM yyyy', {\n locale: locale\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center space-x-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex rounded-lg border border-gray-300 dark:border-gray-600\"\n }, ['month', 'week', 'day'].map(function (viewType) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n key: viewType,\n onClick: function onClick() {\n return setView(viewType);\n },\n className: \"px-3 py-1 text-sm font-medium capitalize \".concat(view === viewType ? 'bg-blue-500 text-white' : 'bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-700', \" \").concat(viewType === 'month' ? 'rounded-l-lg' : '', \" \").concat(viewType === 'day' ? 'rounded-r-lg' : '')\n }, t(\"calendar.\".concat(viewType)));\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return navigate('prev');\n },\n className: \"p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n className: \"h-5 w-5\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: goToToday,\n className: \"px-3 py-2 text-sm bg-blue-500 text-white rounded-lg hover:bg-blue-600\"\n }, t('calendar.today')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return navigate('next');\n },\n className: \"p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n className: \"h-5 w-5\"\n })))), isLoadingTasks && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-center py-4 text-gray-500\"\n }, t('calendar.loadingTasks')), view === 'month' && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Calendar_CalendarMonthView__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n currentDate: currentDate,\n events: events,\n onDateClick: handleDateClick,\n onEventClick: handleEventClick\n }), view === 'week' && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Calendar_CalendarWeekView__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n currentDate: currentDate,\n events: events,\n onDateClick: handleDateClick,\n onEventClick: handleEventClick,\n onTimeSlotClick: handleTimeSlotClick\n }), view === 'day' && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Calendar_CalendarDayView__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n currentDate: currentDate,\n events: events,\n onEventClick: handleEventClick,\n onTimeSlotClick: handleTimeSlotClick\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mt-6 bg-white dark:bg-gray-900 rounded-lg shadow p-6\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-lg font-medium mb-4 text-gray-900 dark:text-gray-100\"\n }, t('calendar.googleIntegration')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-sm text-gray-600 dark:text-gray-400 mb-2\"\n }, isDemoMode ? 'Demo mode: Google Calendar integration simulated for testing purposes.' : t('calendar.googleDescription')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-xs text-gray-500 dark:text-gray-500\"\n }, t('calendar.googleStatus'), \":\", googleStatus.connected ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-green-500 ml-1\"\n }, t('calendar.connected'), googleStatus.email && \" (\".concat(googleStatus.email, \")\")) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-red-500 ml-1\"\n }, t('calendar.notConnected')))), googleStatus.connected ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: disconnectGoogleCalendar,\n className: \"px-4 py-2 bg-red-500 text-white rounded-lg hover:bg-red-600\"\n }, t('calendar.disconnectGoogle')) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: connectGoogleCalendar,\n disabled: isConnecting,\n className: \"px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 disabled:opacity-50\"\n }, isConnecting ? t('calendar.connecting') : t('calendar.connectGoogle')))), selectedTask && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(TaskEventModal, {\n isOpen: isEventDetailModalOpen,\n onClose: function onClose() {\n setIsEventDetailModalOpen(false);\n setSelectedTask(null);\n },\n task: selectedTask,\n onEditTask: handleEditTask\n }), selectedTask && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Task_TaskModal__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n isOpen: isTaskModalOpen,\n onClose: function onClose() {\n setIsTaskModalOpen(false);\n setSelectedTask(null);\n },\n task: selectedTask,\n onSave: handleTaskSave,\n onDelete: handleTaskDelete,\n projects: projects,\n onCreateProject: handleCreateProject\n })));\n};\n\n// Simple Task Event Details Modal Component\n_s(Calendar, \"zpqEZqfL333j9/U6ZOMSKhKzKaw=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = Calendar;\nvar TaskEventModal = function TaskEventModal(_ref8) {\n _s2();\n var _task$Project;\n var isOpen = _ref8.isOpen,\n task = _ref8.task,\n onClose = _ref8.onClose,\n onEditTask = _ref8.onEditTask;\n var _useTranslation2 = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation2.t,\n i18n = _useTranslation2.i18n;\n var locale = getLocale(i18n.language);\n if (!isOpen) return null;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-white dark:bg-gray-800 rounded-lg shadow-lg p-6 max-w-md w-full mx-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex justify-between items-start mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-lg font-semibold text-gray-900 dark:text-gray-100\"\n }, \"\\uD83D\\uDCCB \", t('calendar.taskDetails')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: onClose,\n className: \"text-gray-400 hover:text-gray-600 dark:hover:text-gray-300\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n className: \"w-6 h-6\"\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"space-y-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\"\n }, t('calendar.title')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-gray-900 dark:text-gray-100\"\n }, task.name || \"Task \".concat(task.id))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\"\n }, t('calendar.status')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium \".concat(task.completed_at ? 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200' : 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200')\n }, task.completed_at ? \"\\u2705 \".concat(t('calendar.completed')) : \"\\u23F3 \".concat(t('calendar.pending'))))), task.due_date && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\"\n }, t('calendar.dueDate')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-gray-900 dark:text-gray-100\"\n }, (0,date_fns__WEBPACK_IMPORTED_MODULE_16__.format)(new Date(task.due_date), 'PPP', {\n locale: locale\n }))), task.priority && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\"\n }, t('calendar.priority')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium \".concat(task.priority === 'high' ? 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200' : task.priority === 'medium' ? 'bg-orange-100 text-orange-800 dark:bg-orange-900 dark:text-orange-200' : 'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200')\n }, t(\"calendar.\".concat(task.priority)))), ((_task$Project = task.Project) === null || _task$Project === void 0 ? void 0 : _task$Project.name) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\"\n }, t('calendar.project')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-gray-900 dark:text-gray-100\"\n }, task.Project.name)), task.note && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\"\n }, t('calendar.description')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-gray-900 dark:text-gray-100 whitespace-pre-wrap\"\n }, task.note)), task.created_at && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\"\n }, t('calendar.created')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-xs text-gray-500 dark:text-gray-400\"\n }, (0,date_fns__WEBPACK_IMPORTED_MODULE_16__.format)(new Date(task.created_at), 'PPp', {\n locale: locale\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mt-6 flex justify-between\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: \"/tasks\",\n className: \"inline-flex items-center px-3 py-2 text-sm font-medium text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-300\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n className: \"w-4 h-4 mr-1\"\n }), t('calendar.goToTasks')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex space-x-3\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: onClose,\n className: \"px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 bg-gray-100 dark:bg-gray-700 rounded-md hover:bg-gray-200 dark:hover:bg-gray-600\"\n }, t('calendar.close')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: onEditTask,\n className: \"px-4 py-2 text-sm font-medium bg-blue-500 text-white rounded-md hover:bg-blue-600\"\n }, t('calendar.editTask'))))));\n};\n_s2(TaskEventModal, \"OZwazanA59tbNDUkc8lMSmTHj9Q=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c2 = TaskEventModal;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Calendar);\nvar _c, _c2;\n__webpack_require__.$Refresh$.register(_c, \"Calendar\");\n__webpack_require__.$Refresh$.register(_c2, \"TaskEventModal\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Calendar.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Calendar/CalendarDayView.tsx":
+/*!**********************************************************!*\
+ !*** ./frontend/components/Calendar/CalendarDayView.tsx ***!
+ \**********************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! date-fns */ \"./node_modules/date-fns/format.js\");\n/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! date-fns */ \"./node_modules/date-fns/isToday.js\");\n/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! date-fns */ \"./node_modules/date-fns/addHours.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\n\n\n\nvar CalendarDayView = function CalendarDayView(_ref) {\n _s();\n var currentDate = _ref.currentDate,\n events = _ref.events,\n onEventClick = _ref.onEventClick,\n onTimeSlotClick = _ref.onTimeSlotClick;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var hours = Array.from({\n length: 24\n }, function (_, i) {\n return i;\n });\n var getEventsForTimeSlot = function getEventsForTimeSlot(hour) {\n return events.filter(function (event) {\n var eventDay = (0,date_fns__WEBPACK_IMPORTED_MODULE_2__.format)(event.start, 'yyyy-MM-dd');\n var currentDay = (0,date_fns__WEBPACK_IMPORTED_MODULE_2__.format)(currentDate, 'yyyy-MM-dd');\n var eventHour = event.start.getHours();\n return eventDay === currentDay && eventHour === hour;\n });\n };\n var handleTimeSlotClick = function handleTimeSlotClick(hour) {\n if (onTimeSlotClick) {\n onTimeSlotClick(currentDate, hour);\n }\n };\n var handleEventClick = function handleEventClick(event, e) {\n e.stopPropagation();\n if (onEventClick) {\n onEventClick(event);\n }\n };\n var calculateEventHeight = function calculateEventHeight(event) {\n var durationMs = event.end.getTime() - event.start.getTime();\n var durationHours = durationMs / (1000 * 60 * 60);\n return Math.max(durationHours * 48, 24); // Minimum 24px height\n };\n var calculateEventPosition = function calculateEventPosition(event) {\n var minutes = event.start.getMinutes();\n return minutes / 60 * 48; // 48px per hour\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-white dark:bg-gray-900 rounded-lg shadow overflow-hidden\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-4 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-lg font-medium \".concat((0,date_fns__WEBPACK_IMPORTED_MODULE_3__.isToday)(currentDate) ? 'text-blue-600 dark:text-blue-400' : 'text-gray-900 dark:text-gray-100')\n }, (0,date_fns__WEBPACK_IMPORTED_MODULE_2__.format)(currentDate, 'EEEE')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-2xl font-bold \".concat((0,date_fns__WEBPACK_IMPORTED_MODULE_3__.isToday)(currentDate) ? 'text-blue-600 dark:text-blue-400' : 'text-gray-600 dark:text-gray-400')\n }, (0,date_fns__WEBPACK_IMPORTED_MODULE_2__.format)(currentDate, 'd')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-sm text-gray-500 dark:text-gray-400\"\n }, (0,date_fns__WEBPACK_IMPORTED_MODULE_2__.format)(currentDate, 'MMMM yyyy')))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-2 border-b border-gray-100 dark:border-gray-800 bg-gray-50 dark:bg-gray-800\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-xs text-gray-500 dark:text-gray-400 mb-1\"\n }, \"All day\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"space-y-1\"\n }, events.filter(function (event) {\n var eventDay = (0,date_fns__WEBPACK_IMPORTED_MODULE_2__.format)(event.start, 'yyyy-MM-dd');\n var currentDay = (0,date_fns__WEBPACK_IMPORTED_MODULE_2__.format)(currentDate, 'yyyy-MM-dd');\n // Check if it's an all-day event (spans 24 hours or more)\n var duration = event.end.getTime() - event.start.getTime();\n return eventDay === currentDay && duration >= 24 * 60 * 60 * 1000;\n }).map(function (event) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: event.id,\n onClick: function onClick(e) {\n return handleEventClick(event, e);\n },\n className: \"text-xs p-2 rounded text-white cursor-pointer hover:opacity-80 transition-opacity \".concat(event.type === 'task' ? 'border-l-2 border-l-white/50' : ''),\n style: {\n backgroundColor: event.color || '#3b82f6'\n },\n title: \"\".concat(event.type === 'task' ? '📋 ' : '').concat(event.title)\n }, event.type === 'task' && '📋 ', event.title);\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"max-h-96 overflow-y-auto\"\n }, hours.map(function (hour) {\n var timeSlotEvents = getEventsForTimeSlot(hour);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: hour,\n className: \"relative border-b border-gray-100 dark:border-gray-800\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-16 p-2 text-xs text-gray-500 dark:text-gray-400 text-center border-r border-gray-200 dark:border-gray-700\"\n }, (0,date_fns__WEBPACK_IMPORTED_MODULE_2__.format)((0,date_fns__WEBPACK_IMPORTED_MODULE_4__.addHours)(new Date().setHours(hour, 0, 0, 0), 0), 'HH:mm')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n onClick: function onClick() {\n return handleTimeSlotClick(hour);\n },\n className: \"flex-1 h-12 cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 relative\"\n }, timeSlotEvents.map(function (event) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: event.id,\n onClick: function onClick(e) {\n return handleEventClick(event, e);\n },\n className: \"absolute left-1 right-1 text-xs p-1 rounded text-white cursor-pointer hover:opacity-80 transition-opacity z-10 \".concat(event.type === 'task' ? 'border-l-2 border-l-white/50' : ''),\n style: {\n backgroundColor: event.color || '#3b82f6',\n top: calculateEventPosition(event),\n height: calculateEventHeight(event)\n },\n title: \"\".concat(event.type === 'task' ? '📋 ' : '').concat(event.title, \" - \").concat((0,date_fns__WEBPACK_IMPORTED_MODULE_2__.format)(event.start, 'HH:mm'), \" to \").concat((0,date_fns__WEBPACK_IMPORTED_MODULE_2__.format)(event.end, 'HH:mm'))\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"font-medium\"\n }, event.type === 'task' && '📋 ', event.title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-xs opacity-90\"\n }, (0,date_fns__WEBPACK_IMPORTED_MODULE_2__.format)(event.start, 'HH:mm'), \" - \", (0,date_fns__WEBPACK_IMPORTED_MODULE_2__.format)(event.end, 'HH:mm')));\n }))));\n })));\n};\n_s(CalendarDayView, \"zlIdU9EjM2llFt74AbE2KsUJXyM=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = CalendarDayView;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CalendarDayView);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"CalendarDayView\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Calendar/CalendarDayView.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Calendar/CalendarMonthView.tsx":
+/*!************************************************************!*\
+ !*** ./frontend/components/Calendar/CalendarMonthView.tsx ***!
+ \************************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! date-fns */ \"./node_modules/date-fns/startOfMonth.js\");\n/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! date-fns */ \"./node_modules/date-fns/endOfMonth.js\");\n/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! date-fns */ \"./node_modules/date-fns/startOfWeek.js\");\n/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! date-fns */ \"./node_modules/date-fns/endOfWeek.js\");\n/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! date-fns */ \"./node_modules/date-fns/eachDayOfInterval.js\");\n/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! date-fns */ \"./node_modules/date-fns/format.js\");\n/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! date-fns */ \"./node_modules/date-fns/isSameMonth.js\");\n/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! date-fns */ \"./node_modules/date-fns/isToday.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\n\n\n\nvar CalendarMonthView = function CalendarMonthView(_ref) {\n _s();\n var currentDate = _ref.currentDate,\n events = _ref.events,\n onDateClick = _ref.onDateClick,\n onEventClick = _ref.onEventClick;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var monthStart = (0,date_fns__WEBPACK_IMPORTED_MODULE_2__.startOfMonth)(currentDate);\n var monthEnd = (0,date_fns__WEBPACK_IMPORTED_MODULE_3__.endOfMonth)(currentDate);\n var calendarStart = (0,date_fns__WEBPACK_IMPORTED_MODULE_4__.startOfWeek)(monthStart, {\n weekStartsOn: 1\n }); // Start on Monday\n var calendarEnd = (0,date_fns__WEBPACK_IMPORTED_MODULE_5__.endOfWeek)(monthEnd, {\n weekStartsOn: 1\n });\n var days = (0,date_fns__WEBPACK_IMPORTED_MODULE_6__.eachDayOfInterval)({\n start: calendarStart,\n end: calendarEnd\n });\n var weekDays = [t('weekdays.monday', 'Mon'), t('weekdays.tuesday', 'Tue'), t('weekdays.wednesday', 'Wed'), t('weekdays.thursday', 'Thu'), t('weekdays.friday', 'Fri'), t('weekdays.saturday', 'Sat'), t('weekdays.sunday', 'Sun')];\n var handleDateClick = function handleDateClick(date) {\n if (onDateClick) {\n onDateClick(date);\n }\n };\n var handleEventClick = function handleEventClick(event, e) {\n e.stopPropagation();\n if (onEventClick) {\n onEventClick(event);\n }\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-white dark:bg-gray-900 rounded-lg shadow overflow-hidden\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"grid grid-cols-7 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800\"\n }, weekDays.map(function (day) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: day,\n className: \"p-3 text-center text-sm font-medium text-gray-500 dark:text-gray-400\"\n }, day);\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"grid grid-cols-7\"\n }, days.map(function (day) {\n var dayEvents = events.filter(function (event) {\n return (0,date_fns__WEBPACK_IMPORTED_MODULE_7__.format)(event.start, 'yyyy-MM-dd') === (0,date_fns__WEBPACK_IMPORTED_MODULE_7__.format)(day, 'yyyy-MM-dd');\n });\n var isCurrentMonth = (0,date_fns__WEBPACK_IMPORTED_MODULE_8__.isSameMonth)(day, currentDate);\n var isTodayDate = (0,date_fns__WEBPACK_IMPORTED_MODULE_9__.isToday)(day);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: day.toString(),\n onClick: function onClick() {\n return handleDateClick(day);\n },\n className: \"min-h-32 p-2 border-r border-b border-gray-100 dark:border-gray-800 cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 \".concat(!isCurrentMonth ? 'bg-gray-50 dark:bg-gray-800' : 'bg-white dark:bg-gray-900', \" \").concat(isTodayDate ? 'bg-blue-50 dark:bg-blue-900/20 ring-2 ring-blue-300 dark:ring-blue-600' : '')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-sm mb-2 \".concat(!isCurrentMonth ? 'text-gray-400 dark:text-gray-600' : 'text-gray-900 dark:text-gray-100', \" \").concat(isTodayDate ? 'font-bold text-blue-600 dark:text-blue-400' : '')\n }, isTodayDate && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"inline-flex items-center justify-center w-6 h-6 bg-blue-600 text-white text-xs font-bold rounded-full\"\n }, (0,date_fns__WEBPACK_IMPORTED_MODULE_7__.format)(day, 'd')), !isTodayDate && (0,date_fns__WEBPACK_IMPORTED_MODULE_7__.format)(day, 'd')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"space-y-1\"\n }, dayEvents.slice(0, 3).map(function (event) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: event.id,\n onClick: function onClick(e) {\n return handleEventClick(event, e);\n },\n className: \"text-xs p-1 rounded text-white truncate cursor-pointer hover:opacity-80 transition-opacity \".concat(event.type === 'task' ? 'border-l-2 border-l-white/50' : ''),\n style: {\n backgroundColor: event.color || '#3b82f6'\n },\n title: \"\".concat(event.type === 'task' ? '📋 ' : '').concat(event.title)\n }, event.type === 'task' && '📋 ', event.title);\n }), dayEvents.length > 3 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-xs text-gray-500 dark:text-gray-400 px-1\"\n }, \"+\", dayEvents.length - 3, \" more\")));\n })));\n};\n_s(CalendarMonthView, \"zlIdU9EjM2llFt74AbE2KsUJXyM=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = CalendarMonthView;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CalendarMonthView);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"CalendarMonthView\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Calendar/CalendarMonthView.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Calendar/CalendarWeekView.tsx":
+/*!***********************************************************!*\
+ !*** ./frontend/components/Calendar/CalendarWeekView.tsx ***!
+ \***********************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! date-fns */ \"./node_modules/date-fns/startOfWeek.js\");\n/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! date-fns */ \"./node_modules/date-fns/endOfWeek.js\");\n/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! date-fns */ \"./node_modules/date-fns/eachDayOfInterval.js\");\n/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! date-fns */ \"./node_modules/date-fns/format.js\");\n/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! date-fns */ \"./node_modules/date-fns/isToday.js\");\n/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! date-fns */ \"./node_modules/date-fns/addHours.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\n\n\n\nvar CalendarWeekView = function CalendarWeekView(_ref) {\n _s();\n var currentDate = _ref.currentDate,\n events = _ref.events,\n onDateClick = _ref.onDateClick,\n onEventClick = _ref.onEventClick,\n onTimeSlotClick = _ref.onTimeSlotClick;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var weekStart = (0,date_fns__WEBPACK_IMPORTED_MODULE_2__.startOfWeek)(currentDate, {\n weekStartsOn: 1\n });\n var weekEnd = (0,date_fns__WEBPACK_IMPORTED_MODULE_3__.endOfWeek)(currentDate, {\n weekStartsOn: 1\n });\n var weekDays = (0,date_fns__WEBPACK_IMPORTED_MODULE_4__.eachDayOfInterval)({\n start: weekStart,\n end: weekEnd\n });\n var hours = Array.from({\n length: 24\n }, function (_, i) {\n return i;\n });\n var getEventsForTimeSlot = function getEventsForTimeSlot(day, hour) {\n return events.filter(function (event) {\n var eventDay = (0,date_fns__WEBPACK_IMPORTED_MODULE_5__.format)(event.start, 'yyyy-MM-dd');\n var slotDay = (0,date_fns__WEBPACK_IMPORTED_MODULE_5__.format)(day, 'yyyy-MM-dd');\n var eventHour = event.start.getHours();\n return eventDay === slotDay && eventHour === hour;\n });\n };\n var handleTimeSlotClick = function handleTimeSlotClick(day, hour) {\n if (onTimeSlotClick) {\n onTimeSlotClick(day, hour);\n }\n };\n var handleEventClick = function handleEventClick(event, e) {\n e.stopPropagation();\n if (onEventClick) {\n onEventClick(event);\n }\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-white dark:bg-gray-900 rounded-lg shadow overflow-hidden\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"grid grid-cols-8 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-3 text-center text-sm font-medium text-gray-500 dark:text-gray-400\"\n }, \"Time\"), weekDays.map(function (day) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: day.toString(),\n className: \"p-3 text-center border-l border-gray-200 dark:border-gray-700 \".concat((0,date_fns__WEBPACK_IMPORTED_MODULE_6__.isToday)(day) ? 'bg-blue-50 dark:bg-blue-900/20' : '')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-sm font-medium \".concat((0,date_fns__WEBPACK_IMPORTED_MODULE_6__.isToday)(day) ? 'text-blue-600 dark:text-blue-400' : 'text-gray-900 dark:text-gray-100')\n }, (0,date_fns__WEBPACK_IMPORTED_MODULE_5__.format)(day, 'EEE')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-lg \".concat((0,date_fns__WEBPACK_IMPORTED_MODULE_6__.isToday)(day) ? 'text-blue-600 dark:text-blue-400 font-bold' : 'text-gray-600 dark:text-gray-400')\n }, (0,date_fns__WEBPACK_IMPORTED_MODULE_6__.isToday)(day) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"inline-flex items-center justify-center w-8 h-8 bg-blue-600 text-white text-sm font-bold rounded-full\"\n }, (0,date_fns__WEBPACK_IMPORTED_MODULE_5__.format)(day, 'd')) : (0,date_fns__WEBPACK_IMPORTED_MODULE_5__.format)(day, 'd')));\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"max-h-96 overflow-y-auto\"\n }, hours.map(function (hour) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: hour,\n className: \"grid grid-cols-8 border-b border-gray-100 dark:border-gray-800\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-2 text-xs text-gray-500 dark:text-gray-400 text-center border-r border-gray-200 dark:border-gray-700\"\n }, (0,date_fns__WEBPACK_IMPORTED_MODULE_5__.format)((0,date_fns__WEBPACK_IMPORTED_MODULE_7__.addHours)(new Date().setHours(hour, 0, 0, 0), 0), 'HH:mm')), weekDays.map(function (day) {\n var timeSlotEvents = getEventsForTimeSlot(day, hour);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: \"\".concat(day.toString(), \"-\").concat(hour),\n onClick: function onClick() {\n return handleTimeSlotClick(day, hour);\n },\n className: \"h-12 p-1 border-l border-gray-100 dark:border-gray-800 cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 relative \".concat((0,date_fns__WEBPACK_IMPORTED_MODULE_6__.isToday)(day) ? 'bg-blue-50/30 dark:bg-blue-900/10' : '')\n }, timeSlotEvents.map(function (event) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: event.id,\n onClick: function onClick(e) {\n return handleEventClick(event, e);\n },\n className: \"text-xs p-1 rounded text-white truncate cursor-pointer hover:opacity-80 transition-opacity absolute inset-1 \".concat(event.type === 'task' ? 'border-l-2 border-l-white/50' : ''),\n style: {\n backgroundColor: event.color || '#3b82f6'\n },\n title: \"\".concat(event.type === 'task' ? '📋 ' : '').concat(event.title, \" - \").concat((0,date_fns__WEBPACK_IMPORTED_MODULE_5__.format)(event.start, 'HH:mm'), \" to \").concat((0,date_fns__WEBPACK_IMPORTED_MODULE_5__.format)(event.end, 'HH:mm'))\n }, event.type === 'task' && '📋 ', event.title);\n }));\n }));\n })));\n};\n_s(CalendarWeekView, \"zlIdU9EjM2llFt74AbE2KsUJXyM=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = CalendarWeekView;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CalendarWeekView);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"CalendarWeekView\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Calendar/CalendarWeekView.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Inbox/InboxItemDetail.tsx":
+/*!*******************************************************!*\
+ !*** ./frontend/components/Inbox/InboxItemDetail.tsx ***!
+ \*******************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! date-fns */ \"./node_modules/date-fns/format.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/PencilIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ClipboardDocumentListIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/FolderIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/DocumentTextIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/TrashIcon.js\");\n/* harmony import */ var _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Shared/ToastContext */ \"./frontend/components/Shared/ToastContext.tsx\");\n/* harmony import */ var _Shared_ConfirmDialog__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Shared/ConfirmDialog */ \"./frontend/components/Shared/ConfirmDialog.tsx\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\nvar InboxItemDetail = function InboxItemDetail(_ref) {\n _s();\n var item = _ref.item,\n onProcess = _ref.onProcess,\n onDelete = _ref.onDelete,\n onUpdate = _ref.onUpdate,\n openTaskModal = _ref.openTaskModal,\n openProjectModal = _ref.openProjectModal,\n openNoteModal = _ref.openNoteModal;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var _useToast = (0,_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_2__.useToast)(),\n showSuccessToast = _useToast.showSuccessToast,\n showErrorToast = _useToast.showErrorToast;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState2 = _slicedToArray(_useState, 2),\n showConfirmDialog = _useState2[0],\n setShowConfirmDialog = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState4 = _slicedToArray(_useState3, 2),\n loading = _useState4[0],\n setLoading = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState6 = _slicedToArray(_useState5, 2),\n isHovered = _useState6[0],\n setIsHovered = _useState6[1];\n var handleConvertToTask = function handleConvertToTask() {\n var newTask = {\n name: item.content,\n status: 'not_started',\n priority: 'medium'\n };\n if (item.id !== undefined) {\n openTaskModal(newTask, item.id);\n } else {\n openTaskModal(newTask);\n }\n };\n var handleConvertToProject = function handleConvertToProject() {\n var newProject = {\n name: item.content,\n description: '',\n active: true\n };\n if (item.id !== undefined) {\n openProjectModal(newProject, item.id);\n } else {\n openProjectModal(newProject);\n }\n };\n var handleConvertToNote = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var title, content, isBookmark, _yield$import, isUrl, extractUrlTitle, timeoutPromise, result, tagObjects, newNote, _t, _t2;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n title = item.content.split('\\n')[0] || item.content.substring(0, 50);\n content = item.content;\n isBookmark = false;\n _context.p = 1;\n _context.n = 2;\n return Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../../utils/urlService */ \"./frontend/utils/urlService.ts\"));\n case 2:\n _yield$import = _context.v;\n isUrl = _yield$import.isUrl;\n extractUrlTitle = _yield$import.extractUrlTitle;\n if (!isUrl(item.content.trim())) {\n _context.n = 7;\n break;\n }\n setLoading(true);\n _context.p = 3;\n // Add a timeout to prevent infinite loading\n timeoutPromise = new Promise(function (_, reject) {\n return setTimeout(function () {\n return reject(new Error('Timeout'));\n }, 10000);\n } // 10 second timeout\n );\n _context.n = 4;\n return Promise.race([extractUrlTitle(item.content.trim()), timeoutPromise]);\n case 4:\n result = _context.v;\n if (result && result.title) {\n title = result.title;\n content = item.content;\n isBookmark = true;\n }\n _context.n = 6;\n break;\n case 5:\n _context.p = 5;\n _t = _context.v;\n console.error(\"Error extracting URL title:\", _t);\n // Continue with default title if URL title extraction fails\n // Still mark as bookmark if it's a URL\n isBookmark = true;\n case 6:\n _context.p = 6;\n setLoading(false);\n return _context.f(6);\n case 7:\n _context.n = 9;\n break;\n case 8:\n _context.p = 8;\n _t2 = _context.v;\n console.error(\"Error checking URL or extracting title:\", _t2);\n setLoading(false);\n case 9:\n // Simple array of tag objects for the note\n tagObjects = isBookmark ? [{\n name: \"bookmark\"\n }] : [];\n newNote = {\n title: title,\n content: content,\n tags: tagObjects\n };\n if (item.id !== undefined) {\n openNoteModal(newNote, item.id);\n } else {\n openNoteModal(newNote);\n }\n case 10:\n return _context.a(2);\n }\n }, _callee, null, [[3, 5, 6, 7], [1, 8]]);\n }));\n return function handleConvertToNote() {\n return _ref2.apply(this, arguments);\n };\n }();\n var formattedDate = item.created_at ? (0,date_fns__WEBPACK_IMPORTED_MODULE_4__.format)(new Date(item.created_at), 'MMM dd, yyyy HH:mm') : '';\n var handleDelete = function handleDelete() {\n setShowConfirmDialog(true);\n };\n var confirmDelete = function confirmDelete() {\n if (item.id !== undefined) {\n onDelete(item.id);\n }\n setShowConfirmDialog(false);\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"rounded-lg shadow-sm bg-white dark:bg-gray-900 mt-1\",\n onMouseEnter: function onMouseEnter() {\n return setIsHovered(true);\n },\n onMouseLeave: function onMouseLeave() {\n return setIsHovered(false);\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between px-4 py-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex-1 mr-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-base font-medium text-gray-900 dark:text-gray-300 break-words\"\n }, item.content, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"ml-3 text-xs text-gray-500 dark:text-gray-600\"\n }, formattedDate), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"ml-2 text-xs bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-100 rounded p-1\"\n }, item.source))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center space-x-1\"\n }, loading && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spinner\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n if (onUpdate && item.id !== undefined) {\n onUpdate(item.id, item.content);\n }\n },\n className: \"p-2 text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-full transition-opacity \".concat(isHovered ? 'opacity-100' : 'opacity-0'),\n title: t('common.edit')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n className: \"h-4 w-4\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: handleConvertToTask,\n className: \"p-2 text-blue-600 dark:text-blue-400 hover:bg-blue-100 dark:hover:bg-blue-900 rounded-full transition-opacity \".concat(isHovered ? 'opacity-100' : 'opacity-0'),\n title: t('inbox.createTask')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n className: \"h-4 w-4\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: handleConvertToProject,\n className: \"p-2 text-green-600 dark:text-green-400 hover:bg-green-100 dark:hover:bg-green-900 rounded-full transition-opacity \".concat(isHovered ? 'opacity-100' : 'opacity-0'),\n title: t('inbox.createProject')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n className: \"h-4 w-4\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: handleConvertToNote,\n className: \"p-2 text-purple-600 dark:text-purple-400 hover:bg-purple-100 dark:hover:bg-purple-900 rounded-full transition-opacity \".concat(isHovered ? 'opacity-100' : 'opacity-0'),\n title: t('inbox.createNote', 'Create Note')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n className: \"h-4 w-4\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: handleDelete,\n className: \"p-2 text-red-600 dark:text-red-400 hover:bg-red-100 dark:hover:bg-red-900 rounded-full transition-opacity \".concat(isHovered ? 'opacity-100' : 'opacity-0'),\n title: t('common.delete')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n className: \"h-4 w-4\"\n })))), showConfirmDialog && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Shared_ConfirmDialog__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n title: t('inbox.deleteConfirmTitle', 'Delete Item'),\n message: t('inbox.deleteConfirmMessage', 'Are you sure you want to delete this inbox item? This action cannot be undone.'),\n onConfirm: confirmDelete,\n onCancel: function onCancel() {\n return setShowConfirmDialog(false);\n }\n }));\n};\n_s(InboxItemDetail, \"4/d1ksDb5mGTRs2OSm4ZrZa6oNc=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation, _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_2__.useToast];\n});\n_c = InboxItemDetail;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (InboxItemDetail);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"InboxItemDetail\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Inbox/InboxItemDetail.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Inbox/InboxItems.tsx":
+/*!**************************************************!*\
+ !*** ./frontend/components/Inbox/InboxItems.tsx ***!
+ \**************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_inboxService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/inboxService */ \"./frontend/utils/inboxService.ts\");\n/* harmony import */ var _InboxItemDetail__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./InboxItemDetail */ \"./frontend/components/Inbox/InboxItemDetail.tsx\");\n/* harmony import */ var _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Shared/ToastContext */ \"./frontend/components/Shared/ToastContext.tsx\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/InboxIcon.js\");\n/* harmony import */ var _Shared_LoadingScreen__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Shared/LoadingScreen */ \"./frontend/components/Shared/LoadingScreen.tsx\");\n/* harmony import */ var _Task_TaskModal__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Task/TaskModal */ \"./frontend/components/Task/TaskModal.tsx\");\n/* harmony import */ var _Project_ProjectModal__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Project/ProjectModal */ \"./frontend/components/Project/ProjectModal.tsx\");\n/* harmony import */ var _Note_NoteModal__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Note/NoteModal */ \"./frontend/components/Note/NoteModal.tsx\");\n/* harmony import */ var _Task_SimplifiedTaskModal__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Task/SimplifiedTaskModal */ \"./frontend/components/Task/SimplifiedTaskModal.tsx\");\n/* harmony import */ var _utils_projectsService__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../utils/projectsService */ \"./frontend/utils/projectsService.ts\");\n/* harmony import */ var _utils_tasksService__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../utils/tasksService */ \"./frontend/utils/tasksService.ts\");\n/* harmony import */ var _utils_notesService__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../utils/notesService */ \"./frontend/utils/notesService.ts\");\n/* harmony import */ var _utils_urlService__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../utils/urlService */ \"./frontend/utils/urlService.ts\");\n/* harmony import */ var _store_useStore__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../store/useStore */ \"./frontend/store/useStore.ts\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar InboxItems = function InboxItems() {\n _s();\n var _inboxItems$find;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_4__.useTranslation)(),\n t = _useTranslation.t;\n var _useToast = (0,_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_3__.useToast)(),\n showSuccessToast = _useToast.showSuccessToast,\n showErrorToast = _useToast.showErrorToast;\n\n // Access store data\n var _useStore = (0,_store_useStore__WEBPACK_IMPORTED_MODULE_14__.useStore)(function (state) {\n return state.inboxStore;\n }),\n inboxItems = _useStore.inboxItems,\n isLoading = _useStore.isLoading;\n\n // Modal states\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState2 = _slicedToArray(_useState, 2),\n isTaskModalOpen = _useState2[0],\n setIsTaskModalOpen = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState4 = _slicedToArray(_useState3, 2),\n isProjectModalOpen = _useState4[0],\n setIsProjectModalOpen = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState6 = _slicedToArray(_useState5, 2),\n isNoteModalOpen = _useState6[0],\n setIsNoteModalOpen = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState8 = _slicedToArray(_useState7, 2),\n isEditModalOpen = _useState8[0],\n setIsEditModalOpen = _useState8[1];\n\n // Data for modals\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState0 = _slicedToArray(_useState9, 2),\n taskToEdit = _useState0[0],\n setTaskToEdit = _useState0[1];\n var _useState1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState10 = _slicedToArray(_useState1, 2),\n projectToEdit = _useState10[0],\n setProjectToEdit = _useState10[1];\n var _useState11 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState12 = _slicedToArray(_useState11, 2),\n noteToEdit = _useState12[0],\n setNoteToEdit = _useState12[1];\n\n // Track the current inbox item ID being converted (for task/project/note conversion)\n var _useState13 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState14 = _slicedToArray(_useState13, 2),\n currentConversionItemId = _useState14[0],\n setCurrentConversionItemId = _useState14[1];\n\n // Track the current inbox item being edited\n var _useState15 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState16 = _slicedToArray(_useState15, 2),\n itemToEdit = _useState16[0],\n setItemToEdit = _useState16[1];\n\n // Fetch projects for modals\n var _useState17 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState18 = _slicedToArray(_useState17, 2),\n projects = _useState18[0],\n setProjects = _useState18[1];\n\n // Wrapped in useCallback to prevent dependency issues in useEffect\n var refreshInboxItems = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () {\n (0,_utils_inboxService__WEBPACK_IMPORTED_MODULE_1__.loadInboxItemsToStore)();\n }, []);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n // Initial data loading\n refreshInboxItems();\n\n // Set up an event listener for force reload\n var handleForceReload = function handleForceReload() {\n // Wait a short time to ensure the backend has processed the new item\n setTimeout(function () {\n refreshInboxItems();\n }, 500);\n };\n\n // Handler for the inboxItemsUpdated custom event\n var handleInboxItemsUpdated = function handleInboxItemsUpdated(event) {\n // Show toast notifications for new items\n if (event.detail.count > 0) {\n // Show notification for the first new item\n showSuccessToast(t('inbox.newTelegramItem', 'New item from Telegram: {{content}}', {\n content: event.detail.firstItemContent\n }));\n\n // If multiple new items, show a summary notification as well\n if (event.detail.count > 1) {\n showSuccessToast(t('inbox.multipleNewItems', '{{count}} more new items added', {\n count: event.detail.count - 1\n }));\n }\n }\n };\n\n // Set up polling for new inbox items (especially from Telegram)\n // This ensures real-time updates when items are added externally\n var pollInterval = setInterval(function () {\n refreshInboxItems();\n }, 5000); // Check for new items every 5 seconds\n\n // Add event listeners\n window.addEventListener('forceInboxReload', handleForceReload);\n window.addEventListener('inboxItemsUpdated', handleInboxItemsUpdated);\n return function () {\n clearInterval(pollInterval);\n window.removeEventListener('forceInboxReload', handleForceReload);\n window.removeEventListener('inboxItemsUpdated', handleInboxItemsUpdated);\n };\n }, [refreshInboxItems, showSuccessToast, t]);\n var handleProcessItem = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(id) {\n var _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n _context.p = 0;\n _context.n = 1;\n return (0,_utils_inboxService__WEBPACK_IMPORTED_MODULE_1__.processInboxItemWithStore)(id);\n case 1:\n showSuccessToast(t('inbox.itemProcessed'));\n _context.n = 3;\n break;\n case 2:\n _context.p = 2;\n _t = _context.v;\n console.error('Failed to process inbox item:', _t);\n showErrorToast(t('inbox.processError'));\n case 3:\n return _context.a(2);\n }\n }, _callee, null, [[0, 2]]);\n }));\n return function handleProcessItem(_x) {\n return _ref.apply(this, arguments);\n };\n }();\n var handleUpdateItem = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(id) {\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n // When edit button is clicked, we open the SimplifiedTaskModal instead of doing inline editing\n setItemToEdit(id);\n setIsEditModalOpen(true);\n case 1:\n return _context2.a(2);\n }\n }, _callee2);\n }));\n return function handleUpdateItem(_x2) {\n return _ref2.apply(this, arguments);\n };\n }();\n var handleSaveEditedItem = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(text) {\n var _t2;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n _context3.p = 0;\n if (!(itemToEdit !== null)) {\n _context3.n = 2;\n break;\n }\n _context3.n = 1;\n return (0,_utils_inboxService__WEBPACK_IMPORTED_MODULE_1__.updateInboxItemWithStore)(itemToEdit, text);\n case 1:\n showSuccessToast(t('inbox.itemUpdated'));\n case 2:\n setIsEditModalOpen(false);\n setItemToEdit(null);\n _context3.n = 4;\n break;\n case 3:\n _context3.p = 3;\n _t2 = _context3.v;\n console.error('Failed to update inbox item:', _t2);\n showErrorToast(t('inbox.updateError'));\n case 4:\n return _context3.a(2);\n }\n }, _callee3, null, [[0, 3]]);\n }));\n return function handleSaveEditedItem(_x3) {\n return _ref3.apply(this, arguments);\n };\n }();\n var handleDeleteItem = /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(id) {\n var _t3;\n return _regenerator().w(function (_context4) {\n while (1) switch (_context4.n) {\n case 0:\n _context4.p = 0;\n _context4.n = 1;\n return (0,_utils_inboxService__WEBPACK_IMPORTED_MODULE_1__.deleteInboxItemWithStore)(id);\n case 1:\n showSuccessToast(t('inbox.itemDeleted'));\n _context4.n = 3;\n break;\n case 2:\n _context4.p = 2;\n _t3 = _context4.v;\n console.error('Failed to delete inbox item:', _t3);\n showErrorToast(t('inbox.deleteError'));\n case 3:\n return _context4.a(2);\n }\n }, _callee4, null, [[0, 2]]);\n }));\n return function handleDeleteItem(_x4) {\n return _ref4.apply(this, arguments);\n };\n }();\n\n // Modal handlers\n var handleOpenTaskModal = /*#__PURE__*/function () {\n var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5(task, inboxItemId) {\n var projectData, _t4;\n return _regenerator().w(function (_context5) {\n while (1) switch (_context5.n) {\n case 0:\n _context5.p = 0;\n _context5.n = 1;\n return (0,_utils_projectsService__WEBPACK_IMPORTED_MODULE_10__.fetchProjects)();\n case 1:\n projectData = _context5.v;\n // Make sure we always set an array\n setProjects(Array.isArray(projectData) ? projectData : []);\n _context5.n = 3;\n break;\n case 2:\n _context5.p = 2;\n _t4 = _context5.v;\n console.error('Failed to load projects:', _t4);\n showErrorToast(t('project.loadError', 'Failed to load projects'));\n setProjects([]); // Ensure we have an empty array even on error\n case 3:\n setTaskToEdit(task);\n if (inboxItemId) {\n setCurrentConversionItemId(inboxItemId);\n }\n setIsTaskModalOpen(true);\n case 4:\n return _context5.a(2);\n }\n }, _callee5, null, [[0, 2]]);\n }));\n return function handleOpenTaskModal(_x5, _x6) {\n return _ref5.apply(this, arguments);\n };\n }();\n var handleOpenProjectModal = function handleOpenProjectModal(project, inboxItemId) {\n setProjectToEdit(project);\n if (inboxItemId) {\n setCurrentConversionItemId(inboxItemId);\n }\n setIsProjectModalOpen(true);\n };\n var handleOpenNoteModal = function handleOpenNoteModal(note, inboxItemId) {\n // If note has content that's a URL, ensure it has a bookmark tag\n if (note && note.content && (0,_utils_urlService__WEBPACK_IMPORTED_MODULE_13__.isUrl)(note.content.trim())) {\n if (!note.tags) {\n note.tags = [{\n name: 'bookmark'\n }];\n } else if (!note.tags.some(function (tag) {\n return tag.name === 'bookmark';\n })) {\n note.tags.push({\n name: 'bookmark'\n });\n }\n }\n setNoteToEdit(note);\n if (inboxItemId) {\n setCurrentConversionItemId(inboxItemId);\n }\n setIsNoteModalOpen(true);\n };\n var handleSaveTask = /*#__PURE__*/function () {\n var _ref6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6(task) {\n var createdTask, taskLink, _t5;\n return _regenerator().w(function (_context6) {\n while (1) switch (_context6.n) {\n case 0:\n _context6.p = 0;\n _context6.n = 1;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_11__.createTask)(task);\n case 1:\n createdTask = _context6.v;\n taskLink = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, t('task.created', 'Task'), \" \", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: \"/task/\".concat(createdTask.uuid),\n className: \"text-green-200 underline hover:text-green-100\"\n }, createdTask.name), \" \", t('task.createdSuccessfully', 'created successfully!'));\n showSuccessToast(taskLink);\n\n // Process the inbox item after successful task creation\n if (!(currentConversionItemId !== null)) {\n _context6.n = 3;\n break;\n }\n _context6.n = 2;\n return handleProcessItem(currentConversionItemId);\n case 2:\n setCurrentConversionItemId(null);\n case 3:\n setIsTaskModalOpen(false);\n _context6.n = 5;\n break;\n case 4:\n _context6.p = 4;\n _t5 = _context6.v;\n console.error('Failed to create task:', _t5);\n showErrorToast(t('task.createError'));\n case 5:\n return _context6.a(2);\n }\n }, _callee6, null, [[0, 4]]);\n }));\n return function handleSaveTask(_x7) {\n return _ref6.apply(this, arguments);\n };\n }();\n var handleSaveProject = /*#__PURE__*/function () {\n var _ref7 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee7(project) {\n var _t6;\n return _regenerator().w(function (_context7) {\n while (1) switch (_context7.n) {\n case 0:\n _context7.p = 0;\n _context7.n = 1;\n return (0,_utils_projectsService__WEBPACK_IMPORTED_MODULE_10__.createProject)(project);\n case 1:\n showSuccessToast(t('project.createSuccess'));\n\n // Process the inbox item after successful project creation\n if (!(currentConversionItemId !== null)) {\n _context7.n = 3;\n break;\n }\n _context7.n = 2;\n return handleProcessItem(currentConversionItemId);\n case 2:\n setCurrentConversionItemId(null);\n case 3:\n setIsProjectModalOpen(false);\n _context7.n = 5;\n break;\n case 4:\n _context7.p = 4;\n _t6 = _context7.v;\n console.error('Failed to create project:', _t6);\n showErrorToast(t('project.createError'));\n case 5:\n return _context7.a(2);\n }\n }, _callee7, null, [[0, 4]]);\n }));\n return function handleSaveProject(_x8) {\n return _ref7.apply(this, arguments);\n };\n }();\n var handleSaveNote = /*#__PURE__*/function () {\n var _ref8 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee8(note) {\n var noteContent, isBookmarkContent, _t7;\n return _regenerator().w(function (_context8) {\n while (1) switch (_context8.n) {\n case 0:\n _context8.p = 0;\n // Check if the content appears to be a URL and add the bookmark tag\n noteContent = note.content || '';\n isBookmarkContent = (0,_utils_urlService__WEBPACK_IMPORTED_MODULE_13__.isUrl)(noteContent.trim()); // Ensure tags property exists\n if (!note.tags) {\n note.tags = [];\n }\n\n // Add a bookmark tag if content is a URL and doesn't already have the tag\n if (isBookmarkContent && !note.tags.some(function (tag) {\n return tag.name === 'bookmark';\n })) {\n // Use spread operator to create a new array with the bookmark tag added\n note.tags = [].concat(_toConsumableArray(note.tags), [{\n name: 'bookmark'\n }]);\n }\n\n // Create the note with proper tags\n _context8.n = 1;\n return (0,_utils_notesService__WEBPACK_IMPORTED_MODULE_12__.createNote)(note);\n case 1:\n showSuccessToast(t('note.createSuccess', 'Note created successfully'));\n\n // Process the inbox item after successful note creation\n if (!(currentConversionItemId !== null)) {\n _context8.n = 3;\n break;\n }\n _context8.n = 2;\n return handleProcessItem(currentConversionItemId);\n case 2:\n setCurrentConversionItemId(null);\n case 3:\n setIsNoteModalOpen(false);\n _context8.n = 5;\n break;\n case 4:\n _context8.p = 4;\n _t7 = _context8.v;\n console.error('Failed to create note:', _t7);\n showErrorToast(t('note.createError', 'Failed to create note'));\n case 5:\n return _context8.a(2);\n }\n }, _callee8, null, [[0, 4]]);\n }));\n return function handleSaveNote(_x9) {\n return _ref8.apply(this, arguments);\n };\n }();\n var handleCreateProject = /*#__PURE__*/function () {\n var _ref9 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee9(name) {\n var project, _t8;\n return _regenerator().w(function (_context9) {\n while (1) switch (_context9.n) {\n case 0:\n _context9.p = 0;\n _context9.n = 1;\n return (0,_utils_projectsService__WEBPACK_IMPORTED_MODULE_10__.createProject)({\n name: name,\n active: true\n });\n case 1:\n project = _context9.v;\n showSuccessToast(t('project.createSuccess'));\n return _context9.a(2, project);\n case 2:\n _context9.p = 2;\n _t8 = _context9.v;\n console.error('Failed to create project:', _t8);\n showErrorToast(t('project.createError'));\n throw _t8;\n case 3:\n return _context9.a(2);\n }\n }, _callee9, null, [[0, 2]]);\n }));\n return function handleCreateProject(_x0) {\n return _ref9.apply(this, arguments);\n };\n }();\n if (isLoading) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Shared_LoadingScreen__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null);\n }\n if (inboxItems.length === 0) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex flex-col items-center justify-center p-8 space-y-4 text-center text-gray-600 dark:text-gray-300\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n className: \"h-16 w-16\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-xl font-semibold\"\n }, t('inbox.empty')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, t('inbox.emptyDescription')));\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"container mx-auto p-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center mb-8\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n className: \"h-6 w-6 mr-2\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h1\", {\n className: \"text-2xl font-light\"\n }, t('inbox.title'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"mb-6 text-sm text-gray-500 dark:text-gray-400\"\n }, t('taskViews.inbox', 'Inbox is where all uncategorized tasks are located. Tasks that have not been assigned to a project or don\\'t have a due date will appear here. This is your \\'brain dump\\' area where you can quickly note down tasks and organize them later.')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"space-y-2\"\n }, inboxItems.map(function (item) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_InboxItemDetail__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n key: item.id,\n item: item,\n onProcess: handleProcessItem,\n onDelete: handleDeleteItem,\n onUpdate: handleUpdateItem,\n openTaskModal: handleOpenTaskModal,\n openProjectModal: handleOpenProjectModal,\n openNoteModal: handleOpenNoteModal\n });\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Task_TaskModal__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n isOpen: isTaskModalOpen,\n onClose: function onClose() {\n setIsTaskModalOpen(false);\n setTaskToEdit(null);\n },\n task: taskToEdit || {\n name: '',\n status: 'not_started',\n priority: 'medium'\n },\n onSave: handleSaveTask,\n onDelete: /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee0() {\n return _regenerator().w(function (_context0) {\n while (1) switch (_context0.n) {\n case 0:\n return _context0.a(2);\n }\n }, _callee0);\n })) // No need to delete since it's a new task\n ,\n projects: Array.isArray(projects) ? projects : [],\n onCreateProject: handleCreateProject\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Project_ProjectModal__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n isOpen: isProjectModalOpen,\n onClose: function onClose() {\n setIsProjectModalOpen(false);\n setProjectToEdit(null);\n },\n onSave: handleSaveProject,\n project: projectToEdit || undefined,\n areas: []\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Note_NoteModal__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n isOpen: isNoteModalOpen,\n onClose: function onClose() {\n setIsNoteModalOpen(false);\n setNoteToEdit(null);\n },\n onSave: handleSaveNote,\n note: noteToEdit || {\n title: '',\n content: ''\n }\n }), isEditModalOpen && itemToEdit !== null && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Task_SimplifiedTaskModal__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n isOpen: isEditModalOpen,\n onClose: function onClose() {\n setIsEditModalOpen(false);\n setItemToEdit(null);\n },\n onSave: /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee1() {\n return _regenerator().w(function (_context1) {\n while (1) switch (_context1.n) {\n case 0:\n return _context1.a(2);\n }\n }, _callee1);\n })) // Not used in edit mode\n ,\n initialText: ((_inboxItems$find = inboxItems.find(function (item) {\n return item.id === itemToEdit;\n })) === null || _inboxItems$find === void 0 ? void 0 : _inboxItems$find.content) || \"\",\n editMode: true,\n onEdit: handleSaveEditedItem\n }));\n};\n_s(InboxItems, \"nq0ODX7Tcz9ugYgcI0G8lAoMtHA=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_4__.useTranslation, _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_3__.useToast, _store_useStore__WEBPACK_IMPORTED_MODULE_14__.useStore];\n});\n_c = InboxItems;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (InboxItems);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"InboxItems\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Inbox/InboxItems.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Login.tsx":
+/*!***************************************!*\
+ !*** ./frontend/components/Login.tsx ***!
+ \***************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/dist/index.js\");\n/* harmony import */ var i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! i18next */ \"./node_modules/i18next/dist/esm/i18next.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\nvar Login = function Login() {\n _s();\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(''),\n _useState2 = _slicedToArray(_useState, 2),\n email = _useState2[0],\n setEmail = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(''),\n _useState4 = _slicedToArray(_useState3, 2),\n password = _useState4[0],\n setPassword = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState6 = _slicedToArray(_useState5, 2),\n error = _useState6[0],\n setError = _useState6[1];\n var navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_3__.useNavigate)();\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_2__.useTranslation)(),\n t = _useTranslation.t;\n var handleSubmit = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(e) {\n var response, data, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n e.preventDefault();\n _context.p = 1;\n _context.n = 2;\n return fetch('/api/login', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n email: email,\n password: password\n }),\n credentials: 'include'\n });\n case 2:\n response = _context.v;\n _context.n = 3;\n return response.json();\n case 3:\n data = _context.v;\n if (!response.ok) {\n _context.n = 5;\n break;\n }\n if (!(data.user && data.user.language)) {\n _context.n = 4;\n break;\n }\n _context.n = 4;\n return i18next__WEBPACK_IMPORTED_MODULE_1__[\"default\"].changeLanguage(data.user.language);\n case 4:\n window.dispatchEvent(new CustomEvent('userLoggedIn', {\n detail: data.user\n }));\n navigate('/today');\n _context.n = 6;\n break;\n case 5:\n setError(data.errors[0] || 'Login failed. Please try again.');\n case 6:\n _context.n = 8;\n break;\n case 7:\n _context.p = 7;\n _t = _context.v;\n setError('An error occurred. Please try again.');\n console.error('Error during login:', _t);\n case 8:\n return _context.a(2);\n }\n }, _callee, null, [[1, 7]]);\n }));\n return function handleSubmit(_x) {\n return _ref.apply(this, arguments);\n };\n }();\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-gray-100 flex flex-col items-center justify-center min-h-screen px-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h1\", {\n className: \"text-5xl font-bold text-gray-300 mb-6\"\n }, \"tududi\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-white p-8 rounded-lg shadow-md w-full max-w-sm\"\n }, error && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4 text-center text-red-500\"\n }, error), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"form\", {\n onSubmit: handleSubmit\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: \"email\",\n className: \"block text-gray-600 mb-1\"\n }, t('auth.email', 'Email')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"email\",\n id: \"email\",\n name: \"email\",\n value: email,\n onChange: function onChange(e) {\n return setEmail(e.target.value);\n },\n className: \"w-full px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500\",\n required: true\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: \"password\",\n className: \"block text-gray-600 mb-1\"\n }, t('auth.password', 'Password')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"password\",\n id: \"password\",\n name: \"password\",\n value: password,\n onChange: function onChange(e) {\n return setPassword(e.target.value);\n },\n className: \"w-full px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500\",\n required: true\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"submit\",\n className: \"w-full bg-blue-500 text-white py-2 rounded-lg hover:bg-blue-600 transition-colors\"\n }, t('auth.login', 'Login')))));\n};\n_s(Login, \"p+CSpJk3UEXSCL3mEICWIDrV9HY=\", false, function () {\n return [react_router_dom__WEBPACK_IMPORTED_MODULE_3__.useNavigate, react_i18next__WEBPACK_IMPORTED_MODULE_2__.useTranslation];\n});\n_c = Login;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Login);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"Login\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Login.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Navbar.tsx":
+/*!****************************************!*\
+ !*** ./frontend/components/Navbar.tsx ***!
+ \****************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/dist/index.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/dist/index.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/Bars3Icon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/UserIcon.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _Shared_PomodoroTimer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Shared/PomodoroTimer */ \"./frontend/components/Shared/PomodoroTimer.tsx\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\nvar Navbar = function Navbar(_ref) {\n _s();\n var isDarkMode = _ref.isDarkMode,\n toggleDarkMode = _ref.toggleDarkMode,\n currentUser = _ref.currentUser,\n setCurrentUser = _ref.setCurrentUser,\n isSidebarOpen = _ref.isSidebarOpen,\n setIsSidebarOpen = _ref.setIsSidebarOpen;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState2 = _slicedToArray(_useState, 2),\n isDropdownOpen = _useState2[0],\n setIsDropdownOpen = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true),\n _useState4 = _slicedToArray(_useState3, 2),\n pomodoroEnabled = _useState4[0],\n setPomodoroEnabled = _useState4[1]; // Default to true\n var dropdownRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n var navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_3__.useNavigate)();\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var handleClickOutside = function handleClickOutside(event) {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {\n setIsDropdownOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return function () {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, []);\n\n // Fetch user's pomodoro setting\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var fetchProfile = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var response, profile, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n _context.p = 0;\n _context.n = 1;\n return fetch('/api/profile', {\n credentials: 'include'\n });\n case 1:\n response = _context.v;\n if (!response.ok) {\n _context.n = 3;\n break;\n }\n _context.n = 2;\n return response.json();\n case 2:\n profile = _context.v;\n setPomodoroEnabled(profile.pomodoro_enabled !== undefined ? profile.pomodoro_enabled : true);\n case 3:\n _context.n = 5;\n break;\n case 4:\n _context.p = 4;\n _t = _context.v;\n console.error('Error fetching profile:', _t);\n // Keep default value (true) if fetch fails\n case 5:\n return _context.a(2);\n }\n }, _callee, null, [[0, 4]]);\n }));\n return function fetchProfile() {\n return _ref2.apply(this, arguments);\n };\n }();\n fetchProfile();\n\n // Listen for Pomodoro setting changes from ProfileSettings\n var handlePomodoroSettingChange = function handlePomodoroSettingChange(event) {\n setPomodoroEnabled(event.detail.enabled);\n };\n window.addEventListener('pomodoroSettingChanged', handlePomodoroSettingChange);\n return function () {\n window.removeEventListener('pomodoroSettingChanged', handlePomodoroSettingChange);\n };\n }, []);\n var toggleDropdown = function toggleDropdown() {\n setIsDropdownOpen(!isDropdownOpen);\n };\n var handleLogout = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {\n var response, _t2, _t3, _t4;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n _context2.p = 0;\n _context2.n = 1;\n return fetch('/api/logout', {\n method: 'GET',\n credentials: 'include'\n });\n case 1:\n response = _context2.v;\n if (!response.ok) {\n _context2.n = 2;\n break;\n }\n setCurrentUser(null);\n navigate('/login');\n _context2.n = 4;\n break;\n case 2:\n _t2 = console;\n _context2.n = 3;\n return response.json();\n case 3:\n _t3 = _context2.v;\n _t2.error.call(_t2, 'Logout failed:', _t3);\n case 4:\n _context2.n = 6;\n break;\n case 5:\n _context2.p = 5;\n _t4 = _context2.v;\n console.error('Error during logout:', _t4);\n case 6:\n return _context2.a(2);\n }\n }, _callee2, null, [[0, 5]]);\n }));\n return function handleLogout() {\n return _ref3.apply(this, arguments);\n };\n }();\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"nav\", {\n className: \"fixed top-0 left-0 right-0 z-50 bg-white dark:bg-gray-900 text-gray-900 dark:text-white shadow-md h-16\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"px-4 sm:px-6 lg:px-8 h-full flex items-center justify-between\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return setIsSidebarOpen(!isSidebarOpen);\n },\n className: \"flex items-center focus:outline-none text-gray-500 dark:text-gray-500\",\n \"aria-label\": isSidebarOpen ? \"Collapse Sidebar\" : \"Expand Sidebar\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n className: \"h-6 mt-1 w-6 mr-2\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_5__.Link, {\n to: \"/\",\n className: \"flex items-center no-underline text-gray-900 dark:text-white\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-2xl font-bold\"\n }, \"tududi\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center space-x-4\"\n }, pomodoroEnabled && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Shared_PomodoroTimer__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"relative\",\n ref: dropdownRef\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: toggleDropdown,\n className: \"flex items-center focus:outline-none\",\n \"aria-label\": \"User Menu\"\n }, currentUser !== null && currentUser !== void 0 && currentUser.avatarUrl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n src: currentUser.avatarUrl,\n alt: \"User Avatar\",\n className: \"h-8 w-8 rounded-full object-cover border-2 border-green-500\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"h-8 w-8 rounded-full border-2 border-green-500 bg-gray-200 dark:bg-gray-700 flex items-center justify-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n className: \"h-6 w-6 text-gray-500 dark:text-gray-300\"\n }))), isDropdownOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n ref: dropdownRef,\n className: \"absolute right-4 top-16 w-48 bg-white dark:bg-gray-800 rounded-md shadow-lg py-1 border border-gray-200 dark:border-gray-700\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_5__.Link, {\n to: \"/profile\",\n className: \"block px-4 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-700\",\n onClick: function onClick() {\n return setIsDropdownOpen(false);\n }\n }, t('navigation.profileSettings', 'Profile Settings')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n setIsDropdownOpen(false);\n handleLogout();\n },\n className: \"w-full text-left px-4 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-700\"\n }, t('navigation.logout', 'Logout')))))));\n};\n_s(Navbar, \"55YWfIkTZU5forJ3Nxwh+9ACWD8=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation, react_router_dom__WEBPACK_IMPORTED_MODULE_3__.useNavigate];\n});\n_c = Navbar;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Navbar);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"Navbar\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Navbar.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Note/NoteDetails.tsx":
+/*!**************************************************!*\
+ !*** ./frontend/components/Note/NoteDetails.tsx ***!
+ \**************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/dist/index.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/dist/index.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/DocumentTextIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/PencilSquareIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/TrashIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/TagIcon.js\");\n/* harmony import */ var _Shared_ConfirmDialog__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Shared/ConfirmDialog */ \"./frontend/components/Shared/ConfirmDialog.tsx\");\n/* harmony import */ var _NoteModal__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./NoteModal */ \"./frontend/components/Note/NoteModal.tsx\");\n/* harmony import */ var _Shared_MarkdownRenderer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Shared/MarkdownRenderer */ \"./frontend/components/Shared/MarkdownRenderer.tsx\");\n/* harmony import */ var _utils_notesService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils/notesService */ \"./frontend/utils/notesService.ts\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\n\nvar NoteDetails = function NoteDetails() {\n _s();\n var _ref4, _ref5;\n var _useParams = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_5__.useParams)(),\n id = _useParams.id;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState2 = _slicedToArray(_useState, 2),\n note = _useState2[0],\n setNote = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState4 = _slicedToArray(_useState3, 2),\n isNoteModalOpen = _useState4[0],\n setIsNoteModalOpen = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState6 = _slicedToArray(_useState5, 2),\n isConfirmDialogOpen = _useState6[0],\n setIsConfirmDialogOpen = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState8 = _slicedToArray(_useState7, 2),\n noteToDelete = _useState8[0],\n setNoteToDelete = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true),\n _useState0 = _slicedToArray(_useState9, 2),\n isLoading = _useState0[0],\n setIsLoading = _useState0[1];\n var _useState1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState10 = _slicedToArray(_useState1, 2),\n isError = _useState10[0],\n setIsError = _useState10[1];\n var navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_5__.useNavigate)();\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var fetchNote = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var notes, foundNote, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n _context.p = 0;\n setIsLoading(true);\n _context.n = 1;\n return (0,_utils_notesService__WEBPACK_IMPORTED_MODULE_4__.fetchNotes)();\n case 1:\n notes = _context.v;\n foundNote = notes.find(function (n) {\n return n.id === Number(id);\n });\n setNote(foundNote || null);\n if (!foundNote) {\n setIsError(true);\n }\n _context.n = 3;\n break;\n case 2:\n _context.p = 2;\n _t = _context.v;\n setIsError(true);\n console.error('Error fetching note:', _t);\n case 3:\n _context.p = 3;\n setIsLoading(false);\n return _context.f(3);\n case 4:\n return _context.a(2);\n }\n }, _callee, null, [[0, 2, 3, 4]]);\n }));\n return function fetchNote() {\n return _ref.apply(this, arguments);\n };\n }();\n fetchNote();\n }, [id]);\n var handleDeleteNote = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {\n var _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n if (noteToDelete) {\n _context2.n = 1;\n break;\n }\n return _context2.a(2);\n case 1:\n _context2.p = 1;\n _context2.n = 2;\n return (0,_utils_notesService__WEBPACK_IMPORTED_MODULE_4__.deleteNote)(noteToDelete.id);\n case 2:\n navigate('/notes');\n _context2.n = 4;\n break;\n case 3:\n _context2.p = 3;\n _t2 = _context2.v;\n console.error('Error deleting note:', _t2);\n case 4:\n return _context2.a(2);\n }\n }, _callee2, null, [[1, 3]]);\n }));\n return function handleDeleteNote() {\n return _ref2.apply(this, arguments);\n };\n }();\n var handleSaveNote = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(updatedNote) {\n var savedNote, _t3;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n _context3.p = 0;\n if (!(updatedNote.id !== undefined)) {\n _context3.n = 2;\n break;\n }\n _context3.n = 1;\n return (0,_utils_notesService__WEBPACK_IMPORTED_MODULE_4__.updateNote)(updatedNote.id, updatedNote);\n case 1:\n savedNote = _context3.v;\n setNote(savedNote);\n _context3.n = 3;\n break;\n case 2:\n console.error(\"Error: Note ID is undefined.\");\n case 3:\n _context3.n = 5;\n break;\n case 4:\n _context3.p = 4;\n _t3 = _context3.v;\n console.error('Error saving note:', _t3);\n case 5:\n setIsNoteModalOpen(false);\n case 6:\n return _context3.a(2);\n }\n }, _callee3, null, [[0, 4]]);\n }));\n return function handleSaveNote(_x) {\n return _ref3.apply(this, arguments);\n };\n }();\n var handleEditNote = function handleEditNote() {\n setIsNoteModalOpen(true);\n };\n var handleOpenConfirmDialog = function handleOpenConfirmDialog(note) {\n setNoteToDelete(note);\n setIsConfirmDialogOpen(true);\n };\n if (isLoading) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-center h-screen bg-gray-100 dark:bg-gray-900\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-xl font-semibold text-gray-700 dark:text-gray-200\"\n }, \"Loading note details...\"));\n }\n if (isError || !note) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-center h-screen bg-gray-100 dark:bg-gray-900\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-red-500 text-lg\"\n }, isError ? 'Error loading note details.' : 'Note not found.'));\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex justify-center px-4 lg:px-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-full max-w-5xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n className: \"h-6 w-6 text-xl mr-2\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h2\", {\n className: \"text-2xl font-light text-gray-900 dark:text-gray-100\"\n }, note.title)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex space-x-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: handleEditNote,\n className: \"text-gray-500 hover:text-blue-700 dark:hover:text-blue-300 focus:outline-none\",\n \"aria-label\": \"Edit \".concat(note.title),\n title: \"Edit \".concat(note.title)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n className: \"h-5 w-5\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return handleOpenConfirmDialog(note);\n },\n className: \"text-gray-500 hover:text-red-700 dark:hover:text-red-300 focus:outline-none\",\n \"aria-label\": \"Delete \".concat(note.title),\n title: \"Delete \".concat(note.title)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n className: \"h-5 w-5\"\n })))), note.tags && note.tags.length > 0 || note.Tags && note.Tags.length > 0 || note.project || note.Project ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-white dark:bg-gray-900 shadow-md rounded-lg p-4 mb-6\"\n }, (note.tags && note.tags.length > 0 || note.Tags && note.Tags.length > 0) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n className: \"h-4 w-4 text-gray-500 dark:text-gray-400 mr-3 mt-0.5\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-sm font-medium text-gray-600 dark:text-gray-400 mr-2\"\n }, \"Tags:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex flex-wrap gap-2 mt-1\"\n }, (note.tags || note.Tags || []).map(function (tag) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n key: tag.id,\n onClick: function onClick() {\n return navigate(\"/tag/\".concat(tag.id));\n },\n className: \"flex items-center space-x-1 px-2 py-1 bg-blue-100 dark:bg-blue-900/30 text-blue-800 dark:text-blue-200 rounded-full cursor-pointer hover:bg-blue-200 dark:hover:bg-blue-900/50 transition-colors text-xs\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n className: \"h-3 w-3\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, tag.name));\n }))))), (note.project || note.Project) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: note.tags && note.tags.length > 0 || note.Tags && note.Tags.length > 0 ? \"mt-4\" : \"\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-lg font-semibold text-gray-900 dark:text-white\"\n }, \"Project\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_10__.Link, {\n to: \"/project/\".concat((_ref4 = note.project || note.Project) === null || _ref4 === void 0 ? void 0 : _ref4.id),\n className: \"text-blue-600 dark:text-blue-400 hover:underline\"\n }, (_ref5 = note.project || note.Project) === null || _ref5 === void 0 ? void 0 : _ref5.name))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-6 bg-white dark:bg-gray-900 shadow-md rounded-lg p-6\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Shared_MarkdownRenderer__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n content: note.content\n })), isNoteModalOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_NoteModal__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n isOpen: isNoteModalOpen,\n onClose: function onClose() {\n return setIsNoteModalOpen(false);\n },\n onSave: handleSaveNote,\n note: note\n }), isConfirmDialogOpen && noteToDelete && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Shared_ConfirmDialog__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n title: \"Delete Note\",\n message: \"Are you sure you want to delete the note \\\"\".concat(noteToDelete.title, \"\\\"?\"),\n onConfirm: handleDeleteNote,\n onCancel: function onCancel() {\n setIsConfirmDialogOpen(false);\n setNoteToDelete(null);\n }\n })));\n};\n_s(NoteDetails, \"bY6WeCnCUShZwa24FpTJ2U/5zyI=\", false, function () {\n return [react_router_dom__WEBPACK_IMPORTED_MODULE_5__.useParams, react_router_dom__WEBPACK_IMPORTED_MODULE_5__.useNavigate];\n});\n_c = NoteDetails;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NoteDetails);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"NoteDetails\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Note/NoteDetails.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Note/NoteModal.tsx":
+/*!************************************************!*\
+ !*** ./frontend/components/Note/NoteModal.tsx ***!
+ \************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Shared/ToastContext */ \"./frontend/components/Shared/ToastContext.tsx\");\n/* harmony import */ var _Tag_TagInput__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Tag/TagInput */ \"./frontend/components/Tag/TagInput.tsx\");\n/* harmony import */ var _Shared_MarkdownRenderer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Shared/MarkdownRenderer */ \"./frontend/components/Shared/MarkdownRenderer.tsx\");\n/* harmony import */ var _utils_tagsService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils/tagsService */ \"./frontend/utils/tagsService.ts\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/PencilIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/EyeIcon.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\n\nvar NoteModal = function NoteModal(_ref) {\n _s();\n var _note$tags;\n var isOpen = _ref.isOpen,\n onClose = _ref.onClose,\n note = _ref.note,\n onSave = _ref.onSave;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_5__.useTranslation)(),\n t = _useTranslation.t;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n id: (note === null || note === void 0 ? void 0 : note.id) || 0,\n title: (note === null || note === void 0 ? void 0 : note.title) || '',\n content: (note === null || note === void 0 ? void 0 : note.content) || '',\n tags: (note === null || note === void 0 ? void 0 : note.tags) || []\n }),\n _useState2 = _slicedToArray(_useState, 2),\n formData = _useState2[0],\n setFormData = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)((note === null || note === void 0 || (_note$tags = note.tags) === null || _note$tags === void 0 ? void 0 : _note$tags.map(function (tag) {\n return tag.name;\n })) || []),\n _useState4 = _slicedToArray(_useState3, 2),\n tags = _useState4[0],\n setTags = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState6 = _slicedToArray(_useState5, 2),\n availableTags = _useState6[0],\n setAvailableTags = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState8 = _slicedToArray(_useState7, 2),\n error = _useState8[0],\n setError = _useState8[1];\n var modalRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState0 = _slicedToArray(_useState9, 2),\n isSubmitting = _useState0[0],\n setIsSubmitting = _useState0[1];\n var _useState1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState10 = _slicedToArray(_useState1, 2),\n isClosing = _useState10[0],\n setIsClosing = _useState10[1];\n var _useState11 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('edit'),\n _useState12 = _slicedToArray(_useState11, 2),\n activeTab = _useState12[0],\n setActiveTab = _useState12[1];\n var _useToast = (0,_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_1__.useToast)(),\n showSuccessToast = _useToast.showSuccessToast,\n showErrorToast = _useToast.showErrorToast;\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var loadTags = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var data, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n _context.p = 0;\n _context.n = 1;\n return (0,_utils_tagsService__WEBPACK_IMPORTED_MODULE_4__.fetchTags)();\n case 1:\n data = _context.v;\n setAvailableTags(data);\n _context.n = 3;\n break;\n case 2:\n _context.p = 2;\n _t = _context.v;\n console.error('Failed to fetch tags', _t);\n showErrorToast(t('errors.failedToLoadTags'));\n case 3:\n return _context.a(2);\n }\n }, _callee, null, [[0, 2]]);\n }));\n return function loadTags() {\n return _ref2.apply(this, arguments);\n };\n }();\n if (isOpen) {\n loadTags();\n }\n }, [isOpen, showErrorToast]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (isOpen) {\n var _note$tags2;\n // Extract tag names for display\n var tagNames = (note === null || note === void 0 || (_note$tags2 = note.tags) === null || _note$tags2 === void 0 ? void 0 : _note$tags2.map(function (tag) {\n return tag.name;\n })) || [];\n setFormData({\n id: (note === null || note === void 0 ? void 0 : note.id) || 0,\n title: (note === null || note === void 0 ? void 0 : note.title) || '',\n content: (note === null || note === void 0 ? void 0 : note.content) || '',\n tags: (note === null || note === void 0 ? void 0 : note.tags) || []\n });\n setTags(tagNames);\n setError(null);\n }\n }, [isOpen, note]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var handleClickOutside = function handleClickOutside(event) {\n if (modalRef.current && !modalRef.current.contains(event.target)) {\n handleClose();\n }\n };\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n return function () {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var handleKeyDown = function handleKeyDown(event) {\n if (event.key === 'Escape') {\n handleClose();\n }\n };\n if (isOpen) {\n document.addEventListener('keydown', handleKeyDown);\n }\n return function () {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [isOpen]);\n var handleChange = function handleChange(e) {\n var _e$target = e.target,\n name = _e$target.name,\n value = _e$target.value;\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, name, value));\n });\n };\n var handleTagsChange = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (newTags) {\n setTags(newTags);\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, {\n tags: newTags.map(function (name) {\n return {\n name: name\n };\n })\n });\n });\n }, []);\n var handleSubmit = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {\n var noteTags, finalFormData, _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n if (formData.title.trim()) {\n _context2.n = 1;\n break;\n }\n setError(t('errors.noteTitleRequired'));\n return _context2.a(2);\n case 1:\n setIsSubmitting(true);\n setError(null);\n _context2.p = 2;\n // Convert string tags to tag objects\n noteTags = tags.map(function (tagName) {\n return {\n name: tagName\n };\n }); // Create final form data with the tags\n finalFormData = _objectSpread(_objectSpread({}, formData), {}, {\n tags: noteTags\n });\n _context2.n = 3;\n return onSave(finalFormData);\n case 3:\n showSuccessToast(formData.id && formData.id !== 0 ? t('success.noteUpdated') : t('success.noteCreated'));\n handleClose();\n _context2.n = 5;\n break;\n case 4:\n _context2.p = 4;\n _t2 = _context2.v;\n setError(_t2.message);\n showErrorToast(t('errors.failedToSaveNote'));\n case 5:\n _context2.p = 5;\n setIsSubmitting(false);\n return _context2.f(5);\n case 6:\n return _context2.a(2);\n }\n }, _callee2, null, [[2, 4, 5, 6]]);\n }));\n return function handleSubmit() {\n return _ref3.apply(this, arguments);\n };\n }();\n var handleClose = function handleClose() {\n setIsClosing(true);\n setTimeout(function () {\n onClose();\n setIsClosing(false);\n }, 300);\n };\n if (!isOpen) return null;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"fixed top-16 left-0 right-0 bottom-0 flex items-start sm:items-center justify-center bg-gray-900 bg-opacity-80 z-40 transition-opacity duration-300 \".concat(isClosing ? 'opacity-0' : 'opacity-100')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n ref: modalRef,\n className: \"bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-800 sm:rounded-lg sm:shadow-2xl w-full sm:max-w-2xl overflow-hidden transform transition-transform duration-300 \".concat(isClosing ? 'scale-95' : 'scale-100', \" h-screen sm:h-auto flex flex-col\"),\n style: {\n maxHeight: 'calc(100vh - 4rem)'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"form\", {\n className: \"flex flex-col flex-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"fieldset\", {\n className: \"flex flex-col flex-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-4 space-y-3 flex-1 text-sm overflow-y-auto\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"py-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n id: \"noteTitle\",\n name: \"title\",\n value: formData.title,\n onChange: handleChange,\n required: true,\n className: \"block w-full text-xl font-semibold dark:bg-gray-800 text-black dark:text-white border-b-2 border-gray-200 dark:border-gray-900 focus:outline-none shadow-sm py-2\",\n placeholder: t('forms.noteTitlePlaceholder')\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"pb-3\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-xs font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('forms.tags'), \" \", tags.length > 0 ? \"(\".concat(tags.join(', '), \")\") : ''), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-full\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Tag_TagInput__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n onTagsChange: handleTagsChange,\n initialTags: tags,\n availableTags: availableTags\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"pb-3 flex-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between mb-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-xs font-medium text-gray-700 dark:text-gray-300\"\n }, t('forms.noteContent'), \" \", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-gray-500\"\n }, \"(Markdown supported)\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex space-x-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: function onClick() {\n return setActiveTab('edit');\n },\n className: \"px-3 py-1 text-xs rounded-md flex items-center space-x-1 transition-colors \".concat(activeTab === 'edit' ? 'bg-blue-600 text-white' : 'bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300 hover:bg-gray-300 dark:hover:bg-gray-600')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n className: \"h-3 w-3\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, \"Edit\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: function onClick() {\n return setActiveTab('preview');\n },\n className: \"px-3 py-1 text-xs rounded-md flex items-center space-x-1 transition-colors \".concat(activeTab === 'preview' ? 'bg-blue-600 text-white' : 'bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300 hover:bg-gray-300 dark:hover:bg-gray-600')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n className: \"h-3 w-3\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, \"Preview\")))), activeTab === 'edit' ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"textarea\", {\n id: \"noteContent\",\n name: \"content\",\n value: formData.content,\n onChange: handleChange,\n rows: 20,\n className: \"block w-full h-full rounded-md shadow-sm p-3 text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 transition duration-150 ease-in-out\",\n placeholder: \"Write your content using Markdown formatting... Examples:\\n# Heading\\n**Bold text**\\n*Italic text*\\n- List item\\n```code```\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"block w-full h-full rounded-md shadow-sm p-3 text-sm bg-gray-50 dark:bg-gray-800 overflow-y-auto\"\n }, formData.content ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Shared_MarkdownRenderer__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n content: formData.content\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-gray-500 dark:text-gray-400 italic\"\n }, \"No content to preview. Switch to Edit tab to add content.\"))), error && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-red-500\"\n }, error)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-3 flex-shrink-0 border-t border-gray-200 dark:border-gray-700 flex justify-end space-x-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: handleClose,\n className: \"px-4 py-2 text-md bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-200 rounded-md hover:bg-gray-300 dark:hover:bg-gray-600 focus:outline-none transition duration-150 ease-in-out\"\n }, t('common.cancel')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: handleSubmit,\n disabled: isSubmitting,\n className: \"px-4 py-2 text-md bg-blue-600 text-white rounded-md hover:bg-blue-700 dark:bg-blue-500 dark:hover:bg-blue-600 focus:outline-none transition duration-150 ease-in-out \".concat(isSubmitting ? 'opacity-50 cursor-not-allowed' : '')\n }, isSubmitting ? t('modals.submitting') : formData.id && formData.id !== 0 ? t('modals.updateNote') : t('modals.createNote')))))));\n};\n_s(NoteModal, \"9v/kLoEYIFZkQKS9J7IzQZMfYA4=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_5__.useTranslation, _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_1__.useToast];\n});\n_c = NoteModal;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NoteModal);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"NoteModal\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Note/NoteModal.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Notes.tsx":
+/*!***************************************!*\
+ !*** ./frontend/components/Notes.tsx ***!
+ \***************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/dist/index.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/dist/index.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/BookOpenIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/MagnifyingGlassIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/TagIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/PencilSquareIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/TrashIcon.js\");\n/* harmony import */ var _Note_NoteModal__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Note/NoteModal */ \"./frontend/components/Note/NoteModal.tsx\");\n/* harmony import */ var _Shared_ConfirmDialog__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Shared/ConfirmDialog */ \"./frontend/components/Shared/ConfirmDialog.tsx\");\n/* harmony import */ var _utils_notesService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/notesService */ \"./frontend/utils/notesService.ts\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\n\nvar Notes = function Notes() {\n _s();\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_5__.useNavigate)();\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState2 = _slicedToArray(_useState, 2),\n notes = _useState2[0],\n setNotes = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState4 = _slicedToArray(_useState3, 2),\n selectedNote = _useState4[0],\n setSelectedNote = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState6 = _slicedToArray(_useState5, 2),\n isNoteModalOpen = _useState6[0],\n setIsNoteModalOpen = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState8 = _slicedToArray(_useState7, 2),\n isConfirmDialogOpen = _useState8[0],\n setIsConfirmDialogOpen = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState0 = _slicedToArray(_useState9, 2),\n noteToDelete = _useState0[0],\n setNoteToDelete = _useState0[1];\n var _useState1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(''),\n _useState10 = _slicedToArray(_useState1, 2),\n searchQuery = _useState10[0],\n setSearchQuery = _useState10[1];\n var _useState11 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true),\n _useState12 = _slicedToArray(_useState11, 2),\n isLoading = _useState12[0],\n setIsLoading = _useState12[1];\n var _useState13 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState14 = _slicedToArray(_useState13, 2),\n isError = _useState14[0],\n setIsError = _useState14[1];\n var _useState15 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState16 = _slicedToArray(_useState15, 2),\n hoveredNoteId = _useState16[0],\n setHoveredNoteId = _useState16[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var loadNotes = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var fetchedNotes, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n setIsLoading(true);\n _context.p = 1;\n _context.n = 2;\n return (0,_utils_notesService__WEBPACK_IMPORTED_MODULE_4__.fetchNotes)();\n case 2:\n fetchedNotes = _context.v;\n setNotes(fetchedNotes);\n _context.n = 4;\n break;\n case 3:\n _context.p = 3;\n _t = _context.v;\n console.error('Error loading notes:', _t);\n setIsError(true);\n case 4:\n _context.p = 4;\n setIsLoading(false);\n return _context.f(4);\n case 5:\n return _context.a(2);\n }\n }, _callee, null, [[1, 3, 4, 5]]);\n }));\n return function loadNotes() {\n return _ref.apply(this, arguments);\n };\n }();\n loadNotes();\n }, []);\n var handleDeleteNote = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {\n var _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n if (noteToDelete) {\n _context2.n = 1;\n break;\n }\n return _context2.a(2);\n case 1:\n _context2.p = 1;\n _context2.n = 2;\n return (0,_utils_notesService__WEBPACK_IMPORTED_MODULE_4__.deleteNote)(noteToDelete.id);\n case 2:\n setNotes(function (prev) {\n return prev.filter(function (note) {\n return note.id !== noteToDelete.id;\n });\n });\n setIsConfirmDialogOpen(false);\n setNoteToDelete(null);\n _context2.n = 4;\n break;\n case 3:\n _context2.p = 3;\n _t2 = _context2.v;\n console.error('Error deleting note:', _t2);\n case 4:\n return _context2.a(2);\n }\n }, _callee2, null, [[1, 3]]);\n }));\n return function handleDeleteNote() {\n return _ref2.apply(this, arguments);\n };\n }();\n var handleEditNote = function handleEditNote(note) {\n setSelectedNote(note);\n setIsNoteModalOpen(true);\n };\n var handleSaveNote = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(noteData) {\n var updatedNotes, savedNote, newNote, _t3;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n _context3.p = 0;\n if (!noteData.id) {\n _context3.n = 2;\n break;\n }\n _context3.n = 1;\n return (0,_utils_notesService__WEBPACK_IMPORTED_MODULE_4__.updateNote)(noteData.id, noteData);\n case 1:\n savedNote = _context3.v;\n updatedNotes = notes.map(function (note) {\n return note.id === noteData.id ? savedNote : note;\n });\n _context3.n = 4;\n break;\n case 2:\n _context3.n = 3;\n return (0,_utils_notesService__WEBPACK_IMPORTED_MODULE_4__.createNote)(noteData);\n case 3:\n newNote = _context3.v;\n updatedNotes = [].concat(_toConsumableArray(notes), [newNote]);\n case 4:\n setNotes(updatedNotes);\n setIsNoteModalOpen(false);\n setSelectedNote(null);\n _context3.n = 6;\n break;\n case 5:\n _context3.p = 5;\n _t3 = _context3.v;\n console.error('Error saving note:', _t3);\n case 6:\n return _context3.a(2);\n }\n }, _callee3, null, [[0, 5]]);\n }));\n return function handleSaveNote(_x) {\n return _ref3.apply(this, arguments);\n };\n }();\n var filteredNotes = notes.filter(function (note) {\n return note.title.toLowerCase().includes(searchQuery.toLowerCase()) || note.content.toLowerCase().includes(searchQuery.toLowerCase());\n });\n if (isLoading) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-center h-screen bg-gray-100 dark:bg-gray-900\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-xl font-semibold text-gray-700 dark:text-gray-200\"\n }, t('notes.loading')));\n }\n if (isError) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-center h-screen bg-gray-100 dark:bg-gray-900\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-red-500 text-lg\"\n }, t('notes.error')));\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex justify-center px-4 lg:px-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-full max-w-5xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between mb-8\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n className: \"h-6 w-6 mr-2 text-gray-900 dark:text-white\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h2\", {\n className: \"text-2xl font-light text-gray-900 dark:text-white\"\n }, t('notes.title')))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm p-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n className: \"h-5 w-5 text-gray-500 dark:text-gray-400 mr-2\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n placeholder: t('notes.searchPlaceholder'),\n value: searchQuery,\n onChange: function onChange(e) {\n return setSearchQuery(e.target.value);\n },\n className: \"w-full bg-transparent border-none focus:ring-0 focus:outline-none dark:text-white\"\n }))), filteredNotes.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-gray-700 dark:text-gray-300\"\n }, t('notes.noNotesFound')) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"ul\", {\n className: \"space-y-1\"\n }, filteredNotes.map(function (note) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"li\", {\n key: note.id,\n className: \"bg-white dark:bg-gray-900 shadow rounded-lg px-4 py-3 flex justify-between items-center\",\n onMouseEnter: function onMouseEnter() {\n return setHoveredNoteId(note.id || null);\n },\n onMouseLeave: function onMouseLeave() {\n return setHoveredNoteId(null);\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex-grow overflow-hidden pr-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center flex-wrap gap-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_8__.Link, {\n to: \"/note/\".concat(note.id),\n className: \"text-md font-semibold text-gray-900 dark:text-gray-100 hover:underline\"\n }, note.title), (note.tags && note.tags.length > 0 || note.Tags && note.Tags.length > 0) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, (note.tags || note.Tags || []).map(function (tag) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n key: tag.id,\n onClick: function onClick(e) {\n e.preventDefault();\n navigate(\"/tag/\".concat(tag.id));\n },\n className: \"flex items-center space-x-1 px-2 py-0.5 bg-gray-100 dark:bg-gray-700 rounded text-xs cursor-pointer hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n className: \"h-3 w-3 text-gray-500 dark:text-gray-300\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-gray-700 dark:text-gray-300\"\n }, tag.name));\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex space-x-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return handleEditNote(note);\n },\n className: \"text-gray-500 hover:text-blue-700 dark:hover:text-blue-300 focus:outline-none transition-opacity \".concat(hoveredNoteId === note.id ? 'opacity-100' : 'opacity-0'),\n \"aria-label\": t('notes.editNoteAriaLabel', {\n noteTitle: note.title\n }),\n title: t('notes.editNoteTitle', {\n noteTitle: note.title\n })\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n className: \"h-5 w-5\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n setNoteToDelete(note);\n setIsConfirmDialogOpen(true);\n },\n className: \"text-gray-500 hover:text-red-700 dark:hover:text-red-300 focus:outline-none transition-opacity \".concat(hoveredNoteId === note.id ? 'opacity-100' : 'opacity-0'),\n \"aria-label\": t('notes.deleteNoteAriaLabel', {\n noteTitle: note.title\n }),\n title: t('notes.deleteNoteTitle', {\n noteTitle: note.title\n })\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n className: \"h-5 w-5\"\n }))));\n })), isNoteModalOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Note_NoteModal__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n isOpen: isNoteModalOpen,\n onClose: function onClose() {\n return setIsNoteModalOpen(false);\n },\n onSave: handleSaveNote,\n note: selectedNote\n }), isConfirmDialogOpen && noteToDelete && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Shared_ConfirmDialog__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n title: t('modals.deleteNote.title'),\n message: t('modals.deleteNote.message', {\n noteTitle: noteToDelete.title\n }),\n onConfirm: handleDeleteNote,\n onCancel: function onCancel() {\n return setIsConfirmDialogOpen(false);\n }\n })));\n};\n_s(Notes, \"BMW6ZxYgLLkIcPmmxwxtCmF/lVQ=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation, react_router_dom__WEBPACK_IMPORTED_MODULE_5__.useNavigate];\n});\n_c = Notes;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Notes);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"Notes\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Notes.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Productivity/ProductivityAssistant.tsx":
+/*!********************************************************************!*\
+ !*** ./frontend/components/Productivity/ProductivityAssistant.tsx ***!
+ \********************************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/dist/index.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/FolderIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ExclamationTriangleIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/AcademicCapIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ClockIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ChevronDownIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ChevronRightIcon.js\");\n/* harmony import */ var _Task_TaskModal__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Task/TaskModal */ \"./frontend/components/Task/TaskModal.tsx\");\n/* harmony import */ var _utils_tasksService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/tasksService */ \"./frontend/utils/tasksService.ts\");\n/* harmony import */ var _utils_projectsService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils/projectsService */ \"./frontend/utils/projectsService.ts\");\n/* harmony import */ var _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Shared/ToastContext */ \"./frontend/components/Shared/ToastContext.tsx\");\n/* harmony import */ var _utils_taskIntelligenceService__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../utils/taskIntelligenceService */ \"./frontend/utils/taskIntelligenceService.ts\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\n\n\n\nvar ProductivityAssistant = function ProductivityAssistant(_ref) {\n _s();\n var tasks = _ref.tasks,\n projects = _ref.projects;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_7__.useNavigate)();\n var _useToast = (0,_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_5__.useToast)(),\n showSuccessToast = _useToast.showSuccessToast,\n showErrorToast = _useToast.showErrorToast;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState2 = _slicedToArray(_useState, 2),\n isExpanded = _useState2[0],\n setIsExpanded = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState4 = _slicedToArray(_useState3, 2),\n insights = _useState4[0],\n setInsights = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(new Set()),\n _useState6 = _slicedToArray(_useState5, 2),\n expandedInsights = _useState6[0],\n setExpandedInsights = _useState6[1];\n\n // Modal states\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState8 = _slicedToArray(_useState7, 2),\n isTaskModalOpen = _useState8[0],\n setIsTaskModalOpen = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState0 = _slicedToArray(_useState9, 2),\n selectedTask = _useState0[0],\n setSelectedTask = _useState0[1];\n var _useState1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(projects),\n _useState10 = _slicedToArray(_useState1, 2),\n allProjects = _useState10[0],\n setAllProjects = _useState10[1];\n var _useState11 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState12 = _slicedToArray(_useState11, 2),\n loading = _useState12[0],\n setLoading = _useState12[1];\n var PROJECT_VERBS = ['plan', 'organize', 'set up', 'setup', 'fix', 'review', 'implement', 'create', 'build', 'develop'];\n var OVERDUE_THRESHOLD_DAYS = 30;\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var generateInsights = function generateInsights() {\n var newInsights = [];\n\n // Filter to only include non-completed tasks\n var activeTasks = tasks.filter(function (task) {\n return task.status !== 'done' && task.status !== 'archived';\n });\n\n // 1. Stalled Projects (no tasks/actions)\n var stalledProjects = projects.filter(function (project) {\n return project.active && !activeTasks.some(function (task) {\n return task.project_id === project.id;\n });\n });\n if (stalledProjects.length > 0) {\n newInsights.push({\n type: 'stalled_projects',\n title: t('productivity.stalledProjects', 'Stalled Projects'),\n description: t('productivity.stalledProjectsDesc', 'These projects have no tasks or actions'),\n items: stalledProjects,\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_8__[\"default\"],\n color: 'text-red-500'\n });\n }\n\n // 2. Projects with completed tasks but no next action\n var projectsNeedingNextAction = projects.filter(function (project) {\n var projectTasks = tasks.filter(function (task) {\n return task.project_id === project.id;\n });\n var hasCompletedTasks = projectTasks.some(function (task) {\n return task.status === 'done' || task.status === 'archived';\n });\n var hasNextAction = activeTasks.some(function (task) {\n return task.project_id === project.id && (task.status === 'not_started' || task.status === 'in_progress');\n });\n return project.active && hasCompletedTasks && !hasNextAction;\n });\n if (projectsNeedingNextAction.length > 0) {\n newInsights.push({\n type: 'completed_no_next',\n title: t('productivity.needsNextAction', 'Projects Need Next Action'),\n description: t('productivity.needsNextActionDesc', 'These projects have completed tasks but no next action'),\n items: projectsNeedingNextAction,\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_9__[\"default\"],\n color: 'text-yellow-500'\n });\n }\n\n // 3. Tasks that are actually projects\n var tasksAreProjects = activeTasks.filter(function (task) {\n var taskName = task.name.toLowerCase();\n return PROJECT_VERBS.some(function (verb) {\n return taskName.includes(verb);\n }) && taskName.length > 30; // Longer tasks are more likely to be projects\n });\n if (tasksAreProjects.length > 0) {\n newInsights.push({\n type: 'tasks_are_projects',\n title: t('productivity.tasksAreProjects', 'Tasks That Look Like Projects'),\n description: t('productivity.tasksAreProjectsDesc', 'These tasks might need to be broken down'),\n items: tasksAreProjects,\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_10__[\"default\"],\n color: 'text-blue-500'\n });\n }\n\n // 4. Tasks without clear verbs\n var vagueTasks = (0,_utils_taskIntelligenceService__WEBPACK_IMPORTED_MODULE_6__.getVagueTasks)(activeTasks);\n if (vagueTasks.length > 0) {\n newInsights.push({\n type: 'vague_tasks',\n title: t('productivity.vagueTasks', 'Tasks Without Clear Action'),\n description: t('productivity.vagueTasksDesc', 'These tasks need clearer action verbs'),\n items: vagueTasks,\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_9__[\"default\"],\n color: 'text-orange-500'\n });\n }\n\n // 5. Overdue or stale tasks\n var now = new Date();\n var thresholdDate = new Date(now.getTime() - OVERDUE_THRESHOLD_DAYS * 24 * 60 * 60 * 1000);\n var staleTasks = activeTasks.filter(function (task) {\n // Only use created_at since updated_at doesn't exist in the interface\n var taskDate = task.created_at ? new Date(task.created_at) : null;\n return taskDate && taskDate < thresholdDate;\n });\n if (staleTasks.length > 0) {\n newInsights.push({\n type: 'overdue_tasks',\n title: t('productivity.staleTasks', 'Stale Tasks'),\n description: t('productivity.staleTasksDesc', 'Tasks not updated in {{days}} days', {\n days: OVERDUE_THRESHOLD_DAYS\n }),\n items: staleTasks,\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_11__[\"default\"],\n color: 'text-gray-500'\n });\n }\n\n // 6. Stuck projects (not updated in a month)\n var stuckProjects = projects.filter(function (project) {\n if (!project.active) return false;\n\n // Projects don't have date fields in the interface, so we'll check if they have recent tasks\n var projectTasks = activeTasks.filter(function (task) {\n return task.project_id === project.id;\n });\n if (projectTasks.length === 0) return false; // Empty projects are handled by \"stalled projects\"\n\n // Find the most recent task date for this project\n var mostRecentTaskDate = projectTasks.reduce(function (latest, task) {\n var taskDate = task.created_at ? new Date(task.created_at) : null;\n if (!taskDate) return latest;\n return !latest || taskDate > latest ? taskDate : latest;\n }, null);\n return mostRecentTaskDate && mostRecentTaskDate < thresholdDate;\n });\n if (stuckProjects.length > 0) {\n newInsights.push({\n type: 'stuck_projects',\n title: t('productivity.stuckProjects', 'Stuck Projects'),\n description: t('productivity.stuckProjectsDesc', 'Projects not updated recently'),\n items: stuckProjects,\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_8__[\"default\"],\n color: 'text-purple-500'\n });\n }\n setInsights(newInsights);\n };\n generateInsights();\n }, [tasks, projects, t]);\n var totalIssues = insights.reduce(function (sum, insight) {\n return sum + insight.items.length;\n }, 0);\n var toggleInsightExpansion = function toggleInsightExpansion(index) {\n var newExpanded = new Set(expandedInsights);\n if (newExpanded.has(index)) {\n newExpanded[\"delete\"](index);\n } else {\n newExpanded.add(index);\n }\n setExpandedInsights(newExpanded);\n };\n var handleItemClick = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(item) {\n var isTask, fullTask, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n isTask = 'status' in item;\n if (!isTask) {\n _context.n = 6;\n break;\n }\n _context.p = 1;\n setLoading(true);\n _context.n = 2;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_3__.fetchTaskById)(item.id);\n case 2:\n fullTask = _context.v;\n setSelectedTask(fullTask);\n setIsTaskModalOpen(true);\n _context.n = 4;\n break;\n case 3:\n _context.p = 3;\n _t = _context.v;\n console.error('Failed to fetch task:', _t);\n showErrorToast(t('errors.failedToLoadTask', 'Failed to load task'));\n case 4:\n _context.p = 4;\n setLoading(false);\n return _context.f(4);\n case 5:\n _context.n = 7;\n break;\n case 6:\n // Handle project click - navigate to project page\n navigate(\"/project/\".concat(item.id));\n case 7:\n return _context.a(2);\n }\n }, _callee, null, [[1, 3, 4, 5]]);\n }));\n return function handleItemClick(_x) {\n return _ref2.apply(this, arguments);\n };\n }();\n var handleTaskSave = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(updatedTask) {\n var _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n _context2.p = 0;\n if (!updatedTask.id) {\n _context2.n = 2;\n break;\n }\n _context2.n = 1;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_3__.updateTask)(updatedTask.id, updatedTask);\n case 1:\n setIsTaskModalOpen(false);\n setSelectedTask(null);\n showSuccessToast(t('task.updateSuccess', 'Task updated successfully'));\n // Optionally refresh the parent component data\n case 2:\n _context2.n = 4;\n break;\n case 3:\n _context2.p = 3;\n _t2 = _context2.v;\n console.error('Failed to update task:', _t2);\n showErrorToast(t('task.updateError', 'Failed to update task'));\n case 4:\n return _context2.a(2);\n }\n }, _callee2, null, [[0, 3]]);\n }));\n return function handleTaskSave(_x2) {\n return _ref3.apply(this, arguments);\n };\n }();\n var handleTaskDelete = /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {\n var _t3;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n _context3.p = 0;\n if (!(selectedTask !== null && selectedTask !== void 0 && selectedTask.id)) {\n _context3.n = 2;\n break;\n }\n _context3.n = 1;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_3__.deleteTask)(selectedTask.id);\n case 1:\n setIsTaskModalOpen(false);\n setSelectedTask(null);\n showSuccessToast(t('task.deleteSuccess', 'Task deleted successfully'));\n // Optionally refresh the parent component data\n case 2:\n _context3.n = 4;\n break;\n case 3:\n _context3.p = 3;\n _t3 = _context3.v;\n console.error('Failed to delete task:', _t3);\n showErrorToast(t('task.deleteError', 'Failed to delete task'));\n case 4:\n return _context3.a(2);\n }\n }, _callee3, null, [[0, 3]]);\n }));\n return function handleTaskDelete() {\n return _ref4.apply(this, arguments);\n };\n }();\n var handleCreateProject = /*#__PURE__*/function () {\n var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(name) {\n var project, _t4;\n return _regenerator().w(function (_context4) {\n while (1) switch (_context4.n) {\n case 0:\n _context4.p = 0;\n _context4.n = 1;\n return (0,_utils_projectsService__WEBPACK_IMPORTED_MODULE_4__.createProject)({\n name: name,\n active: true\n });\n case 1:\n project = _context4.v;\n setAllProjects(function (prev) {\n return [].concat(_toConsumableArray(prev), [project]);\n });\n return _context4.a(2, project);\n case 2:\n _context4.p = 2;\n _t4 = _context4.v;\n console.error('Failed to create project:', _t4);\n throw _t4;\n case 3:\n return _context4.a(2);\n }\n }, _callee4, null, [[0, 2]]);\n }));\n return function handleCreateProject(_x3) {\n return _ref5.apply(this, arguments);\n };\n }();\n\n // Load projects when component mounts\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var loadProjects = /*#__PURE__*/function () {\n var _ref6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5() {\n var projectsData, _t5;\n return _regenerator().w(function (_context5) {\n while (1) switch (_context5.n) {\n case 0:\n _context5.p = 0;\n _context5.n = 1;\n return (0,_utils_projectsService__WEBPACK_IMPORTED_MODULE_4__.fetchProjects)();\n case 1:\n projectsData = _context5.v;\n setAllProjects(Array.isArray(projectsData) ? projectsData : []);\n _context5.n = 3;\n break;\n case 2:\n _context5.p = 2;\n _t5 = _context5.v;\n console.error('Failed to load projects:', _t5);\n case 3:\n return _context5.a(2);\n }\n }, _callee5, null, [[0, 2]]);\n }));\n return function loadProjects() {\n return _ref6.apply(this, arguments);\n };\n }();\n if (projects.length === 0) {\n loadProjects();\n } else {\n setAllProjects(projects);\n }\n }, [projects]);\n if (totalIssues === 0) {\n return null;\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-2 p-4 bg-white dark:bg-gray-900 border-l-4 border-yellow-500 rounded-lg shadow\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return setIsExpanded(!isExpanded);\n },\n className: \"flex items-center w-full\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n className: \"h-6 w-6 text-yellow-500 dark:text-yellow-400 mr-3\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex-1 text-left\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-gray-700 dark:text-gray-300 font-medium\"\n }, t('productivity.issuesFound', 'Found {{count}} productivity issue(s) that need attention', {\n count: totalIssues\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-yellow-600 dark:text-yellow-400 text-sm\"\n }, t('productivity.reviewItems', 'Click to review and improve your workflow'))), isExpanded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n className: \"h-5 w-5 text-yellow-500\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n className: \"h-5 w-5 text-yellow-500\"\n })), isExpanded && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mt-4 pt-4 border-t border-gray-200 dark:border-gray-700\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"space-y-4\"\n }, insights.map(function (insight, index) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: index,\n className: \"border-l-4 border-gray-200 dark:border-gray-600 pl-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-start space-x-3\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(insight.icon, {\n className: \"h-5 w-5 mt-0.5 \".concat(insight.color)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h4\", {\n className: \"font-medium text-gray-900 dark:text-gray-100\"\n }, insight.title, \" (\", insight.items.length, \")\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-sm text-gray-600 dark:text-gray-400 mb-2\"\n }, insight.description), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"space-y-1\"\n }, (expandedInsights.has(index) ? insight.items : insight.items.slice(0, 3)).map(function (item, itemIndex) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: itemIndex,\n className: \"text-sm\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return handleItemClick(item);\n },\n className: \"text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-300 underline text-left\",\n disabled: loading\n }, \"\\u2022 \", item.name));\n }), insight.items.length > 3 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return toggleInsightExpansion(index);\n },\n className: \"text-sm text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 underline cursor-pointer\"\n }, expandedInsights.has(index) ? '... show less' : \"... and \".concat(insight.items.length - 3, \" more items\"))))));\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mt-4 pt-4 border-t border-gray-200 dark:border-gray-700\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-xs text-gray-500 dark:text-gray-400\"\n }, t('productivity.suggestion', 'Click on any item above to open it and make improvements.')))), selectedTask && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Task_TaskModal__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n isOpen: isTaskModalOpen,\n onClose: function onClose() {\n setIsTaskModalOpen(false);\n setSelectedTask(null);\n },\n task: selectedTask,\n onSave: handleTaskSave,\n onDelete: handleTaskDelete,\n projects: allProjects,\n onCreateProject: handleCreateProject\n }));\n};\n_s(ProductivityAssistant, \"f/MwgZD54GHHQQM2mhaNBA4VC/c=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation, react_router_dom__WEBPACK_IMPORTED_MODULE_7__.useNavigate, _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_5__.useToast];\n});\n_c = ProductivityAssistant;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ProductivityAssistant);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"ProductivityAssistant\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Productivity/ProductivityAssistant.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Profile/ProfileSettings.tsx":
+/*!*********************************************************!*\
+ !*** ./frontend/components/Profile/ProfileSettings.tsx ***!
+ \*********************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/UserIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ClockIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ChatBubbleLeftRightIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ShieldCheckIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/LightBulbIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/InformationCircleIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/EyeSlashIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/EyeIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/CogIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ClipboardDocumentListIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/BoltIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ChevronRightIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ExclamationTriangleIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/FaceSmileIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/CheckIcon.js\");\n/* harmony import */ var _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Shared/ToastContext */ \"./frontend/components/Shared/ToastContext.tsx\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\nvar formatFrequency = function formatFrequency(frequency) {\n if (frequency.endsWith('h')) {\n var value = frequency.replace('h', '');\n return \"\".concat(value, \" \").concat(parseInt(value) === 1 ? 'hour' : 'hours');\n } else if (frequency === 'daily') {\n return '1 day';\n } else if (frequency === 'weekly') {\n return '1 week';\n } else if (frequency === 'weekdays') {\n return 'Weekdays';\n }\n return frequency;\n};\nvar ProfileSettings = function ProfileSettings(_ref) {\n _s();\n var isDarkMode = _ref.isDarkMode,\n toggleDarkMode = _ref.toggleDarkMode;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t,\n i18n = _useTranslation.i18n;\n var _useToast = (0,_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_2__.useToast)(),\n showSuccessToast = _useToast.showSuccessToast,\n showErrorToast = _useToast.showErrorToast;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('general'),\n _useState2 = _slicedToArray(_useState, 2),\n activeTab = _useState2[0],\n setActiveTab = _useState2[1];\n\n // Password visibility state\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState4 = _slicedToArray(_useState3, 2),\n showCurrentPassword = _useState4[0],\n setShowCurrentPassword = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState6 = _slicedToArray(_useState5, 2),\n showNewPassword = _useState6[0],\n setShowNewPassword = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState8 = _slicedToArray(_useState7, 2),\n showConfirmPassword = _useState8[0],\n setShowConfirmPassword = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState0 = _slicedToArray(_useState9, 2),\n profile = _useState0[0],\n setProfile = _useState0[1];\n var _useState1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n appearance: isDarkMode ? 'dark' : 'light',\n language: 'en',\n timezone: 'UTC',\n avatar_image: '',\n telegram_bot_token: '',\n task_intelligence_enabled: true,\n task_summary_enabled: false,\n task_summary_frequency: 'daily',\n auto_suggest_next_actions_enabled: true,\n productivity_assistant_enabled: true,\n next_task_suggestion_enabled: true,\n pomodoro_enabled: true,\n currentPassword: '',\n newPassword: '',\n confirmPassword: ''\n }),\n _useState10 = _slicedToArray(_useState1, 2),\n formData = _useState10[0],\n setFormData = _useState10[1];\n var _useState11 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true),\n _useState12 = _slicedToArray(_useState11, 2),\n loading = _useState12[0],\n setLoading = _useState12[1];\n var _useState13 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0),\n _useState14 = _slicedToArray(_useState13, 2),\n updateKey = _useState14[0],\n setUpdateKey = _useState14[1];\n var _useState15 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState16 = _slicedToArray(_useState15, 2),\n isChangingLanguage = _useState16[0],\n setIsChangingLanguage = _useState16[1];\n var _useState17 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState18 = _slicedToArray(_useState17, 2),\n isPolling = _useState18[0],\n setIsPolling = _useState18[1];\n var _useState19 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('idle'),\n _useState20 = _slicedToArray(_useState19, 2),\n telegramSetupStatus = _useState20[0],\n setTelegramSetupStatus = _useState20[1];\n var _useState21 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState22 = _slicedToArray(_useState21, 2),\n telegramBotInfo = _useState22[0],\n setTelegramBotInfo = _useState22[1];\n var forceUpdate = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () {\n setUpdateKey(function (prevKey) {\n return prevKey + 1;\n });\n }, []);\n\n // Password validation\n var validatePasswordForm = function validatePasswordForm() {\n var errors = {};\n\n // Only validate if user is trying to change password\n if (formData.currentPassword || formData.newPassword || formData.confirmPassword) {\n if (!formData.currentPassword) {\n errors.currentPassword = t('profile.currentPasswordRequired', 'Current password is required');\n }\n if (!formData.newPassword) {\n errors.newPassword = t('profile.newPasswordRequired', 'New password is required');\n } else if (formData.newPassword.length < 6) {\n errors.newPassword = t('profile.passwordTooShort', 'Password must be at least 6 characters');\n }\n if (formData.newPassword !== formData.confirmPassword) {\n errors.confirmPassword = t('profile.passwordMismatch', 'Passwords do not match');\n }\n }\n return {\n valid: Object.keys(errors).length === 0,\n errors: errors\n };\n };\n var handleChange = function handleChange(e) {\n var _e$target = e.target,\n name = _e$target.name,\n value = _e$target.value;\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, name, value));\n });\n };\n var handleLanguageChange = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(value) {\n var resources, loadPath, response, data, _t, _t2;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n _context.p = 0;\n setIsChangingLanguage(true);\n _context.n = 1;\n return i18n.changeLanguage(value);\n case 1:\n document.documentElement.lang = value;\n resources = i18n.getResourceBundle(value, 'translation');\n if (!(!resources || Object.keys(resources).length === 0)) {\n _context.n = 7;\n break;\n }\n loadPath = \"/locales/\".concat(value, \"/translation.json\");\n _context.p = 2;\n _context.n = 3;\n return fetch(loadPath);\n case 3:\n response = _context.v;\n if (!response.ok) {\n _context.n = 5;\n break;\n }\n _context.n = 4;\n return response.json();\n case 4:\n data = _context.v;\n i18n.addResourceBundle(value, 'translation', data, true, true);\n if (window.forceLanguageReload) {\n window.forceLanguageReload(value);\n }\n case 5:\n _context.n = 7;\n break;\n case 6:\n _context.p = 6;\n _t = _context.v;\n case 7:\n setTimeout(function () {\n forceUpdate();\n var checkAndLoadResources = i18n.getResourceBundle(value, 'translation');\n if (!checkAndLoadResources || Object.keys(checkAndLoadResources).length === 0) {\n if (window.forceLanguageReload) {\n window.forceLanguageReload(value);\n }\n }\n setTimeout(function () {\n if (isChangingLanguage) {\n setIsChangingLanguage(false);\n }\n }, 800);\n }, 200);\n _context.n = 9;\n break;\n case 8:\n _context.p = 8;\n _t2 = _context.v;\n setIsChangingLanguage(false);\n case 9:\n return _context.a(2);\n }\n }, _callee, null, [[2, 6], [0, 8]]);\n }));\n return function handleLanguageChange(_x) {\n return _ref2.apply(this, arguments);\n };\n }();\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var fetchProfile = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {\n var response, data, _t3;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n _context2.p = 0;\n setLoading(true);\n _context2.n = 1;\n return fetch('/api/profile');\n case 1:\n response = _context2.v;\n if (response.ok) {\n _context2.n = 2;\n break;\n }\n throw new Error(t('profile.fetchError', 'Failed to fetch profile data.'));\n case 2:\n _context2.n = 3;\n return response.json();\n case 3:\n data = _context2.v;\n setProfile(data);\n setFormData({\n appearance: data.appearance || (isDarkMode ? 'dark' : 'light'),\n language: data.language || 'en',\n timezone: data.timezone || 'UTC',\n avatar_image: data.avatar_image || '',\n telegram_bot_token: data.telegram_bot_token || '',\n task_intelligence_enabled: data.task_intelligence_enabled !== undefined ? data.task_intelligence_enabled : true,\n task_summary_enabled: data.task_summary_enabled !== undefined ? data.task_summary_enabled : false,\n task_summary_frequency: data.task_summary_frequency || 'daily',\n auto_suggest_next_actions_enabled: data.auto_suggest_next_actions_enabled !== undefined ? data.auto_suggest_next_actions_enabled : true,\n productivity_assistant_enabled: data.productivity_assistant_enabled !== undefined ? data.productivity_assistant_enabled : true,\n next_task_suggestion_enabled: data.next_task_suggestion_enabled !== undefined ? data.next_task_suggestion_enabled : true,\n pomodoro_enabled: data.pomodoro_enabled !== undefined ? data.pomodoro_enabled : true\n });\n\n // Note: Task summary status checking functionality removed for now\n\n if (data.telegram_bot_token) {\n fetchPollingStatus();\n }\n _context2.n = 5;\n break;\n case 4:\n _context2.p = 4;\n _t3 = _context2.v;\n showErrorToast(_t3.message);\n case 5:\n _context2.p = 5;\n setLoading(false);\n return _context2.f(5);\n case 6:\n return _context2.a(2);\n }\n }, _callee2, null, [[0, 4, 5, 6]]);\n }));\n return function fetchProfile() {\n return _ref3.apply(this, arguments);\n };\n }();\n var fetchPollingStatus = /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {\n var response, data, _t4;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n _context3.p = 0;\n _context3.n = 1;\n return fetch('/api/telegram/polling-status');\n case 1:\n response = _context3.v;\n if (response.ok) {\n _context3.n = 2;\n break;\n }\n throw new Error(t('profile.pollingStatusError', 'Failed to fetch polling status.'));\n case 2:\n _context3.n = 3;\n return response.json();\n case 3:\n data = _context3.v;\n setIsPolling(data.running);\n if (data.token_exists && !data.running) {\n handleStartPolling();\n }\n _context3.n = 5;\n break;\n case 4:\n _context3.p = 4;\n _t4 = _context3.v;\n case 5:\n return _context3.a(2);\n }\n }, _callee3, null, [[0, 4]]);\n }));\n return function fetchPollingStatus() {\n return _ref4.apply(this, arguments);\n };\n }();\n fetchProfile();\n }, []);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {}, [updateKey, i18n.language]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, {\n appearance: isDarkMode ? 'dark' : 'light'\n });\n });\n }, [isDarkMode]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var handleLanguageChanged = function handleLanguageChanged() {\n forceUpdate();\n };\n var handleAppLanguageChanged = function handleAppLanguageChanged() {\n forceUpdate();\n setTimeout(function () {\n setIsChangingLanguage(false);\n }, 300);\n };\n i18n.on('languageChanged', handleLanguageChanged);\n window.addEventListener('app-language-changed', handleAppLanguageChanged);\n return function () {\n i18n.off('languageChanged', handleLanguageChanged);\n window.removeEventListener('app-language-changed', handleAppLanguageChanged);\n };\n }, []);\n var handleSetupTelegram = /*#__PURE__*/function () {\n var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {\n var _data$bot, response, _data, data, _data$bot$polling_sta, botUsername, _t5;\n return _regenerator().w(function (_context4) {\n while (1) switch (_context4.n) {\n case 0:\n setTelegramSetupStatus('loading');\n setTelegramBotInfo(null);\n _context4.p = 1;\n if (!(!formData.telegram_bot_token || !formData.telegram_bot_token.includes(':'))) {\n _context4.n = 2;\n break;\n }\n throw new Error(t('profile.invalidTelegramToken'));\n case 2:\n _context4.n = 3;\n return fetch('/api/telegram/setup', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n token: formData.telegram_bot_token\n })\n });\n case 3:\n response = _context4.v;\n if (response.ok) {\n _context4.n = 5;\n break;\n }\n _context4.n = 4;\n return response.json();\n case 4:\n _data = _context4.v;\n throw new Error(_data.error || t('profile.telegramSetupFailed'));\n case 5:\n _context4.n = 6;\n return response.json();\n case 6:\n data = _context4.v;\n setTelegramSetupStatus('success');\n showSuccessToast(t('profile.telegramSetupSuccess', 'Telegram bot configured successfully!'));\n if (data.bot) {\n setTelegramBotInfo(data.bot);\n setIsPolling(true);\n if (!((_data$bot$polling_sta = data.bot.polling_status) !== null && _data$bot$polling_sta !== void 0 && _data$bot$polling_sta.running)) {\n setTimeout(function () {\n handleStartPolling();\n }, 1000);\n }\n }\n botUsername = ((_data$bot = data.bot) === null || _data$bot === void 0 ? void 0 : _data$bot.username) || formData.telegram_bot_token.split(':')[0];\n window.open(\"https://t.me/\".concat(botUsername), '_blank');\n _context4.n = 8;\n break;\n case 7:\n _context4.p = 7;\n _t5 = _context4.v;\n setTelegramSetupStatus('error');\n showErrorToast(_t5.message);\n case 8:\n return _context4.a(2);\n }\n }, _callee4, null, [[1, 7]]);\n }));\n return function handleSetupTelegram() {\n return _ref5.apply(this, arguments);\n };\n }();\n var handleStartPolling = /*#__PURE__*/function () {\n var _ref6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5() {\n var response, _data2, data, _t6;\n return _regenerator().w(function (_context5) {\n while (1) switch (_context5.n) {\n case 0:\n _context5.p = 0;\n _context5.n = 1;\n return fetch('/api/telegram/start-polling', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n }\n });\n case 1:\n response = _context5.v;\n if (response.ok) {\n _context5.n = 3;\n break;\n }\n _context5.n = 2;\n return response.json();\n case 2:\n _data2 = _context5.v;\n throw new Error(_data2.error || t('profile.startPollingFailed'));\n case 3:\n _context5.n = 4;\n return response.json();\n case 4:\n data = _context5.v;\n setIsPolling(true);\n showSuccessToast(t('profile.pollingStarted'));\n if (telegramBotInfo) {\n setTelegramBotInfo(_objectSpread(_objectSpread({}, telegramBotInfo), {}, {\n polling_status: data.status\n }));\n }\n _context5.n = 6;\n break;\n case 5:\n _context5.p = 5;\n _t6 = _context5.v;\n showErrorToast(t('profile.pollingError'));\n case 6:\n return _context5.a(2);\n }\n }, _callee5, null, [[0, 5]]);\n }));\n return function handleStartPolling() {\n return _ref6.apply(this, arguments);\n };\n }();\n var handleStopPolling = /*#__PURE__*/function () {\n var _ref7 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6() {\n var response, _data3, data, _t7;\n return _regenerator().w(function (_context6) {\n while (1) switch (_context6.n) {\n case 0:\n _context6.p = 0;\n _context6.n = 1;\n return fetch('/api/telegram/stop-polling', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n }\n });\n case 1:\n response = _context6.v;\n if (response.ok) {\n _context6.n = 3;\n break;\n }\n _context6.n = 2;\n return response.json();\n case 2:\n _data3 = _context6.v;\n throw new Error(_data3.error || t('profile.stopPollingFailed'));\n case 3:\n _context6.n = 4;\n return response.json();\n case 4:\n data = _context6.v;\n setIsPolling(false);\n showSuccessToast(t('profile.pollingStopped', 'Polling stopped successfully.'));\n if (telegramBotInfo) {\n setTelegramBotInfo(_objectSpread(_objectSpread({}, telegramBotInfo), {}, {\n polling_status: data.status\n }));\n }\n _context6.n = 6;\n break;\n case 5:\n _context6.p = 5;\n _t7 = _context6.v;\n showErrorToast(t('profile.pollingError'));\n case 6:\n return _context6.a(2);\n }\n }, _callee6, null, [[0, 5]]);\n }));\n return function handleStopPolling() {\n return _ref7.apply(this, arguments);\n };\n }();\n var handleSubmit = /*#__PURE__*/function () {\n var _ref8 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee7(e) {\n var isPasswordChange, passwordValidation, dataToSend, response, data, updatedProfile, successMessage, _t8;\n return _regenerator().w(function (_context7) {\n while (1) switch (_context7.n) {\n case 0:\n e.preventDefault();\n\n // Check if user is trying to change password\n isPasswordChange = formData.currentPassword || formData.newPassword || formData.confirmPassword; // Only validate password if user is trying to change password\n if (!isPasswordChange) {\n _context7.n = 1;\n break;\n }\n passwordValidation = validatePasswordForm();\n if (passwordValidation.valid) {\n _context7.n = 1;\n break;\n }\n showErrorToast(Object.values(passwordValidation.errors)[0]);\n return _context7.a(2);\n case 1:\n _context7.p = 1;\n // Prepare data to send - exclude password fields if not changing password\n dataToSend = _objectSpread({}, formData);\n if (!isPasswordChange) {\n delete dataToSend.currentPassword;\n delete dataToSend.newPassword;\n delete dataToSend.confirmPassword;\n }\n _context7.n = 2;\n return fetch('/api/profile', {\n method: 'PATCH',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json'\n },\n body: JSON.stringify(dataToSend)\n });\n case 2:\n response = _context7.v;\n if (response.ok) {\n _context7.n = 4;\n break;\n }\n _context7.n = 3;\n return response.json();\n case 3:\n data = _context7.v;\n throw new Error(data.error || 'Failed to update profile.');\n case 4:\n _context7.n = 5;\n return response.json();\n case 5:\n updatedProfile = _context7.v;\n setProfile(updatedProfile);\n\n // Update formData to reflect the saved changes, preserving any fields not in response\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, {\n appearance: updatedProfile.appearance || prev.appearance || 'light',\n language: updatedProfile.language || prev.language || 'en',\n timezone: updatedProfile.timezone || prev.timezone || 'UTC',\n avatar_image: updatedProfile.avatar_image !== undefined ? updatedProfile.avatar_image : prev.avatar_image || '',\n telegram_bot_token: updatedProfile.telegram_bot_token !== undefined ? updatedProfile.telegram_bot_token : prev.telegram_bot_token || '',\n task_intelligence_enabled: updatedProfile.task_intelligence_enabled !== undefined ? updatedProfile.task_intelligence_enabled : prev.task_intelligence_enabled !== undefined ? prev.task_intelligence_enabled : true,\n task_summary_enabled: updatedProfile.task_summary_enabled !== undefined ? updatedProfile.task_summary_enabled : prev.task_summary_enabled !== undefined ? prev.task_summary_enabled : false,\n task_summary_frequency: updatedProfile.task_summary_frequency || prev.task_summary_frequency || 'daily',\n auto_suggest_next_actions_enabled: updatedProfile.auto_suggest_next_actions_enabled !== undefined ? updatedProfile.auto_suggest_next_actions_enabled : prev.auto_suggest_next_actions_enabled !== undefined ? prev.auto_suggest_next_actions_enabled : true,\n productivity_assistant_enabled: updatedProfile.productivity_assistant_enabled !== undefined ? updatedProfile.productivity_assistant_enabled : prev.productivity_assistant_enabled !== undefined ? prev.productivity_assistant_enabled : true,\n next_task_suggestion_enabled: updatedProfile.next_task_suggestion_enabled !== undefined ? updatedProfile.next_task_suggestion_enabled : prev.next_task_suggestion_enabled !== undefined ? prev.next_task_suggestion_enabled : true,\n pomodoro_enabled: updatedProfile.pomodoro_enabled !== undefined ? updatedProfile.pomodoro_enabled : prev.pomodoro_enabled !== undefined ? prev.pomodoro_enabled : true\n });\n });\n\n // Apply appearance change after save\n if (updatedProfile.appearance !== (isDarkMode ? 'dark' : 'light') && toggleDarkMode) {\n toggleDarkMode();\n }\n\n // Apply language change after save\n if (!(updatedProfile.language !== i18n.language)) {\n _context7.n = 6;\n break;\n }\n _context7.n = 6;\n return handleLanguageChange(updatedProfile.language);\n case 6:\n // Notify other components about Pomodoro setting change\n if (updatedProfile.pomodoro_enabled !== undefined) {\n window.dispatchEvent(new CustomEvent('pomodoroSettingChanged', {\n detail: {\n enabled: updatedProfile.pomodoro_enabled\n }\n }));\n }\n\n // Clear password fields on successful save\n if (isPasswordChange) {\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, {\n currentPassword: '',\n newPassword: '',\n confirmPassword: ''\n });\n });\n }\n successMessage = isPasswordChange ? t('profile.passwordChangeSuccess', 'Password changed successfully!') : t('profile.successMessage', 'Profile updated successfully!');\n showSuccessToast(successMessage);\n _context7.n = 8;\n break;\n case 7:\n _context7.p = 7;\n _t8 = _context7.v;\n showErrorToast(_t8.message);\n case 8:\n return _context7.a(2);\n }\n }, _callee7, null, [[1, 7]]);\n }));\n return function handleSubmit(_x2) {\n return _ref8.apply(this, arguments);\n };\n }();\n if (loading) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-center h-screen bg-gray-100 dark:bg-gray-900\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-xl font-semibold text-gray-700 dark:text-gray-200\"\n }, t('common.loading')));\n }\n var tabs = [{\n id: 'general',\n name: t('profile.tabs.general', 'General'),\n icon: 'user'\n }, {\n id: 'security',\n name: t('profile.tabs.security', 'Security'),\n icon: 'shield'\n }, {\n id: 'productivity',\n name: t('profile.tabs.productivity', 'Productivity'),\n icon: 'clock'\n }, {\n id: 'telegram',\n name: t('profile.tabs.telegram', 'Telegram'),\n icon: 'chat'\n }, {\n id: 'ai',\n name: t('profile.tabs.ai', 'AI Features'),\n icon: 'sparkles'\n }];\n var renderTabIcon = function renderTabIcon(iconType) {\n switch (iconType) {\n case 'user':\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: \"w-5 h-5\"\n });\n case 'clock':\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n className: \"w-5 h-5\"\n });\n case 'chat':\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n className: \"w-5 h-5\"\n });\n case 'shield':\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n className: \"w-5 h-5\"\n });\n case 'sparkles':\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n className: \"w-5 h-5\"\n });\n default:\n return null;\n }\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"max-w-5xl mx-auto p-6\",\n key: \"profile-settings-\".concat(updateKey)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h2\", {\n className: \"text-2xl font-semibold text-gray-900 dark:text-white mb-6\"\n }, t('profile.title')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-8\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"border-b border-gray-200 dark:border-gray-700\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"nav\", {\n className: \"-mb-px flex space-x-8\"\n }, tabs.map(function (tab) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n key: tab.id,\n type: \"button\",\n onClick: function onClick() {\n return setActiveTab(tab.id);\n },\n className: \"group inline-flex items-center py-2 px-1 border-b-2 font-medium text-sm \".concat(activeTab === tab.id ? 'border-blue-500 text-blue-600 dark:text-blue-400' : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 dark:text-gray-400 dark:hover:text-gray-300')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"mr-2\"\n }, renderTabIcon(tab.icon)), tab.name);\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"form\", {\n onSubmit: handleSubmit,\n className: \"space-y-8\"\n }, activeTab === 'general' && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-white dark:bg-gray-800 rounded-lg p-6 border border-gray-200 dark:border-gray-700\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-xl font-semibold text-gray-900 dark:text-white mb-6 flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: \"w-6 h-6 mr-3 text-blue-500\"\n }), t('profile.accountSettings', 'Account & Preferences')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"grid grid-cols-1 md:grid-cols-2 gap-6\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('profile.appearance')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"select\", {\n name: \"appearance\",\n value: formData.appearance,\n onChange: handleChange,\n className: \"block w-full border border-gray-300 dark:border-gray-600 rounded-md shadow-sm px-3 py-2 bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"light\"\n }, t('profile.lightMode', 'Light')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"dark\"\n }, t('profile.darkMode', 'Dark')))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('profile.language')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"select\", {\n name: \"language\",\n value: formData.language,\n onChange: handleChange,\n className: \"block w-full border border-gray-300 dark:border-gray-600 rounded-md shadow-sm px-3 py-2 bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"en\"\n }, t('profile.english')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"es\"\n }, t('profile.spanish')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"el\"\n }, t('profile.greek')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"jp\"\n }, t('profile.japanese')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"ua\"\n }, t('profile.ukrainian')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"de\"\n }, t('profile.deutsch')))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('profile.timezone')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"select\", {\n name: \"timezone\",\n value: formData.timezone,\n onChange: handleChange,\n className: \"block w-full border border-gray-300 dark:border-gray-600 rounded-md shadow-sm px-3 py-2 bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"UTC\"\n }, \"UTC\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"optgroup\", {\n label: \"Americas\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"America/New_York\"\n }, \"Eastern Time (New York)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"America/Chicago\"\n }, \"Central Time (Chicago)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"America/Denver\"\n }, \"Mountain Time (Denver)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"America/Los_Angeles\"\n }, \"Pacific Time (Los Angeles)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"America/Anchorage\"\n }, \"Alaska Time (Anchorage)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Pacific/Honolulu\"\n }, \"Hawaii Time (Honolulu)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"America/Toronto\"\n }, \"Eastern Time (Toronto)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"America/Vancouver\"\n }, \"Pacific Time (Vancouver)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"America/Mexico_City\"\n }, \"Central Time (Mexico City)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"America/Sao_Paulo\"\n }, \"Bras\\xEDlia Time (S\\xE3o Paulo)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"America/Argentina/Buenos_Aires\"\n }, \"Argentina Time (Buenos Aires)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"America/Lima\"\n }, \"Peru Time (Lima)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"America/Bogota\"\n }, \"Colombia Time (Bogot\\xE1)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"America/Caracas\"\n }, \"Venezuela Time (Caracas)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"America/Santiago\"\n }, \"Chile Time (Santiago)\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"optgroup\", {\n label: \"Europe\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Europe/London\"\n }, \"Greenwich Mean Time (London)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Europe/Dublin\"\n }, \"Greenwich Mean Time (Dublin)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Europe/Lisbon\"\n }, \"Western European Time (Lisbon)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Europe/Paris\"\n }, \"Central European Time (Paris)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Europe/Berlin\"\n }, \"Central European Time (Berlin)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Europe/Madrid\"\n }, \"Central European Time (Madrid)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Europe/Rome\"\n }, \"Central European Time (Rome)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Europe/Amsterdam\"\n }, \"Central European Time (Amsterdam)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Europe/Brussels\"\n }, \"Central European Time (Brussels)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Europe/Vienna\"\n }, \"Central European Time (Vienna)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Europe/Zurich\"\n }, \"Central European Time (Zurich)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Europe/Prague\"\n }, \"Central European Time (Prague)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Europe/Warsaw\"\n }, \"Central European Time (Warsaw)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Europe/Stockholm\"\n }, \"Central European Time (Stockholm)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Europe/Oslo\"\n }, \"Central European Time (Oslo)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Europe/Copenhagen\"\n }, \"Central European Time (Copenhagen)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Europe/Helsinki\"\n }, \"Eastern European Time (Helsinki)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Europe/Athens\"\n }, \"Eastern European Time (Athens)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Europe/Kiev\"\n }, \"Eastern European Time (Kiev)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Europe/Moscow\"\n }, \"Moscow Time (Moscow)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Europe/Istanbul\"\n }, \"Turkey Time (Istanbul)\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"optgroup\", {\n label: \"Asia\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Asia/Dubai\"\n }, \"Gulf Standard Time (Dubai)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Asia/Tehran\"\n }, \"Iran Standard Time (Tehran)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Asia/Yerevan\"\n }, \"Armenia Time (Yerevan)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Asia/Baku\"\n }, \"Azerbaijan Time (Baku)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Asia/Karachi\"\n }, \"Pakistan Standard Time (Karachi)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Asia/Kolkata\"\n }, \"India Standard Time (Mumbai/Delhi)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Asia/Kathmandu\"\n }, \"Nepal Time (Kathmandu)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Asia/Dhaka\"\n }, \"Bangladesh Standard Time (Dhaka)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Asia/Yangon\"\n }, \"Myanmar Time (Yangon)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Asia/Bangkok\"\n }, \"Indochina Time (Bangkok)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Asia/Ho_Chi_Minh\"\n }, \"Indochina Time (Ho Chi Minh)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Asia/Jakarta\"\n }, \"Western Indonesia Time (Jakarta)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Asia/Kuala_Lumpur\"\n }, \"Malaysia Time (Kuala Lumpur)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Asia/Singapore\"\n }, \"Singapore Standard Time (Singapore)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Asia/Manila\"\n }, \"Philippines Time (Manila)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Asia/Hong_Kong\"\n }, \"Hong Kong Time (Hong Kong)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Asia/Shanghai\"\n }, \"China Standard Time (Beijing/Shanghai)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Asia/Taipei\"\n }, \"China Standard Time (Taipei)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Asia/Tokyo\"\n }, \"Japan Standard Time (Tokyo)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Asia/Seoul\"\n }, \"Korea Standard Time (Seoul)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Asia/Vladivostok\"\n }, \"Vladivostok Time (Vladivostok)\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"optgroup\", {\n label: \"Africa\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Africa/Casablanca\"\n }, \"Western European Time (Casablanca)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Africa/Lagos\"\n }, \"West Africa Time (Lagos)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Africa/Cairo\"\n }, \"Eastern European Time (Cairo)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Africa/Johannesburg\"\n }, \"South Africa Standard Time (Johannesburg)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Africa/Nairobi\"\n }, \"East Africa Time (Nairobi)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Africa/Addis_Ababa\"\n }, \"East Africa Time (Addis Ababa)\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"optgroup\", {\n label: \"Oceania\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Australia/Perth\"\n }, \"Australian Western Standard Time (Perth)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Australia/Adelaide\"\n }, \"Australian Central Standard Time (Adelaide)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Australia/Darwin\"\n }, \"Australian Central Standard Time (Darwin)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Australia/Brisbane\"\n }, \"Australian Eastern Standard Time (Brisbane)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Australia/Sydney\"\n }, \"Australian Eastern Standard Time (Sydney)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Australia/Melbourne\"\n }, \"Australian Eastern Standard Time (Melbourne)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Pacific/Auckland\"\n }, \"New Zealand Standard Time (Auckland)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Pacific/Fiji\"\n }, \"Fiji Time (Suva)\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"Pacific/Guam\"\n }, \"Chamorro Standard Time (Guam)\")))))), activeTab === 'security' && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-white dark:bg-gray-800 rounded-lg p-6 border border-gray-200 dark:border-gray-700\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-xl font-semibold text-gray-900 dark:text-white mb-6 flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n className: \"w-6 h-6 mr-3 text-red-500\"\n }), t('profile.security', 'Security Settings')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-4 bg-gray-50 dark:bg-gray-700 rounded-lg\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h4\", {\n className: \"text-lg font-medium text-gray-900 dark:text-white mb-3 flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: \"w-5 h-5 mr-2 text-blue-500\"\n }), t('profile.changePassword', 'Change Password')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4 p-3 bg-blue-50 dark:bg-blue-900 border border-blue-200 dark:border-blue-800 rounded text-blue-800 dark:text-blue-200\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-sm\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n className: \"w-4 h-4 inline mr-1\"\n }), t('profile.passwordChangeOptional', 'Leave password fields empty to update other settings without changing your password.'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"space-y-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('profile.currentPassword', 'Current Password')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"relative\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: showCurrentPassword ? 'text' : 'password',\n name: \"currentPassword\",\n value: formData.currentPassword || '',\n onChange: handleChange,\n className: \"block w-full border border-gray-300 dark:border-gray-600 rounded-md shadow-sm px-3 py-2 pr-10 bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\",\n placeholder: t('profile.enterCurrentPassword', 'Enter your current password')\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n className: \"absolute inset-y-0 right-0 pr-3 flex items-center\",\n onClick: function onClick() {\n return setShowCurrentPassword(!showCurrentPassword);\n }\n }, showCurrentPassword ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n className: \"h-5 w-5 text-gray-400\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n className: \"h-5 w-5 text-gray-400\"\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('profile.newPassword', 'New Password')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"relative\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: showNewPassword ? 'text' : 'password',\n name: \"newPassword\",\n value: formData.newPassword || '',\n onChange: handleChange,\n className: \"block w-full border border-gray-300 dark:border-gray-600 rounded-md shadow-sm px-3 py-2 pr-10 bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\",\n placeholder: t('profile.enterNewPassword', 'Enter your new password')\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n className: \"absolute inset-y-0 right-0 pr-3 flex items-center\",\n onClick: function onClick() {\n return setShowNewPassword(!showNewPassword);\n }\n }, showNewPassword ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n className: \"h-5 w-5 text-gray-400\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n className: \"h-5 w-5 text-gray-400\"\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('profile.confirmPassword', 'Confirm New Password')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"relative\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: showConfirmPassword ? 'text' : 'password',\n name: \"confirmPassword\",\n value: formData.confirmPassword || '',\n onChange: handleChange,\n className: \"block w-full border border-gray-300 dark:border-gray-600 rounded-md shadow-sm px-3 py-2 pr-10 bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\",\n placeholder: t('profile.confirmNewPassword', 'Confirm your new password')\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n className: \"absolute inset-y-0 right-0 pr-3 flex items-center\",\n onClick: function onClick() {\n return setShowConfirmPassword(!showConfirmPassword);\n }\n }, showConfirmPassword ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n className: \"h-5 w-5 text-gray-400\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n className: \"h-5 w-5 text-gray-400\"\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-xs text-gray-500 dark:text-gray-400\"\n }, t('profile.passwordChangeNote', 'Password changes will be saved when you click \"Save Changes\" at the bottom of the form.'))))), activeTab === 'productivity' && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-white dark:bg-gray-800 rounded-lg p-6 border border-gray-200 dark:border-gray-700\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-xl font-semibold text-gray-900 dark:text-white mb-6 flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n className: \"w-6 h-6 mr-3 text-green-500\"\n }), t('profile.productivityFeatures', 'Productivity Features')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"space-y-6\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between p-4 bg-gray-50 dark:bg-gray-700 rounded-lg\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"text-sm font-medium text-gray-700 dark:text-gray-300\"\n }, t('profile.enablePomodoro', 'Enable Pomodoro Timer')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-xs text-gray-500 dark:text-gray-400 mt-1\"\n }, t('profile.pomodoroDescription', 'Enable the Pomodoro timer in the navigation bar for focused work sessions.'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"relative inline-block w-12 h-6 transition-colors duration-200 ease-in-out rounded-full cursor-pointer \".concat(formData.pomodoro_enabled ? 'bg-blue-500' : 'bg-gray-300 dark:bg-gray-600'),\n onClick: function onClick() {\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, {\n pomodoro_enabled: !prev.pomodoro_enabled\n });\n });\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"absolute left-0 top-0 bottom-0 m-1 w-4 h-4 transition-transform duration-200 ease-in-out transform bg-white rounded-full \".concat(formData.pomodoro_enabled ? 'translate-x-6' : 'translate-x-0')\n }))))), activeTab === 'telegram' && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-white dark:bg-gray-800 rounded-lg p-6 border border-blue-300 dark:border-blue-700 mb-8\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-xl font-semibold text-blue-700 dark:text-blue-300 mb-6 flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n className: \"w-6 h-6 mr-3 text-blue-500\"\n }), t('profile.telegramIntegration', 'Telegram Integration')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-8 p-4 bg-gray-50 dark:bg-gray-700 rounded-lg\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h4\", {\n className: \"text-lg font-medium text-gray-900 dark:text-white mb-3 flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n className: \"w-5 h-5 mr-2 text-blue-500\"\n }), t('profile.botSetup', 'Bot Setup')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"space-y-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-sm text-gray-600 dark:text-gray-300 flex items-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n className: \"h-5 w-5 mr-2 flex-shrink-0 text-blue-500\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, t('profile.telegramDescription', 'Connect your Tududi account to a Telegram bot to add items to your inbox via Telegram messages.'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-sm font-medium text-gray-700 dark:text-gray-300\"\n }, t('profile.telegramBotToken', 'Telegram Bot Token')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n name: \"telegram_bot_token\",\n value: formData.telegram_bot_token || '',\n onChange: handleChange,\n placeholder: \"123456789:ABCDefGhIJKlmNoPQRsTUVwxyZ\",\n className: \"mt-1 block w-full border border-gray-300 dark:border-gray-700 rounded-md shadow-sm px-3 py-2 bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"mt-2 text-xs text-gray-500 dark:text-gray-400\"\n }, t('profile.telegramTokenDescription', 'Create a bot with @BotFather on Telegram and paste the token here.'))), (profile === null || profile === void 0 ? void 0 : profile.telegram_chat_id) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-2 bg-green-50 dark:bg-green-900 border border-green-200 dark:border-green-800 rounded text-green-800 dark:text-green-200\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-sm\"\n }, t('profile.telegramConnected', 'Your Telegram account is connected! Send messages to your bot to add items to your Tududi inbox.'))), telegramBotInfo && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-2 bg-blue-50 dark:bg-blue-900 border border-blue-200 dark:border-blue-800 rounded text-blue-800 dark:text-blue-200\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"font-medium mb-2\"\n }, t('profile.botConfigured', 'Bot configured successfully!')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-sm space-y-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"font-semibold\"\n }, t('profile.botUsername', 'Bot Username:'), \" \"), \"@\", telegramBotInfo.username), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mt-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"font-semibold mb-1\"\n }, t('profile.pollingStatus', 'Polling Status:'), \" \"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center mb-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-3 h-3 rounded-full mr-2 \".concat(isPolling ? 'bg-green-500' : 'bg-red-500')\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, isPolling ? t('profile.pollingActive') : t('profile.pollingInactive'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-xs mb-2\"\n }, t('profile.pollingNote', 'Polling periodically checks for new messages from Telegram and adds them to your inbox.')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex flex-wrap gap-2 mt-2\"\n }, isPolling ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: handleStopPolling,\n className: \"px-3 py-1 bg-red-600 text-white dark:bg-red-700 rounded text-sm hover:bg-red-700 dark:hover:bg-red-800\"\n }, t('profile.stopPolling', 'Stop Polling')) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: handleStartPolling,\n className: \"px-3 py-1 bg-blue-600 text-white dark:bg-blue-700 rounded text-sm hover:bg-blue-700 dark:hover:bg-blue-800\"\n }, t('profile.startPolling', 'Start Polling')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: telegramBotInfo.chat_url,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n className: \"px-3 py-1 bg-green-600 text-white dark:bg-green-700 rounded text-sm hover:bg-green-700 dark:hover:bg-green-800\"\n }, t('profile.openTelegram', 'Open in Telegram')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee8() {\n var testMessage, response, result, _t9;\n return _regenerator().w(function (_context8) {\n while (1) switch (_context8.n) {\n case 0:\n _context8.p = 0;\n testMessage = prompt('Enter a test message:');\n if (!testMessage) {\n _context8.n = 3;\n break;\n }\n _context8.n = 1;\n return fetch(\"/api/telegram/test/\".concat(profile === null || profile === void 0 ? void 0 : profile.id), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n text: testMessage\n })\n });\n case 1:\n response = _context8.v;\n _context8.n = 2;\n return response.json();\n case 2:\n result = _context8.v;\n if (result.success) {\n showSuccessToast(t('profile.testMessageSent', 'Test message sent successfully!'));\n } else {\n showErrorToast(t('profile.testMessageFailed', 'Failed to send test message.'));\n }\n case 3:\n _context8.n = 5;\n break;\n case 4:\n _context8.p = 4;\n _t9 = _context8.v;\n showErrorToast(t('profile.testMessageError', 'Error sending test message.'));\n case 5:\n return _context8.a(2);\n }\n }, _callee8, null, [[0, 4]]);\n })),\n className: \"px-3 py-1 bg-purple-600 text-white dark:bg-purple-700 rounded text-sm hover:bg-purple-700 dark:hover:bg-purple-800\"\n }, t('profile.testTelegramMessage', 'Test Telegram')))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: handleSetupTelegram,\n disabled: !formData.telegram_bot_token || telegramSetupStatus === 'loading',\n className: \"px-4 py-2 rounded-md \".concat(!formData.telegram_bot_token || telegramSetupStatus === 'loading' ? 'bg-gray-300 dark:bg-gray-700 text-gray-500 dark:text-gray-400 cursor-not-allowed' : 'bg-blue-600 text-white hover:bg-blue-700 dark:bg-blue-500 dark:hover:bg-blue-600')\n }, telegramSetupStatus === 'loading' ? t('profile.settingUp', 'Setting up...') : t('profile.setupTelegram', 'Setup Telegram')))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-4 bg-gray-50 dark:bg-gray-700 rounded-lg\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h4\", {\n className: \"text-lg font-medium text-gray-900 dark:text-white mb-3 flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n className: \"w-5 h-5 mr-2 text-green-500\"\n }), t('profile.taskSummaryNotifications', 'Task Summary Notifications')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4 text-sm text-gray-600 dark:text-gray-300 flex items-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n className: \"h-5 w-5 mr-2 flex-shrink-0 text-blue-500\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, t('profile.taskSummaryDescription', 'Receive regular summaries of your tasks via Telegram. This feature requires your Telegram integration to be set up.'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4 flex items-center justify-between\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"text-sm font-medium text-gray-700 dark:text-gray-300\"\n }, t('profile.enableTaskSummary', 'Enable Task Summaries')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"relative inline-block w-12 h-6 transition-colors duration-200 ease-in-out rounded-full cursor-pointer \".concat(formData.task_summary_enabled ? 'bg-blue-500' : 'bg-gray-300 dark:bg-gray-600'),\n onClick: function onClick() {\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, {\n task_summary_enabled: !prev.task_summary_enabled\n });\n });\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"absolute left-0 top-0 bottom-0 m-1 w-4 h-4 transition-transform duration-200 ease-in-out transform bg-white rounded-full \".concat(formData.task_summary_enabled ? 'translate-x-6' : 'translate-x-0')\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('profile.summaryFrequency', 'Summary Frequency')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex flex-wrap gap-2\"\n }, ['1h', '2h', '4h', '8h', '12h', 'daily', 'weekly'].map(function (frequency) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n key: frequency,\n type: \"button\",\n className: \"px-3 py-1.5 text-sm rounded-full \".concat(formData.task_summary_frequency === frequency ? 'bg-blue-500 text-white' : 'bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300'),\n onClick: function onClick() {\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, {\n task_summary_frequency: frequency\n });\n });\n }\n }, t(\"profile.frequency.\".concat(frequency), formatFrequency(frequency)));\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"mt-2 text-xs text-gray-500 dark:text-gray-400\"\n }, t('profile.frequencyHelp', 'Choose how often you want to receive task summaries.'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mt-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n disabled: !(profile !== null && profile !== void 0 && profile.telegram_bot_token) || !(profile !== null && profile !== void 0 && profile.telegram_chat_id),\n className: \"px-4 py-2 rounded-md \".concat(!(profile !== null && profile !== void 0 && profile.telegram_bot_token) || !(profile !== null && profile !== void 0 && profile.telegram_chat_id) ? 'bg-gray-300 dark:bg-gray-700 text-gray-500 dark:text-gray-400 cursor-not-allowed' : 'bg-blue-600 text-white hover:bg-blue-700 dark:bg-blue-500 dark:hover:bg-blue-600'),\n onClick: /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee9() {\n var response, _data4, data, _t0;\n return _regenerator().w(function (_context9) {\n while (1) switch (_context9.n) {\n case 0:\n _context9.p = 0;\n _context9.n = 1;\n return fetch('/api/profile/task-summary/send-now', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n }\n });\n case 1:\n response = _context9.v;\n if (response.ok) {\n _context9.n = 3;\n break;\n }\n _context9.n = 2;\n return response.json();\n case 2:\n _data4 = _context9.v;\n throw new Error(_data4.error || t('profile.sendSummaryFailed'));\n case 3:\n _context9.n = 4;\n return response.json();\n case 4:\n data = _context9.v;\n showSuccessToast(data.message);\n _context9.n = 6;\n break;\n case 5:\n _context9.p = 5;\n _t0 = _context9.v;\n showErrorToast(_t0.message);\n case 6:\n return _context9.a(2);\n }\n }, _callee9, null, [[0, 5]]);\n }))\n }, t('profile.sendTestSummary', 'Send Test Summary')), (!(profile !== null && profile !== void 0 && profile.telegram_bot_token) || !(profile !== null && profile !== void 0 && profile.telegram_chat_id)) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"mt-2 text-xs text-red-500\"\n }, t('profile.telegramRequiredForSummaries', 'Telegram integration must be set up to use task summaries.'))))), activeTab === 'ai' && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-white dark:bg-gray-800 rounded-lg p-6 border border-gray-200 dark:border-gray-700\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-xl font-semibold text-gray-900 dark:text-white mb-6 flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n className: \"w-6 h-6 mr-3 text-blue-500\"\n }), t('profile.aiProductivityFeatures', 'AI & Productivity Features')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-4 bg-gray-50 dark:bg-gray-700 rounded-lg\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h4\", {\n className: \"text-lg font-medium text-gray-900 dark:text-white mb-3 flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n className: \"w-5 h-5 mr-2 text-purple-500\"\n }), t('profile.taskIntelligence', 'Task Intelligence')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4 text-sm text-gray-600 dark:text-gray-300 flex items-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n className: \"h-5 w-5 mr-2 flex-shrink-0 text-blue-500\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, t('profile.taskIntelligenceDescription', 'Get helpful suggestions to make your task names more descriptive and actionable.'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"text-sm font-medium text-gray-700 dark:text-gray-300\"\n }, t('profile.enableTaskIntelligence', 'Enable Task Intelligence Assistant')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"relative inline-block w-12 h-6 transition-colors duration-200 ease-in-out rounded-full cursor-pointer \".concat(formData.task_intelligence_enabled ? 'bg-blue-500' : 'bg-gray-300 dark:bg-gray-600'),\n onClick: function onClick() {\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, {\n task_intelligence_enabled: !prev.task_intelligence_enabled\n });\n });\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"absolute left-0 top-0 bottom-0 m-1 w-4 h-4 transition-transform duration-200 ease-in-out transform bg-white rounded-full \".concat(formData.task_intelligence_enabled ? 'translate-x-6' : 'translate-x-0')\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-4 bg-gray-50 dark:bg-gray-700 rounded-lg mt-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h4\", {\n className: \"text-lg font-medium text-gray-900 dark:text-white mb-3 flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n className: \"w-5 h-5 mr-2 text-green-500\"\n }), t('profile.autoSuggestNextActions', 'Auto-Suggest Next Actions')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4 text-sm text-gray-600 dark:text-gray-300 flex items-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n className: \"h-5 w-5 mr-2 flex-shrink-0 text-blue-500\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, t('profile.autoSuggestNextActionsDescription', 'When creating a project, automatically prompt for the very next physical action to take.'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"text-sm font-medium text-gray-700 dark:text-gray-300\"\n }, t('profile.enableAutoSuggestNextActions', 'Enable Next Action Prompts')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"relative inline-block w-12 h-6 transition-colors duration-200 ease-in-out rounded-full cursor-pointer \".concat(formData.auto_suggest_next_actions_enabled ? 'bg-blue-500' : 'bg-gray-300 dark:bg-gray-600'),\n onClick: function onClick() {\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, {\n auto_suggest_next_actions_enabled: !prev.auto_suggest_next_actions_enabled\n });\n });\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"absolute left-0 top-0 bottom-0 m-1 w-4 h-4 transition-transform duration-200 ease-in-out transform bg-white rounded-full \".concat(formData.auto_suggest_next_actions_enabled ? 'translate-x-6' : 'translate-x-0')\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-4 bg-gray-50 dark:bg-gray-700 rounded-lg mt-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h4\", {\n className: \"text-lg font-medium text-gray-900 dark:text-white mb-3 flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n className: \"w-5 h-5 mr-2 text-yellow-500\"\n }), t('profile.productivityAssistant', 'Productivity Assistant')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4 text-sm text-gray-600 dark:text-gray-300 flex items-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n className: \"h-5 w-5 mr-2 flex-shrink-0 text-blue-500\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, t('profile.productivityAssistantDescription', 'Show productivity insights that help identify stalled projects, vague tasks, and workflow improvements on your Today page.'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"text-sm font-medium text-gray-700 dark:text-gray-300\"\n }, t('profile.enableProductivityAssistant', 'Enable Productivity Insights')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"relative inline-block w-12 h-6 transition-colors duration-200 ease-in-out rounded-full cursor-pointer \".concat(formData.productivity_assistant_enabled ? 'bg-blue-500' : 'bg-gray-300 dark:bg-gray-600'),\n onClick: function onClick() {\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, {\n productivity_assistant_enabled: !prev.productivity_assistant_enabled\n });\n });\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"absolute left-0 top-0 bottom-0 m-1 w-4 h-4 transition-transform duration-200 ease-in-out transform bg-white rounded-full \".concat(formData.productivity_assistant_enabled ? 'translate-x-6' : 'translate-x-0')\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-4 bg-gray-50 dark:bg-gray-700 rounded-lg mt-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h4\", {\n className: \"text-lg font-medium text-gray-900 dark:text-white mb-3 flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n className: \"w-5 h-5 mr-2 text-green-500\"\n }), t('profile.nextTaskSuggestion', 'Next Task Suggestion')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4 text-sm text-gray-600 dark:text-gray-300 flex items-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n className: \"h-5 w-5 mr-2 flex-shrink-0 text-blue-500\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, t('profile.nextTaskSuggestionDescription', 'Automatically suggest the next best task to work on when you have nothing in progress, prioritizing due today tasks, then suggested tasks, then next actions.'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"text-sm font-medium text-gray-700 dark:text-gray-300\"\n }, t('profile.enableNextTaskSuggestion', 'Enable Next Task Suggestions')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"relative inline-block w-12 h-6 transition-colors duration-200 ease-in-out rounded-full cursor-pointer \".concat(formData.next_task_suggestion_enabled ? 'bg-blue-500' : 'bg-gray-300 dark:bg-gray-600'),\n onClick: function onClick() {\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, {\n next_task_suggestion_enabled: !prev.next_task_suggestion_enabled\n });\n });\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"absolute left-0 top-0 bottom-0 m-1 w-4 h-4 transition-transform duration-200 ease-in-out transform bg-white rounded-full \".concat(formData.next_task_suggestion_enabled ? 'translate-x-6' : 'translate-x-0')\n }))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex justify-end dark:border-gray-700\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"submit\",\n className: \"px-6 py-3 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 dark:bg-blue-500 dark:hover:bg-blue-600 transition-colors duration-200 flex items-center space-x-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n className: \"w-5 h-5\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, t('profile.saveChanges', 'Save Changes'))))));\n};\n_s(ProfileSettings, \"uOzGhBqT/wcpgppQEi0oAwfgVy4=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation, _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_2__.useToast];\n});\n_c = ProfileSettings;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ProfileSettings);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"ProfileSettings\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Profile/ProfileSettings.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Project/AutoSuggestNextActionBox.tsx":
+/*!******************************************************************!*\
+ !*** ./frontend/components/Project/AutoSuggestNextActionBox.tsx ***!
+ \******************************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Shared/ToastContext */ \"./frontend/components/Shared/ToastContext.tsx\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\nvar AutoSuggestNextActionBox = function AutoSuggestNextActionBox(_ref) {\n _s();\n var onAddAction = _ref.onAddAction,\n onDismiss = _ref.onDismiss,\n projectName = _ref.projectName;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\"),\n _useState2 = _slicedToArray(_useState, 2),\n actionDescription = _useState2[0],\n setActionDescription = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState4 = _slicedToArray(_useState3, 2),\n isFocused = _useState4[0],\n setIsFocused = _useState4[1];\n var inputRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var _useToast = (0,_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_2__.useToast)(),\n showSuccessToast = _useToast.showSuccessToast;\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n // Focus the input when component mounts\n setTimeout(function () {\n var _inputRef$current;\n (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 || _inputRef$current.focus();\n }, 100);\n }, []);\n var handleSubmit = function handleSubmit(e) {\n e.preventDefault();\n if (actionDescription.trim()) {\n onAddAction(actionDescription.trim());\n showSuccessToast(t('success.nextActionAdded'));\n setActionDescription(\"\");\n }\n };\n var handleKeyDown = function handleKeyDown(e) {\n if (e.key === \"Escape\") {\n onDismiss();\n }\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-700 rounded-lg p-6 mb-6\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-start justify-between mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-blue-100 dark:bg-blue-800 p-2 rounded-lg mr-3\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"svg\", {\n className: \"w-6 h-6 text-blue-600 dark:text-blue-300\",\n fill: \"none\",\n stroke: \"currentColor\",\n viewBox: \"0 0 24 24\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: \"M9 5l7 7-7 7\"\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-lg font-semibold text-blue-800 dark:text-blue-200 mb-1\"\n }, t('profile.nextActionPrompt', 'What\\'s the very next physical action for this project?')))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: onDismiss,\n className: \"text-blue-400 hover:text-blue-600 dark:text-blue-500 dark:hover:text-blue-300 transition-colors\",\n \"aria-label\": \"Dismiss\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"svg\", {\n className: \"w-5 h-5\",\n fill: \"none\",\n stroke: \"currentColor\",\n viewBox: \"0 0 24 24\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: \"M6 18L18 6M6 6l12 12\"\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"form\", {\n onSubmit: handleSubmit,\n className: \"space-y-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"relative\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n ref: inputRef,\n type: \"text\",\n value: actionDescription,\n onChange: function onChange(e) {\n return setActionDescription(e.target.value);\n },\n onFocus: function onFocus() {\n return setIsFocused(true);\n },\n onBlur: function onBlur() {\n return setIsFocused(false);\n },\n onKeyDown: handleKeyDown,\n placeholder: t('profile.nextActionPlaceholder', 'e.g., Call John to schedule meeting, Research competitors online, Create project folder...'),\n className: \"w-full px-4 py-3 border rounded-lg shadow-sm transition-all duration-200 focus:outline-none bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-500 dark:placeholder-gray-400 \".concat(isFocused ? 'border-blue-400 ring-2 ring-blue-100 dark:ring-blue-900/50' : 'border-blue-200 dark:border-blue-700 hover:border-blue-300 dark:hover:border-blue-600')\n }), actionDescription && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"absolute right-3 top-1/2 transform -translate-y-1/2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"kbd\", {\n className: \"px-2 py-1 text-xs bg-blue-100 dark:bg-blue-800 text-blue-600 dark:text-blue-300 rounded border border-blue-200 dark:border-blue-700\"\n }, \"Enter\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex justify-between items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: onDismiss,\n className: \"px-4 py-2 text-sm font-medium text-blue-600 dark:text-blue-400 bg-transparent hover:bg-blue-100 dark:hover:bg-blue-900/30 rounded-lg transition-colors\"\n }, t('profile.skipNextAction', 'Skip for now')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"submit\",\n disabled: !actionDescription.trim(),\n className: \"px-6 py-2 text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-200 dark:focus:ring-blue-800 rounded-lg disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n }, t('profile.addNextAction', 'Add Next Action')))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mt-4 p-3 bg-blue-100/50 dark:bg-blue-900/30 rounded-lg border border-blue-200 dark:border-blue-700\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-xs text-blue-700 dark:text-blue-300 flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"svg\", {\n className: \"w-4 h-4 mr-2 flex-shrink-0\",\n fill: \"none\",\n stroke: \"currentColor\",\n viewBox: \"0 0 24 24\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: \"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, t('profile.nextActionHint', 'Think of the smallest, most concrete step you can take right now to move this project forward.')))));\n};\n_s(AutoSuggestNextActionBox, \"R92LnKtjGqu+CRaiwvlhhgy413c=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation, _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_2__.useToast];\n});\n_c = AutoSuggestNextActionBox;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AutoSuggestNextActionBox);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"AutoSuggestNextActionBox\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Project/AutoSuggestNextActionBox.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Project/ProjectDetails.tsx":
+/*!********************************************************!*\
+ !*** ./frontend/components/Project/ProjectDetails.tsx ***!
+ \********************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/dist/index.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Shared/ToastContext */ \"./frontend/components/Shared/ToastContext.tsx\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/PencilSquareIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/TrashIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/Squares2X2Icon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/FolderIcon.js\");\n/* harmony import */ var _Task_TaskList__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Task/TaskList */ \"./frontend/components/Task/TaskList.tsx\");\n/* harmony import */ var _Project_ProjectModal__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Project/ProjectModal */ \"./frontend/components/Project/ProjectModal.tsx\");\n/* harmony import */ var _Shared_ConfirmDialog__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Shared/ConfirmDialog */ \"./frontend/components/Shared/ConfirmDialog.tsx\");\n/* harmony import */ var _store_useStore__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../store/useStore */ \"./frontend/store/useStore.ts\");\n/* harmony import */ var _Task_NewTask__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Task/NewTask */ \"./frontend/components/Task/NewTask.tsx\");\n/* harmony import */ var _utils_projectsService__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../utils/projectsService */ \"./frontend/utils/projectsService.ts\");\n/* harmony import */ var _utils_tasksService__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../utils/tasksService */ \"./frontend/utils/tasksService.ts\");\n/* harmony import */ var _utils_areasService__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../utils/areasService */ \"./frontend/utils/areasService.ts\");\n/* harmony import */ var _utils_authUtils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../utils/authUtils */ \"./frontend/utils/authUtils.ts\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/InformationCircleIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/CalendarDaysIcon.js\");\n/* harmony import */ var _utils_profileService__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../utils/profileService */ \"./frontend/utils/profileService.ts\");\n/* harmony import */ var _AutoSuggestNextActionBox__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./AutoSuggestNextActionBox */ \"./frontend/components/Project/AutoSuggestNextActionBox.tsx\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar priorityStyles = {\n high: 'bg-red-500',\n medium: 'bg-yellow-500',\n low: 'bg-green-500',\n \"default\": 'bg-gray-400'\n};\nvar ProjectDetails = function ProjectDetails() {\n _s();\n var _useParams = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_14__.useParams)(),\n id = _useParams.id;\n var navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_14__.useNavigate)();\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t,\n i18n = _useTranslation.i18n;\n var _useToast = (0,_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_2__.useToast)(),\n showSuccessToast = _useToast.showSuccessToast;\n var areas = (0,_store_useStore__WEBPACK_IMPORTED_MODULE_6__.useStore)(function (state) {\n return state.areasStore.areas;\n });\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(undefined),\n _useState2 = _slicedToArray(_useState, 2),\n project = _useState2[0],\n setProject = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState4 = _slicedToArray(_useState3, 2),\n tasks = _useState4[0],\n setTasks = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true),\n _useState6 = _slicedToArray(_useState5, 2),\n loading = _useState6[0],\n setLoading = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState8 = _slicedToArray(_useState7, 2),\n error = _useState8[0],\n setError = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState0 = _slicedToArray(_useState9, 2),\n isModalOpen = _useState0[0],\n setIsModalOpen = _useState0[1];\n var _useState1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState10 = _slicedToArray(_useState1, 2),\n isConfirmDialogOpen = _useState10[0],\n setIsConfirmDialogOpen = _useState10[1];\n var _useState11 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState12 = _slicedToArray(_useState11, 2),\n showCompleted = _useState12[0],\n setShowCompleted = _useState12[1];\n var _useState13 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState14 = _slicedToArray(_useState13, 2),\n showAutoSuggestForm = _useState14[0],\n setShowAutoSuggestForm = _useState14[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var loadProjectData = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var projectData, projectTasks, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n if (id) {\n _context.n = 1;\n break;\n }\n console.error(\"Project ID is missing.\");\n return _context.a(2);\n case 1:\n setLoading(true);\n _context.p = 2;\n (0,_utils_areasService__WEBPACK_IMPORTED_MODULE_10__.fetchAreas)();\n _context.n = 3;\n return (0,_utils_projectsService__WEBPACK_IMPORTED_MODULE_8__.fetchProjectById)(id);\n case 3:\n projectData = _context.v;\n setProject(projectData);\n // Handle both 'tasks' and 'Tasks' property names\n projectTasks = projectData.tasks || projectData.Tasks || [];\n setTasks(projectTasks);\n _context.n = 5;\n break;\n case 4:\n _context.p = 4;\n _t = _context.v;\n console.error(\"Error fetching project data:\", _t);\n case 5:\n _context.p = 5;\n setLoading(false);\n return _context.f(5);\n case 6:\n return _context.a(2);\n }\n }, _callee, null, [[2, 4, 5, 6]]);\n }));\n return function loadProjectData() {\n return _ref.apply(this, arguments);\n };\n }();\n loadProjectData();\n }, [id, _utils_areasService__WEBPACK_IMPORTED_MODULE_10__.fetchAreas]);\n\n // Check if we should show auto-suggest form for projects with no tasks\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var checkAutoSuggest = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {\n var autoSuggestEnabled;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n if (!(project && tasks.length === 0 && !loading)) {\n _context2.n = 2;\n break;\n }\n _context2.n = 1;\n return (0,_utils_profileService__WEBPACK_IMPORTED_MODULE_12__.getAutoSuggestNextActionsEnabled)();\n case 1:\n autoSuggestEnabled = _context2.v;\n if (autoSuggestEnabled) {\n setShowAutoSuggestForm(true);\n }\n case 2:\n return _context2.a(2);\n }\n }, _callee2);\n }));\n return function checkAutoSuggest() {\n return _ref2.apply(this, arguments);\n };\n }();\n checkAutoSuggest();\n }, [project, tasks, loading]);\n var handleTaskCreate = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(taskName) {\n var newTask, taskLink, _t2;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n if (project) {\n _context3.n = 1;\n break;\n }\n console.error(\"Cannot create task: Project is missing\");\n throw new Error(\"Cannot create task: Project is missing\");\n case 1:\n _context3.p = 1;\n _context3.n = 2;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_9__.createTask)({\n name: taskName,\n status: \"not_started\",\n project_id: project.id\n });\n case 2:\n newTask = _context3.v;\n setTasks(function (prevTasks) {\n return [].concat(_toConsumableArray(prevTasks), [newTask]);\n });\n\n // Show success toast with task link\n taskLink = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, t('task.created', 'Task'), \" \", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: \"/task/\".concat(newTask.uuid),\n className: \"text-green-200 underline hover:text-green-100\"\n }, newTask.name), \" \", t('task.createdSuccessfully', 'created successfully!'));\n showSuccessToast(taskLink);\n _context3.n = 5;\n break;\n case 3:\n _context3.p = 3;\n _t2 = _context3.v;\n console.error(\"Error creating task:\", _t2);\n // Check if it's an authentication error\n if (!(0,_utils_authUtils__WEBPACK_IMPORTED_MODULE_11__.isAuthError)(_t2)) {\n _context3.n = 4;\n break;\n }\n return _context3.a(2);\n case 4:\n throw _t2;\n case 5:\n return _context3.a(2);\n }\n }, _callee3, null, [[1, 3]]);\n }));\n return function handleTaskCreate(_x) {\n return _ref3.apply(this, arguments);\n };\n }();\n var handleTaskUpdate = /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(updatedTask) {\n var _t3;\n return _regenerator().w(function (_context4) {\n while (1) switch (_context4.n) {\n case 0:\n if (updatedTask.id) {\n _context4.n = 1;\n break;\n }\n console.error(\"Cannot update task: Task ID is missing\");\n return _context4.a(2);\n case 1:\n _context4.p = 1;\n _context4.n = 2;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_9__.updateTask)(updatedTask.id, updatedTask);\n case 2:\n setTasks(function (prevTasks) {\n return prevTasks.map(function (task) {\n return task.id === updatedTask.id ? updatedTask : task;\n });\n });\n _context4.n = 4;\n break;\n case 3:\n _context4.p = 3;\n _t3 = _context4.v;\n console.error(\"Error updating task:\", _t3);\n case 4:\n return _context4.a(2);\n }\n }, _callee4, null, [[1, 3]]);\n }));\n return function handleTaskUpdate(_x2) {\n return _ref4.apply(this, arguments);\n };\n }();\n var handleTaskDelete = /*#__PURE__*/function () {\n var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5(taskId) {\n var _t4;\n return _regenerator().w(function (_context5) {\n while (1) switch (_context5.n) {\n case 0:\n if (taskId) {\n _context5.n = 1;\n break;\n }\n console.error(\"Cannot delete task: Task ID is missing\");\n return _context5.a(2);\n case 1:\n _context5.p = 1;\n _context5.n = 2;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_9__.deleteTask)(taskId);\n case 2:\n setTasks(function (prevTasks) {\n return prevTasks.filter(function (task) {\n return task.id !== taskId;\n });\n });\n _context5.n = 4;\n break;\n case 3:\n _context5.p = 3;\n _t4 = _context5.v;\n console.error(\"Error deleting task:\", _t4);\n case 4:\n return _context5.a(2);\n }\n }, _callee5, null, [[1, 3]]);\n }));\n return function handleTaskDelete(_x3) {\n return _ref5.apply(this, arguments);\n };\n }();\n var handleToggleToday = /*#__PURE__*/function () {\n var _ref6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6(taskId) {\n var updatedTask, updatedProject, _t5, _t6;\n return _regenerator().w(function (_context6) {\n while (1) switch (_context6.n) {\n case 0:\n _context6.p = 0;\n _context6.n = 1;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_9__.toggleTaskToday)(taskId);\n case 1:\n updatedTask = _context6.v;\n // Update the task in the local state immediately to avoid UI flashing\n setTasks(function (prevTasks) {\n return prevTasks.map(function (task) {\n return task.id === taskId ? _objectSpread(_objectSpread({}, task), {}, {\n today: updatedTask.today,\n today_move_count: updatedTask.today_move_count\n }) : task;\n });\n });\n _context6.n = 6;\n break;\n case 2:\n _context6.p = 2;\n _t5 = _context6.v;\n console.error(\"Error toggling task today status:\", _t5);\n // Optionally refetch data on error to ensure consistency\n if (!id) {\n _context6.n = 6;\n break;\n }\n _context6.p = 3;\n _context6.n = 4;\n return (0,_utils_projectsService__WEBPACK_IMPORTED_MODULE_8__.fetchProjectById)(id);\n case 4:\n updatedProject = _context6.v;\n setProject(updatedProject);\n setTasks(updatedProject.tasks || []);\n _context6.n = 6;\n break;\n case 5:\n _context6.p = 5;\n _t6 = _context6.v;\n console.error(\"Error refetching project data:\", _t6);\n case 6:\n return _context6.a(2);\n }\n }, _callee6, null, [[3, 5], [0, 2]]);\n }));\n return function handleToggleToday(_x4) {\n return _ref6.apply(this, arguments);\n };\n }();\n var handleEditProject = function handleEditProject() {\n setIsModalOpen(true);\n };\n var handleSaveProject = /*#__PURE__*/function () {\n var _ref7 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee7(updatedProject) {\n var savedProject, _t7;\n return _regenerator().w(function (_context7) {\n while (1) switch (_context7.n) {\n case 0:\n if (updatedProject.id) {\n _context7.n = 1;\n break;\n }\n console.error(\"Cannot save project: Project ID is missing\");\n return _context7.a(2);\n case 1:\n _context7.p = 1;\n _context7.n = 2;\n return (0,_utils_projectsService__WEBPACK_IMPORTED_MODULE_8__.updateProject)(updatedProject.id, updatedProject);\n case 2:\n savedProject = _context7.v;\n setProject(savedProject);\n setIsModalOpen(false);\n _context7.n = 4;\n break;\n case 3:\n _context7.p = 3;\n _t7 = _context7.v;\n console.error(\"Error saving project:\", _t7);\n case 4:\n return _context7.a(2);\n }\n }, _callee7, null, [[1, 3]]);\n }));\n return function handleSaveProject(_x5) {\n return _ref7.apply(this, arguments);\n };\n }();\n var handleCreateNextAction = /*#__PURE__*/function () {\n var _ref8 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee8(projectId, actionDescription) {\n var newTask, taskLink, _t8;\n return _regenerator().w(function (_context8) {\n while (1) switch (_context8.n) {\n case 0:\n _context8.p = 0;\n _context8.n = 1;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_9__.createTask)({\n name: actionDescription,\n status: \"not_started\",\n project_id: projectId,\n priority: \"medium\"\n });\n case 1:\n newTask = _context8.v;\n // Update the tasks list to include the new task\n setTasks(function (prevTasks) {\n return [].concat(_toConsumableArray(prevTasks), [newTask]);\n });\n setShowAutoSuggestForm(false);\n\n // Show success toast with task link\n taskLink = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, t('task.created', 'Task'), \" \", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: \"/task/\".concat(newTask.uuid),\n className: \"text-green-200 underline hover:text-green-100\"\n }, newTask.name), \" \", t('task.createdSuccessfully', 'created successfully!'));\n showSuccessToast(taskLink);\n _context8.n = 3;\n break;\n case 2:\n _context8.p = 2;\n _t8 = _context8.v;\n console.error(\"Error creating next action:\", _t8);\n case 3:\n return _context8.a(2);\n }\n }, _callee8, null, [[0, 2]]);\n }));\n return function handleCreateNextAction(_x6, _x7) {\n return _ref8.apply(this, arguments);\n };\n }();\n var handleSkipNextAction = function handleSkipNextAction() {\n setShowAutoSuggestForm(false);\n };\n var handleDeleteProject = /*#__PURE__*/function () {\n var _ref9 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee9() {\n var _t9;\n return _regenerator().w(function (_context9) {\n while (1) switch (_context9.n) {\n case 0:\n if (project !== null && project !== void 0 && project.id) {\n _context9.n = 1;\n break;\n }\n console.error(\"Cannot delete project: Project ID is missing\");\n return _context9.a(2);\n case 1:\n _context9.p = 1;\n _context9.n = 2;\n return (0,_utils_projectsService__WEBPACK_IMPORTED_MODULE_8__.deleteProject)(project.id);\n case 2:\n navigate(\"/projects\");\n _context9.n = 4;\n break;\n case 3:\n _context9.p = 3;\n _t9 = _context9.v;\n console.error(\"Error deleting project:\", _t9);\n case 4:\n return _context9.a(2);\n }\n }, _callee9, null, [[1, 3]]);\n }));\n return function handleDeleteProject() {\n return _ref9.apply(this, arguments);\n };\n }();\n if (loading) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-center h-screen bg-gray-100 dark:bg-gray-900\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-xl font-semibold text-gray-700 dark:text-gray-200\"\n }, \"Loading project details...\"));\n }\n if (error) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-center h-screen bg-gray-100 dark:bg-gray-900\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-red-500 text-lg\"\n }, error));\n }\n if (!project) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-center h-screen bg-gray-100 dark:bg-gray-900\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-red-500 text-lg\"\n }, \"Project not found.\"));\n }\n var activeTasks = (tasks === null || tasks === void 0 ? void 0 : tasks.filter(function (task) {\n return typeof task.status === 'number' ? task.status !== 2 : task.status !== 'done';\n })) || []; //TODO: Also add archived\n var completedTasks = tasks === null || tasks === void 0 ? void 0 : tasks.filter(function (task) {\n return typeof task.status === 'number' ? task.status === 2 : task.status === 'done';\n });\n var displayTasks = showCompleted ? [].concat(_toConsumableArray(activeTasks), _toConsumableArray(completedTasks)) : activeTasks;\n var formatProjectDueDate = function formatProjectDueDate(dateString) {\n var date = new Date(dateString);\n var currentLang = i18n.language;\n\n // Format based on language\n var formatOptions = {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n };\n return date.toLocaleDateString(currentLang, formatOptions);\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex justify-center px-4 lg:px-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-full max-w-5xl\"\n }, project.image_url && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-6 rounded-lg overflow-hidden relative\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n src: project.image_url,\n alt: project.name,\n className: \"w-full h-48 object-cover\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"absolute inset-0 bg-black bg-opacity-40 flex items-center justify-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h1\", {\n className: \"text-4xl md:text-5xl font-bold text-white text-center px-4 drop-shadow-lg\"\n }, project.name)), project.priority !== undefined && project.priority !== null && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"absolute top-3 left-3\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-4 h-4 rounded-full border-2 border-white shadow-lg \".concat(getPriorityStyle(project.priority)),\n title: \"Priority: \".concat(priorityLabel(project.priority)),\n \"aria-label\": \"Priority: \".concat(priorityLabel(project.priority))\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"absolute bottom-4 right-4 flex space-x-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: handleEditProject,\n className: \"p-2 bg-black bg-opacity-50 text-white hover:bg-opacity-70 rounded-full transition-all duration-200 backdrop-blur-sm\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n className: \"h-5 w-5\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return setIsConfirmDialogOpen(true);\n },\n className: \"p-2 bg-black bg-opacity-50 text-white hover:bg-opacity-70 rounded-full transition-all duration-200 backdrop-blur-sm\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n className: \"h-5 w-5\"\n })))), (project.description || project.area || project.due_date_at || project.tags && project.tags.length > 0) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-6 p-4 bg-gray-50 dark:bg-gray-800/50 border border-gray-200 dark:border-gray-700 rounded-lg\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"grid gap-3\"\n }, project.description && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n className: \"h-4 w-4 text-gray-500 dark:text-gray-400 mr-3 mt-0.5 flex-shrink-0\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-sm font-medium text-gray-600 dark:text-gray-400 mr-2\"\n }, \"Description:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-sm text-gray-900 dark:text-gray-100 leading-relaxed mt-1\"\n }, project.description))), project.area && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n className: \"h-4 w-4 text-gray-500 dark:text-gray-400 mr-3\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-sm font-medium text-gray-600 dark:text-gray-400 mr-2\"\n }, \"Area:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-sm text-gray-900 dark:text-gray-100 bg-gray-100 dark:bg-gray-700 px-2 py-1 rounded\"\n }, project.area.name)), project.due_date_at && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n className: \"h-4 w-4 text-gray-500 dark:text-gray-400 mr-3\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-sm font-medium text-gray-600 dark:text-gray-400 mr-2\"\n }, \"Due Date:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-sm text-gray-900 dark:text-gray-100\"\n }, formatProjectDueDate(project.due_date_at))), project.tags && project.tags.length > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"h-4 w-4 text-gray-500 dark:text-gray-400 mr-3 mt-0.5\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"svg\", {\n fill: \"currentColor\",\n viewBox: \"0 0 20 20\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M17.707 9.293a1 1 0 010 1.414l-7 7a1 1 0 01-1.414 0l-7-7A.997.997 0 012 10V5a3 3 0 013-3h5c.256 0 .512.098.707.293l7 7zM5 6a1 1 0 100-2 1 1 0 000 2z\",\n clipRule: \"evenodd\"\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-sm font-medium text-gray-600 dark:text-gray-400 mr-2\"\n }, \"Tags:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex flex-wrap gap-1 mt-1\"\n }, project.tags.map(function (tag, index) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n key: index,\n onClick: function onClick() {\n return navigate(\"/tag/\".concat(tag.id));\n },\n className: \"inline-block px-2 py-1 text-xs bg-blue-100 dark:bg-blue-900/30 text-blue-800 dark:text-blue-200 rounded-full cursor-pointer hover:bg-blue-200 dark:hover:bg-blue-900/50 transition-colors\"\n }, tag.name);\n })))))), !project.image_url && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between mb-8\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n className: \"h-6 w-6 text-gray-500 mr-3\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h2\", {\n className: \"text-2xl font-light text-gray-900 dark:text-gray-100 mr-2\"\n }, project.name), project.priority !== undefined && project.priority !== null && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-4 h-4 rounded-full border-2 border-white dark:border-gray-800 \".concat(getPriorityStyle(project.priority)),\n title: \"Priority: \".concat(priorityLabel(project.priority)),\n \"aria-label\": \"Priority: \".concat(priorityLabel(project.priority))\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex space-x-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: handleEditProject,\n className: \"text-gray-500 hover:text-blue-700 dark:hover:text-blue-300 focus:outline-none\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n className: \"h-5 w-5\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return setIsConfirmDialogOpen(true);\n },\n className: \"text-gray-500 hover:text-red-700 dark:hover:text-red-300 focus:outline-none\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n className: \"h-5 w-5\"\n })))), !showAutoSuggestForm && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-lg font-medium text-gray-900 dark:text-gray-100\"\n }, t('sidebar.tasks', 'Tasks')), completedTasks.length > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"flex items-center space-x-2 cursor-pointer\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-sm text-gray-600 dark:text-gray-400\"\n }, \"Show completed\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"relative flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n checked: showCompleted,\n onChange: function onChange(e) {\n return setShowCompleted(e.target.checked);\n },\n className: \"sr-only\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-10 h-5 rounded-full transition-colors \".concat(showCompleted ? 'bg-blue-500' : 'bg-gray-300 dark:bg-gray-600')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-4 h-4 bg-white rounded-full shadow-md transform transition-transform duration-200 ease-in-out \".concat(showCompleted ? 'translate-x-5' : 'translate-x-0.5', \" translate-y-0.5\")\n }))))), !showAutoSuggestForm && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Task_NewTask__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n onTaskCreate: handleTaskCreate\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mt-2\"\n }, displayTasks.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Task_TaskList__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n tasks: displayTasks,\n onTaskUpdate: handleTaskUpdate,\n onTaskDelete: handleTaskDelete,\n projects: project ? [project] : [],\n hideProjectName: true,\n onToggleToday: handleToggleToday\n }) : showAutoSuggestForm ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_AutoSuggestNextActionBox__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onAddAction: function onAddAction(actionDescription) {\n if (project !== null && project !== void 0 && project.id) {\n handleCreateNextAction(project.id, actionDescription);\n }\n },\n onDismiss: handleSkipNextAction,\n projectName: (project === null || project === void 0 ? void 0 : project.name) || \"\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-gray-500 dark:text-gray-400\"\n }, \"No tasks.\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Project_ProjectModal__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n isOpen: isModalOpen,\n onClose: function onClose() {\n return setIsModalOpen(false);\n },\n onSave: handleSaveProject,\n project: project,\n areas: areas\n }), isConfirmDialogOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Shared_ConfirmDialog__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n title: \"Delete Project\",\n message: \"Are you sure you want to delete the project \\\"\".concat(project.name, \"\\\"?\"),\n onConfirm: handleDeleteProject,\n onCancel: function onCancel() {\n return setIsConfirmDialogOpen(false);\n }\n })));\n};\n_s(ProjectDetails, \"gxqgyxSOnoYNM9owB1G/Rdxoqiw=\", false, function () {\n return [react_router_dom__WEBPACK_IMPORTED_MODULE_14__.useParams, react_router_dom__WEBPACK_IMPORTED_MODULE_14__.useNavigate, react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation, _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_2__.useToast, _store_useStore__WEBPACK_IMPORTED_MODULE_6__.useStore];\n});\n_c = ProjectDetails;\nvar priorityLabel = function priorityLabel(priority) {\n // Handle both string and numeric priorities\n var normalizedPriority = typeof priority === 'number' ? ['low', 'medium', 'high'][priority] : priority;\n switch (normalizedPriority) {\n case 'high':\n return 'High';\n case 'medium':\n return 'Medium';\n case 'low':\n return 'Low';\n default:\n return '';\n }\n};\nvar getPriorityStyle = function getPriorityStyle(priority) {\n // Handle both string and numeric priorities\n var normalizedPriority = typeof priority === 'number' ? ['low', 'medium', 'high'][priority] : priority;\n return priorityStyles[normalizedPriority] || priorityStyles[\"default\"];\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ProjectDetails);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"ProjectDetails\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Project/ProjectDetails.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Project/ProjectItem.tsx":
+/*!*****************************************************!*\
+ !*** ./frontend/components/Project/ProjectItem.tsx ***!
+ \*****************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/dist/index.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/EllipsisVerticalIcon.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\n\n\n\n\nvar getProjectInitials = function getProjectInitials(name) {\n var words = name.trim().split(\" \").filter(function (word) {\n return word.length > 0;\n });\n if (words.length === 1) {\n return name.toUpperCase();\n }\n return words.map(function (word) {\n return word[0].toUpperCase();\n }).join(\"\");\n};\nvar ProjectItem = function ProjectItem(_ref) {\n _s();\n var project = _ref.project,\n viewMode = _ref.viewMode,\n color = _ref.color,\n getCompletionPercentage = _ref.getCompletionPercentage,\n activeDropdown = _ref.activeDropdown,\n setActiveDropdown = _ref.setActiveDropdown,\n handleEditProject = _ref.handleEditProject,\n setProjectToDelete = _ref.setProjectToDelete,\n setIsConfirmDialogOpen = _ref.setIsConfirmDialogOpen;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"\".concat(viewMode === \"cards\" ? \"bg-gray-50 dark:bg-gray-900 rounded-lg shadow-md relative flex flex-col\" : \"bg-gray-50 dark:bg-gray-900 rounded-lg shadow-md relative flex flex-row items-center p-4\"),\n style: {\n minHeight: viewMode === \"cards\" ? \"250px\" : \"auto\",\n maxHeight: viewMode === \"cards\" ? \"250px\" : \"auto\"\n }\n }, viewMode === \"cards\" && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-gray-200 dark:bg-gray-700 flex items-center justify-center overflow-hidden rounded-t-lg relative\",\n style: {\n height: \"140px\"\n }\n }, project.image_url ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n src: project.image_url,\n alt: project.name,\n className: \"w-full h-full object-cover\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-2xl font-extrabold text-gray-500 dark:text-gray-400 opacity-20\",\n \"aria-label\": t(\"projectItem.projectInitials\")\n }, getProjectInitials(project.name)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"absolute top-2 left-2 w-3 h-3 rounded-full \".concat(color)\n })), viewMode === \"list\" && project.image_url && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-16 h-16 mr-4 flex-shrink-0\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n src: project.image_url,\n alt: project.name,\n className: \"w-full h-full object-cover rounded-md\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex justify-between items-start \".concat(viewMode === \"cards\" ? \"p-4 flex-1\" : \"flex-1\")\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, viewMode === \"list\" && !project.image_url && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-3 h-3 rounded-full \".concat(color, \" mr-3 flex-shrink-0\")\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__.Link, {\n to: \"/project/\".concat(project.id),\n className: \"\".concat(viewMode === \"cards\" ? \"text-lg font-semibold text-gray-900 dark:text-gray-100 hover:underline line-clamp-2\" : \"text-md font-semibold text-gray-900 dark:text-gray-100 hover:underline\")\n }, project.name)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"relative\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n className: \"text-gray-500 hover:text-gray-700 dark:text-gray-300 dark:hover:text-gray-400 focus:outline-none\",\n onClick: function onClick() {\n var _project$id;\n return setActiveDropdown(activeDropdown === project.id ? null : (_project$id = project.id) !== null && _project$id !== void 0 ? _project$id : null);\n },\n \"aria-label\": t(\"projectItem.toggleDropdownMenu\")\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: \"h-5 w-5\"\n })), activeDropdown === project.id && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"absolute right-0 mt-2 w-28 bg-white dark:bg-gray-700 shadow-lg rounded-md z-10\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return handleEditProject(project);\n },\n className: \"block px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-600 w-full text-left\"\n }, t(\"projectItem.edit\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n setProjectToDelete(project);\n setIsConfirmDialogOpen(true);\n setActiveDropdown(null);\n },\n className: \"block px-4 py-2 text-sm text-red-500 dark:text-red-300 hover:bg-gray-100 dark:hover:bg-gray-600 w-full text-left\"\n }, t(\"projectItem.delete\"))))), viewMode === \"cards\" && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"absolute bottom-4 left-0 right-0 px-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center space-x-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-full bg-gray-200 dark:bg-gray-700 rounded-full h-2\",\n title: t(\"projectItem.completionPercentage\", {\n percentage: getCompletionPercentage()\n })\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-blue-500 h-2 rounded-full\",\n style: {\n width: \"\".concat(getCompletionPercentage(), \"%\")\n }\n })))));\n};\n_s(ProjectItem, \"zlIdU9EjM2llFt74AbE2KsUJXyM=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = ProjectItem;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ProjectItem);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"ProjectItem\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Project/ProjectItem.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Project/ProjectModal.tsx":
+/*!******************************************************!*\
+ !*** ./frontend/components/Project/ProjectModal.tsx ***!
+ \******************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Shared_ConfirmDialog__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Shared/ConfirmDialog */ \"./frontend/components/Shared/ConfirmDialog.tsx\");\n/* harmony import */ var _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Shared/ToastContext */ \"./frontend/components/Shared/ToastContext.tsx\");\n/* harmony import */ var _Tag_TagInput__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Tag/TagInput */ \"./frontend/components/Tag/TagInput.tsx\");\n/* harmony import */ var _Shared_PriorityDropdown__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Shared/PriorityDropdown */ \"./frontend/components/Shared/PriorityDropdown.tsx\");\n/* harmony import */ var _Shared_Switch__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Shared/Switch */ \"./frontend/components/Shared/Switch.tsx\");\n/* harmony import */ var _store_useStore__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../store/useStore */ \"./frontend/store/useStore.ts\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\n\n\nvar ProjectModal = function ProjectModal(_ref) {\n _s();\n var _project$tags;\n var isOpen = _ref.isOpen,\n onClose = _ref.onClose,\n onSave = _ref.onSave,\n onDelete = _ref.onDelete,\n project = _ref.project,\n areas = _ref.areas;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(project || {\n name: \"\",\n description: \"\",\n area_id: null,\n active: true,\n tags: [],\n priority: \"low\",\n due_date_at: \"\",\n image_url: \"\"\n }),\n _useState2 = _slicedToArray(_useState, 2),\n formData = _useState2[0],\n setFormData = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)((project === null || project === void 0 || (_project$tags = project.tags) === null || _project$tags === void 0 ? void 0 : _project$tags.map(function (tag) {\n return tag.name;\n })) || []),\n _useState4 = _slicedToArray(_useState3, 2),\n tags = _useState4[0],\n setTags = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState6 = _slicedToArray(_useState5, 2),\n imageFile = _useState6[0],\n setImageFile = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)((project === null || project === void 0 ? void 0 : project.image_url) || \"\"),\n _useState8 = _slicedToArray(_useState7, 2),\n imagePreview = _useState8[0],\n setImagePreview = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState0 = _slicedToArray(_useState9, 2),\n isUploading = _useState0[0],\n setIsUploading = _useState0[1];\n var _useStore = (0,_store_useStore__WEBPACK_IMPORTED_MODULE_6__.useStore)(),\n tagsStore = _useStore.tagsStore;\n var availableTags = tagsStore.tags,\n loadTags = tagsStore.loadTags;\n var modalRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n var fileInputRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n var _useState1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState10 = _slicedToArray(_useState1, 2),\n isClosing = _useState10[0],\n setIsClosing = _useState10[1];\n var _useState11 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState12 = _slicedToArray(_useState11, 2),\n showConfirmDialog = _useState12[0],\n setShowConfirmDialog = _useState12[1];\n var _useToast = (0,_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_2__.useToast)(),\n showSuccessToast = _useToast.showSuccessToast;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_7__.useTranslation)(),\n t = _useTranslation.t;\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (project) {\n var _project$tags2;\n setFormData(_objectSpread(_objectSpread({}, project), {}, {\n tags: project.tags || [],\n due_date_at: project.due_date_at || \"\",\n image_url: project.image_url || \"\"\n }));\n setTags(((_project$tags2 = project.tags) === null || _project$tags2 === void 0 ? void 0 : _project$tags2.map(function (tag) {\n return tag.name;\n })) || []);\n setImagePreview(project.image_url || \"\");\n } else {\n setFormData({\n name: \"\",\n description: \"\",\n area_id: null,\n active: true,\n tags: [],\n priority: \"low\",\n due_date_at: \"\",\n image_url: \"\"\n });\n setTags([]);\n setImagePreview(\"\");\n }\n setImageFile(null);\n }, [project]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (availableTags.length === 0) {\n loadTags()[\"catch\"](function (error) {\n console.error('Error loading tags:', error);\n });\n }\n }, [availableTags.length, loadTags]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var handleClickOutside = function handleClickOutside(event) {\n if (modalRef.current && !modalRef.current.contains(event.target)) {\n handleClose();\n }\n };\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n return function () {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isOpen]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var handleKeyDown = function handleKeyDown(event) {\n if (event.key === \"Escape\") {\n handleClose();\n }\n };\n if (isOpen) {\n document.addEventListener(\"keydown\", handleKeyDown);\n }\n return function () {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [isOpen]);\n var handleChange = function handleChange(e) {\n var target = e.target;\n var name = target.name,\n type = target.type,\n value = target.value;\n if (type === \"checkbox\") {\n if (target instanceof HTMLInputElement) {\n var checked = target.checked;\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, name, checked));\n });\n }\n } else {\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, name, value));\n });\n }\n };\n var handleTagsChange = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (newTags) {\n setTags(newTags);\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, {\n tags: newTags.map(function (name) {\n return {\n name: name\n };\n })\n });\n });\n }, []);\n var handleImageSelect = function handleImageSelect(e) {\n var _e$target$files;\n var file = (_e$target$files = e.target.files) === null || _e$target$files === void 0 ? void 0 : _e$target$files[0];\n if (file) {\n setImageFile(file);\n\n // Create preview\n var reader = new FileReader();\n reader.onload = function (e) {\n var _e$target;\n setImagePreview((_e$target = e.target) === null || _e$target === void 0 ? void 0 : _e$target.result);\n };\n reader.readAsDataURL(file);\n }\n };\n var handleImageUpload = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var _formData, response, result, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n if (imageFile) {\n _context.n = 1;\n break;\n }\n return _context.a(2, null);\n case 1:\n setIsUploading(true);\n _context.p = 2;\n _formData = new FormData();\n _formData.append('image', imageFile);\n _context.n = 3;\n return fetch('/api/upload/project-image', {\n method: 'POST',\n credentials: 'include',\n body: _formData\n });\n case 3:\n response = _context.v;\n if (response.ok) {\n _context.n = 4;\n break;\n }\n throw new Error('Failed to upload image');\n case 4:\n _context.n = 5;\n return response.json();\n case 5:\n result = _context.v;\n return _context.a(2, result.imageUrl);\n case 6:\n _context.p = 6;\n _t = _context.v;\n console.error('Error uploading image:', _t);\n return _context.a(2, null);\n case 7:\n _context.p = 7;\n setIsUploading(false);\n return _context.f(7);\n case 8:\n return _context.a(2);\n }\n }, _callee, null, [[2, 6, 7, 8]]);\n }));\n return function handleImageUpload() {\n return _ref2.apply(this, arguments);\n };\n }();\n var handleRemoveImage = function handleRemoveImage() {\n setImageFile(null);\n setImagePreview(\"\");\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, {\n image_url: \"\"\n });\n });\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n };\n var handleSubmit = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {\n var imageUrl, uploadedImageUrl, projectData, _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n _context2.p = 0;\n imageUrl = formData.image_url; // Upload image if a new one was selected\n if (!imageFile) {\n _context2.n = 2;\n break;\n }\n _context2.n = 1;\n return handleImageUpload();\n case 1:\n uploadedImageUrl = _context2.v;\n if (uploadedImageUrl) {\n imageUrl = uploadedImageUrl;\n }\n case 2:\n projectData = _objectSpread(_objectSpread({}, formData), {}, {\n image_url: imageUrl,\n tags: tags.map(function (name) {\n return {\n name: name\n };\n })\n }); // Save the project\n onSave(projectData);\n showSuccessToast(project ? \"Project updated successfully!\" : \"Project created successfully!\");\n handleClose();\n _context2.n = 4;\n break;\n case 3:\n _context2.p = 3;\n _t2 = _context2.v;\n console.error('Error saving project:', _t2);\n case 4:\n return _context2.a(2);\n }\n }, _callee2, null, [[0, 3]]);\n }));\n return function handleSubmit() {\n return _ref3.apply(this, arguments);\n };\n }();\n var handleDeleteClick = function handleDeleteClick() {\n setShowConfirmDialog(true);\n };\n var handleDeleteConfirm = function handleDeleteConfirm() {\n if (project && project.id && onDelete) {\n onDelete(project.id);\n showSuccessToast(t('success.projectDeleted'));\n setShowConfirmDialog(false);\n handleClose();\n }\n };\n var handleClose = function handleClose() {\n setIsClosing(true);\n setTimeout(function () {\n onClose();\n setIsClosing(false);\n }, 300);\n };\n var handleToggleActive = function handleToggleActive() {\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, {\n active: !prev.active\n });\n });\n };\n if (!isOpen) return null;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"fixed top-16 left-0 right-0 bottom-0 flex items-start sm:items-center justify-center bg-gray-900 bg-opacity-80 z-40 transition-opacity duration-300 \".concat(isClosing ? \"opacity-0\" : \"opacity-100\")\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n ref: modalRef,\n className: \"bg-white dark:bg-gray-800 sm:rounded-lg sm:shadow-2xl w-full sm:max-w-2xl overflow-hidden transform transition-transform duration-300 \".concat(isClosing ? \"scale-95\" : \"scale-100\", \" flex flex-col\"),\n style: {\n height: \"calc(100vh - 4rem)\",\n maxHeight: \"90vh\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"form\", {\n className: \"flex flex-col h-full\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"fieldset\", {\n className: \"flex flex-col h-full\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-4 space-y-3 flex-1 text-sm overflow-y-auto min-h-0\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"py-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n id: \"projectName\",\n name: \"name\",\n value: formData.name,\n onChange: handleChange,\n required: true,\n className: \"block w-full text-xl font-semibold dark:bg-gray-800 text-black dark:text-white border-b-2 border-gray-200 dark:border-gray-900 focus:outline-none shadow-sm py-2\",\n placeholder: t('project.name', 'Enter project name')\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"pb-3\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-xs font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('forms.description', 'Description')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"textarea\", {\n id: \"projectDescription\",\n name: \"description\",\n rows: 4,\n value: formData.description || \"\",\n onChange: handleChange,\n className: \"block w-full rounded-md shadow-sm p-3 text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 transition duration-150 ease-in-out\",\n placeholder: t('forms.areaDescriptionPlaceholder', 'Enter project description (optional)')\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"pb-3\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-xs font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('project.projectImage', 'Project Image')), imagePreview ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-3\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"relative inline-block\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n src: imagePreview,\n alt: \"Project preview\",\n className: \"w-32 h-20 object-cover rounded-md border border-gray-300 dark:border-gray-600\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: handleRemoveImage,\n className: \"absolute -top-2 -right-2 bg-red-500 text-white rounded-full w-6 h-6 flex items-center justify-center text-xs hover:bg-red-600\"\n }, \"\\xD7\"))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n ref: fileInputRef,\n type: \"file\",\n accept: \"image/*\",\n onChange: handleImageSelect,\n className: \"hidden\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: function onClick() {\n var _fileInputRef$current;\n return (_fileInputRef$current = fileInputRef.current) === null || _fileInputRef$current === void 0 ? void 0 : _fileInputRef$current.click();\n },\n className: \"inline-flex items-center px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm text-sm font-medium text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 transition-colors\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"svg\", {\n className: \"w-4 h-4 mr-2\",\n fill: \"none\",\n stroke: \"currentColor\",\n viewBox: \"0 0 24 24\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: \"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\"\n })), t('project.browseImage', 'Browse Image')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-xs text-gray-500 dark:text-gray-400 mt-1\"\n }, t('project.uploadImageHint', 'Upload an image for your project (max 5MB)'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"pb-3\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-xs font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('forms.dueDate', 'Due Date')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"date\",\n name: \"due_date_at\",\n value: formData.due_date_at || \"\",\n onChange: handleChange,\n className: \"block w-full rounded-md shadow-sm px-3 py-2 text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 transition duration-150 ease-in-out\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"pb-3\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-xs font-medium text-gray-700 dark:text-gray-300 mb-3\"\n }, t('forms.priority', 'Priority')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Shared_PriorityDropdown__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n value: formData.priority || \"medium\",\n onChange: function onChange(value) {\n return setFormData(_objectSpread(_objectSpread({}, formData), {}, {\n priority: value\n }));\n }\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"pb-3\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-xs font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('forms.tags', 'Tags')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-full\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Tag_TagInput__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n onTagsChange: handleTagsChange,\n initialTags: tags,\n availableTags: availableTags\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"pb-3\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-xs font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('common.area', 'Area'), \" (\", t('forms.optional', 'optional'), \")\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"select\", {\n id: \"projectArea\",\n name: \"area_id\",\n value: formData.area_id || \"\",\n onChange: handleChange,\n className: \"block w-full rounded-md shadow-sm px-3 py-2 text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 transition duration-150 ease-in-out\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"\"\n }, t('common.none', 'No Area')), areas.map(function (area) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n key: area.id,\n value: area.id\n }, area.name);\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Shared_Switch__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n isChecked: formData.active,\n onToggle: handleToggleActive\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: \"active\",\n className: \"ml-2 block text-sm text-gray-700 dark:text-gray-300\"\n }, t('projects.active', 'Active')))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-3 flex-shrink-0 border-t border-gray-200 dark:border-gray-700 flex justify-end space-x-2\"\n }, project && onDelete && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: handleDeleteClick,\n className: \"px-4 py-2 bg-red-600 text-white rounded-md hover:bg-red-700 dark:bg-red-500 dark:hover:bg-red-600 focus:outline-none transition duration-150 ease-in-out\"\n }, t('common.delete', 'Delete')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: handleClose,\n className: \"px-4 py-2 bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-200 rounded-md hover:bg-gray-300 dark:hover:bg-gray-600 focus:outline-none transition duration-150 ease-in-out\"\n }, t('common.cancel', 'Cancel')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: handleSubmit,\n disabled: isUploading,\n className: \"px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 dark:bg-blue-500 dark:hover:bg-blue-600 focus:outline-none transition duration-150 ease-in-out disabled:opacity-50 disabled:cursor-not-allowed\"\n }, isUploading ? 'Uploading...' : project ? t('modals.updateProject', 'Update Project') : t('modals.createProject', 'Create Project'))))))), showConfirmDialog && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Shared_ConfirmDialog__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n title: \"Delete Project\",\n message: \"Are you sure you want to delete this project? This action cannot be undone.\",\n onConfirm: handleDeleteConfirm,\n onCancel: function onCancel() {\n return setShowConfirmDialog(false);\n }\n }));\n};\n_s(ProjectModal, \"Pae7+OFE4FCzTwCJa2j5udioYAU=\", false, function () {\n return [_store_useStore__WEBPACK_IMPORTED_MODULE_6__.useStore, _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_2__.useToast, react_i18next__WEBPACK_IMPORTED_MODULE_7__.useTranslation];\n});\n_c = ProjectModal;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ProjectModal);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"ProjectModal\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Project/ProjectModal.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Projects.tsx":
+/*!******************************************!*\
+ !*** ./frontend/components/Projects.tsx ***!
+ \******************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/FolderIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/Squares2X2Icon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/Bars3Icon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/MagnifyingGlassIcon.js\");\n/* harmony import */ var _Shared_ConfirmDialog__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Shared/ConfirmDialog */ \"./frontend/components/Shared/ConfirmDialog.tsx\");\n/* harmony import */ var _Project_ProjectModal__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Project/ProjectModal */ \"./frontend/components/Project/ProjectModal.tsx\");\n/* harmony import */ var _store_useStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../store/useStore */ \"./frontend/store/useStore.ts\");\n/* harmony import */ var _utils_projectsService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/projectsService */ \"./frontend/utils/projectsService.ts\");\n/* harmony import */ var _utils_areasService__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/areasService */ \"./frontend/utils/areasService.ts\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/dist/index.js\");\n/* harmony import */ var _Project_ProjectItem__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Project/ProjectItem */ \"./frontend/components/Project/ProjectItem.tsx\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\n\n\n\n\nvar getPriorityStyles = function getPriorityStyles(priority) {\n switch (priority) {\n case \"low\":\n return {\n color: \"bg-green-500\"\n };\n case \"medium\":\n return {\n color: \"bg-yellow-500\"\n };\n case \"high\":\n return {\n color: \"bg-red-500\"\n };\n default:\n return {\n color: \"bg-gray-500\"\n };\n }\n};\nvar Projects = function Projects() {\n _s();\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_6__.useTranslation)(),\n t = _useTranslation.t;\n var _useStore = (0,_store_useStore__WEBPACK_IMPORTED_MODULE_3__.useStore)(function (state) {\n return state.areasStore;\n }),\n areas = _useStore.areas,\n setAreas = _useStore.setAreas,\n setAreasLoading = _useStore.setLoading,\n setAreasError = _useStore.setError;\n var _useStore2 = (0,_store_useStore__WEBPACK_IMPORTED_MODULE_3__.useStore)(function (state) {\n return state.projectsStore;\n }),\n setProjectsLoading = _useStore2.setLoading,\n setProjectsError = _useStore2.setError;\n var _useStore3 = (0,_store_useStore__WEBPACK_IMPORTED_MODULE_3__.useStore)(function (state) {\n return state.projectsStore;\n }),\n isLoading = _useStore3.isLoading,\n isError = _useStore3.isError;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({}),\n _useState2 = _slicedToArray(_useState, 2),\n groupedProjects = _useState2[0],\n setGroupedProjects = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState4 = _slicedToArray(_useState3, 2),\n isProjectModalOpen = _useState4[0],\n setIsProjectModalOpen = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState6 = _slicedToArray(_useState5, 2),\n projectToEdit = _useState6[0],\n setProjectToEdit = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState8 = _slicedToArray(_useState7, 2),\n projectToDelete = _useState8[0],\n setProjectToDelete = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState0 = _slicedToArray(_useState9, 2),\n isConfirmDialogOpen = _useState0[0],\n setIsConfirmDialogOpen = _useState0[1];\n var _useState1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState10 = _slicedToArray(_useState1, 2),\n activeDropdown = _useState10[0],\n setActiveDropdown = _useState10[1];\n var _useState11 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\"),\n _useState12 = _slicedToArray(_useState11, 2),\n searchQuery = _useState12[0],\n setSearchQuery = _useState12[1];\n var _useState13 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"cards\"),\n _useState14 = _slicedToArray(_useState13, 2),\n viewMode = _useState14[0],\n setViewMode = _useState14[1];\n var _useSearchParams = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_8__.useSearchParams)(),\n _useSearchParams2 = _slicedToArray(_useSearchParams, 2),\n searchParams = _useSearchParams2[0],\n setSearchParams = _useSearchParams2[1];\n var activeFilter = searchParams.get(\"active\") || \"all\";\n var areaFilter = searchParams.get(\"area_id\") || \"\";\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var loadAreas = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var areasData, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n _context.p = 0;\n _context.n = 1;\n return (0,_utils_areasService__WEBPACK_IMPORTED_MODULE_5__.fetchAreas)();\n case 1:\n areasData = _context.v;\n setAreas(areasData);\n _context.n = 3;\n break;\n case 2:\n _context.p = 2;\n _t = _context.v;\n console.error(\"Failed to fetch areas:\", _t);\n setAreasError(true);\n case 3:\n return _context.a(2);\n }\n }, _callee, null, [[0, 2]]);\n }));\n return function loadAreas() {\n return _ref.apply(this, arguments);\n };\n }();\n loadAreas();\n }, []);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var loadProjects = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {\n var groupedProjectsData, _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n _context2.p = 0;\n _context2.n = 1;\n return (0,_utils_projectsService__WEBPACK_IMPORTED_MODULE_4__.fetchGroupedProjects)(activeFilter, areaFilter);\n case 1:\n groupedProjectsData = _context2.v;\n setGroupedProjects(groupedProjectsData);\n _context2.n = 3;\n break;\n case 2:\n _context2.p = 2;\n _t2 = _context2.v;\n console.error(\"Failed to fetch projects:\", _t2);\n setProjectsError(true);\n case 3:\n return _context2.a(2);\n }\n }, _callee2, null, [[0, 2]]);\n }));\n return function loadProjects() {\n return _ref2.apply(this, arguments);\n };\n }();\n loadProjects();\n }, [activeFilter, areaFilter]);\n var handleSaveProject = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(project) {\n var groupedProjectsData, _t3;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n setProjectsLoading(true);\n _context3.p = 1;\n if (!project.id) {\n _context3.n = 3;\n break;\n }\n _context3.n = 2;\n return (0,_utils_projectsService__WEBPACK_IMPORTED_MODULE_4__.updateProject)(project.id, project);\n case 2:\n _context3.n = 4;\n break;\n case 3:\n _context3.n = 4;\n return (0,_utils_projectsService__WEBPACK_IMPORTED_MODULE_4__.createProject)(project);\n case 4:\n _context3.n = 5;\n return (0,_utils_projectsService__WEBPACK_IMPORTED_MODULE_4__.fetchGroupedProjects)(activeFilter, areaFilter);\n case 5:\n groupedProjectsData = _context3.v;\n setGroupedProjects(groupedProjectsData);\n _context3.n = 7;\n break;\n case 6:\n _context3.p = 6;\n _t3 = _context3.v;\n console.error(\"Error saving project:\", _t3);\n setProjectsError(true);\n case 7:\n _context3.p = 7;\n setProjectsLoading(false);\n setIsProjectModalOpen(false);\n return _context3.f(7);\n case 8:\n return _context3.a(2);\n }\n }, _callee3, null, [[1, 6, 7, 8]]);\n }));\n return function handleSaveProject(_x) {\n return _ref3.apply(this, arguments);\n };\n }();\n var handleEditProject = function handleEditProject(project) {\n setProjectToEdit(project);\n setIsProjectModalOpen(true);\n };\n var handleDeleteProject = /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {\n var groupedProjectsData, _t4;\n return _regenerator().w(function (_context4) {\n while (1) switch (_context4.n) {\n case 0:\n if (projectToDelete) {\n _context4.n = 1;\n break;\n }\n return _context4.a(2);\n case 1:\n _context4.p = 1;\n if (!(projectToDelete.id !== undefined)) {\n _context4.n = 4;\n break;\n }\n setProjectsLoading(true);\n _context4.n = 2;\n return (0,_utils_projectsService__WEBPACK_IMPORTED_MODULE_4__.deleteProject)(projectToDelete.id);\n case 2:\n _context4.n = 3;\n return (0,_utils_projectsService__WEBPACK_IMPORTED_MODULE_4__.fetchGroupedProjects)(activeFilter, areaFilter);\n case 3:\n groupedProjectsData = _context4.v;\n setGroupedProjects(groupedProjectsData);\n _context4.n = 5;\n break;\n case 4:\n console.error(\"Cannot delete project: ID is undefined.\");\n case 5:\n _context4.n = 7;\n break;\n case 6:\n _context4.p = 6;\n _t4 = _context4.v;\n console.error(\"Error deleting project:\", _t4);\n setProjectsError(true);\n case 7:\n _context4.p = 7;\n setProjectsLoading(false);\n setIsConfirmDialogOpen(false);\n setProjectToDelete(null);\n return _context4.f(7);\n case 8:\n return _context4.a(2);\n }\n }, _callee4, null, [[1, 6, 7, 8]]);\n }));\n return function handleDeleteProject() {\n return _ref4.apply(this, arguments);\n };\n }();\n var _getCompletionPercentage = function getCompletionPercentage(project) {\n // Now the completion percentage comes directly from the backend\n return project.completion_percentage || 0;\n };\n var handleActiveFilterChange = function handleActiveFilterChange(e) {\n var newActiveFilter = e.target.value;\n var params = new URLSearchParams(searchParams);\n if (newActiveFilter === \"all\") {\n params[\"delete\"](\"active\");\n } else {\n params.set(\"active\", newActiveFilter);\n }\n setSearchParams(params);\n };\n var handleAreaFilterChange = function handleAreaFilterChange(e) {\n var newAreaFilter = e.target.value;\n var params = new URLSearchParams(searchParams);\n if (newAreaFilter === \"\") {\n params[\"delete\"](\"area_id\");\n } else {\n params.set(\"area_id\", newAreaFilter);\n }\n setSearchParams(params);\n };\n\n // Apply search filter to the grouped projects from backend\n var searchFilteredGroupedProjects = Object.keys(groupedProjects).reduce(function (acc, areaName) {\n var projectsInArea = groupedProjects[areaName];\n\n // Defensive check: ensure projectsInArea is an array\n if (!Array.isArray(projectsInArea)) {\n console.warn(\"Projects for area \\\"\".concat(areaName, \"\\\" is not an array:\"), projectsInArea);\n return acc;\n }\n var filteredProjects = projectsInArea.filter(function (project) {\n return project.name.toLowerCase().includes(searchQuery.toLowerCase());\n });\n if (filteredProjects.length > 0) {\n acc[areaName] = filteredProjects;\n }\n return acc;\n }, {});\n if (isLoading) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-center h-screen bg-gray-100 dark:bg-gray-900\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-xl font-semibold text-gray-700 dark:text-gray-200\"\n }, t('projects.loading')));\n }\n if (isError) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-center h-screen bg-gray-100 dark:bg-gray-900\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-red-500 text-lg\"\n }, t('projects.error')));\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex justify-center px-4 lg:px-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-full max-w-6xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center mb-8\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n className: \"h-6 w-6 text-gray-500 mr-2\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h2\", {\n className: \"text-2xl font-light text-gray-900 dark:text-gray-100\"\n }, t('projects.title'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex flex-col md:flex-row md:items-center justify-between mb-6 space-y-4 md:space-y-0\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center space-x-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return setViewMode(\"cards\");\n },\n className: \"p-2 rounded-md focus:outline-none \".concat(viewMode === \"cards\" ? \"bg-blue-500 text-white\" : \"bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300\"),\n \"aria-label\": t(\"projects.cardViewAriaLabel\")\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n className: \"h-5 w-5\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return setViewMode(\"list\");\n },\n className: \"p-2 rounded-md focus:outline-none \".concat(viewMode === \"list\" ? \"bg-blue-500 text-white\" : \"bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300\"),\n \"aria-label\": t(\"projects.listViewAriaLabel\")\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n className: \"h-5 w-5\"\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex flex-col md:flex-row md:items-center md:space-x-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-full md:w-auto\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: \"activeFilter\",\n className: \"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\"\n }, t('common.status')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"select\", {\n id: \"activeFilter\",\n value: activeFilter,\n onChange: handleActiveFilterChange,\n className: \"block w-full p-2 border border-gray-300 dark:border-gray-700 bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"true\"\n }, t('projects.filters.active')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"false\"\n }, t('projects.filters.inactive')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"all\"\n }, t('projects.filters.all')))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-full md:w-auto\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: \"areaFilter\",\n className: \"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\"\n }, t('common.area')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"select\", {\n id: \"areaFilter\",\n value: areaFilter,\n onChange: handleAreaFilterChange,\n className: \"block w-full p-2 border border-gray-300 dark:border-gray-700 bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"\"\n }, t('projects.filters.allAreas')), areas.map(function (area) {\n var _area$id;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n key: area.id,\n value: (_area$id = area.id) === null || _area$id === void 0 ? void 0 : _area$id.toString()\n }, area.name);\n }))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm p-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n className: \"h-5 w-5 text-gray-500 dark:text-gray-400 mr-2\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n placeholder: t('projects.searchPlaceholder'),\n value: searchQuery,\n onChange: function onChange(e) {\n return setSearchQuery(e.target.value);\n },\n className: \"w-full bg-transparent border-none focus:ring-0 focus:outline-none dark:text-white\"\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"\".concat(viewMode === \"cards\" ? \"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\" : \"flex flex-col space-y-1\")\n }, Object.keys(searchFilteredGroupedProjects).length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-gray-700 dark:text-gray-300\"\n }, t('projects.noProjectsFound')) : Object.keys(searchFilteredGroupedProjects).map(function (areaName) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: areaName\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"\".concat(viewMode === \"cards\" ? \"col-span-full text-md uppercase font-light text-gray-800 dark:text-gray-200 mb-2 mt-6\" : \"text-lg font-semibold text-gray-800 dark:text-gray-200 mb-3 mt-6 border-b border-gray-300 dark:border-gray-600 pb-2\")\n }, areaName), searchFilteredGroupedProjects[areaName].map(function (project) {\n var _getPriorityStyles = getPriorityStyles(project.priority || \"low\"),\n color = _getPriorityStyles.color;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Project_ProjectItem__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n key: project.id,\n project: project,\n viewMode: viewMode,\n color: color,\n getCompletionPercentage: function getCompletionPercentage() {\n return _getCompletionPercentage(project);\n },\n activeDropdown: activeDropdown,\n setActiveDropdown: setActiveDropdown,\n handleEditProject: handleEditProject,\n setProjectToDelete: setProjectToDelete,\n setIsConfirmDialogOpen: setIsConfirmDialogOpen\n });\n }));\n }))), isProjectModalOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Project_ProjectModal__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n isOpen: isProjectModalOpen,\n onClose: function onClose() {\n setIsProjectModalOpen(false);\n setProjectToEdit(null);\n },\n onSave: handleSaveProject,\n project: projectToEdit || undefined,\n areas: areas\n }), isConfirmDialogOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Shared_ConfirmDialog__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n title: t('modals.deleteProject.title'),\n message: t('modals.deleteProject.message', {\n projectName: projectToDelete === null || projectToDelete === void 0 ? void 0 : projectToDelete.name\n }),\n onConfirm: handleDeleteProject,\n onCancel: function onCancel() {\n return setIsConfirmDialogOpen(false);\n }\n }));\n};\n_s(Projects, \"YFBvF/C0nP6Ansaq6f+UE3LQboE=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_6__.useTranslation, _store_useStore__WEBPACK_IMPORTED_MODULE_3__.useStore, _store_useStore__WEBPACK_IMPORTED_MODULE_3__.useStore, _store_useStore__WEBPACK_IMPORTED_MODULE_3__.useStore, react_router_dom__WEBPACK_IMPORTED_MODULE_8__.useSearchParams];\n});\n_c = Projects;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Projects);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"Projects\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Projects.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Shared/CollapsibleSection.tsx":
+/*!***********************************************************!*\
+ !*** ./frontend/components/Shared/CollapsibleSection.tsx ***!
+ \***********************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ChevronDownIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ChevronRightIcon.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\n\n\nvar CollapsibleSection = function CollapsibleSection(_ref) {\n var title = _ref.title,\n isExpanded = _ref.isExpanded,\n onToggle = _ref.onToggle,\n children = _ref.children,\n _ref$className = _ref.className,\n className = _ref$className === void 0 ? \"\" : _ref$className;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"border-b border-gray-200 dark:border-gray-700 \".concat(className)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: onToggle,\n className: \"w-full px-4 py-3 flex items-center justify-between text-left hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-sm font-medium text-gray-900 dark:text-gray-100\"\n }, title), isExpanded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n className: \"h-4 w-4 text-gray-500\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n className: \"h-4 w-4 text-gray-500\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"transition-all duration-300 ease-in-out \".concat(isExpanded ? 'max-h-[500px] opacity-100' : 'max-h-0 opacity-0 overflow-hidden')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"px-4 pb-4\"\n }, children)));\n};\n_c = CollapsibleSection;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CollapsibleSection);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"CollapsibleSection\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Shared/CollapsibleSection.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Shared/ConfirmDialog.tsx":
+/*!******************************************************!*\
+ !*** ./frontend/components/Shared/ConfirmDialog.tsx ***!
+ \******************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\n\n\nvar ConfirmDialog = function ConfirmDialog(_ref) {\n _s();\n var title = _ref.title,\n message = _ref.message,\n onConfirm = _ref.onConfirm,\n onCancel = _ref.onCancel;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"fixed inset-0 flex items-center justify-center bg-black bg-opacity-50 z-50\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-white dark:bg-gray-800 p-8 rounded-lg shadow-xl w-full max-w-lg mx-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-xl font-semibold mb-4 text-gray-900 dark:text-white\"\n }, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-gray-700 dark:text-gray-300 mb-8\"\n }, message), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex justify-end space-x-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: onCancel,\n className: \"px-4 py-2 bg-gray-300 text-gray-700 rounded hover:bg-gray-400 focus:outline-none\"\n }, t('common.cancel', 'Cancel')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: onConfirm,\n className: \"px-4 py-2 bg-red-500 text-white rounded hover:bg-red-600 focus:outline-none\"\n }, t('common.delete', 'Delete')))));\n};\n_s(ConfirmDialog, \"zlIdU9EjM2llFt74AbE2KsUJXyM=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = ConfirmDialog;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ConfirmDialog);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"ConfirmDialog\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Shared/ConfirmDialog.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Shared/LoadingScreen.tsx":
+/*!******************************************************!*\
+ !*** ./frontend/components/Shared/LoadingScreen.tsx ***!
+ \******************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\n\nvar LoadingScreen = function LoadingScreen() {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex h-screen w-screen items-center justify-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-lg\"\n }, \"Loading application... Please wait.\"));\n};\n_c = LoadingScreen;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LoadingScreen);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"LoadingScreen\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Shared/LoadingScreen.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Shared/MarkdownRenderer.tsx":
+/*!*********************************************************!*\
+ !*** ./frontend/components/Shared/MarkdownRenderer.tsx ***!
+ \*********************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_markdown__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-markdown */ \"./node_modules/react-markdown/lib/index.js\");\n/* harmony import */ var remark_gfm__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! remark-gfm */ \"./node_modules/remark-gfm/lib/index.js\");\n/* harmony import */ var rehype_highlight__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! rehype-highlight */ \"./node_modules/rehype-highlight/lib/index.js\");\n/* harmony import */ var highlight_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! highlight.js */ \"./node_modules/highlight.js/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nvar _excluded = [\"className\", \"children\"];\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\nfunction _objectDestructuringEmpty(t) { if (null == t) throw new TypeError(\"Cannot destructure \" + t); }\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n\n\n\n\n\nvar MarkdownRenderer = function MarkdownRenderer(_ref) {\n _s();\n var content = _ref.content,\n _ref$className = _ref.className,\n className = _ref$className === void 0 ? '' : _ref$className;\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n // Configure highlight.js\n highlight_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"].configure({\n languages: ['javascript', 'typescript', 'python', 'java', 'css', 'html', 'json', 'bash', 'sql', 'yaml', 'xml', 'dockerfile', 'nginx', 'apache']\n });\n\n // Manual highlighting for any missed code blocks\n var timer = setTimeout(function () {\n var codeBlocks = document.querySelectorAll('pre code:not(.hljs)');\n codeBlocks.forEach(function (block) {\n highlight_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"].highlightElement(block);\n });\n }, 100);\n return function () {\n return clearTimeout(timer);\n };\n }, [content]);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"markdown-content \".concat(className)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_markdown__WEBPACK_IMPORTED_MODULE_2__.Markdown, {\n remarkPlugins: [remark_gfm__WEBPACK_IMPORTED_MODULE_3__[\"default\"]],\n rehypePlugins: [[rehype_highlight__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n detect: true,\n ignoreMissing: true\n }]],\n components: {\n // Customize heading styles\n h1: function h1(_ref2) {\n var props = _extends({}, (_objectDestructuringEmpty(_ref2), _ref2));\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h1\", _extends({\n className: \"text-3xl font-bold mb-4 text-gray-900 dark:text-gray-100\"\n }, props));\n },\n h2: function h2(_ref3) {\n var props = _extends({}, (_objectDestructuringEmpty(_ref3), _ref3));\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h2\", _extends({\n className: \"text-2xl font-semibold mb-3 text-gray-900 dark:text-gray-100\"\n }, props));\n },\n h3: function h3(_ref4) {\n var props = _extends({}, (_objectDestructuringEmpty(_ref4), _ref4));\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", _extends({\n className: \"text-xl font-medium mb-2 text-gray-900 dark:text-gray-100\"\n }, props));\n },\n h4: function h4(_ref5) {\n var props = _extends({}, (_objectDestructuringEmpty(_ref5), _ref5));\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h4\", _extends({\n className: \"text-lg font-medium mb-2 text-gray-900 dark:text-gray-100\"\n }, props));\n },\n h5: function h5(_ref6) {\n var props = _extends({}, (_objectDestructuringEmpty(_ref6), _ref6));\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h5\", _extends({\n className: \"text-base font-medium mb-2 text-gray-900 dark:text-gray-100\"\n }, props));\n },\n h6: function h6(_ref7) {\n var props = _extends({}, (_objectDestructuringEmpty(_ref7), _ref7));\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h6\", _extends({\n className: \"text-sm font-medium mb-2 text-gray-900 dark:text-gray-100\"\n }, props));\n },\n // Customize paragraph styles\n p: function p(_ref8) {\n var props = _extends({}, (_objectDestructuringEmpty(_ref8), _ref8));\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", _extends({\n className: \"mb-3 text-gray-700 dark:text-gray-300 leading-relaxed\"\n }, props));\n },\n // Customize list styles\n ul: function ul(_ref9) {\n var props = _extends({}, (_objectDestructuringEmpty(_ref9), _ref9));\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"ul\", _extends({\n className: \"mb-3 list-disc list-inside space-y-1 text-gray-700 dark:text-gray-300\"\n }, props));\n },\n ol: function ol(_ref0) {\n var props = _extends({}, (_objectDestructuringEmpty(_ref0), _ref0));\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"ol\", _extends({\n className: \"mb-3 list-decimal list-inside space-y-1 text-gray-700 dark:text-gray-300\"\n }, props));\n },\n li: function li(_ref1) {\n var props = _extends({}, (_objectDestructuringEmpty(_ref1), _ref1));\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"li\", _extends({\n className: \"ml-4\"\n }, props));\n },\n // Customize link styles\n a: function a(_ref10) {\n var props = _extends({}, (_objectDestructuringEmpty(_ref10), _ref10));\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", _extends({\n className: \"text-blue-600 dark:text-blue-400 hover:underline\"\n }, props));\n },\n // Customize code styles\n code: function code(_ref11) {\n var className = _ref11.className,\n children = _ref11.children,\n props = _objectWithoutProperties(_ref11, _excluded);\n // Check if this is a code block (has language class) or inline code\n var isCodeBlock = className && className.startsWith('language-');\n if (isCodeBlock) {\n // This is a code block - add hljs class to ensure our styles apply\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"code\", _extends({\n className: \"\".concat(className, \" hljs\")\n }, props), children);\n } else {\n var _node;\n // This is inline code - apply our custom styling\n // Check if parent is a pre element - if so, this might be a code block without language\n var parentIsPre = ((_node = props.node) === null || _node === void 0 || (_node = _node.parent) === null || _node === void 0 ? void 0 : _node.tagName) === 'pre';\n if (parentIsPre) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"code\", _extends({\n className: \"hljs\"\n }, props), children);\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"code\", _extends({\n className: \"px-1 py-0.5 bg-gray-100 dark:bg-gray-800 rounded text-sm font-mono text-gray-900 dark:text-gray-100\"\n }, props), children);\n }\n },\n pre: function pre(_ref12) {\n var props = _extends({}, (_objectDestructuringEmpty(_ref12), _ref12));\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"pre\", _extends({\n className: \"mb-4 rounded-lg overflow-x-auto\"\n }, props));\n },\n // Customize blockquote styles\n blockquote: function blockquote(_ref13) {\n var props = _extends({}, (_objectDestructuringEmpty(_ref13), _ref13));\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"blockquote\", _extends({\n className: \"mb-4 pl-4 border-l-4 border-gray-300 dark:border-gray-600 italic text-gray-600 dark:text-gray-400\"\n }, props));\n },\n // Customize table styles\n table: function table(_ref14) {\n var props = _extends({}, (_objectDestructuringEmpty(_ref14), _ref14));\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"table\", _extends({\n className: \"mb-4 w-full border-collapse border border-gray-300 dark:border-gray-600\"\n }, props));\n },\n thead: function thead(_ref15) {\n var props = _extends({}, (_objectDestructuringEmpty(_ref15), _ref15));\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"thead\", _extends({\n className: \"bg-gray-100 dark:bg-gray-800\"\n }, props));\n },\n th: function th(_ref16) {\n var props = _extends({}, (_objectDestructuringEmpty(_ref16), _ref16));\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"th\", _extends({\n className: \"border border-gray-300 dark:border-gray-600 px-3 py-2 text-left font-semibold text-gray-900 dark:text-gray-100\"\n }, props));\n },\n td: function td(_ref17) {\n var props = _extends({}, (_objectDestructuringEmpty(_ref17), _ref17));\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"td\", _extends({\n className: \"border border-gray-300 dark:border-gray-600 px-3 py-2 text-gray-700 dark:text-gray-300\"\n }, props));\n },\n // Customize horizontal rule\n hr: function hr(_ref18) {\n var props = _extends({}, (_objectDestructuringEmpty(_ref18), _ref18));\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"hr\", _extends({\n className: \"my-6 border-gray-300 dark:border-gray-600\"\n }, props));\n },\n // Customize strong/bold text\n strong: function strong(_ref19) {\n var props = _extends({}, (_objectDestructuringEmpty(_ref19), _ref19));\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"strong\", _extends({\n className: \"font-semibold text-gray-900 dark:text-gray-100\"\n }, props));\n },\n // Customize italic text\n em: function em(_ref20) {\n var props = _extends({}, (_objectDestructuringEmpty(_ref20), _ref20));\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"em\", _extends({\n className: \"italic text-gray-700 dark:text-gray-300\"\n }, props));\n }\n }\n }, content));\n};\n_s(MarkdownRenderer, \"OD7bBpZva5O2jO+Puf00hKivP7c=\");\n_c = MarkdownRenderer;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MarkdownRenderer);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"MarkdownRenderer\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Shared/MarkdownRenderer.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Shared/NotFound.tsx":
+/*!*************************************************!*\
+ !*** ./frontend/components/Shared/NotFound.tsx ***!
+ \*************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\n\nvar NotFound = function NotFound() {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h1\", null, \"404 - Page Not Found\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, \"The page you're looking for doesn't exist.\"));\n};\n_c = NotFound;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NotFound);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"NotFound\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Shared/NotFound.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Shared/PomodoroTimer.tsx":
+/*!******************************************************!*\
+ !*** ./frontend/components/Shared/PomodoroTimer.tsx ***!
+ \******************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/PauseIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/PlayIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ArrowPathIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/XMarkIcon.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\nvar POMODORO_STORAGE_KEY = 'tududi_pomodoro_timer';\nvar DEFAULT_TIME = 25 * 60; // 25 minutes in seconds\n\nvar PomodoroTimer = function PomodoroTimer(_ref) {\n _s();\n var _ref$className = _ref.className,\n className = _ref$className === void 0 ? '' : _ref$className;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState2 = _slicedToArray(_useState, 2),\n isActive = _useState2[0],\n setIsActive = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(DEFAULT_TIME),\n _useState4 = _slicedToArray(_useState3, 2),\n timeLeft = _useState4[0],\n setTimeLeft = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState6 = _slicedToArray(_useState5, 2),\n isRunning = _useState6[0],\n setIsRunning = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState8 = _slicedToArray(_useState7, 2),\n showCompletionMessage = _useState8[0],\n setShowCompletionMessage = _useState8[1];\n var intervalRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n\n // Load state from localStorage on mount\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var savedState = localStorage.getItem(POMODORO_STORAGE_KEY);\n if (savedState) {\n try {\n var state = JSON.parse(savedState);\n if (state.isActive) {\n setIsActive(true);\n setTimeLeft(state.timeLeft);\n setIsRunning(state.isRunning);\n\n // If timer was running, calculate how much time has passed\n if (state.isRunning && state.startTime) {\n var elapsed = Math.floor((Date.now() - state.startTime) / 1000);\n var newTimeLeft = Math.max(0, state.timeLeft - elapsed);\n setTimeLeft(newTimeLeft);\n if (newTimeLeft > 0) {\n setIsRunning(true);\n } else {\n setIsRunning(false);\n }\n }\n }\n } catch (error) {\n console.error('Failed to load pomodoro state:', error);\n }\n }\n }, []);\n\n // Save state to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var state = {\n isActive: isActive,\n timeLeft: timeLeft,\n isRunning: isRunning,\n startTime: isRunning ? Date.now() - (DEFAULT_TIME - timeLeft) * 1000 : undefined\n };\n localStorage.setItem(POMODORO_STORAGE_KEY, JSON.stringify(state));\n }, [isActive, timeLeft, isRunning]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (isRunning && timeLeft > 0) {\n intervalRef.current = setInterval(function () {\n setTimeLeft(function (prev) {\n if (prev <= 1) {\n setIsRunning(false);\n setShowCompletionMessage(true);\n return 0;\n }\n return prev - 1;\n });\n }, 1000);\n } else {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n }\n return function () {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n }\n };\n }, [isRunning, timeLeft]);\n var formatTime = function formatTime(seconds) {\n var mins = Math.floor(seconds / 60);\n var secs = seconds % 60;\n return \"\".concat(mins.toString().padStart(2, '0'), \":\").concat(secs.toString().padStart(2, '0'));\n };\n var handleTomatoClick = function handleTomatoClick() {\n setIsActive(true);\n setTimeLeft(DEFAULT_TIME);\n setIsRunning(false);\n };\n var handlePlayPause = function handlePlayPause() {\n setIsRunning(!isRunning);\n };\n var handleReset = function handleReset() {\n setIsRunning(false);\n setTimeLeft(DEFAULT_TIME);\n setShowCompletionMessage(false);\n };\n var handleClose = function handleClose() {\n setIsActive(false);\n setIsRunning(false);\n setTimeLeft(DEFAULT_TIME);\n setShowCompletionMessage(false);\n localStorage.removeItem(POMODORO_STORAGE_KEY);\n };\n\n // Tomato SVG Icon\n var TomatoIcon = function TomatoIcon() {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"svg\", {\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n className: \"cursor-pointer hover:scale-110 transition-transform\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"path\", {\n d: \"M12 22c-4.5 0-8-3-8-7 0-2 1-4 2-5.5C7 8 8.5 7 10 7c1 0 2 .5 2 .5s1-.5 2-.5c1.5 0 3 1 4 2.5 1 1.5 2 3.5 2 5.5 0 4-3.5 7-8 7z\",\n fill: \"#e74c3c\",\n stroke: \"#c0392b\",\n strokeWidth: \"1\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"path\", {\n d: \"M10 7c0-1 .5-2 1-3 .5 1 1.5 2 1.5 3\",\n fill: \"none\",\n stroke: \"#27ae60\",\n strokeWidth: \"2\",\n strokeLinecap: \"round\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"path\", {\n d: \"M11 4c-1 0-2 1-2 2\",\n fill: \"none\",\n stroke: \"#27ae60\",\n strokeWidth: \"2\",\n strokeLinecap: \"round\"\n }));\n };\n if (!isActive) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center \".concat(className),\n onClick: handleTomatoClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(TomatoIcon, null));\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"relative flex items-center space-x-2 \".concat(className)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center space-x-2 bg-gray-100 dark:bg-gray-800 rounded-lg px-3 py-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-sm font-mono font-semibold text-gray-900 dark:text-white\"\n }, formatTime(timeLeft)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: handlePlayPause,\n className: \"flex items-center justify-center p-1 bg-blue-500 text-white rounded hover:bg-blue-600 transition-colors\",\n \"aria-label\": isRunning ? t('pomodoro.pause') : t('pomodoro.play')\n }, isRunning ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n className: \"h-3 w-3\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: \"h-3 w-3\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: handleReset,\n className: \"flex items-center justify-center p-1 bg-gray-500 text-white rounded hover:bg-gray-600 transition-colors\",\n \"aria-label\": t('pomodoro.reset')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n className: \"h-3 w-3\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: handleClose,\n className: \"flex items-center justify-center p-1 bg-red-500 text-white rounded hover:bg-red-600 transition-colors\",\n \"aria-label\": t('pomodoro.close')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n className: \"h-3 w-3\"\n }))), showCompletionMessage && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"absolute top-full mt-2 right-0 bg-green-100 dark:bg-green-900 border border-green-300 dark:border-green-700 text-green-800 dark:text-green-200 px-3 py-2 rounded-lg shadow-lg z-50 whitespace-nowrap\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center space-x-2 mb-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-sm font-medium\"\n }, \"\\uD83C\\uDF45 \", t('pomodoro.complete'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-xs mb-3\"\n }, t('pomodoro.completeMessage')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n setShowCompletionMessage(false);\n setIsActive(false);\n setTimeLeft(DEFAULT_TIME);\n localStorage.removeItem(POMODORO_STORAGE_KEY);\n },\n className: \"w-full text-xs px-3 py-1 bg-green-600 dark:bg-green-700 text-white rounded hover:bg-green-700 dark:hover:bg-green-600 transition-colors\"\n }, t('pomodoro.done'))));\n};\n_s(PomodoroTimer, \"sh/qG+bVG4iFmp/Two4ODuIDGo0=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = PomodoroTimer;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PomodoroTimer);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"PomodoroTimer\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Shared/PomodoroTimer.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Shared/PriorityDropdown.tsx":
+/*!*********************************************************!*\
+ !*** ./frontend/components/Shared/PriorityDropdown.tsx ***!
+ \*********************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ArrowDownIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ArrowUpIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/FireIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ChevronDownIcon.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\nvar PriorityDropdown = function PriorityDropdown(_ref) {\n _s();\n var value = _ref.value,\n onChange = _ref.onChange;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var priorities = [{\n value: 'low',\n label: t('priority.low', 'Low'),\n icon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n className: \"w-5 h-5 text-gray-700 dark:text-gray-300\"\n })\n }, {\n value: 'medium',\n label: t('priority.medium', 'Medium'),\n icon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: \"w-5 h-5 text-gray-700 dark:text-gray-300\"\n })\n }, {\n value: 'high',\n label: t('priority.high', 'High'),\n icon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n className: \"w-5 h-5 text-gray-700 dark:text-gray-300\"\n })\n }];\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState2 = _slicedToArray(_useState, 2),\n isOpen = _useState2[0],\n setIsOpen = _useState2[1];\n var dropdownRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n var handleToggle = function handleToggle() {\n setIsOpen(!isOpen);\n };\n var handleClickOutside = function handleClickOutside(event) {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {\n setIsOpen(false);\n }\n };\n var handleSelect = function handleSelect(priority) {\n onChange(priority);\n setIsOpen(false);\n };\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n } else {\n document.removeEventListener('mousedown', handleClickOutside);\n }\n return function () {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen]);\n var selectedPriority = priorities.find(function (p) {\n return p.value === value;\n });\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n ref: dropdownRef,\n className: \"relative inline-block text-left w-full\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n className: \"inline-flex justify-between w-full px-3 py-2 bg-white dark:bg-gray-900 text-sm text-gray-900 dark:text-gray-100 border border-gray-300 dark:border-gray-900 rounded-md shadow-sm focus:outline-none\",\n onClick: handleToggle\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"flex items-center space-x-2\"\n }, selectedPriority ? selectedPriority.icon : '', /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, selectedPriority ? selectedPriority.label : t('forms.priority', 'Select Priority'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n className: \"w-5 h-5 text-gray-500 dark:text-gray-300\"\n })), isOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"absolute z-10 mt-2 w-full bg-white dark:bg-gray-700 shadow-lg rounded-md\"\n }, priorities.map(function (priority) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n key: priority.value,\n onClick: function onClick() {\n return handleSelect(priority.value);\n },\n className: \"flex items-center justify-between px-4 py-2 text-sm text-gray-900 dark:text-gray-100 hover:bg-gray-100 dark:hover:bg-gray-600 w-full\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"flex items-center space-x-2\"\n }, priority.icon, \" \", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, priority.label)));\n })));\n};\n_s(PriorityDropdown, \"qFZaxaTpRrXhBQ1R1JrEH1Pyquk=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = PriorityDropdown;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PriorityDropdown);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"PriorityDropdown\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Shared/PriorityDropdown.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Shared/Switch.tsx":
+/*!***********************************************!*\
+ !*** ./frontend/components/Shared/Switch.tsx ***!
+ \***********************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\n\nvar Switch = function Switch(_ref) {\n var isChecked = _ref.isChecked,\n onToggle = _ref.onToggle;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center space-x-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-12 h-6 flex items-center rounded-full p-1 cursor-pointer transition-all duration-300 \".concat(isChecked ? 'bg-blue-600' : 'bg-gray-300'),\n onClick: onToggle\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-white w-4 h-4 rounded-full shadow-md transform transition-transform duration-300 \".concat(isChecked ? 'translate-x-6' : '')\n })));\n};\n_c = Switch;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Switch);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"Switch\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Shared/Switch.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Shared/ToastContext.tsx":
+/*!*****************************************************!*\
+ !*** ./frontend/components/Shared/ToastContext.tsx ***!
+ \*****************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ToastProvider: () => (/* binding */ ToastProvider),\n/* harmony export */ useToast: () => (/* binding */ useToast)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature(),\n _s2 = __webpack_require__.$Refresh$.signature();\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\nvar ToastContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(undefined);\nvar ToastProvider = function ToastProvider(_ref) {\n _s();\n var children = _ref.children;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState2 = _slicedToArray(_useState, 2),\n toastMessage = _useState2[0],\n setToastMessage = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('success'),\n _useState4 = _slicedToArray(_useState3, 2),\n toastType = _useState4[0],\n setToastType = _useState4[1];\n var showSuccessToast = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (message) {\n setToastMessage(message);\n setToastType('success');\n setTimeout(function () {\n return setToastMessage(null);\n }, 4000);\n }, []);\n var showErrorToast = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (message) {\n setToastMessage(message);\n setToastType('error');\n setTimeout(function () {\n return setToastMessage(null);\n }, 4000);\n }, []);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ToastContext.Provider, {\n value: {\n showSuccessToast: showSuccessToast,\n showErrorToast: showErrorToast\n }\n }, children, toastMessage && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Toast, {\n message: toastMessage,\n type: toastType,\n onClose: function onClose() {\n return setToastMessage(null);\n }\n }));\n};\n_s(ToastProvider, \"LOKk7y55w/lPtCUhSKQrz3mvN9A=\");\n_c = ToastProvider;\nvar useToast = function useToast() {\n _s2();\n var context = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(ToastContext);\n if (context === undefined) {\n throw new Error('useToast must be used within a ToastProvider');\n }\n return context;\n};\n_s2(useToast, \"b9L3QQ+jgeyIrH0NfHrJ8nn7VMU=\");\nvar Toast = function Toast(_ref2) {\n var message = _ref2.message,\n type = _ref2.type,\n onClose = _ref2.onClose;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"fixed top-20 right-4 z-50 px-4 py-3 rounded-lg shadow-md text-white \".concat(type === 'success' ? 'bg-green-500' : 'bg-red-500')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex-1\"\n }, message), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: onClose,\n className: \"ml-4 text-xl leading-none hover:opacity-75\"\n }, \"\\xD7\")));\n};\n_c2 = Toast;\nvar _c, _c2;\n__webpack_require__.$Refresh$.register(_c, \"ToastProvider\");\n__webpack_require__.$Refresh$.register(_c2, \"Toast\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Shared/ToastContext.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Shared/UrlPreview.tsx":
+/*!***************************************************!*\
+ !*** ./frontend/components/Shared/UrlPreview.tsx ***!
+ \***************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_urlService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/urlService */ \"./frontend/utils/urlService.ts\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/XMarkIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/PhotoIcon.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\nvar UrlPreview = function UrlPreview(_ref) {\n _s();\n var text = _ref.text,\n onPreviewChange = _ref.onPreviewChange;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState2 = _slicedToArray(_useState, 2),\n preview = _useState2[0],\n setPreview = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState4 = _slicedToArray(_useState3, 2),\n isLoading = _useState4[0],\n setIsLoading = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true),\n _useState6 = _slicedToArray(_useState5, 2),\n isVisible = _useState6[0],\n setIsVisible = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState8 = _slicedToArray(_useState7, 2),\n imageError = _useState8[0],\n setImageError = _useState8[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var extractPreview = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var result, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n if (text.trim()) {\n _context.n = 1;\n break;\n }\n setPreview(null);\n onPreviewChange === null || onPreviewChange === void 0 || onPreviewChange(null);\n return _context.a(2);\n case 1:\n setIsLoading(true);\n _context.p = 2;\n _context.n = 3;\n return (0,_utils_urlService__WEBPACK_IMPORTED_MODULE_1__.extractTitleFromText)(text);\n case 3:\n result = _context.v;\n setPreview(result);\n onPreviewChange === null || onPreviewChange === void 0 || onPreviewChange(result);\n _context.n = 5;\n break;\n case 4:\n _context.p = 4;\n _t = _context.v;\n console.error('Failed to extract URL preview:', _t);\n setPreview(null);\n onPreviewChange === null || onPreviewChange === void 0 || onPreviewChange(null);\n case 5:\n _context.p = 5;\n setIsLoading(false);\n return _context.f(5);\n case 6:\n return _context.a(2);\n }\n }, _callee, null, [[2, 4, 5, 6]]);\n }));\n return function extractPreview() {\n return _ref2.apply(this, arguments);\n };\n }();\n var timeoutId = setTimeout(extractPreview, 300);\n return function () {\n return clearTimeout(timeoutId);\n };\n }, [text, onPreviewChange]);\n var handleDismiss = function handleDismiss() {\n setIsVisible(false);\n setPreview(null);\n onPreviewChange === null || onPreviewChange === void 0 || onPreviewChange(null);\n };\n var handleImageError = function handleImageError() {\n setImageError(true);\n };\n if (!isVisible || !preview && !isLoading) {\n return null;\n }\n if (isLoading) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mt-3 p-3 bg-gray-50 dark:bg-gray-700 rounded-lg border border-gray-200 dark:border-gray-600\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center space-x-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"animate-spin rounded-full h-4 w-4 border-b-2 border-blue-500\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-sm text-gray-600 dark:text-gray-300\"\n }, \"Loading preview...\")));\n }\n if (!preview) {\n return null;\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mt-3 p-3 bg-gray-50 dark:bg-gray-700 rounded-lg border border-gray-200 dark:border-gray-600 relative\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: handleDismiss,\n className: \"absolute top-2 right-2 text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 z-10\",\n \"aria-label\": \"Dismiss preview\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n className: \"h-4 w-4\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-start space-x-3\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex-shrink-0\"\n }, preview.image && !imageError ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n src: preview.image,\n alt: \"Preview\",\n className: \"w-16 h-16 object-cover rounded-md\",\n onError: handleImageError\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-16 h-16 bg-gray-200 dark:bg-gray-600 rounded-md flex items-center justify-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: \"h-8 w-8 text-gray-400\"\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex-1 min-w-0 pr-6\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-sm font-medium text-gray-900 dark:text-gray-100\",\n style: {\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden'\n }\n }, preview.title || 'Untitled'), preview.description && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-xs text-gray-600 dark:text-gray-300 mt-1\",\n style: {\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden'\n }\n }, preview.description), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-xs text-gray-500 dark:text-gray-400 truncate mt-1\"\n }, preview.url))));\n};\n_s(UrlPreview, \"nwpNmBFgxF1vZbkqpcqMaotnnRI=\");\n_c = UrlPreview;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (UrlPreview);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"UrlPreview\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Shared/UrlPreview.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Sidebar.tsx":
+/*!*****************************************!*\
+ !*** ./frontend/components/Sidebar.tsx ***!
+ \*****************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/dist/index.js\");\n/* harmony import */ var _Sidebar_SidebarAreas__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Sidebar/SidebarAreas */ \"./frontend/components/Sidebar/SidebarAreas.tsx\");\n/* harmony import */ var _Sidebar_SidebarFooter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Sidebar/SidebarFooter */ \"./frontend/components/Sidebar/SidebarFooter.tsx\");\n/* harmony import */ var _Sidebar_SidebarNav__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Sidebar/SidebarNav */ \"./frontend/components/Sidebar/SidebarNav.tsx\");\n/* harmony import */ var _Sidebar_SidebarNotes__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Sidebar/SidebarNotes */ \"./frontend/components/Sidebar/SidebarNotes.tsx\");\n/* harmony import */ var _Sidebar_SidebarProjects__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Sidebar/SidebarProjects */ \"./frontend/components/Sidebar/SidebarProjects.tsx\");\n/* harmony import */ var _Sidebar_SidebarTags__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Sidebar/SidebarTags */ \"./frontend/components/Sidebar/SidebarTags.tsx\");\n/* harmony import */ var _Sidebar_CreateNewDropdownButton__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Sidebar/CreateNewDropdownButton */ \"./frontend/components/Sidebar/CreateNewDropdownButton.tsx\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\n\n\n\nvar Sidebar = function Sidebar(_ref) {\n _s();\n var isSidebarOpen = _ref.isSidebarOpen,\n setIsSidebarOpen = _ref.setIsSidebarOpen,\n currentUser = _ref.currentUser,\n isDarkMode = _ref.isDarkMode,\n toggleDarkMode = _ref.toggleDarkMode,\n _openTaskModal = _ref.openTaskModal,\n openProjectModal = _ref.openProjectModal,\n openNoteModal = _ref.openNoteModal,\n openAreaModal = _ref.openAreaModal,\n openTagModal = _ref.openTagModal,\n notes = _ref.notes,\n areas = _ref.areas,\n tags = _ref.tags;\n var navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_8__.useNavigate)();\n var location = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_8__.useLocation)();\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState2 = _slicedToArray(_useState, 2),\n isDropdownOpen = _useState2[0],\n setIsDropdownOpen = _useState2[1];\n var toggleDropdown = function toggleDropdown() {\n setIsDropdownOpen(!isDropdownOpen);\n };\n var handleNavClick = function handleNavClick(path, title, icon) {\n navigate(path, {\n state: {\n title: title\n }\n });\n if (window.innerWidth < 1024) {\n setIsSidebarOpen(false);\n }\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"fixed top-16 left-0 \".concat(isSidebarOpen ? 'w-full sm:w-72' : 'w-0', \" h-[calc(100vh-4rem)] bg-white dark:bg-gray-900 text-gray-900 dark:text-white transition-width duration-300 ease-in-out z-40\"),\n style: {\n visibility: isSidebarOpen ? 'visible' : 'hidden',\n overflow: 'hidden'\n }\n }, isSidebarOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex flex-col h-full overflow-y-auto\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"px-3 pb-3 pt-8\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Sidebar_CreateNewDropdownButton__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n openTaskModal: function openTaskModal(type) {\n return _openTaskModal(type || 'full');\n },\n openProjectModal: openProjectModal,\n openNoteModal: openNoteModal,\n openAreaModal: openAreaModal\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Sidebar_SidebarNav__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n handleNavClick: handleNavClick,\n location: location,\n isDarkMode: isDarkMode\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Sidebar_SidebarProjects__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n handleNavClick: handleNavClick,\n location: location,\n isDarkMode: isDarkMode,\n openProjectModal: openProjectModal\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Sidebar_SidebarNotes__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n handleNavClick: handleNavClick,\n openNoteModal: openNoteModal,\n notes: notes,\n location: location,\n isDarkMode: isDarkMode\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Sidebar_SidebarAreas__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n handleNavClick: handleNavClick,\n areas: areas,\n location: location,\n isDarkMode: isDarkMode,\n openAreaModal: openAreaModal\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Sidebar_SidebarTags__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n handleNavClick: handleNavClick,\n location: location,\n isDarkMode: isDarkMode,\n openTagModal: openTagModal,\n tags: tags\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Sidebar_SidebarFooter__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n currentUser: currentUser,\n isDarkMode: isDarkMode,\n toggleDarkMode: toggleDarkMode,\n isSidebarOpen: isSidebarOpen,\n setIsSidebarOpen: setIsSidebarOpen,\n isDropdownOpen: isDropdownOpen,\n toggleDropdown: toggleDropdown\n })));\n};\n_s(Sidebar, \"BuV5ye66dc5Hj9/s7y1G+tjc47E=\", false, function () {\n return [react_router_dom__WEBPACK_IMPORTED_MODULE_8__.useNavigate, react_router_dom__WEBPACK_IMPORTED_MODULE_8__.useLocation];\n});\n_c = Sidebar;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Sidebar);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"Sidebar\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Sidebar.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Sidebar/CreateNewDropdownButton.tsx":
+/*!*****************************************************************!*\
+ !*** ./frontend/components/Sidebar/CreateNewDropdownButton.tsx ***!
+ \*****************************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ClipboardIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/FolderIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/BookOpenIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/Squares2X2Icon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/PlusCircleIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ChevronDownIcon.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\nvar CreateNewDropdownButton = function CreateNewDropdownButton(_ref) {\n _s();\n var openTaskModal = _ref.openTaskModal,\n openProjectModal = _ref.openProjectModal,\n openNoteModal = _ref.openNoteModal,\n openAreaModal = _ref.openAreaModal;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState2 = _slicedToArray(_useState, 2),\n isDropdownOpen = _useState2[0],\n setIsDropdownOpen = _useState2[1];\n var toggleDropdown = function toggleDropdown() {\n setIsDropdownOpen(!isDropdownOpen);\n };\n var handleDropdownSelect = function handleDropdownSelect(type) {\n switch (type) {\n case 'Task':\n openTaskModal('full');\n break;\n case 'Project':\n openProjectModal();\n break;\n case 'Note':\n openNoteModal(null);\n break;\n case 'Area':\n openAreaModal(null);\n break;\n default:\n break;\n }\n setIsDropdownOpen(false);\n };\n var dropdownItems = [{\n label: 'Task',\n translationKey: 'dropdown.task',\n icon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n className: \"h-5 w-5 mr-2\"\n })\n }, {\n label: 'Project',\n translationKey: 'dropdown.project',\n icon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: \"h-5 w-5 mr-2\"\n })\n }, {\n label: 'Note',\n translationKey: 'dropdown.note',\n icon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n className: \"h-5 w-5 mr-2\"\n })\n }, {\n label: 'Area',\n translationKey: 'dropdown.area',\n icon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n className: \"h-5 w-5 mr-2\"\n })\n }];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-8 px-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"relative\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n className: \"flex justify-between items-center w-full rounded-md border border-gray-300 dark:border-gray-700 shadow-sm px-4 py-2 bg-white dark:bg-gray-800 text-sm font-medium text-gray-700 dark:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none\",\n onClick: toggleDropdown\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n className: \"w-5 h-5 mr-2 text-gray-500 dark:text-gray-400\",\n \"aria-hidden\": \"true\"\n }), t('dropdown.createNew', 'Create New')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n className: \"w-5 h-5 text-gray-500 dark:text-gray-400\",\n \"aria-hidden\": \"true\"\n })), isDropdownOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"absolute left-0 right-0 mt-2 w-full\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"rounded-md shadow-lg bg-white dark:bg-gray-800 ring-1 ring-black ring-opacity-5 z-10\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"ul\", {\n className: \"py-1\",\n role: \"menu\",\n \"aria-orientation\": \"vertical\",\n \"aria-labelledby\": \"options-menu\"\n }, dropdownItems.map(function (_ref2) {\n var label = _ref2.label,\n translationKey = _ref2.translationKey,\n icon = _ref2.icon;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"li\", {\n key: label,\n className: \"block px-4 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer flex items-center\",\n onClick: function onClick() {\n return handleDropdownSelect(label);\n },\n role: \"menuitem\"\n }, icon, t(translationKey, label));\n }))))));\n};\n_s(CreateNewDropdownButton, \"gRRtbMjmmvWyG7bcZ7YMLpNqbfg=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = CreateNewDropdownButton;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CreateNewDropdownButton);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"CreateNewDropdownButton\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Sidebar/CreateNewDropdownButton.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Sidebar/SidebarAreas.tsx":
+/*!******************************************************!*\
+ !*** ./frontend/components/Sidebar/SidebarAreas.tsx ***!
+ \******************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/Squares2X2Icon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/PlusCircleIcon.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\n\n\n\nvar SidebarAreas = function SidebarAreas(_ref) {\n _s();\n var handleNavClick = _ref.handleNavClick,\n location = _ref.location,\n openAreaModal = _ref.openAreaModal;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var isActiveArea = function isActiveArea(path) {\n return location.pathname === path ? \"bg-gray-200 dark:bg-gray-700 text-gray-900 dark:text-white\" : \"text-gray-700 dark:text-gray-300\";\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"ul\", {\n className: \"flex flex-col space-y-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"li\", {\n className: \"flex justify-between items-center px-4 py-2 rounded-md uppercase text-xs tracking-wider cursor-pointer hover:text-black dark:hover:text-white \".concat(isActiveArea(\"/areas\")),\n onClick: function onClick() {\n return handleNavClick(\"/areas\", \"Areas\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n className: \"h-5 w-5 mr-2\"\n }));\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n className: \"h-5 w-5 mr-2\"\n }), t('sidebar.areas')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick(e) {\n e.stopPropagation();\n openAreaModal(null);\n },\n className: \"text-gray-700 dark:text-gray-300 hover:text-black dark:hover:text-white focus:outline-none\",\n \"aria-label\": t('sidebar.addAreaAriaLabel'),\n title: t('sidebar.addAreaTitle')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: \"h-5 w-5\"\n })))));\n};\n_s(SidebarAreas, \"zlIdU9EjM2llFt74AbE2KsUJXyM=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = SidebarAreas;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SidebarAreas);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"SidebarAreas\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Sidebar/SidebarAreas.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Sidebar/SidebarFooter.tsx":
+/*!*******************************************************!*\
+ !*** ./frontend/components/Sidebar/SidebarFooter.tsx ***!
+ \*******************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/SunIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/MoonIcon.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\n\n\nvar SidebarFooter = function SidebarFooter(_ref) {\n var isDarkMode = _ref.isDarkMode,\n toggleDarkMode = _ref.toggleDarkMode,\n isSidebarOpen = _ref.isSidebarOpen,\n setIsSidebarOpen = _ref.setIsSidebarOpen;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mt-auto p-3\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"border-t border-gray-200 dark:border-gray-700 pt-3\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-center\"\n }, isSidebarOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: toggleDarkMode,\n className: \"focus:outline-none text-gray-700 dark:text-gray-300\",\n \"aria-label\": \"Toggle Dark Mode\"\n }, isDarkMode ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n className: \"h-6 w-6 text-yellow-500\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n className: \"h-6 w-6 text-gray-500\"\n })))));\n};\n_c = SidebarFooter;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SidebarFooter);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"SidebarFooter\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Sidebar/SidebarFooter.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Sidebar/SidebarNav.tsx":
+/*!****************************************************!*\
+ !*** ./frontend/components/Sidebar/SidebarNav.tsx ***!
+ \****************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/InboxIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/CalendarDaysIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/ClockIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/ListBulletIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/CalendarIcon.js\");\n/* harmony import */ var _store_useStore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../store/useStore */ \"./frontend/store/useStore.ts\");\n/* harmony import */ var _utils_inboxService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/inboxService */ \"./frontend/utils/inboxService.ts\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\n\n\n\n\n\nvar SidebarNav = function SidebarNav(_ref) {\n _s();\n var handleNavClick = _ref.handleNavClick,\n location = _ref.location;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var store = (0,_store_useStore__WEBPACK_IMPORTED_MODULE_2__.useStore)();\n\n // Get inbox items count for badge\n var inboxItemsCount = store.inboxStore.inboxItems.length;\n\n // Load inbox items when component mounts to ensure badge shows correct count\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n (0,_utils_inboxService__WEBPACK_IMPORTED_MODULE_3__.loadInboxItemsToStore)()[\"catch\"](console.error);\n }, []);\n var navLinks = [{\n path: '/inbox',\n title: t('sidebar.inbox', 'Inbox'),\n icon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n className: \"h-5 w-5\"\n })\n }, {\n path: '/today',\n title: t('sidebar.today', 'Today'),\n icon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n className: \"h-5 w-5\"\n }),\n query: 'type=today'\n }, {\n path: '/tasks?type=upcoming',\n title: t('sidebar.upcoming', 'Upcoming'),\n icon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n className: \"h-5 w-5\"\n }),\n query: 'type=upcoming'\n }, {\n path: '/tasks',\n title: t('sidebar.allTasks', 'All Tasks'),\n icon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n className: \"h-5 w-5\"\n })\n }, {\n path: '/calendar',\n title: t('sidebar.calendar', 'Calendar'),\n icon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n className: \"h-5 w-5\"\n })\n }];\n var isActive = function isActive(path, query) {\n // Handle special case for paths without query parameters\n if (path === '/inbox' || path === '/today' || path === '/calendar') {\n var _isPathMatch = location.pathname === path;\n return _isPathMatch ? 'bg-gray-200 dark:bg-gray-700 text-gray-900 dark:text-white' : 'text-gray-700 dark:text-gray-300';\n }\n\n // Regular case for /tasks with query params\n var isPathMatch = location.pathname === '/tasks';\n var isQueryMatch = query ? location.search.includes(query) : location.search === '';\n return isPathMatch && isQueryMatch ? 'bg-gray-200 dark:bg-gray-700 text-gray-900 dark:text-white' : 'text-gray-700 dark:text-gray-300';\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"ul\", {\n className: \"flex flex-col space-y-1\"\n }, navLinks.map(function (link) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: link.path\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"li\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return handleNavClick(link.path, link.title, link.icon);\n },\n className: \"w-full text-left px-4 py-1 flex items-center justify-between rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-all duration-200 \".concat(isActive(link.path, link.query))\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, link.icon, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"ml-2\"\n }, link.title)), link.path === '/inbox' && inboxItemsCount > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"inline-flex items-center justify-center w-5 h-5 text-xs font-medium text-white bg-blue-500 rounded-full\"\n }, inboxItemsCount > 99 ? '99+' : inboxItemsCount))), link.path === '/inbox' && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"li\", {\n className: \"py-1\"\n }));\n }));\n};\n_s(SidebarNav, \"4AMbE+JQd3ANObtpTgEaVXJiN2A=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation, _store_useStore__WEBPACK_IMPORTED_MODULE_2__.useStore];\n});\n_c = SidebarNav;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SidebarNav);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"SidebarNav\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Sidebar/SidebarNav.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Sidebar/SidebarNotes.tsx":
+/*!******************************************************!*\
+ !*** ./frontend/components/Sidebar/SidebarNotes.tsx ***!
+ \******************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/BookOpenIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/PlusCircleIcon.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\n\n\n\nvar SidebarNotes = function SidebarNotes(_ref) {\n _s();\n var handleNavClick = _ref.handleNavClick,\n location = _ref.location,\n openNoteModal = _ref.openNoteModal;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var isActiveNote = function isActiveNote(path) {\n return location.pathname === path ? 'bg-gray-200 dark:bg-gray-700 text-gray-900 dark:text-white' : 'text-gray-700 dark:text-gray-300';\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"ul\", {\n className: \"flex flex-col space-y-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"li\", {\n className: \"flex justify-between items-center rounded-md px-4 py-2 uppercase text-xs tracking-wider cursor-pointer hover:text-black dark:hover:text-white \".concat(isActiveNote('/notes')),\n onClick: function onClick() {\n return handleNavClick('/notes', 'Notes', /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n className: \"h-5 w-5 mr-2\"\n }));\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n className: \"h-5 w-5 mr-2\"\n }), t('sidebar.notes')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick(e) {\n e.stopPropagation();\n openNoteModal(null);\n },\n className: \"text-gray-700 dark:text-gray-300 hover:text-black dark:hover:text-white focus:outline-none\",\n \"aria-label\": \"Add Note\",\n title: \"Add Note\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: \"h-5 w-5\"\n })))));\n};\n_s(SidebarNotes, \"zlIdU9EjM2llFt74AbE2KsUJXyM=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = SidebarNotes;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SidebarNotes);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"SidebarNotes\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Sidebar/SidebarNotes.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Sidebar/SidebarProjects.tsx":
+/*!*********************************************************!*\
+ !*** ./frontend/components/Sidebar/SidebarProjects.tsx ***!
+ \*********************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/FolderIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/PlusCircleIcon.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\n\n\n\nvar SidebarProjects = function SidebarProjects(_ref) {\n _s();\n var handleNavClick = _ref.handleNavClick,\n location = _ref.location,\n openProjectModal = _ref.openProjectModal;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var isActiveProject = function isActiveProject(path) {\n return location.pathname === path ? 'bg-gray-200 dark:bg-gray-700 text-gray-900 dark:text-white' : 'text-gray-700 dark:text-gray-300';\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"ul\", {\n className: \"flex flex-col space-y-1 mt-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"li\", {\n className: \"flex justify-between items-center px-4 py-2 uppercase rounded-md text-xs tracking-wider cursor-pointer hover:text-black dark:hover:text-white \".concat(isActiveProject('/projects')),\n onClick: function onClick() {\n return handleNavClick('/projects?active=true', 'Projects', /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n className: \"h-5 w-5 mr-2\"\n }));\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n className: \"h-5 w-5 mr-2\"\n }), t('sidebar.projects')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick(e) {\n e.stopPropagation();\n openProjectModal();\n },\n className: \"text-gray-700 dark:text-gray-300 hover:text-black dark:hover:text-white focus:outline-none\",\n \"aria-label\": \"Add Project\",\n title: \"Add Project\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: \"h-5 w-5\"\n })))));\n};\n_s(SidebarProjects, \"zlIdU9EjM2llFt74AbE2KsUJXyM=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = SidebarProjects;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SidebarProjects);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"SidebarProjects\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Sidebar/SidebarProjects.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Sidebar/SidebarTags.tsx":
+/*!*****************************************************!*\
+ !*** ./frontend/components/Sidebar/SidebarTags.tsx ***!
+ \*****************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/TagIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/PlusCircleIcon.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\n\n\n\nvar SidebarTags = function SidebarTags(_ref) {\n _s();\n var handleNavClick = _ref.handleNavClick,\n location = _ref.location,\n openTagModal = _ref.openTagModal;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var isActiveTag = function isActiveTag(path) {\n return location.pathname === path ? 'bg-gray-200 dark:bg-gray-700 text-gray-900 dark:text-white' : 'text-gray-700 dark:text-gray-300';\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"ul\", {\n className: \"flex flex-col space-y-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"li\", {\n className: \"flex justify-between items-center rounded-md px-4 py-2 uppercase text-xs tracking-wider cursor-pointer hover:text-black dark:hover:text-white \".concat(isActiveTag('/tags')),\n onClick: function onClick() {\n return handleNavClick('/tags', 'Tags', /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n className: \"h-5 w-5 mr-2\"\n }));\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n className: \"h-5 w-5 mr-2\"\n }), t('sidebar.tags')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick(e) {\n e.stopPropagation();\n openTagModal(null);\n },\n className: \"text-gray-700 dark:text-gray-300 hover:text-black dark:hover:text-white focus:outline-none\",\n \"aria-label\": t('sidebar.addTagAriaLabel'),\n title: t('sidebar.addTagTitle')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: \"h-5 w-5\"\n })))));\n};\n_s(SidebarTags, \"zlIdU9EjM2llFt74AbE2KsUJXyM=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = SidebarTags;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SidebarTags);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"SidebarTags\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Sidebar/SidebarTags.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Tag/TagDetails.tsx":
+/*!************************************************!*\
+ !*** ./frontend/components/Tag/TagDetails.tsx ***!
+ \************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/dist/index.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/dist/index.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/TagIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/CheckIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/BookOpenIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/FolderIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/PencilSquareIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/TrashIcon.js\");\n/* harmony import */ var _Task_TaskList__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Task/TaskList */ \"./frontend/components/Task/TaskList.tsx\");\n/* harmony import */ var _Project_ProjectItem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Project/ProjectItem */ \"./frontend/components/Project/ProjectItem.tsx\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\nvar TagDetails = function TagDetails() {\n _s();\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var _useParams = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_4__.useParams)(),\n id = _useParams.id;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState2 = _slicedToArray(_useState, 2),\n tag = _useState2[0],\n setTag = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState4 = _slicedToArray(_useState3, 2),\n tasks = _useState4[0],\n setTasks = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState6 = _slicedToArray(_useState5, 2),\n notes = _useState6[0],\n setNotes = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState8 = _slicedToArray(_useState7, 2),\n projects = _useState8[0],\n setProjects = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true),\n _useState0 = _slicedToArray(_useState9, 2),\n loading = _useState0[0],\n setLoading = _useState0[1];\n var _useState1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState10 = _slicedToArray(_useState1, 2),\n error = _useState10[0],\n setError = _useState10[1];\n\n // State for ProjectItem components\n var _useState11 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState12 = _slicedToArray(_useState11, 2),\n activeDropdown = _useState12[0],\n setActiveDropdown = _useState12[1];\n var _useState13 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState14 = _slicedToArray(_useState13, 2),\n hoveredNoteId = _useState14[0],\n setHoveredNoteId = _useState14[1];\n var _useState15 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState16 = _slicedToArray(_useState15, 2),\n projectToDelete = _useState16[0],\n setProjectToDelete = _useState16[1];\n var _useState17 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState18 = _slicedToArray(_useState17, 2),\n isConfirmDialogOpen = _useState18[0],\n setIsConfirmDialogOpen = _useState18[1];\n var navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_4__.useNavigate)();\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var fetchTagData = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var tagResponse, tagData, _yield$Promise$all, _yield$Promise$all2, tasksResponse, notesResponse, projectsResponse, tasksData, notesData, projectsData, allProjects, filteredProjects, tagError, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n _context.p = 0;\n _context.n = 1;\n return fetch(\"/api/tag/\".concat(id));\n case 1:\n tagResponse = _context.v;\n if (!tagResponse.ok) {\n _context.n = 10;\n break;\n }\n _context.n = 2;\n return tagResponse.json();\n case 2:\n tagData = _context.v;\n setTag(tagData);\n\n // Now fetch entities that have this tag using the tag name\n _context.n = 3;\n return Promise.all([fetch(\"/api/tasks?tag=\".concat(encodeURIComponent(tagData.name))), fetch(\"/api/notes?tag=\".concat(encodeURIComponent(tagData.name))), fetch(\"/api/projects\") // Projects API doesn't support tag filtering yet\n ]);\n case 3:\n _yield$Promise$all = _context.v;\n _yield$Promise$all2 = _slicedToArray(_yield$Promise$all, 3);\n tasksResponse = _yield$Promise$all2[0];\n notesResponse = _yield$Promise$all2[1];\n projectsResponse = _yield$Promise$all2[2];\n if (!tasksResponse.ok) {\n _context.n = 5;\n break;\n }\n _context.n = 4;\n return tasksResponse.json();\n case 4:\n tasksData = _context.v;\n setTasks(tasksData.tasks || []);\n case 5:\n if (!notesResponse.ok) {\n _context.n = 7;\n break;\n }\n _context.n = 6;\n return notesResponse.json();\n case 6:\n notesData = _context.v;\n setNotes(notesData || []);\n case 7:\n if (!projectsResponse.ok) {\n _context.n = 9;\n break;\n }\n _context.n = 8;\n return projectsResponse.json();\n case 8:\n projectsData = _context.v;\n // Filter projects client-side since API doesn't support tag filtering\n allProjects = projectsData.projects || projectsData || [];\n filteredProjects = allProjects.filter(function (project) {\n return project.tags && project.tags.some(function (tag) {\n return tag.name === tagData.name;\n });\n });\n setProjects(filteredProjects);\n case 9:\n _context.n = 12;\n break;\n case 10:\n _context.n = 11;\n return tagResponse.json();\n case 11:\n tagError = _context.v;\n setError(tagError.error || 'Failed to fetch tag.');\n case 12:\n _context.n = 14;\n break;\n case 13:\n _context.p = 13;\n _t = _context.v;\n setError(t('tags.error'));\n case 14:\n _context.p = 14;\n setLoading(false);\n return _context.f(14);\n case 15:\n return _context.a(2);\n }\n }, _callee, null, [[0, 13, 14, 15]]);\n }));\n return function fetchTagData() {\n return _ref.apply(this, arguments);\n };\n }();\n fetchTagData();\n }, [id, t]);\n\n // Task handlers\n var handleTaskUpdate = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(updatedTask) {\n var response, _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n _context2.p = 0;\n _context2.n = 1;\n return fetch(\"/api/task/\".concat(updatedTask.id), {\n method: \"PATCH\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(updatedTask)\n });\n case 1:\n response = _context2.v;\n if (response.ok) {\n setTasks(function (prevTasks) {\n return prevTasks.map(function (task) {\n return task.id === updatedTask.id ? updatedTask : task;\n });\n });\n }\n _context2.n = 3;\n break;\n case 2:\n _context2.p = 2;\n _t2 = _context2.v;\n console.error(\"Error updating task:\", _t2);\n case 3:\n return _context2.a(2);\n }\n }, _callee2, null, [[0, 2]]);\n }));\n return function handleTaskUpdate(_x) {\n return _ref2.apply(this, arguments);\n };\n }();\n var handleTaskDelete = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(taskId) {\n var response, _t3;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n _context3.p = 0;\n _context3.n = 1;\n return fetch(\"/api/task/\".concat(taskId), {\n method: \"DELETE\"\n });\n case 1:\n response = _context3.v;\n if (response.ok) {\n setTasks(function (prevTasks) {\n return prevTasks.filter(function (task) {\n return task.id !== taskId;\n });\n });\n }\n _context3.n = 3;\n break;\n case 2:\n _context3.p = 2;\n _t3 = _context3.v;\n console.error(\"Error deleting task:\", _t3);\n case 3:\n return _context3.a(2);\n }\n }, _callee3, null, [[0, 2]]);\n }));\n return function handleTaskDelete(_x2) {\n return _ref3.apply(this, arguments);\n };\n }();\n\n // Project handlers \n var handleEditProject = function handleEditProject(project) {\n // For now, just log - could add modal later\n console.log(\"Edit project:\", project);\n };\n var _getCompletionPercentage = function getCompletionPercentage(project) {\n return project.completion_percentage || 0;\n };\n var getPriorityStyles = function getPriorityStyles(priority) {\n switch (priority) {\n case \"low\":\n return {\n color: \"bg-green-500\"\n };\n case \"medium\":\n return {\n color: \"bg-yellow-500\"\n };\n case \"high\":\n return {\n color: \"bg-red-500\"\n };\n default:\n return {\n color: \"bg-gray-500\"\n };\n }\n };\n if (loading) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-center h-screen bg-gray-100 dark:bg-gray-900\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-xl font-semibold text-gray-700 dark:text-gray-200\"\n }, t('tags.loading')));\n }\n if (error) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-red-500 p-4\"\n }, error);\n }\n if (!tag) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-gray-700 dark:text-gray-300 p-4\"\n }, t('tags.notFound'));\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex justify-center px-4 lg:px-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-full max-w-5xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between mb-8\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n className: \"h-6 w-6 mr-2 text-gray-900 dark:text-white\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h2\", {\n className: \"text-2xl font-light text-gray-900 dark:text-white\"\n }, tag.name)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"px-3 py-1 rounded-full text-sm \".concat(tag.active ? 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200' : 'bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-200')\n }, tag.active ? t('tags.active') : t('tags.inactive'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"grid grid-cols-1 md:grid-cols-3 gap-6 mb-8\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-white dark:bg-gray-900 shadow rounded-lg p-6\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n className: \"h-8 w-8 text-blue-500 mr-3\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-2xl font-semibold text-gray-900 dark:text-white\"\n }, tasks.length), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-gray-600 dark:text-gray-400\"\n }, t('tasks.title'))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-white dark:bg-gray-900 shadow rounded-lg p-6\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n className: \"h-8 w-8 text-green-500 mr-3\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-2xl font-semibold text-gray-900 dark:text-white\"\n }, notes.length), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-gray-600 dark:text-gray-400\"\n }, t('notes.title'))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-white dark:bg-gray-900 shadow rounded-lg p-6\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n className: \"h-8 w-8 text-purple-500 mr-3\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-2xl font-semibold text-gray-900 dark:text-white\"\n }, projects.length), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-gray-600 dark:text-gray-400\"\n }, t('projects.title')))))), tasks.length > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-8\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-lg font-semibold text-gray-900 dark:text-white mb-4 flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n className: \"h-5 w-5 mr-2\"\n }), t('tasks.title'), \" (\", tasks.length, \")\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Task_TaskList__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n tasks: tasks,\n onTaskUpdate: handleTaskUpdate,\n onTaskDelete: handleTaskDelete,\n projects: [] // Empty since we're viewing by tag\n ,\n hideProjectName: false\n })), notes.length > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-8\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-lg font-semibold text-gray-900 dark:text-white mb-4 flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n className: \"h-5 w-5 mr-2\"\n }), t('notes.title'), \" (\", notes.length, \")\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"ul\", {\n className: \"space-y-1\"\n }, notes.map(function (note) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"li\", {\n key: note.id,\n className: \"bg-white dark:bg-gray-900 shadow rounded-lg px-4 py-3 flex justify-between items-center\",\n onMouseEnter: function onMouseEnter() {\n return setHoveredNoteId(note.id || null);\n },\n onMouseLeave: function onMouseLeave() {\n return setHoveredNoteId(null);\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex-grow overflow-hidden pr-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center flex-wrap gap-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_9__.Link, {\n to: \"/note/\".concat(note.id),\n className: \"text-md font-semibold text-gray-900 dark:text-gray-100 hover:underline\"\n }, note.title), (note.tags && note.tags.length > 0 || note.Tags && note.Tags.length > 0) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, (note.tags || note.Tags || []).map(function (noteTag) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n key: noteTag.id,\n onClick: function onClick(e) {\n e.preventDefault();\n navigate(\"/tag/\".concat(noteTag.id));\n },\n className: \"flex items-center space-x-1 px-2 py-0.5 bg-gray-100 dark:bg-gray-700 rounded text-xs cursor-pointer hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n className: \"h-3 w-3 text-gray-500 dark:text-gray-300\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-gray-700 dark:text-gray-300\"\n }, noteTag.name));\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex space-x-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return console.log(\"Edit note:\", note);\n },\n className: \"text-gray-500 hover:text-blue-700 dark:hover:text-blue-300 focus:outline-none transition-opacity \".concat(hoveredNoteId === note.id ? 'opacity-100' : 'opacity-0'),\n \"aria-label\": \"Edit \".concat(note.title),\n title: \"Edit \".concat(note.title)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n className: \"h-5 w-5\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return console.log(\"Delete note:\", note);\n },\n className: \"text-gray-500 hover:text-red-700 dark:hover:text-red-300 focus:outline-none transition-opacity \".concat(hoveredNoteId === note.id ? 'opacity-100' : 'opacity-0'),\n \"aria-label\": \"Delete \".concat(note.title),\n title: \"Delete \".concat(note.title)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n className: \"h-5 w-5\"\n }))));\n }))), projects.length > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-8\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-lg font-semibold text-gray-900 dark:text-white mb-4 flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n className: \"h-5 w-5 mr-2\"\n }), t('projects.title'), \" (\", projects.length, \")\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex flex-col space-y-1\"\n }, projects.map(function (project) {\n var _getPriorityStyles = getPriorityStyles(project.priority || \"low\"),\n color = _getPriorityStyles.color;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Project_ProjectItem__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n key: project.id,\n project: project,\n viewMode: \"list\",\n color: color,\n getCompletionPercentage: function getCompletionPercentage() {\n return _getCompletionPercentage(project);\n },\n activeDropdown: activeDropdown,\n setActiveDropdown: setActiveDropdown,\n handleEditProject: handleEditProject,\n setProjectToDelete: setProjectToDelete,\n setIsConfirmDialogOpen: setIsConfirmDialogOpen\n });\n }))), tasks.length === 0 && notes.length === 0 && projects.length === 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-center py-8\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n className: \"h-16 w-16 text-gray-400 mx-auto mb-4\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-gray-600 dark:text-gray-400 text-lg\"\n }, t('tags.noItemsWithTag', \"No items found with the tag \\\"\".concat(tag.name, \"\\\"\"))))));\n};\n_s(TagDetails, \"XaI9OAftLSvQJP+9HT/XoVe6DPc=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation, react_router_dom__WEBPACK_IMPORTED_MODULE_4__.useParams, react_router_dom__WEBPACK_IMPORTED_MODULE_4__.useNavigate];\n});\n_c = TagDetails;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TagDetails);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"TagDetails\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Tag/TagDetails.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Tag/TagInput.tsx":
+/*!**********************************************!*\
+ !*** ./frontend/components/Tag/TagInput.tsx ***!
+ \**********************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\nvar TagInput = function TagInput(_ref) {\n _s();\n var initialTags = _ref.initialTags,\n onTagsChange = _ref.onTagsChange,\n availableTags = _ref.availableTags;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(''),\n _useState2 = _slicedToArray(_useState, 2),\n inputValue = _useState2[0],\n setInputValue = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(initialTags || []),\n _useState4 = _slicedToArray(_useState3, 2),\n tags = _useState4[0],\n setTags = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState6 = _slicedToArray(_useState5, 2),\n filteredTags = _useState6[0],\n setFilteredTags = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState8 = _slicedToArray(_useState7, 2),\n isDropdownOpen = _useState8[0],\n setIsDropdownOpen = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(-1),\n _useState0 = _slicedToArray(_useState9, 2),\n highlightedIndex = _useState0[0],\n setHighlightedIndex = _useState0[1];\n var inputRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n var containerRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n var dropdownRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n\n // Update internal tags state when initialTags prop changes\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n // Set the tags state with the initial tags\n if (initialTags && initialTags.length > 0) {\n // Simply set our internal state to match the initialTags\n setTags(initialTags);\n }\n }, [initialTags]);\n\n // Remove this effect to prevent infinite loops\n // onTagsChange is called directly in addNewTag, selectTag, and removeTag\n\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var handler = setTimeout(function () {\n if (inputValue.trim() === '') {\n setFilteredTags([]);\n setIsDropdownOpen(false);\n return;\n }\n var filtered = availableTags.filter(function (tag) {\n return tag.name.toLowerCase().includes(inputValue.toLowerCase()) && !tags.includes(tag.name);\n });\n setFilteredTags(filtered);\n setIsDropdownOpen(filtered.length > 0);\n setHighlightedIndex(-1);\n }, 300);\n return function () {\n clearTimeout(handler);\n };\n }, [inputValue, availableTags, tags]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var handleClickOutside = function handleClickOutside(event) {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target) && containerRef.current && !containerRef.current.contains(event.target)) {\n setIsDropdownOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return function () {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, []);\n var handleInputChange = function handleInputChange(event) {\n setInputValue(event.target.value);\n };\n var handleKeyDown = function handleKeyDown(event) {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setHighlightedIndex(function (prev) {\n return prev < filteredTags.length - 1 ? prev + 1 : prev;\n });\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n setHighlightedIndex(function (prev) {\n return prev > 0 ? prev - 1 : prev;\n });\n } else if (event.key === 'Enter') {\n event.preventDefault();\n if (highlightedIndex >= 0 && highlightedIndex < filteredTags.length) {\n selectTag(filteredTags[highlightedIndex].name);\n } else if (inputValue.trim()) {\n addNewTag(inputValue.trim());\n }\n } else if (event.key === 'Escape') {\n setIsDropdownOpen(false);\n } else if (event.key === ',') {\n if (inputValue.trim()) {\n event.preventDefault();\n addNewTag(inputValue.trim());\n }\n }\n };\n var addNewTag = function addNewTag(tag) {\n if (tags.length >= 10) {\n return;\n }\n if (!tags.includes(tag)) {\n var updatedTags = [].concat(_toConsumableArray(tags), [tag]);\n setTags(updatedTags);\n onTagsChange(updatedTags);\n }\n setInputValue('');\n setIsDropdownOpen(false);\n };\n var selectTag = function selectTag(tag) {\n if (!tags.includes(tag)) {\n var updatedTags = [].concat(_toConsumableArray(tags), [tag]);\n setTags(updatedTags);\n onTagsChange(updatedTags);\n }\n setInputValue('');\n setIsDropdownOpen(false);\n };\n var removeTag = function removeTag(index) {\n var updatedTags = tags.filter(function (_, i) {\n return i !== index;\n });\n setTags(updatedTags);\n onTagsChange(updatedTags);\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"space-y-2 relative\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n ref: containerRef,\n className: \"flex flex-wrap items-center border border-gray-300 dark:border-gray-900 bg-white dark:bg-gray-900 rounded-md p-2 min-h-[40px]\"\n }, tags.length > 0 ? tags.map(function (tag, index) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n key: index,\n className: \"flex items-center bg-gray-200 text-gray-700 text-xs font-medium mr-2 px-2.5 py-0.5 rounded\"\n }, tag, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: function onClick() {\n return removeTag(index);\n },\n className: \"ml-1 text-gray-600 hover:text-gray-800 focus:outline-none\",\n \"aria-label\": \"Remove tag \".concat(tag)\n }, \"\\xD7\"));\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-gray-400 text-xs\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n ref: inputRef,\n value: inputValue,\n onChange: handleInputChange,\n onKeyDown: handleKeyDown,\n placeholder: t('tags.typeToAdd'),\n className: \"flex-grow bg-transparent border-none outline-none text-sm text-gray-900 dark:text-gray-100\",\n onFocus: function onFocus() {\n if (filteredTags.length > 0) setIsDropdownOpen(true);\n },\n style: {\n minWidth: '150px'\n },\n \"aria-haspopup\": \"listbox\",\n \"aria-expanded\": isDropdownOpen,\n \"aria-controls\": \"tag-suggestions\"\n })), isDropdownOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n ref: dropdownRef,\n className: \"absolute z-50 mt-1 w-full bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-md shadow-lg max-h-60 overflow-auto\",\n role: \"listbox\",\n id: \"tag-suggestions\"\n }, filteredTags.map(function (tag, index) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n key: tag.id,\n type: \"button\",\n onClick: function onClick() {\n return selectTag(tag.name);\n },\n className: \"w-full text-left px-4 py-2 text-sm hover:bg-gray-200 dark:hover:bg-gray-700 \".concat(highlightedIndex === index ? 'bg-gray-200 dark:bg-gray-700 text-gray-900 dark:text-gray-100' : 'text-gray-700 dark:text-gray-300'),\n onMouseEnter: function onMouseEnter() {\n return setHighlightedIndex(index);\n },\n onMouseLeave: function onMouseLeave() {\n return setHighlightedIndex(-1);\n },\n role: \"option\",\n \"aria-selected\": highlightedIndex === index\n }, highlightedIndex === index ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, inputValue.length > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"font-semibold\"\n }, tag.name.substring(0, inputValue.length)), tag.name.substring(inputValue.length)) : tag.name);\n }), filteredTags.length === 0 && inputValue.trim() !== '' && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: function onClick() {\n return addNewTag(inputValue.trim());\n },\n className: \"w-full text-left px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700\",\n role: \"option\"\n }, \"+ Create \\\"\", inputValue.trim(), \"\\\"\")));\n};\n_s(TagInput, \"o1LEChSrsUMhENqwqxLH2X63sBs=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = TagInput;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TagInput);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"TagInput\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Tag/TagInput.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Tag/TagModal.tsx":
+/*!**********************************************!*\
+ !*** ./frontend/components/Tag/TagModal.tsx ***!
+ \**********************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Shared/ToastContext */ \"./frontend/components/Shared/ToastContext.tsx\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\nvar TagModal = function TagModal(_ref) {\n _s();\n var isOpen = _ref.isOpen,\n onClose = _ref.onClose,\n onSave = _ref.onSave,\n tag = _ref.tag;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(tag || {\n name: ''\n }),\n _useState2 = _slicedToArray(_useState, 2),\n formData = _useState2[0],\n setFormData = _useState2[1];\n var modalRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState4 = _slicedToArray(_useState3, 2),\n isClosing = _useState4[0],\n setIsClosing = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState6 = _slicedToArray(_useState5, 2),\n isSubmitting = _useState6[0],\n setIsSubmitting = _useState6[1];\n var _useToast = (0,_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_1__.useToast)(),\n showSuccessToast = _useToast.showSuccessToast,\n showErrorToast = _useToast.showErrorToast;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_2__.useTranslation)(),\n t = _useTranslation.t;\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (tag) {\n setFormData(tag);\n } else {\n setFormData({\n name: ''\n });\n }\n }, [tag]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var handleClickOutside = function handleClickOutside(event) {\n if (modalRef.current && !modalRef.current.contains(event.target)) {\n handleClose();\n }\n };\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n return function () {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var handleKeyDown = function handleKeyDown(event) {\n if (event.key === 'Escape') {\n handleClose();\n }\n };\n if (isOpen) {\n document.addEventListener('keydown', handleKeyDown);\n }\n return function () {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [isOpen]);\n var handleChange = function handleChange(e) {\n var _e$target = e.target,\n name = _e$target.name,\n value = _e$target.value;\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, name, value));\n });\n };\n var handleSubmit = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n if (formData.name.trim()) {\n _context.n = 1;\n break;\n }\n showErrorToast(t('errors.tagNameRequired', 'Tag name is required.'));\n return _context.a(2);\n case 1:\n setIsSubmitting(true);\n try {\n if (tag) {\n showSuccessToast(t('success.tagUpdated', 'Tag updated successfully!'));\n } else {\n showSuccessToast(t('success.tagCreated', 'Tag created successfully!'));\n }\n onSave(formData);\n handleClose();\n } catch (err) {\n showErrorToast(t('errors.failedToSaveTag', 'Failed to save tag.'));\n } finally {\n setIsSubmitting(false);\n }\n case 2:\n return _context.a(2);\n }\n }, _callee);\n }));\n return function handleSubmit() {\n return _ref2.apply(this, arguments);\n };\n }();\n var handleClose = function handleClose() {\n setIsClosing(true);\n setTimeout(function () {\n onClose();\n setIsClosing(false);\n }, 300);\n };\n if (!isOpen) return null;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"fixed top-16 left-0 right-0 bottom-0 flex items-start sm:items-center justify-center bg-gray-900 bg-opacity-80 z-40 transition-opacity duration-300 \".concat(isClosing ? 'opacity-0' : 'opacity-100')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n ref: modalRef,\n className: \"bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-800 sm:rounded-lg sm:shadow-2xl w-full sm:max-w-md overflow-hidden transform transition-transform duration-300 \".concat(isClosing ? 'scale-95' : 'scale-100', \" h-screen sm:h-auto flex flex-col\"),\n style: {\n maxHeight: 'calc(100vh - 4rem)'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"form\", {\n className: \"flex flex-col flex-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"fieldset\", {\n className: \"flex flex-col flex-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-4 space-y-3 flex-1 text-sm overflow-y-auto\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"py-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n id: \"tagName\",\n name: \"name\",\n value: formData.name,\n onChange: handleChange,\n required: true,\n className: \"block w-full text-xl font-semibold dark:bg-gray-800 text-black dark:text-white border-b-2 border-gray-200 dark:border-gray-900 focus:outline-none shadow-sm py-2\",\n placeholder: t('forms.tagNamePlaceholder', 'Enter tag name')\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-3 flex-shrink-0 border-t border-gray-200 dark:border-gray-700 flex justify-end space-x-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: handleClose,\n className: \"px-4 py-2 bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-200 rounded-md hover:bg-gray-300 dark:hover:bg-gray-600 focus:outline-none transition duration-150 ease-in-out\"\n }, t('common.cancel', 'Cancel')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: handleSubmit,\n disabled: isSubmitting,\n className: \"px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 dark:bg-blue-500 dark:hover:bg-blue-600 focus:outline-none transition duration-150 ease-in-out \".concat(isSubmitting ? 'opacity-50 cursor-not-allowed' : '')\n }, isSubmitting ? t('modals.submitting', 'Submitting...') : tag ? t('modals.updateTag', 'Update Tag') : t('modals.createTag', 'Create Tag'))))))));\n};\n_s(TagModal, \"DEEDWSBiCUuJwhCRMel9CbEhkTQ=\", false, function () {\n return [_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_1__.useToast, react_i18next__WEBPACK_IMPORTED_MODULE_2__.useTranslation];\n});\n_c = TagModal;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TagModal);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"TagModal\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Tag/TagModal.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Tags.tsx":
+/*!**************************************!*\
+ !*** ./frontend/components/Tags.tsx ***!
+ \**************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/dist/index.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/TagIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/MagnifyingGlassIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/FolderIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/CheckIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/BookOpenIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/PencilSquareIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/TrashIcon.js\");\n/* harmony import */ var _Shared_ConfirmDialog__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Shared/ConfirmDialog */ \"./frontend/components/Shared/ConfirmDialog.tsx\");\n/* harmony import */ var _Tag_TagModal__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Tag/TagModal */ \"./frontend/components/Tag/TagModal.tsx\");\n/* harmony import */ var _utils_tagsService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/tagsService */ \"./frontend/utils/tagsService.ts\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\nvar Tags = function Tags() {\n _s();\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState2 = _slicedToArray(_useState, 2),\n tags = _useState2[0],\n setTags = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState4 = _slicedToArray(_useState3, 2),\n isTagModalOpen = _useState4[0],\n setIsTagModalOpen = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState6 = _slicedToArray(_useState5, 2),\n selectedTag = _useState6[0],\n setSelectedTag = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState8 = _slicedToArray(_useState7, 2),\n isConfirmDialogOpen = _useState8[0],\n setIsConfirmDialogOpen = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState0 = _slicedToArray(_useState9, 2),\n tagToDelete = _useState0[0],\n setTagToDelete = _useState0[1];\n var _useState1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(''),\n _useState10 = _slicedToArray(_useState1, 2),\n searchQuery = _useState10[0],\n setSearchQuery = _useState10[1];\n var _useState11 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true),\n _useState12 = _slicedToArray(_useState11, 2),\n isLoading = _useState12[0],\n setIsLoading = _useState12[1];\n var _useState13 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState14 = _slicedToArray(_useState13, 2),\n isError = _useState14[0],\n setIsError = _useState14[1];\n var _useState15 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState16 = _slicedToArray(_useState15, 2),\n hoveredTagId = _useState16[0],\n setHoveredTagId = _useState16[1];\n var _useState17 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({}),\n _useState18 = _slicedToArray(_useState17, 2),\n tagMetrics = _useState18[0],\n setTagMetrics = _useState18[1];\n var _useState19 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(new Set()),\n _useState20 = _slicedToArray(_useState19, 2),\n loadingMetrics = _useState20[0],\n setLoadingMetrics = _useState20[1];\n var _useState21 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(new Set()),\n _useState22 = _slicedToArray(_useState21, 2),\n loadedMetrics = _useState22[0],\n setLoadedMetrics = _useState22[1];\n var _useState23 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState24 = _slicedToArray(_useState23, 2),\n cachedProjects = _useState24[0],\n setCachedProjects = _useState24[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var loadTags = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var fetchedTags, projectsResponse, projectsData, initialMetrics, _t, _t2;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n setIsLoading(true);\n _context.p = 1;\n _context.n = 2;\n return (0,_utils_tagsService__WEBPACK_IMPORTED_MODULE_3__.fetchTags)();\n case 2:\n fetchedTags = _context.v;\n setTags(fetchedTags);\n\n // Load projects once and cache them\n _context.p = 3;\n _context.n = 4;\n return fetch('/api/projects');\n case 4:\n projectsResponse = _context.v;\n if (!projectsResponse.ok) {\n _context.n = 6;\n break;\n }\n _context.n = 5;\n return projectsResponse.json();\n case 5:\n projectsData = _context.v;\n setCachedProjects(projectsData.projects || projectsData || []);\n case 6:\n _context.n = 8;\n break;\n case 7:\n _context.p = 7;\n _t = _context.v;\n console.error('Failed to fetch projects for tag metrics:', _t);\n case 8:\n // Skip fetching metrics initially to avoid excessive API calls\n // Metrics will be loaded on demand when user interacts with tags\n initialMetrics = {};\n fetchedTags.forEach(function (tag) {\n initialMetrics[tag.name] = {\n tasks: 0,\n notes: 0,\n projects: 0\n };\n });\n setTagMetrics(initialMetrics);\n _context.n = 10;\n break;\n case 9:\n _context.p = 9;\n _t2 = _context.v;\n console.error('Failed to fetch tags:', _t2);\n setIsError(true);\n case 10:\n _context.p = 10;\n setIsLoading(false);\n return _context.f(10);\n case 11:\n return _context.a(2);\n }\n }, _callee, null, [[3, 7], [1, 9, 10, 11]]);\n }));\n return function loadTags() {\n return _ref.apply(this, arguments);\n };\n }();\n loadTags();\n }, []);\n\n // Load metrics for a specific tag on demand\n var loadTagMetrics = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(tagName) {\n var _yield$Promise$all, _yield$Promise$all2, tasksResponse, notesResponse, tasksCount, notesCount, _tasksData$tasks, tasksData, notesData, projectsCount, _t3;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n if (!(loadedMetrics.has(tagName) || loadingMetrics.has(tagName))) {\n _context2.n = 1;\n break;\n }\n return _context2.a(2);\n case 1:\n setLoadingMetrics(function (prev) {\n return new Set(prev).add(tagName);\n });\n _context2.p = 2;\n _context2.n = 3;\n return Promise.all([fetch(\"/api/tasks?tag=\".concat(encodeURIComponent(tagName))), fetch(\"/api/notes?tag=\".concat(encodeURIComponent(tagName)))]);\n case 3:\n _yield$Promise$all = _context2.v;\n _yield$Promise$all2 = _slicedToArray(_yield$Promise$all, 2);\n tasksResponse = _yield$Promise$all2[0];\n notesResponse = _yield$Promise$all2[1];\n tasksCount = 0;\n notesCount = 0;\n if (!tasksResponse.ok) {\n _context2.n = 5;\n break;\n }\n _context2.n = 4;\n return tasksResponse.json();\n case 4:\n tasksData = _context2.v;\n tasksCount = ((_tasksData$tasks = tasksData.tasks) === null || _tasksData$tasks === void 0 ? void 0 : _tasksData$tasks.length) || 0;\n case 5:\n if (!notesResponse.ok) {\n _context2.n = 7;\n break;\n }\n _context2.n = 6;\n return notesResponse.json();\n case 6:\n notesData = _context2.v;\n notesCount = (notesData === null || notesData === void 0 ? void 0 : notesData.length) || 0;\n case 7:\n // Use cached projects data\n projectsCount = cachedProjects.filter(function (project) {\n return project.tags && project.tags.some(function (projectTag) {\n return projectTag.name === tagName;\n });\n }).length;\n setTagMetrics(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, tagName, {\n tasks: tasksCount,\n notes: notesCount,\n projects: projectsCount\n }));\n });\n setLoadedMetrics(function (prev) {\n return new Set(prev).add(tagName);\n });\n _context2.n = 9;\n break;\n case 8:\n _context2.p = 8;\n _t3 = _context2.v;\n console.error(\"Failed to fetch metrics for tag \".concat(tagName, \":\"), _t3);\n case 9:\n _context2.p = 9;\n setLoadingMetrics(function (prev) {\n var newSet = new Set(prev);\n newSet[\"delete\"](tagName);\n return newSet;\n });\n return _context2.f(9);\n case 10:\n return _context2.a(2);\n }\n }, _callee2, null, [[2, 8, 9, 10]]);\n }));\n return function loadTagMetrics(_x) {\n return _ref2.apply(this, arguments);\n };\n }();\n var handleDeleteTag = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {\n var _t4;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n if (tagToDelete) {\n _context3.n = 1;\n break;\n }\n return _context3.a(2);\n case 1:\n _context3.p = 1;\n _context3.n = 2;\n return (0,_utils_tagsService__WEBPACK_IMPORTED_MODULE_3__.deleteTag)(tagToDelete.id);\n case 2:\n setTags(function (prev) {\n return prev.filter(function (tag) {\n return tag.id !== tagToDelete.id;\n });\n });\n // Remove the deleted tag from metrics as well\n setTagMetrics(function (prev) {\n var newMetrics = _objectSpread({}, prev);\n delete newMetrics[tagToDelete.name];\n return newMetrics;\n });\n setIsConfirmDialogOpen(false);\n setTagToDelete(null);\n _context3.n = 4;\n break;\n case 3:\n _context3.p = 3;\n _t4 = _context3.v;\n console.error('Failed to delete tag:', _t4);\n case 4:\n return _context3.a(2);\n }\n }, _callee3, null, [[1, 3]]);\n }));\n return function handleDeleteTag() {\n return _ref3.apply(this, arguments);\n };\n }();\n var handleEditTag = function handleEditTag(tag) {\n setSelectedTag(tag);\n setIsTagModalOpen(true);\n };\n var handleSaveTag = /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(tagData) {\n var updatedTags, oldTag, newTag, _t5;\n return _regenerator().w(function (_context4) {\n while (1) switch (_context4.n) {\n case 0:\n _context4.p = 0;\n if (!tagData.id) {\n _context4.n = 2;\n break;\n }\n _context4.n = 1;\n return (0,_utils_tagsService__WEBPACK_IMPORTED_MODULE_3__.updateTag)(tagData.id, tagData);\n case 1:\n updatedTags = tags.map(function (tag) {\n return tag.id === tagData.id ? tagData : tag;\n });\n\n // If tag name changed, update metrics key\n oldTag = tags.find(function (t) {\n return t.id === tagData.id;\n });\n if (oldTag && oldTag.name !== tagData.name) {\n setTagMetrics(function (prev) {\n var newMetrics = _objectSpread({}, prev);\n if (newMetrics[oldTag.name]) {\n newMetrics[tagData.name] = newMetrics[oldTag.name];\n delete newMetrics[oldTag.name];\n }\n return newMetrics;\n });\n }\n _context4.n = 4;\n break;\n case 2:\n _context4.n = 3;\n return (0,_utils_tagsService__WEBPACK_IMPORTED_MODULE_3__.createTag)(tagData);\n case 3:\n newTag = _context4.v;\n updatedTags = [].concat(_toConsumableArray(tags), [newTag]);\n // Initialize metrics for new tag\n setTagMetrics(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, newTag.name, {\n tasks: 0,\n notes: 0,\n projects: 0\n }));\n });\n case 4:\n setTags(updatedTags);\n setIsTagModalOpen(false);\n setSelectedTag(null);\n _context4.n = 6;\n break;\n case 5:\n _context4.p = 5;\n _t5 = _context4.v;\n console.error('Failed to save tag:', _t5);\n case 6:\n return _context4.a(2);\n }\n }, _callee4, null, [[0, 5]]);\n }));\n return function handleSaveTag(_x2) {\n return _ref4.apply(this, arguments);\n };\n }();\n var openConfirmDialog = function openConfirmDialog(tag) {\n setTagToDelete(tag);\n setIsConfirmDialogOpen(true);\n };\n var closeConfirmDialog = function closeConfirmDialog() {\n setIsConfirmDialogOpen(false);\n setTagToDelete(null);\n };\n var filteredTags = tags.filter(function (tag) {\n return tag.name.toLowerCase().includes(searchQuery.toLowerCase());\n });\n\n // Group tags alphabetically by first letter\n var groupedTags = filteredTags.reduce(function (groups, tag) {\n var firstLetter = tag.name.charAt(0).toUpperCase();\n if (!groups[firstLetter]) {\n groups[firstLetter] = [];\n }\n groups[firstLetter].push(tag);\n return groups;\n }, {});\n\n // Sort the groups by letter and sort tags within each group\n var sortedGroupKeys = Object.keys(groupedTags).sort();\n sortedGroupKeys.forEach(function (letter) {\n groupedTags[letter].sort(function (a, b) {\n return a.name.toLowerCase().localeCompare(b.name.toLowerCase());\n });\n });\n if (isLoading) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-center h-screen bg-gray-100 dark:bg-gray-900\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-xl font-semibold text-gray-700 dark:text-gray-200\"\n }, \"Loading tags...\"));\n }\n if (isError) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-red-500 p-4\"\n }, \"Error loading tags.\");\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex justify-center px-4 lg:px-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-full max-w-5xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between mb-8\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n className: \"h-6 w-6 mr-2 text-gray-900 dark:text-white\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h2\", {\n className: \"text-2xl font-light text-gray-900 dark:text-white\"\n }, \"Tags\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm p-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n className: \"h-5 w-5 text-gray-500 dark:text-gray-400 mr-2\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n placeholder: \"Search tags...\",\n value: searchQuery,\n onChange: function onChange(e) {\n return setSearchQuery(e.target.value);\n },\n className: \"w-full bg-transparent border-none focus:ring-0 focus:outline-none dark:text-white\"\n }))), filteredTags.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-gray-700 dark:text-gray-300\"\n }, \"No tags found.\") : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"space-y-8\"\n }, sortedGroupKeys.map(function (letter) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: letter\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-xl font-semibold text-gray-900 dark:text-white mb-2\"\n }, letter), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"hr\", {\n className: \"border-gray-300 dark:border-gray-600\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"ul\", {\n className: \"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\"\n }, groupedTags[letter].map(function (tag) {\n var metrics = tagMetrics[tag.name] || {\n tasks: 0,\n notes: 0,\n projects: 0\n };\n var hasItems = metrics.tasks > 0 || metrics.notes > 0 || metrics.projects > 0;\n var isMetricsLoaded = loadedMetrics.has(tag.name);\n var isMetricsLoading = loadingMetrics.has(tag.name);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"li\", {\n key: tag.id,\n className: \"bg-white dark:bg-gray-900 shadow rounded-lg p-4\",\n onMouseEnter: function onMouseEnter() {\n setHoveredTagId(tag.id || null);\n if (!isMetricsLoaded && !isMetricsLoading) {\n loadTagMetrics(tag.name);\n }\n },\n onMouseLeave: function onMouseLeave() {\n return setHoveredTagId(null);\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center space-x-3 flex-grow\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_6__.Link, {\n to: \"/tag/\".concat(tag.id),\n className: \"text-md font-semibold text-gray-900 dark:text-gray-100 hover:underline\"\n }, tag.name), isMetricsLoading && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center text-sm text-gray-400 dark:text-gray-500\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"animate-spin rounded-full h-4 w-4 border-2 border-gray-300 border-t-blue-500\"\n })), isMetricsLoaded && hasItems && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center space-x-3 text-sm text-gray-600 dark:text-gray-400\"\n }, metrics.projects > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center space-x-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n className: \"h-4 w-4 text-purple-500\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, metrics.projects)), metrics.tasks > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center space-x-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n className: \"h-4 w-4 text-blue-500\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, metrics.tasks)), metrics.notes > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center space-x-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n className: \"h-4 w-4 text-green-500\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, metrics.notes)))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex space-x-2 ml-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return handleEditTag(tag);\n },\n className: \"text-gray-500 hover:text-blue-700 dark:hover:text-blue-300 focus:outline-none transition-opacity \".concat(hoveredTagId === tag.id ? 'opacity-100' : 'opacity-0'),\n \"aria-label\": \"Edit \".concat(tag.name),\n title: \"Edit \".concat(tag.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n className: \"h-4 w-4\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return openConfirmDialog(tag);\n },\n className: \"text-gray-500 hover:text-red-700 dark:hover:text-red-300 focus:outline-none transition-opacity \".concat(hoveredTagId === tag.id ? 'opacity-100' : 'opacity-0'),\n \"aria-label\": \"Delete \".concat(tag.name),\n title: \"Delete \".concat(tag.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n className: \"h-4 w-4\"\n })))));\n })));\n })), isTagModalOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Tag_TagModal__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n isOpen: isTagModalOpen,\n onClose: function onClose() {\n return setIsTagModalOpen(false);\n },\n onSave: handleSaveTag,\n tag: selectedTag\n }), isConfirmDialogOpen && tagToDelete && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Shared_ConfirmDialog__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n title: \"Delete Tag\",\n message: \"Are you sure you want to delete the tag \\\"\".concat(tagToDelete.name, \"\\\"?\"),\n onConfirm: handleDeleteTag,\n onCancel: closeConfirmDialog\n })));\n};\n_s(Tags, \"uDhedY8Efot2bZ9Oy9x+kMshwPw=\");\n_c = Tags;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Tags);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"Tags\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Tags.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/NewTask.tsx":
+/*!**********************************************!*\
+ !*** ./frontend/components/Task/NewTask.tsx ***!
+ \**********************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _components_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../components/Shared/ToastContext */ \"./frontend/components/Shared/ToastContext.tsx\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/PlusCircleIcon.js\");\n/* harmony import */ var _utils_profileService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/profileService */ \"./frontend/utils/profileService.ts\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\nvar NewTask = function NewTask(_ref) {\n _s();\n var onTaskCreate = _ref.onTaskCreate;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(''),\n _useState2 = _slicedToArray(_useState, 2),\n taskName = _useState2[0],\n setTaskName = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState4 = _slicedToArray(_useState3, 2),\n showNameLengthHelper = _useState4[0],\n setShowNameLengthHelper = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true),\n _useState6 = _slicedToArray(_useState5, 2),\n taskIntelligenceEnabled = _useState6[0],\n setTaskIntelligenceEnabled = _useState6[1];\n var _useToast = (0,_components_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_1__.useToast)(),\n showSuccessToast = _useToast.showSuccessToast,\n showErrorToast = _useToast.showErrorToast;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_2__.useTranslation)(),\n t = _useTranslation.t;\n\n // Fetch task intelligence setting when component mounts\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var fetchTaskIntelligenceSetting = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var enabled, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n _context.p = 0;\n _context.n = 1;\n return (0,_utils_profileService__WEBPACK_IMPORTED_MODULE_3__.getTaskIntelligenceEnabled)();\n case 1:\n enabled = _context.v;\n setTaskIntelligenceEnabled(enabled);\n _context.n = 3;\n break;\n case 2:\n _context.p = 2;\n _t = _context.v;\n console.error('Error fetching task intelligence setting:', _t);\n setTaskIntelligenceEnabled(true); // Default to enabled\n case 3:\n return _context.a(2);\n }\n }, _callee, null, [[0, 2]]);\n }));\n return function fetchTaskIntelligenceSetting() {\n return _ref2.apply(this, arguments);\n };\n }();\n fetchTaskIntelligenceSetting();\n }, []);\n var handleInputChange = function handleInputChange(event) {\n var value = event.target.value;\n setTaskName(value);\n\n // Show helper message for task name if it's too short (only if intelligence is enabled)\n if (taskIntelligenceEnabled) {\n var trimmedValue = value.trim();\n setShowNameLengthHelper(trimmedValue.length > 0 && trimmedValue.length < 10);\n }\n };\n var handleKeyDown = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(event) {\n var taskText, _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n if (!(event.key === 'Enter' && taskName.trim())) {\n _context2.n = 4;\n break;\n }\n taskText = taskName.trim();\n setTaskName('');\n setShowNameLengthHelper(false); // Hide helper when creating task\n _context2.p = 1;\n _context2.n = 2;\n return onTaskCreate(taskText);\n case 2:\n _context2.n = 4;\n break;\n case 3:\n _context2.p = 3;\n _t2 = _context2.v;\n console.error('Error creating task:', _t2);\n setTaskName(taskText);\n showErrorToast(t('errors.taskCreate', 'Failed to create task.'));\n case 4:\n return _context2.a(2);\n }\n }, _callee2, null, [[1, 3]]);\n }));\n return function handleKeyDown(_x) {\n return _ref3.apply(this, arguments);\n };\n }();\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between py-3 px-4 border-b border-gray-200 dark:border-gray-800 rounded-lg shadow-sm bg-white dark:bg-gray-900\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-xl text-gray-500 dark:text-gray-400 mr-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n className: \"h-6 w-6\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n value: taskName,\n onChange: handleInputChange,\n onKeyDown: handleKeyDown,\n className: \"font-medium text-sm text-gray-900 dark:text-gray-100 placeholder-gray-400 dark:placeholder-gray-600 bg-transparent dark:bg-transparent focus:outline-none focus:ring-0 w-full appearance-none\",\n placeholder: t('tasks.addNewTask', 'Προσθήκη Νέας Εργασίας')\n })), showNameLengthHelper && taskIntelligenceEnabled && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mt-2 p-3 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-700 rounded-md\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex-shrink-0\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"svg\", {\n className: \"h-4 w-4 text-blue-400 mt-0.5\",\n fill: \"currentColor\",\n viewBox: \"0 0 20 20\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\",\n clipRule: \"evenodd\"\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"ml-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-sm text-blue-800 dark:text-blue-200\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"strong\", null, t('task.nameHelper.title', 'Make it more descriptive!'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-xs text-blue-700 dark:text-blue-300 mt-1\"\n }, t('task.nameHelper.suggestion', 'Try adding more details like \"Call dentist to schedule cleaning appointment\" instead of just \"Call dentist\"'))))));\n};\n_s(NewTask, \"M9PKmhtZNefTL/Qa+Xk0MqagYrE=\", false, function () {\n return [_components_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_1__.useToast, react_i18next__WEBPACK_IMPORTED_MODULE_2__.useTranslation];\n});\n_c = NewTask;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NewTask);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"NewTask\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/NewTask.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/NextTaskSuggestion.tsx":
+/*!*********************************************************!*\
+ !*** ./frontend/components/Task/NextTaskSuggestion.tsx ***!
+ \*********************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/XMarkIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/SparklesIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/PlayIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ArrowPathIcon.js\");\n/* harmony import */ var _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Shared/ToastContext */ \"./frontend/components/Shared/ToastContext.tsx\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\nvar NextTaskSuggestion = function NextTaskSuggestion(_ref) {\n _s();\n var metrics = _ref.metrics,\n onTaskUpdate = _ref.onTaskUpdate,\n onClose = _ref.onClose;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var _useToast = (0,_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_2__.useToast)(),\n showSuccessToast = _useToast.showSuccessToast;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState2 = _slicedToArray(_useState, 2),\n isUpdating = _useState2[0],\n setIsUpdating = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0),\n _useState4 = _slicedToArray(_useState3, 2),\n currentTaskIndex = _useState4[0],\n setCurrentTaskIndex = _useState4[1];\n\n // Check if there are any tasks in progress\n // If there are tasks in progress, don't show the suggestion\n if (metrics.tasks_in_progress.length > 0) {\n return null;\n }\n\n // Helper function to check if task is not started\n var isNotStarted = function isNotStarted(task) {\n return task.status === 'not_started' || task.status === 0;\n };\n\n // Get all available tasks in priority order:\n // 1. Today plan tasks (user's intentional selection for today)\n // 2. Due today tasks (time-based urgency)\n // 3. Suggested tasks from today page (algorithm recommendations)\n var todayPlanAvailable = (metrics.today_plan_tasks || []).filter(isNotStarted);\n var dueTodayAvailable = metrics.tasks_due_today.filter(isNotStarted);\n var suggestedAvailable = metrics.suggested_tasks.filter(isNotStarted);\n\n // Combine all available tasks with priority (intelligent selection)\n var allAvailableTasks = [].concat(_toConsumableArray(todayPlanAvailable.map(function (task) {\n return {\n task: task,\n source: 'today_plan'\n };\n })), _toConsumableArray(dueTodayAvailable.map(function (task) {\n return {\n task: task,\n source: 'due_today'\n };\n })), _toConsumableArray(suggestedAvailable.map(function (task) {\n return {\n task: task,\n source: 'suggested'\n };\n })));\n if (allAvailableTasks.length === 0) {\n return null;\n }\n\n // Get current task based on index, wrap around if needed\n var currentTaskData = allAvailableTasks[currentTaskIndex % allAvailableTasks.length];\n var suggestedTask = currentTaskData.task;\n var suggestionSource = currentTaskData.source;\n var handleStartTask = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var updatedTask, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n if (!(!suggestedTask || !suggestedTask.id)) {\n _context.n = 1;\n break;\n }\n return _context.a(2);\n case 1:\n setIsUpdating(true);\n _context.p = 2;\n // Universal rule: when setting status to in_progress, also add to today\n updatedTask = _objectSpread(_objectSpread({}, suggestedTask), {}, {\n status: 'in_progress',\n today: true\n });\n _context.n = 3;\n return onTaskUpdate(updatedTask);\n case 3:\n showSuccessToast(t('task.startedSuccessfully', 'Task started successfully!'));\n _context.n = 5;\n break;\n case 4:\n _context.p = 4;\n _t = _context.v;\n console.error('Error starting task:', _t);\n case 5:\n _context.p = 5;\n setIsUpdating(false);\n return _context.f(5);\n case 6:\n return _context.a(2);\n }\n }, _callee, null, [[2, 4, 5, 6]]);\n }));\n return function handleStartTask() {\n return _ref2.apply(this, arguments);\n };\n }();\n var handleGiveMeSomethingElse = function handleGiveMeSomethingElse() {\n setCurrentTaskIndex(function (prev) {\n return prev + 1;\n });\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-6 p-4 bg-white dark:bg-gray-900 border-l-4 border-purple-500 rounded-lg shadow relative\"\n }, onClose && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: onClose,\n className: \"absolute top-2 right-2 p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 transition-colors\",\n \"aria-label\": t('common.close', 'Close')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: \"h-5 w-5\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n className: \"h-6 w-6 text-purple-500 dark:text-purple-400 mr-3 flex-shrink-0 mt-0.5\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex-1 pr-8\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-gray-700 dark:text-gray-300 font-medium mb-2 break-words\"\n }, suggestionSource === 'today_plan' && t('nextTask.suggestionTodayPlan', 'Since there is nothing in progress, what about starting with this task from your today plan'), suggestionSource === 'due_today' && t('nextTask.suggestionDueToday', 'Since there is nothing in progress, what about starting with this task due today'), suggestionSource === 'suggested' && t('nextTask.suggestionSuggested', 'Since there is nothing in progress, what about starting with this suggested task')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-gray-50 dark:bg-gray-800 rounded-md p-3 mb-3\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-gray-900 dark:text-gray-100 font-medium break-words\"\n }, suggestedTask.name), suggestedTask.due_date && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-sm text-gray-500 dark:text-gray-400 mt-1\"\n }, t('forms.task.labels.dueDate', 'Due'), \": \", new Date(suggestedTask.due_date).toLocaleDateString())), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center space-x-3\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: handleStartTask,\n disabled: isUpdating,\n className: \"inline-flex items-center px-4 py-2 bg-green-600 hover:bg-green-700 disabled:bg-green-400 text-white text-sm font-medium rounded-md transition-colors\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n className: \"h-4 w-4 mr-2\"\n }), isUpdating ? t('nextTask.starting', 'Starting...') : t('nextTask.letsDoIt', \"Yes, let's do it!\")), allAvailableTasks.length > 1 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: handleGiveMeSomethingElse,\n disabled: isUpdating,\n className: \"inline-flex items-center px-4 py-2 bg-gray-600 hover:bg-gray-700 disabled:bg-gray-400 text-white text-sm font-medium rounded-md transition-colors\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n className: \"h-4 w-4 mr-2\"\n }), t('nextTask.giveMeSomethingElse', 'Give me something else'))))));\n};\n_s(NextTaskSuggestion, \"P9uSiP2YeVGrxB7ECIG2tD2tmYM=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation, _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_2__.useToast];\n});\n_c = NextTaskSuggestion;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NextTaskSuggestion);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"NextTaskSuggestion\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/NextTaskSuggestion.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/RecurrenceInput.tsx":
+/*!******************************************************!*\
+ !*** ./frontend/components/Task/RecurrenceInput.tsx ***!
+ \******************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\nvar RecurrenceInput = function RecurrenceInput(_ref) {\n _s();\n var recurrenceType = _ref.recurrenceType,\n recurrenceInterval = _ref.recurrenceInterval,\n recurrenceEndDate = _ref.recurrenceEndDate,\n recurrenceWeekday = _ref.recurrenceWeekday,\n recurrenceMonthDay = _ref.recurrenceMonthDay,\n recurrenceWeekOfMonth = _ref.recurrenceWeekOfMonth,\n completionBased = _ref.completionBased,\n _onChange = _ref.onChange,\n _ref$disabled = _ref.disabled,\n disabled = _ref$disabled === void 0 ? false : _ref$disabled,\n _ref$isChildTask = _ref.isChildTask,\n isChildTask = _ref$isChildTask === void 0 ? false : _ref$isChildTask,\n _ref$parentTaskLoadin = _ref.parentTaskLoading,\n parentTaskLoading = _ref$parentTaskLoadin === void 0 ? false : _ref$parentTaskLoadin,\n onEditParent = _ref.onEditParent,\n onParentRecurrenceChange = _ref.onParentRecurrenceChange;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState2 = _slicedToArray(_useState, 2),\n editingParentRecurrence = _useState2[0],\n setEditingParentRecurrence = _useState2[1];\n var weekdays = [{\n value: 0,\n label: t('weekdays.sunday', 'Sunday')\n }, {\n value: 1,\n label: t('weekdays.monday', 'Monday')\n }, {\n value: 2,\n label: t('weekdays.tuesday', 'Tuesday')\n }, {\n value: 3,\n label: t('weekdays.wednesday', 'Wednesday')\n }, {\n value: 4,\n label: t('weekdays.thursday', 'Thursday')\n }, {\n value: 5,\n label: t('weekdays.friday', 'Friday')\n }, {\n value: 6,\n label: t('weekdays.saturday', 'Saturday')\n }];\n var weekOfMonthOptions = [{\n value: 1,\n label: t('recurrence.firstWeek', 'First')\n }, {\n value: 2,\n label: t('recurrence.secondWeek', 'Second')\n }, {\n value: 3,\n label: t('recurrence.thirdWeek', 'Third')\n }, {\n value: 4,\n label: t('recurrence.fourthWeek', 'Fourth')\n }, {\n value: 5,\n label: t('recurrence.lastWeek', 'Last')\n }];\n var renderRecurrenceTypeSelect = function renderRecurrenceTypeSelect(customOnChange, isDisabled) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-xs font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('forms.task.labels.recurrenceType', 'Repeat')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"select\", {\n value: recurrenceType,\n onChange: function onChange(e) {\n return (customOnChange || _onChange)('recurrence_type', e.target.value);\n },\n className: \"block w-full border border-gray-300 dark:border-gray-900 rounded-md focus:outline-none shadow-sm px-2 py-2 text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100\",\n disabled: isDisabled\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"none\"\n }, t('recurrence.none', 'No repeat')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"daily\"\n }, t('recurrence.daily', 'Daily')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"weekly\"\n }, t('recurrence.weekly', 'Weekly')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"monthly\"\n }, t('recurrence.monthly', 'Monthly')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"monthly_weekday\"\n }, t('recurrence.monthlyWeekday', 'Monthly on weekday')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"monthly_last_day\"\n }, t('recurrence.monthlyLastDay', 'Monthly on last day'))));\n };\n var renderIntervalInput = function renderIntervalInput(customOnChange, isDisabled) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-xs font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('forms.task.labels.recurrenceInterval', 'Every')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center space-x-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"number\",\n min: \"1\",\n max: \"999\",\n value: recurrenceInterval || 1,\n onChange: function onChange(e) {\n return (customOnChange || _onChange)('recurrence_interval', parseInt(e.target.value));\n },\n className: \"block w-20 border border-gray-300 dark:border-gray-900 rounded-md focus:outline-none shadow-sm px-2 py-2 text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100\",\n disabled: isDisabled\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-sm text-gray-600 dark:text-gray-400\"\n }, recurrenceType === 'daily' && t('recurrence.days', 'days'), recurrenceType === 'weekly' && t('recurrence.weeks', 'weeks'), (recurrenceType === 'monthly' || recurrenceType === 'monthly_weekday' || recurrenceType === 'monthly_last_day') && t('recurrence.months', 'months'))));\n };\n var renderWeekdaySelect = function renderWeekdaySelect(customOnChange, isDisabled) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-xs font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('forms.task.labels.weekday', 'On day')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"select\", {\n value: recurrenceWeekday !== undefined ? recurrenceWeekday : '',\n onChange: function onChange(e) {\n return (customOnChange || _onChange)('recurrence_weekday', e.target.value ? parseInt(e.target.value) : null);\n },\n className: \"block w-full border border-gray-300 dark:border-gray-900 rounded-md focus:outline-none shadow-sm px-2 py-2 text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100\",\n disabled: isDisabled\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"\"\n }, t('recurrence.anyDay', 'Any day')), weekdays.map(function (day) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n key: day.value,\n value: day.value\n }, day.label);\n })));\n };\n var renderMonthDayInput = function renderMonthDayInput(customOnChange, isDisabled) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-xs font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('forms.task.labels.monthDay', 'Day of month')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"number\",\n min: \"1\",\n max: \"31\",\n value: recurrenceMonthDay || '',\n onChange: function onChange(e) {\n return (customOnChange || _onChange)('recurrence_month_day', e.target.value ? parseInt(e.target.value) : null);\n },\n placeholder: t('recurrence.monthDayPlaceholder', 'Leave empty for current day'),\n className: \"block w-full border border-gray-300 dark:border-gray-900 rounded-md focus:outline-none shadow-sm px-2 py-2 text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100\",\n disabled: isDisabled\n }));\n };\n var renderMonthlyWeekdayInputs = function renderMonthlyWeekdayInputs() {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"grid grid-cols-2 gap-4 mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-xs font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('forms.task.labels.weekOfMonth', 'Week of month')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"select\", {\n value: recurrenceWeekOfMonth || 1,\n onChange: function onChange(e) {\n return _onChange('recurrence_week_of_month', parseInt(e.target.value));\n },\n className: \"block w-full border border-gray-300 dark:border-gray-900 rounded-md focus:outline-none shadow-sm px-2 py-2 text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100\"\n }, weekOfMonthOptions.map(function (option) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n key: option.value,\n value: option.value\n }, option.label);\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-xs font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('forms.task.labels.weekday', 'Weekday')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"select\", {\n value: recurrenceWeekday || 1,\n onChange: function onChange(e) {\n return _onChange('recurrence_weekday', parseInt(e.target.value));\n },\n className: \"block w-full border border-gray-300 dark:border-gray-900 rounded-md focus:outline-none shadow-sm px-2 py-2 text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100\"\n }, weekdays.map(function (day) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n key: day.value,\n value: day.value\n }, day.label);\n }))));\n };\n var renderEndDateInput = function renderEndDateInput(customOnChange, isDisabled) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-xs font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('forms.task.labels.recurrenceEndDate', 'End date (optional)')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"date\",\n value: recurrenceEndDate || '',\n onChange: function onChange(e) {\n return (customOnChange || _onChange)('recurrence_end_date', e.target.value || null);\n },\n className: \"block w-full border border-gray-300 dark:border-gray-900 rounded-md focus:outline-none shadow-sm px-2 py-2 text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100\",\n disabled: isDisabled\n }));\n };\n var renderCompletionBasedToggle = function renderCompletionBasedToggle() {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"flex items-center space-x-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n checked: completionBased,\n onChange: function onChange(e) {\n return _onChange('completion_based', e.target.checked);\n },\n className: \"rounded border-gray-300 text-blue-600 shadow-sm focus:border-blue-300 focus:ring focus:ring-blue-200 focus:ring-opacity-50\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-sm text-gray-700 dark:text-gray-300\"\n }, t('forms.task.labels.completionBased', 'Repeat after completion'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-xs text-gray-500 dark:text-gray-400 mt-1\"\n }, t('forms.task.completionBasedHelp', 'If checked, the next task will be created based on completion date instead of due date')));\n };\n\n // Show message for child tasks\n if (isChildTask && parentTaskLoading) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"pb-3 border-t border-gray-200 dark:border-gray-700 pt-4 mt-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-sm font-medium text-gray-900 dark:text-gray-100 mb-4\"\n }, t('forms.task.recurrenceSettings', 'Recurrence Settings')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-sm text-gray-600 dark:text-gray-400\"\n }, \"Loading parent task recurrence settings...\"));\n }\n if (isChildTask) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"pb-3\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-sm font-medium text-gray-900 dark:text-gray-100 mb-4\"\n }, t('forms.task.recurrenceSettings', 'Recurrence Settings')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-blue-50 dark:bg-blue-900/30 border border-blue-200 dark:border-blue-800 rounded-md p-3 mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-sm text-blue-800 dark:text-blue-200\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"strong\", null, \"Recurring Task Instance\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"mt-1\"\n }, \"This task was generated from a recurring task. The recurrence settings shown below are inherited from the original task and cannot be edited here.\"), onParentRecurrenceChange && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: function onClick() {\n return setEditingParentRecurrence(!editingParentRecurrence);\n },\n className: \"mt-2 inline-flex items-center px-3 py-1 border text-xs font-medium rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 \".concat(editingParentRecurrence ? 'border-red-300 dark:border-red-600 text-red-700 dark:text-red-300 bg-red-50 dark:bg-red-900/50 hover:bg-red-100 dark:hover:bg-red-800/50' : 'border-blue-300 dark:border-blue-600 text-blue-700 dark:text-blue-300 bg-white dark:bg-blue-900/50 hover:bg-blue-50 dark:hover:bg-blue-800/50')\n }, editingParentRecurrence ? 'Cancel Edit' : 'Edit Parent Recurrence'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: editingParentRecurrence ? '' : 'opacity-60 pointer-events-none'\n }, editingParentRecurrence && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4 p-2 bg-yellow-50 dark:bg-yellow-900/30 border border-yellow-200 dark:border-yellow-800 rounded-md\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-xs text-yellow-800 dark:text-yellow-200\"\n }, \"\\u26A0\\uFE0F You are editing the parent task's recurrence settings. Changes will affect all future instances of this recurring task.\")), recurrenceType === 'none' ? renderRecurrenceTypeSelect(editingParentRecurrence ? onParentRecurrenceChange : undefined, !editingParentRecurrence) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, renderRecurrenceTypeSelect(editingParentRecurrence ? onParentRecurrenceChange : undefined, !editingParentRecurrence), renderIntervalInput(editingParentRecurrence ? onParentRecurrenceChange : undefined, !editingParentRecurrence), (recurrenceType === 'weekly' || recurrenceType === 'monthly_weekday') && renderWeekdaySelect(editingParentRecurrence ? onParentRecurrenceChange : undefined, !editingParentRecurrence), recurrenceType === 'monthly' && renderMonthDayInput(editingParentRecurrence ? onParentRecurrenceChange : undefined, !editingParentRecurrence), recurrenceType === 'monthly_weekday' && renderMonthlyWeekdayInputs(), renderEndDateInput(editingParentRecurrence ? onParentRecurrenceChange : undefined, !editingParentRecurrence), renderCompletionBasedToggle())));\n }\n if (recurrenceType === 'none') {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"pb-3\"\n }, renderRecurrenceTypeSelect());\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"pb-3\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-sm font-medium text-gray-900 dark:text-gray-100 mb-4\"\n }, t('forms.task.recurrenceSettings', 'Recurrence Settings')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"grid grid-cols-1 md:grid-cols-3 gap-4 mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-xs font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('forms.task.labels.recurrenceType', 'Repeat')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"select\", {\n value: recurrenceType,\n onChange: function onChange(e) {\n return _onChange('recurrence_type', e.target.value);\n },\n className: \"block w-full border border-gray-300 dark:border-gray-900 rounded-md focus:outline-none shadow-sm px-2 py-2 text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100\",\n disabled: disabled\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"none\"\n }, t('recurrence.none', 'No repeat')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"daily\"\n }, t('recurrence.daily', 'Daily')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"weekly\"\n }, t('recurrence.weekly', 'Weekly')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"monthly\"\n }, t('recurrence.monthly', 'Monthly')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"monthly_weekday\"\n }, t('recurrence.monthlyWeekday', 'Monthly on weekday')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"monthly_last_day\"\n }, t('recurrence.monthlyLastDay', 'Monthly on last day')))), (recurrenceType === 'daily' || recurrenceType === 'weekly' || recurrenceType === 'monthly' || recurrenceType === 'monthly_weekday' || recurrenceType === 'monthly_last_day') && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-xs font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('forms.task.labels.recurrenceInterval', 'Every')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center space-x-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"number\",\n min: \"1\",\n max: \"999\",\n value: recurrenceInterval || 1,\n onChange: function onChange(e) {\n return _onChange('recurrence_interval', parseInt(e.target.value));\n },\n className: \"block w-20 border border-gray-300 dark:border-gray-900 rounded-md focus:outline-none shadow-sm px-2 py-2 text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100\",\n disabled: disabled\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-sm text-gray-600 dark:text-gray-400\"\n }, recurrenceType === 'daily' && t('recurrence.days', 'days'), recurrenceType === 'weekly' && t('recurrence.weeks', 'weeks'), (recurrenceType === 'monthly' || recurrenceType === 'monthly_weekday' || recurrenceType === 'monthly_last_day') && t('recurrence.months', 'months')))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-xs font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('forms.task.labels.recurrenceEndDate', 'End date (optional)')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"date\",\n value: recurrenceEndDate || '',\n onChange: function onChange(e) {\n return _onChange('recurrence_end_date', e.target.value || null);\n },\n className: \"block w-full border border-gray-300 dark:border-gray-900 rounded-md focus:outline-none shadow-sm px-2 py-2 text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100\",\n disabled: disabled\n }))), recurrenceType === 'weekly' && renderWeekdaySelect(), recurrenceType === 'monthly' && renderMonthDayInput(), recurrenceType === 'monthly_weekday' && renderMonthlyWeekdayInputs(), renderCompletionBasedToggle());\n};\n_s(RecurrenceInput, \"Q4sFGwi6uO4mbRSYAok5GyB1wOY=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = RecurrenceInput;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (RecurrenceInput);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"RecurrenceInput\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/RecurrenceInput.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/SimplifiedTaskModal.tsx":
+/*!**********************************************************!*\
+ !*** ./frontend/components/Task/SimplifiedTaskModal.tsx ***!
+ \**********************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Shared/ToastContext */ \"./frontend/components/Shared/ToastContext.tsx\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _utils_inboxService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/inboxService */ \"./frontend/utils/inboxService.ts\");\n/* harmony import */ var _utils_authUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils/authUtils */ \"./frontend/utils/authUtils.ts\");\n/* harmony import */ var _Shared_UrlPreview__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Shared/UrlPreview */ \"./frontend/components/Shared/UrlPreview.tsx\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\nvar SimplifiedTaskModal = function SimplifiedTaskModal(_ref) {\n _s();\n var isOpen = _ref.isOpen,\n onClose = _ref.onClose,\n onSave = _ref.onSave,\n _ref$initialText = _ref.initialText,\n initialText = _ref$initialText === void 0 ? \"\" : _ref$initialText,\n _ref$editMode = _ref.editMode,\n editMode = _ref$editMode === void 0 ? false : _ref$editMode,\n onEdit = _ref.onEdit;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_2__.useTranslation)(),\n t = _useTranslation.t;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(initialText),\n _useState2 = _slicedToArray(_useState, 2),\n inputText = _useState2[0],\n setInputText = _useState2[1];\n var modalRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState4 = _slicedToArray(_useState3, 2),\n isClosing = _useState4[0],\n setIsClosing = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState6 = _slicedToArray(_useState5, 2),\n isSaving = _useState6[0],\n setIsSaving = _useState6[1];\n var _useToast = (0,_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_1__.useToast)(),\n showSuccessToast = _useToast.showSuccessToast,\n showErrorToast = _useToast.showErrorToast;\n var nameInputRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('inbox'),\n _useState8 = _slicedToArray(_useState7, 2),\n saveMode = _useState8[0],\n setSaveMode = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState0 = _slicedToArray(_useState9, 2),\n urlPreview = _useState0[0],\n setUrlPreview = _useState0[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (isOpen && nameInputRef.current) {\n nameInputRef.current.focus();\n }\n }, [isOpen]);\n var handleChange = function handleChange(e) {\n setInputText(e.target.value);\n };\n var handleSubmit = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var newTask, _t, _t2, _t3;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n if (!(!inputText.trim() || isSaving)) {\n _context.n = 1;\n break;\n }\n return _context.a(2);\n case 1:\n setIsSaving(true);\n _context.p = 2;\n if (!(editMode && onEdit)) {\n _context.n = 4;\n break;\n }\n _context.n = 3;\n return onEdit(inputText.trim());\n case 3:\n setIsClosing(true);\n setTimeout(function () {\n onClose();\n setIsClosing(false);\n }, 300);\n return _context.a(2);\n case 4:\n if (!(saveMode === 'task')) {\n _context.n = 10;\n break;\n }\n newTask = {\n name: inputText.trim(),\n status: \"not_started\"\n };\n _context.p = 5;\n _context.n = 6;\n return onSave(newTask);\n case 6:\n showSuccessToast(t('task.createSuccess'));\n setInputText('');\n handleClose();\n _context.n = 9;\n break;\n case 7:\n _context.p = 7;\n _t = _context.v;\n if (!(0,_utils_authUtils__WEBPACK_IMPORTED_MODULE_4__.isAuthError)(_t)) {\n _context.n = 8;\n break;\n }\n return _context.a(2);\n case 8:\n throw _t;\n case 9:\n _context.n = 13;\n break;\n case 10:\n _context.p = 10;\n _context.n = 11;\n return (0,_utils_inboxService__WEBPACK_IMPORTED_MODULE_3__.createInboxItemWithStore)(inputText.trim());\n case 11:\n showSuccessToast(t('inbox.itemAdded'));\n handleClose();\n _context.n = 13;\n break;\n case 12:\n _context.p = 12;\n _t2 = _context.v;\n console.error('Failed to create inbox item:', _t2);\n showErrorToast(t('inbox.addError'));\n setIsSaving(false);\n case 13:\n _context.n = 15;\n break;\n case 14:\n _context.p = 14;\n _t3 = _context.v;\n console.error('Failed to save:', _t3);\n if (editMode) {\n showErrorToast(t('inbox.updateError'));\n } else {\n showErrorToast(saveMode === 'task' ? t('task.createError') : t('inbox.addError'));\n }\n case 15:\n _context.p = 15;\n setIsSaving(false);\n return _context.f(15);\n case 16:\n return _context.a(2);\n }\n }, _callee, null, [[10, 12], [5, 7], [2, 14, 15, 16]]);\n })), [inputText, isSaving, editMode, onEdit, saveMode, onSave, showSuccessToast, showErrorToast, t, onClose]);\n var handleClose = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () {\n setIsClosing(true);\n setTimeout(function () {\n onClose();\n if (!editMode) {\n setInputText(\"\");\n setSaveMode('inbox');\n }\n setIsClosing(false);\n }, 300);\n }, [onClose, editMode]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var handleClickOutside = function handleClickOutside(event) {\n if (modalRef.current && !modalRef.current.contains(event.target)) {\n handleClose();\n }\n };\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n return function () {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isOpen]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var handleKeyDown = function handleKeyDown(event) {\n if (event.key === \"Escape\") {\n handleClose();\n }\n };\n if (isOpen) {\n document.addEventListener(\"keydown\", handleKeyDown);\n }\n return function () {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [isOpen, handleClose]); // Only depend on isOpen and handleClose\n\n if (!isOpen) return null;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"fixed top-16 left-0 right-0 bottom-0 flex items-start sm:items-center justify-center bg-gray-900 bg-opacity-80 z-40 transition-opacity duration-300 \".concat(isClosing ? \"opacity-0\" : \"opacity-100\")\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n ref: modalRef,\n className: \"bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-800 sm:rounded-lg sm:shadow-2xl w-full sm:max-w-2xl md:max-w-3xl overflow-hidden transform transition-transform duration-300 \".concat(isClosing ? \"scale-95\" : \"scale-100\", \" flex flex-col\")\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-6 px-8\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n ref: nameInputRef,\n type: \"text\",\n name: \"text\",\n value: inputText,\n onChange: handleChange,\n required: true,\n className: \"flex-1 text-xl font-semibold dark:bg-gray-800 text-black dark:text-white border-b-2 border-gray-200 dark:border-gray-900 focus:outline-none shadow-sm py-2\",\n placeholder: t('inbox.captureThought'),\n onKeyDown: function onKeyDown(e) {\n if (e.key === 'Enter' && !e.shiftKey && !isSaving) {\n e.preventDefault();\n handleSubmit();\n }\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: handleSubmit,\n disabled: !inputText.trim() || isSaving,\n className: \"ml-4 inline-flex justify-center px-4 py-2 text-sm font-medium text-white rounded-md shadow-sm focus:outline-none \".concat(inputText.trim() && !isSaving ? \"bg-blue-600 hover:bg-blue-700\" : \"bg-blue-400 cursor-not-allowed\")\n }, isSaving ? t('common.saving') : t('common.save'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Shared_UrlPreview__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n text: inputText,\n onPreviewChange: setUrlPreview\n }))));\n};\n_s(SimplifiedTaskModal, \"Wnm+IQrFJBkOyVvwxWdT5/KpbME=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_2__.useTranslation, _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_1__.useToast];\n});\n_c = SimplifiedTaskModal;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SimplifiedTaskModal);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"SimplifiedTaskModal\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/SimplifiedTaskModal.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/TaskActions.tsx":
+/*!**************************************************!*\
+ !*** ./frontend/components/Task/TaskActions.tsx ***!
+ \**************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/TrashIcon.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\n\n\n\nvar TaskActions = function TaskActions(_ref) {\n _s();\n var taskId = _ref.taskId,\n onDelete = _ref.onDelete,\n onSave = _ref.onSave,\n onCancel = _ref.onCancel;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-3 flex-shrink-0 flex justify-end space-x-2\"\n }, taskId && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: onDelete,\n className: \"p-2 bg-red-600 text-white rounded hover:bg-red-700 dark:bg-red-500 dark:hover:bg-red-600 flex items-center justify-center\",\n title: t('common.delete', 'Delete'),\n \"aria-label\": t('common.delete', 'Delete')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n className: \"h-5 w-5\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: onCancel,\n className: \"px-3 py-2 bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-200 rounded hover:bg-gray-300 dark:hover:bg-gray-600 text-sm\"\n }, t('common.cancel', 'Cancel')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: onSave,\n className: \"px-3 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 dark:bg-blue-500 dark:hover:bg-blue-600 text-sm\"\n }, t('common.save', 'Save')));\n};\n_s(TaskActions, \"zlIdU9EjM2llFt74AbE2KsUJXyM=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = TaskActions;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TaskActions);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"TaskActions\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/TaskActions.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/TaskForm/TaskContentSection.tsx":
+/*!******************************************************************!*\
+ !*** ./frontend/components/Task/TaskForm/TaskContentSection.tsx ***!
+ \******************************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\n\n\nvar TaskContentSection = function TaskContentSection(_ref) {\n _s();\n var taskId = _ref.taskId,\n value = _ref.value,\n onChange = _ref.onChange;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"px-4 py-4 border-b border-gray-200 dark:border-gray-700\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-sm font-medium text-gray-900 dark:text-gray-100 mb-3\"\n }, t('forms.noteContent', 'Content')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"textarea\", {\n id: \"task_note_\".concat(taskId),\n name: \"note\",\n rows: 3,\n value: value,\n onChange: onChange,\n className: \"block w-full border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 shadow-sm p-3 text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100\",\n placeholder: t('forms.noteContentPlaceholder', 'Add task description...')\n }));\n};\n_s(TaskContentSection, \"zlIdU9EjM2llFt74AbE2KsUJXyM=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = TaskContentSection;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TaskContentSection);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"TaskContentSection\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/TaskForm/TaskContentSection.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/TaskForm/TaskMetadataSection.tsx":
+/*!*******************************************************************!*\
+ !*** ./frontend/components/Task/TaskForm/TaskMetadataSection.tsx ***!
+ \*******************************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _Shared_PriorityDropdown__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Shared/PriorityDropdown */ \"./frontend/components/Shared/PriorityDropdown.tsx\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\n\n\n\nvar TaskMetadataSection = function TaskMetadataSection(_ref) {\n _s();\n var priority = _ref.priority,\n dueDate = _ref.dueDate,\n taskId = _ref.taskId,\n onStatusChange = _ref.onStatusChange,\n onPriorityChange = _ref.onPriorityChange,\n onDueDateChange = _ref.onDueDateChange;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-xs font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('forms.task.labels.priority', 'Priority')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Shared_PriorityDropdown__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n value: priority,\n onChange: onPriorityChange\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"block text-xs font-medium text-gray-700 dark:text-gray-300 mb-2\"\n }, t('forms.task.labels.dueDate', 'Due Date')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"date\",\n id: \"task_due_date_\".concat(taskId),\n name: \"due_date\",\n value: dueDate,\n onChange: onDueDateChange,\n className: \"block w-full focus:outline-none focus:ring-2 focus:ring-blue-500 shadow-sm px-3 py-2 text-sm bg-white dark:bg-gray-900 border border-gray-300 dark:border-gray-600 rounded-md text-gray-900 dark:text-gray-100\"\n })));\n};\n_s(TaskMetadataSection, \"zlIdU9EjM2llFt74AbE2KsUJXyM=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = TaskMetadataSection;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TaskMetadataSection);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"TaskMetadataSection\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/TaskForm/TaskMetadataSection.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/TaskForm/TaskProjectSection.tsx":
+/*!******************************************************************!*\
+ !*** ./frontend/components/Task/TaskForm/TaskProjectSection.tsx ***!
+ \******************************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\n\n\nvar TaskProjectSection = function TaskProjectSection(_ref) {\n _s();\n var newProjectName = _ref.newProjectName,\n onProjectSearch = _ref.onProjectSearch,\n dropdownOpen = _ref.dropdownOpen,\n filteredProjects = _ref.filteredProjects,\n onProjectSelection = _ref.onProjectSelection,\n onCreateProject = _ref.onCreateProject,\n isCreatingProject = _ref.isCreatingProject;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"relative\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n placeholder: t('forms.task.projectSearchPlaceholder', 'Search or create a project...'),\n value: newProjectName,\n onChange: onProjectSearch,\n className: \"block w-full border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 shadow-sm px-3 py-2 text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100\"\n }), dropdownOpen && newProjectName && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"absolute mt-1 bg-white dark:bg-gray-800 shadow-lg rounded-md w-full z-50 border border-gray-200 dark:border-gray-700\"\n }, filteredProjects.length > 0 ? filteredProjects.map(function (project) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n key: project.id,\n type: \"button\",\n onClick: function onClick() {\n return onProjectSelection(project);\n },\n className: \"block w-full text-gray-700 dark:text-gray-300 text-left px-4 py-2 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\n }, project.name);\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"px-4 py-2 text-gray-500 dark:text-gray-400\"\n }, t('forms.task.noMatchingProjects', 'No matching projects')), newProjectName && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: onCreateProject,\n disabled: isCreatingProject,\n className: \"block w-full text-left px-4 py-2 bg-blue-500 text-white hover:bg-blue-600 transition-colors\"\n }, isCreatingProject ? t('forms.task.creatingProject', 'Creating...') : t('forms.task.createProject', '+ Create') + \" \\\"\".concat(newProjectName, \"\\\"\"))));\n};\n_s(TaskProjectSection, \"zlIdU9EjM2llFt74AbE2KsUJXyM=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = TaskProjectSection;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TaskProjectSection);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"TaskProjectSection\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/TaskForm/TaskProjectSection.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/TaskForm/TaskRecurrenceSection.tsx":
+/*!*********************************************************************!*\
+ !*** ./frontend/components/Task/TaskForm/TaskRecurrenceSection.tsx ***!
+ \*********************************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _RecurrenceInput__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../RecurrenceInput */ \"./frontend/components/Task/RecurrenceInput.tsx\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\n\n\nvar TaskRecurrenceSection = function TaskRecurrenceSection(_ref) {\n var formData = _ref.formData,\n parentTask = _ref.parentTask,\n parentTaskLoading = _ref.parentTaskLoading,\n onRecurrenceChange = _ref.onRecurrenceChange,\n onEditParent = _ref.onEditParent,\n onParentRecurrenceChange = _ref.onParentRecurrenceChange;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_RecurrenceInput__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n recurrenceType: parentTask ? parentTask.recurrence_type || 'none' : formData.recurrence_type || 'none',\n recurrenceInterval: parentTask ? parentTask.recurrence_interval || 1 : formData.recurrence_interval || 1,\n recurrenceEndDate: parentTask ? parentTask.recurrence_end_date : formData.recurrence_end_date,\n recurrenceWeekday: parentTask ? parentTask.recurrence_weekday : formData.recurrence_weekday,\n recurrenceMonthDay: parentTask ? parentTask.recurrence_month_day : formData.recurrence_month_day,\n recurrenceWeekOfMonth: parentTask ? parentTask.recurrence_week_of_month : formData.recurrence_week_of_month,\n completionBased: parentTask ? parentTask.completion_based || false : formData.completion_based || false,\n onChange: onRecurrenceChange,\n disabled: !!parentTask,\n isChildTask: !!parentTask,\n parentTaskLoading: parentTaskLoading,\n onEditParent: parentTask ? onEditParent : undefined,\n onParentRecurrenceChange: parentTask ? onParentRecurrenceChange : undefined\n });\n};\n_c = TaskRecurrenceSection;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TaskRecurrenceSection);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"TaskRecurrenceSection\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/TaskForm/TaskRecurrenceSection.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/TaskForm/TaskTagsSection.tsx":
+/*!***************************************************************!*\
+ !*** ./frontend/components/Task/TaskForm/TaskTagsSection.tsx ***!
+ \***************************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _Tag_TagInput__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Tag/TagInput */ \"./frontend/components/Tag/TagInput.tsx\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\n\n\n\nvar TaskTagsSection = function TaskTagsSection(_ref) {\n _s();\n var tags = _ref.tags,\n onTagsChange = _ref.onTagsChange,\n availableTags = _ref.availableTags;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Tag_TagInput__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n onTagsChange: onTagsChange,\n initialTags: tags,\n availableTags: availableTags\n });\n};\n_s(TaskTagsSection, \"zlIdU9EjM2llFt74AbE2KsUJXyM=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = TaskTagsSection;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TaskTagsSection);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"TaskTagsSection\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/TaskForm/TaskTagsSection.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/TaskForm/TaskTitleSection.tsx":
+/*!****************************************************************!*\
+ !*** ./frontend/components/Task/TaskForm/TaskTitleSection.tsx ***!
+ \****************************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\n\n\nvar TaskTitleSection = function TaskTitleSection(_ref) {\n _s();\n var taskId = _ref.taskId,\n value = _ref.value,\n onChange = _ref.onChange,\n taskAnalysis = _ref.taskAnalysis,\n taskIntelligenceEnabled = _ref.taskIntelligenceEnabled;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"px-4 py-4 border-b border-gray-200 dark:border-gray-700\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n id: \"task_name_\".concat(taskId),\n name: \"name\",\n value: value,\n onChange: onChange,\n required: true,\n className: \"block w-full text-xl font-semibold dark:bg-gray-800 text-black dark:text-white border-none focus:outline-none focus:border-none focus:ring-0 shadow-sm py-2\",\n placeholder: t('forms.task.namePlaceholder', 'Add Task Name')\n }), taskAnalysis && taskAnalysis.isVague && taskIntelligenceEnabled && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mt-2 p-3 rounded-md border \".concat(taskAnalysis.severity === 'high' ? 'bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-700' : taskAnalysis.severity === 'medium' ? 'bg-yellow-50 dark:bg-yellow-900/20 border-yellow-200 dark:border-yellow-700' : 'bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-700')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex-shrink-0\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"svg\", {\n className: \"h-4 w-4 mt-0.5 \".concat(taskAnalysis.severity === 'high' ? 'text-red-400' : taskAnalysis.severity === 'medium' ? 'text-yellow-400' : 'text-blue-400'),\n fill: \"currentColor\",\n viewBox: \"0 0 20 20\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\",\n clipRule: \"evenodd\"\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"ml-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-sm \".concat(taskAnalysis.severity === 'high' ? 'text-red-800 dark:text-red-200' : taskAnalysis.severity === 'medium' ? 'text-yellow-800 dark:text-yellow-200' : 'text-blue-800 dark:text-blue-200')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"strong\", null, taskAnalysis.reason === 'short' && t('task.nameHelper.short', 'Make it more descriptive!'), taskAnalysis.reason === 'no_verb' && t('task.nameHelper.noVerb', 'Add an action verb!'), taskAnalysis.reason === 'vague_pattern' && t('task.nameHelper.vague', 'Be more specific!'))), taskAnalysis.suggestion && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-xs mt-1 \".concat(taskAnalysis.severity === 'high' ? 'text-red-700 dark:text-red-300' : taskAnalysis.severity === 'medium' ? 'text-yellow-700 dark:text-yellow-300' : 'text-blue-700 dark:text-blue-300')\n }, t(taskAnalysis.suggestion, taskAnalysis.suggestion))))));\n};\n_s(TaskTitleSection, \"zlIdU9EjM2llFt74AbE2KsUJXyM=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = TaskTitleSection;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TaskTitleSection);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"TaskTitleSection\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/TaskForm/TaskTitleSection.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/TaskHeader.tsx":
+/*!*************************************************!*\
+ !*** ./frontend/components/Task/TaskHeader.tsx ***!
+ \*************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/CalendarIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ArrowPathIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/CalendarDaysIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/PlayIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/FolderIcon.js\");\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/TagIcon.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _TaskPriorityIcon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./TaskPriorityIcon */ \"./frontend/components/Task/TaskPriorityIcon.tsx\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\n\n\n\n\n\nvar TaskHeader = function TaskHeader(_ref) {\n _s();\n var task = _ref.task,\n project = _ref.project,\n onTaskClick = _ref.onTaskClick,\n onToggleCompletion = _ref.onToggleCompletion,\n _ref$hideProjectName = _ref.hideProjectName,\n hideProjectName = _ref$hideProjectName === void 0 ? false : _ref$hideProjectName,\n onToggleToday = _ref.onToggleToday,\n onTaskUpdate = _ref.onTaskUpdate;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var formatDueDate = function formatDueDate(dueDate) {\n var today = new Date().toISOString().split('T')[0];\n var tomorrow = new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString().split('T')[0];\n var yesterday = new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString().split('T')[0];\n if (dueDate === today) return t('dateIndicators.today', 'TODAY');\n if (dueDate === tomorrow) return t('dateIndicators.tomorrow', 'TOMORROW');\n if (dueDate === yesterday) return t('dateIndicators.yesterday', 'YESTERDAY');\n return new Date(dueDate).toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n });\n };\n var formatRecurrence = function formatRecurrence(recurrenceType) {\n switch (recurrenceType) {\n case 'daily':\n return t('recurrence.daily', 'Daily');\n case 'weekly':\n return t('recurrence.weekly', 'Weekly');\n case 'monthly':\n return t('recurrence.monthly', 'Monthly');\n case 'monthly_weekday':\n return t('recurrence.monthlyWeekday', 'Monthly');\n case 'monthly_last_day':\n return t('recurrence.monthlyLastDay', 'Monthly');\n default:\n return t('recurrence.recurring', 'Recurring');\n }\n };\n var handleTodayToggle = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(e) {\n var _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n e.stopPropagation(); // Prevent opening task modal\n if (!(onToggleToday && task.id)) {\n _context.n = 4;\n break;\n }\n _context.p = 1;\n _context.n = 2;\n return onToggleToday(task.id);\n case 2:\n _context.n = 4;\n break;\n case 3:\n _context.p = 3;\n _t = _context.v;\n console.error('Failed to toggle today status:', _t);\n case 4:\n return _context.a(2);\n }\n }, _callee, null, [[1, 3]]);\n }));\n return function handleTodayToggle(_x) {\n return _ref2.apply(this, arguments);\n };\n }();\n var handlePlayToggle = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(e) {\n var isCurrentlyInProgress, updatedTask, _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n e.stopPropagation(); // Prevent opening task modal\n if (!(task.id && (task.status === 'not_started' || task.status === 'in_progress' || task.status === 0 || task.status === 1) && onTaskUpdate)) {\n _context2.n = 4;\n break;\n }\n _context2.p = 1;\n isCurrentlyInProgress = task.status === 'in_progress' || task.status === 1;\n updatedTask = _objectSpread(_objectSpread({}, task), {}, {\n status: isCurrentlyInProgress ? 'not_started' : 'in_progress',\n // Automatically add to today plan when setting to in_progress\n today: isCurrentlyInProgress ? task.today : true\n });\n _context2.n = 2;\n return onTaskUpdate(updatedTask);\n case 2:\n _context2.n = 4;\n break;\n case 3:\n _context2.p = 3;\n _t2 = _context2.v;\n console.error('Failed to toggle in progress status:', _t2);\n case 4:\n return _context2.a(2);\n }\n }, _callee2, null, [[1, 3]]);\n }));\n return function handlePlayToggle(_x2) {\n return _ref3.apply(this, arguments);\n };\n }();\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"py-2 px-4 cursor-pointer group\",\n onClick: onTaskClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"hidden md:flex flex-col md:flex-row md:items-center md:justify-between\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center space-x-4 mb-2 md:mb-0\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TaskPriorityIcon__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n priority: task.priority,\n status: task.status,\n onToggleCompletion: onToggleCompletion\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex flex-col\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-md text-gray-900 dark:text-gray-100\"\n }, task.name), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center text-xs text-gray-500 dark:text-gray-400\"\n }, project && !hideProjectName && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: \"h-3 w-3 mr-1\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, project.name)), project && !hideProjectName && task.tags && task.tags.length > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"mx-2\"\n }, \"\\u2022\"), task.tags && task.tags.length > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n className: \"h-3 w-3 mr-1\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, task.tags.map(function (tag) {\n return tag.name;\n }).join(', '))), (project && !hideProjectName || task.tags && task.tags.length > 0) && task.due_date && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"mx-2\"\n }, \"\\u2022\"), task.due_date && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n className: \"h-3 w-3 mr-1\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, formatDueDate(task.due_date))), (project && !hideProjectName || task.tags && task.tags.length > 0 || task.due_date) && task.recurrence_type && task.recurrence_type !== 'none' && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"mx-2\"\n }, \"\\u2022\"), task.recurrence_type && task.recurrence_type !== 'none' && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n className: \"h-3 w-3 mr-1\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, formatRecurrence(task.recurrence_type)))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center flex-wrap justify-start md:justify-end space-x-2\"\n }, onToggleToday && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: handleTodayToggle,\n className: \"items-center justify-center \".concat(Number(task.today_move_count) > 1 ? 'px-2 h-6' : 'w-6 h-6', \" rounded-full transition-all duration-200 opacity-0 group-hover:opacity-100 \").concat(task.today ? 'bg-green-100 dark:bg-green-900 text-green-600 dark:text-green-400 hover:bg-green-200 dark:hover:bg-green-800 flex' : 'bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-600 hidden group-hover:flex'),\n title: task.today ? t('tasks.removeFromToday', 'Remove from today plan') : t('tasks.addToToday', 'Add to today plan')\n }, task.today ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n className: \"h-3 w-3\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n className: \"h-3 w-3\"\n }), Number(task.today_move_count) > 1 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"ml-1 text-xs font-medium\"\n }, Number(task.today_move_count))), (task.status === 'not_started' || task.status === 'in_progress' || task.status === 0 || task.status === 1) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: handlePlayToggle,\n className: \"flex items-center justify-center w-6 h-6 rounded-full transition-all duration-200 \".concat(task.status === 'in_progress' || task.status === 1 ? 'bg-green-100 dark:bg-green-900 text-green-600 dark:text-green-400 hover:bg-green-200 dark:hover:bg-green-800 animate-pulse' : 'bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-600 opacity-0 group-hover:opacity-100'),\n title: task.status === 'in_progress' || task.status === 1 ? t('tasks.setNotStarted', 'Set to not started') : t('tasks.setInProgress', 'Set in progress')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n className: \"h-3 w-3\"\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"block md:hidden\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-start font-light text-md text-gray-900 dark:text-gray-100\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TaskPriorityIcon__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n priority: task.priority,\n status: task.status,\n onToggleCompletion: onToggleCompletion\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"ml-2 flex flex-col flex-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, task.name), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex flex-col text-xs text-gray-500 dark:text-gray-400 mt-1 space-y-1\"\n }, project && !hideProjectName && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: \"h-3 w-3 mr-1\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, project.name)), task.tags && task.tags.length > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n className: \"h-3 w-3 mr-1\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, task.tags.map(function (tag) {\n return tag.name;\n }).join(', '))), task.due_date && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n className: \"h-3 w-3 mr-1\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, formatDueDate(task.due_date))), task.recurrence_type && task.recurrence_type !== 'none' && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n className: \"h-3 w-3 mr-1\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, formatRecurrence(task.recurrence_type)))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center flex-wrap justify-start space-x-2 mt-2 ml-8\"\n }, (task.status === 'not_started' || task.status === 'in_progress' || task.status === 0 || task.status === 1) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: handlePlayToggle,\n className: \"flex items-center justify-center w-6 h-6 rounded-full transition-all duration-200 \".concat(task.status === 'in_progress' || task.status === 1 ? 'bg-green-100 dark:bg-green-900 text-green-600 dark:text-green-400 hover:bg-green-200 dark:hover:bg-green-800 animate-pulse' : 'bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-600 opacity-0 group-hover:opacity-100'),\n title: task.status === 'in_progress' || task.status === 1 ? t('tasks.setNotStarted', 'Set to not started') : t('tasks.setInProgress', 'Set in progress')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n className: \"h-3 w-3\"\n })), onToggleToday && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: handleTodayToggle,\n className: \"items-center justify-center \".concat(task.today_move_count && task.today_move_count > 1 ? 'px-2 h-6' : 'w-6 h-6', \" rounded-full transition-all duration-200 opacity-0 group-hover:opacity-100 \").concat(task.today ? 'bg-green-100 dark:bg-green-900 text-green-600 dark:text-green-400 hover:bg-green-200 dark:hover:bg-green-800 flex' : 'bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-600 hidden group-hover:flex'),\n title: task.today ? t('tasks.removeFromToday', 'Remove from today plan') : t('tasks.addToToday', 'Add to today plan')\n }, task.today ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n className: \"h-3 w-3\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n className: \"h-3 w-3\"\n }), task.today_move_count && task.today_move_count > 1 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"ml-1 text-xs font-medium\"\n }, task.today_move_count)))));\n};\n_s(TaskHeader, \"zlIdU9EjM2llFt74AbE2KsUJXyM=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = TaskHeader;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TaskHeader);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"TaskHeader\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/TaskHeader.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/TaskItem.tsx":
+/*!***********************************************!*\
+ !*** ./frontend/components/Task/TaskItem.tsx ***!
+ \***********************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _TaskHeader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./TaskHeader */ \"./frontend/components/Task/TaskHeader.tsx\");\n/* harmony import */ var _TaskModal__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./TaskModal */ \"./frontend/components/Task/TaskModal.tsx\");\n/* harmony import */ var _utils_tasksService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/tasksService */ \"./frontend/utils/tasksService.ts\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\nvar TaskItem = function TaskItem(_ref) {\n _s();\n var task = _ref.task,\n onTaskUpdate = _ref.onTaskUpdate,\n onTaskDelete = _ref.onTaskDelete,\n projects = _ref.projects,\n _ref$hideProjectName = _ref.hideProjectName,\n hideProjectName = _ref$hideProjectName === void 0 ? false : _ref$hideProjectName,\n onToggleToday = _ref.onToggleToday;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState2 = _slicedToArray(_useState, 2),\n isModalOpen = _useState2[0],\n setIsModalOpen = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(projects),\n _useState4 = _slicedToArray(_useState3, 2),\n projectList = _useState4[0],\n setProjectList = _useState4[1];\n var handleTaskClick = function handleTaskClick() {\n setIsModalOpen(true);\n };\n var handleSave = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(updatedTask) {\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n _context.n = 1;\n return onTaskUpdate(updatedTask);\n case 1:\n setIsModalOpen(false);\n case 2:\n return _context.a(2);\n }\n }, _callee);\n }));\n return function handleSave(_x) {\n return _ref2.apply(this, arguments);\n };\n }();\n var handleDelete = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(taskId) {\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n if (!task.id) {\n _context2.n = 1;\n break;\n }\n _context2.n = 1;\n return onTaskDelete(task.id);\n case 1:\n return _context2.a(2);\n }\n }, _callee2);\n }));\n return function handleDelete(_x2) {\n return _ref3.apply(this, arguments);\n };\n }();\n var handleToggleCompletion = /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {\n var updatedTask, _t;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n if (!task.id) {\n _context3.n = 5;\n break;\n }\n _context3.p = 1;\n _context3.n = 2;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_3__.toggleTaskCompletion)(task.id);\n case 2:\n updatedTask = _context3.v;\n _context3.n = 3;\n return onTaskUpdate(updatedTask);\n case 3:\n _context3.n = 5;\n break;\n case 4:\n _context3.p = 4;\n _t = _context3.v;\n case 5:\n return _context3.a(2);\n }\n }, _callee3, null, [[1, 4]]);\n }));\n return function handleToggleCompletion() {\n return _ref4.apply(this, arguments);\n };\n }();\n var handleCreateProject = /*#__PURE__*/function () {\n var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(name) {\n var response, newProject, _t2;\n return _regenerator().w(function (_context4) {\n while (1) switch (_context4.n) {\n case 0:\n _context4.p = 0;\n _context4.n = 1;\n return fetch('/api/project', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n name: name,\n active: true\n })\n });\n case 1:\n response = _context4.v;\n if (response.ok) {\n _context4.n = 2;\n break;\n }\n throw new Error('Failed to create project');\n case 2:\n _context4.n = 3;\n return response.json();\n case 3:\n newProject = _context4.v;\n setProjectList(function (prevProjects) {\n return [].concat(_toConsumableArray(prevProjects), [newProject]);\n });\n return _context4.a(2, newProject);\n case 4:\n _context4.p = 4;\n _t2 = _context4.v;\n throw _t2;\n case 5:\n return _context4.a(2);\n }\n }, _callee4, null, [[0, 4]]);\n }));\n return function handleCreateProject(_x3) {\n return _ref5.apply(this, arguments);\n };\n }();\n\n // Use the project from the task's included data if available, otherwise find from projectList\n var project = task.Project || projectList.find(function (p) {\n return p.id === task.project_id;\n });\n\n // Check if task is in progress to apply pulsing border animation\n var isInProgress = task.status === 'in_progress' || task.status === 1;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"rounded-lg shadow-sm bg-white dark:bg-gray-900 mt-1 \".concat(isInProgress ? 'border-2 border-green-400/60 dark:border-green-500/60' : 'border-2 border-gray-50 dark:border-gray-800')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TaskHeader__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n task: task,\n project: project,\n onTaskClick: handleTaskClick,\n onToggleCompletion: handleToggleCompletion,\n hideProjectName: hideProjectName,\n onToggleToday: onToggleToday,\n onTaskUpdate: onTaskUpdate\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TaskModal__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n isOpen: isModalOpen,\n onClose: function onClose() {\n return setIsModalOpen(false);\n },\n task: task,\n onSave: handleSave,\n onDelete: handleDelete,\n projects: projectList,\n onCreateProject: handleCreateProject\n }));\n};\n_s(TaskItem, \"nPVTAiszvgH11lFcf0xprYGPwt4=\");\n_c = TaskItem;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TaskItem);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"TaskItem\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/TaskItem.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/TaskList.tsx":
+/*!***********************************************!*\
+ !*** ./frontend/components/Task/TaskList.tsx ***!
+ \***********************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _TaskItem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./TaskItem */ \"./frontend/components/Task/TaskItem.tsx\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\n\n\nvar TaskList = function TaskList(_ref) {\n var tasks = _ref.tasks,\n onTaskUpdate = _ref.onTaskUpdate,\n onTaskDelete = _ref.onTaskDelete,\n projects = _ref.projects,\n _ref$hideProjectName = _ref.hideProjectName,\n hideProjectName = _ref$hideProjectName === void 0 ? false : _ref$hideProjectName,\n onToggleToday = _ref.onToggleToday;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, tasks.length > 0 ? tasks.map(function (task) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TaskItem__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n key: task.id,\n task: task,\n onTaskUpdate: onTaskUpdate,\n onTaskDelete: onTaskDelete,\n projects: projects,\n hideProjectName: hideProjectName,\n onToggleToday: onToggleToday\n });\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-gray-500 dark:text-gray-400 text-center mt-4\"\n }, \"No tasks available.\"));\n};\n_c = TaskList;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TaskList);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"TaskList\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/TaskList.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/TaskModal.tsx":
+/*!************************************************!*\
+ !*** ./frontend/components/Task/TaskModal.tsx ***!
+ \************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _TaskActions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./TaskActions */ \"./frontend/components/Task/TaskActions.tsx\");\n/* harmony import */ var _Shared_ConfirmDialog__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Shared/ConfirmDialog */ \"./frontend/components/Shared/ConfirmDialog.tsx\");\n/* harmony import */ var _Shared_CollapsibleSection__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Shared/CollapsibleSection */ \"./frontend/components/Shared/CollapsibleSection.tsx\");\n/* harmony import */ var _Shared_ToastContext__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Shared/ToastContext */ \"./frontend/components/Shared/ToastContext.tsx\");\n/* harmony import */ var _TimelinePanel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./TimelinePanel */ \"./frontend/components/Task/TimelinePanel.tsx\");\n/* harmony import */ var _utils_tagsService__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../utils/tagsService */ \"./frontend/utils/tagsService.ts\");\n/* harmony import */ var _utils_tasksService__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../utils/tasksService */ \"./frontend/utils/tasksService.ts\");\n/* harmony import */ var _utils_profileService__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../utils/profileService */ \"./frontend/utils/profileService.ts\");\n/* harmony import */ var _utils_taskIntelligenceService__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../utils/taskIntelligenceService */ \"./frontend/utils/taskIntelligenceService.ts\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ClockIcon.js\");\n/* harmony import */ var _TaskForm_TaskTitleSection__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./TaskForm/TaskTitleSection */ \"./frontend/components/Task/TaskForm/TaskTitleSection.tsx\");\n/* harmony import */ var _TaskForm_TaskContentSection__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./TaskForm/TaskContentSection */ \"./frontend/components/Task/TaskForm/TaskContentSection.tsx\");\n/* harmony import */ var _TaskForm_TaskTagsSection__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./TaskForm/TaskTagsSection */ \"./frontend/components/Task/TaskForm/TaskTagsSection.tsx\");\n/* harmony import */ var _TaskForm_TaskProjectSection__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./TaskForm/TaskProjectSection */ \"./frontend/components/Task/TaskForm/TaskProjectSection.tsx\");\n/* harmony import */ var _TaskForm_TaskMetadataSection__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./TaskForm/TaskMetadataSection */ \"./frontend/components/Task/TaskForm/TaskMetadataSection.tsx\");\n/* harmony import */ var _TaskForm_TaskRecurrenceSection__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./TaskForm/TaskRecurrenceSection */ \"./frontend/components/Task/TaskForm/TaskRecurrenceSection.tsx\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n// Import form sections\n\n\n\n\n\n\nvar TaskModal = function TaskModal(_ref) {\n _s();\n var _task$tags, _formData$tags;\n var isOpen = _ref.isOpen,\n onClose = _ref.onClose,\n task = _ref.task,\n onSave = _ref.onSave,\n onDelete = _ref.onDelete,\n projects = _ref.projects,\n onCreateProject = _ref.onCreateProject,\n onEditParentTask = _ref.onEditParentTask;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(task),\n _useState2 = _slicedToArray(_useState, 2),\n formData = _useState2[0],\n setFormData = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(((_task$tags = task.tags) === null || _task$tags === void 0 ? void 0 : _task$tags.map(function (tag) {\n return tag.name;\n })) || []),\n _useState4 = _slicedToArray(_useState3, 2),\n tags = _useState4[0],\n setTags = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(projects || []),\n _useState6 = _slicedToArray(_useState5, 2),\n filteredProjects = _useState6[0],\n setFilteredProjects = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\"),\n _useState8 = _slicedToArray(_useState7, 2),\n newProjectName = _useState8[0],\n setNewProjectName = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState0 = _slicedToArray(_useState9, 2),\n isCreatingProject = _useState0[0],\n setIsCreatingProject = _useState0[1];\n var _useState1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState10 = _slicedToArray(_useState1, 2),\n dropdownOpen = _useState10[0],\n setDropdownOpen = _useState10[1];\n var modalRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n var _useState11 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState12 = _slicedToArray(_useState11, 2),\n isClosing = _useState12[0],\n setIsClosing = _useState12[1];\n var _useState13 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState14 = _slicedToArray(_useState13, 2),\n showConfirmDialog = _useState14[0],\n setShowConfirmDialog = _useState14[1];\n var _useState15 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState16 = _slicedToArray(_useState15, 2),\n localAvailableTags = _useState16[0],\n setLocalAvailableTags = _useState16[1];\n var _useState17 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState18 = _slicedToArray(_useState17, 2),\n tagsLoaded = _useState18[0],\n setTagsLoaded = _useState18[1];\n var _useState19 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState20 = _slicedToArray(_useState19, 2),\n tagsLoading = _useState20[0],\n setTagsLoading = _useState20[1];\n var _useState21 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState22 = _slicedToArray(_useState21, 2),\n parentTask = _useState22[0],\n setParentTask = _useState22[1];\n var _useState23 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState24 = _slicedToArray(_useState23, 2),\n parentTaskLoading = _useState24[0],\n setParentTaskLoading = _useState24[1];\n var _useState25 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState26 = _slicedToArray(_useState25, 2),\n taskAnalysis = _useState26[0],\n setTaskAnalysis = _useState26[1];\n var _useState27 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true),\n _useState28 = _slicedToArray(_useState27, 2),\n taskIntelligenceEnabled = _useState28[0],\n setTaskIntelligenceEnabled = _useState28[1];\n var _useState29 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState30 = _slicedToArray(_useState29, 2),\n isTimelineExpanded = _useState30[0],\n setIsTimelineExpanded = _useState30[1];\n\n // Collapsible section states\n var _useState31 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n tags: false,\n project: false,\n metadata: false,\n recurrence: false\n }),\n _useState32 = _slicedToArray(_useState31, 2),\n expandedSections = _useState32[0],\n setExpandedSections = _useState32[1];\n var _useToast = (0,_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_4__.useToast)(),\n showSuccessToast = _useToast.showSuccessToast,\n showErrorToast = _useToast.showErrorToast;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_10__.useTranslation)(),\n t = _useTranslation.t;\n var toggleSection = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (section) {\n setExpandedSections(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, section, !prev[section]));\n });\n }, []);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var _task$tags2;\n setFormData(task);\n setTags(((_task$tags2 = task.tags) === null || _task$tags2 === void 0 ? void 0 : _task$tags2.map(function (tag) {\n return tag.name;\n })) || []);\n\n // Analyze task name and show helper when modal opens (only if intelligence is enabled)\n if (isOpen && task.name && taskIntelligenceEnabled) {\n var analysis = (0,_utils_taskIntelligenceService__WEBPACK_IMPORTED_MODULE_9__.analyzeTaskName)(task.name);\n setTaskAnalysis(analysis);\n } else {\n setTaskAnalysis(null);\n }\n\n // Safely find the current project, handling the case where projects might be undefined\n var currentProject = projects === null || projects === void 0 ? void 0 : projects.find(function (project) {\n return project.id === task.project_id;\n });\n setNewProjectName(currentProject ? currentProject.name : '');\n\n // Fetch parent task if this is a child task\n var fetchParentTask = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var parent, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n if (!(task.recurring_parent_id && isOpen)) {\n _context.n = 6;\n break;\n }\n setParentTaskLoading(true);\n _context.p = 1;\n _context.n = 2;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_7__.fetchTaskById)(task.recurring_parent_id);\n case 2:\n parent = _context.v;\n setParentTask(parent);\n _context.n = 4;\n break;\n case 3:\n _context.p = 3;\n _t = _context.v;\n console.error('Error fetching parent task:', _t);\n setParentTask(null);\n case 4:\n _context.p = 4;\n setParentTaskLoading(false);\n return _context.f(4);\n case 5:\n _context.n = 7;\n break;\n case 6:\n setParentTask(null);\n case 7:\n return _context.a(2);\n }\n }, _callee, null, [[1, 3, 4, 5]]);\n }));\n return function fetchParentTask() {\n return _ref2.apply(this, arguments);\n };\n }();\n fetchParentTask();\n }, [task, projects, isOpen, taskIntelligenceEnabled]);\n\n // Fetch task intelligence setting when modal opens\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var fetchTaskIntelligenceSetting = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {\n var enabled, _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n if (!isOpen) {\n _context2.n = 4;\n break;\n }\n _context2.p = 1;\n _context2.n = 2;\n return (0,_utils_profileService__WEBPACK_IMPORTED_MODULE_8__.getTaskIntelligenceEnabled)();\n case 2:\n enabled = _context2.v;\n setTaskIntelligenceEnabled(enabled);\n _context2.n = 4;\n break;\n case 3:\n _context2.p = 3;\n _t2 = _context2.v;\n console.error('Error fetching task intelligence setting:', _t2);\n setTaskIntelligenceEnabled(true); // Default to enabled\n case 4:\n return _context2.a(2);\n }\n }, _callee2, null, [[1, 3]]);\n }));\n return function fetchTaskIntelligenceSetting() {\n return _ref3.apply(this, arguments);\n };\n }();\n fetchTaskIntelligenceSetting();\n }, [isOpen]);\n var handleEditParent = function handleEditParent() {\n if (parentTask && onEditParentTask) {\n onEditParentTask(parentTask);\n onClose(); // Close current modal\n }\n };\n var handleParentRecurrenceChange = function handleParentRecurrenceChange(field, value) {\n // Update the parent task data in local state\n if (parentTask) {\n setParentTask(_objectSpread(_objectSpread({}, parentTask), {}, _defineProperty({}, field, value)));\n }\n // Also update the form data to reflect the change\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, _defineProperty(_defineProperty({}, field, value), \"update_parent_recurrence\", true));\n });\n };\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var loadTags = /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {\n var fetchedTags, _t3;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n if (!(isOpen && !tagsLoaded)) {\n _context3.n = 5;\n break;\n }\n setTagsLoading(true);\n _context3.p = 1;\n _context3.n = 2;\n return (0,_utils_tagsService__WEBPACK_IMPORTED_MODULE_6__.fetchTags)();\n case 2:\n fetchedTags = _context3.v;\n setLocalAvailableTags(fetchedTags);\n setTagsLoaded(true);\n _context3.n = 4;\n break;\n case 3:\n _context3.p = 3;\n _t3 = _context3.v;\n console.error(\"Error fetching tags:\", _t3);\n setTagsLoaded(true); // Mark as loaded even on error to prevent retry loop\n case 4:\n _context3.p = 4;\n setTagsLoading(false);\n return _context3.f(4);\n case 5:\n return _context3.a(2);\n }\n }, _callee3, null, [[1, 3, 4, 5]]);\n }));\n return function loadTags() {\n return _ref4.apply(this, arguments);\n };\n }();\n\n // Only load tags if modal is open\n if (isOpen) {\n loadTags();\n }\n }, [isOpen, tagsLoaded]);\n var getPriorityString = function getPriorityString(priority) {\n if (typeof priority === 'number') {\n var priorityNames = ['low', 'medium', 'high'];\n return priorityNames[priority] || 'medium';\n }\n return priority || 'medium';\n };\n var getStatusString = function getStatusString(status) {\n if (typeof status === 'number') {\n var statusNames = ['not_started', 'in_progress', 'done', 'archived'];\n return statusNames[status] || 'not_started';\n }\n return status;\n };\n var handleChange = function handleChange(e) {\n var _e$target = e.target,\n name = _e$target.name,\n value = _e$target.value;\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, name, value));\n });\n\n // Analyze task name in real-time (only if intelligence is enabled)\n if (name === 'name' && taskIntelligenceEnabled) {\n var analysis = (0,_utils_taskIntelligenceService__WEBPACK_IMPORTED_MODULE_9__.analyzeTaskName)(value);\n setTaskAnalysis(analysis);\n }\n };\n var handleRecurrenceChange = function handleRecurrenceChange(field, value) {\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, field, value));\n });\n };\n var handleTagsChange = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (newTags) {\n setTags(newTags);\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, {\n tags: newTags.map(function (name) {\n return {\n name: name\n };\n })\n });\n });\n }, []);\n var handleProjectSearch = function handleProjectSearch(e) {\n var query = e.target.value.toLowerCase();\n setNewProjectName(query);\n setDropdownOpen(true);\n setFilteredProjects(projects.filter(function (project) {\n return project.name.toLowerCase().includes(query);\n }));\n };\n var handleProjectSelection = function handleProjectSelection(project) {\n setFormData(_objectSpread(_objectSpread({}, formData), {}, {\n project_id: project.id\n }));\n setNewProjectName(project.name);\n setDropdownOpen(false);\n };\n var handleCreateProject = /*#__PURE__*/function () {\n var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {\n var newProject, _t4;\n return _regenerator().w(function (_context4) {\n while (1) switch (_context4.n) {\n case 0:\n if (!(newProjectName.trim() !== \"\")) {\n _context4.n = 5;\n break;\n }\n setIsCreatingProject(true);\n _context4.p = 1;\n _context4.n = 2;\n return onCreateProject(newProjectName);\n case 2:\n newProject = _context4.v;\n setFormData(_objectSpread(_objectSpread({}, formData), {}, {\n project_id: newProject.id\n }));\n setFilteredProjects([].concat(_toConsumableArray(filteredProjects), [newProject]));\n setNewProjectName(newProject.name);\n setDropdownOpen(false);\n showSuccessToast(t('success.projectCreated'));\n _context4.n = 4;\n break;\n case 3:\n _context4.p = 3;\n _t4 = _context4.v;\n showErrorToast(t('errors.projectCreationFailed'));\n console.error(\"Error creating project:\", _t4);\n case 4:\n _context4.p = 4;\n setIsCreatingProject(false);\n return _context4.f(4);\n case 5:\n return _context4.a(2);\n }\n }, _callee4, null, [[1, 3, 4, 5]]);\n }));\n return function handleCreateProject() {\n return _ref5.apply(this, arguments);\n };\n }();\n var handleSubmit = function handleSubmit() {\n onSave(_objectSpread(_objectSpread({}, formData), {}, {\n tags: tags.map(function (tag) {\n return {\n name: tag\n };\n })\n }));\n var taskLink = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, t('task.updated', 'Task'), \" \", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: \"/task/\".concat(formData.uuid),\n className: \"text-green-200 underline hover:text-green-100\"\n }, formData.name), \" \", t('task.updatedSuccessfully', 'updated successfully!'));\n showSuccessToast(taskLink);\n handleClose();\n };\n var handleDeleteClick = function handleDeleteClick() {\n setShowConfirmDialog(true);\n };\n var handleDeleteConfirm = /*#__PURE__*/function () {\n var _ref6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5() {\n var taskLink, _t5;\n return _regenerator().w(function (_context5) {\n while (1) switch (_context5.n) {\n case 0:\n if (!formData.id) {\n _context5.n = 4;\n break;\n }\n _context5.p = 1;\n _context5.n = 2;\n return onDelete(formData.id);\n case 2:\n taskLink = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, t('task.deleted', 'Task'), \" \", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: \"/task/\".concat(formData.uuid),\n className: \"text-green-200 underline hover:text-green-100\"\n }, formData.name), \" \", t('task.deletedSuccessfully', 'deleted successfully!'));\n showSuccessToast(taskLink);\n setShowConfirmDialog(false);\n handleClose();\n _context5.n = 4;\n break;\n case 3:\n _context5.p = 3;\n _t5 = _context5.v;\n console.error('Failed to delete task:', _t5);\n showErrorToast(t('task.deleteError', 'Failed to delete task'));\n case 4:\n return _context5.a(2);\n }\n }, _callee5, null, [[1, 3]]);\n }));\n return function handleDeleteConfirm() {\n return _ref6.apply(this, arguments);\n };\n }();\n var handleClose = function handleClose() {\n setIsClosing(true);\n setTimeout(function () {\n onClose();\n setIsClosing(false);\n setTagsLoaded(false); // Reset tags loaded state for next modal open\n }, 300);\n };\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setFilteredProjects(projects || []);\n }, [projects]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var handleClickOutside = function handleClickOutside(event) {\n if (modalRef.current && !modalRef.current.contains(event.target)) {\n handleClose();\n }\n };\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n return function () {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isOpen]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var handleKeyDown = function handleKeyDown(event) {\n if (event.key === \"Escape\") {\n handleClose();\n }\n };\n if (isOpen) {\n document.addEventListener(\"keydown\", handleKeyDown);\n }\n return function () {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [isOpen]);\n if (!isOpen) return null;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"fixed top-16 left-0 right-0 bottom-0 bg-gray-900 bg-opacity-80 z-40 transition-opacity duration-300 overflow-y-auto \".concat(isClosing ? \"opacity-0\" : \"opacity-100\")\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"min-h-full flex items-start justify-center px-4 py-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n ref: modalRef,\n className: \"bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-800 sm:rounded-lg sm:shadow-2xl w-full sm:max-w-6xl transform transition-transform duration-300 \".concat(isClosing ? \"scale-95\" : \"scale-100\", \" my-4\")\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex flex-col lg:flex-row min-h-[400px] max-h-[90vh]\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex-1 flex flex-col transition-all duration-300 \".concat(isTimelineExpanded ? 'lg:pr-2' : '')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex-1 overflow-y-auto\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"form\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"fieldset\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TaskForm_TaskTitleSection__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n taskId: task.id,\n value: formData.name,\n onChange: handleChange,\n taskAnalysis: taskAnalysis,\n taskIntelligenceEnabled: taskIntelligenceEnabled\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TaskForm_TaskContentSection__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n taskId: task.id,\n value: formData.note || \"\",\n onChange: handleChange\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Shared_CollapsibleSection__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n title: t('forms.task.labels.tags', 'Tags'),\n isExpanded: expandedSections.tags,\n onToggle: function onToggle() {\n return toggleSection('tags');\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TaskForm_TaskTagsSection__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n tags: ((_formData$tags = formData.tags) === null || _formData$tags === void 0 ? void 0 : _formData$tags.map(function (tag) {\n return tag.name;\n })) || [],\n onTagsChange: handleTagsChange,\n availableTags: localAvailableTags\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Shared_CollapsibleSection__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n title: t('forms.task.labels.project', 'Project'),\n isExpanded: expandedSections.project,\n onToggle: function onToggle() {\n return toggleSection('project');\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TaskForm_TaskProjectSection__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n newProjectName: newProjectName,\n onProjectSearch: handleProjectSearch,\n dropdownOpen: dropdownOpen,\n filteredProjects: filteredProjects,\n onProjectSelection: handleProjectSelection,\n onCreateProject: handleCreateProject,\n isCreatingProject: isCreatingProject\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Shared_CollapsibleSection__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n title: t('forms.task.statusAndOptions', 'Status & Options'),\n isExpanded: expandedSections.metadata,\n onToggle: function onToggle() {\n return toggleSection('metadata');\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TaskForm_TaskMetadataSection__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n priority: getPriorityString(formData.priority),\n dueDate: formData.due_date || \"\",\n taskId: task.id,\n onStatusChange: function onStatusChange(value) {\n // Universal rule: when setting status to in_progress, also add to today\n var updatedData = _objectSpread(_objectSpread({}, formData), {}, {\n status: value\n });\n if (value === 'in_progress') {\n updatedData.today = true;\n }\n setFormData(updatedData);\n },\n onPriorityChange: function onPriorityChange(value) {\n return setFormData(_objectSpread(_objectSpread({}, formData), {}, {\n priority: value\n }));\n },\n onDueDateChange: handleChange\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Shared_CollapsibleSection__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n title: t('forms.task.recurrence', 'Recurrence'),\n isExpanded: expandedSections.recurrence,\n onToggle: function onToggle() {\n return toggleSection('recurrence');\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TaskForm_TaskRecurrenceSection__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n formData: formData,\n parentTask: parentTask,\n parentTaskLoading: parentTaskLoading,\n onRecurrenceChange: handleRecurrenceChange,\n onEditParent: parentTask ? handleEditParent : undefined,\n onParentRecurrenceChange: parentTask ? handleParentRecurrenceChange : undefined\n }))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex-shrink-0 p-3 flex items-center justify-between\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TaskActions__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n taskId: task.id,\n onDelete: handleDeleteClick,\n onSave: handleSubmit,\n onCancel: handleClose\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return setIsTimelineExpanded(!isTimelineExpanded);\n },\n className: \"p-2 text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-full transition-colors\",\n title: isTimelineExpanded ? t('timeline.hideActivityTimeline') : t('timeline.showActivityTimeline')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n className: \"h-5 w-5 transition-transform duration-200 \".concat(isTimelineExpanded ? 'rotate-180' : '')\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TimelinePanel__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n taskId: task.id,\n isExpanded: isTimelineExpanded,\n onToggle: function onToggle() {\n return setIsTimelineExpanded(!isTimelineExpanded);\n }\n }))))), showConfirmDialog && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Shared_ConfirmDialog__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n title: t('modals.deleteTask.title', 'Delete Task'),\n message: t('modals.deleteTask.confirmation', 'Are you sure you want to delete this task? This action cannot be undone.'),\n onConfirm: handleDeleteConfirm,\n onCancel: function onCancel() {\n return setShowConfirmDialog(false);\n }\n }));\n};\n_s(TaskModal, \"sR3iTbRZPgb6BEXqmiBDVDPu0EI=\", false, function () {\n return [_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_4__.useToast, react_i18next__WEBPACK_IMPORTED_MODULE_10__.useTranslation];\n});\n_c = TaskModal;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TaskModal);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"TaskModal\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/TaskModal.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/TaskPriorityIcon.tsx":
+/*!*******************************************************!*\
+ !*** ./frontend/components/Task/TaskPriorityIcon.tsx ***!
+ \*******************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @heroicons/react/24/solid */ \"./node_modules/@heroicons/react/24/solid/esm/CheckCircleIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/CheckCircleIcon.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\n\n\n\n\nvar TaskPriorityIcon = function TaskPriorityIcon(_ref) {\n _s();\n var priority = _ref.priority,\n status = _ref.status,\n onToggleCompletion = _ref.onToggleCompletion;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var getIconColor = function getIconColor() {\n if (status === 'done' || status === 2) return 'text-green-500';\n\n // Handle both string and numeric priority values\n var priorityStr = priority;\n if (typeof priority === 'number') {\n var priorityNames = ['low', 'medium', 'high'];\n priorityStr = priorityNames[priority] || 'low';\n }\n switch (priorityStr) {\n case 'high':\n case 2:\n return 'text-red-500';\n case 'medium':\n case 1:\n return 'text-yellow-500';\n case 'low':\n case 0:\n default:\n return 'text-gray-300';\n }\n };\n var colorClass = getIconColor();\n var handleClick = function handleClick(e) {\n e.stopPropagation(); // Prevent triggering TaskHeader onClick\n if (onToggleCompletion) {\n onToggleCompletion();\n }\n };\n if (status === 'done' || status === 2) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_solid__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n className: \"h-5 w-5 \".concat(colorClass, \" cursor-pointer hover:scale-110 transition-transform\"),\n onClick: handleClick\n });\n } else {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: \"h-5 w-5 \".concat(colorClass, \" cursor-pointer hover:scale-110 transition-transform\"),\n onClick: handleClick\n });\n }\n};\n_s(TaskPriorityIcon, \"zlIdU9EjM2llFt74AbE2KsUJXyM=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = TaskPriorityIcon;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TaskPriorityIcon);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"TaskPriorityIcon\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/TaskPriorityIcon.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/TaskTimeline.tsx":
+/*!***************************************************!*\
+ !*** ./frontend/components/Task/TaskTimeline.tsx ***!
+ \***************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _utils_taskEventService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/taskEventService */ \"./frontend/utils/taskEventService.ts\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/SparklesIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/PlayIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/CheckCircleIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ArchiveBoxIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/AdjustmentsHorizontalIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ExclamationTriangleIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/CalendarIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/FolderIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/PencilIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/TagIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ClockIcon.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\nvar TaskTimeline = function TaskTimeline(_ref) {\n _s();\n var taskId = _ref.taskId;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState2 = _slicedToArray(_useState, 2),\n events = _useState2[0],\n setEvents = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true),\n _useState4 = _slicedToArray(_useState3, 2),\n loading = _useState4[0],\n setLoading = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState6 = _slicedToArray(_useState5, 2),\n error = _useState6[0],\n setError = _useState6[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var fetchTimeline = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var timeline, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n if (!(!taskId || taskId === undefined)) {\n _context.n = 1;\n break;\n }\n setLoading(false);\n setEvents([]);\n return _context.a(2);\n case 1:\n setLoading(true);\n setError(null);\n _context.p = 2;\n _context.n = 3;\n return (0,_utils_taskEventService__WEBPACK_IMPORTED_MODULE_2__.getTaskTimeline)(taskId);\n case 3:\n timeline = _context.v;\n setEvents(timeline);\n _context.n = 5;\n break;\n case 4:\n _context.p = 4;\n _t = _context.v;\n console.error('Error fetching task timeline:', _t);\n setError(t('timeline.failedToLoad', 'Failed to load timeline'));\n case 5:\n _context.p = 5;\n setLoading(false);\n return _context.f(5);\n case 6:\n return _context.a(2);\n }\n }, _callee, null, [[2, 4, 5, 6]]);\n }));\n return function fetchTimeline() {\n return _ref2.apply(this, arguments);\n };\n }();\n fetchTimeline();\n }, [taskId]);\n var getEventIcon = function getEventIcon(eventType, newValue) {\n var iconClass = \"h-3.5 w-3.5\";\n switch (eventType) {\n case 'created':\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: \"\".concat(iconClass, \" text-blue-500\")\n });\n case 'status_changed':\n if ((newValue === null || newValue === void 0 ? void 0 : newValue.status) === 1) return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n className: \"\".concat(iconClass, \" text-yellow-500\")\n });\n if ((newValue === null || newValue === void 0 ? void 0 : newValue.status) === 2) return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n className: \"\".concat(iconClass, \" text-green-500\")\n });\n if ((newValue === null || newValue === void 0 ? void 0 : newValue.status) === 3) return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n className: \"\".concat(iconClass, \" text-gray-500\")\n });\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n className: \"\".concat(iconClass, \" text-blue-500\")\n });\n case 'completed':\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n className: \"\".concat(iconClass, \" text-green-500\")\n });\n case 'priority_changed':\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n className: \"\".concat(iconClass, \" text-orange-500\")\n });\n case 'due_date_changed':\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n className: \"\".concat(iconClass, \" text-purple-500\")\n });\n case 'project_changed':\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n className: \"\".concat(iconClass, \" text-indigo-500\")\n });\n case 'name_changed':\n case 'description_changed':\n case 'note_changed':\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n className: \"\".concat(iconClass, \" text-gray-500\")\n });\n case 'tags_changed':\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n className: \"\".concat(iconClass, \" text-pink-500\")\n });\n case 'archived':\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n className: \"\".concat(iconClass, \" text-gray-500\")\n });\n case 'today_changed':\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n className: \"\".concat(iconClass, \" text-blue-600\")\n });\n default:\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n className: \"\".concat(iconClass, \" text-gray-400\")\n });\n }\n };\n var getEventDescription = function getEventDescription(event) {\n var event_type = event.event_type,\n old_value = event.old_value,\n new_value = event.new_value,\n field_name = event.field_name;\n switch (event_type) {\n case 'created':\n return t('timeline.events.taskCreated');\n case 'status_changed':\n case 'completed':\n var oldStatus = old_value === null || old_value === void 0 ? void 0 : old_value.status;\n var newStatus = new_value === null || new_value === void 0 ? void 0 : new_value.status;\n if (oldStatus !== undefined && newStatus !== undefined) {\n return \"\".concat(t('timeline.events.status'), \": \").concat((0,_utils_taskEventService__WEBPACK_IMPORTED_MODULE_2__.getStatusLabel)(oldStatus), \" \\u2192 \").concat((0,_utils_taskEventService__WEBPACK_IMPORTED_MODULE_2__.getStatusLabel)(newStatus));\n }\n return t('timeline.events.statusChanged');\n case 'priority_changed':\n var oldPriority = old_value === null || old_value === void 0 ? void 0 : old_value.priority;\n var newPriority = new_value === null || new_value === void 0 ? void 0 : new_value.priority;\n if (oldPriority !== undefined && newPriority !== undefined) {\n return \"\".concat(t('timeline.events.priority'), \": \").concat((0,_utils_taskEventService__WEBPACK_IMPORTED_MODULE_2__.getPriorityLabel)(oldPriority), \" \\u2192 \").concat((0,_utils_taskEventService__WEBPACK_IMPORTED_MODULE_2__.getPriorityLabel)(newPriority));\n }\n return t('timeline.events.priorityChanged');\n case 'due_date_changed':\n var oldDate = old_value === null || old_value === void 0 ? void 0 : old_value.due_date;\n var newDate = new_value === null || new_value === void 0 ? void 0 : new_value.due_date;\n if (oldDate || newDate) {\n return \"\".concat(t('timeline.events.dueDate'), \": \").concat(oldDate || t('timeline.events.none'), \" \\u2192 \").concat(newDate || t('timeline.events.none'));\n }\n return t('timeline.events.dueDateChanged');\n case 'name_changed':\n return t('timeline.events.nameUpdated');\n case 'description_changed':\n return t('timeline.events.descriptionUpdated');\n case 'note_changed':\n return t('timeline.events.noteUpdated');\n case 'project_changed':\n return t('timeline.events.projectChanged');\n case 'tags_changed':\n return t('timeline.events.tagsUpdated');\n case 'archived':\n return t('timeline.events.taskArchived');\n case 'today_changed':\n return t('timeline.events.todayFlagChanged');\n default:\n return (0,_utils_taskEventService__WEBPACK_IMPORTED_MODULE_2__.getEventTypeLabel)(event_type);\n }\n };\n var formatTimeAgo = function formatTimeAgo(dateString) {\n var date = new Date(dateString);\n var now = new Date();\n var diffMs = now.getTime() - date.getTime();\n var diffMinutes = Math.floor(diffMs / (1000 * 60));\n var diffHours = Math.floor(diffMs / (1000 * 60 * 60));\n var diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n if (diffMinutes < 1) return 'Just now';\n if (diffMinutes < 60) return \"\".concat(diffMinutes, \"m ago\");\n if (diffHours < 24) return \"\".concat(diffHours, \"h ago\");\n if (diffDays < 7) return \"\".concat(diffDays, \"d ago\");\n return date.toLocaleDateString();\n };\n if (loading) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex flex-col items-center justify-center h-32 text-gray-500 dark:text-gray-400\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n className: \"h-6 w-6 mb-2 animate-spin\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-sm\"\n }, \"Loading timeline...\"));\n }\n if (error) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex flex-col items-center justify-center h-32 text-red-500\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n className: \"h-6 w-6 mb-2\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-sm\"\n }, error));\n }\n if (!taskId) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex flex-col items-center justify-center h-32 text-gray-500 dark:text-gray-400\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: \"h-6 w-6 mb-2\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-sm text-center\"\n }, \"Timeline will appear after saving\"));\n }\n if (events.length === 0) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex flex-col items-center justify-center h-32 text-gray-500 dark:text-gray-400\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n className: \"h-6 w-6 mb-2\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-sm\"\n }, \"No activity yet\"));\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"h-full overflow-y-auto\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"space-y-2\"\n }, events.map(function (event, index) {\n var _event$new_value;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: event.id,\n className: \"relative\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-start space-x-3 py-1 relative z-10\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex-shrink-0 w-8 h-8 rounded-full flex items-center justify-center border-2 \".concat(event.event_type === 'created' ? 'bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-700' : event.event_type === 'completed' ? 'bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-700' : event.event_type === 'status_changed' && ((_event$new_value = event.new_value) === null || _event$new_value === void 0 ? void 0 : _event$new_value.status) === 1 ? 'bg-yellow-50 dark:bg-yellow-900/20 border-yellow-200 dark:border-yellow-700' : event.event_type === 'priority_changed' ? 'bg-orange-50 dark:bg-orange-900/20 border-orange-200 dark:border-orange-700' : 'bg-gray-50 dark:bg-gray-900/20 border-gray-200 dark:border-gray-700')\n }, getEventIcon(event.event_type, event.new_value)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex-1 min-w-0\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-xs font-medium text-gray-900 dark:text-gray-100 leading-tight\"\n }, getEventDescription(event)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-xs text-gray-500 dark:text-gray-400 mt-1\"\n }, formatTimeAgo(event.created_at)), event.event_type === 'tags_changed' && event.new_value && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mt-1.5 flex flex-wrap gap-1\"\n }, Array.isArray(event.new_value) && event.new_value.map(function (tag, tagIndex) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n key: tagIndex,\n className: \"inline-flex items-center px-1.5 py-0.5 rounded text-xs bg-blue-100 dark:bg-blue-900/30 text-blue-800 dark:text-blue-200 border border-blue-200 dark:border-blue-800\"\n }, tag.name || tag);\n })))));\n })));\n};\n_s(TaskTimeline, \"webeFJRvKr/VfHwYYpBS3FXYxvo=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = TaskTimeline;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TaskTimeline);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"TaskTimeline\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/TaskTimeline.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/TaskView.tsx":
+/*!***********************************************!*\
+ !*** ./frontend/components/Task/TaskView.tsx ***!
+ \***********************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/dist/index.js\");\n/* harmony import */ var _TaskModal__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./TaskModal */ \"./frontend/components/Task/TaskModal.tsx\");\n/* harmony import */ var _utils_tasksService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/tasksService */ \"./frontend/utils/tasksService.ts\");\n/* harmony import */ var _utils_projectsService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/projectsService */ \"./frontend/utils/projectsService.ts\");\n/* harmony import */ var _store_useStore__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../store/useStore */ \"./frontend/store/useStore.ts\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\nvar TaskView = function TaskView() {\n _s();\n var _useParams = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_5__.useParams)(),\n uuid = _useParams.uuid;\n var navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_5__.useNavigate)();\n var store = (0,_store_useStore__WEBPACK_IMPORTED_MODULE_4__.useStore)();\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState2 = _slicedToArray(_useState, 2),\n task = _useState2[0],\n setTask = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true),\n _useState4 = _slicedToArray(_useState3, 2),\n loading = _useState4[0],\n setLoading = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState6 = _slicedToArray(_useState5, 2),\n error = _useState6[0],\n setError = _useState6[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var fetchTask = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var taskData, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n if (uuid) {\n _context.n = 1;\n break;\n }\n setError(\"No task UUID provided\");\n setLoading(false);\n return _context.a(2);\n case 1:\n _context.p = 1;\n _context.n = 2;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_2__.fetchTaskByUuid)(uuid);\n case 2:\n taskData = _context.v;\n setTask(taskData);\n _context.n = 4;\n break;\n case 3:\n _context.p = 3;\n _t = _context.v;\n setError(\"An error occurred while fetching the task\");\n case 4:\n _context.p = 4;\n setLoading(false);\n return _context.f(4);\n case 5:\n return _context.a(2);\n }\n }, _callee, null, [[1, 3, 4, 5]]);\n }));\n return function fetchTask() {\n return _ref.apply(this, arguments);\n };\n }();\n fetchTask();\n }, [uuid]);\n var handleClose = function handleClose() {\n navigate(-1); // Go back to previous page\n };\n var handleTaskUpdate = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(updatedTask) {\n var updated, _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n _context2.p = 0;\n if (!(task !== null && task !== void 0 && task.id)) {\n _context2.n = 2;\n break;\n }\n _context2.n = 1;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_2__.updateTask)(task.id, updatedTask);\n case 1:\n updated = _context2.v;\n setTask(updated);\n case 2:\n _context2.n = 4;\n break;\n case 3:\n _context2.p = 3;\n _t2 = _context2.v;\n console.error(\"Error updating task:\", _t2);\n case 4:\n return _context2.a(2);\n }\n }, _callee2, null, [[0, 3]]);\n }));\n return function handleTaskUpdate(_x) {\n return _ref2.apply(this, arguments);\n };\n }();\n var handleTaskDelete = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(taskId) {\n var _t3;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n _context3.p = 0;\n _context3.n = 1;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_2__.deleteTask)(taskId);\n case 1:\n navigate('/today'); // Navigate back to today view after deletion\n _context3.n = 3;\n break;\n case 2:\n _context3.p = 2;\n _t3 = _context3.v;\n console.error(\"Error deleting task:\", _t3);\n throw _t3;\n case 3:\n return _context3.a(2);\n }\n }, _callee3, null, [[0, 2]]);\n }));\n return function handleTaskDelete(_x2) {\n return _ref3.apply(this, arguments);\n };\n }();\n var handleCreateProject = /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(name) {\n var _t4;\n return _regenerator().w(function (_context4) {\n while (1) switch (_context4.n) {\n case 0:\n _context4.p = 0;\n _context4.n = 1;\n return (0,_utils_projectsService__WEBPACK_IMPORTED_MODULE_3__.createProject)({\n name: name\n });\n case 1:\n return _context4.a(2, _context4.v);\n case 2:\n _context4.p = 2;\n _t4 = _context4.v;\n console.error(\"Error creating project:\", _t4);\n throw _t4;\n case 3:\n return _context4.a(2);\n }\n }, _callee4, null, [[0, 2]]);\n }));\n return function handleCreateProject(_x3) {\n return _ref4.apply(this, arguments);\n };\n }();\n if (loading) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-center h-screen bg-gray-100 dark:bg-gray-900\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-xl font-semibold text-gray-700 dark:text-gray-200\"\n }, \"Loading task...\"));\n }\n if (error || !task) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-center h-screen bg-gray-100 dark:bg-gray-900\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-xl font-semibold text-red-600 dark:text-red-400 mb-4\"\n }, error || \"Task not found\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return navigate(\"/\");\n },\n className: \"px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors\"\n }, \"Go Home\")));\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TaskModal__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n isOpen: true,\n task: task,\n onClose: handleClose,\n onSave: handleTaskUpdate,\n onDelete: handleTaskDelete,\n projects: store.projectsStore.projects,\n onCreateProject: handleCreateProject\n });\n};\n_s(TaskView, \"4UNf5wNPjU8MM885vAfxIIeN3Tk=\", false, function () {\n return [react_router_dom__WEBPACK_IMPORTED_MODULE_5__.useParams, react_router_dom__WEBPACK_IMPORTED_MODULE_5__.useNavigate, _store_useStore__WEBPACK_IMPORTED_MODULE_4__.useStore];\n});\n_c = TaskView;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TaskView);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"TaskView\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/TaskView.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/TasksToday.tsx":
+/*!*************************************************!*\
+ !*** ./frontend/components/Task/TasksToday.tsx ***!
+ \*************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! date-fns */ \"./node_modules/date-fns/format.js\");\n/* harmony import */ var date_fns_locale__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! date-fns/locale */ \"./node_modules/date-fns/locale/el.js\");\n/* harmony import */ var date_fns_locale__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! date-fns/locale */ \"./node_modules/date-fns/locale/es.js\");\n/* harmony import */ var date_fns_locale__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! date-fns/locale */ \"./node_modules/date-fns/locale/ja.js\");\n/* harmony import */ var date_fns_locale__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! date-fns/locale */ \"./node_modules/date-fns/locale/uk.js\");\n/* harmony import */ var date_fns_locale__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! date-fns/locale */ \"./node_modules/date-fns/locale/de.js\");\n/* harmony import */ var date_fns_locale__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! date-fns/locale */ \"./node_modules/date-fns/locale/en-US.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var i18next__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! i18next */ \"./node_modules/i18next/dist/esm/i18next.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/CalendarDaysIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/CogIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ClipboardDocumentListIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ArrowPathIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/CheckCircleIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ArrowUpIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ArrowDownIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/FolderIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ChevronRightIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ChevronDownIcon.js\");\n/* harmony import */ var _utils_tasksService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/tasksService */ \"./frontend/utils/tasksService.ts\");\n/* harmony import */ var _utils_projectsService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils/projectsService */ \"./frontend/utils/projectsService.ts\");\n/* harmony import */ var _store_useStore__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../store/useStore */ \"./frontend/store/useStore.ts\");\n/* harmony import */ var _TaskList__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./TaskList */ \"./frontend/components/Task/TaskList.tsx\");\n/* harmony import */ var _TodayPlan__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./TodayPlan */ \"./frontend/components/Task/TodayPlan.tsx\");\n/* harmony import */ var _Productivity_ProductivityAssistant__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Productivity/ProductivityAssistant */ \"./frontend/components/Productivity/ProductivityAssistant.tsx\");\n/* harmony import */ var _NextTaskSuggestion__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./NextTaskSuggestion */ \"./frontend/components/Task/NextTaskSuggestion.tsx\");\n/* harmony import */ var _WeeklyCompletionChart__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./WeeklyCompletionChart */ \"./frontend/components/Task/WeeklyCompletionChart.tsx\");\n/* harmony import */ var _TodaySettingsDropdown__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./TodaySettingsDropdown */ \"./frontend/components/Task/TodaySettingsDropdown.tsx\");\n/* harmony import */ var _utils_profileService__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../utils/profileService */ \"./frontend/utils/profileService.ts\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar getLocale = function getLocale(language) {\n switch (language) {\n case 'el':\n return date_fns_locale__WEBPACK_IMPORTED_MODULE_13__.el;\n case 'es':\n return date_fns_locale__WEBPACK_IMPORTED_MODULE_14__.es;\n case 'jp':\n return date_fns_locale__WEBPACK_IMPORTED_MODULE_15__.ja;\n case 'ua':\n return date_fns_locale__WEBPACK_IMPORTED_MODULE_16__.uk;\n case 'de':\n return date_fns_locale__WEBPACK_IMPORTED_MODULE_17__.de;\n default:\n return date_fns_locale__WEBPACK_IMPORTED_MODULE_18__.enUS;\n }\n};\nvar TasksToday = function TasksToday() {\n _s();\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n\n // Don't use multiple separate useStore calls - combine them into one\n var store = (0,_store_useStore__WEBPACK_IMPORTED_MODULE_5__.useStore)();\n\n // Use local state for data instead of directly using store state\n // This prevents unnecessary re-renders from store updates\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState2 = _slicedToArray(_useState, 2),\n localTasks = _useState2[0],\n setLocalTasks = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState4 = _slicedToArray(_useState3, 2),\n localProjects = _useState4[0],\n setLocalProjects = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState6 = _slicedToArray(_useState5, 2),\n isLoading = _useState6[0],\n setIsLoading = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState8 = _slicedToArray(_useState7, 2),\n isError = _useState8[0],\n setIsError = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(''),\n _useState0 = _slicedToArray(_useState9, 2),\n dailyQuote = _useState0[0],\n setDailyQuote = _useState0[1];\n var _useState1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true),\n _useState10 = _slicedToArray(_useState1, 2),\n productivityAssistantEnabled = _useState10[0],\n setProductivityAssistantEnabled = _useState10[1];\n var _useState11 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState12 = _slicedToArray(_useState11, 2),\n isSettingsDropdownOpen = _useState12[0],\n setIsSettingsDropdownOpen = _useState12[1];\n var _useState13 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n showMetrics: false,\n showProductivity: false,\n showIntelligence: false,\n showDueToday: true,\n showCompleted: true,\n showProgressBar: true,\n // Always enabled\n showDailyQuote: true\n }),\n _useState14 = _slicedToArray(_useState13, 2),\n todaySettings = _useState14[0],\n setTodaySettings = _useState14[1];\n var _useState15 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true),\n _useState16 = _slicedToArray(_useState15, 2),\n nextTaskSuggestionEnabled = _useState16[0],\n setNextTaskSuggestionEnabled = _useState16[1];\n var _useState17 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(function () {\n var stored = sessionStorage.getItem('hideNextTaskSuggestion');\n return stored !== 'true';\n }),\n _useState18 = _slicedToArray(_useState17, 2),\n showNextTaskSuggestion = _useState18[0],\n setShowNextTaskSuggestion = _useState18[1];\n var _useState19 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(function () {\n var stored = localStorage.getItem('suggestedTasksCollapsed');\n return stored === 'true';\n }),\n _useState20 = _slicedToArray(_useState19, 2),\n isSuggestedCollapsed = _useState20[0],\n setIsSuggestedCollapsed = _useState20[1];\n var _useState21 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(function () {\n var stored = localStorage.getItem('completedTasksCollapsed');\n return stored === 'true';\n }),\n _useState22 = _slicedToArray(_useState21, 2),\n isCompletedCollapsed = _useState22[0],\n setIsCompletedCollapsed = _useState22[1];\n\n // Metrics from the API\n var _useState23 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n total_open_tasks: 0,\n tasks_pending_over_month: 0,\n tasks_in_progress_count: 0,\n tasks_in_progress: [],\n tasks_due_today: [],\n suggested_tasks: [],\n tasks_completed_today: [],\n weekly_completions: []\n }),\n _useState24 = _slicedToArray(_useState23, 2),\n metrics = _useState24[0],\n setMetrics = _useState24[1];\n\n // Helper function to get completion trend vs average\n var getCompletionTrend = function getCompletionTrend() {\n var todayCount = metrics.tasks_completed_today.length;\n\n // Calculate average: sum of all completed tasks divided by 7 days\n // The average represents the daily average across the week\n if (metrics.weekly_completions.length === 0) {\n return {\n direction: 'same',\n difference: 0,\n percentage: 0,\n todayCount: todayCount,\n averageCount: 0\n };\n }\n\n // Sum all completed tasks from the weekly data\n var totalCompletedTasks = metrics.weekly_completions.reduce(function (sum, completion) {\n return sum + completion.count;\n }, 0);\n\n // Average is total completed tasks divided by 7\n var averageCount = totalCompletedTasks / 7;\n\n // Calculate percentage change vs average\n var percentage = 0;\n if (averageCount > 0) {\n percentage = Math.round((todayCount - averageCount) / averageCount * 100);\n } else if (todayCount > 0) {\n // If average was 0 but today has completions, it's a 100%+ increase\n percentage = 100;\n }\n if (todayCount > averageCount) {\n return {\n direction: 'up',\n difference: Math.round((todayCount - averageCount) * 10) / 10,\n // Round to 1 decimal\n percentage: Math.abs(percentage),\n todayCount: todayCount,\n averageCount: Math.round(averageCount * 10) / 10 // Round to 1 decimal\n };\n } else if (todayCount < averageCount) {\n return {\n direction: 'down',\n difference: Math.round((averageCount - todayCount) * 10) / 10,\n // Round to 1 decimal\n percentage: Math.abs(percentage),\n todayCount: todayCount,\n averageCount: Math.round(averageCount * 10) / 10 // Round to 1 decimal\n };\n } else {\n return {\n direction: 'same',\n difference: 0,\n percentage: 0,\n todayCount: todayCount,\n averageCount: Math.round(averageCount * 10) / 10 // Round to 1 decimal\n };\n }\n };\n\n // Track mounting state to prevent state updates after unmount\n var isMounted = react__WEBPACK_IMPORTED_MODULE_0___default().useRef(false);\n\n // Function to handle next task suggestion dismissal\n var handleCloseNextTaskSuggestion = function handleCloseNextTaskSuggestion() {\n setShowNextTaskSuggestion(false);\n sessionStorage.setItem('hideNextTaskSuggestion', 'true');\n };\n\n // Toggle functions for collapsible sections\n var toggleSuggestedCollapsed = function toggleSuggestedCollapsed() {\n var newState = !isSuggestedCollapsed;\n setIsSuggestedCollapsed(newState);\n localStorage.setItem('suggestedTasksCollapsed', newState.toString());\n };\n var toggleCompletedCollapsed = function toggleCompletedCollapsed() {\n var newState = !isCompletedCollapsed;\n setIsCompletedCollapsed(newState);\n localStorage.setItem('completedTasksCollapsed', newState.toString());\n };\n\n // Load data once on component mount\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n isMounted.current = true;\n\n // Only fetch data once on mount\n var loadData = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var isEnabled, isNextTaskEnabled, projectsData, safeProjectsData, _yield$fetchTasks, fetchedTasks, fetchedMetrics, response, data, randomIndex, fallbackResponse, fallbackData, _randomIndex, _response, userData, settings, _t, _t2, _t3, _t4, _t5, _t6;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n if (isMounted.current) {\n _context.n = 1;\n break;\n }\n return _context.a(2);\n case 1:\n setIsLoading(true);\n setIsError(false);\n _context.p = 2;\n _context.n = 3;\n return (0,_utils_profileService__WEBPACK_IMPORTED_MODULE_12__.getProductivityAssistantEnabled)();\n case 3:\n isEnabled = _context.v;\n if (isMounted.current) {\n setProductivityAssistantEnabled(isEnabled);\n }\n _context.n = 5;\n break;\n case 4:\n _context.p = 4;\n _t = _context.v;\n console.error(\"Failed to load productivity assistant setting:\", _t);\n case 5:\n _context.p = 5;\n _context.n = 6;\n return (0,_utils_profileService__WEBPACK_IMPORTED_MODULE_12__.getNextTaskSuggestionEnabled)();\n case 6:\n isNextTaskEnabled = _context.v;\n if (isMounted.current) {\n setNextTaskSuggestionEnabled(isNextTaskEnabled);\n }\n _context.n = 8;\n break;\n case 7:\n _context.p = 7;\n _t2 = _context.v;\n console.error(\"Failed to load next task suggestion setting:\", _t2);\n case 8:\n _context.p = 8;\n _context.n = 9;\n return (0,_utils_projectsService__WEBPACK_IMPORTED_MODULE_4__.fetchProjects)();\n case 9:\n projectsData = _context.v;\n if (isMounted.current) {\n safeProjectsData = Array.isArray(projectsData) ? projectsData : [];\n setLocalProjects(safeProjectsData);\n store.projectsStore.setProjects(safeProjectsData);\n }\n _context.n = 11;\n break;\n case 10:\n _context.p = 10;\n _t3 = _context.v;\n console.error('Projects loading error:', _t3);\n if (isMounted.current) {\n setLocalProjects([]);\n setIsError(true);\n }\n case 11:\n _context.p = 11;\n _context.n = 12;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_3__.fetchTasks)(\"?type=today\");\n case 12:\n _yield$fetchTasks = _context.v;\n fetchedTasks = _yield$fetchTasks.tasks;\n fetchedMetrics = _yield$fetchTasks.metrics;\n if (isMounted.current) {\n setLocalTasks(fetchedTasks);\n setMetrics(fetchedMetrics);\n // Also update the store\n store.tasksStore.setTasks(fetchedTasks);\n }\n _context.n = 14;\n break;\n case 13:\n _context.p = 13;\n _t4 = _context.v;\n console.error(\"Failed to fetch tasks:\", _t4);\n if (isMounted.current) {\n setIsError(true);\n }\n case 14:\n _context.p = 14;\n if (isMounted.current) {\n setIsLoading(false);\n }\n return _context.f(14);\n case 15:\n _context.p = 15;\n _context.n = 16;\n return fetch(\"/locales/\".concat(i18next__WEBPACK_IMPORTED_MODULE_2__[\"default\"].language, \"/quotes.json\"));\n case 16:\n response = _context.v;\n if (!response.ok) {\n _context.n = 18;\n break;\n }\n _context.n = 17;\n return response.json();\n case 17:\n data = _context.v;\n if (isMounted.current && data.quotes && data.quotes.length > 0) {\n // Get a random quote from the translated quotes\n randomIndex = Math.floor(Math.random() * data.quotes.length);\n setDailyQuote(data.quotes[randomIndex]);\n }\n _context.n = 21;\n break;\n case 18:\n _context.n = 19;\n return fetch('/locales/en/quotes.json');\n case 19:\n fallbackResponse = _context.v;\n if (!fallbackResponse.ok) {\n _context.n = 21;\n break;\n }\n _context.n = 20;\n return fallbackResponse.json();\n case 20:\n fallbackData = _context.v;\n if (isMounted.current && fallbackData.quotes && fallbackData.quotes.length > 0) {\n _randomIndex = Math.floor(Math.random() * fallbackData.quotes.length);\n setDailyQuote(fallbackData.quotes[_randomIndex]);\n }\n case 21:\n _context.n = 23;\n break;\n case 22:\n _context.p = 22;\n _t5 = _context.v;\n console.error(\"Failed to load daily quote:\", _t5);\n // Ultimate fallback\n if (isMounted.current) {\n setDailyQuote(\"Focus on progress, not perfection.\");\n }\n case 23:\n _context.p = 23;\n _context.n = 24;\n return fetch('/api/profile', {\n credentials: 'include'\n });\n case 24:\n _response = _context.v;\n if (!_response.ok) {\n _context.n = 26;\n break;\n }\n _context.n = 25;\n return _response.json();\n case 25:\n userData = _context.v;\n if (isMounted.current) {\n // Parse today_settings if it's a string, or use the object directly\n\n if (userData.today_settings) {\n if (typeof userData.today_settings === 'string') {\n try {\n settings = JSON.parse(userData.today_settings);\n } catch (error) {\n console.error('Error parsing today_settings:', error);\n settings = null;\n }\n } else {\n settings = userData.today_settings;\n }\n }\n\n // Use parsed settings or fall back to defaults\n settings = settings || {\n showMetrics: false,\n showProductivity: false,\n showIntelligence: false,\n showDueToday: true,\n showCompleted: true,\n showProgressBar: true,\n // Always enabled\n showDailyQuote: true\n };\n\n // Ensure progress bar is always enabled\n settings.showProgressBar = true;\n setTodaySettings(settings);\n }\n case 26:\n _context.n = 28;\n break;\n case 27:\n _context.p = 27;\n _t6 = _context.v;\n console.error(\"Failed to load user settings:\", _t6);\n case 28:\n return _context.a(2);\n }\n }, _callee, null, [[23, 27], [15, 22], [11, 13, 14, 15], [8, 10], [5, 7], [2, 4]]);\n }));\n return function loadData() {\n return _ref.apply(this, arguments);\n };\n }();\n loadData();\n\n // Cleanup function to prevent state updates after unmount\n return function () {\n isMounted.current = false;\n };\n }, []); // Empty dependency array - only run once on mount\n\n // Memoize task handlers to prevent recreating functions on each render\n var handleTaskUpdate = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(/*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(updatedTask) {\n var _yield$fetchTasks2, updatedTasks, _metrics, _t7;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n if (!(!updatedTask.id || !isMounted.current)) {\n _context2.n = 1;\n break;\n }\n return _context2.a(2);\n case 1:\n setIsLoading(true);\n _context2.p = 2;\n _context2.n = 3;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_3__.updateTask)(updatedTask.id, updatedTask);\n case 3:\n _context2.n = 4;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_3__.fetchTasks)(\"?type=today\");\n case 4:\n _yield$fetchTasks2 = _context2.v;\n updatedTasks = _yield$fetchTasks2.tasks;\n _metrics = _yield$fetchTasks2.metrics;\n if (isMounted.current) {\n setLocalTasks(updatedTasks);\n setMetrics(_metrics);\n // Update store\n store.tasksStore.setTasks(updatedTasks);\n }\n _context2.n = 6;\n break;\n case 5:\n _context2.p = 5;\n _t7 = _context2.v;\n console.error(\"Error updating task:\", _t7);\n if (isMounted.current) {\n setIsError(true);\n }\n case 6:\n _context2.p = 6;\n if (isMounted.current) {\n setIsLoading(false);\n }\n return _context2.f(6);\n case 7:\n return _context2.a(2);\n }\n }, _callee2, null, [[2, 5, 6, 7]]);\n }));\n return function (_x) {\n return _ref2.apply(this, arguments);\n };\n }(), [store.tasksStore]);\n var handleTaskDelete = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(/*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(taskId) {\n var _yield$fetchTasks3, updatedTasks, _metrics2, _t8;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n if (isMounted.current) {\n _context3.n = 1;\n break;\n }\n return _context3.a(2);\n case 1:\n setIsLoading(true);\n _context3.p = 2;\n _context3.n = 3;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_3__.deleteTask)(taskId);\n case 3:\n _context3.n = 4;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_3__.fetchTasks)(\"?type=today\");\n case 4:\n _yield$fetchTasks3 = _context3.v;\n updatedTasks = _yield$fetchTasks3.tasks;\n _metrics2 = _yield$fetchTasks3.metrics;\n if (isMounted.current) {\n setLocalTasks(updatedTasks);\n setMetrics(_metrics2);\n // Update store\n store.tasksStore.setTasks(updatedTasks);\n }\n _context3.n = 6;\n break;\n case 5:\n _context3.p = 5;\n _t8 = _context3.v;\n console.error(\"Error deleting task:\", _t8);\n if (isMounted.current) {\n setIsError(true);\n }\n case 6:\n _context3.p = 6;\n if (isMounted.current) {\n setIsLoading(false);\n }\n return _context3.f(6);\n case 7:\n return _context3.a(2);\n }\n }, _callee3, null, [[2, 5, 6, 7]]);\n }));\n return function (_x2) {\n return _ref3.apply(this, arguments);\n };\n }(), [store.tasksStore]);\n var handleToggleToday = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(/*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(taskId) {\n var _yield$fetchTasks4, updatedTasks, _metrics3, _t9;\n return _regenerator().w(function (_context4) {\n while (1) switch (_context4.n) {\n case 0:\n if (isMounted.current) {\n _context4.n = 1;\n break;\n }\n return _context4.a(2);\n case 1:\n _context4.p = 1;\n _context4.n = 2;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_3__.toggleTaskToday)(taskId);\n case 2:\n _context4.n = 3;\n return (0,_utils_tasksService__WEBPACK_IMPORTED_MODULE_3__.fetchTasks)(\"?type=today\");\n case 3:\n _yield$fetchTasks4 = _context4.v;\n updatedTasks = _yield$fetchTasks4.tasks;\n _metrics3 = _yield$fetchTasks4.metrics;\n if (isMounted.current) {\n setLocalTasks(updatedTasks);\n setMetrics(_metrics3);\n // Update store\n store.tasksStore.setTasks(updatedTasks);\n }\n _context4.n = 5;\n break;\n case 4:\n _context4.p = 4;\n _t9 = _context4.v;\n console.error(\"Error toggling task today status:\", _t9);\n if (isMounted.current) {\n setIsError(true);\n }\n case 5:\n return _context4.a(2);\n }\n }, _callee4, null, [[1, 4]]);\n }));\n return function (_x3) {\n return _ref4.apply(this, arguments);\n };\n }(), [store.tasksStore]);\n\n // Calculate today's progress for the progress bar\n var getTodayProgress = function getTodayProgress() {\n var todayTasks = metrics.today_plan_tasks || [];\n var completedToday = metrics.tasks_completed_today.length;\n var totalTodayTasks = todayTasks.length + completedToday;\n return {\n completed: completedToday,\n total: totalTodayTasks,\n percentage: totalTodayTasks === 0 ? 0 : Math.round(completedToday / totalTodayTasks * 100)\n };\n };\n var todayProgress = getTodayProgress();\n\n // Handle settings change\n var handleSettingsChange = function handleSettingsChange(newSettings) {\n setTodaySettings(newSettings);\n };\n\n // Show loading state\n if (isLoading && localTasks.length === 0) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex justify-center items-center h-64\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-gray-500 dark:text-gray-400\"\n }, t('common.loading', 'Loading...')));\n }\n\n // Show error state\n if (isError && localTasks.length === 0) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex justify-center items-center h-64\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-red-500\"\n }, t('errors.somethingWentWrong', 'Something went wrong')));\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex justify-center px-4 lg:px-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-full max-w-5xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex flex-col\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-end justify-between mb-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n className: \"h-5 w-5 mr-2 mb-1\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h2\", {\n className: \"text-2xl font-light mr-4\"\n }, t('tasks.today')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-gray-500\"\n }, (0,date_fns__WEBPACK_IMPORTED_MODULE_20__.format)(new Date(), \"PPP\", {\n locale: getLocale(i18next__WEBPACK_IMPORTED_MODULE_2__[\"default\"].language)\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-end space-x-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"relative\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return setIsSettingsDropdownOpen(!isSettingsDropdownOpen);\n },\n className: \"flex flex-row items-center p-2 group focus:outline-none rounded-md transition-all duration-200 text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800\",\n title: t('settings.todayPageSettings', 'Today Page Settings')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n className: \"h-5 w-5\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-xs font-medium transition-all duration-200 max-w-0 overflow-hidden opacity-0 group-hover:max-w-xs group-hover:opacity-100 group-focus:max-w-xs group-focus:opacity-100 group-hover:ml-2 group-focus:ml-2\"\n }, t('common.settings', 'Settings'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TodaySettingsDropdown__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n isOpen: isSettingsDropdownOpen,\n onClose: function onClose() {\n return setIsSettingsDropdownOpen(false);\n },\n settings: todaySettings,\n onSettingsChange: handleSettingsChange\n })))), todaySettings.showProgressBar && todayProgress.total > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"w-full bg-gray-200 dark:bg-gray-700 rounded-full h-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"h-1 rounded-full transition-all duration-500 ease-out bg-gradient-to-r from-blue-400 via-blue-500 to-blue-700\",\n style: {\n width: \"\".concat(todayProgress.percentage, \"%\")\n }\n })), todaySettings.showDailyQuote && dailyQuote && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mt-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-s text-gray-400 dark:text-gray-500 font-light text-left\"\n }, dailyQuote))))), todaySettings.showMetrics && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-2 grid grid-cols-1 lg:grid-cols-3 gap-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-white dark:bg-gray-900 rounded-lg shadow p-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-sm font-medium mb-2 text-gray-700 dark:text-gray-300\"\n }, t('dashboard.overview')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"space-y-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n className: \"h-4 w-4 text-blue-500 mr-2\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-xs text-gray-500 dark:text-gray-400\"\n }, t('tasks.backlog'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-sm font-semibold\"\n }, metrics.total_open_tasks)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n className: \"h-4 w-4 text-green-500 mr-2\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-xs text-gray-500 dark:text-gray-400\"\n }, t('tasks.inProgress'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-sm font-semibold\"\n }, metrics.tasks_in_progress_count)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n className: \"h-4 w-4 text-red-500 mr-2\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-xs text-gray-500 dark:text-gray-400\"\n }, t('tasks.dueToday'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-sm font-semibold\"\n }, metrics.tasks_due_today.length)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n className: \"h-4 w-4 text-green-600 mr-2\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-xs text-gray-500 dark:text-gray-400\"\n }, t('tasks.completedToday', 'Completed Today'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center space-x-1\"\n }, function () {\n var trend = getCompletionTrend();\n var getTooltipText = function getTooltipText() {\n if (trend.direction === 'same') {\n return t('dashboard.sameAsAverage', 'Same as average');\n } else if (trend.direction === 'up') {\n return t('dashboard.betterThanAverage', '{{percentage}}% more than average', {\n percentage: trend.percentage\n });\n } else {\n return t('dashboard.worseThanAverage', '{{percentage}}% less than average', {\n percentage: trend.percentage\n });\n }\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, (trend.direction === 'up' || trend.direction === 'down') && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"relative group\"\n }, trend.direction === 'up' && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n className: \"h-3 w-3 text-green-500\"\n }), trend.direction === 'down' && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_26__[\"default\"], {\n className: \"h-3 w-3 text-red-500\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"absolute bottom-full left-1/2 transform -translate-x-1/2 mb-2 px-2 py-1 text-xs text-white bg-gray-900 dark:bg-gray-700 rounded opacity-0 group-hover:opacity-100 transition-opacity duration-200 pointer-events-none whitespace-nowrap z-10\"\n }, getTooltipText())), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-sm font-semibold\"\n }, metrics.tasks_completed_today.length));\n }())), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_27__[\"default\"], {\n className: \"h-4 w-4 text-purple-500 mr-2\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-xs text-gray-500 dark:text-gray-400\"\n }, t('projects.active'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-sm font-semibold\"\n }, Array.isArray(localProjects) ? localProjects.filter(function (project) {\n return project.active;\n }).length : 0)))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"lg:col-span-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_WeeklyCompletionChart__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n data: metrics.weekly_completions\n }))), todaySettings.showProductivity && productivityAssistantEnabled && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Productivity_ProductivityAssistant__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n tasks: localTasks,\n projects: localProjects\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TodayPlan__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n todayPlanTasks: metrics.today_plan_tasks || [],\n projects: localProjects,\n onTaskUpdate: handleTaskUpdate,\n onTaskDelete: handleTaskDelete,\n onToggleToday: handleToggleToday\n }), todaySettings.showIntelligence && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mt-8\"\n }, nextTaskSuggestionEnabled && showNextTaskSuggestion && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_NextTaskSuggestion__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n metrics: {\n tasks_due_today: metrics.tasks_due_today,\n suggested_tasks: metrics.suggested_tasks,\n tasks_in_progress: metrics.tasks_in_progress,\n today_plan_tasks: metrics.today_plan_tasks\n },\n onTaskUpdate: handleTaskUpdate,\n onClose: handleCloseNextTaskSuggestion\n }), metrics.suggested_tasks.length > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-6\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between cursor-pointer mt-6 mb-2 pb-2 border-b border-gray-200 dark:border-gray-700\",\n onClick: toggleSuggestedCollapsed\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-xl font-medium\"\n }, t('tasks.suggested')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-sm text-gray-500 mr-2\"\n }, metrics.suggested_tasks.length), isSuggestedCollapsed ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {\n className: \"h-5 w-5 text-gray-500\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_29__[\"default\"], {\n className: \"h-5 w-5 text-gray-500\"\n }))), !isSuggestedCollapsed && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TaskList__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n tasks: metrics.suggested_tasks,\n onTaskUpdate: handleTaskUpdate,\n onTaskDelete: handleTaskDelete,\n projects: localProjects,\n onToggleToday: handleToggleToday\n }))), todaySettings.showDueToday && metrics.tasks_due_today.length > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-6\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-xl font-medium mt-6 mb-2\"\n }, t('tasks.dueToday')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TaskList__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n tasks: metrics.tasks_due_today,\n onTaskUpdate: handleTaskUpdate,\n onTaskDelete: handleTaskDelete,\n projects: localProjects,\n onToggleToday: handleToggleToday\n })), todaySettings.showCompleted && metrics.tasks_completed_today.length > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mb-6\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between cursor-pointer mt-6 mb-2 pb-2 border-b border-gray-200 dark:border-gray-700\",\n onClick: toggleCompletedCollapsed\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-xl font-medium\"\n }, t('tasks.completedToday')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-sm text-gray-500 mr-2\"\n }, metrics.tasks_completed_today.length), isCompletedCollapsed ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {\n className: \"h-5 w-5 text-gray-500\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_29__[\"default\"], {\n className: \"h-5 w-5 text-gray-500\"\n }))), !isCompletedCollapsed && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TaskList__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n tasks: metrics.tasks_completed_today,\n onTaskUpdate: handleTaskUpdate,\n onTaskDelete: handleTaskDelete,\n projects: localProjects,\n onToggleToday: handleToggleToday\n })), metrics.tasks_due_today.length === 0 && metrics.tasks_in_progress.length === 0 && metrics.suggested_tasks.length === 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-gray-500 text-center mt-4\"\n }, t('tasks.noTasksAvailable'))));\n};\n_s(TasksToday, \"Hc8C7xHEanytcQXEnF7K/scGgfE=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation, _store_useStore__WEBPACK_IMPORTED_MODULE_5__.useStore];\n});\n_c = TasksToday;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TasksToday);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"TasksToday\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/TasksToday.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/TimelinePanel.tsx":
+/*!****************************************************!*\
+ !*** ./frontend/components/Task/TimelinePanel.tsx ***!
+ \****************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _TaskTimeline__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./TaskTimeline */ \"./frontend/components/Task/TaskTimeline.tsx\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ClockIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/XMarkIcon.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\n\n\n\n\nvar TimelinePanel = function TimelinePanel(_ref) {\n _s();\n var taskId = _ref.taskId,\n isExpanded = _ref.isExpanded,\n onToggle = _ref.onToggle;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"\".concat(isExpanded ? 'w-full lg:w-80 opacity-100' : 'w-0 lg:w-12 opacity-0 lg:opacity-100', \" border-t lg:border-t-0 lg:border-l border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900/50 flex flex-col transition-all duration-300 overflow-hidden\")\n }, !isExpanded && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"hidden lg:flex flex-col items-center justify-center h-full p-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"text-xs text-gray-500 dark:text-gray-400 mt-2 transform rotate-90 whitespace-nowrap\"\n }, t('timeline.activityTimeline'))), isExpanded && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-3 lg:p-4 border-b border-gray-200 dark:border-gray-700 flex-shrink-0\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center justify-between\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-sm font-medium text-gray-900 dark:text-gray-100 flex items-center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: \"h-4 w-4 mr-2 text-gray-500\"\n }), t('timeline.activityTimeline')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return onToggle();\n },\n className: \"lg:hidden p-1 text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 rounded\",\n title: t('timeline.hideTimeline')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n className: \"h-4 w-4\"\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-3 lg:p-4 flex-1 overflow-hidden\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TaskTimeline__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n taskId: taskId\n }))));\n};\n_s(TimelinePanel, \"zlIdU9EjM2llFt74AbE2KsUJXyM=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = TimelinePanel;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TimelinePanel);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"TimelinePanel\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/TimelinePanel.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/TodayPlan.tsx":
+/*!************************************************!*\
+ !*** ./frontend/components/Task/TodayPlan.tsx ***!
+ \************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/CalendarDaysIcon.js\");\n/* harmony import */ var _TaskList__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./TaskList */ \"./frontend/components/Task/TaskList.tsx\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\n\n\n\n\nvar TodayPlan = function TodayPlan(_ref) {\n _s();\n var todayPlanTasks = _ref.todayPlanTasks,\n projects = _ref.projects,\n onTaskUpdate = _ref.onTaskUpdate,\n onTaskDelete = _ref.onTaskDelete,\n onToggleToday = _ref.onToggleToday;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n\n // Handle undefined or null todayPlanTasks\n var safeTodayPlanTasks = todayPlanTasks || [];\n if (safeTodayPlanTasks.length === 0) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"text-center py-8\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: \"h-12 w-12 text-gray-300 dark:text-gray-600 mx-auto mb-4\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-gray-500 dark:text-gray-400 mb-2\"\n }, t('tasks.noPlanToday', 'No tasks planned for today yet')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-sm text-gray-400 dark:text-gray-500\"\n }, t('tasks.addToPlanHint', 'Use the calendar icons next to suggested tasks to add them to your today plan'))));\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TaskList__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n tasks: safeTodayPlanTasks,\n onTaskUpdate: onTaskUpdate,\n onTaskDelete: onTaskDelete,\n projects: projects,\n onToggleToday: onToggleToday\n }));\n};\n_s(TodayPlan, \"zlIdU9EjM2llFt74AbE2KsUJXyM=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = TodayPlan;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TodayPlan);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"TodayPlan\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/TodayPlan.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/TodaySettingsDropdown.tsx":
+/*!************************************************************!*\
+ !*** ./frontend/components/Task/TodaySettingsDropdown.tsx ***!
+ \************************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ChatBubbleBottomCenterTextIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ChartBarIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/LightBulbIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/SparklesIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/ClockIcon.js\");\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"./node_modules/@heroicons/react/24/outline/esm/TrophyIcon.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nvar _s = __webpack_require__.$Refresh$.signature();\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n\n\n\nvar TodaySettingsDropdown = function TodaySettingsDropdown(_ref) {\n _s();\n var isOpen = _ref.isOpen,\n onClose = _ref.onClose,\n settings = _ref.settings,\n onSettingsChange = _ref.onSettingsChange;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(settings),\n _useState2 = _slicedToArray(_useState, 2),\n localSettings = _useState2[0],\n setLocalSettings = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState4 = _slicedToArray(_useState3, 2),\n isSaving = _useState4[0],\n setIsSaving = _useState4[1];\n var dropdownRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setLocalSettings(settings);\n }, [settings]);\n\n // Close dropdown when clicking outside\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var handleClickOutside = function handleClickOutside(event) {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {\n onClose();\n }\n };\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n return function () {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen, onClose]);\n var handleToggle = function handleToggle(key) {\n var newSettings = _objectSpread(_objectSpread({}, localSettings), {}, _defineProperty({}, key, !localSettings[key]));\n setLocalSettings(newSettings);\n\n // Auto-save on change\n saveSettings(newSettings);\n };\n var saveSettings = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(settingsToSave) {\n var response, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n setIsSaving(true);\n _context.p = 1;\n _context.n = 2;\n return fetch('/api/profile/today-settings', {\n method: 'PUT',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(settingsToSave)\n });\n case 2:\n response = _context.v;\n if (response.ok) {\n onSettingsChange(settingsToSave);\n } else {\n console.error('Failed to save settings');\n }\n _context.n = 4;\n break;\n case 3:\n _context.p = 3;\n _t = _context.v;\n console.error('Error saving settings:', _t);\n case 4:\n _context.p = 4;\n setIsSaving(false);\n return _context.f(4);\n case 5:\n return _context.a(2);\n }\n }, _callee, null, [[1, 3, 4, 5]]);\n }));\n return function saveSettings(_x) {\n return _ref2.apply(this, arguments);\n };\n }();\n if (!isOpen) return null;\n var settingsOptions = [{\n key: 'showDailyQuote',\n label: t('settings.showDailyQuote', 'Show Daily Quote'),\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n }, {\n key: 'showMetrics',\n label: t('settings.showMetrics', 'Show Metrics'),\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n }, {\n key: 'showProductivity',\n label: t('settings.showProductivity', 'Show Productivity Insights'),\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n }, {\n key: 'showIntelligence',\n label: t('settings.showIntelligence', 'Show Intelligence Suggestions'),\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_5__[\"default\"]\n }, {\n key: 'showDueToday',\n label: t('settings.showDueToday', 'Show Due Today Tasks'),\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_6__[\"default\"]\n }, {\n key: 'showCompleted',\n label: t('settings.showCompleted', 'Show Completed Tasks'),\n icon: _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_7__[\"default\"]\n }];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n ref: dropdownRef,\n className: \"absolute right-0 top-full mt-2 w-72 bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 z-50\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-sm font-medium text-gray-900 dark:text-gray-100 mb-3\"\n }, t('settings.todayPageSettings', 'Today Page Settings')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"space-y-3\"\n }, settingsOptions.map(function (option) {\n var IconComponent = option.icon;\n var isDisabled = option.disabled || isSaving;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: option.key,\n className: \"flex items-center justify-between \".concat(isDisabled ? 'opacity-60' : '')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex items-center flex-1\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(IconComponent, {\n className: \"h-4 w-4 text-gray-500 dark:text-gray-400 mr-3\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n className: \"text-sm text-gray-700 dark:text-gray-300 \".concat(!isDisabled ? 'cursor-pointer' : 'cursor-not-allowed', \" flex-1\")\n }, option.label)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: function onClick() {\n return !isDisabled && handleToggle(option.key);\n },\n disabled: isDisabled,\n className: \"relative inline-flex h-5 w-9 items-center rounded-full transition-colors disabled:opacity-50 disabled:cursor-not-allowed \".concat(localSettings[option.key] ? 'bg-blue-600' : 'bg-gray-200 dark:bg-gray-700')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"inline-block h-3 w-3 transform rounded-full bg-white transition-transform \".concat(localSettings[option.key] ? 'translate-x-5' : 'translate-x-1')\n })));\n })), isSaving && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"mt-3 text-xs text-gray-500 dark:text-gray-400\"\n }, t('common.saving', 'Saving...'))));\n};\n_s(TodaySettingsDropdown, \"dohTXgqX3dM1PMqkzEEw9xXkfY4=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = TodaySettingsDropdown;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TodaySettingsDropdown);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"TodaySettingsDropdown\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/TodaySettingsDropdown.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/components/Task/WeeklyCompletionChart.tsx":
+/*!************************************************************!*\
+ !*** ./frontend/components/Task/WeeklyCompletionChart.tsx ***!
+ \************************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var recharts__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! recharts */ \"./node_modules/recharts/es6/component/ResponsiveContainer.js\");\n/* harmony import */ var recharts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! recharts */ \"./node_modules/recharts/es6/chart/BarChart.js\");\n/* harmony import */ var recharts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! recharts */ \"./node_modules/recharts/es6/cartesian/XAxis.js\");\n/* harmony import */ var recharts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! recharts */ \"./node_modules/recharts/es6/cartesian/YAxis.js\");\n/* harmony import */ var recharts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! recharts */ \"./node_modules/recharts/es6/component/Tooltip.js\");\n/* harmony import */ var recharts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! recharts */ \"./node_modules/recharts/es6/cartesian/Bar.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nvar _s = __webpack_require__.$Refresh$.signature();\n\n\n\nvar WeeklyCompletionChart = function WeeklyCompletionChart(_ref) {\n _s();\n var data = _ref.data;\n var _useTranslation = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(),\n t = _useTranslation.t;\n var CustomTooltip = function CustomTooltip(_ref2) {\n var active = _ref2.active,\n payload = _ref2.payload,\n label = _ref2.label;\n if (active && payload && payload.length) {\n var _data = payload[0].payload;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-white dark:bg-gray-800 p-3 border border-gray-200 dark:border-gray-600 rounded-lg shadow-lg\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-sm font-medium text-gray-900 dark:text-gray-100\"\n }, _data.dayName), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"text-sm text-gray-600 dark:text-gray-400\"\n }, _data.count, \" \", _data.count === 1 ? t('tasks.taskCompleted') : t('tasks.tasksCompleted')));\n }\n return null;\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"bg-white dark:bg-gray-900 rounded-lg shadow p-4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"text-sm font-medium mb-2 text-gray-700 dark:text-gray-300\"\n }, t('tasks.weeklyCompletions')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"h-40\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(recharts__WEBPACK_IMPORTED_MODULE_2__.ResponsiveContainer, {\n width: \"100%\",\n height: \"100%\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(recharts__WEBPACK_IMPORTED_MODULE_3__.BarChart, {\n data: data,\n margin: {\n top: 5,\n right: 5,\n left: 5,\n bottom: 5\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(recharts__WEBPACK_IMPORTED_MODULE_4__.XAxis, {\n dataKey: \"dayName\",\n axisLine: false,\n tickLine: false,\n tick: {\n fontSize: 10,\n fill: 'currentColor',\n className: 'text-gray-600 dark:text-gray-400'\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(recharts__WEBPACK_IMPORTED_MODULE_5__.YAxis, {\n axisLine: false,\n tickLine: false,\n tick: {\n fontSize: 10,\n fill: 'currentColor',\n className: 'text-gray-600 dark:text-gray-400'\n },\n allowDecimals: false,\n width: 25,\n domain: [0, 'dataMax']\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(recharts__WEBPACK_IMPORTED_MODULE_6__.Tooltip, {\n content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(CustomTooltip, null)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(recharts__WEBPACK_IMPORTED_MODULE_7__.Bar, {\n dataKey: \"count\",\n fill: \"#3b82f6\",\n radius: [2, 2, 0, 0],\n minPointSize: 2\n })))));\n};\n_s(WeeklyCompletionChart, \"zlIdU9EjM2llFt74AbE2KsUJXyM=\", false, function () {\n return [react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation];\n});\n_c = WeeklyCompletionChart;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (WeeklyCompletionChart);\nvar _c;\n__webpack_require__.$Refresh$.register(_c, \"WeeklyCompletionChart\");\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/components/Task/WeeklyCompletionChart.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/i18n.ts":
+/*!**************************!*\
+ !*** ./frontend/i18n.ts ***!
+ \**************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var i18next__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! i18next */ \"./node_modules/i18next/dist/esm/i18next.js\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* harmony import */ var i18next_http_backend__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! i18next-http-backend */ \"./node_modules/i18next-http-backend/esm/index.js\");\n/* harmony import */ var i18next_browser_languagedetector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! i18next-browser-languagedetector */ \"./node_modules/i18next-browser-languagedetector/dist/esm/i18nextBrowserLanguageDetector.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\n\n\n\n\nvar isDevelopment = \"development\" === 'development';\nvar fallbackResources = {\n en: {\n translation: {\n common: {\n loading: 'Loading...',\n appLoading: 'Loading application... Please wait.',\n error: 'Error'\n },\n auth: {\n login: 'Login',\n register: 'Register'\n },\n errors: {\n somethingWentWrong: 'Something went wrong, please try again'\n }\n }\n }\n};\nvar devResources = isDevelopment ? {\n en: {\n translation: fallbackResources.en.translation\n }\n} : undefined;\nvar i18nInstance = i18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(i18next_http_backend__WEBPACK_IMPORTED_MODULE_2__[\"default\"]).use(i18next_browser_languagedetector__WEBPACK_IMPORTED_MODULE_3__[\"default\"]).use(react_i18next__WEBPACK_IMPORTED_MODULE_1__.initReactI18next);\ni18nInstance.init({\n fallbackLng: 'en',\n debug: isDevelopment,\n load: 'languageOnly',\n supportedLngs: ['en', 'es', 'el', 'jp', 'ua', 'de'],\n nonExplicitSupportedLngs: true,\n resources: devResources,\n detection: {\n order: ['querystring', 'cookie', 'localStorage', 'navigator'],\n lookupQuerystring: 'lng',\n lookupCookie: 'i18next',\n lookupLocalStorage: 'i18nextLng',\n caches: ['localStorage', 'cookie']\n },\n interpolation: {\n escapeValue: false\n },\n defaultNS: 'translation',\n ns: ['translation'],\n backend: {\n loadPath: '/locales/{{lng}}/{{ns}}.json',\n queryStringParams: {\n v: '1'\n },\n requestOptions: {\n cache: 'default',\n credentials: 'same-origin',\n mode: 'cors'\n }\n }\n}).then(function () {\n var loadPath = isDevelopment ? \"./locales/\".concat(i18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].language, \"/translation.json\") : \"/locales/\".concat(i18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].language, \"/translation.json\");\n fetch(loadPath).then(function (response) {\n if (!response.ok) {\n if (isDevelopment) {\n return fetch(\"/locales/\".concat(i18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].language, \"/translation.json\"));\n }\n throw new Error(\"Failed to fetch translation: \".concat(response.status));\n }\n return response.json();\n }).then(function (data) {\n i18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addResourceBundle(i18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].language, 'translation', data, true, true);\n })[\"catch\"](function () {\n if (isDevelopment) {\n try {\n setTimeout(function () {\n fetch(\"/locales/\".concat(i18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].language, \"/translation.json\"), {\n headers: {\n 'Accept': 'application/json'\n },\n mode: 'cors'\n }).then(function (res) {\n return res.json();\n }).then(function (data) {\n i18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addResourceBundle(i18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].language, 'translation', data, true, true);\n })[\"catch\"](function () {});\n }, 1000);\n } catch (e) {}\n }\n });\n});\ni18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].on('initialized', function () {});\ni18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].on('loaded', function () {});\ni18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].on('failedLoading', function () {});\ni18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].on('missingKey', function () {});\nvar dispatchLanguageChangeEvent = function dispatchLanguageChangeEvent(lng) {\n var event = new CustomEvent('app-language-changed', {\n detail: {\n language: lng\n }\n });\n window.dispatchEvent(event);\n};\ni18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].on('languageChanged', function (lng) {\n localStorage.setItem('i18nextLng', lng);\n document.documentElement.lang = lng;\n var handleTranslationsLoaded = function handleTranslationsLoaded() {\n dispatchLanguageChangeEvent(lng);\n if (i18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].services && i18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].services.resourceStore) {\n var currentNS = i18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].options.defaultNS || 'translation';\n i18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].reloadResources(lng, currentNS);\n }\n };\n if (!i18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].hasResourceBundle(lng, 'translation')) {\n var loadPath = isDevelopment ? \"./locales/\".concat(lng, \"/translation.json\") : \"/locales/\".concat(lng, \"/translation.json\");\n fetch(loadPath).then(function (response) {\n if (!response.ok) {\n return fetch(\"/locales/\".concat(lng, \"/translation.json\"));\n }\n return response;\n }).then(function (response) {\n return response.json();\n }).then(function (data) {\n if (data) {\n i18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addResourceBundle(lng, 'translation', data, true, true);\n handleTranslationsLoaded();\n }\n })[\"catch\"](function () {\n handleTranslationsLoaded();\n });\n } else {\n handleTranslationsLoaded();\n }\n});\nwindow.checkTranslation = function (key) {\n try {\n var translation = i18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].t(key);\n return translation;\n } catch (_unused) {\n return null;\n }\n};\nwindow.forceLanguageReload = function (lng) {\n var targetLng = lng || i18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].language;\n i18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].reloadResources(targetLng, 'translation').then(function () {\n dispatchLanguageChangeEvent(targetLng);\n if (i18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].services && i18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].services.resourceStore) {\n Object.values(i18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].services.resourceStore.data).forEach(function (lang) {\n if (lang.translation && _typeof(lang.translation) === 'object' && lang.translation !== null) {\n var temp = _objectSpread({}, lang.translation);\n lang.translation = temp;\n }\n });\n }\n if (lng) {\n setTimeout(function () {\n i18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"].changeLanguage(targetLng);\n }, 50);\n }\n })[\"catch\"](function () {});\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (i18next__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/i18n.ts?");
+
+/***/ }),
+
+/***/ "./frontend/index.tsx":
+/*!****************************!*\
+ !*** ./frontend/index.tsx ***!
+ \****************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom/client */ \"./node_modules/react-dom/client.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/dist/index.js\");\n/* harmony import */ var _App__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./App */ \"./frontend/App.tsx\");\n/* harmony import */ var _components_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/Shared/ToastContext */ \"./frontend/components/Shared/ToastContext.tsx\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./i18n */ \"./frontend/i18n.ts\");\n/* harmony import */ var _styles_markdown_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./styles/markdown.css */ \"./frontend/styles/markdown.css\");\n/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-i18next */ \"./node_modules/react-i18next/dist/es/index.js\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\n// Add type declaration for module.hot\n\n\n\n\n\n\n // Import i18n config to initialize it\n // Import markdown styles\n\n // Import the i18n instance with its configuration\n\nvar storedPreference = localStorage.getItem(\"isDarkMode\");\nvar prefersDarkMode = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\nvar isDarkMode = storedPreference ? storedPreference === \"true\" : prefersDarkMode;\nif (isDarkMode) {\n document.documentElement.classList.add(\"dark\");\n} else {\n document.documentElement.classList.remove(\"dark\");\n}\nvar container = document.getElementById(\"root\");\n\n// Store the root outside the if block so it can be accessed by the HMR code\nvar root;\nif (container) {\n root = (0,react_dom_client__WEBPACK_IMPORTED_MODULE_1__.createRoot)(container);\n root.render(/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_i18next__WEBPACK_IMPORTED_MODULE_6__.I18nextProvider, {\n i18n: _i18n__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_7__.BrowserRouter, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_3__.ToastProvider, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_App__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null)))));\n}\n\n// Hot Module Replacement (HMR) - Remove this snippet to remove HMR.\n// Learn more: https://www.webpackjs.com/concepts/hot-module-replacement/\nif (true) {\n module.hot.accept(/*! ./App */ \"./frontend/App.tsx\", __WEBPACK_OUTDATED_DEPENDENCIES__ => { /* harmony import */ _App__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./App */ \"./frontend/App.tsx\");\n(function () {\n // New version of App component imported\n if (root) {\n root.render(/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_i18next__WEBPACK_IMPORTED_MODULE_6__.I18nextProvider, {\n i18n: _i18n__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_7__.BrowserRouter, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Shared_ToastContext__WEBPACK_IMPORTED_MODULE_3__.ToastProvider, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_App__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null)))));\n }\n })(__WEBPACK_OUTDATED_DEPENDENCIES__); });\n}\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/index.tsx?");
+
+/***/ }),
+
+/***/ "./frontend/store/useStore.ts":
+/*!************************************!*\
+ !*** ./frontend/store/useStore.ts ***!
+ \************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useStore: () => (/* binding */ useStore)\n/* harmony export */ });\n/* harmony import */ var zustand__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! zustand */ \"./node_modules/zustand/esm/react.mjs\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\nvar useStore = (0,zustand__WEBPACK_IMPORTED_MODULE_0__.create)(function (set) {\n return {\n notesStore: {\n notes: [],\n isLoading: false,\n isError: false,\n setNotes: function setNotes(notes) {\n return set(function (state) {\n return {\n notesStore: _objectSpread(_objectSpread({}, state.notesStore), {}, {\n notes: notes\n })\n };\n });\n },\n setLoading: function setLoading(isLoading) {\n return set(function (state) {\n return {\n notesStore: _objectSpread(_objectSpread({}, state.notesStore), {}, {\n isLoading: isLoading\n })\n };\n });\n },\n setError: function setError(isError) {\n return set(function (state) {\n return {\n notesStore: _objectSpread(_objectSpread({}, state.notesStore), {}, {\n isError: isError\n })\n };\n });\n }\n },\n areasStore: {\n areas: [],\n isLoading: false,\n isError: false,\n setAreas: function setAreas(areas) {\n return set(function (state) {\n return {\n areasStore: _objectSpread(_objectSpread({}, state.areasStore), {}, {\n areas: areas\n })\n };\n });\n },\n setLoading: function setLoading(isLoading) {\n return set(function (state) {\n return {\n areasStore: _objectSpread(_objectSpread({}, state.areasStore), {}, {\n isLoading: isLoading\n })\n };\n });\n },\n setError: function setError(isError) {\n return set(function (state) {\n return {\n areasStore: _objectSpread(_objectSpread({}, state.areasStore), {}, {\n isError: isError\n })\n };\n });\n }\n },\n projectsStore: {\n projects: [],\n isLoading: false,\n isError: false,\n setProjects: function setProjects(projects) {\n return set(function (state) {\n return {\n projectsStore: _objectSpread(_objectSpread({}, state.projectsStore), {}, {\n projects: projects\n })\n };\n });\n },\n setLoading: function setLoading(isLoading) {\n return set(function (state) {\n return {\n projectsStore: _objectSpread(_objectSpread({}, state.projectsStore), {}, {\n isLoading: isLoading\n })\n };\n });\n },\n setError: function setError(isError) {\n return set(function (state) {\n return {\n projectsStore: _objectSpread(_objectSpread({}, state.projectsStore), {}, {\n isError: isError\n })\n };\n });\n }\n },\n tagsStore: {\n tags: [],\n isLoading: false,\n isError: false,\n setTags: function setTags(tags) {\n return set(function (state) {\n return {\n tagsStore: _objectSpread(_objectSpread({}, state.tagsStore), {}, {\n tags: tags\n })\n };\n });\n },\n setLoading: function setLoading(isLoading) {\n return set(function (state) {\n return {\n tagsStore: _objectSpread(_objectSpread({}, state.tagsStore), {}, {\n isLoading: isLoading\n })\n };\n });\n },\n setError: function setError(isError) {\n return set(function (state) {\n return {\n tagsStore: _objectSpread(_objectSpread({}, state.tagsStore), {}, {\n isError: isError\n })\n };\n });\n },\n loadTags: function () {\n var _loadTags = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var _require, fetchTags, tags, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n _require = __webpack_require__(/*! ../utils/tagsService */ \"./frontend/utils/tagsService.ts\"), fetchTags = _require.fetchTags;\n set(function (state) {\n return {\n tagsStore: _objectSpread(_objectSpread({}, state.tagsStore), {}, {\n isLoading: true,\n isError: false\n })\n };\n });\n _context.p = 1;\n _context.n = 2;\n return fetchTags();\n case 2:\n tags = _context.v;\n set(function (state) {\n return {\n tagsStore: _objectSpread(_objectSpread({}, state.tagsStore), {}, {\n tags: tags,\n isLoading: false\n })\n };\n });\n _context.n = 4;\n break;\n case 3:\n _context.p = 3;\n _t = _context.v;\n console.error(\"loadTags: Failed to load tags:\", _t);\n set(function (state) {\n return {\n tagsStore: _objectSpread(_objectSpread({}, state.tagsStore), {}, {\n isError: true,\n isLoading: false\n })\n };\n });\n case 4:\n return _context.a(2);\n }\n }, _callee, null, [[1, 3]]);\n }));\n function loadTags() {\n return _loadTags.apply(this, arguments);\n }\n return loadTags;\n }()\n },\n tasksStore: {\n tasks: [],\n isLoading: false,\n isError: false,\n setTasks: function setTasks(tasks) {\n return set(function (state) {\n return {\n tasksStore: _objectSpread(_objectSpread({}, state.tasksStore), {}, {\n tasks: tasks\n })\n };\n });\n },\n setLoading: function setLoading(isLoading) {\n return set(function (state) {\n return {\n tasksStore: _objectSpread(_objectSpread({}, state.tasksStore), {}, {\n isLoading: isLoading\n })\n };\n });\n },\n setError: function setError(isError) {\n return set(function (state) {\n return {\n tasksStore: _objectSpread(_objectSpread({}, state.tasksStore), {}, {\n isError: isError\n })\n };\n });\n }\n },\n inboxStore: {\n inboxItems: [],\n isLoading: false,\n isError: false,\n setInboxItems: function setInboxItems(inboxItems) {\n return set(function (state) {\n return {\n inboxStore: _objectSpread(_objectSpread({}, state.inboxStore), {}, {\n inboxItems: inboxItems\n })\n };\n });\n },\n addInboxItem: function addInboxItem(inboxItem) {\n return set(function (state) {\n return {\n inboxStore: _objectSpread(_objectSpread({}, state.inboxStore), {}, {\n inboxItems: [].concat(_toConsumableArray(state.inboxStore.inboxItems), [inboxItem])\n })\n };\n });\n },\n updateInboxItem: function updateInboxItem(inboxItem) {\n return set(function (state) {\n return {\n inboxStore: _objectSpread(_objectSpread({}, state.inboxStore), {}, {\n inboxItems: state.inboxStore.inboxItems.map(function (item) {\n return item.id === inboxItem.id ? inboxItem : item;\n })\n })\n };\n });\n },\n removeInboxItem: function removeInboxItem(id) {\n return set(function (state) {\n return {\n inboxStore: _objectSpread(_objectSpread({}, state.inboxStore), {}, {\n inboxItems: state.inboxStore.inboxItems.filter(function (item) {\n return item.id !== id;\n })\n })\n };\n });\n },\n setLoading: function setLoading(isLoading) {\n return set(function (state) {\n return {\n inboxStore: _objectSpread(_objectSpread({}, state.inboxStore), {}, {\n isLoading: isLoading\n })\n };\n });\n },\n setError: function setError(isError) {\n return set(function (state) {\n return {\n inboxStore: _objectSpread(_objectSpread({}, state.inboxStore), {}, {\n isError: isError\n })\n };\n });\n }\n }\n };\n});\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/store/useStore.ts?");
+
+/***/ }),
+
+/***/ "./frontend/styles/markdown.css":
+/*!**************************************!*\
+ !*** ./frontend/styles/markdown.css ***!
+ \**************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ \"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ \"./node_modules/style-loader/dist/runtime/styleDomAPI.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertBySelector.js */ \"./node_modules/style-loader/dist/runtime/insertBySelector.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ \"./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ \"./node_modules/style-loader/dist/runtime/insertStyleElement.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ \"./node_modules/style-loader/dist/runtime/styleTagTransform.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_markdown_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!../../node_modules/postcss-loader/dist/cjs.js!./markdown.css */ \"./node_modules/css-loader/dist/cjs.js!./node_modules/postcss-loader/dist/cjs.js!./frontend/styles/markdown.css\");\n\n \n \n \n \n \n \n \n \n \n\nvar options = {};\n\noptions.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());\noptions.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());\noptions.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, \"head\");\noptions.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());\noptions.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());\n\nvar update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_markdown_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"], options);\n\n\nif (true) {\n if (!_node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_markdown_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals || module.hot.invalidate) {\n var isEqualLocals = function isEqualLocals(a, b, isNamedExport) {\n if (!a && b || a && !b) {\n return false;\n }\n var p;\n for (p in a) {\n if (isNamedExport && p === \"default\") {\n // eslint-disable-next-line no-continue\n continue;\n }\n if (a[p] !== b[p]) {\n return false;\n }\n }\n for (p in b) {\n if (isNamedExport && p === \"default\") {\n // eslint-disable-next-line no-continue\n continue;\n }\n if (!a[p]) {\n return false;\n }\n }\n return true;\n};\n var isNamedExport = !_node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_markdown_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals;\n var oldLocals = isNamedExport ? _node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_markdown_css__WEBPACK_IMPORTED_MODULE_6__ : _node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_markdown_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals;\n\n module.hot.accept(\n /*! !!../../node_modules/css-loader/dist/cjs.js!../../node_modules/postcss-loader/dist/cjs.js!./markdown.css */ \"./node_modules/css-loader/dist/cjs.js!./node_modules/postcss-loader/dist/cjs.js!./frontend/styles/markdown.css\",\n __WEBPACK_OUTDATED_DEPENDENCIES__ => { /* harmony import */ _node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_markdown_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!../../node_modules/postcss-loader/dist/cjs.js!./markdown.css */ \"./node_modules/css-loader/dist/cjs.js!./node_modules/postcss-loader/dist/cjs.js!./frontend/styles/markdown.css\");\n(function () {\n if (!isEqualLocals(oldLocals, isNamedExport ? _node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_markdown_css__WEBPACK_IMPORTED_MODULE_6__ : _node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_markdown_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals, isNamedExport)) {\n module.hot.invalidate();\n\n return;\n }\n\n oldLocals = isNamedExport ? _node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_markdown_css__WEBPACK_IMPORTED_MODULE_6__ : _node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_markdown_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals;\n\n update(_node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_markdown_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"]);\n })(__WEBPACK_OUTDATED_DEPENDENCIES__); }\n )\n }\n\n module.hot.dispose(function() {\n update();\n });\n}\n\n\n\n /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_markdown_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"] && _node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_markdown_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals ? _node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_markdown_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals : undefined);\n\n\n//# sourceURL=webpack://tududi/./frontend/styles/markdown.css?");
+
+/***/ }),
+
+/***/ "./frontend/styles/tailwind.css":
+/*!**************************************!*\
+ !*** ./frontend/styles/tailwind.css ***!
+ \**************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ \"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ \"./node_modules/style-loader/dist/runtime/styleDomAPI.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertBySelector.js */ \"./node_modules/style-loader/dist/runtime/insertBySelector.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ \"./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ \"./node_modules/style-loader/dist/runtime/insertStyleElement.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ \"./node_modules/style-loader/dist/runtime/styleTagTransform.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_tailwind_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!../../node_modules/postcss-loader/dist/cjs.js!./tailwind.css */ \"./node_modules/css-loader/dist/cjs.js!./node_modules/postcss-loader/dist/cjs.js!./frontend/styles/tailwind.css\");\n\n \n \n \n \n \n \n \n \n \n\nvar options = {};\n\noptions.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());\noptions.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());\noptions.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, \"head\");\noptions.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());\noptions.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());\n\nvar update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_tailwind_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"], options);\n\n\nif (true) {\n if (!_node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_tailwind_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals || module.hot.invalidate) {\n var isEqualLocals = function isEqualLocals(a, b, isNamedExport) {\n if (!a && b || a && !b) {\n return false;\n }\n var p;\n for (p in a) {\n if (isNamedExport && p === \"default\") {\n // eslint-disable-next-line no-continue\n continue;\n }\n if (a[p] !== b[p]) {\n return false;\n }\n }\n for (p in b) {\n if (isNamedExport && p === \"default\") {\n // eslint-disable-next-line no-continue\n continue;\n }\n if (!a[p]) {\n return false;\n }\n }\n return true;\n};\n var isNamedExport = !_node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_tailwind_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals;\n var oldLocals = isNamedExport ? _node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_tailwind_css__WEBPACK_IMPORTED_MODULE_6__ : _node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_tailwind_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals;\n\n module.hot.accept(\n /*! !!../../node_modules/css-loader/dist/cjs.js!../../node_modules/postcss-loader/dist/cjs.js!./tailwind.css */ \"./node_modules/css-loader/dist/cjs.js!./node_modules/postcss-loader/dist/cjs.js!./frontend/styles/tailwind.css\",\n __WEBPACK_OUTDATED_DEPENDENCIES__ => { /* harmony import */ _node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_tailwind_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!../../node_modules/postcss-loader/dist/cjs.js!./tailwind.css */ \"./node_modules/css-loader/dist/cjs.js!./node_modules/postcss-loader/dist/cjs.js!./frontend/styles/tailwind.css\");\n(function () {\n if (!isEqualLocals(oldLocals, isNamedExport ? _node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_tailwind_css__WEBPACK_IMPORTED_MODULE_6__ : _node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_tailwind_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals, isNamedExport)) {\n module.hot.invalidate();\n\n return;\n }\n\n oldLocals = isNamedExport ? _node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_tailwind_css__WEBPACK_IMPORTED_MODULE_6__ : _node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_tailwind_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals;\n\n update(_node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_tailwind_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"]);\n })(__WEBPACK_OUTDATED_DEPENDENCIES__); }\n )\n }\n\n module.hot.dispose(function() {\n update();\n });\n}\n\n\n\n /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_tailwind_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"] && _node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_tailwind_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals ? _node_modules_css_loader_dist_cjs_js_node_modules_postcss_loader_dist_cjs_js_tailwind_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals : undefined);\n\n\n//# sourceURL=webpack://tududi/./frontend/styles/tailwind.css?");
+
+/***/ }),
+
+/***/ "./frontend/utils/areasService.ts":
+/*!****************************************!*\
+ !*** ./frontend/utils/areasService.ts ***!
+ \****************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createArea: () => (/* binding */ createArea),\n/* harmony export */ deleteArea: () => (/* binding */ deleteArea),\n/* harmony export */ fetchAreas: () => (/* binding */ fetchAreas),\n/* harmony export */ updateArea: () => (/* binding */ updateArea)\n/* harmony export */ });\n/* harmony import */ var _authUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./authUtils */ \"./frontend/utils/authUtils.ts\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\n\nvar fetchAreas = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var response;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n _context.n = 1;\n return fetch(\"/api/areas?active=true\", {\n credentials: 'include',\n headers: {\n 'Accept': 'application/json'\n }\n });\n case 1:\n response = _context.v;\n _context.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to fetch areas.');\n case 2:\n _context.n = 3;\n return response.json();\n case 3:\n return _context.a(2, _context.v);\n }\n }, _callee);\n }));\n return function fetchAreas() {\n return _ref.apply(this, arguments);\n };\n}();\nvar createArea = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(areaData) {\n var response;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n _context2.n = 1;\n return fetch('/api/areas', {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n },\n body: JSON.stringify(areaData)\n });\n case 1:\n response = _context2.v;\n _context2.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to create area.');\n case 2:\n _context2.n = 3;\n return response.json();\n case 3:\n return _context2.a(2, _context2.v);\n }\n }, _callee2);\n }));\n return function createArea(_x) {\n return _ref2.apply(this, arguments);\n };\n}();\nvar updateArea = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(areaId, areaData) {\n var response;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n _context3.n = 1;\n return fetch(\"/api/areas/\".concat(areaId), {\n method: 'PATCH',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n },\n body: JSON.stringify(areaData)\n });\n case 1:\n response = _context3.v;\n _context3.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to update area.');\n case 2:\n _context3.n = 3;\n return response.json();\n case 3:\n return _context3.a(2, _context3.v);\n }\n }, _callee3);\n }));\n return function updateArea(_x2, _x3) {\n return _ref3.apply(this, arguments);\n };\n}();\nvar deleteArea = /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(areaId) {\n var response;\n return _regenerator().w(function (_context4) {\n while (1) switch (_context4.n) {\n case 0:\n _context4.n = 1;\n return fetch(\"/api/areas/\".concat(areaId), {\n method: 'DELETE',\n credentials: 'include',\n headers: {\n 'Accept': 'application/json'\n }\n });\n case 1:\n response = _context4.v;\n _context4.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to delete area.');\n case 2:\n return _context4.a(2);\n }\n }, _callee4);\n }));\n return function deleteArea(_x4) {\n return _ref4.apply(this, arguments);\n };\n}();\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/utils/areasService.ts?");
+
+/***/ }),
+
+/***/ "./frontend/utils/authUtils.ts":
+/*!*************************************!*\
+ !*** ./frontend/utils/authUtils.ts ***!
+ \*************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getDefaultHeaders: () => (/* binding */ getDefaultHeaders),\n/* harmony export */ getPostHeaders: () => (/* binding */ getPostHeaders),\n/* harmony export */ handleAuthResponse: () => (/* binding */ handleAuthResponse),\n/* harmony export */ isAuthError: () => (/* binding */ isAuthError)\n/* harmony export */ });\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nvar getDefaultHeaders = function getDefaultHeaders() {\n return {\n 'Accept': 'application/json',\n 'X-Requested-With': 'XMLHttpRequest',\n 'Origin': window.location.origin\n };\n};\nvar getPostHeaders = function getPostHeaders() {\n return _objectSpread(_objectSpread({}, getDefaultHeaders()), {}, {\n 'Content-Type': 'application/json'\n });\n};\nvar isRedirecting = false;\nvar handleAuthResponse = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(response, errorMessage) {\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n if (response.ok) {\n _context.n = 2;\n break;\n }\n if (!(response.status === 401)) {\n _context.n = 1;\n break;\n }\n if (window.location.pathname !== '/login' && !isRedirecting) {\n isRedirecting = true;\n setTimeout(function () {\n window.location.href = '/login';\n }, 100);\n }\n throw new Error('Authentication required');\n case 1:\n throw new Error(errorMessage);\n case 2:\n return _context.a(2, response);\n }\n }, _callee);\n }));\n return function handleAuthResponse(_x, _x2) {\n return _ref.apply(this, arguments);\n };\n}();\nvar isAuthError = function isAuthError(error) {\n return (error === null || error === void 0 ? void 0 : error.message) && error.message.includes('Authentication required');\n};\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/utils/authUtils.ts?");
+
+/***/ }),
+
+/***/ "./frontend/utils/inboxService.ts":
+/*!****************************************!*\
+ !*** ./frontend/utils/inboxService.ts ***!
+ \****************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createInboxItem: () => (/* binding */ createInboxItem),\n/* harmony export */ createInboxItemWithStore: () => (/* binding */ createInboxItemWithStore),\n/* harmony export */ deleteInboxItem: () => (/* binding */ deleteInboxItem),\n/* harmony export */ deleteInboxItemWithStore: () => (/* binding */ deleteInboxItemWithStore),\n/* harmony export */ fetchInboxItems: () => (/* binding */ fetchInboxItems),\n/* harmony export */ loadInboxItemsToStore: () => (/* binding */ loadInboxItemsToStore),\n/* harmony export */ processInboxItem: () => (/* binding */ processInboxItem),\n/* harmony export */ processInboxItemWithStore: () => (/* binding */ processInboxItemWithStore),\n/* harmony export */ updateInboxItem: () => (/* binding */ updateInboxItem),\n/* harmony export */ updateInboxItemWithStore: () => (/* binding */ updateInboxItemWithStore)\n/* harmony export */ });\n/* harmony import */ var _store_useStore__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../store/useStore */ \"./frontend/store/useStore.ts\");\n/* harmony import */ var _authUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./authUtils */ \"./frontend/utils/authUtils.ts\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\n\n\n\n// API functions\nvar fetchInboxItems = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var response, result;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n _context.n = 1;\n return fetch('/api/inbox', {\n credentials: 'include',\n headers: {\n 'Accept': 'application/json'\n }\n });\n case 1:\n response = _context.v;\n _context.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_1__.handleAuthResponse)(response, 'Failed to fetch inbox items.');\n case 2:\n _context.n = 3;\n return response.json();\n case 3:\n result = _context.v;\n if (Array.isArray(result)) {\n _context.n = 4;\n break;\n }\n throw new Error('Resulting inbox items are not an array.');\n case 4:\n return _context.a(2, result);\n }\n }, _callee);\n }));\n return function fetchInboxItems() {\n return _ref.apply(this, arguments);\n };\n}();\nvar createInboxItem = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(content) {\n var source,\n response,\n _args2 = arguments;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n source = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : 'tududi';\n _context2.n = 1;\n return fetch('/api/inbox', {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n },\n body: JSON.stringify({\n content: content,\n source: source\n })\n });\n case 1:\n response = _context2.v;\n _context2.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_1__.handleAuthResponse)(response, 'Failed to create inbox item.');\n case 2:\n _context2.n = 3;\n return response.json();\n case 3:\n return _context2.a(2, _context2.v);\n }\n }, _callee2);\n }));\n return function createInboxItem(_x) {\n return _ref2.apply(this, arguments);\n };\n}();\nvar updateInboxItem = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(itemId, content) {\n var response;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n _context3.n = 1;\n return fetch(\"/api/inbox/\".concat(itemId), {\n method: 'PATCH',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n },\n body: JSON.stringify({\n content: content\n })\n });\n case 1:\n response = _context3.v;\n _context3.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_1__.handleAuthResponse)(response, 'Failed to update inbox item.');\n case 2:\n _context3.n = 3;\n return response.json();\n case 3:\n return _context3.a(2, _context3.v);\n }\n }, _callee3);\n }));\n return function updateInboxItem(_x2, _x3) {\n return _ref3.apply(this, arguments);\n };\n}();\nvar processInboxItem = /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(itemId) {\n var response;\n return _regenerator().w(function (_context4) {\n while (1) switch (_context4.n) {\n case 0:\n _context4.n = 1;\n return fetch(\"/api/inbox/\".concat(itemId, \"/process\"), {\n method: 'PATCH',\n credentials: 'include',\n headers: {\n 'Accept': 'application/json'\n }\n });\n case 1:\n response = _context4.v;\n _context4.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_1__.handleAuthResponse)(response, 'Failed to process inbox item.');\n case 2:\n _context4.n = 3;\n return response.json();\n case 3:\n return _context4.a(2, _context4.v);\n }\n }, _callee4);\n }));\n return function processInboxItem(_x4) {\n return _ref4.apply(this, arguments);\n };\n}();\nvar deleteInboxItem = /*#__PURE__*/function () {\n var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5(itemId) {\n var response;\n return _regenerator().w(function (_context5) {\n while (1) switch (_context5.n) {\n case 0:\n _context5.n = 1;\n return fetch(\"/api/inbox/\".concat(itemId), {\n method: 'DELETE',\n credentials: 'include',\n headers: {\n 'Accept': 'application/json'\n }\n });\n case 1:\n response = _context5.v;\n _context5.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_1__.handleAuthResponse)(response, 'Failed to delete inbox item.');\n case 2:\n return _context5.a(2);\n }\n }, _callee5);\n }));\n return function deleteInboxItem(_x5) {\n return _ref5.apply(this, arguments);\n };\n}();\n\n// Track last check time to detect new items\nvar lastCheckTimestamp = Date.now();\n\n// Store-aware functions\nvar loadInboxItemsToStore = /*#__PURE__*/function () {\n var _ref6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6() {\n var inboxStore, items, currentItemIds, currentTime, newTelegramItems, notificationData, _t;\n return _regenerator().w(function (_context6) {\n while (1) switch (_context6.n) {\n case 0:\n inboxStore = _store_useStore__WEBPACK_IMPORTED_MODULE_0__.useStore.getState().inboxStore; // Only show loading for initial load\n if (inboxStore.inboxItems.length === 0) {\n inboxStore.setLoading(true);\n }\n _context6.p = 1;\n _context6.n = 2;\n return fetchInboxItems();\n case 2:\n items = _context6.v;\n // Check for new items since last check\n currentItemIds = new Set(inboxStore.inboxItems.map(function (item) {\n return item.id;\n }));\n currentTime = Date.now(); // New telegram items\n newTelegramItems = items.filter(function (item) {\n return item.id && !currentItemIds.has(item.id) && item.source === 'telegram';\n }); // Only show notifications if we have detected changes\n if (inboxStore.inboxItems.length > 0 && newTelegramItems.length > 0) {\n // Instead of trying to show toast directly (which won't work outside of React components),\n // dispatch a custom event that the component can listen for and show toasts\n // Get some minimal info about the items for the notification\n notificationData = {\n count: newTelegramItems.length,\n firstItemContent: newTelegramItems[0].content.substring(0, 30) + (newTelegramItems[0].content.length > 30 ? '...' : '')\n }; // Dispatch a custom event with the notification data\n window.dispatchEvent(new CustomEvent('inboxItemsUpdated', {\n detail: notificationData\n }));\n }\n\n // Update state and timestamp\n inboxStore.setInboxItems(items);\n inboxStore.setError(false);\n lastCheckTimestamp = currentTime;\n _context6.n = 4;\n break;\n case 3:\n _context6.p = 3;\n _t = _context6.v;\n console.error('Failed to load inbox items:', _t);\n inboxStore.setError(true);\n case 4:\n _context6.p = 4;\n inboxStore.setLoading(false);\n return _context6.f(4);\n case 5:\n return _context6.a(2);\n }\n }, _callee6, null, [[1, 3, 4, 5]]);\n }));\n return function loadInboxItemsToStore() {\n return _ref6.apply(this, arguments);\n };\n}();\nvar createInboxItemWithStore = /*#__PURE__*/function () {\n var _ref7 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee7(content) {\n var source,\n inboxStore,\n newItem,\n _args7 = arguments,\n _t2;\n return _regenerator().w(function (_context7) {\n while (1) switch (_context7.n) {\n case 0:\n source = _args7.length > 1 && _args7[1] !== undefined ? _args7[1] : 'tududi';\n inboxStore = _store_useStore__WEBPACK_IMPORTED_MODULE_0__.useStore.getState().inboxStore;\n _context7.p = 1;\n _context7.n = 2;\n return createInboxItem(content, source);\n case 2:\n newItem = _context7.v;\n inboxStore.addInboxItem(newItem);\n return _context7.a(2, newItem);\n case 3:\n _context7.p = 3;\n _t2 = _context7.v;\n console.error('Failed to create inbox item:', _t2);\n throw _t2;\n case 4:\n return _context7.a(2);\n }\n }, _callee7, null, [[1, 3]]);\n }));\n return function createInboxItemWithStore(_x6) {\n return _ref7.apply(this, arguments);\n };\n}();\nvar updateInboxItemWithStore = /*#__PURE__*/function () {\n var _ref8 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee8(itemId, content) {\n var inboxStore, updatedItem, _t3;\n return _regenerator().w(function (_context8) {\n while (1) switch (_context8.n) {\n case 0:\n inboxStore = _store_useStore__WEBPACK_IMPORTED_MODULE_0__.useStore.getState().inboxStore;\n _context8.p = 1;\n _context8.n = 2;\n return updateInboxItem(itemId, content);\n case 2:\n updatedItem = _context8.v;\n inboxStore.updateInboxItem(updatedItem);\n return _context8.a(2, updatedItem);\n case 3:\n _context8.p = 3;\n _t3 = _context8.v;\n console.error('Failed to update inbox item:', _t3);\n throw _t3;\n case 4:\n return _context8.a(2);\n }\n }, _callee8, null, [[1, 3]]);\n }));\n return function updateInboxItemWithStore(_x7, _x8) {\n return _ref8.apply(this, arguments);\n };\n}();\nvar processInboxItemWithStore = /*#__PURE__*/function () {\n var _ref9 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee9(itemId) {\n var inboxStore, processedItem, _t4;\n return _regenerator().w(function (_context9) {\n while (1) switch (_context9.n) {\n case 0:\n inboxStore = _store_useStore__WEBPACK_IMPORTED_MODULE_0__.useStore.getState().inboxStore;\n _context9.p = 1;\n _context9.n = 2;\n return processInboxItem(itemId);\n case 2:\n processedItem = _context9.v;\n inboxStore.removeInboxItem(itemId);\n return _context9.a(2, processedItem);\n case 3:\n _context9.p = 3;\n _t4 = _context9.v;\n console.error('Failed to process inbox item:', _t4);\n throw _t4;\n case 4:\n return _context9.a(2);\n }\n }, _callee9, null, [[1, 3]]);\n }));\n return function processInboxItemWithStore(_x9) {\n return _ref9.apply(this, arguments);\n };\n}();\nvar deleteInboxItemWithStore = /*#__PURE__*/function () {\n var _ref0 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee0(itemId) {\n var inboxStore, _t5;\n return _regenerator().w(function (_context0) {\n while (1) switch (_context0.n) {\n case 0:\n inboxStore = _store_useStore__WEBPACK_IMPORTED_MODULE_0__.useStore.getState().inboxStore;\n _context0.p = 1;\n _context0.n = 2;\n return deleteInboxItem(itemId);\n case 2:\n inboxStore.removeInboxItem(itemId);\n _context0.n = 4;\n break;\n case 3:\n _context0.p = 3;\n _t5 = _context0.v;\n console.error('Failed to delete inbox item:', _t5);\n throw _t5;\n case 4:\n return _context0.a(2);\n }\n }, _callee0, null, [[1, 3]]);\n }));\n return function deleteInboxItemWithStore(_x0) {\n return _ref0.apply(this, arguments);\n };\n}();\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/utils/inboxService.ts?");
+
+/***/ }),
+
+/***/ "./frontend/utils/notesService.ts":
+/*!****************************************!*\
+ !*** ./frontend/utils/notesService.ts ***!
+ \****************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createNote: () => (/* binding */ createNote),\n/* harmony export */ deleteNote: () => (/* binding */ deleteNote),\n/* harmony export */ fetchNotes: () => (/* binding */ fetchNotes),\n/* harmony export */ updateNote: () => (/* binding */ updateNote)\n/* harmony export */ });\n/* harmony import */ var _authUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./authUtils */ \"./frontend/utils/authUtils.ts\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\n\nvar fetchNotes = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var response;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n _context.n = 1;\n return fetch(\"/api/notes\", {\n credentials: 'include',\n headers: (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.getDefaultHeaders)()\n });\n case 1:\n response = _context.v;\n _context.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to fetch notes.');\n case 2:\n _context.n = 3;\n return response.json();\n case 3:\n return _context.a(2, _context.v);\n }\n }, _callee);\n }));\n return function fetchNotes() {\n return _ref.apply(this, arguments);\n };\n}();\nvar createNote = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(noteData) {\n var response, _t;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n _context2.p = 0;\n _context2.n = 1;\n return fetch('/api/note', {\n method: 'POST',\n credentials: 'include',\n headers: (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.getPostHeaders)(),\n body: JSON.stringify(noteData)\n });\n case 1:\n response = _context2.v;\n _context2.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to create note.');\n case 2:\n _context2.n = 3;\n return response.json();\n case 3:\n return _context2.a(2, _context2.v);\n case 4:\n _context2.p = 4;\n _t = _context2.v;\n throw _t;\n case 5:\n return _context2.a(2);\n }\n }, _callee2, null, [[0, 4]]);\n }));\n return function createNote(_x) {\n return _ref2.apply(this, arguments);\n };\n}();\nvar updateNote = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(noteId, noteData) {\n var response;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n _context3.n = 1;\n return fetch(\"/api/note/\".concat(noteId), {\n method: 'PATCH',\n credentials: 'include',\n headers: (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.getPostHeaders)(),\n body: JSON.stringify(noteData)\n });\n case 1:\n response = _context3.v;\n _context3.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to update note.');\n case 2:\n _context3.n = 3;\n return response.json();\n case 3:\n return _context3.a(2, _context3.v);\n }\n }, _callee3);\n }));\n return function updateNote(_x2, _x3) {\n return _ref3.apply(this, arguments);\n };\n}();\nvar deleteNote = /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(noteId) {\n var response;\n return _regenerator().w(function (_context4) {\n while (1) switch (_context4.n) {\n case 0:\n _context4.n = 1;\n return fetch(\"/api/note/\".concat(noteId), {\n method: 'DELETE',\n credentials: 'include',\n headers: (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.getDefaultHeaders)()\n });\n case 1:\n response = _context4.v;\n _context4.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to delete note.');\n case 2:\n return _context4.a(2);\n }\n }, _callee4);\n }));\n return function deleteNote(_x4) {\n return _ref4.apply(this, arguments);\n };\n}();\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/utils/notesService.ts?");
+
+/***/ }),
+
+/***/ "./frontend/utils/profileService.ts":
+/*!******************************************!*\
+ !*** ./frontend/utils/profileService.ts ***!
+ \******************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ fetchProfile: () => (/* binding */ fetchProfile),\n/* harmony export */ fetchSchedulerStatus: () => (/* binding */ fetchSchedulerStatus),\n/* harmony export */ fetchTelegramPollingStatus: () => (/* binding */ fetchTelegramPollingStatus),\n/* harmony export */ getAutoSuggestNextActionsEnabled: () => (/* binding */ getAutoSuggestNextActionsEnabled),\n/* harmony export */ getNextTaskSuggestionEnabled: () => (/* binding */ getNextTaskSuggestionEnabled),\n/* harmony export */ getProductivityAssistantEnabled: () => (/* binding */ getProductivityAssistantEnabled),\n/* harmony export */ getTaskIntelligenceEnabled: () => (/* binding */ getTaskIntelligenceEnabled),\n/* harmony export */ sendTaskSummaryNow: () => (/* binding */ sendTaskSummaryNow),\n/* harmony export */ setupTelegram: () => (/* binding */ setupTelegram),\n/* harmony export */ startTelegramPolling: () => (/* binding */ startTelegramPolling),\n/* harmony export */ stopTelegramPolling: () => (/* binding */ stopTelegramPolling),\n/* harmony export */ testTelegram: () => (/* binding */ testTelegram),\n/* harmony export */ toggleTaskSummary: () => (/* binding */ toggleTaskSummary),\n/* harmony export */ updateProfile: () => (/* binding */ updateProfile),\n/* harmony export */ updateTaskSummaryFrequency: () => (/* binding */ updateTaskSummaryFrequency)\n/* harmony export */ });\n/* harmony import */ var _authUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./authUtils */ \"./frontend/utils/authUtils.ts\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\n\nvar fetchProfile = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var response;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n _context.n = 1;\n return fetch('/api/profile', {\n credentials: 'include',\n headers: {\n 'Accept': 'application/json'\n }\n });\n case 1:\n response = _context.v;\n _context.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to fetch profile data.');\n case 2:\n _context.n = 3;\n return response.json();\n case 3:\n return _context.a(2, _context.v);\n }\n }, _callee);\n }));\n return function fetchProfile() {\n return _ref.apply(this, arguments);\n };\n}();\nvar updateProfile = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(profileData) {\n var response;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n _context2.n = 1;\n return fetch('/api/profile', {\n method: 'PATCH',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n },\n body: JSON.stringify(profileData)\n });\n case 1:\n response = _context2.v;\n _context2.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to update profile.');\n case 2:\n _context2.n = 3;\n return response.json();\n case 3:\n return _context2.a(2, _context2.v);\n }\n }, _callee2);\n }));\n return function updateProfile(_x) {\n return _ref2.apply(this, arguments);\n };\n}();\nvar fetchSchedulerStatus = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {\n var response;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n _context3.n = 1;\n return fetch('/api/profile/task-summary/status', {\n credentials: 'include',\n headers: {\n 'Accept': 'application/json'\n }\n });\n case 1:\n response = _context3.v;\n _context3.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to fetch scheduler status.');\n case 2:\n _context3.n = 3;\n return response.json();\n case 3:\n return _context3.a(2, _context3.v);\n }\n }, _callee3);\n }));\n return function fetchSchedulerStatus() {\n return _ref3.apply(this, arguments);\n };\n}();\nvar sendTaskSummaryNow = /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {\n var response;\n return _regenerator().w(function (_context4) {\n while (1) switch (_context4.n) {\n case 0:\n _context4.n = 1;\n return fetch('/api/profile/task-summary/send-now', {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n }\n });\n case 1:\n response = _context4.v;\n _context4.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to send task summary.');\n case 2:\n _context4.n = 3;\n return response.json();\n case 3:\n return _context4.a(2, _context4.v);\n }\n }, _callee4);\n }));\n return function sendTaskSummaryNow() {\n return _ref4.apply(this, arguments);\n };\n}();\nvar fetchTelegramPollingStatus = /*#__PURE__*/function () {\n var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5() {\n var response;\n return _regenerator().w(function (_context5) {\n while (1) switch (_context5.n) {\n case 0:\n _context5.n = 1;\n return fetch('/api/telegram/polling-status', {\n credentials: 'include',\n headers: {\n 'Accept': 'application/json'\n }\n });\n case 1:\n response = _context5.v;\n _context5.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to fetch polling status.');\n case 2:\n _context5.n = 3;\n return response.json();\n case 3:\n return _context5.a(2, _context5.v);\n }\n }, _callee5);\n }));\n return function fetchTelegramPollingStatus() {\n return _ref5.apply(this, arguments);\n };\n}();\nvar setupTelegram = /*#__PURE__*/function () {\n var _ref6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6(botToken, chatId) {\n var response;\n return _regenerator().w(function (_context6) {\n while (1) switch (_context6.n) {\n case 0:\n _context6.n = 1;\n return fetch('/api/telegram/setup', {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n },\n body: JSON.stringify({\n bot_token: botToken,\n chat_id: chatId\n })\n });\n case 1:\n response = _context6.v;\n _context6.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to setup telegram.');\n case 2:\n _context6.n = 3;\n return response.json();\n case 3:\n return _context6.a(2, _context6.v);\n }\n }, _callee6);\n }));\n return function setupTelegram(_x2, _x3) {\n return _ref6.apply(this, arguments);\n };\n}();\nvar startTelegramPolling = /*#__PURE__*/function () {\n var _ref7 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee7() {\n var response;\n return _regenerator().w(function (_context7) {\n while (1) switch (_context7.n) {\n case 0:\n _context7.n = 1;\n return fetch('/api/telegram/start-polling', {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n }\n });\n case 1:\n response = _context7.v;\n _context7.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to start telegram polling.');\n case 2:\n _context7.n = 3;\n return response.json();\n case 3:\n return _context7.a(2, _context7.v);\n }\n }, _callee7);\n }));\n return function startTelegramPolling() {\n return _ref7.apply(this, arguments);\n };\n}();\nvar stopTelegramPolling = /*#__PURE__*/function () {\n var _ref8 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee8() {\n var response;\n return _regenerator().w(function (_context8) {\n while (1) switch (_context8.n) {\n case 0:\n _context8.n = 1;\n return fetch('/api/telegram/stop-polling', {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n }\n });\n case 1:\n response = _context8.v;\n _context8.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to stop telegram polling.');\n case 2:\n _context8.n = 3;\n return response.json();\n case 3:\n return _context8.a(2, _context8.v);\n }\n }, _callee8);\n }));\n return function stopTelegramPolling() {\n return _ref8.apply(this, arguments);\n };\n}();\nvar testTelegram = /*#__PURE__*/function () {\n var _ref9 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee9(userId, message) {\n var response;\n return _regenerator().w(function (_context9) {\n while (1) switch (_context9.n) {\n case 0:\n _context9.n = 1;\n return fetch(\"/api/telegram/test/\".concat(userId), {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n },\n body: JSON.stringify({\n text: message\n })\n });\n case 1:\n response = _context9.v;\n _context9.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to send test message.');\n case 2:\n _context9.n = 3;\n return response.json();\n case 3:\n return _context9.a(2, _context9.v);\n }\n }, _callee9);\n }));\n return function testTelegram(_x4, _x5) {\n return _ref9.apply(this, arguments);\n };\n}();\nvar toggleTaskSummary = /*#__PURE__*/function () {\n var _ref0 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee0() {\n var response;\n return _regenerator().w(function (_context0) {\n while (1) switch (_context0.n) {\n case 0:\n _context0.n = 1;\n return fetch('/api/profile/task-summary/toggle', {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n }\n });\n case 1:\n response = _context0.v;\n _context0.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to toggle task summary.');\n case 2:\n _context0.n = 3;\n return response.json();\n case 3:\n return _context0.a(2, _context0.v);\n }\n }, _callee0);\n }));\n return function toggleTaskSummary() {\n return _ref0.apply(this, arguments);\n };\n}();\nvar updateTaskSummaryFrequency = /*#__PURE__*/function () {\n var _ref1 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee1(frequency) {\n var response;\n return _regenerator().w(function (_context1) {\n while (1) switch (_context1.n) {\n case 0:\n _context1.n = 1;\n return fetch('/api/profile/task-summary/frequency', {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n },\n body: JSON.stringify({\n frequency: frequency\n })\n });\n case 1:\n response = _context1.v;\n _context1.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to update task summary frequency.');\n case 2:\n _context1.n = 3;\n return response.json();\n case 3:\n return _context1.a(2, _context1.v);\n }\n }, _callee1);\n }));\n return function updateTaskSummaryFrequency(_x6) {\n return _ref1.apply(this, arguments);\n };\n}();\nvar getTaskIntelligenceEnabled = /*#__PURE__*/function () {\n var _ref10 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee10() {\n var profile, _t;\n return _regenerator().w(function (_context10) {\n while (1) switch (_context10.n) {\n case 0:\n _context10.p = 0;\n _context10.n = 1;\n return fetchProfile();\n case 1:\n profile = _context10.v;\n return _context10.a(2, profile.task_intelligence_enabled !== undefined ? profile.task_intelligence_enabled : true);\n case 2:\n _context10.p = 2;\n _t = _context10.v;\n console.error('Error fetching task intelligence setting:', _t);\n return _context10.a(2, true);\n }\n }, _callee10, null, [[0, 2]]);\n }));\n return function getTaskIntelligenceEnabled() {\n return _ref10.apply(this, arguments);\n };\n}();\nvar getAutoSuggestNextActionsEnabled = /*#__PURE__*/function () {\n var _ref11 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee11() {\n var profile, _t2;\n return _regenerator().w(function (_context11) {\n while (1) switch (_context11.n) {\n case 0:\n _context11.p = 0;\n _context11.n = 1;\n return fetchProfile();\n case 1:\n profile = _context11.v;\n return _context11.a(2, profile.auto_suggest_next_actions_enabled !== undefined ? profile.auto_suggest_next_actions_enabled : true);\n case 2:\n _context11.p = 2;\n _t2 = _context11.v;\n console.error('Error fetching auto-suggest next actions setting:', _t2);\n return _context11.a(2, true);\n }\n }, _callee11, null, [[0, 2]]);\n }));\n return function getAutoSuggestNextActionsEnabled() {\n return _ref11.apply(this, arguments);\n };\n}();\nvar getProductivityAssistantEnabled = /*#__PURE__*/function () {\n var _ref12 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee12() {\n var profile, _t3;\n return _regenerator().w(function (_context12) {\n while (1) switch (_context12.n) {\n case 0:\n _context12.p = 0;\n _context12.n = 1;\n return fetchProfile();\n case 1:\n profile = _context12.v;\n return _context12.a(2, profile.productivity_assistant_enabled !== undefined ? profile.productivity_assistant_enabled : true);\n case 2:\n _context12.p = 2;\n _t3 = _context12.v;\n console.error('Error fetching productivity assistant setting:', _t3);\n return _context12.a(2, true);\n }\n }, _callee12, null, [[0, 2]]);\n }));\n return function getProductivityAssistantEnabled() {\n return _ref12.apply(this, arguments);\n };\n}();\nvar getNextTaskSuggestionEnabled = /*#__PURE__*/function () {\n var _ref13 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee13() {\n var profile, _t4;\n return _regenerator().w(function (_context13) {\n while (1) switch (_context13.n) {\n case 0:\n _context13.p = 0;\n _context13.n = 1;\n return fetchProfile();\n case 1:\n profile = _context13.v;\n return _context13.a(2, profile.next_task_suggestion_enabled !== undefined ? profile.next_task_suggestion_enabled : true);\n case 2:\n _context13.p = 2;\n _t4 = _context13.v;\n console.error('Error fetching next task suggestion setting:', _t4);\n return _context13.a(2, true);\n }\n }, _callee13, null, [[0, 2]]);\n }));\n return function getNextTaskSuggestionEnabled() {\n return _ref13.apply(this, arguments);\n };\n}();\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/utils/profileService.ts?");
+
+/***/ }),
+
+/***/ "./frontend/utils/projectsService.ts":
+/*!*******************************************!*\
+ !*** ./frontend/utils/projectsService.ts ***!
+ \*******************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createProject: () => (/* binding */ createProject),\n/* harmony export */ deleteProject: () => (/* binding */ deleteProject),\n/* harmony export */ fetchGroupedProjects: () => (/* binding */ fetchGroupedProjects),\n/* harmony export */ fetchProjectById: () => (/* binding */ fetchProjectById),\n/* harmony export */ fetchProjects: () => (/* binding */ fetchProjects),\n/* harmony export */ updateProject: () => (/* binding */ updateProject)\n/* harmony export */ });\n/* harmony import */ var _authUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./authUtils */ \"./frontend/utils/authUtils.ts\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\n\nvar fetchProjects = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var activeFilter,\n areaFilter,\n url,\n params,\n response,\n data,\n _args = arguments;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n activeFilter = _args.length > 0 && _args[0] !== undefined ? _args[0] : \"all\";\n areaFilter = _args.length > 1 && _args[1] !== undefined ? _args[1] : \"\";\n url = \"/api/projects\";\n params = new URLSearchParams();\n if (activeFilter !== \"all\") params.append(\"active\", activeFilter);\n if (areaFilter) params.append(\"area_id\", areaFilter);\n if (params.toString()) url += \"?\".concat(params.toString());\n _context.n = 1;\n return fetch(url, {\n credentials: 'include',\n headers: {\n Accept: 'application/json'\n }\n });\n case 1:\n response = _context.v;\n _context.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to fetch projects.');\n case 2:\n _context.n = 3;\n return response.json();\n case 3:\n data = _context.v;\n return _context.a(2, data.projects || data);\n }\n }, _callee);\n }));\n return function fetchProjects() {\n return _ref.apply(this, arguments);\n };\n}();\nvar fetchGroupedProjects = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {\n var activeFilter,\n areaFilter,\n url,\n params,\n response,\n data,\n _args2 = arguments;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n activeFilter = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : \"all\";\n areaFilter = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : \"\";\n url = \"/api/projects\";\n params = new URLSearchParams();\n params.append(\"grouped\", \"true\");\n if (activeFilter !== \"all\") params.append(\"active\", activeFilter);\n if (areaFilter) params.append(\"area_id\", areaFilter);\n if (params.toString()) url += \"?\".concat(params.toString());\n _context2.n = 1;\n return fetch(url, {\n credentials: 'include',\n headers: {\n Accept: 'application/json'\n }\n });\n case 1:\n response = _context2.v;\n _context2.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to fetch projects.');\n case 2:\n _context2.n = 3;\n return response.json();\n case 3:\n data = _context2.v;\n return _context2.a(2, data);\n }\n }, _callee2);\n }));\n return function fetchGroupedProjects() {\n return _ref2.apply(this, arguments);\n };\n}();\nvar fetchProjectById = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(projectId) {\n var response;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n _context3.n = 1;\n return fetch(\"/api/project/\".concat(projectId), {\n credentials: 'include',\n headers: {\n Accept: 'application/json'\n }\n });\n case 1:\n response = _context3.v;\n _context3.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to fetch project details.');\n case 2:\n _context3.n = 3;\n return response.json();\n case 3:\n return _context3.a(2, _context3.v);\n }\n }, _callee3);\n }));\n return function fetchProjectById(_x) {\n return _ref3.apply(this, arguments);\n };\n}();\nvar createProject = /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(projectData) {\n var response;\n return _regenerator().w(function (_context4) {\n while (1) switch (_context4.n) {\n case 0:\n _context4.n = 1;\n return fetch('/api/project', {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n },\n body: JSON.stringify(projectData)\n });\n case 1:\n response = _context4.v;\n _context4.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to create project.');\n case 2:\n _context4.n = 3;\n return response.json();\n case 3:\n return _context4.a(2, _context4.v);\n }\n }, _callee4);\n }));\n return function createProject(_x2) {\n return _ref4.apply(this, arguments);\n };\n}();\nvar updateProject = /*#__PURE__*/function () {\n var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5(projectId, projectData) {\n var response;\n return _regenerator().w(function (_context5) {\n while (1) switch (_context5.n) {\n case 0:\n _context5.n = 1;\n return fetch(\"/api/project/\".concat(projectId), {\n method: 'PATCH',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n },\n body: JSON.stringify(projectData)\n });\n case 1:\n response = _context5.v;\n _context5.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to update project.');\n case 2:\n _context5.n = 3;\n return response.json();\n case 3:\n return _context5.a(2, _context5.v);\n }\n }, _callee5);\n }));\n return function updateProject(_x3, _x4) {\n return _ref5.apply(this, arguments);\n };\n}();\nvar deleteProject = /*#__PURE__*/function () {\n var _ref6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6(projectId) {\n var response;\n return _regenerator().w(function (_context6) {\n while (1) switch (_context6.n) {\n case 0:\n _context6.n = 1;\n return fetch(\"/api/project/\".concat(projectId), {\n method: 'DELETE',\n credentials: 'include',\n headers: {\n 'Accept': 'application/json'\n }\n });\n case 1:\n response = _context6.v;\n _context6.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to delete project.');\n case 2:\n return _context6.a(2);\n }\n }, _callee6);\n }));\n return function deleteProject(_x5) {\n return _ref6.apply(this, arguments);\n };\n}();\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/utils/projectsService.ts?");
+
+/***/ }),
+
+/***/ "./frontend/utils/tagsService.ts":
+/*!***************************************!*\
+ !*** ./frontend/utils/tagsService.ts ***!
+ \***************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createTag: () => (/* binding */ createTag),\n/* harmony export */ deleteTag: () => (/* binding */ deleteTag),\n/* harmony export */ fetchTags: () => (/* binding */ fetchTags),\n/* harmony export */ updateTag: () => (/* binding */ updateTag)\n/* harmony export */ });\n/* harmony import */ var _authUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./authUtils */ \"./frontend/utils/authUtils.ts\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\n\nvar fetchTags = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var response, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n _context.p = 0;\n _context.n = 1;\n return fetch(\"/api/tags\", {\n credentials: 'include',\n headers: {\n 'Accept': 'application/json',\n 'Cache-Control': 'no-cache',\n 'Pragma': 'no-cache'\n }\n });\n case 1:\n response = _context.v;\n _context.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to fetch tags.');\n case 2:\n _context.n = 3;\n return response.json();\n case 3:\n return _context.a(2, _context.v);\n case 4:\n _context.p = 4;\n _t = _context.v;\n console.error(\"Tags fetch error:\", _t);\n // Return empty array to prevent UI from breaking\n return _context.a(2, []);\n }\n }, _callee, null, [[0, 4]]);\n }));\n return function fetchTags() {\n return _ref.apply(this, arguments);\n };\n}();\nvar createTag = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(tagData) {\n var response;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n _context2.n = 1;\n return fetch('/api/tag', {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n },\n body: JSON.stringify(tagData)\n });\n case 1:\n response = _context2.v;\n _context2.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to create tag.');\n case 2:\n _context2.n = 3;\n return response.json();\n case 3:\n return _context2.a(2, _context2.v);\n }\n }, _callee2);\n }));\n return function createTag(_x) {\n return _ref2.apply(this, arguments);\n };\n}();\nvar updateTag = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(tagId, tagData) {\n var response;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n _context3.n = 1;\n return fetch(\"/api/tag/\".concat(tagId), {\n method: 'PATCH',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n },\n body: JSON.stringify(tagData)\n });\n case 1:\n response = _context3.v;\n _context3.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to update tag.');\n case 2:\n _context3.n = 3;\n return response.json();\n case 3:\n return _context3.a(2, _context3.v);\n }\n }, _callee3);\n }));\n return function updateTag(_x2, _x3) {\n return _ref3.apply(this, arguments);\n };\n}();\nvar deleteTag = /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(tagId) {\n var response;\n return _regenerator().w(function (_context4) {\n while (1) switch (_context4.n) {\n case 0:\n _context4.n = 1;\n return fetch(\"/api/tag/\".concat(tagId), {\n method: 'DELETE',\n credentials: 'include',\n headers: {\n 'Accept': 'application/json'\n }\n });\n case 1:\n response = _context4.v;\n _context4.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to delete tag.');\n case 2:\n return _context4.a(2);\n }\n }, _callee4);\n }));\n return function deleteTag(_x4) {\n return _ref4.apply(this, arguments);\n };\n}();\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/utils/tagsService.ts?");
+
+/***/ }),
+
+/***/ "./frontend/utils/taskEventService.ts":
+/*!********************************************!*\
+ !*** ./frontend/utils/taskEventService.ts ***!
+ \********************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ formatDuration: () => (/* binding */ formatDuration),\n/* harmony export */ getCompletionAnalytics: () => (/* binding */ getCompletionAnalytics),\n/* harmony export */ getEventTypeLabel: () => (/* binding */ getEventTypeLabel),\n/* harmony export */ getPriorityLabel: () => (/* binding */ getPriorityLabel),\n/* harmony export */ getStatusLabel: () => (/* binding */ getStatusLabel),\n/* harmony export */ getTaskCompletionTime: () => (/* binding */ getTaskCompletionTime),\n/* harmony export */ getTaskTimeline: () => (/* binding */ getTaskTimeline),\n/* harmony export */ getUserActivitySummary: () => (/* binding */ getUserActivitySummary),\n/* harmony export */ getUserProductivityMetrics: () => (/* binding */ getUserProductivityMetrics)\n/* harmony export */ });\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nvar API_BASE = '/api';\n\n/**\n * Get task timeline (all events for a specific task)\n */\nvar getTaskTimeline = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(taskId) {\n var response;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n _context.n = 1;\n return fetch(\"\".concat(API_BASE, \"/task/\").concat(taskId, \"/timeline\"), {\n credentials: 'include'\n });\n case 1:\n response = _context.v;\n if (response.ok) {\n _context.n = 2;\n break;\n }\n throw new Error(\"Failed to fetch task timeline: \".concat(response.statusText));\n case 2:\n return _context.a(2, response.json());\n }\n }, _callee);\n }));\n return function getTaskTimeline(_x) {\n return _ref.apply(this, arguments);\n };\n}();\n\n/**\n * Get task completion time analytics\n */\nvar getTaskCompletionTime = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(taskId) {\n var response;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n _context2.n = 1;\n return fetch(\"\".concat(API_BASE, \"/task/\").concat(taskId, \"/completion-time\"), {\n credentials: 'include'\n });\n case 1:\n response = _context2.v;\n if (!(response.status === 404)) {\n _context2.n = 2;\n break;\n }\n return _context2.a(2, null);\n case 2:\n if (response.ok) {\n _context2.n = 3;\n break;\n }\n throw new Error(\"Failed to fetch task completion time: \".concat(response.statusText));\n case 3:\n return _context2.a(2, response.json());\n }\n }, _callee2);\n }));\n return function getTaskCompletionTime(_x2) {\n return _ref2.apply(this, arguments);\n };\n}();\n\n/**\n * Get user productivity metrics\n */\nvar getUserProductivityMetrics = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(startDate, endDate) {\n var params, response;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n params = new URLSearchParams();\n if (startDate) params.append('startDate', startDate);\n if (endDate) params.append('endDate', endDate);\n _context3.n = 1;\n return fetch(\"\".concat(API_BASE, \"/user/productivity-metrics?\").concat(params), {\n credentials: 'include'\n });\n case 1:\n response = _context3.v;\n if (response.ok) {\n _context3.n = 2;\n break;\n }\n throw new Error(\"Failed to fetch productivity metrics: \".concat(response.statusText));\n case 2:\n return _context3.a(2, response.json());\n }\n }, _callee3);\n }));\n return function getUserProductivityMetrics(_x3, _x4) {\n return _ref3.apply(this, arguments);\n };\n}();\n\n/**\n * Get user activity summary\n */\nvar getUserActivitySummary = /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(startDate, endDate) {\n var params, response;\n return _regenerator().w(function (_context4) {\n while (1) switch (_context4.n) {\n case 0:\n params = new URLSearchParams({\n startDate: startDate,\n endDate: endDate\n });\n _context4.n = 1;\n return fetch(\"\".concat(API_BASE, \"/user/activity-summary?\").concat(params), {\n credentials: 'include'\n });\n case 1:\n response = _context4.v;\n if (response.ok) {\n _context4.n = 2;\n break;\n }\n throw new Error(\"Failed to fetch activity summary: \".concat(response.statusText));\n case 2:\n return _context4.a(2, response.json());\n }\n }, _callee4);\n }));\n return function getUserActivitySummary(_x5, _x6) {\n return _ref4.apply(this, arguments);\n };\n}();\n\n/**\n * Get completion analytics for multiple tasks\n */\nvar getCompletionAnalytics = /*#__PURE__*/function () {\n var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5() {\n var options,\n params,\n response,\n _args5 = arguments;\n return _regenerator().w(function (_context5) {\n while (1) switch (_context5.n) {\n case 0:\n options = _args5.length > 0 && _args5[0] !== undefined ? _args5[0] : {};\n params = new URLSearchParams();\n if (options.limit) params.append('limit', options.limit.toString());\n if (options.offset) params.append('offset', options.offset.toString());\n if (options.projectId) params.append('projectId', options.projectId.toString());\n _context5.n = 1;\n return fetch(\"\".concat(API_BASE, \"/tasks/completion-analytics?\").concat(params), {\n credentials: 'include'\n });\n case 1:\n response = _context5.v;\n if (response.ok) {\n _context5.n = 2;\n break;\n }\n throw new Error(\"Failed to fetch completion analytics: \".concat(response.statusText));\n case 2:\n return _context5.a(2, response.json());\n }\n }, _callee5);\n }));\n return function getCompletionAnalytics() {\n return _ref5.apply(this, arguments);\n };\n}();\n\n/**\n * Format duration for display\n */\nvar formatDuration = function formatDuration(hours) {\n if (hours < 1) {\n var minutes = Math.round(hours * 60);\n return \"\".concat(minutes, \"m\");\n } else if (hours < 24) {\n var h = Math.floor(hours);\n var m = Math.round((hours - h) * 60);\n return m > 0 ? \"\".concat(h, \"h \").concat(m, \"m\") : \"\".concat(h, \"h\");\n } else {\n var days = Math.floor(hours / 24);\n var _h = Math.floor(hours % 24);\n return _h > 0 ? \"\".concat(days, \"d \").concat(_h, \"h\") : \"\".concat(days, \"d\");\n }\n};\n\n/**\n * Get human-readable event type\n */\nvar getEventTypeLabel = function getEventTypeLabel(eventType) {\n var labels = {\n 'created': 'Created',\n 'status_changed': 'Status Changed',\n 'priority_changed': 'Priority Changed',\n 'due_date_changed': 'Due Date Changed',\n 'project_changed': 'Project Changed',\n 'name_changed': 'Name Changed',\n 'description_changed': 'Description Changed',\n 'note_changed': 'Note Changed',\n 'completed': 'Completed',\n 'archived': 'Archived',\n 'deleted': 'Deleted',\n 'restored': 'Restored',\n 'today_changed': 'Today Flag Changed',\n 'tags_changed': 'Tags Changed',\n 'recurrence_changed': 'Recurrence Changed'\n };\n return labels[eventType] || eventType;\n};\n\n/**\n * Get human-readable status value\n */\nvar getStatusLabel = function getStatusLabel(status) {\n var statusLabels = {\n 0: 'Not Started',\n 1: 'In Progress',\n 2: 'Done',\n 3: 'Archived',\n 4: 'Waiting'\n };\n return statusLabels[status] || \"Status \".concat(status);\n};\n\n/**\n * Get human-readable priority value\n */\nvar getPriorityLabel = function getPriorityLabel(priority) {\n var priorityLabels = {\n 0: 'Low',\n 1: 'Medium',\n 2: 'High'\n };\n return priorityLabels[priority] || \"Priority \".concat(priority);\n};\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/utils/taskEventService.ts?");
+
+/***/ }),
+
+/***/ "./frontend/utils/taskIntelligenceService.ts":
+/*!***************************************************!*\
+ !*** ./frontend/utils/taskIntelligenceService.ts ***!
+ \***************************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ analyzeTaskName: () => (/* binding */ analyzeTaskName),\n/* harmony export */ getTaskNameSuggestion: () => (/* binding */ getTaskNameSuggestion),\n/* harmony export */ getVagueTasks: () => (/* binding */ getVagueTasks)\n/* harmony export */ });\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\n/**\n * Analyzes a task name to determine if it's vague or needs improvement\n * Returns an object with analysis results and suggestions\n */\n\nvar analyzeTaskName = function analyzeTaskName(taskName) {\n var trimmedName = taskName.toLowerCase().trim();\n\n // Very short tasks (less than 10 chars) - original logic\n if (trimmedName.length > 0 && trimmedName.length < 10) {\n return {\n isVague: true,\n reason: 'short',\n suggestion: 'task.suggestions.short',\n severity: 'medium'\n };\n }\n\n // Skip if it's already a next action (contains →)\n if (trimmedName.includes('→')) {\n return {\n isVague: false,\n reason: 'good',\n severity: 'low'\n };\n }\n\n // More comprehensive action verb patterns\n var actionVerbPatterns = [\n // Direct action verbs at start\n /^(call|email|text|message|phone|contact)/, /^(write|draft|compose|type|create|make)/, /^(read|review|check|examine|study|analyze)/, /^(buy|purchase|order|get|obtain|acquire)/, /^(schedule|book|arrange|plan|set up|setup)/, /^(meet|discuss|talk|speak|chat)/, /^(send|deliver|ship|mail|forward)/, /^(update|edit|modify|change|fix|correct)/, /^(finish|complete|finalize|wrap up)/, /^(submit|file|upload|post|publish)/, /^(organize|sort|clean|tidy|arrange)/, /^(research|find|search|look up|investigate)/, /^(prepare|gather|collect|assemble)/, /^(install|download|set up|configure)/, /^(test|try|experiment|validate)/, /^(backup|save|export|archive)/, /^(delete|remove|uninstall|cancel)/,\n // Gerund forms (-ing verbs) which are often good actions\n /^(calling|emailing|writing|reading|buying|scheduling|meeting|sending|updating|finishing|submitting|organizing|researching|preparing|installing|testing|backing)/,\n // Question patterns (usually clear next actions)\n /^(what|how|when|where|why|which)/, /\\?$/,\n // Imperative patterns with objects\n /^(add|remove|insert|attach|include|exclude)/, /^(start|begin|initiate|launch|kick off)/, /^(stop|end|terminate|close|shut)/,\n // Common task patterns\n /^(follow up|followup)/, /^(sign up|signup)/, /^(log in|login)/, /^(pick up|pickup)/, /^(drop off|dropoff)/, /^(set up|setup)/, /^(clean up|cleanup)/, /^(wrap up|wrapup)/];\n\n // Check if task starts with any action verb pattern\n var hasActionVerb = actionVerbPatterns.some(function (pattern) {\n return pattern.test(trimmedName);\n });\n if (hasActionVerb) {\n return {\n isVague: false,\n reason: 'good',\n severity: 'low'\n };\n }\n\n // Check for common non-actionable patterns (these are vague)\n var vaguePatterns = [\n // Single words without context\n /^[a-zA-Z]+$/,\n // Just names without action\n /^[A-Z][a-z]+ [A-Z][a-z]+$/,\n // Just project/area names\n /^(project|website|app|system|process|issue|problem|bug|feature)$/i,\n // Very short tasks without clear action (less than 3 words)\n /^(\\w+\\s+\\w+|^\\w+)$/];\n\n // Only flag as vague if it matches vague patterns AND is not clearly actionable\n var matchesVaguePattern = vaguePatterns.some(function (pattern) {\n return pattern.test(trimmedName);\n });\n\n // Additional checks for good tasks that shouldn't be flagged\n var hasGoodStructure = trimmedName.length > 15 ||\n // Longer tasks are usually more specific\n trimmedName.split(' ').length > 3 ||\n // More than 3 words usually means more specific\n /\\b(for|with|to|from|about|regarding|re:|fwd:)\\b/.test(trimmedName) ||\n // Prepositions indicate context\n /\\b(tomorrow|today|monday|tuesday|wednesday|thursday|friday|saturday|sunday|next week|this week)\\b/.test(trimmedName) ||\n // Time references\n /\\b(project|meeting|appointment|deadline|due|urgent|important)\\b/.test(trimmedName) // Context indicators\n ;\n if (matchesVaguePattern && !hasGoodStructure) {\n return {\n isVague: true,\n reason: 'vague_pattern',\n suggestion: 'task.suggestions.vague',\n severity: 'high'\n };\n }\n\n // Check for missing action verbs (less strict)\n if (!hasActionVerb && trimmedName.split(' ').length <= 2) {\n return {\n isVague: true,\n reason: 'no_verb',\n suggestion: 'task.suggestions.noVerb',\n severity: 'medium'\n };\n }\n return {\n isVague: false,\n reason: 'good',\n severity: 'low'\n };\n};\n\n/**\n * Filters tasks to find vague ones using the enhanced logic\n */\nvar getVagueTasks = function getVagueTasks(tasks) {\n return tasks.filter(function (task) {\n if (task.status === 'done' || task.status === 'archived') return false;\n var analysis = analyzeTaskName(task.name);\n return analysis.isVague;\n });\n};\n\n/**\n * Gets a user-friendly suggestion for improving a task name\n */\nvar getTaskNameSuggestion = function getTaskNameSuggestion(taskName) {\n var analysis = analyzeTaskName(taskName);\n return analysis.isVague ? analysis.suggestion || null : null;\n};\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/utils/taskIntelligenceService.ts?");
+
+/***/ }),
+
+/***/ "./frontend/utils/tasksService.ts":
+/*!****************************************!*\
+ !*** ./frontend/utils/tasksService.ts ***!
+ \****************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createTask: () => (/* binding */ createTask),\n/* harmony export */ deleteTask: () => (/* binding */ deleteTask),\n/* harmony export */ fetchTaskById: () => (/* binding */ fetchTaskById),\n/* harmony export */ fetchTaskByUuid: () => (/* binding */ fetchTaskByUuid),\n/* harmony export */ fetchTasks: () => (/* binding */ fetchTasks),\n/* harmony export */ toggleTaskCompletion: () => (/* binding */ toggleTaskCompletion),\n/* harmony export */ toggleTaskToday: () => (/* binding */ toggleTaskToday),\n/* harmony export */ updateTask: () => (/* binding */ updateTask)\n/* harmony export */ });\n/* harmony import */ var _authUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./authUtils */ \"./frontend/utils/authUtils.ts\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\n\nvar fetchTasks = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var query,\n response,\n result,\n _args = arguments;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n query = _args.length > 0 && _args[0] !== undefined ? _args[0] : '';\n _context.n = 1;\n return fetch(\"/api/tasks\".concat(query), {\n credentials: 'include',\n headers: (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.getDefaultHeaders)()\n });\n case 1:\n response = _context.v;\n _context.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to fetch tasks.');\n case 2:\n _context.n = 3;\n return response.json();\n case 3:\n result = _context.v;\n if (Array.isArray(result.tasks)) {\n _context.n = 4;\n break;\n }\n throw new Error('Resulting tasks are not an array.');\n case 4:\n if (result.metrics) {\n _context.n = 5;\n break;\n }\n throw new Error('Metrics data is not included.');\n case 5:\n return _context.a(2, {\n tasks: result.tasks,\n metrics: result.metrics\n });\n }\n }, _callee);\n }));\n return function fetchTasks() {\n return _ref.apply(this, arguments);\n };\n}();\nvar createTask = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(taskData) {\n var response;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n _context2.n = 1;\n return fetch('/api/task', {\n method: 'POST',\n credentials: 'include',\n headers: (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.getPostHeaders)(),\n body: JSON.stringify(taskData)\n });\n case 1:\n response = _context2.v;\n _context2.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to create task.');\n case 2:\n _context2.n = 3;\n return response.json();\n case 3:\n return _context2.a(2, _context2.v);\n }\n }, _callee2);\n }));\n return function createTask(_x) {\n return _ref2.apply(this, arguments);\n };\n}();\nvar updateTask = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(taskId, taskData) {\n var response;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n _context3.n = 1;\n return fetch(\"/api/task/\".concat(taskId), {\n method: 'PATCH',\n credentials: 'include',\n headers: (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.getPostHeaders)(),\n body: JSON.stringify(taskData)\n });\n case 1:\n response = _context3.v;\n _context3.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to update task.');\n case 2:\n _context3.n = 3;\n return response.json();\n case 3:\n return _context3.a(2, _context3.v);\n }\n }, _callee3);\n }));\n return function updateTask(_x2, _x3) {\n return _ref3.apply(this, arguments);\n };\n}();\nvar toggleTaskCompletion = /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(taskId) {\n var response, result;\n return _regenerator().w(function (_context4) {\n while (1) switch (_context4.n) {\n case 0:\n _context4.n = 1;\n return fetch(\"/api/task/\".concat(taskId, \"/toggle_completion\"), {\n method: 'PATCH',\n credentials: 'include',\n headers: (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.getPostHeaders)()\n });\n case 1:\n response = _context4.v;\n _context4.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to toggle task completion.');\n case 2:\n _context4.n = 3;\n return response.json();\n case 3:\n result = _context4.v;\n return _context4.a(2, result);\n }\n }, _callee4);\n }));\n return function toggleTaskCompletion(_x4) {\n return _ref4.apply(this, arguments);\n };\n}();\nvar deleteTask = /*#__PURE__*/function () {\n var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5(taskId) {\n var response;\n return _regenerator().w(function (_context5) {\n while (1) switch (_context5.n) {\n case 0:\n _context5.n = 1;\n return fetch(\"/api/task/\".concat(taskId), {\n method: 'DELETE',\n credentials: 'include',\n headers: (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.getDefaultHeaders)()\n });\n case 1:\n response = _context5.v;\n _context5.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to delete task.');\n case 2:\n return _context5.a(2);\n }\n }, _callee5);\n }));\n return function deleteTask(_x5) {\n return _ref5.apply(this, arguments);\n };\n}();\nvar fetchTaskById = /*#__PURE__*/function () {\n var _ref6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6(taskId) {\n var response;\n return _regenerator().w(function (_context6) {\n while (1) switch (_context6.n) {\n case 0:\n _context6.n = 1;\n return fetch(\"/api/task/\".concat(taskId), {\n credentials: 'include',\n headers: (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.getDefaultHeaders)()\n });\n case 1:\n response = _context6.v;\n _context6.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to fetch task.');\n case 2:\n _context6.n = 3;\n return response.json();\n case 3:\n return _context6.a(2, _context6.v);\n }\n }, _callee6);\n }));\n return function fetchTaskById(_x6) {\n return _ref6.apply(this, arguments);\n };\n}();\nvar fetchTaskByUuid = /*#__PURE__*/function () {\n var _ref7 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee7(uuid) {\n var response;\n return _regenerator().w(function (_context7) {\n while (1) switch (_context7.n) {\n case 0:\n _context7.n = 1;\n return fetch(\"/api/task/uuid/\".concat(uuid), {\n credentials: 'include',\n headers: (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.getDefaultHeaders)()\n });\n case 1:\n response = _context7.v;\n _context7.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to fetch task.');\n case 2:\n _context7.n = 3;\n return response.json();\n case 3:\n return _context7.a(2, _context7.v);\n }\n }, _callee7);\n }));\n return function fetchTaskByUuid(_x7) {\n return _ref7.apply(this, arguments);\n };\n}();\nvar toggleTaskToday = /*#__PURE__*/function () {\n var _ref8 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee8(taskId) {\n var response;\n return _regenerator().w(function (_context8) {\n while (1) switch (_context8.n) {\n case 0:\n _context8.n = 1;\n return fetch(\"/api/task/\".concat(taskId, \"/toggle-today\"), {\n method: 'PATCH',\n credentials: 'include',\n headers: (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.getPostHeaders)()\n });\n case 1:\n response = _context8.v;\n _context8.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to toggle task today status.');\n case 2:\n _context8.n = 3;\n return response.json();\n case 3:\n return _context8.a(2, _context8.v);\n }\n }, _callee8);\n }));\n return function toggleTaskToday(_x8) {\n return _ref8.apply(this, arguments);\n };\n}();\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/utils/tasksService.ts?");
+
+/***/ }),
+
+/***/ "./frontend/utils/urlService.ts":
+/*!**************************************!*\
+ !*** ./frontend/utils/urlService.ts ***!
+ \**************************************/
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ extractTitleFromText: () => (/* binding */ extractTitleFromText),\n/* harmony export */ extractUrlTitle: () => (/* binding */ extractUrlTitle),\n/* harmony export */ isUrl: () => (/* binding */ isUrl)\n/* harmony export */ });\n/* harmony import */ var _authUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./authUtils */ \"./frontend/utils/authUtils.ts\");\n/* provided dependency */ var __react_refresh_utils__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js\");\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n__webpack_require__.$Refresh$.runtime = __webpack_require__(/*! ./node_modules/react-refresh/runtime.js */ \"./node_modules/react-refresh/runtime.js\");\n\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2); } }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\n/**\n * Service for URL-related operations like extracting titles from web pages\n */\n\n/**\n * Extract the title of a web page from its URL\n * @param url The URL to extract the title from\n * @returns Promise resolving to the page title or null if not found\n */\nvar extractUrlTitle = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(url) {\n var response, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n _context.p = 0;\n _context.n = 1;\n return fetch(\"/api/url/title?url=\".concat(encodeURIComponent(url)), {\n credentials: 'include',\n headers: {\n 'Accept': 'application/json'\n }\n });\n case 1:\n response = _context.v;\n _context.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to extract URL title');\n case 2:\n _context.n = 3;\n return response.json();\n case 3:\n return _context.a(2, _context.v);\n case 4:\n _context.p = 4;\n _t = _context.v;\n console.error('Error extracting URL title:', _t);\n return _context.a(2, {\n url: url,\n title: null,\n error: _t.message\n });\n }\n }, _callee, null, [[0, 4]]);\n }));\n return function extractUrlTitle(_x) {\n return _ref.apply(this, arguments);\n };\n}();\n\n/**\n * Extract a URL and its title from arbitrary text\n * @param text The text that might contain a URL\n * @returns Promise resolving to the URL and title if found\n */\nvar extractTitleFromText = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(text) {\n var response, result, _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n _context2.p = 0;\n _context2.n = 1;\n return fetch('/api/url/extract-from-text', {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n },\n body: JSON.stringify({\n text: text\n })\n });\n case 1:\n response = _context2.v;\n _context2.n = 2;\n return (0,_authUtils__WEBPACK_IMPORTED_MODULE_0__.handleAuthResponse)(response, 'Failed to extract title from text');\n case 2:\n _context2.n = 3;\n return response.json();\n case 3:\n result = _context2.v;\n if (!(result.found === false)) {\n _context2.n = 4;\n break;\n }\n return _context2.a(2, null);\n case 4:\n return _context2.a(2, result);\n case 5:\n _context2.p = 5;\n _t2 = _context2.v;\n console.error('Error extracting title from text:', _t2);\n return _context2.a(2, null);\n }\n }, _callee2, null, [[0, 5]]);\n }));\n return function extractTitleFromText(_x2) {\n return _ref2.apply(this, arguments);\n };\n}();\n\n/**\n * Check if a string is likely a URL\n * @param text The text to check\n * @returns True if the text appears to be a URL\n */\nvar isUrl = function isUrl(text) {\n // Basic URL validation regex\n var urlRegex = /^(https?:\\/\\/)?[a-z0-9]+([\\-\\.]{1}[a-z0-9]+)*\\.[a-z]{2,5}(:[0-9]{1,5})?(\\/.*)?$/i;\n return urlRegex.test(text.trim());\n};\n\nconst $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;\nconst $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(\n\t$ReactRefreshModuleId$\n);\n\nfunction $ReactRefreshModuleRuntime$(exports) {\n\tif (true) {\n\t\tlet errorOverlay;\n\t\tif (typeof __react_refresh_error_overlay__ !== 'undefined') {\n\t\t\terrorOverlay = __react_refresh_error_overlay__;\n\t\t}\n\t\tlet testMode;\n\t\tif (typeof __react_refresh_test__ !== 'undefined') {\n\t\t\ttestMode = __react_refresh_test__;\n\t\t}\n\t\treturn __react_refresh_utils__.executeRuntime(\n\t\t\texports,\n\t\t\t$ReactRefreshModuleId$,\n\t\t\tmodule.hot,\n\t\t\terrorOverlay,\n\t\t\ttestMode\n\t\t);\n\t}\n}\n\nif (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {\n\t$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);\n} else {\n\t$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);\n}\n\n//# sourceURL=webpack://tududi/./frontend/utils/urlService.ts?");
+
+/***/ }),
+
+/***/ "./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js":
+/*!**************************************************************************!*\
+ !*** ./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js ***!
+ \**************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ _assertThisInitialized)\n/* harmony export */ });\nfunction _assertThisInitialized(e) {\n if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n return e;\n}\n\n\n//# sourceURL=webpack://tududi/./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@babel/runtime/helpers/esm/extends.js":
+/*!************************************************************!*\
+ !*** ./node_modules/@babel/runtime/helpers/esm/extends.js ***!
+ \************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ _extends)\n/* harmony export */ });\nfunction _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\n\n\n//# sourceURL=webpack://tududi/./node_modules/@babel/runtime/helpers/esm/extends.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js ***!
+ \******************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ _inheritsLoose)\n/* harmony export */ });\n/* harmony import */ var _setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./setPrototypeOf.js */ \"./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js\");\n\nfunction _inheritsLoose(t, o) {\n t.prototype = Object.create(o.prototype), t.prototype.constructor = t, (0,_setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(t, o);\n}\n\n\n//# sourceURL=webpack://tududi/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js":
+/*!*********************************************************************************!*\
+ !*** ./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js ***!
+ \*********************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ _objectWithoutPropertiesLoose)\n/* harmony export */ });\nfunction _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (-1 !== e.indexOf(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\n\n\n//# sourceURL=webpack://tududi/./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js ***!
+ \*******************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ _setPrototypeOf)\n/* harmony export */ });\nfunction _setPrototypeOf(t, e) {\n return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n return t.__proto__ = e, t;\n }, _setPrototypeOf(t, e);\n}\n\n\n//# sourceURL=webpack://tududi/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/AcademicCapIcon.js":
+/*!*************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/AcademicCapIcon.js ***!
+ \*************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction AcademicCapIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M4.26 10.147a60.438 60.438 0 0 0-.491 6.347A48.62 48.62 0 0 1 12 20.904a48.62 48.62 0 0 1 8.232-4.41 60.46 60.46 0 0 0-.491-6.347m-15.482 0a50.636 50.636 0 0 0-2.658-.813A59.906 59.906 0 0 1 12 3.493a59.903 59.903 0 0 1 10.399 5.84c-.896.248-1.783.52-2.658.814m-15.482 0A50.717 50.717 0 0 1 12 13.489a50.702 50.702 0 0 1 7.74-3.342M6.75 15a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm0 0v-3.675A55.378 55.378 0 0 1 12 8.443m-7.007 11.55A5.981 5.981 0 0 0 6.75 15.75v-1.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(AcademicCapIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/AcademicCapIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/AdjustmentsHorizontalIcon.js":
+/*!***********************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/AdjustmentsHorizontalIcon.js ***!
+ \***********************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction AdjustmentsHorizontalIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M10.5 6h9.75M10.5 6a1.5 1.5 0 1 1-3 0m3 0a1.5 1.5 0 1 0-3 0M3.75 6H7.5m3 12h9.75m-9.75 0a1.5 1.5 0 0 1-3 0m3 0a1.5 1.5 0 0 0-3 0m-3.75 0H7.5m9-6h3.75m-3.75 0a1.5 1.5 0 0 1-3 0m3 0a1.5 1.5 0 0 0-3 0m-9.75 0h9.75\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(AdjustmentsHorizontalIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/AdjustmentsHorizontalIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/ArchiveBoxIcon.js":
+/*!************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/ArchiveBoxIcon.js ***!
+ \************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ArchiveBoxIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m20.25 7.5-.625 10.632a2.25 2.25 0 0 1-2.247 2.118H6.622a2.25 2.25 0 0 1-2.247-2.118L3.75 7.5M10 11.25h4M3.375 7.5h17.25c.621 0 1.125-.504 1.125-1.125v-1.5c0-.621-.504-1.125-1.125-1.125H3.375c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ArchiveBoxIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/ArchiveBoxIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/ArrowDownIcon.js":
+/*!***********************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/ArrowDownIcon.js ***!
+ \***********************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ArrowDownIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M19.5 13.5 12 21m0 0-7.5-7.5M12 21V3\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ArrowDownIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/ArrowDownIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/ArrowPathIcon.js":
+/*!***********************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/ArrowPathIcon.js ***!
+ \***********************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ArrowPathIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ArrowPathIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/ArrowPathIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/ArrowTopRightOnSquareIcon.js":
+/*!***********************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/ArrowTopRightOnSquareIcon.js ***!
+ \***********************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ArrowTopRightOnSquareIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ArrowTopRightOnSquareIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/ArrowTopRightOnSquareIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/ArrowUpIcon.js":
+/*!*********************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/ArrowUpIcon.js ***!
+ \*********************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ArrowUpIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M4.5 10.5 12 3m0 0 7.5 7.5M12 3v18\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ArrowUpIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/ArrowUpIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/BoltIcon.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/BoltIcon.js ***!
+ \******************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction BoltIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m3.75 13.5 10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(BoltIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/BoltIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/BookOpenIcon.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/BookOpenIcon.js ***!
+ \**********************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction BookOpenIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M12 6.042A8.967 8.967 0 0 0 6 3.75c-1.052 0-2.062.18-3 .512v14.25A8.987 8.987 0 0 1 6 18c2.305 0 4.408.867 6 2.292m0-14.25a8.966 8.966 0 0 1 6-2.292c1.052 0 2.062.18 3 .512v14.25A8.987 8.987 0 0 0 18 18a8.967 8.967 0 0 0-6 2.292m0-14.25v14.25\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(BookOpenIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/BookOpenIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/CalendarDaysIcon.js":
+/*!**************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/CalendarDaysIcon.js ***!
+ \**************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction CalendarDaysIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5m-9-6h.008v.008H12v-.008ZM12 15h.008v.008H12V15Zm0 2.25h.008v.008H12v-.008ZM9.75 15h.008v.008H9.75V15Zm0 2.25h.008v.008H9.75v-.008ZM7.5 15h.008v.008H7.5V15Zm0 2.25h.008v.008H7.5v-.008Zm6.75-4.5h.008v.008h-.008v-.008Zm0 2.25h.008v.008h-.008V15Zm0 2.25h.008v.008h-.008v-.008Zm2.25-4.5h.008v.008H16.5v-.008Zm0 2.25h.008v.008H16.5V15Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(CalendarDaysIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/CalendarDaysIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/CalendarIcon.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/CalendarIcon.js ***!
+ \**********************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction CalendarIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(CalendarIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/CalendarIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/ChartBarIcon.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/ChartBarIcon.js ***!
+ \**********************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ChartBarIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M3 13.125C3 12.504 3.504 12 4.125 12h2.25c.621 0 1.125.504 1.125 1.125v6.75C7.5 20.496 6.996 21 6.375 21h-2.25A1.125 1.125 0 0 1 3 19.875v-6.75ZM9.75 8.625c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125v11.25c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 0 1-1.125-1.125V8.625ZM16.5 4.125c0-.621.504-1.125 1.125-1.125h2.25C20.496 3 21 3.504 21 4.125v15.75c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 0 1-1.125-1.125V4.125Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ChartBarIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/ChartBarIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/ChatBubbleBottomCenterTextIcon.js":
+/*!****************************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/ChatBubbleBottomCenterTextIcon.js ***!
+ \****************************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ChatBubbleBottomCenterTextIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M7.5 8.25h9m-9 3H12m-9.75 1.51c0 1.6 1.123 2.994 2.707 3.227 1.129.166 2.27.293 3.423.379.35.026.67.21.865.501L12 21l2.755-4.133a1.14 1.14 0 0 1 .865-.501 48.172 48.172 0 0 0 3.423-.379c1.584-.233 2.707-1.626 2.707-3.228V6.741c0-1.602-1.123-2.995-2.707-3.228A48.394 48.394 0 0 0 12 3c-2.392 0-4.744.175-7.043.513C3.373 3.746 2.25 5.14 2.25 6.741v6.018Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ChatBubbleBottomCenterTextIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/ChatBubbleBottomCenterTextIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/ChatBubbleLeftRightIcon.js":
+/*!*********************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/ChatBubbleLeftRightIcon.js ***!
+ \*********************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ChatBubbleLeftRightIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M20.25 8.511c.884.284 1.5 1.128 1.5 2.097v4.286c0 1.136-.847 2.1-1.98 2.193-.34.027-.68.052-1.02.072v3.091l-3-3c-1.354 0-2.694-.055-4.02-.163a2.115 2.115 0 0 1-.825-.242m9.345-8.334a2.126 2.126 0 0 0-.476-.095 48.64 48.64 0 0 0-8.048 0c-1.131.094-1.976 1.057-1.976 2.192v4.286c0 .837.46 1.58 1.155 1.951m9.345-8.334V6.637c0-1.621-1.152-3.026-2.76-3.235A48.455 48.455 0 0 0 11.25 3c-2.115 0-4.198.137-6.24.402-1.608.209-2.76 1.614-2.76 3.235v6.226c0 1.621 1.152 3.026 2.76 3.235.577.075 1.157.14 1.74.194V21l4.155-4.155\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ChatBubbleLeftRightIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/ChatBubbleLeftRightIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/CheckCircleIcon.js":
+/*!*************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/CheckCircleIcon.js ***!
+ \*************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction CheckCircleIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M9 12.75 11.25 15 15 9.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(CheckCircleIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/CheckCircleIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/CheckIcon.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/CheckIcon.js ***!
+ \*******************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction CheckIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m4.5 12.75 6 6 9-13.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(CheckIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/CheckIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/ChevronDownIcon.js":
+/*!*************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/ChevronDownIcon.js ***!
+ \*************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ChevronDownIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m19.5 8.25-7.5 7.5-7.5-7.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ChevronDownIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/ChevronDownIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/ChevronLeftIcon.js":
+/*!*************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/ChevronLeftIcon.js ***!
+ \*************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ChevronLeftIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M15.75 19.5 8.25 12l7.5-7.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ChevronLeftIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/ChevronLeftIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/ChevronRightIcon.js":
+/*!**************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/ChevronRightIcon.js ***!
+ \**************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ChevronRightIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m8.25 4.5 7.5 7.5-7.5 7.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ChevronRightIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/ChevronRightIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/ClipboardDocumentListIcon.js":
+/*!***********************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/ClipboardDocumentListIcon.js ***!
+ \***********************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ClipboardDocumentListIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M9 12h3.75M9 15h3.75M9 18h3.75m3 .75H18a2.25 2.25 0 0 0 2.25-2.25V6.108c0-1.135-.845-2.098-1.976-2.192a48.424 48.424 0 0 0-1.123-.08m-5.801 0c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75 2.25 2.25 0 0 0-.1-.664m-5.8 0A2.251 2.251 0 0 1 13.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m0 0H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H8.25ZM6.75 12h.008v.008H6.75V12Zm0 3h.008v.008H6.75V15Zm0 3h.008v.008H6.75V18Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ClipboardDocumentListIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/ClipboardDocumentListIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/ClipboardIcon.js":
+/*!***********************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/ClipboardIcon.js ***!
+ \***********************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ClipboardIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M15.666 3.888A2.25 2.25 0 0 0 13.5 2.25h-3c-1.03 0-1.9.693-2.166 1.638m7.332 0c.055.194.084.4.084.612v0a.75.75 0 0 1-.75.75H9a.75.75 0 0 1-.75-.75v0c0-.212.03-.418.084-.612m7.332 0c.646.049 1.288.11 1.927.184 1.1.128 1.907 1.077 1.907 2.185V19.5a2.25 2.25 0 0 1-2.25 2.25H6.75A2.25 2.25 0 0 1 4.5 19.5V6.257c0-1.108.806-2.057 1.907-2.185a48.208 48.208 0 0 1 1.927-.184\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ClipboardIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/ClipboardIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/ClockIcon.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/ClockIcon.js ***!
+ \*******************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ClockIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M12 6v6h4.5m4.5 0a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ClockIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/ClockIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/CogIcon.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/CogIcon.js ***!
+ \*****************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction CogIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M4.5 12a7.5 7.5 0 0 0 15 0m-15 0a7.5 7.5 0 1 1 15 0m-15 0H3m16.5 0H21m-1.5 0H12m-8.457 3.077 1.41-.513m14.095-5.13 1.41-.513M5.106 17.785l1.15-.964m11.49-9.642 1.149-.964M7.501 19.795l.75-1.3m7.5-12.99.75-1.3m-6.063 16.658.26-1.477m2.605-14.772.26-1.477m0 17.726-.26-1.477M10.698 4.614l-.26-1.477M16.5 19.794l-.75-1.299M7.5 4.205 12 12m6.894 5.785-1.149-.964M6.256 7.178l-1.15-.964m15.352 8.864-1.41-.513M4.954 9.435l-1.41-.514M12.002 12l-3.75 6.495\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(CogIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/CogIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/DocumentTextIcon.js":
+/*!**************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/DocumentTextIcon.js ***!
+ \**************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction DocumentTextIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(DocumentTextIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/DocumentTextIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/ExclamationTriangleIcon.js":
+/*!*********************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/ExclamationTriangleIcon.js ***!
+ \*********************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ExclamationTriangleIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ExclamationTriangleIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/ExclamationTriangleIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/EyeIcon.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/EyeIcon.js ***!
+ \*****************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction EyeIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M2.036 12.322a1.012 1.012 0 0 1 0-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178Z\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(EyeIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/EyeIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/EyeSlashIcon.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/EyeSlashIcon.js ***!
+ \**********************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction EyeSlashIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M3.98 8.223A10.477 10.477 0 0 0 1.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.451 10.451 0 0 1 12 4.5c4.756 0 8.773 3.162 10.065 7.498a10.522 10.522 0 0 1-4.293 5.774M6.228 6.228 3 3m3.228 3.228 3.65 3.65m7.894 7.894L21 21m-3.228-3.228-3.65-3.65m0 0a3 3 0 1 0-4.243-4.243m4.242 4.242L9.88 9.88\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(EyeSlashIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/EyeSlashIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/FaceSmileIcon.js":
+/*!***********************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/FaceSmileIcon.js ***!
+ \***********************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction FaceSmileIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M15.182 15.182a4.5 4.5 0 0 1-6.364 0M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0ZM9.75 9.75c0 .414-.168.75-.375.75S9 10.164 9 9.75 9.168 9 9.375 9s.375.336.375.75Zm-.375 0h.008v.015h-.008V9.75Zm5.625 0c0 .414-.168.75-.375.75s-.375-.336-.375-.75.168-.75.375-.75.375.336.375.75Zm-.375 0h.008v.015h-.008V9.75Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(FaceSmileIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/FaceSmileIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/FireIcon.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/FireIcon.js ***!
+ \******************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction FireIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(FireIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/FireIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/FolderIcon.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/FolderIcon.js ***!
+ \********************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction FolderIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M2.25 12.75V12A2.25 2.25 0 0 1 4.5 9.75h15A2.25 2.25 0 0 1 21.75 12v.75m-8.69-6.44-2.12-2.12a1.5 1.5 0 0 0-1.061-.44H4.5A2.25 2.25 0 0 0 2.25 6v12a2.25 2.25 0 0 0 2.25 2.25h15A2.25 2.25 0 0 0 21.75 18V9a2.25 2.25 0 0 0-2.25-2.25h-5.379a1.5 1.5 0 0 1-1.06-.44Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(FolderIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/FolderIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/InboxIcon.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/InboxIcon.js ***!
+ \*******************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction InboxIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M2.25 13.5h3.86a2.25 2.25 0 0 1 2.012 1.244l.256.512a2.25 2.25 0 0 0 2.013 1.244h3.218a2.25 2.25 0 0 0 2.013-1.244l.256-.512a2.25 2.25 0 0 1 2.013-1.244h3.859m-19.5.338V18a2.25 2.25 0 0 0 2.25 2.25h15A2.25 2.25 0 0 0 21.75 18v-4.162c0-.224-.034-.447-.1-.661L19.24 5.338a2.25 2.25 0 0 0-2.15-1.588H6.911a2.25 2.25 0 0 0-2.15 1.588L2.35 13.177a2.25 2.25 0 0 0-.1.661Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(InboxIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/InboxIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/InformationCircleIcon.js":
+/*!*******************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/InformationCircleIcon.js ***!
+ \*******************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction InformationCircleIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(InformationCircleIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/InformationCircleIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/LightBulbIcon.js":
+/*!***********************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/LightBulbIcon.js ***!
+ \***********************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction LightBulbIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M12 18v-5.25m0 0a6.01 6.01 0 0 0 1.5-.189m-1.5.189a6.01 6.01 0 0 1-1.5-.189m3.75 7.478a12.06 12.06 0 0 1-4.5 0m3.75 2.383a14.406 14.406 0 0 1-3 0M14.25 18v-.192c0-.983.658-1.823 1.508-2.316a7.5 7.5 0 1 0-7.517 0c.85.493 1.509 1.333 1.509 2.316V18\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(LightBulbIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/LightBulbIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/MoonIcon.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/MoonIcon.js ***!
+ \******************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction MoonIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M21.752 15.002A9.72 9.72 0 0 1 18 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 0 0 3 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 0 0 9.002-5.998Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(MoonIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/MoonIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/PauseIcon.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/PauseIcon.js ***!
+ \*******************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction PauseIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M15.75 5.25v13.5m-7.5-13.5v13.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(PauseIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/PauseIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/PencilIcon.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/PencilIcon.js ***!
+ \********************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction PencilIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(PencilIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/PencilIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/PencilSquareIcon.js":
+/*!**************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/PencilSquareIcon.js ***!
+ \**************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction PencilSquareIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L10.582 16.07a4.5 4.5 0 0 1-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 0 1 1.13-1.897l8.932-8.931Zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0 1 15.75 21H5.25A2.25 2.25 0 0 1 3 18.75V8.25A2.25 2.25 0 0 1 5.25 6H10\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(PencilSquareIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/PencilSquareIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/PhotoIcon.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/PhotoIcon.js ***!
+ \*******************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction PhotoIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m2.25 15.75 5.159-5.159a2.25 2.25 0 0 1 3.182 0l5.159 5.159m-1.5-1.5 1.409-1.409a2.25 2.25 0 0 1 3.182 0l2.909 2.909m-18 3.75h16.5a1.5 1.5 0 0 0 1.5-1.5V6a1.5 1.5 0 0 0-1.5-1.5H3.75A1.5 1.5 0 0 0 2.25 6v12a1.5 1.5 0 0 0 1.5 1.5Zm10.5-11.25h.008v.008h-.008V8.25Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(PhotoIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/PhotoIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/PlayIcon.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/PlayIcon.js ***!
+ \******************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction PlayIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M5.25 5.653c0-.856.917-1.398 1.667-.986l11.54 6.347a1.125 1.125 0 0 1 0 1.972l-11.54 6.347a1.125 1.125 0 0 1-1.667-.986V5.653Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(PlayIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/PlayIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/PlusCircleIcon.js":
+/*!************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/PlusCircleIcon.js ***!
+ \************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction PlusCircleIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M12 9v6m3-3H9m12 0a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(PlusCircleIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/PlusCircleIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/PlusIcon.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/PlusIcon.js ***!
+ \******************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction PlusIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M12 4.5v15m7.5-7.5h-15\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(PlusIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/PlusIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/ShieldCheckIcon.js":
+/*!*************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/ShieldCheckIcon.js ***!
+ \*************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ShieldCheckIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M9 12.75 11.25 15 15 9.75m-3-7.036A11.959 11.959 0 0 1 3.598 6 11.99 11.99 0 0 0 3 9.749c0 5.592 3.824 10.29 9 11.623 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ShieldCheckIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/ShieldCheckIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/SparklesIcon.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/SparklesIcon.js ***!
+ \**********************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction SparklesIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M9.813 15.904 9 18.75l-.813-2.846a4.5 4.5 0 0 0-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 0 0 3.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 0 0 3.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 0 0-3.09 3.09ZM18.259 8.715 18 9.75l-.259-1.035a3.375 3.375 0 0 0-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 0 0 2.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 0 0 2.456 2.456L21.75 6l-1.035.259a3.375 3.375 0 0 0-2.456 2.456ZM16.894 20.567 16.5 21.75l-.394-1.183a2.25 2.25 0 0 0-1.423-1.423L13.5 18.75l1.183-.394a2.25 2.25 0 0 0 1.423-1.423l.394-1.183.394 1.183a2.25 2.25 0 0 0 1.423 1.423l1.183.394-1.183.394a2.25 2.25 0 0 0-1.423 1.423Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(SparklesIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/SparklesIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/Squares2X2Icon.js":
+/*!************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/Squares2X2Icon.js ***!
+ \************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction Squares2X2Icon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M3.75 6A2.25 2.25 0 0 1 6 3.75h2.25A2.25 2.25 0 0 1 10.5 6v2.25a2.25 2.25 0 0 1-2.25 2.25H6a2.25 2.25 0 0 1-2.25-2.25V6ZM3.75 15.75A2.25 2.25 0 0 1 6 13.5h2.25a2.25 2.25 0 0 1 2.25 2.25V18a2.25 2.25 0 0 1-2.25 2.25H6A2.25 2.25 0 0 1 3.75 18v-2.25ZM13.5 6a2.25 2.25 0 0 1 2.25-2.25H18A2.25 2.25 0 0 1 20.25 6v2.25A2.25 2.25 0 0 1 18 10.5h-2.25a2.25 2.25 0 0 1-2.25-2.25V6ZM13.5 15.75a2.25 2.25 0 0 1 2.25-2.25H18a2.25 2.25 0 0 1 2.25 2.25V18A2.25 2.25 0 0 1 18 20.25h-2.25A2.25 2.25 0 0 1 13.5 18v-2.25Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(Squares2X2Icon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/Squares2X2Icon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/SunIcon.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/SunIcon.js ***!
+ \*****************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction SunIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M12 3v2.25m6.364.386-1.591 1.591M21 12h-2.25m-.386 6.364-1.591-1.591M12 18.75V21m-4.773-4.227-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(SunIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/SunIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/TagIcon.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/TagIcon.js ***!
+ \*****************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction TagIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M9.568 3H5.25A2.25 2.25 0 0 0 3 5.25v4.318c0 .597.237 1.17.659 1.591l9.581 9.581c.699.699 1.78.872 2.607.33a18.095 18.095 0 0 0 5.223-5.223c.542-.827.369-1.908-.33-2.607L11.16 3.66A2.25 2.25 0 0 0 9.568 3Z\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M6 6h.008v.008H6V6Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(TagIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/TagIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/TrashIcon.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/TrashIcon.js ***!
+ \*******************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction TrashIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(TrashIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/TrashIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/TrophyIcon.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/TrophyIcon.js ***!
+ \********************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction TrophyIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M16.5 18.75h-9m9 0a3 3 0 0 1 3 3h-15a3 3 0 0 1 3-3m9 0v-3.375c0-.621-.503-1.125-1.125-1.125h-.871M7.5 18.75v-3.375c0-.621.504-1.125 1.125-1.125h.872m5.007 0H9.497m5.007 0a7.454 7.454 0 0 1-.982-3.172M9.497 14.25a7.454 7.454 0 0 0 .981-3.172M5.25 4.236c-.982.143-1.954.317-2.916.52A6.003 6.003 0 0 0 7.73 9.728M5.25 4.236V4.5c0 2.108.966 3.99 2.48 5.228M5.25 4.236V2.721C7.456 2.41 9.71 2.25 12 2.25c2.291 0 4.545.16 6.75.47v1.516M7.73 9.728a6.726 6.726 0 0 0 2.748 1.35m8.272-6.842V4.5c0 2.108-.966 3.99-2.48 5.228m2.48-5.492a46.32 46.32 0 0 1 2.916.52 6.003 6.003 0 0 1-5.395 4.972m0 0a6.726 6.726 0 0 1-2.749 1.35m0 0a6.772 6.772 0 0 1-3.044 0\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(TrophyIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/TrophyIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/UserIcon.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/UserIcon.js ***!
+ \******************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction UserIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M15.75 6a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0ZM4.501 20.118a7.5 7.5 0 0 1 14.998 0A17.933 17.933 0 0 1 12 21.75c-2.676 0-5.216-.584-7.499-1.632Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(UserIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/UserIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/outline/esm/XMarkIcon.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/outline/esm/XMarkIcon.js ***!
+ \*******************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction XMarkIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M6 18 18 6M6 6l12 12\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(XMarkIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/outline/esm/XMarkIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/solid/esm/Bars3Icon.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/solid/esm/Bars3Icon.js ***!
+ \*****************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction Bars3Icon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M3 6.75A.75.75 0 0 1 3.75 6h16.5a.75.75 0 0 1 0 1.5H3.75A.75.75 0 0 1 3 6.75ZM3 12a.75.75 0 0 1 .75-.75h16.5a.75.75 0 0 1 0 1.5H3.75A.75.75 0 0 1 3 12Zm0 5.25a.75.75 0 0 1 .75-.75h16.5a.75.75 0 0 1 0 1.5H3.75a.75.75 0 0 1-.75-.75Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(Bars3Icon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/Bars3Icon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/solid/esm/BookOpenIcon.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/solid/esm/BookOpenIcon.js ***!
+ \********************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction BookOpenIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n d: \"M11.25 4.533A9.707 9.707 0 0 0 6 3a9.735 9.735 0 0 0-3.25.555.75.75 0 0 0-.5.707v14.25a.75.75 0 0 0 1 .707A8.237 8.237 0 0 1 6 18.75c1.995 0 3.823.707 5.25 1.886V4.533ZM12.75 20.636A8.214 8.214 0 0 1 18 18.75c.966 0 1.89.166 2.75.47a.75.75 0 0 0 1-.708V4.262a.75.75 0 0 0-.5-.707A9.735 9.735 0 0 0 18 3a9.707 9.707 0 0 0-5.25 1.533v16.103Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(BookOpenIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/BookOpenIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/solid/esm/CalendarDaysIcon.js":
+/*!************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/solid/esm/CalendarDaysIcon.js ***!
+ \************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction CalendarDaysIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n d: \"M12.75 12.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0ZM7.5 15.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5ZM8.25 17.25a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0ZM9.75 15.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5ZM10.5 17.25a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0ZM12 15.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5ZM12.75 17.25a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0ZM14.25 15.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5ZM15 17.25a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0ZM16.5 15.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5ZM15 12.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0ZM16.5 13.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M6.75 2.25A.75.75 0 0 1 7.5 3v1.5h9V3A.75.75 0 0 1 18 3v1.5h.75a3 3 0 0 1 3 3v11.25a3 3 0 0 1-3 3H5.25a3 3 0 0 1-3-3V7.5a3 3 0 0 1 3-3H6V3a.75.75 0 0 1 .75-.75Zm13.5 9a1.5 1.5 0 0 0-1.5-1.5H5.25a1.5 1.5 0 0 0-1.5 1.5v7.5a1.5 1.5 0 0 0 1.5 1.5h13.5a1.5 1.5 0 0 0 1.5-1.5v-7.5Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(CalendarDaysIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/CalendarDaysIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/solid/esm/CalendarIcon.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/solid/esm/CalendarIcon.js ***!
+ \********************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction CalendarIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M6.75 2.25A.75.75 0 0 1 7.5 3v1.5h9V3A.75.75 0 0 1 18 3v1.5h.75a3 3 0 0 1 3 3v11.25a3 3 0 0 1-3 3H5.25a3 3 0 0 1-3-3V7.5a3 3 0 0 1 3-3H6V3a.75.75 0 0 1 .75-.75Zm13.5 9a1.5 1.5 0 0 0-1.5-1.5H5.25a1.5 1.5 0 0 0-1.5 1.5v7.5a1.5 1.5 0 0 0 1.5 1.5h13.5a1.5 1.5 0 0 0 1.5-1.5v-7.5Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(CalendarIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/CalendarIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/solid/esm/CheckCircleIcon.js":
+/*!***********************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/solid/esm/CheckCircleIcon.js ***!
+ \***********************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction CheckCircleIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(CheckCircleIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/CheckCircleIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/solid/esm/CheckIcon.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/solid/esm/CheckIcon.js ***!
+ \*****************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction CheckIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M19.916 4.626a.75.75 0 0 1 .208 1.04l-9 13.5a.75.75 0 0 1-1.154.114l-6-6a.75.75 0 0 1 1.06-1.06l5.353 5.353 8.493-12.74a.75.75 0 0 1 1.04-.207Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(CheckIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/CheckIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/solid/esm/ClockIcon.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/solid/esm/ClockIcon.js ***!
+ \*****************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ClockIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25ZM12.75 6a.75.75 0 0 0-1.5 0v6c0 .414.336.75.75.75h4.5a.75.75 0 0 0 0-1.5h-3.75V6Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ClockIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/ClockIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/solid/esm/DocumentTextIcon.js":
+/*!************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/solid/esm/DocumentTextIcon.js ***!
+ \************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction DocumentTextIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0 0 16.5 9h-1.875a1.875 1.875 0 0 1-1.875-1.875V5.25A3.75 3.75 0 0 0 9 1.5H5.625ZM7.5 15a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 7.5 15Zm.75 2.25a.75.75 0 0 0 0 1.5H12a.75.75 0 0 0 0-1.5H8.25Z\",\n clipRule: \"evenodd\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n d: \"M12.971 1.816A5.23 5.23 0 0 1 14.25 5.25v1.875c0 .207.168.375.375.375H16.5a5.23 5.23 0 0 1 3.434 1.279 9.768 9.768 0 0 0-6.963-6.963Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(DocumentTextIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/DocumentTextIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/solid/esm/EllipsisVerticalIcon.js":
+/*!****************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/solid/esm/EllipsisVerticalIcon.js ***!
+ \****************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction EllipsisVerticalIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M10.5 6a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0Zm0 6a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0Zm0 6a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(EllipsisVerticalIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/EllipsisVerticalIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/solid/esm/FolderIcon.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/solid/esm/FolderIcon.js ***!
+ \******************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction FolderIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n d: \"M19.5 21a3 3 0 0 0 3-3v-4.5a3 3 0 0 0-3-3h-15a3 3 0 0 0-3 3V18a3 3 0 0 0 3 3h15ZM1.5 10.146V6a3 3 0 0 1 3-3h5.379a2.25 2.25 0 0 1 1.59.659l2.122 2.121c.14.141.331.22.53.22H19.5a3 3 0 0 1 3 3v1.146A4.483 4.483 0 0 0 19.5 9h-15a4.483 4.483 0 0 0-3 1.146Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(FolderIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/FolderIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/solid/esm/InboxIcon.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/solid/esm/InboxIcon.js ***!
+ \*****************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction InboxIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M6.912 3a3 3 0 0 0-2.868 2.118l-2.411 7.838a3 3 0 0 0-.133.882V18a3 3 0 0 0 3 3h15a3 3 0 0 0 3-3v-4.162c0-.299-.045-.596-.133-.882l-2.412-7.838A3 3 0 0 0 17.088 3H6.912Zm13.823 9.75-2.213-7.191A1.5 1.5 0 0 0 17.088 4.5H6.912a1.5 1.5 0 0 0-1.434 1.059L3.265 12.75H6.11a3 3 0 0 1 2.684 1.658l.256.513a1.5 1.5 0 0 0 1.342.829h3.218a1.5 1.5 0 0 0 1.342-.83l.256-.512a3 3 0 0 1 2.684-1.658h2.844Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(InboxIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/InboxIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/solid/esm/InformationCircleIcon.js":
+/*!*****************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/solid/esm/InformationCircleIcon.js ***!
+ \*****************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction InformationCircleIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm8.706-1.442c1.146-.573 2.437.463 2.126 1.706l-.709 2.836.042-.02a.75.75 0 0 1 .67 1.34l-.04.022c-1.147.573-2.438-.463-2.127-1.706l.71-2.836-.042.02a.75.75 0 1 1-.671-1.34l.041-.022ZM12 9a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(InformationCircleIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/InformationCircleIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/solid/esm/ListBulletIcon.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/solid/esm/ListBulletIcon.js ***!
+ \**********************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction ListBulletIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M2.625 6.75a1.125 1.125 0 1 1 2.25 0 1.125 1.125 0 0 1-2.25 0Zm4.875 0A.75.75 0 0 1 8.25 6h12a.75.75 0 0 1 0 1.5h-12a.75.75 0 0 1-.75-.75ZM2.625 12a1.125 1.125 0 1 1 2.25 0 1.125 1.125 0 0 1-2.25 0ZM7.5 12a.75.75 0 0 1 .75-.75h12a.75.75 0 0 1 0 1.5h-12A.75.75 0 0 1 7.5 12Zm-4.875 5.25a1.125 1.125 0 1 1 2.25 0 1.125 1.125 0 0 1-2.25 0Zm4.875 0a.75.75 0 0 1 .75-.75h12a.75.75 0 0 1 0 1.5h-12a.75.75 0 0 1-.75-.75Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(ListBulletIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/ListBulletIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/solid/esm/MagnifyingGlassIcon.js":
+/*!***************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/solid/esm/MagnifyingGlassIcon.js ***!
+ \***************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction MagnifyingGlassIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M10.5 3.75a6.75 6.75 0 1 0 0 13.5 6.75 6.75 0 0 0 0-13.5ZM2.25 10.5a8.25 8.25 0 1 1 14.59 5.28l4.69 4.69a.75.75 0 1 1-1.06 1.06l-4.69-4.69A8.25 8.25 0 0 1 2.25 10.5Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(MagnifyingGlassIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/MagnifyingGlassIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/solid/esm/PencilSquareIcon.js":
+/*!************************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/solid/esm/PencilSquareIcon.js ***!
+ \************************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction PencilSquareIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n d: \"M21.731 2.269a2.625 2.625 0 0 0-3.712 0l-1.157 1.157 3.712 3.712 1.157-1.157a2.625 2.625 0 0 0 0-3.712ZM19.513 8.199l-3.712-3.712-8.4 8.4a5.25 5.25 0 0 0-1.32 2.214l-.8 2.685a.75.75 0 0 0 .933.933l2.685-.8a5.25 5.25 0 0 0 2.214-1.32l8.4-8.4Z\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n d: \"M5.25 5.25a3 3 0 0 0-3 3v10.5a3 3 0 0 0 3 3h10.5a3 3 0 0 0 3-3V13.5a.75.75 0 0 0-1.5 0v5.25a1.5 1.5 0 0 1-1.5 1.5H5.25a1.5 1.5 0 0 1-1.5-1.5V8.25a1.5 1.5 0 0 1 1.5-1.5h5.25a.75.75 0 0 0 0-1.5H5.25Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(PencilSquareIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/PencilSquareIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/solid/esm/Squares2X2Icon.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/solid/esm/Squares2X2Icon.js ***!
+ \**********************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction Squares2X2Icon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M3 6a3 3 0 0 1 3-3h2.25a3 3 0 0 1 3 3v2.25a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3V6Zm9.75 0a3 3 0 0 1 3-3H18a3 3 0 0 1 3 3v2.25a3 3 0 0 1-3 3h-2.25a3 3 0 0 1-3-3V6ZM3 15.75a3 3 0 0 1 3-3h2.25a3 3 0 0 1 3 3V18a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3v-2.25Zm9.75 0a3 3 0 0 1 3-3H18a3 3 0 0 1 3 3V18a3 3 0 0 1-3 3h-2.25a3 3 0 0 1-3-3v-2.25Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(Squares2X2Icon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/Squares2X2Icon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/solid/esm/TagIcon.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/solid/esm/TagIcon.js ***!
+ \***************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction TagIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M5.25 2.25a3 3 0 0 0-3 3v4.318a3 3 0 0 0 .879 2.121l9.58 9.581c.92.92 2.39 1.186 3.548.428a18.849 18.849 0 0 0 5.441-5.44c.758-1.16.492-2.629-.428-3.548l-9.58-9.581a3 3 0 0 0-2.122-.879H5.25ZM6.375 7.5a1.125 1.125 0 1 0 0-2.25 1.125 1.125 0 0 0 0 2.25Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(TagIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/TagIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/solid/esm/TrashIcon.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/solid/esm/TrashIcon.js ***!
+ \*****************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction TrashIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M16.5 4.478v.227a48.816 48.816 0 0 1 3.878.512.75.75 0 1 1-.256 1.478l-.209-.035-1.005 13.07a3 3 0 0 1-2.991 2.77H8.084a3 3 0 0 1-2.991-2.77L4.087 6.66l-.209.035a.75.75 0 0 1-.256-1.478A48.567 48.567 0 0 1 7.5 4.705v-.227c0-1.564 1.213-2.9 2.816-2.951a52.662 52.662 0 0 1 3.369 0c1.603.051 2.815 1.387 2.815 2.951Zm-6.136-1.452a51.196 51.196 0 0 1 3.273 0C14.39 3.05 15 3.684 15 4.478v.113a49.488 49.488 0 0 0-6 0v-.113c0-.794.609-1.428 1.364-1.452Zm-.355 5.945a.75.75 0 1 0-1.5.058l.347 9a.75.75 0 1 0 1.499-.058l-.346-9Zm5.48.058a.75.75 0 1 0-1.498-.058l-.347 9a.75.75 0 0 0 1.5.058l.345-9Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(TrashIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/TrashIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@heroicons/react/24/solid/esm/UserIcon.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/@heroicons/react/24/solid/esm/UserIcon.js ***!
+ \****************************************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n\nfunction UserIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M7.5 6a4.5 4.5 0 1 1 9 0 4.5 4.5 0 0 1-9 0ZM3.751 20.105a8.25 8.25 0 0 1 16.498 0 .75.75 0 0 1-.437.695A18.683 18.683 0 0 1 12 22.5c-2.786 0-5.433-.608-7.812-1.7a.75.75 0 0 1-.437-.695Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(UserIcon);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ForwardRef);\n\n//# sourceURL=webpack://tududi/./node_modules/@heroicons/react/24/solid/esm/UserIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@pmmmwh/react-refresh-webpack-plugin/client/ErrorOverlayEntry.js?sockHost=0.0.0.0&sockPort=8080&sockProtocol=http":
+/*!****************************************************************************************************************************************!*\
+ !*** ./node_modules/@pmmmwh/react-refresh-webpack-plugin/client/ErrorOverlayEntry.js?sockHost=0.0.0.0&sockPort=8080&sockProtocol=http ***!
+ \****************************************************************************************************************************************/
+/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
+
+eval("var __resourceQuery = \"?sockHost=0.0.0.0&sockPort=8080&sockProtocol=http\";\n/* provided dependency */ var __react_refresh_error_overlay__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js\");\n/* provided dependency */ var __react_refresh_socket__ = __webpack_require__(/*! ./node_modules/@pmmmwh/react-refresh-webpack-plugin/sockets/WDSSocket.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/sockets/WDSSocket.js\");\n/* global __react_refresh_error_overlay__, __react_refresh_socket__, __resourceQuery */\n\nconst events = __webpack_require__(/*! ./utils/errorEventHandlers.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/client/utils/errorEventHandlers.js\");\nconst formatWebpackErrors = __webpack_require__(/*! ./utils/formatWebpackErrors.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/client/utils/formatWebpackErrors.js\");\nconst runWithPatchedUrl = __webpack_require__(/*! ./utils/patchUrl.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/client/utils/patchUrl.js\");\nconst runWithRetry = __webpack_require__(/*! ./utils/retry.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/client/utils/retry.js\");\n\n// Setup error states\nlet isHotReload = false;\nlet hasRuntimeErrors = false;\n\n/**\n * Try dismissing the compile error overlay.\n * This will also reset runtime error records (if any),\n * because we have new source to evaluate.\n * @returns {void}\n */\nfunction tryDismissErrorOverlay() {\n __react_refresh_error_overlay__.clearCompileError();\n __react_refresh_error_overlay__.clearRuntimeErrors(!hasRuntimeErrors);\n hasRuntimeErrors = false;\n}\n\n/**\n * A function called after a compile success signal is received from Webpack.\n * @returns {void}\n */\nfunction handleCompileSuccess() {\n isHotReload = true;\n\n if (isHotReload) {\n tryDismissErrorOverlay();\n }\n}\n\n/**\n * A function called after a compile errored signal is received from Webpack.\n * @param {string[]} errors\n * @returns {void}\n */\nfunction handleCompileErrors(errors) {\n isHotReload = true;\n\n const formattedErrors = formatWebpackErrors(errors);\n\n // Only show the first error\n __react_refresh_error_overlay__.showCompileError(formattedErrors[0]);\n}\n\n/**\n * Handles compilation messages from Webpack.\n * Integrates with a compile error overlay.\n * @param {*} message A Webpack HMR message sent via WebSockets.\n * @returns {void}\n */\nfunction compileMessageHandler(message) {\n switch (message.type) {\n case 'ok':\n case 'still-ok':\n case 'warnings': {\n // TODO: Implement handling for warnings\n handleCompileSuccess();\n break;\n }\n case 'errors': {\n handleCompileErrors(message.data);\n break;\n }\n default: {\n // Do nothing.\n }\n }\n}\n\nif (true) {\n if (typeof window !== 'undefined') {\n runWithPatchedUrl(function setupOverlay() {\n // Only register if no other overlay have been registered\n if (!window.__reactRefreshOverlayInjected && __react_refresh_socket__) {\n // Registers handlers for compile errors with retry -\n // This is to prevent mismatching injection order causing errors to be thrown\n runWithRetry(function initSocket() {\n __react_refresh_socket__.init(compileMessageHandler, __resourceQuery);\n }, 3);\n // Registers handlers for runtime errors\n events.handleError(function handleError(error) {\n hasRuntimeErrors = true;\n __react_refresh_error_overlay__.handleRuntimeError(error);\n });\n events.handleUnhandledRejection(function handleUnhandledPromiseRejection(error) {\n hasRuntimeErrors = true;\n __react_refresh_error_overlay__.handleRuntimeError(error);\n });\n\n // Mark overlay as injected to prevent double-injection\n window.__reactRefreshOverlayInjected = true;\n }\n });\n }\n}\n\n\n//# sourceURL=webpack://tududi/./node_modules/@pmmmwh/react-refresh-webpack-plugin/client/ErrorOverlayEntry.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@pmmmwh/react-refresh-webpack-plugin/client/ReactRefreshEntry.js":
+/*!***************************************************************************************!*\
+ !*** ./node_modules/@pmmmwh/react-refresh-webpack-plugin/client/ReactRefreshEntry.js ***!
+ \***************************************************************************************/
+/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
+
+eval("/* global __react_refresh_library__ */\n\nconst safeThis = __webpack_require__(/*! core-js-pure/features/global-this */ \"./node_modules/core-js-pure/features/global-this.js\");\nconst RefreshRuntime = __webpack_require__(/*! react-refresh/runtime */ \"./node_modules/react-refresh/runtime.js\");\n\nif (true) {\n if (typeof safeThis !== 'undefined') {\n var $RefreshInjected$ = '__reactRefreshInjected';\n // Namespace the injected flag (if necessary) for monorepo compatibility\n if (false) // removed by dead control flow\n{}\n\n // Only inject the runtime if it hasn't been injected\n if (!safeThis[$RefreshInjected$]) {\n // Inject refresh runtime into global scope\n RefreshRuntime.injectIntoGlobalHook(safeThis);\n\n // Mark the runtime as injected to prevent double-injection\n safeThis[$RefreshInjected$] = true;\n }\n }\n}\n\n\n//# sourceURL=webpack://tududi/./node_modules/@pmmmwh/react-refresh-webpack-plugin/client/ReactRefreshEntry.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@pmmmwh/react-refresh-webpack-plugin/client/utils/errorEventHandlers.js":
+/*!**********************************************************************************************!*\
+ !*** ./node_modules/@pmmmwh/react-refresh-webpack-plugin/client/utils/errorEventHandlers.js ***!
+ \**********************************************************************************************/
+/***/ ((module) => {
+
+eval("/**\n * @callback EventCallback\n * @param {string | Error | null} context\n * @returns {void}\n */\n/**\n * @callback EventHandler\n * @param {Event} event\n * @returns {void}\n */\n\n/**\n * A function that creates an event handler for the `error` event.\n * @param {EventCallback} callback A function called to handle the error context.\n * @returns {EventHandler} A handler for the `error` event.\n */\nfunction createErrorHandler(callback) {\n return function errorHandler(event) {\n if (!event || !event.error) {\n return callback(null);\n }\n if (event.error instanceof Error) {\n return callback(event.error);\n }\n // A non-error was thrown, we don't have a trace. :(\n // Look in your browser's devtools for more information\n return callback(new Error(event.error));\n };\n}\n\n/**\n * A function that creates an event handler for the `unhandledrejection` event.\n * @param {EventCallback} callback A function called to handle the error context.\n * @returns {EventHandler} A handler for the `unhandledrejection` event.\n */\nfunction createRejectionHandler(callback) {\n return function rejectionHandler(event) {\n if (!event || !event.reason) {\n return callback(new Error('Unknown'));\n }\n if (event.reason instanceof Error) {\n return callback(event.reason);\n }\n // A non-error was rejected, we don't have a trace :(\n // Look in your browser's devtools for more information\n return callback(new Error(event.reason));\n };\n}\n\n/**\n * Creates a handler that registers an EventListener on window for a valid type\n * and calls a callback when the event fires.\n * @param {string} eventType A valid DOM event type.\n * @param {function(EventCallback): EventHandler} createHandler A function that creates an event handler.\n * @returns {register} A function that registers the EventListener given a callback.\n */\nfunction createWindowEventHandler(eventType, createHandler) {\n /**\n * @type {EventHandler | null} A cached event handler function.\n */\n let eventHandler = null;\n\n /**\n * Unregisters an EventListener if it has been registered.\n * @returns {void}\n */\n function unregister() {\n if (eventHandler === null) {\n return;\n }\n window.removeEventListener(eventType, eventHandler);\n eventHandler = null;\n }\n\n /**\n * Registers an EventListener if it hasn't been registered.\n * @param {EventCallback} callback A function called after the event handler to handle its context.\n * @returns {unregister | void} A function to unregister the registered EventListener if registration is performed.\n */\n function register(callback) {\n if (eventHandler !== null) {\n return;\n }\n eventHandler = createHandler(callback);\n window.addEventListener(eventType, eventHandler);\n\n return unregister;\n }\n\n return register;\n}\n\nconst handleError = createWindowEventHandler('error', createErrorHandler);\nconst handleUnhandledRejection = createWindowEventHandler(\n 'unhandledrejection',\n createRejectionHandler\n);\n\nmodule.exports = {\n handleError: handleError,\n handleUnhandledRejection: handleUnhandledRejection,\n};\n\n\n//# sourceURL=webpack://tududi/./node_modules/@pmmmwh/react-refresh-webpack-plugin/client/utils/errorEventHandlers.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@pmmmwh/react-refresh-webpack-plugin/client/utils/formatWebpackErrors.js":
+/*!***********************************************************************************************!*\
+ !*** ./node_modules/@pmmmwh/react-refresh-webpack-plugin/client/utils/formatWebpackErrors.js ***!
+ \***********************************************************************************************/
+/***/ ((module) => {
+
+eval("/**\n * @typedef {Object} WebpackErrorObj\n * @property {string} moduleIdentifier\n * @property {string} moduleName\n * @property {string} message\n */\n\nconst friendlySyntaxErrorLabel = 'Syntax error:';\n\n/**\n * Checks if the error message is for a syntax error.\n * @param {string} message The raw Webpack error message.\n * @returns {boolean} Whether the error message is for a syntax error.\n */\nfunction isLikelyASyntaxError(message) {\n return message.indexOf(friendlySyntaxErrorLabel) !== -1;\n}\n\n/**\n * Cleans up Webpack error messages.\n *\n * This implementation is based on the one from [create-react-app](https://github.com/facebook/create-react-app/blob/edc671eeea6b7d26ac3f1eb2050e50f75cf9ad5d/packages/react-dev-utils/formatWebpackMessages.js).\n * @param {string} message The raw Webpack error message.\n * @returns {string} The formatted Webpack error message.\n */\nfunction formatMessage(message) {\n let lines = message.split('\\n');\n\n // Strip Webpack-added headers off errors/warnings\n // https://github.com/webpack/webpack/blob/master/lib/ModuleError.js\n lines = lines.filter(function (line) {\n return !/Module [A-z ]+\\(from/.test(line);\n });\n\n // Remove leading newline\n if (lines.length > 2 && lines[1].trim() === '') {\n lines.splice(1, 1);\n }\n\n // Remove duplicated newlines\n lines = lines.filter(function (line, index, arr) {\n return index === 0 || line.trim() !== '' || line.trim() !== arr[index - 1].trim();\n });\n\n // Clean up the file name\n lines[0] = lines[0].replace(/^(.*) \\d+:\\d+-\\d+$/, '$1');\n\n // Cleans up verbose \"module not found\" messages for files and packages.\n if (lines[1] && lines[1].indexOf('Module not found: ') === 0) {\n lines = [\n lines[0],\n lines[1]\n .replace('Error: ', '')\n .replace('Module not found: Cannot find file:', 'Cannot find file:'),\n ];\n }\n\n message = lines.join('\\n');\n\n // Clean up syntax errors\n message = message.replace('SyntaxError:', friendlySyntaxErrorLabel);\n\n // Internal stacks are generally useless, so we strip them -\n // except the stacks containing `webpack:`,\n // because they're normally from user code generated by webpack.\n message = message.replace(/^\\s*at\\s((?!webpack:).)*:\\d+:\\d+[\\s)]*(\\n|$)/gm, ''); // at ... ...:x:y\n message = message.replace(/^\\s*at\\s((?!webpack:).)*[\\s)]*(\\n|$)/gm, ''); // at ... \n message = message.replace(/^\\s*at\\s(\\n|$)/gm, ''); // at \n\n return message.trim();\n}\n\n/**\n * Formats Webpack error messages into a more readable format.\n * @param {Array} errors An array of Webpack error messages.\n * @returns {string[]} The formatted Webpack error messages.\n */\nfunction formatWebpackErrors(errors) {\n let formattedErrors = errors.map(function (errorObjOrMessage) {\n // Webpack 5 compilation errors are in the form of descriptor objects,\n // so we have to join pieces to get the format we want.\n if (typeof errorObjOrMessage === 'object') {\n return formatMessage([errorObjOrMessage.moduleName, errorObjOrMessage.message].join('\\n'));\n }\n // Webpack 4 compilation errors are strings\n return formatMessage(errorObjOrMessage);\n });\n\n if (formattedErrors.some(isLikelyASyntaxError)) {\n // If there are any syntax errors, show just them.\n formattedErrors = formattedErrors.filter(isLikelyASyntaxError);\n }\n return formattedErrors;\n}\n\nmodule.exports = formatWebpackErrors;\n\n\n//# sourceURL=webpack://tududi/./node_modules/@pmmmwh/react-refresh-webpack-plugin/client/utils/formatWebpackErrors.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@pmmmwh/react-refresh-webpack-plugin/client/utils/patchUrl.js":
+/*!************************************************************************************!*\
+ !*** ./node_modules/@pmmmwh/react-refresh-webpack-plugin/client/utils/patchUrl.js ***!
+ \************************************************************************************/
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+eval("/* global __react_refresh_polyfill_url__ */\n\n/**\n * @typedef {Object} UrlAPIs\n * @property {typeof URL} URL\n * @property {typeof URLSearchParams} URLSearchParams\n */\n\n/**\n * Runs a callback with patched the DOM URL APIs.\n * @param {function(UrlAPIs): void} callback The code to run with patched URL globals.\n * @returns {void}\n */\nfunction runWithPatchedUrl(callback) {\n var __originalURL;\n var __originalURLSearchParams;\n\n // Polyfill the DOM URL and URLSearchParams constructors\n if ( false || !window.URL) {\n __originalURL = window.URL;\n window.URL = __webpack_require__(/*! core-js-pure/web/url */ \"./node_modules/core-js-pure/web/url.js\");\n }\n if ( false || !window.URLSearchParams) {\n __originalURLSearchParams = window.URLSearchParams;\n window.URLSearchParams = __webpack_require__(/*! core-js-pure/web/url-search-params */ \"./node_modules/core-js-pure/web/url-search-params.js\");\n }\n\n // Pass in URL APIs in case they are needed\n callback({ URL: window.URL, URLSearchParams: window.URLSearchParams });\n\n // Restore polyfill-ed APIs to their original state\n if (__originalURL) {\n window.URL = __originalURL;\n }\n if (__originalURLSearchParams) {\n window.URLSearchParams = __originalURLSearchParams;\n }\n}\n\nmodule.exports = runWithPatchedUrl;\n\n\n//# sourceURL=webpack://tududi/./node_modules/@pmmmwh/react-refresh-webpack-plugin/client/utils/patchUrl.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@pmmmwh/react-refresh-webpack-plugin/client/utils/retry.js":
+/*!*********************************************************************************!*\
+ !*** ./node_modules/@pmmmwh/react-refresh-webpack-plugin/client/utils/retry.js ***!
+ \*********************************************************************************/
+/***/ ((module) => {
+
+eval("function runWithRetry(callback, maxRetries) {\n function executeWithRetryAndTimeout(currentCount) {\n try {\n if (currentCount > maxRetries - 1) {\n console.warn('[React Refresh] Failed to set up the socket connection.');\n return;\n }\n\n callback();\n } catch (err) {\n setTimeout(\n function () {\n executeWithRetryAndTimeout(currentCount + 1);\n },\n Math.pow(10, currentCount)\n );\n }\n }\n\n executeWithRetryAndTimeout(0);\n}\n\nmodule.exports = runWithRetry;\n\n\n//# sourceURL=webpack://tududi/./node_modules/@pmmmwh/react-refresh-webpack-plugin/client/utils/retry.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js":
+/*!***************************************************************************************!*\
+ !*** ./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js ***!
+ \***************************************************************************************/
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+eval("/* global __webpack_require__ */\nvar Refresh = __webpack_require__(/*! react-refresh/runtime */ \"./node_modules/react-refresh/runtime.js\");\n\n/**\n * Extracts exports from a webpack module object.\n * @param {string} moduleId A Webpack module ID.\n * @returns {*} An exports object from the module.\n */\nfunction getModuleExports(moduleId) {\n if (typeof moduleId === 'undefined') {\n // `moduleId` is unavailable, which indicates that this module is not in the cache,\n // which means we won't be able to capture any exports,\n // and thus they cannot be refreshed safely.\n // These are likely runtime or dynamically generated modules.\n return {};\n }\n\n var maybeModule = __webpack_require__.c[moduleId];\n if (typeof maybeModule === 'undefined') {\n // `moduleId` is available but the module in cache is unavailable,\n // which indicates the module is somehow corrupted (e.g. broken Webpacak `module` globals).\n // We will warn the user (as this is likely a mistake) and assume they cannot be refreshed.\n console.warn('[React Refresh] Failed to get exports for module: ' + moduleId + '.');\n return {};\n }\n\n var exportsOrPromise = maybeModule.exports;\n if (typeof Promise !== 'undefined' && exportsOrPromise instanceof Promise) {\n return exportsOrPromise.then(function (exports) {\n return exports;\n });\n }\n return exportsOrPromise;\n}\n\n/**\n * Calculates the signature of a React refresh boundary.\n * If this signature changes, it's unsafe to accept the boundary.\n *\n * This implementation is based on the one in [Metro](https://github.com/facebook/metro/blob/907d6af22ac6ebe58572be418e9253a90665ecbd/packages/metro/src/lib/polyfills/require.js#L795-L816).\n * @param {*} moduleExports A Webpack module exports object.\n * @returns {string[]} A React refresh boundary signature array.\n */\nfunction getReactRefreshBoundarySignature(moduleExports) {\n var signature = [];\n signature.push(Refresh.getFamilyByType(moduleExports));\n\n if (moduleExports == null || typeof moduleExports !== 'object') {\n // Exit if we can't iterate over exports.\n return signature;\n }\n\n for (var key in moduleExports) {\n if (key === '__esModule') {\n continue;\n }\n\n signature.push(key);\n signature.push(Refresh.getFamilyByType(moduleExports[key]));\n }\n\n return signature;\n}\n\n/**\n * Creates a data object to be retained across refreshes.\n * This object should not transtively reference previous exports,\n * which can form infinite chain of objects across refreshes, which can pressure RAM.\n *\n * @param {*} moduleExports A Webpack module exports object.\n * @returns {*} A React refresh boundary signature array.\n */\nfunction getWebpackHotData(moduleExports) {\n return {\n signature: getReactRefreshBoundarySignature(moduleExports),\n isReactRefreshBoundary: isReactRefreshBoundary(moduleExports),\n };\n}\n\n/**\n * Creates a helper that performs a delayed React refresh.\n * @returns {function(function(): void): void} A debounced React refresh function.\n */\nfunction createDebounceUpdate() {\n /**\n * A cached setTimeout handler.\n * @type {number | undefined}\n */\n var refreshTimeout;\n\n /**\n * Performs react refresh on a delay and clears the error overlay.\n * @param {function(): void} callback\n * @returns {void}\n */\n function enqueueUpdate(callback) {\n if (typeof refreshTimeout === 'undefined') {\n refreshTimeout = setTimeout(function () {\n refreshTimeout = undefined;\n Refresh.performReactRefresh();\n callback();\n }, 30);\n }\n }\n\n return enqueueUpdate;\n}\n\n/**\n * Checks if all exports are likely a React component.\n *\n * This implementation is based on the one in [Metro](https://github.com/facebook/metro/blob/febdba2383113c88296c61e28e4ef6a7f4939fda/packages/metro/src/lib/polyfills/require.js#L748-L774).\n * @param {*} moduleExports A Webpack module exports object.\n * @returns {boolean} Whether the exports are React component like.\n */\nfunction isReactRefreshBoundary(moduleExports) {\n if (Refresh.isLikelyComponentType(moduleExports)) {\n return true;\n }\n if (moduleExports === undefined || moduleExports === null || typeof moduleExports !== 'object') {\n // Exit if we can't iterate over exports.\n return false;\n }\n\n var hasExports = false;\n var areAllExportsComponents = true;\n for (var key in moduleExports) {\n hasExports = true;\n\n // This is the ES Module indicator flag\n if (key === '__esModule') {\n continue;\n }\n\n // We can (and have to) safely execute getters here,\n // as Webpack manually assigns harmony exports to getters,\n // without any side-effects attached.\n // Ref: https://github.com/webpack/webpack/blob/b93048643fe74de2a6931755911da1212df55897/lib/MainTemplate.js#L281\n var exportValue = moduleExports[key];\n if (!Refresh.isLikelyComponentType(exportValue)) {\n areAllExportsComponents = false;\n }\n }\n\n return hasExports && areAllExportsComponents;\n}\n\n/**\n * Checks if exports are likely a React component and registers them.\n *\n * This implementation is based on the one in [Metro](https://github.com/facebook/metro/blob/febdba2383113c88296c61e28e4ef6a7f4939fda/packages/metro/src/lib/polyfills/require.js#L818-L835).\n * @param {*} moduleExports A Webpack module exports object.\n * @param {string} moduleId A Webpack module ID.\n * @returns {void}\n */\nfunction registerExportsForReactRefresh(moduleExports, moduleId) {\n if (Refresh.isLikelyComponentType(moduleExports)) {\n // Register module.exports if it is likely a component\n Refresh.register(moduleExports, moduleId + ' %exports%');\n }\n\n if (moduleExports === undefined || moduleExports === null || typeof moduleExports !== 'object') {\n // Exit if we can't iterate over the exports.\n return;\n }\n\n for (var key in moduleExports) {\n // Skip registering the ES Module indicator\n if (key === '__esModule') {\n continue;\n }\n\n var exportValue = moduleExports[key];\n if (Refresh.isLikelyComponentType(exportValue)) {\n var typeID = moduleId + ' %exports% ' + key;\n Refresh.register(exportValue, typeID);\n }\n }\n}\n\n/**\n * Compares previous and next module objects to check for mutated boundaries.\n *\n * This implementation is based on the one in [Metro](https://github.com/facebook/metro/blob/907d6af22ac6ebe58572be418e9253a90665ecbd/packages/metro/src/lib/polyfills/require.js#L776-L792).\n * @param {*} prevSignature The signature of the current Webpack module exports object.\n * @param {*} nextSignature The signature of the next Webpack module exports object.\n * @returns {boolean} Whether the React refresh boundary should be invalidated.\n */\nfunction shouldInvalidateReactRefreshBoundary(prevSignature, nextSignature) {\n if (prevSignature.length !== nextSignature.length) {\n return true;\n }\n\n for (var i = 0; i < nextSignature.length; i += 1) {\n if (prevSignature[i] !== nextSignature[i]) {\n return true;\n }\n }\n\n return false;\n}\n\nvar enqueueUpdate = createDebounceUpdate();\nfunction executeRuntime(moduleExports, moduleId, webpackHot, refreshOverlay, isTest) {\n registerExportsForReactRefresh(moduleExports, moduleId);\n\n if (webpackHot) {\n var isHotUpdate = !!webpackHot.data;\n var prevData;\n if (isHotUpdate) {\n prevData = webpackHot.data.prevData;\n }\n\n if (isReactRefreshBoundary(moduleExports)) {\n webpackHot.dispose(\n /**\n * A callback to performs a full refresh if React has unrecoverable errors,\n * and also caches the to-be-disposed module.\n * @param {*} data A hot module data object from Webpack HMR.\n * @returns {void}\n */\n function hotDisposeCallback(data) {\n // We have to mutate the data object to get data registered and cached\n data.prevData = getWebpackHotData(moduleExports);\n }\n );\n webpackHot.accept(\n /**\n * An error handler to allow self-recovering behaviours.\n * @param {Error} error An error occurred during evaluation of a module.\n * @returns {void}\n */\n function hotErrorHandler(error) {\n if (typeof refreshOverlay !== 'undefined' && refreshOverlay) {\n refreshOverlay.handleRuntimeError(error);\n }\n\n if (typeof isTest !== 'undefined' && isTest) {\n if (window.onHotAcceptError) {\n window.onHotAcceptError(error.message);\n }\n }\n\n __webpack_require__.c[moduleId].hot.accept(hotErrorHandler);\n }\n );\n\n if (isHotUpdate) {\n if (\n prevData &&\n prevData.isReactRefreshBoundary &&\n shouldInvalidateReactRefreshBoundary(\n prevData.signature,\n getReactRefreshBoundarySignature(moduleExports)\n )\n ) {\n webpackHot.invalidate();\n } else {\n enqueueUpdate(\n /**\n * A function to dismiss the error overlay after performing React refresh.\n * @returns {void}\n */\n function updateCallback() {\n if (typeof refreshOverlay !== 'undefined' && refreshOverlay) {\n refreshOverlay.clearRuntimeErrors();\n }\n }\n );\n }\n }\n } else {\n if (isHotUpdate && typeof prevData !== 'undefined') {\n webpackHot.invalidate();\n }\n }\n }\n}\n\nmodule.exports = Object.freeze({\n enqueueUpdate: enqueueUpdate,\n executeRuntime: executeRuntime,\n getModuleExports: getModuleExports,\n isReactRefreshBoundary: isReactRefreshBoundary,\n registerExportsForReactRefresh: registerExportsForReactRefresh,\n});\n\n\n//# sourceURL=webpack://tududi/./node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/CompileErrorTrace.js":
+/*!***************************************************************************************************!*\
+ !*** ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/CompileErrorTrace.js ***!
+ \***************************************************************************************************/
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+eval("const ansiHTML = __webpack_require__(/*! ansi-html */ \"./node_modules/ansi-html/index.js\");\nconst entities = __webpack_require__(/*! html-entities */ \"./node_modules/html-entities/dist/commonjs/index.js\");\nconst theme = __webpack_require__(/*! ../theme.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/theme.js\");\nconst utils = __webpack_require__(/*! ../utils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/utils.js\");\n\nansiHTML.setColors(theme);\n\n/**\n * @typedef {Object} CompileErrorTraceProps\n * @property {string} errorMessage\n */\n\n/**\n * A formatter that turns Webpack compile error messages into highlighted HTML source traces.\n * @param {Document} document\n * @param {HTMLElement} root\n * @param {CompileErrorTraceProps} props\n * @returns {void}\n */\nfunction CompileErrorTrace(document, root, props) {\n const errorParts = props.errorMessage.split('\\n');\n if (errorParts.length) {\n if (errorParts[0]) {\n errorParts[0] = utils.formatFilename(errorParts[0]);\n }\n\n const errorMessage = errorParts.splice(1, 1)[0];\n if (errorMessage) {\n // Strip filename from the error message\n errorParts.unshift(errorMessage.replace(/^(.*:)\\s.*:(\\s.*)$/, '$1$2'));\n }\n }\n\n const stackContainer = document.createElement('pre');\n stackContainer.innerHTML = entities.decode(\n ansiHTML(entities.encode(errorParts.join('\\n'), { level: 'html5', mode: 'nonAscii' })),\n { level: 'html5' }\n );\n stackContainer.style.fontFamily = [\n '\"Operator Mono SSm\"',\n '\"Operator Mono\"',\n '\"Fira Code Retina\"',\n '\"Fira Code\"',\n '\"FiraCode-Retina\"',\n '\"Andale Mono\"',\n '\"Lucida Console\"',\n 'Menlo',\n 'Consolas',\n 'Monaco',\n 'monospace',\n ].join(', ');\n stackContainer.style.margin = '0';\n stackContainer.style.whiteSpace = 'pre-wrap';\n\n root.appendChild(stackContainer);\n}\n\nmodule.exports = CompileErrorTrace;\n\n\n//# sourceURL=webpack://tududi/./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/CompileErrorTrace.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/PageHeader.js":
+/*!********************************************************************************************!*\
+ !*** ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/PageHeader.js ***!
+ \********************************************************************************************/
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+eval("const Spacer = __webpack_require__(/*! ./Spacer.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/Spacer.js\");\nconst theme = __webpack_require__(/*! ../theme.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/theme.js\");\n\n/**\n * @typedef {Object} PageHeaderProps\n * @property {string} [message]\n * @property {string} title\n * @property {string} [topOffset]\n */\n\n/**\n * The header of the overlay.\n * @param {Document} document\n * @param {HTMLElement} root\n * @param {PageHeaderProps} props\n * @returns {void}\n */\nfunction PageHeader(document, root, props) {\n const pageHeaderContainer = document.createElement('div');\n pageHeaderContainer.style.background = '#' + theme.dimgrey;\n pageHeaderContainer.style.boxShadow = '0 1px 4px rgba(0, 0, 0, 0.3)';\n pageHeaderContainer.style.color = '#' + theme.white;\n pageHeaderContainer.style.left = '0';\n pageHeaderContainer.style.right = '0';\n pageHeaderContainer.style.padding = '1rem 1.5rem';\n pageHeaderContainer.style.paddingLeft = 'max(1.5rem, env(safe-area-inset-left))';\n pageHeaderContainer.style.paddingRight = 'max(1.5rem, env(safe-area-inset-right))';\n pageHeaderContainer.style.position = 'fixed';\n pageHeaderContainer.style.top = props.topOffset || '0';\n\n const title = document.createElement('h3');\n title.innerText = props.title;\n title.style.color = '#' + theme.red;\n title.style.fontSize = '1.125rem';\n title.style.lineHeight = '1.3';\n title.style.margin = '0';\n pageHeaderContainer.appendChild(title);\n\n if (props.message) {\n title.style.margin = '0 0 0.5rem';\n\n const message = document.createElement('span');\n message.innerText = props.message;\n message.style.color = '#' + theme.white;\n message.style.wordBreak = 'break-word';\n pageHeaderContainer.appendChild(message);\n }\n\n root.appendChild(pageHeaderContainer);\n\n // This has to run after appending elements to root\n // because we need to actual mounted height.\n Spacer(document, root, {\n space: pageHeaderContainer.offsetHeight.toString(10),\n });\n}\n\nmodule.exports = PageHeader;\n\n\n//# sourceURL=webpack://tududi/./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/PageHeader.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/RuntimeErrorFooter.js":
+/*!****************************************************************************************************!*\
+ !*** ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/RuntimeErrorFooter.js ***!
+ \****************************************************************************************************/
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+eval("const Spacer = __webpack_require__(/*! ./Spacer.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/Spacer.js\");\nconst theme = __webpack_require__(/*! ../theme.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/theme.js\");\n\n/**\n * @typedef {Object} RuntimeErrorFooterProps\n * @property {string} [initialFocus]\n * @property {boolean} multiple\n * @property {function(MouseEvent): void} onClickCloseButton\n * @property {function(MouseEvent): void} onClickNextButton\n * @property {function(MouseEvent): void} onClickPrevButton\n */\n\n/**\n * A fixed footer that handles pagination of runtime errors.\n * @param {Document} document\n * @param {HTMLElement} root\n * @param {RuntimeErrorFooterProps} props\n * @returns {void}\n */\nfunction RuntimeErrorFooter(document, root, props) {\n const footer = document.createElement('div');\n footer.style.backgroundColor = '#' + theme.dimgrey;\n footer.style.bottom = '0';\n footer.style.boxShadow = '0 -1px 4px rgba(0, 0, 0, 0.3)';\n footer.style.height = '2.5rem';\n footer.style.left = '0';\n footer.style.right = '0';\n footer.style.lineHeight = '2.5rem';\n footer.style.paddingBottom = '0';\n footer.style.paddingBottom = 'env(safe-area-inset-bottom)';\n footer.style.position = 'fixed';\n footer.style.textAlign = 'center';\n footer.style.zIndex = '2';\n\n const BUTTON_CONFIGS = {\n prev: {\n id: 'prev',\n label: '◀ Prev',\n onClick: props.onClickPrevButton,\n },\n close: {\n id: 'close',\n label: '× Close',\n onClick: props.onClickCloseButton,\n },\n next: {\n id: 'next',\n label: 'Next ▶',\n onClick: props.onClickNextButton,\n },\n };\n\n let buttons = [BUTTON_CONFIGS.close];\n if (props.multiple) {\n buttons = [BUTTON_CONFIGS.prev, BUTTON_CONFIGS.close, BUTTON_CONFIGS.next];\n }\n\n /** @type {HTMLButtonElement | undefined} */\n let initialFocusButton;\n for (let i = 0; i < buttons.length; i += 1) {\n const buttonConfig = buttons[i];\n\n const button = document.createElement('button');\n button.id = buttonConfig.id;\n button.innerHTML = buttonConfig.label;\n button.tabIndex = 1;\n button.style.backgroundColor = '#' + theme.dimgrey;\n button.style.border = 'none';\n button.style.color = '#' + theme.white;\n button.style.cursor = 'pointer';\n button.style.fontSize = 'inherit';\n button.style.height = '100%';\n button.style.padding = '0.5rem 0.75rem';\n button.style.width = (100 / buttons.length).toString(10) + '%';\n button.addEventListener('click', buttonConfig.onClick);\n\n if (buttonConfig.id === props.initialFocus) {\n initialFocusButton = button;\n }\n\n footer.appendChild(button);\n }\n\n root.appendChild(footer);\n\n Spacer(document, root, { space: '2.5rem' });\n\n if (initialFocusButton) {\n initialFocusButton.focus();\n }\n}\n\nmodule.exports = RuntimeErrorFooter;\n\n\n//# sourceURL=webpack://tududi/./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/RuntimeErrorFooter.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/RuntimeErrorHeader.js":
+/*!****************************************************************************************************!*\
+ !*** ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/RuntimeErrorHeader.js ***!
+ \****************************************************************************************************/
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+eval("const Spacer = __webpack_require__(/*! ./Spacer.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/Spacer.js\");\nconst theme = __webpack_require__(/*! ../theme.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/theme.js\");\n\n/**\n * @typedef {Object} RuntimeErrorHeaderProps\n * @property {number} currentErrorIndex\n * @property {number} totalErrors\n */\n\n/**\n * A fixed header that shows the total runtime error count.\n * @param {Document} document\n * @param {HTMLElement} root\n * @param {RuntimeErrorHeaderProps} props\n * @returns {void}\n */\nfunction RuntimeErrorHeader(document, root, props) {\n const header = document.createElement('div');\n header.innerText = 'Error ' + (props.currentErrorIndex + 1) + ' of ' + props.totalErrors;\n header.style.backgroundColor = '#' + theme.red;\n header.style.color = '#' + theme.white;\n header.style.fontWeight = '500';\n header.style.height = '2.5rem';\n header.style.left = '0';\n header.style.lineHeight = '2.5rem';\n header.style.position = 'fixed';\n header.style.textAlign = 'center';\n header.style.top = '0';\n header.style.width = '100vw';\n header.style.zIndex = '2';\n\n root.appendChild(header);\n\n Spacer(document, root, { space: '2.5rem' });\n}\n\nmodule.exports = RuntimeErrorHeader;\n\n\n//# sourceURL=webpack://tududi/./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/RuntimeErrorHeader.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/RuntimeErrorStack.js":
+/*!***************************************************************************************************!*\
+ !*** ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/RuntimeErrorStack.js ***!
+ \***************************************************************************************************/
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+eval("const ErrorStackParser = __webpack_require__(/*! error-stack-parser */ \"./node_modules/error-stack-parser/error-stack-parser.js\");\nconst theme = __webpack_require__(/*! ../theme.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/theme.js\");\nconst utils = __webpack_require__(/*! ../utils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/utils.js\");\n\n/**\n * @typedef {Object} RuntimeErrorStackProps\n * @property {Error} error\n */\n\n/**\n * A formatter that turns runtime error stacks into highlighted HTML stacks.\n * @param {Document} document\n * @param {HTMLElement} root\n * @param {RuntimeErrorStackProps} props\n * @returns {void}\n */\nfunction RuntimeErrorStack(document, root, props) {\n const stackTitle = document.createElement('h4');\n stackTitle.innerText = 'Call Stack';\n stackTitle.style.color = '#' + theme.white;\n stackTitle.style.fontSize = '1.0625rem';\n stackTitle.style.fontWeight = '500';\n stackTitle.style.lineHeight = '1.3';\n stackTitle.style.margin = '0 0 0.5rem';\n\n const stackContainer = document.createElement('div');\n stackContainer.style.fontSize = '0.8125rem';\n stackContainer.style.lineHeight = '1.3';\n stackContainer.style.whiteSpace = 'pre-wrap';\n\n let errorStacks;\n try {\n errorStacks = ErrorStackParser.parse(props.error);\n } catch (e) {\n errorStacks = [];\n stackContainer.innerHTML = 'No stack trace is available for this error!';\n }\n\n for (let i = 0; i < Math.min(errorStacks.length, 10); i += 1) {\n const currentStack = errorStacks[i];\n\n const functionName = document.createElement('code');\n functionName.innerHTML = ' ' + currentStack.functionName || 0;\n functionName.style.color = '#' + theme.yellow;\n functionName.style.fontFamily = [\n '\"Operator Mono SSm\"',\n '\"Operator Mono\"',\n '\"Fira Code Retina\"',\n '\"Fira Code\"',\n '\"FiraCode-Retina\"',\n '\"Andale Mono\"',\n '\"Lucida Console\"',\n 'Menlo',\n 'Consolas',\n 'Monaco',\n 'monospace',\n ].join(', ');\n\n const fileName = document.createElement('div');\n fileName.innerHTML =\n ' ' +\n utils.formatFilename(currentStack.fileName) +\n ':' +\n currentStack.lineNumber +\n ':' +\n currentStack.columnNumber;\n fileName.style.color = '#' + theme.white;\n fileName.style.fontSize = '0.6875rem';\n fileName.style.marginBottom = '0.25rem';\n\n stackContainer.appendChild(functionName);\n stackContainer.appendChild(fileName);\n }\n\n root.appendChild(stackTitle);\n root.appendChild(stackContainer);\n}\n\nmodule.exports = RuntimeErrorStack;\n\n\n//# sourceURL=webpack://tududi/./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/RuntimeErrorStack.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/Spacer.js":
+/*!****************************************************************************************!*\
+ !*** ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/Spacer.js ***!
+ \****************************************************************************************/
+/***/ ((module) => {
+
+eval("/**\n * @typedef {Object} SpacerProps\n * @property {string} space\n */\n\n/**\n * An empty element to add spacing manually.\n * @param {Document} document\n * @param {HTMLElement} root\n * @param {SpacerProps} props\n * @returns {void}\n */\nfunction Spacer(document, root, props) {\n const spacer = document.createElement('div');\n spacer.style.paddingBottom = props.space;\n root.appendChild(spacer);\n}\n\nmodule.exports = Spacer;\n\n\n//# sourceURL=webpack://tududi/./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/Spacer.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/containers/CompileErrorContainer.js":
+/*!*******************************************************************************************************!*\
+ !*** ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/containers/CompileErrorContainer.js ***!
+ \*******************************************************************************************************/
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+eval("const CompileErrorTrace = __webpack_require__(/*! ../components/CompileErrorTrace.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/CompileErrorTrace.js\");\nconst PageHeader = __webpack_require__(/*! ../components/PageHeader.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/PageHeader.js\");\nconst Spacer = __webpack_require__(/*! ../components/Spacer.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/Spacer.js\");\n\n/**\n * @typedef {Object} CompileErrorContainerProps\n * @property {string} errorMessage\n */\n\n/**\n * A container to render Webpack compilation error messages with source trace.\n * @param {Document} document\n * @param {HTMLElement} root\n * @param {CompileErrorContainerProps} props\n * @returns {void}\n */\nfunction CompileErrorContainer(document, root, props) {\n PageHeader(document, root, {\n title: 'Failed to compile.',\n });\n CompileErrorTrace(document, root, { errorMessage: props.errorMessage });\n Spacer(document, root, { space: '1rem' });\n}\n\nmodule.exports = CompileErrorContainer;\n\n\n//# sourceURL=webpack://tududi/./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/containers/CompileErrorContainer.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/containers/RuntimeErrorContainer.js":
+/*!*******************************************************************************************************!*\
+ !*** ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/containers/RuntimeErrorContainer.js ***!
+ \*******************************************************************************************************/
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+eval("const PageHeader = __webpack_require__(/*! ../components/PageHeader.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/PageHeader.js\");\nconst RuntimeErrorStack = __webpack_require__(/*! ../components/RuntimeErrorStack.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/RuntimeErrorStack.js\");\nconst Spacer = __webpack_require__(/*! ../components/Spacer.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/Spacer.js\");\n\n/**\n * @typedef {Object} RuntimeErrorContainerProps\n * @property {Error} currentError\n */\n\n/**\n * A container to render runtime error messages with stack trace.\n * @param {Document} document\n * @param {HTMLElement} root\n * @param {RuntimeErrorContainerProps} props\n * @returns {void}\n */\nfunction RuntimeErrorContainer(document, root, props) {\n PageHeader(document, root, {\n message: props.currentError.message,\n title: props.currentError.name,\n topOffset: '2.5rem',\n });\n RuntimeErrorStack(document, root, {\n error: props.currentError,\n });\n Spacer(document, root, { space: '1rem' });\n}\n\nmodule.exports = RuntimeErrorContainer;\n\n\n//# sourceURL=webpack://tududi/./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/containers/RuntimeErrorContainer.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js":
+/*!****************************************************************************!*\
+ !*** ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js ***!
+ \****************************************************************************/
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+eval("const RuntimeErrorFooter = __webpack_require__(/*! ./components/RuntimeErrorFooter.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/RuntimeErrorFooter.js\");\nconst RuntimeErrorHeader = __webpack_require__(/*! ./components/RuntimeErrorHeader.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/components/RuntimeErrorHeader.js\");\nconst CompileErrorContainer = __webpack_require__(/*! ./containers/CompileErrorContainer.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/containers/CompileErrorContainer.js\");\nconst RuntimeErrorContainer = __webpack_require__(/*! ./containers/RuntimeErrorContainer.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/containers/RuntimeErrorContainer.js\");\nconst theme = __webpack_require__(/*! ./theme.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/theme.js\");\nconst utils = __webpack_require__(/*! ./utils.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/utils.js\");\n\n/**\n * @callback RenderFn\n * @returns {void}\n */\n\n/* ===== Cached elements for DOM manipulations ===== */\n/**\n * The iframe that contains the overlay.\n * @type {HTMLIFrameElement}\n */\nlet iframeRoot = null;\n/**\n * The document object from the iframe root, used to create and render elements.\n * @type {Document}\n */\nlet rootDocument = null;\n/**\n * The root div elements will attach to.\n * @type {HTMLDivElement}\n */\nlet root = null;\n/**\n * A Cached function to allow deferred render.\n * @type {RenderFn | null}\n */\nlet scheduledRenderFn = null;\n\n/* ===== Overlay State ===== */\n/**\n * The latest error message from Webpack compilation.\n * @type {string}\n */\nlet currentCompileErrorMessage = '';\n/**\n * Index of the error currently shown by the overlay.\n * @type {number}\n */\nlet currentRuntimeErrorIndex = 0;\n/**\n * The latest runtime error objects.\n * @type {Error[]}\n */\nlet currentRuntimeErrors = [];\n/**\n * The render mode the overlay is currently in.\n * @type {'compileError' | 'runtimeError' | null}\n */\nlet currentMode = null;\n\n/**\n * @typedef {Object} IframeProps\n * @property {function(): void} onIframeLoad\n */\n\n/**\n * Creates the main `iframe` the overlay will attach to.\n * Accepts a callback to be ran after iframe is initialized.\n * @param {Document} document\n * @param {HTMLElement} root\n * @param {IframeProps} props\n * @returns {HTMLIFrameElement}\n */\nfunction IframeRoot(document, root, props) {\n const iframe = document.createElement('iframe');\n iframe.id = 'react-refresh-overlay';\n iframe.src = 'about:blank';\n\n iframe.style.border = 'none';\n iframe.style.height = '100%';\n iframe.style.left = '0';\n iframe.style.minHeight = '100vh';\n iframe.style.minHeight = '-webkit-fill-available';\n iframe.style.position = 'fixed';\n iframe.style.top = '0';\n iframe.style.width = '100vw';\n iframe.style.zIndex = '2147483647';\n iframe.addEventListener('load', function onLoad() {\n // Reset margin of iframe body\n iframe.contentDocument.body.style.margin = '0';\n props.onIframeLoad();\n });\n\n // We skip mounting and returns as we need to ensure\n // the load event is fired after we setup the global variable\n return iframe;\n}\n\n/**\n * Creates the main `div` element for the overlay to render.\n * @param {Document} document\n * @param {HTMLElement} root\n * @returns {HTMLDivElement}\n */\nfunction OverlayRoot(document, root) {\n const div = document.createElement('div');\n div.id = 'react-refresh-overlay-error';\n\n // Style the contents container\n div.style.backgroundColor = '#' + theme.grey;\n div.style.boxSizing = 'border-box';\n div.style.color = '#' + theme.white;\n div.style.fontFamily = [\n '-apple-system',\n 'BlinkMacSystemFont',\n '\"Segoe UI\"',\n '\"Helvetica Neue\"',\n 'Helvetica',\n 'Arial',\n 'sans-serif',\n '\"Apple Color Emoji\"',\n '\"Segoe UI Emoji\"',\n 'Segoe UI Symbol',\n ].join(', ');\n div.style.fontSize = '0.875rem';\n div.style.height = '100%';\n div.style.lineHeight = '1.3';\n div.style.overflow = 'auto';\n div.style.padding = '1rem 1.5rem 0';\n div.style.paddingTop = 'max(1rem, env(safe-area-inset-top))';\n div.style.paddingRight = 'max(1.5rem, env(safe-area-inset-right))';\n div.style.paddingBottom = 'env(safe-area-inset-bottom)';\n div.style.paddingLeft = 'max(1.5rem, env(safe-area-inset-left))';\n div.style.width = '100vw';\n\n root.appendChild(div);\n return div;\n}\n\n/**\n * Ensures the iframe root and the overlay root are both initialized before render.\n * If check fails, render will be deferred until both roots are initialized.\n * @param {RenderFn} renderFn A function that triggers a DOM render.\n * @returns {void}\n */\nfunction ensureRootExists(renderFn) {\n if (root) {\n // Overlay root is ready, we can render right away.\n renderFn();\n return;\n }\n\n // Creating an iframe may be asynchronous so we'll defer render.\n // In case of multiple calls, function from the last call will be used.\n scheduledRenderFn = renderFn;\n\n if (iframeRoot) {\n // Iframe is already ready, it will fire the load event.\n return;\n }\n\n // Create the iframe root, and, the overlay root inside it when it is ready.\n iframeRoot = IframeRoot(document, document.body, {\n onIframeLoad: function onIframeLoad() {\n rootDocument = iframeRoot.contentDocument;\n root = OverlayRoot(rootDocument, rootDocument.body);\n scheduledRenderFn();\n },\n });\n\n // We have to mount here to ensure `iframeRoot` is set when `onIframeLoad` fires.\n // This is because onIframeLoad() will be called synchronously\n // or asynchronously depending on the browser.\n document.body.appendChild(iframeRoot);\n}\n\n/**\n * Creates the main `div` element for the overlay to render.\n * @returns {void}\n */\nfunction render() {\n ensureRootExists(function () {\n const currentFocus = rootDocument.activeElement;\n let currentFocusId;\n if (currentFocus.localName === 'button' && currentFocus.id) {\n currentFocusId = currentFocus.id;\n }\n\n utils.removeAllChildren(root);\n\n if (currentCompileErrorMessage) {\n currentMode = 'compileError';\n\n CompileErrorContainer(rootDocument, root, {\n errorMessage: currentCompileErrorMessage,\n });\n } else if (currentRuntimeErrors.length) {\n currentMode = 'runtimeError';\n\n RuntimeErrorHeader(rootDocument, root, {\n currentErrorIndex: currentRuntimeErrorIndex,\n totalErrors: currentRuntimeErrors.length,\n });\n RuntimeErrorContainer(rootDocument, root, {\n currentError: currentRuntimeErrors[currentRuntimeErrorIndex],\n });\n RuntimeErrorFooter(rootDocument, root, {\n initialFocus: currentFocusId,\n multiple: currentRuntimeErrors.length > 1,\n onClickCloseButton: function onClose() {\n clearRuntimeErrors();\n },\n onClickNextButton: function onNext() {\n if (currentRuntimeErrorIndex === currentRuntimeErrors.length - 1) {\n return;\n }\n currentRuntimeErrorIndex += 1;\n ensureRootExists(render);\n },\n onClickPrevButton: function onPrev() {\n if (currentRuntimeErrorIndex === 0) {\n return;\n }\n currentRuntimeErrorIndex -= 1;\n ensureRootExists(render);\n },\n });\n }\n });\n}\n\n/**\n * Destroys the state of the overlay.\n * @returns {void}\n */\nfunction cleanup() {\n // Clean up and reset all internal state.\n document.body.removeChild(iframeRoot);\n scheduledRenderFn = null;\n root = null;\n iframeRoot = null;\n}\n\n/**\n * Clears Webpack compilation errors and dismisses the compile error overlay.\n * @returns {void}\n */\nfunction clearCompileError() {\n if (!root || currentMode !== 'compileError') {\n return;\n }\n\n currentCompileErrorMessage = '';\n currentMode = null;\n cleanup();\n}\n\n/**\n * Clears runtime error records and dismisses the runtime error overlay.\n * @param {boolean} [dismissOverlay] Whether to dismiss the overlay or not.\n * @returns {void}\n */\nfunction clearRuntimeErrors(dismissOverlay) {\n if (!root || currentMode !== 'runtimeError') {\n return;\n }\n\n currentRuntimeErrorIndex = 0;\n currentRuntimeErrors = [];\n\n if (typeof dismissOverlay === 'undefined' || dismissOverlay) {\n currentMode = null;\n cleanup();\n }\n}\n\n/**\n * Shows the compile error overlay with the specific Webpack error message.\n * @param {string} message\n * @returns {void}\n */\nfunction showCompileError(message) {\n if (!message) {\n return;\n }\n\n currentCompileErrorMessage = message;\n\n render();\n}\n\n/**\n * Shows the runtime error overlay with the specific error records.\n * @param {Error[]} errors\n * @returns {void}\n */\nfunction showRuntimeErrors(errors) {\n if (!errors || !errors.length) {\n return;\n }\n\n currentRuntimeErrors = errors;\n\n render();\n}\n\n/**\n * The debounced version of `showRuntimeErrors` to prevent frequent renders\n * due to rapid firing listeners.\n * @param {Error[]} errors\n * @returns {void}\n */\nconst debouncedShowRuntimeErrors = utils.debounce(showRuntimeErrors, 30);\n\n/**\n * Detects if an error is a Webpack compilation error.\n * @param {Error} error The error of interest.\n * @returns {boolean} If the error is a Webpack compilation error.\n */\nfunction isWebpackCompileError(error) {\n return /Module [A-z ]+\\(from/.test(error.message) || /Cannot find module/.test(error.message);\n}\n\n/**\n * Handles runtime error contexts captured with EventListeners.\n * Integrates with a runtime error overlay.\n * @param {Error} error A valid error object.\n * @returns {void}\n */\nfunction handleRuntimeError(error) {\n if (error && !isWebpackCompileError(error) && currentRuntimeErrors.indexOf(error) === -1) {\n currentRuntimeErrors = currentRuntimeErrors.concat(error);\n }\n debouncedShowRuntimeErrors(currentRuntimeErrors);\n}\n\nmodule.exports = Object.freeze({\n clearCompileError: clearCompileError,\n clearRuntimeErrors: clearRuntimeErrors,\n handleRuntimeError: handleRuntimeError,\n showCompileError: showCompileError,\n showRuntimeErrors: showRuntimeErrors,\n});\n\n\n//# sourceURL=webpack://tududi/./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/index.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/theme.js":
+/*!****************************************************************************!*\
+ !*** ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/theme.js ***!
+ \****************************************************************************/
+/***/ ((module) => {
+
+eval("/**\n * @typedef {Object} Theme\n * @property {string[]} reset\n * @property {string} black\n * @property {string} red\n * @property {string} green\n * @property {string} yellow\n * @property {string} blue\n * @property {string} magenta\n * @property {string} cyan\n * @property {string} white\n * @property {string} lightgrey\n * @property {string} darkgrey\n * @property {string} grey\n * @property {string} dimgrey\n */\n\n/**\n * @type {Theme} theme\n * A collection of colors to be used by the overlay.\n * Partially adopted from Tomorrow Night Bright.\n */\nconst theme = {\n reset: ['transparent', 'transparent'],\n black: '000000',\n red: 'D34F56',\n green: 'B9C954',\n yellow: 'E6C452',\n blue: '7CA7D8',\n magenta: 'C299D6',\n cyan: '73BFB1',\n white: 'FFFFFF',\n lightgrey: 'C7C7C7',\n darkgrey: 'A9A9A9',\n grey: '474747',\n dimgrey: '343434',\n};\n\nmodule.exports = theme;\n\n\n//# sourceURL=webpack://tududi/./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/theme.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/utils.js":
+/*!****************************************************************************!*\
+ !*** ./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/utils.js ***!
+ \****************************************************************************/
+/***/ ((module) => {
+
+eval("/**\n * Debounce a function to delay invoking until wait (ms) have elapsed since the last invocation.\n * @param {function(...*): *} fn The function to be debounced.\n * @param {number} wait Milliseconds to wait before invoking again.\n * @return {function(...*): void} The debounced function.\n */\nfunction debounce(fn, wait) {\n /**\n * A cached setTimeout handler.\n * @type {number | undefined}\n */\n let timer;\n\n /**\n * @returns {void}\n */\n function debounced() {\n const context = this;\n const args = arguments;\n\n clearTimeout(timer);\n timer = setTimeout(function () {\n return fn.apply(context, args);\n }, wait);\n }\n\n return debounced;\n}\n\n/**\n * Prettify a filename from error stacks into the desired format.\n * @param {string} filename The filename to be formatted.\n * @returns {string} The formatted filename.\n */\nfunction formatFilename(filename) {\n // Strip away protocol and domain for compiled files\n const htmlMatch = /^https?:\\/\\/(.*)\\/(.*)/.exec(filename);\n if (htmlMatch && htmlMatch[1] && htmlMatch[2]) {\n return htmlMatch[2];\n }\n\n // Strip everything before the first directory for source files\n const sourceMatch = /\\/.*?([^./]+[/|\\\\].*)$/.exec(filename);\n if (sourceMatch && sourceMatch[1]) {\n return sourceMatch[1].replace(/\\?$/, '');\n }\n\n // Unknown filename type, use it as is\n return filename;\n}\n\n/**\n * Remove all children of an element.\n * @param {HTMLElement} element A valid HTML element.\n * @param {number} [skip] Number of elements to skip removing.\n * @returns {void}\n */\nfunction removeAllChildren(element, skip) {\n /** @type {Node[]} */\n const childList = Array.prototype.slice.call(\n element.childNodes,\n typeof skip !== 'undefined' ? skip : 0\n );\n\n for (let i = 0; i < childList.length; i += 1) {\n element.removeChild(childList[i]);\n }\n}\n\nmodule.exports = {\n debounce: debounce,\n formatFilename: formatFilename,\n removeAllChildren: removeAllChildren,\n};\n\n\n//# sourceURL=webpack://tududi/./node_modules/@pmmmwh/react-refresh-webpack-plugin/overlay/utils.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@pmmmwh/react-refresh-webpack-plugin/sockets/WDSSocket.js":
+/*!********************************************************************************!*\
+ !*** ./node_modules/@pmmmwh/react-refresh-webpack-plugin/sockets/WDSSocket.js ***!
+ \********************************************************************************/
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+eval("/* global __webpack_dev_server_client__ */\n\nconst getSocketUrlParts = __webpack_require__(/*! ./utils/getSocketUrlParts.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/sockets/utils/getSocketUrlParts.js\");\nconst getUrlFromParts = __webpack_require__(/*! ./utils/getUrlFromParts */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/sockets/utils/getUrlFromParts.js\");\nconst getWDSMetadata = __webpack_require__(/*! ./utils/getWDSMetadata */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/sockets/utils/getWDSMetadata.js\");\n\n/**\n * Initializes a socket server for HMR for webpack-dev-server.\n * @param {function(*): void} messageHandler A handler to consume Webpack compilation messages.\n * @param {string} [resourceQuery] Webpack's `__resourceQuery` string.\n * @returns {void}\n */\nfunction initWDSSocket(messageHandler, resourceQuery) {\n if (typeof __webpack_dev_server_client__ !== 'undefined') {\n let SocketClient = __webpack_dev_server_client__;\n if (typeof __webpack_dev_server_client__.default !== 'undefined') {\n SocketClient = __webpack_dev_server_client__.default;\n }\n\n const wdsMeta = getWDSMetadata(SocketClient);\n const urlParts = getSocketUrlParts(resourceQuery, wdsMeta);\n\n const connection = new SocketClient(getUrlFromParts(urlParts, wdsMeta));\n\n connection.onMessage(function onSocketMessage(data) {\n const message = JSON.parse(data);\n messageHandler(message);\n });\n }\n}\n\nmodule.exports = { init: initWDSSocket };\n\n\n//# sourceURL=webpack://tududi/./node_modules/@pmmmwh/react-refresh-webpack-plugin/sockets/WDSSocket.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@pmmmwh/react-refresh-webpack-plugin/sockets/utils/getCurrentScriptSource.js":
+/*!***************************************************************************************************!*\
+ !*** ./node_modules/@pmmmwh/react-refresh-webpack-plugin/sockets/utils/getCurrentScriptSource.js ***!
+ \***************************************************************************************************/
+/***/ ((module) => {
+
+eval("/**\n * Gets the source (i.e. host) of the script currently running.\n * @returns {string}\n */\nfunction getCurrentScriptSource() {\n // `document.currentScript` is the most accurate way to get the current running script,\n // but is not supported in all browsers (most notably, IE).\n if ('currentScript' in document) {\n // In some cases, `document.currentScript` would be `null` even if the browser supports it:\n // e.g. asynchronous chunks on Firefox.\n // We should not fallback to the list-approach as it would not be safe.\n if (document.currentScript == null) return;\n return document.currentScript.getAttribute('src');\n }\n // Fallback to getting all scripts running in the document,\n // and finding the last one injected.\n else {\n const scriptElementsWithSrc = Array.prototype.filter.call(\n document.scripts || [],\n function (elem) {\n return elem.getAttribute('src');\n }\n );\n if (!scriptElementsWithSrc.length) return;\n const currentScript = scriptElementsWithSrc[scriptElementsWithSrc.length - 1];\n return currentScript.getAttribute('src');\n }\n}\n\nmodule.exports = getCurrentScriptSource;\n\n\n//# sourceURL=webpack://tududi/./node_modules/@pmmmwh/react-refresh-webpack-plugin/sockets/utils/getCurrentScriptSource.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@pmmmwh/react-refresh-webpack-plugin/sockets/utils/getSocketUrlParts.js":
+/*!**********************************************************************************************!*\
+ !*** ./node_modules/@pmmmwh/react-refresh-webpack-plugin/sockets/utils/getSocketUrlParts.js ***!
+ \**********************************************************************************************/
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+eval("const getCurrentScriptSource = __webpack_require__(/*! ./getCurrentScriptSource.js */ \"./node_modules/@pmmmwh/react-refresh-webpack-plugin/sockets/utils/getCurrentScriptSource.js\");\n\n/**\n * @typedef {Object} SocketUrlParts\n * @property {string} [auth]\n * @property {string} hostname\n * @property {string} [protocol]\n * @property {string} pathname\n * @property {string} [port]\n */\n\n/**\n * Parse current location and Webpack's `__resourceQuery` into parts that can create a valid socket URL.\n * @param {string} [resourceQuery] The Webpack `__resourceQuery` string.\n * @param {import('./getWDSMetadata').WDSMetaObj} [metadata] The parsed WDS metadata object.\n * @returns {SocketUrlParts} The parsed URL parts.\n * @see https://webpack.js.org/api/module-variables/#__resourcequery-webpack-specific\n */\nfunction getSocketUrlParts(resourceQuery, metadata) {\n if (typeof metadata === 'undefined') {\n metadata = {};\n }\n\n /** @type {SocketUrlParts} */\n let urlParts = {};\n\n // If the resource query is available,\n // parse it and ignore everything we received from the script host.\n if (resourceQuery) {\n const parsedQuery = {};\n const searchParams = new URLSearchParams(resourceQuery.slice(1));\n searchParams.forEach(function (value, key) {\n parsedQuery[key] = value;\n });\n\n urlParts.hostname = parsedQuery.sockHost;\n urlParts.pathname = parsedQuery.sockPath;\n urlParts.port = parsedQuery.sockPort;\n\n // Make sure the protocol from resource query has a trailing colon\n if (parsedQuery.sockProtocol) {\n urlParts.protocol = parsedQuery.sockProtocol + ':';\n }\n } else {\n const scriptSource = getCurrentScriptSource();\n\n let url = {};\n try {\n // The placeholder `baseURL` with `window.location.href`,\n // is to allow parsing of path-relative or protocol-relative URLs,\n // and will have no effect if `scriptSource` is a fully valid URL.\n url = new URL(scriptSource, window.location.href);\n } catch (e) {\n // URL parsing failed, do nothing.\n // We will still proceed to see if we can recover using `resourceQuery`\n }\n\n // Parse authentication credentials in case we need them\n if (url.username) {\n // Since HTTP basic authentication does not allow empty username,\n // we only include password if the username is not empty.\n // Result: or :\n urlParts.auth = url.username;\n if (url.password) {\n urlParts.auth += ':' + url.password;\n }\n }\n\n // `file://` URLs has `'null'` origin\n if (url.origin !== 'null') {\n urlParts.hostname = url.hostname;\n }\n\n urlParts.protocol = url.protocol;\n urlParts.port = url.port;\n }\n\n if (!urlParts.pathname) {\n if (metadata.version === 4) {\n // This is hard-coded in WDS v4\n urlParts.pathname = '/ws';\n } else {\n // This is hard-coded in WDS v3\n urlParts.pathname = '/sockjs-node';\n }\n }\n\n // Check for IPv4 and IPv6 host addresses that correspond to any/empty.\n // This is important because `hostname` can be empty for some hosts,\n // such as 'about:blank' or 'file://' URLs.\n const isEmptyHostname =\n urlParts.hostname === '0.0.0.0' || urlParts.hostname === '[::]' || !urlParts.hostname;\n // We only re-assign the hostname if it is empty,\n // and if we are using HTTP/HTTPS protocols.\n if (\n isEmptyHostname &&\n window.location.hostname &&\n window.location.protocol.indexOf('http') === 0\n ) {\n urlParts.hostname = window.location.hostname;\n }\n\n // We only re-assign `protocol` when `protocol` is unavailable,\n // or if `hostname` is available and is empty,\n // since otherwise we risk creating an invalid URL.\n // We also do this when no sockProtocol was passed to the config and 'https' is used,\n // as it mandates the use of secure sockets.\n if (\n !urlParts.protocol ||\n (urlParts.hostname &&\n (isEmptyHostname || (!resourceQuery && window.location.protocol === 'https:')))\n ) {\n urlParts.protocol = window.location.protocol;\n }\n\n // We only re-assign port when it is not available\n if (!urlParts.port) {\n urlParts.port = window.location.port;\n }\n\n if (!urlParts.hostname || !urlParts.pathname) {\n throw new Error(\n [\n '[React Refresh] Failed to get an URL for the socket connection.',\n \"This usually means that the current executed script doesn't have a `src` attribute set.\",\n 'You should either specify the socket path parameters under the `devServer` key in your Webpack config, or use the `overlay` option.',\n 'https://github.com/pmmmwh/react-refresh-webpack-plugin/blob/main/docs/API.md#overlay',\n ].join('\\n')\n );\n }\n\n return {\n auth: urlParts.auth,\n hostname: urlParts.hostname,\n pathname: urlParts.pathname,\n protocol: urlParts.protocol,\n port: urlParts.port || undefined,\n };\n}\n\nmodule.exports = getSocketUrlParts;\n\n\n//# sourceURL=webpack://tududi/./node_modules/@pmmmwh/react-refresh-webpack-plugin/sockets/utils/getSocketUrlParts.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@pmmmwh/react-refresh-webpack-plugin/sockets/utils/getUrlFromParts.js":
+/*!********************************************************************************************!*\
+ !*** ./node_modules/@pmmmwh/react-refresh-webpack-plugin/sockets/utils/getUrlFromParts.js ***!
+ \********************************************************************************************/
+/***/ ((module) => {
+
+eval("/**\n * Create a valid URL from parsed URL parts.\n * @param {import('./getSocketUrlParts').SocketUrlParts} urlParts The parsed URL parts.\n * @param {import('./getWDSMetadata').WDSMetaObj} [metadata] The parsed WDS metadata object.\n * @returns {string} The generated URL.\n */\nfunction urlFromParts(urlParts, metadata) {\n if (typeof metadata === 'undefined') {\n metadata = {};\n }\n\n let fullProtocol = 'http:';\n if (urlParts.protocol) {\n fullProtocol = urlParts.protocol;\n }\n if (metadata.enforceWs) {\n fullProtocol = fullProtocol.replace(/^(?:http|.+-extension|file)/i, 'ws');\n }\n\n fullProtocol = fullProtocol + '//';\n\n let fullHost = urlParts.hostname;\n if (urlParts.auth) {\n const fullAuth = urlParts.auth.split(':').map(encodeURIComponent).join(':') + '@';\n fullHost = fullAuth + fullHost;\n }\n if (urlParts.port) {\n fullHost = fullHost + ':' + urlParts.port;\n }\n\n const url = new URL(urlParts.pathname, fullProtocol + fullHost);\n return url.href;\n}\n\nmodule.exports = urlFromParts;\n\n\n//# sourceURL=webpack://tududi/./node_modules/@pmmmwh/react-refresh-webpack-plugin/sockets/utils/getUrlFromParts.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@pmmmwh/react-refresh-webpack-plugin/sockets/utils/getWDSMetadata.js":
+/*!*******************************************************************************************!*\
+ !*** ./node_modules/@pmmmwh/react-refresh-webpack-plugin/sockets/utils/getWDSMetadata.js ***!
+ \*******************************************************************************************/
+/***/ ((module) => {
+
+eval("/**\n * @typedef {Object} WDSMetaObj\n * @property {boolean} enforceWs\n * @property {number} version\n */\n\n/**\n * Derives WDS metadata from a compatible socket client.\n * @param {Function} SocketClient A WDS socket client (SockJS/WebSocket).\n * @returns {WDSMetaObj} The parsed WDS metadata object.\n */\nfunction getWDSMetadata(SocketClient) {\n let enforceWs = false;\n if (\n typeof SocketClient.name !== 'undefined' &&\n SocketClient.name !== null &&\n SocketClient.name.toLowerCase().includes('websocket')\n ) {\n enforceWs = true;\n }\n\n let version;\n // WDS versions <=3.5.0\n if (!('onMessage' in SocketClient.prototype)) {\n version = 3;\n } else {\n // WDS versions >=3.5.0 <4\n if (\n 'getClientPath' in SocketClient ||\n Object.getPrototypeOf(SocketClient).name === 'BaseClient'\n ) {\n version = 3;\n } else {\n version = 4;\n }\n }\n\n return {\n enforceWs: enforceWs,\n version: version,\n };\n}\n\nmodule.exports = getWDSMetadata;\n\n\n//# sourceURL=webpack://tududi/./node_modules/@pmmmwh/react-refresh-webpack-plugin/sockets/utils/getWDSMetadata.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@remix-run/router/dist/router.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/@remix-run/router/dist/router.js ***!
+ \*******************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbortedDeferredError: () => (/* binding */ AbortedDeferredError),\n/* harmony export */ Action: () => (/* binding */ Action),\n/* harmony export */ IDLE_BLOCKER: () => (/* binding */ IDLE_BLOCKER),\n/* harmony export */ IDLE_FETCHER: () => (/* binding */ IDLE_FETCHER),\n/* harmony export */ IDLE_NAVIGATION: () => (/* binding */ IDLE_NAVIGATION),\n/* harmony export */ UNSAFE_DEFERRED_SYMBOL: () => (/* binding */ UNSAFE_DEFERRED_SYMBOL),\n/* harmony export */ UNSAFE_DeferredData: () => (/* binding */ DeferredData),\n/* harmony export */ UNSAFE_ErrorResponseImpl: () => (/* binding */ ErrorResponseImpl),\n/* harmony export */ UNSAFE_convertRouteMatchToUiMatch: () => (/* binding */ convertRouteMatchToUiMatch),\n/* harmony export */ UNSAFE_convertRoutesToDataRoutes: () => (/* binding */ convertRoutesToDataRoutes),\n/* harmony export */ UNSAFE_decodePath: () => (/* binding */ decodePath),\n/* harmony export */ UNSAFE_getResolveToMatches: () => (/* binding */ getResolveToMatches),\n/* harmony export */ UNSAFE_invariant: () => (/* binding */ invariant),\n/* harmony export */ UNSAFE_warning: () => (/* binding */ warning),\n/* harmony export */ createBrowserHistory: () => (/* binding */ createBrowserHistory),\n/* harmony export */ createHashHistory: () => (/* binding */ createHashHistory),\n/* harmony export */ createMemoryHistory: () => (/* binding */ createMemoryHistory),\n/* harmony export */ createPath: () => (/* binding */ createPath),\n/* harmony export */ createRouter: () => (/* binding */ createRouter),\n/* harmony export */ createStaticHandler: () => (/* binding */ createStaticHandler),\n/* harmony export */ data: () => (/* binding */ data),\n/* harmony export */ defer: () => (/* binding */ defer),\n/* harmony export */ generatePath: () => (/* binding */ generatePath),\n/* harmony export */ getStaticContextFromError: () => (/* binding */ getStaticContextFromError),\n/* harmony export */ getToPathname: () => (/* binding */ getToPathname),\n/* harmony export */ isDataWithResponseInit: () => (/* binding */ isDataWithResponseInit),\n/* harmony export */ isDeferredData: () => (/* binding */ isDeferredData),\n/* harmony export */ isRouteErrorResponse: () => (/* binding */ isRouteErrorResponse),\n/* harmony export */ joinPaths: () => (/* binding */ joinPaths),\n/* harmony export */ json: () => (/* binding */ json),\n/* harmony export */ matchPath: () => (/* binding */ matchPath),\n/* harmony export */ matchRoutes: () => (/* binding */ matchRoutes),\n/* harmony export */ normalizePathname: () => (/* binding */ normalizePathname),\n/* harmony export */ parsePath: () => (/* binding */ parsePath),\n/* harmony export */ redirect: () => (/* binding */ redirect),\n/* harmony export */ redirectDocument: () => (/* binding */ redirectDocument),\n/* harmony export */ replace: () => (/* binding */ replace),\n/* harmony export */ resolvePath: () => (/* binding */ resolvePath),\n/* harmony export */ resolveTo: () => (/* binding */ resolveTo),\n/* harmony export */ stripBasename: () => (/* binding */ stripBasename)\n/* harmony export */ });\n/**\n * @remix-run/router v1.23.0\n *\n * Copyright (c) Remix Software Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Types and Constants\n////////////////////////////////////////////////////////////////////////////////\n/**\n * Actions represent the type of change to a location value.\n */\nvar Action;\n(function (Action) {\n /**\n * A POP indicates a change to an arbitrary index in the history stack, such\n * as a back or forward navigation. It does not describe the direction of the\n * navigation, only that the current index changed.\n *\n * Note: This is the default action for newly created history objects.\n */\n Action[\"Pop\"] = \"POP\";\n /**\n * A PUSH indicates a new entry being added to the history stack, such as when\n * a link is clicked and a new page loads. When this happens, all subsequent\n * entries in the stack are lost.\n */\n Action[\"Push\"] = \"PUSH\";\n /**\n * A REPLACE indicates the entry at the current index in the history stack\n * being replaced by a new one.\n */\n Action[\"Replace\"] = \"REPLACE\";\n})(Action || (Action = {}));\nconst PopStateEventType = \"popstate\";\n/**\n * Memory history stores the current location in memory. It is designed for use\n * in stateful non-browser environments like tests and React Native.\n */\nfunction createMemoryHistory(options) {\n if (options === void 0) {\n options = {};\n }\n let {\n initialEntries = [\"/\"],\n initialIndex,\n v5Compat = false\n } = options;\n let entries; // Declare so we can access from createMemoryLocation\n entries = initialEntries.map((entry, index) => createMemoryLocation(entry, typeof entry === \"string\" ? null : entry.state, index === 0 ? \"default\" : undefined));\n let index = clampIndex(initialIndex == null ? entries.length - 1 : initialIndex);\n let action = Action.Pop;\n let listener = null;\n function clampIndex(n) {\n return Math.min(Math.max(n, 0), entries.length - 1);\n }\n function getCurrentLocation() {\n return entries[index];\n }\n function createMemoryLocation(to, state, key) {\n if (state === void 0) {\n state = null;\n }\n let location = createLocation(entries ? getCurrentLocation().pathname : \"/\", to, state, key);\n warning(location.pathname.charAt(0) === \"/\", \"relative pathnames are not supported in memory history: \" + JSON.stringify(to));\n return location;\n }\n function createHref(to) {\n return typeof to === \"string\" ? to : createPath(to);\n }\n let history = {\n get index() {\n return index;\n },\n get action() {\n return action;\n },\n get location() {\n return getCurrentLocation();\n },\n createHref,\n createURL(to) {\n return new URL(createHref(to), \"http://localhost\");\n },\n encodeLocation(to) {\n let path = typeof to === \"string\" ? parsePath(to) : to;\n return {\n pathname: path.pathname || \"\",\n search: path.search || \"\",\n hash: path.hash || \"\"\n };\n },\n push(to, state) {\n action = Action.Push;\n let nextLocation = createMemoryLocation(to, state);\n index += 1;\n entries.splice(index, entries.length, nextLocation);\n if (v5Compat && listener) {\n listener({\n action,\n location: nextLocation,\n delta: 1\n });\n }\n },\n replace(to, state) {\n action = Action.Replace;\n let nextLocation = createMemoryLocation(to, state);\n entries[index] = nextLocation;\n if (v5Compat && listener) {\n listener({\n action,\n location: nextLocation,\n delta: 0\n });\n }\n },\n go(delta) {\n action = Action.Pop;\n let nextIndex = clampIndex(index + delta);\n let nextLocation = entries[nextIndex];\n index = nextIndex;\n if (listener) {\n listener({\n action,\n location: nextLocation,\n delta\n });\n }\n },\n listen(fn) {\n listener = fn;\n return () => {\n listener = null;\n };\n }\n };\n return history;\n}\n/**\n * Browser history stores the location in regular URLs. This is the standard for\n * most web apps, but it requires some configuration on the server to ensure you\n * serve the same app at multiple URLs.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createbrowserhistory\n */\nfunction createBrowserHistory(options) {\n if (options === void 0) {\n options = {};\n }\n function createBrowserLocation(window, globalHistory) {\n let {\n pathname,\n search,\n hash\n } = window.location;\n return createLocation(\"\", {\n pathname,\n search,\n hash\n },\n // state defaults to `null` because `window.history.state` does\n globalHistory.state && globalHistory.state.usr || null, globalHistory.state && globalHistory.state.key || \"default\");\n }\n function createBrowserHref(window, to) {\n return typeof to === \"string\" ? to : createPath(to);\n }\n return getUrlBasedHistory(createBrowserLocation, createBrowserHref, null, options);\n}\n/**\n * Hash history stores the location in window.location.hash. This makes it ideal\n * for situations where you don't want to send the location to the server for\n * some reason, either because you do cannot configure it or the URL space is\n * reserved for something else.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createhashhistory\n */\nfunction createHashHistory(options) {\n if (options === void 0) {\n options = {};\n }\n function createHashLocation(window, globalHistory) {\n let {\n pathname = \"/\",\n search = \"\",\n hash = \"\"\n } = parsePath(window.location.hash.substr(1));\n // Hash URL should always have a leading / just like window.location.pathname\n // does, so if an app ends up at a route like /#something then we add a\n // leading slash so all of our path-matching behaves the same as if it would\n // in a browser router. This is particularly important when there exists a\n // root splat route () since that matches internally against\n // \"/*\" and we'd expect /#something to 404 in a hash router app.\n if (!pathname.startsWith(\"/\") && !pathname.startsWith(\".\")) {\n pathname = \"/\" + pathname;\n }\n return createLocation(\"\", {\n pathname,\n search,\n hash\n },\n // state defaults to `null` because `window.history.state` does\n globalHistory.state && globalHistory.state.usr || null, globalHistory.state && globalHistory.state.key || \"default\");\n }\n function createHashHref(window, to) {\n let base = window.document.querySelector(\"base\");\n let href = \"\";\n if (base && base.getAttribute(\"href\")) {\n let url = window.location.href;\n let hashIndex = url.indexOf(\"#\");\n href = hashIndex === -1 ? url : url.slice(0, hashIndex);\n }\n return href + \"#\" + (typeof to === \"string\" ? to : createPath(to));\n }\n function validateHashLocation(location, to) {\n warning(location.pathname.charAt(0) === \"/\", \"relative pathnames are not supported in hash history.push(\" + JSON.stringify(to) + \")\");\n }\n return getUrlBasedHistory(createHashLocation, createHashHref, validateHashLocation, options);\n}\nfunction invariant(value, message) {\n if (value === false || value === null || typeof value === \"undefined\") {\n throw new Error(message);\n }\n}\nfunction warning(cond, message) {\n if (!cond) {\n // eslint-disable-next-line no-console\n if (typeof console !== \"undefined\") console.warn(message);\n try {\n // Welcome to debugging history!\n //\n // This error is thrown as a convenience, so you can more easily\n // find the source for a warning that appears in the console by\n // enabling \"pause on exceptions\" in your JavaScript debugger.\n throw new Error(message);\n // eslint-disable-next-line no-empty\n } catch (e) {}\n }\n}\nfunction createKey() {\n return Math.random().toString(36).substr(2, 8);\n}\n/**\n * For browser-based histories, we combine the state and key into an object\n */\nfunction getHistoryState(location, index) {\n return {\n usr: location.state,\n key: location.key,\n idx: index\n };\n}\n/**\n * Creates a Location object with a unique key from the given Path\n */\nfunction createLocation(current, to, state, key) {\n if (state === void 0) {\n state = null;\n }\n let location = _extends({\n pathname: typeof current === \"string\" ? current : current.pathname,\n search: \"\",\n hash: \"\"\n }, typeof to === \"string\" ? parsePath(to) : to, {\n state,\n // TODO: This could be cleaned up. push/replace should probably just take\n // full Locations now and avoid the need to run through this flow at all\n // But that's a pretty big refactor to the current test suite so going to\n // keep as is for the time being and just let any incoming keys take precedence\n key: to && to.key || key || createKey()\n });\n return location;\n}\n/**\n * Creates a string URL path from the given pathname, search, and hash components.\n */\nfunction createPath(_ref) {\n let {\n pathname = \"/\",\n search = \"\",\n hash = \"\"\n } = _ref;\n if (search && search !== \"?\") pathname += search.charAt(0) === \"?\" ? search : \"?\" + search;\n if (hash && hash !== \"#\") pathname += hash.charAt(0) === \"#\" ? hash : \"#\" + hash;\n return pathname;\n}\n/**\n * Parses a string URL path into its separate pathname, search, and hash components.\n */\nfunction parsePath(path) {\n let parsedPath = {};\n if (path) {\n let hashIndex = path.indexOf(\"#\");\n if (hashIndex >= 0) {\n parsedPath.hash = path.substr(hashIndex);\n path = path.substr(0, hashIndex);\n }\n let searchIndex = path.indexOf(\"?\");\n if (searchIndex >= 0) {\n parsedPath.search = path.substr(searchIndex);\n path = path.substr(0, searchIndex);\n }\n if (path) {\n parsedPath.pathname = path;\n }\n }\n return parsedPath;\n}\nfunction getUrlBasedHistory(getLocation, createHref, validateLocation, options) {\n if (options === void 0) {\n options = {};\n }\n let {\n window = document.defaultView,\n v5Compat = false\n } = options;\n let globalHistory = window.history;\n let action = Action.Pop;\n let listener = null;\n let index = getIndex();\n // Index should only be null when we initialize. If not, it's because the\n // user called history.pushState or history.replaceState directly, in which\n // case we should log a warning as it will result in bugs.\n if (index == null) {\n index = 0;\n globalHistory.replaceState(_extends({}, globalHistory.state, {\n idx: index\n }), \"\");\n }\n function getIndex() {\n let state = globalHistory.state || {\n idx: null\n };\n return state.idx;\n }\n function handlePop() {\n action = Action.Pop;\n let nextIndex = getIndex();\n let delta = nextIndex == null ? null : nextIndex - index;\n index = nextIndex;\n if (listener) {\n listener({\n action,\n location: history.location,\n delta\n });\n }\n }\n function push(to, state) {\n action = Action.Push;\n let location = createLocation(history.location, to, state);\n if (validateLocation) validateLocation(location, to);\n index = getIndex() + 1;\n let historyState = getHistoryState(location, index);\n let url = history.createHref(location);\n // try...catch because iOS limits us to 100 pushState calls :/\n try {\n globalHistory.pushState(historyState, \"\", url);\n } catch (error) {\n // If the exception is because `state` can't be serialized, let that throw\n // outwards just like a replace call would so the dev knows the cause\n // https://html.spec.whatwg.org/multipage/nav-history-apis.html#shared-history-push/replace-state-steps\n // https://html.spec.whatwg.org/multipage/structured-data.html#structuredserializeinternal\n if (error instanceof DOMException && error.name === \"DataCloneError\") {\n throw error;\n }\n // They are going to lose state here, but there is no real\n // way to warn them about it since the page will refresh...\n window.location.assign(url);\n }\n if (v5Compat && listener) {\n listener({\n action,\n location: history.location,\n delta: 1\n });\n }\n }\n function replace(to, state) {\n action = Action.Replace;\n let location = createLocation(history.location, to, state);\n if (validateLocation) validateLocation(location, to);\n index = getIndex();\n let historyState = getHistoryState(location, index);\n let url = history.createHref(location);\n globalHistory.replaceState(historyState, \"\", url);\n if (v5Compat && listener) {\n listener({\n action,\n location: history.location,\n delta: 0\n });\n }\n }\n function createURL(to) {\n // window.location.origin is \"null\" (the literal string value) in Firefox\n // under certain conditions, notably when serving from a local HTML file\n // See https://bugzilla.mozilla.org/show_bug.cgi?id=878297\n let base = window.location.origin !== \"null\" ? window.location.origin : window.location.href;\n let href = typeof to === \"string\" ? to : createPath(to);\n // Treating this as a full URL will strip any trailing spaces so we need to\n // pre-encode them since they might be part of a matching splat param from\n // an ancestor route\n href = href.replace(/ $/, \"%20\");\n invariant(base, \"No window.location.(origin|href) available to create URL for href: \" + href);\n return new URL(href, base);\n }\n let history = {\n get action() {\n return action;\n },\n get location() {\n return getLocation(window, globalHistory);\n },\n listen(fn) {\n if (listener) {\n throw new Error(\"A history only accepts one active listener\");\n }\n window.addEventListener(PopStateEventType, handlePop);\n listener = fn;\n return () => {\n window.removeEventListener(PopStateEventType, handlePop);\n listener = null;\n };\n },\n createHref(to) {\n return createHref(window, to);\n },\n createURL,\n encodeLocation(to) {\n // Encode a Location the same way window.location would\n let url = createURL(to);\n return {\n pathname: url.pathname,\n search: url.search,\n hash: url.hash\n };\n },\n push,\n replace,\n go(n) {\n return globalHistory.go(n);\n }\n };\n return history;\n}\n//#endregion\n\nvar ResultType;\n(function (ResultType) {\n ResultType[\"data\"] = \"data\";\n ResultType[\"deferred\"] = \"deferred\";\n ResultType[\"redirect\"] = \"redirect\";\n ResultType[\"error\"] = \"error\";\n})(ResultType || (ResultType = {}));\nconst immutableRouteKeys = new Set([\"lazy\", \"caseSensitive\", \"path\", \"id\", \"index\", \"children\"]);\nfunction isIndexRoute(route) {\n return route.index === true;\n}\n// Walk the route tree generating unique IDs where necessary, so we are working\n// solely with AgnosticDataRouteObject's within the Router\nfunction convertRoutesToDataRoutes(routes, mapRouteProperties, parentPath, manifest) {\n if (parentPath === void 0) {\n parentPath = [];\n }\n if (manifest === void 0) {\n manifest = {};\n }\n return routes.map((route, index) => {\n let treePath = [...parentPath, String(index)];\n let id = typeof route.id === \"string\" ? route.id : treePath.join(\"-\");\n invariant(route.index !== true || !route.children, \"Cannot specify children on an index route\");\n invariant(!manifest[id], \"Found a route id collision on id \\\"\" + id + \"\\\". Route \" + \"id's must be globally unique within Data Router usages\");\n if (isIndexRoute(route)) {\n let indexRoute = _extends({}, route, mapRouteProperties(route), {\n id\n });\n manifest[id] = indexRoute;\n return indexRoute;\n } else {\n let pathOrLayoutRoute = _extends({}, route, mapRouteProperties(route), {\n id,\n children: undefined\n });\n manifest[id] = pathOrLayoutRoute;\n if (route.children) {\n pathOrLayoutRoute.children = convertRoutesToDataRoutes(route.children, mapRouteProperties, treePath, manifest);\n }\n return pathOrLayoutRoute;\n }\n });\n}\n/**\n * Matches the given routes to a location and returns the match data.\n *\n * @see https://reactrouter.com/v6/utils/match-routes\n */\nfunction matchRoutes(routes, locationArg, basename) {\n if (basename === void 0) {\n basename = \"/\";\n }\n return matchRoutesImpl(routes, locationArg, basename, false);\n}\nfunction matchRoutesImpl(routes, locationArg, basename, allowPartial) {\n let location = typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n let pathname = stripBasename(location.pathname || \"/\", basename);\n if (pathname == null) {\n return null;\n }\n let branches = flattenRoutes(routes);\n rankRouteBranches(branches);\n let matches = null;\n for (let i = 0; matches == null && i < branches.length; ++i) {\n // Incoming pathnames are generally encoded from either window.location\n // or from router.navigate, but we want to match against the unencoded\n // paths in the route definitions. Memory router locations won't be\n // encoded here but there also shouldn't be anything to decode so this\n // should be a safe operation. This avoids needing matchRoutes to be\n // history-aware.\n let decoded = decodePath(pathname);\n matches = matchRouteBranch(branches[i], decoded, allowPartial);\n }\n return matches;\n}\nfunction convertRouteMatchToUiMatch(match, loaderData) {\n let {\n route,\n pathname,\n params\n } = match;\n return {\n id: route.id,\n pathname,\n params,\n data: loaderData[route.id],\n handle: route.handle\n };\n}\nfunction flattenRoutes(routes, branches, parentsMeta, parentPath) {\n if (branches === void 0) {\n branches = [];\n }\n if (parentsMeta === void 0) {\n parentsMeta = [];\n }\n if (parentPath === void 0) {\n parentPath = \"\";\n }\n let flattenRoute = (route, index, relativePath) => {\n let meta = {\n relativePath: relativePath === undefined ? route.path || \"\" : relativePath,\n caseSensitive: route.caseSensitive === true,\n childrenIndex: index,\n route\n };\n if (meta.relativePath.startsWith(\"/\")) {\n invariant(meta.relativePath.startsWith(parentPath), \"Absolute route path \\\"\" + meta.relativePath + \"\\\" nested under path \" + (\"\\\"\" + parentPath + \"\\\" is not valid. An absolute child route path \") + \"must start with the combined path of all its parent routes.\");\n meta.relativePath = meta.relativePath.slice(parentPath.length);\n }\n let path = joinPaths([parentPath, meta.relativePath]);\n let routesMeta = parentsMeta.concat(meta);\n // Add the children before adding this route to the array, so we traverse the\n // route tree depth-first and child routes appear before their parents in\n // the \"flattened\" version.\n if (route.children && route.children.length > 0) {\n invariant(\n // Our types know better, but runtime JS may not!\n // @ts-expect-error\n route.index !== true, \"Index routes must not have child routes. Please remove \" + (\"all child routes from route path \\\"\" + path + \"\\\".\"));\n flattenRoutes(route.children, branches, routesMeta, path);\n }\n // Routes without a path shouldn't ever match by themselves unless they are\n // index routes, so don't add them to the list of possible branches.\n if (route.path == null && !route.index) {\n return;\n }\n branches.push({\n path,\n score: computeScore(path, route.index),\n routesMeta\n });\n };\n routes.forEach((route, index) => {\n var _route$path;\n // coarse-grain check for optional params\n if (route.path === \"\" || !((_route$path = route.path) != null && _route$path.includes(\"?\"))) {\n flattenRoute(route, index);\n } else {\n for (let exploded of explodeOptionalSegments(route.path)) {\n flattenRoute(route, index, exploded);\n }\n }\n });\n return branches;\n}\n/**\n * Computes all combinations of optional path segments for a given path,\n * excluding combinations that are ambiguous and of lower priority.\n *\n * For example, `/one/:two?/three/:four?/:five?` explodes to:\n * - `/one/three`\n * - `/one/:two/three`\n * - `/one/three/:four`\n * - `/one/three/:five`\n * - `/one/:two/three/:four`\n * - `/one/:two/three/:five`\n * - `/one/three/:four/:five`\n * - `/one/:two/three/:four/:five`\n */\nfunction explodeOptionalSegments(path) {\n let segments = path.split(\"/\");\n if (segments.length === 0) return [];\n let [first, ...rest] = segments;\n // Optional path segments are denoted by a trailing `?`\n let isOptional = first.endsWith(\"?\");\n // Compute the corresponding required segment: `foo?` -> `foo`\n let required = first.replace(/\\?$/, \"\");\n if (rest.length === 0) {\n // Intepret empty string as omitting an optional segment\n // `[\"one\", \"\", \"three\"]` corresponds to omitting `:two` from `/one/:two?/three` -> `/one/three`\n return isOptional ? [required, \"\"] : [required];\n }\n let restExploded = explodeOptionalSegments(rest.join(\"/\"));\n let result = [];\n // All child paths with the prefix. Do this for all children before the\n // optional version for all children, so we get consistent ordering where the\n // parent optional aspect is preferred as required. Otherwise, we can get\n // child sections interspersed where deeper optional segments are higher than\n // parent optional segments, where for example, /:two would explode _earlier_\n // then /:one. By always including the parent as required _for all children_\n // first, we avoid this issue\n result.push(...restExploded.map(subpath => subpath === \"\" ? required : [required, subpath].join(\"/\")));\n // Then, if this is an optional value, add all child versions without\n if (isOptional) {\n result.push(...restExploded);\n }\n // for absolute paths, ensure `/` instead of empty segment\n return result.map(exploded => path.startsWith(\"/\") && exploded === \"\" ? \"/\" : exploded);\n}\nfunction rankRouteBranches(branches) {\n branches.sort((a, b) => a.score !== b.score ? b.score - a.score // Higher score first\n : compareIndexes(a.routesMeta.map(meta => meta.childrenIndex), b.routesMeta.map(meta => meta.childrenIndex)));\n}\nconst paramRe = /^:[\\w-]+$/;\nconst dynamicSegmentValue = 3;\nconst indexRouteValue = 2;\nconst emptySegmentValue = 1;\nconst staticSegmentValue = 10;\nconst splatPenalty = -2;\nconst isSplat = s => s === \"*\";\nfunction computeScore(path, index) {\n let segments = path.split(\"/\");\n let initialScore = segments.length;\n if (segments.some(isSplat)) {\n initialScore += splatPenalty;\n }\n if (index) {\n initialScore += indexRouteValue;\n }\n return segments.filter(s => !isSplat(s)).reduce((score, segment) => score + (paramRe.test(segment) ? dynamicSegmentValue : segment === \"\" ? emptySegmentValue : staticSegmentValue), initialScore);\n}\nfunction compareIndexes(a, b) {\n let siblings = a.length === b.length && a.slice(0, -1).every((n, i) => n === b[i]);\n return siblings ?\n // If two routes are siblings, we should try to match the earlier sibling\n // first. This allows people to have fine-grained control over the matching\n // behavior by simply putting routes with identical paths in the order they\n // want them tried.\n a[a.length - 1] - b[b.length - 1] :\n // Otherwise, it doesn't really make sense to rank non-siblings by index,\n // so they sort equally.\n 0;\n}\nfunction matchRouteBranch(branch, pathname, allowPartial) {\n if (allowPartial === void 0) {\n allowPartial = false;\n }\n let {\n routesMeta\n } = branch;\n let matchedParams = {};\n let matchedPathname = \"/\";\n let matches = [];\n for (let i = 0; i < routesMeta.length; ++i) {\n let meta = routesMeta[i];\n let end = i === routesMeta.length - 1;\n let remainingPathname = matchedPathname === \"/\" ? pathname : pathname.slice(matchedPathname.length) || \"/\";\n let match = matchPath({\n path: meta.relativePath,\n caseSensitive: meta.caseSensitive,\n end\n }, remainingPathname);\n let route = meta.route;\n if (!match && end && allowPartial && !routesMeta[routesMeta.length - 1].route.index) {\n match = matchPath({\n path: meta.relativePath,\n caseSensitive: meta.caseSensitive,\n end: false\n }, remainingPathname);\n }\n if (!match) {\n return null;\n }\n Object.assign(matchedParams, match.params);\n matches.push({\n // TODO: Can this as be avoided?\n params: matchedParams,\n pathname: joinPaths([matchedPathname, match.pathname]),\n pathnameBase: normalizePathname(joinPaths([matchedPathname, match.pathnameBase])),\n route\n });\n if (match.pathnameBase !== \"/\") {\n matchedPathname = joinPaths([matchedPathname, match.pathnameBase]);\n }\n }\n return matches;\n}\n/**\n * Returns a path with params interpolated.\n *\n * @see https://reactrouter.com/v6/utils/generate-path\n */\nfunction generatePath(originalPath, params) {\n if (params === void 0) {\n params = {};\n }\n let path = originalPath;\n if (path.endsWith(\"*\") && path !== \"*\" && !path.endsWith(\"/*\")) {\n warning(false, \"Route path \\\"\" + path + \"\\\" will be treated as if it were \" + (\"\\\"\" + path.replace(/\\*$/, \"/*\") + \"\\\" because the `*` character must \") + \"always follow a `/` in the pattern. To get rid of this warning, \" + (\"please change the route path to \\\"\" + path.replace(/\\*$/, \"/*\") + \"\\\".\"));\n path = path.replace(/\\*$/, \"/*\");\n }\n // ensure `/` is added at the beginning if the path is absolute\n const prefix = path.startsWith(\"/\") ? \"/\" : \"\";\n const stringify = p => p == null ? \"\" : typeof p === \"string\" ? p : String(p);\n const segments = path.split(/\\/+/).map((segment, index, array) => {\n const isLastSegment = index === array.length - 1;\n // only apply the splat if it's the last segment\n if (isLastSegment && segment === \"*\") {\n const star = \"*\";\n // Apply the splat\n return stringify(params[star]);\n }\n const keyMatch = segment.match(/^:([\\w-]+)(\\??)$/);\n if (keyMatch) {\n const [, key, optional] = keyMatch;\n let param = params[key];\n invariant(optional === \"?\" || param != null, \"Missing \\\":\" + key + \"\\\" param\");\n return stringify(param);\n }\n // Remove any optional markers from optional static segments\n return segment.replace(/\\?$/g, \"\");\n })\n // Remove empty segments\n .filter(segment => !!segment);\n return prefix + segments.join(\"/\");\n}\n/**\n * Performs pattern matching on a URL pathname and returns information about\n * the match.\n *\n * @see https://reactrouter.com/v6/utils/match-path\n */\nfunction matchPath(pattern, pathname) {\n if (typeof pattern === \"string\") {\n pattern = {\n path: pattern,\n caseSensitive: false,\n end: true\n };\n }\n let [matcher, compiledParams] = compilePath(pattern.path, pattern.caseSensitive, pattern.end);\n let match = pathname.match(matcher);\n if (!match) return null;\n let matchedPathname = match[0];\n let pathnameBase = matchedPathname.replace(/(.)\\/+$/, \"$1\");\n let captureGroups = match.slice(1);\n let params = compiledParams.reduce((memo, _ref, index) => {\n let {\n paramName,\n isOptional\n } = _ref;\n // We need to compute the pathnameBase here using the raw splat value\n // instead of using params[\"*\"] later because it will be decoded then\n if (paramName === \"*\") {\n let splatValue = captureGroups[index] || \"\";\n pathnameBase = matchedPathname.slice(0, matchedPathname.length - splatValue.length).replace(/(.)\\/+$/, \"$1\");\n }\n const value = captureGroups[index];\n if (isOptional && !value) {\n memo[paramName] = undefined;\n } else {\n memo[paramName] = (value || \"\").replace(/%2F/g, \"/\");\n }\n return memo;\n }, {});\n return {\n params,\n pathname: matchedPathname,\n pathnameBase,\n pattern\n };\n}\nfunction compilePath(path, caseSensitive, end) {\n if (caseSensitive === void 0) {\n caseSensitive = false;\n }\n if (end === void 0) {\n end = true;\n }\n warning(path === \"*\" || !path.endsWith(\"*\") || path.endsWith(\"/*\"), \"Route path \\\"\" + path + \"\\\" will be treated as if it were \" + (\"\\\"\" + path.replace(/\\*$/, \"/*\") + \"\\\" because the `*` character must \") + \"always follow a `/` in the pattern. To get rid of this warning, \" + (\"please change the route path to \\\"\" + path.replace(/\\*$/, \"/*\") + \"\\\".\"));\n let params = [];\n let regexpSource = \"^\" + path.replace(/\\/*\\*?$/, \"\") // Ignore trailing / and /*, we'll handle it below\n .replace(/^\\/*/, \"/\") // Make sure it has a leading /\n .replace(/[\\\\.*+^${}|()[\\]]/g, \"\\\\$&\") // Escape special regex chars\n .replace(/\\/:([\\w-]+)(\\?)?/g, (_, paramName, isOptional) => {\n params.push({\n paramName,\n isOptional: isOptional != null\n });\n return isOptional ? \"/?([^\\\\/]+)?\" : \"/([^\\\\/]+)\";\n });\n if (path.endsWith(\"*\")) {\n params.push({\n paramName: \"*\"\n });\n regexpSource += path === \"*\" || path === \"/*\" ? \"(.*)$\" // Already matched the initial /, just match the rest\n : \"(?:\\\\/(.+)|\\\\/*)$\"; // Don't include the / in params[\"*\"]\n } else if (end) {\n // When matching to the end, ignore trailing slashes\n regexpSource += \"\\\\/*$\";\n } else if (path !== \"\" && path !== \"/\") {\n // If our path is non-empty and contains anything beyond an initial slash,\n // then we have _some_ form of path in our regex, so we should expect to\n // match only if we find the end of this path segment. Look for an optional\n // non-captured trailing slash (to match a portion of the URL) or the end\n // of the path (if we've matched to the end). We used to do this with a\n // word boundary but that gives false positives on routes like\n // /user-preferences since `-` counts as a word boundary.\n regexpSource += \"(?:(?=\\\\/|$))\";\n } else ;\n let matcher = new RegExp(regexpSource, caseSensitive ? undefined : \"i\");\n return [matcher, params];\n}\nfunction decodePath(value) {\n try {\n return value.split(\"/\").map(v => decodeURIComponent(v).replace(/\\//g, \"%2F\")).join(\"/\");\n } catch (error) {\n warning(false, \"The URL path \\\"\" + value + \"\\\" could not be decoded because it is is a \" + \"malformed URL segment. This is probably due to a bad percent \" + (\"encoding (\" + error + \").\"));\n return value;\n }\n}\n/**\n * @private\n */\nfunction stripBasename(pathname, basename) {\n if (basename === \"/\") return pathname;\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return null;\n }\n // We want to leave trailing slash behavior in the user's control, so if they\n // specify a basename with a trailing slash, we should support it\n let startIndex = basename.endsWith(\"/\") ? basename.length - 1 : basename.length;\n let nextChar = pathname.charAt(startIndex);\n if (nextChar && nextChar !== \"/\") {\n // pathname does not start with basename/\n return null;\n }\n return pathname.slice(startIndex) || \"/\";\n}\n/**\n * Returns a resolved path object relative to the given pathname.\n *\n * @see https://reactrouter.com/v6/utils/resolve-path\n */\nfunction resolvePath(to, fromPathname) {\n if (fromPathname === void 0) {\n fromPathname = \"/\";\n }\n let {\n pathname: toPathname,\n search = \"\",\n hash = \"\"\n } = typeof to === \"string\" ? parsePath(to) : to;\n let pathname = toPathname ? toPathname.startsWith(\"/\") ? toPathname : resolvePathname(toPathname, fromPathname) : fromPathname;\n return {\n pathname,\n search: normalizeSearch(search),\n hash: normalizeHash(hash)\n };\n}\nfunction resolvePathname(relativePath, fromPathname) {\n let segments = fromPathname.replace(/\\/+$/, \"\").split(\"/\");\n let relativeSegments = relativePath.split(\"/\");\n relativeSegments.forEach(segment => {\n if (segment === \"..\") {\n // Keep the root \"\" segment so the pathname starts at /\n if (segments.length > 1) segments.pop();\n } else if (segment !== \".\") {\n segments.push(segment);\n }\n });\n return segments.length > 1 ? segments.join(\"/\") : \"/\";\n}\nfunction getInvalidPathError(char, field, dest, path) {\n return \"Cannot include a '\" + char + \"' character in a manually specified \" + (\"`to.\" + field + \"` field [\" + JSON.stringify(path) + \"]. Please separate it out to the \") + (\"`to.\" + dest + \"` field. Alternatively you may provide the full path as \") + \"a string in and the router will parse it for you.\";\n}\n/**\n * @private\n *\n * When processing relative navigation we want to ignore ancestor routes that\n * do not contribute to the path, such that index/pathless layout routes don't\n * interfere.\n *\n * For example, when moving a route element into an index route and/or a\n * pathless layout route, relative link behavior contained within should stay\n * the same. Both of the following examples should link back to the root:\n *\n * \n * \n * \n *\n * \n * \n * }> // <-- Does not contribute\n * // <-- Does not contribute\n * \n * \n */\nfunction getPathContributingMatches(matches) {\n return matches.filter((match, index) => index === 0 || match.route.path && match.route.path.length > 0);\n}\n// Return the array of pathnames for the current route matches - used to\n// generate the routePathnames input for resolveTo()\nfunction getResolveToMatches(matches, v7_relativeSplatPath) {\n let pathMatches = getPathContributingMatches(matches);\n // When v7_relativeSplatPath is enabled, use the full pathname for the leaf\n // match so we include splat values for \".\" links. See:\n // https://github.com/remix-run/react-router/issues/11052#issuecomment-1836589329\n if (v7_relativeSplatPath) {\n return pathMatches.map((match, idx) => idx === pathMatches.length - 1 ? match.pathname : match.pathnameBase);\n }\n return pathMatches.map(match => match.pathnameBase);\n}\n/**\n * @private\n */\nfunction resolveTo(toArg, routePathnames, locationPathname, isPathRelative) {\n if (isPathRelative === void 0) {\n isPathRelative = false;\n }\n let to;\n if (typeof toArg === \"string\") {\n to = parsePath(toArg);\n } else {\n to = _extends({}, toArg);\n invariant(!to.pathname || !to.pathname.includes(\"?\"), getInvalidPathError(\"?\", \"pathname\", \"search\", to));\n invariant(!to.pathname || !to.pathname.includes(\"#\"), getInvalidPathError(\"#\", \"pathname\", \"hash\", to));\n invariant(!to.search || !to.search.includes(\"#\"), getInvalidPathError(\"#\", \"search\", \"hash\", to));\n }\n let isEmptyPath = toArg === \"\" || to.pathname === \"\";\n let toPathname = isEmptyPath ? \"/\" : to.pathname;\n let from;\n // Routing is relative to the current pathname if explicitly requested.\n //\n // If a pathname is explicitly provided in `to`, it should be relative to the\n // route context. This is explained in `Note on `` values` in our\n // migration guide from v5 as a means of disambiguation between `to` values\n // that begin with `/` and those that do not. However, this is problematic for\n // `to` values that do not provide a pathname. `to` can simply be a search or\n // hash string, in which case we should assume that the navigation is relative\n // to the current location's pathname and *not* the route pathname.\n if (toPathname == null) {\n from = locationPathname;\n } else {\n let routePathnameIndex = routePathnames.length - 1;\n // With relative=\"route\" (the default), each leading .. segment means\n // \"go up one route\" instead of \"go up one URL segment\". This is a key\n // difference from how works and a major reason we call this a\n // \"to\" value instead of a \"href\".\n if (!isPathRelative && toPathname.startsWith(\"..\")) {\n let toSegments = toPathname.split(\"/\");\n while (toSegments[0] === \"..\") {\n toSegments.shift();\n routePathnameIndex -= 1;\n }\n to.pathname = toSegments.join(\"/\");\n }\n from = routePathnameIndex >= 0 ? routePathnames[routePathnameIndex] : \"/\";\n }\n let path = resolvePath(to, from);\n // Ensure the pathname has a trailing slash if the original \"to\" had one\n let hasExplicitTrailingSlash = toPathname && toPathname !== \"/\" && toPathname.endsWith(\"/\");\n // Or if this was a link to the current path which has a trailing slash\n let hasCurrentTrailingSlash = (isEmptyPath || toPathname === \".\") && locationPathname.endsWith(\"/\");\n if (!path.pathname.endsWith(\"/\") && (hasExplicitTrailingSlash || hasCurrentTrailingSlash)) {\n path.pathname += \"/\";\n }\n return path;\n}\n/**\n * @private\n */\nfunction getToPathname(to) {\n // Empty strings should be treated the same as / paths\n return to === \"\" || to.pathname === \"\" ? \"/\" : typeof to === \"string\" ? parsePath(to).pathname : to.pathname;\n}\n/**\n * @private\n */\nconst joinPaths = paths => paths.join(\"/\").replace(/\\/\\/+/g, \"/\");\n/**\n * @private\n */\nconst normalizePathname = pathname => pathname.replace(/\\/+$/, \"\").replace(/^\\/*/, \"/\");\n/**\n * @private\n */\nconst normalizeSearch = search => !search || search === \"?\" ? \"\" : search.startsWith(\"?\") ? search : \"?\" + search;\n/**\n * @private\n */\nconst normalizeHash = hash => !hash || hash === \"#\" ? \"\" : hash.startsWith(\"#\") ? hash : \"#\" + hash;\n/**\n * This is a shortcut for creating `application/json` responses. Converts `data`\n * to JSON and sets the `Content-Type` header.\n *\n * @deprecated The `json` method is deprecated in favor of returning raw objects.\n * This method will be removed in v7.\n */\nconst json = function json(data, init) {\n if (init === void 0) {\n init = {};\n }\n let responseInit = typeof init === \"number\" ? {\n status: init\n } : init;\n let headers = new Headers(responseInit.headers);\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json; charset=utf-8\");\n }\n return new Response(JSON.stringify(data), _extends({}, responseInit, {\n headers\n }));\n};\nclass DataWithResponseInit {\n constructor(data, init) {\n this.type = \"DataWithResponseInit\";\n this.data = data;\n this.init = init || null;\n }\n}\n/**\n * Create \"responses\" that contain `status`/`headers` without forcing\n * serialization into an actual `Response` - used by Remix single fetch\n */\nfunction data(data, init) {\n return new DataWithResponseInit(data, typeof init === \"number\" ? {\n status: init\n } : init);\n}\nclass AbortedDeferredError extends Error {}\nclass DeferredData {\n constructor(data, responseInit) {\n this.pendingKeysSet = new Set();\n this.subscribers = new Set();\n this.deferredKeys = [];\n invariant(data && typeof data === \"object\" && !Array.isArray(data), \"defer() only accepts plain objects\");\n // Set up an AbortController + Promise we can race against to exit early\n // cancellation\n let reject;\n this.abortPromise = new Promise((_, r) => reject = r);\n this.controller = new AbortController();\n let onAbort = () => reject(new AbortedDeferredError(\"Deferred data aborted\"));\n this.unlistenAbortSignal = () => this.controller.signal.removeEventListener(\"abort\", onAbort);\n this.controller.signal.addEventListener(\"abort\", onAbort);\n this.data = Object.entries(data).reduce((acc, _ref2) => {\n let [key, value] = _ref2;\n return Object.assign(acc, {\n [key]: this.trackPromise(key, value)\n });\n }, {});\n if (this.done) {\n // All incoming values were resolved\n this.unlistenAbortSignal();\n }\n this.init = responseInit;\n }\n trackPromise(key, value) {\n if (!(value instanceof Promise)) {\n return value;\n }\n this.deferredKeys.push(key);\n this.pendingKeysSet.add(key);\n // We store a little wrapper promise that will be extended with\n // _data/_error props upon resolve/reject\n let promise = Promise.race([value, this.abortPromise]).then(data => this.onSettle(promise, key, undefined, data), error => this.onSettle(promise, key, error));\n // Register rejection listeners to avoid uncaught promise rejections on\n // errors or aborted deferred values\n promise.catch(() => {});\n Object.defineProperty(promise, \"_tracked\", {\n get: () => true\n });\n return promise;\n }\n onSettle(promise, key, error, data) {\n if (this.controller.signal.aborted && error instanceof AbortedDeferredError) {\n this.unlistenAbortSignal();\n Object.defineProperty(promise, \"_error\", {\n get: () => error\n });\n return Promise.reject(error);\n }\n this.pendingKeysSet.delete(key);\n if (this.done) {\n // Nothing left to abort!\n this.unlistenAbortSignal();\n }\n // If the promise was resolved/rejected with undefined, we'll throw an error as you\n // should always resolve with a value or null\n if (error === undefined && data === undefined) {\n let undefinedError = new Error(\"Deferred data for key \\\"\" + key + \"\\\" resolved/rejected with `undefined`, \" + \"you must resolve/reject with a value or `null`.\");\n Object.defineProperty(promise, \"_error\", {\n get: () => undefinedError\n });\n this.emit(false, key);\n return Promise.reject(undefinedError);\n }\n if (data === undefined) {\n Object.defineProperty(promise, \"_error\", {\n get: () => error\n });\n this.emit(false, key);\n return Promise.reject(error);\n }\n Object.defineProperty(promise, \"_data\", {\n get: () => data\n });\n this.emit(false, key);\n return data;\n }\n emit(aborted, settledKey) {\n this.subscribers.forEach(subscriber => subscriber(aborted, settledKey));\n }\n subscribe(fn) {\n this.subscribers.add(fn);\n return () => this.subscribers.delete(fn);\n }\n cancel() {\n this.controller.abort();\n this.pendingKeysSet.forEach((v, k) => this.pendingKeysSet.delete(k));\n this.emit(true);\n }\n async resolveData(signal) {\n let aborted = false;\n if (!this.done) {\n let onAbort = () => this.cancel();\n signal.addEventListener(\"abort\", onAbort);\n aborted = await new Promise(resolve => {\n this.subscribe(aborted => {\n signal.removeEventListener(\"abort\", onAbort);\n if (aborted || this.done) {\n resolve(aborted);\n }\n });\n });\n }\n return aborted;\n }\n get done() {\n return this.pendingKeysSet.size === 0;\n }\n get unwrappedData() {\n invariant(this.data !== null && this.done, \"Can only unwrap data on initialized and settled deferreds\");\n return Object.entries(this.data).reduce((acc, _ref3) => {\n let [key, value] = _ref3;\n return Object.assign(acc, {\n [key]: unwrapTrackedPromise(value)\n });\n }, {});\n }\n get pendingKeys() {\n return Array.from(this.pendingKeysSet);\n }\n}\nfunction isTrackedPromise(value) {\n return value instanceof Promise && value._tracked === true;\n}\nfunction unwrapTrackedPromise(value) {\n if (!isTrackedPromise(value)) {\n return value;\n }\n if (value._error) {\n throw value._error;\n }\n return value._data;\n}\n/**\n * @deprecated The `defer` method is deprecated in favor of returning raw\n * objects. This method will be removed in v7.\n */\nconst defer = function defer(data, init) {\n if (init === void 0) {\n init = {};\n }\n let responseInit = typeof init === \"number\" ? {\n status: init\n } : init;\n return new DeferredData(data, responseInit);\n};\n/**\n * A redirect response. Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nconst redirect = function redirect(url, init) {\n if (init === void 0) {\n init = 302;\n }\n let responseInit = init;\n if (typeof responseInit === \"number\") {\n responseInit = {\n status: responseInit\n };\n } else if (typeof responseInit.status === \"undefined\") {\n responseInit.status = 302;\n }\n let headers = new Headers(responseInit.headers);\n headers.set(\"Location\", url);\n return new Response(null, _extends({}, responseInit, {\n headers\n }));\n};\n/**\n * A redirect response that will force a document reload to the new location.\n * Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nconst redirectDocument = (url, init) => {\n let response = redirect(url, init);\n response.headers.set(\"X-Remix-Reload-Document\", \"true\");\n return response;\n};\n/**\n * A redirect response that will perform a `history.replaceState` instead of a\n * `history.pushState` for client-side navigation redirects.\n * Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nconst replace = (url, init) => {\n let response = redirect(url, init);\n response.headers.set(\"X-Remix-Replace\", \"true\");\n return response;\n};\n/**\n * @private\n * Utility class we use to hold auto-unwrapped 4xx/5xx Response bodies\n *\n * We don't export the class for public use since it's an implementation\n * detail, but we export the interface above so folks can build their own\n * abstractions around instances via isRouteErrorResponse()\n */\nclass ErrorResponseImpl {\n constructor(status, statusText, data, internal) {\n if (internal === void 0) {\n internal = false;\n }\n this.status = status;\n this.statusText = statusText || \"\";\n this.internal = internal;\n if (data instanceof Error) {\n this.data = data.toString();\n this.error = data;\n } else {\n this.data = data;\n }\n }\n}\n/**\n * Check if the given error is an ErrorResponse generated from a 4xx/5xx\n * Response thrown from an action/loader\n */\nfunction isRouteErrorResponse(error) {\n return error != null && typeof error.status === \"number\" && typeof error.statusText === \"string\" && typeof error.internal === \"boolean\" && \"data\" in error;\n}\n\nconst validMutationMethodsArr = [\"post\", \"put\", \"patch\", \"delete\"];\nconst validMutationMethods = new Set(validMutationMethodsArr);\nconst validRequestMethodsArr = [\"get\", ...validMutationMethodsArr];\nconst validRequestMethods = new Set(validRequestMethodsArr);\nconst redirectStatusCodes = new Set([301, 302, 303, 307, 308]);\nconst redirectPreserveMethodStatusCodes = new Set([307, 308]);\nconst IDLE_NAVIGATION = {\n state: \"idle\",\n location: undefined,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined\n};\nconst IDLE_FETCHER = {\n state: \"idle\",\n data: undefined,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined\n};\nconst IDLE_BLOCKER = {\n state: \"unblocked\",\n proceed: undefined,\n reset: undefined,\n location: undefined\n};\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\nconst defaultMapRouteProperties = route => ({\n hasErrorBoundary: Boolean(route.hasErrorBoundary)\n});\nconst TRANSITIONS_STORAGE_KEY = \"remix-router-transitions\";\n//#endregion\n////////////////////////////////////////////////////////////////////////////////\n//#region createRouter\n////////////////////////////////////////////////////////////////////////////////\n/**\n * Create a router and listen to history POP navigations\n */\nfunction createRouter(init) {\n const routerWindow = init.window ? init.window : typeof window !== \"undefined\" ? window : undefined;\n const isBrowser = typeof routerWindow !== \"undefined\" && typeof routerWindow.document !== \"undefined\" && typeof routerWindow.document.createElement !== \"undefined\";\n const isServer = !isBrowser;\n invariant(init.routes.length > 0, \"You must provide a non-empty routes array to createRouter\");\n let mapRouteProperties;\n if (init.mapRouteProperties) {\n mapRouteProperties = init.mapRouteProperties;\n } else if (init.detectErrorBoundary) {\n // If they are still using the deprecated version, wrap it with the new API\n let detectErrorBoundary = init.detectErrorBoundary;\n mapRouteProperties = route => ({\n hasErrorBoundary: detectErrorBoundary(route)\n });\n } else {\n mapRouteProperties = defaultMapRouteProperties;\n }\n // Routes keyed by ID\n let manifest = {};\n // Routes in tree format for matching\n let dataRoutes = convertRoutesToDataRoutes(init.routes, mapRouteProperties, undefined, manifest);\n let inFlightDataRoutes;\n let basename = init.basename || \"/\";\n let dataStrategyImpl = init.dataStrategy || defaultDataStrategy;\n let patchRoutesOnNavigationImpl = init.patchRoutesOnNavigation;\n // Config driven behavior flags\n let future = _extends({\n v7_fetcherPersist: false,\n v7_normalizeFormMethod: false,\n v7_partialHydration: false,\n v7_prependBasename: false,\n v7_relativeSplatPath: false,\n v7_skipActionErrorRevalidation: false\n }, init.future);\n // Cleanup function for history\n let unlistenHistory = null;\n // Externally-provided functions to call on all state changes\n let subscribers = new Set();\n // Externally-provided object to hold scroll restoration locations during routing\n let savedScrollPositions = null;\n // Externally-provided function to get scroll restoration keys\n let getScrollRestorationKey = null;\n // Externally-provided function to get current scroll position\n let getScrollPosition = null;\n // One-time flag to control the initial hydration scroll restoration. Because\n // we don't get the saved positions from until _after_\n // the initial render, we need to manually trigger a separate updateState to\n // send along the restoreScrollPosition\n // Set to true if we have `hydrationData` since we assume we were SSR'd and that\n // SSR did the initial scroll restoration.\n let initialScrollRestored = init.hydrationData != null;\n let initialMatches = matchRoutes(dataRoutes, init.history.location, basename);\n let initialMatchesIsFOW = false;\n let initialErrors = null;\n if (initialMatches == null && !patchRoutesOnNavigationImpl) {\n // If we do not match a user-provided-route, fall back to the root\n // to allow the error boundary to take over\n let error = getInternalRouterError(404, {\n pathname: init.history.location.pathname\n });\n let {\n matches,\n route\n } = getShortCircuitMatches(dataRoutes);\n initialMatches = matches;\n initialErrors = {\n [route.id]: error\n };\n }\n // In SPA apps, if the user provided a patchRoutesOnNavigation implementation and\n // our initial match is a splat route, clear them out so we run through lazy\n // discovery on hydration in case there's a more accurate lazy route match.\n // In SSR apps (with `hydrationData`), we expect that the server will send\n // up the proper matched routes so we don't want to run lazy discovery on\n // initial hydration and want to hydrate into the splat route.\n if (initialMatches && !init.hydrationData) {\n let fogOfWar = checkFogOfWar(initialMatches, dataRoutes, init.history.location.pathname);\n if (fogOfWar.active) {\n initialMatches = null;\n }\n }\n let initialized;\n if (!initialMatches) {\n initialized = false;\n initialMatches = [];\n // If partial hydration and fog of war is enabled, we will be running\n // `patchRoutesOnNavigation` during hydration so include any partial matches as\n // the initial matches so we can properly render `HydrateFallback`'s\n if (future.v7_partialHydration) {\n let fogOfWar = checkFogOfWar(null, dataRoutes, init.history.location.pathname);\n if (fogOfWar.active && fogOfWar.matches) {\n initialMatchesIsFOW = true;\n initialMatches = fogOfWar.matches;\n }\n }\n } else if (initialMatches.some(m => m.route.lazy)) {\n // All initialMatches need to be loaded before we're ready. If we have lazy\n // functions around still then we'll need to run them in initialize()\n initialized = false;\n } else if (!initialMatches.some(m => m.route.loader)) {\n // If we've got no loaders to run, then we're good to go\n initialized = true;\n } else if (future.v7_partialHydration) {\n // If partial hydration is enabled, we're initialized so long as we were\n // provided with hydrationData for every route with a loader, and no loaders\n // were marked for explicit hydration\n let loaderData = init.hydrationData ? init.hydrationData.loaderData : null;\n let errors = init.hydrationData ? init.hydrationData.errors : null;\n // If errors exist, don't consider routes below the boundary\n if (errors) {\n let idx = initialMatches.findIndex(m => errors[m.route.id] !== undefined);\n initialized = initialMatches.slice(0, idx + 1).every(m => !shouldLoadRouteOnHydration(m.route, loaderData, errors));\n } else {\n initialized = initialMatches.every(m => !shouldLoadRouteOnHydration(m.route, loaderData, errors));\n }\n } else {\n // Without partial hydration - we're initialized if we were provided any\n // hydrationData - which is expected to be complete\n initialized = init.hydrationData != null;\n }\n let router;\n let state = {\n historyAction: init.history.action,\n location: init.history.location,\n matches: initialMatches,\n initialized,\n navigation: IDLE_NAVIGATION,\n // Don't restore on initial updateState() if we were SSR'd\n restoreScrollPosition: init.hydrationData != null ? false : null,\n preventScrollReset: false,\n revalidation: \"idle\",\n loaderData: init.hydrationData && init.hydrationData.loaderData || {},\n actionData: init.hydrationData && init.hydrationData.actionData || null,\n errors: init.hydrationData && init.hydrationData.errors || initialErrors,\n fetchers: new Map(),\n blockers: new Map()\n };\n // -- Stateful internal variables to manage navigations --\n // Current navigation in progress (to be committed in completeNavigation)\n let pendingAction = Action.Pop;\n // Should the current navigation prevent the scroll reset if scroll cannot\n // be restored?\n let pendingPreventScrollReset = false;\n // AbortController for the active navigation\n let pendingNavigationController;\n // Should the current navigation enable document.startViewTransition?\n let pendingViewTransitionEnabled = false;\n // Store applied view transitions so we can apply them on POP\n let appliedViewTransitions = new Map();\n // Cleanup function for persisting applied transitions to sessionStorage\n let removePageHideEventListener = null;\n // We use this to avoid touching history in completeNavigation if a\n // revalidation is entirely uninterrupted\n let isUninterruptedRevalidation = false;\n // Use this internal flag to force revalidation of all loaders:\n // - submissions (completed or interrupted)\n // - useRevalidator()\n // - X-Remix-Revalidate (from redirect)\n let isRevalidationRequired = false;\n // Use this internal array to capture routes that require revalidation due\n // to a cancelled deferred on action submission\n let cancelledDeferredRoutes = [];\n // Use this internal array to capture fetcher loads that were cancelled by an\n // action navigation and require revalidation\n let cancelledFetcherLoads = new Set();\n // AbortControllers for any in-flight fetchers\n let fetchControllers = new Map();\n // Track loads based on the order in which they started\n let incrementingLoadId = 0;\n // Track the outstanding pending navigation data load to be compared against\n // the globally incrementing load when a fetcher load lands after a completed\n // navigation\n let pendingNavigationLoadId = -1;\n // Fetchers that triggered data reloads as a result of their actions\n let fetchReloadIds = new Map();\n // Fetchers that triggered redirect navigations\n let fetchRedirectIds = new Set();\n // Most recent href/match for fetcher.load calls for fetchers\n let fetchLoadMatches = new Map();\n // Ref-count mounted fetchers so we know when it's ok to clean them up\n let activeFetchers = new Map();\n // Fetchers that have requested a delete when using v7_fetcherPersist,\n // they'll be officially removed after they return to idle\n let deletedFetchers = new Set();\n // Store DeferredData instances for active route matches. When a\n // route loader returns defer() we stick one in here. Then, when a nested\n // promise resolves we update loaderData. If a new navigation starts we\n // cancel active deferreds for eliminated routes.\n let activeDeferreds = new Map();\n // Store blocker functions in a separate Map outside of router state since\n // we don't need to update UI state if they change\n let blockerFunctions = new Map();\n // Flag to ignore the next history update, so we can revert the URL change on\n // a POP navigation that was blocked by the user without touching router state\n let unblockBlockerHistoryUpdate = undefined;\n // Initialize the router, all side effects should be kicked off from here.\n // Implemented as a Fluent API for ease of:\n // let router = createRouter(init).initialize();\n function initialize() {\n // If history informs us of a POP navigation, start the navigation but do not update\n // state. We'll update our own state once the navigation completes\n unlistenHistory = init.history.listen(_ref => {\n let {\n action: historyAction,\n location,\n delta\n } = _ref;\n // Ignore this event if it was just us resetting the URL from a\n // blocked POP navigation\n if (unblockBlockerHistoryUpdate) {\n unblockBlockerHistoryUpdate();\n unblockBlockerHistoryUpdate = undefined;\n return;\n }\n warning(blockerFunctions.size === 0 || delta != null, \"You are trying to use a blocker on a POP navigation to a location \" + \"that was not created by @remix-run/router. This will fail silently in \" + \"production. This can happen if you are navigating outside the router \" + \"via `window.history.pushState`/`window.location.hash` instead of using \" + \"router navigation APIs. This can also happen if you are using \" + \"createHashRouter and the user manually changes the URL.\");\n let blockerKey = shouldBlockNavigation({\n currentLocation: state.location,\n nextLocation: location,\n historyAction\n });\n if (blockerKey && delta != null) {\n // Restore the URL to match the current UI, but don't update router state\n let nextHistoryUpdatePromise = new Promise(resolve => {\n unblockBlockerHistoryUpdate = resolve;\n });\n init.history.go(delta * -1);\n // Put the blocker into a blocked state\n updateBlocker(blockerKey, {\n state: \"blocked\",\n location,\n proceed() {\n updateBlocker(blockerKey, {\n state: \"proceeding\",\n proceed: undefined,\n reset: undefined,\n location\n });\n // Re-do the same POP navigation we just blocked, after the url\n // restoration is also complete. See:\n // https://github.com/remix-run/react-router/issues/11613\n nextHistoryUpdatePromise.then(() => init.history.go(delta));\n },\n reset() {\n let blockers = new Map(state.blockers);\n blockers.set(blockerKey, IDLE_BLOCKER);\n updateState({\n blockers\n });\n }\n });\n return;\n }\n return startNavigation(historyAction, location);\n });\n if (isBrowser) {\n // FIXME: This feels gross. How can we cleanup the lines between\n // scrollRestoration/appliedTransitions persistance?\n restoreAppliedTransitions(routerWindow, appliedViewTransitions);\n let _saveAppliedTransitions = () => persistAppliedTransitions(routerWindow, appliedViewTransitions);\n routerWindow.addEventListener(\"pagehide\", _saveAppliedTransitions);\n removePageHideEventListener = () => routerWindow.removeEventListener(\"pagehide\", _saveAppliedTransitions);\n }\n // Kick off initial data load if needed. Use Pop to avoid modifying history\n // Note we don't do any handling of lazy here. For SPA's it'll get handled\n // in the normal navigation flow. For SSR it's expected that lazy modules are\n // resolved prior to router creation since we can't go into a fallbackElement\n // UI for SSR'd apps\n if (!state.initialized) {\n startNavigation(Action.Pop, state.location, {\n initialHydration: true\n });\n }\n return router;\n }\n // Clean up a router and it's side effects\n function dispose() {\n if (unlistenHistory) {\n unlistenHistory();\n }\n if (removePageHideEventListener) {\n removePageHideEventListener();\n }\n subscribers.clear();\n pendingNavigationController && pendingNavigationController.abort();\n state.fetchers.forEach((_, key) => deleteFetcher(key));\n state.blockers.forEach((_, key) => deleteBlocker(key));\n }\n // Subscribe to state updates for the router\n function subscribe(fn) {\n subscribers.add(fn);\n return () => subscribers.delete(fn);\n }\n // Update our state and notify the calling context of the change\n function updateState(newState, opts) {\n if (opts === void 0) {\n opts = {};\n }\n state = _extends({}, state, newState);\n // Prep fetcher cleanup so we can tell the UI which fetcher data entries\n // can be removed\n let completedFetchers = [];\n let deletedFetchersKeys = [];\n if (future.v7_fetcherPersist) {\n state.fetchers.forEach((fetcher, key) => {\n if (fetcher.state === \"idle\") {\n if (deletedFetchers.has(key)) {\n // Unmounted from the UI and can be totally removed\n deletedFetchersKeys.push(key);\n } else {\n // Returned to idle but still mounted in the UI, so semi-remains for\n // revalidations and such\n completedFetchers.push(key);\n }\n }\n });\n }\n // Remove any lingering deleted fetchers that have already been removed\n // from state.fetchers\n deletedFetchers.forEach(key => {\n if (!state.fetchers.has(key) && !fetchControllers.has(key)) {\n deletedFetchersKeys.push(key);\n }\n });\n // Iterate over a local copy so that if flushSync is used and we end up\n // removing and adding a new subscriber due to the useCallback dependencies,\n // we don't get ourselves into a loop calling the new subscriber immediately\n [...subscribers].forEach(subscriber => subscriber(state, {\n deletedFetchers: deletedFetchersKeys,\n viewTransitionOpts: opts.viewTransitionOpts,\n flushSync: opts.flushSync === true\n }));\n // Remove idle fetchers from state since we only care about in-flight fetchers.\n if (future.v7_fetcherPersist) {\n completedFetchers.forEach(key => state.fetchers.delete(key));\n deletedFetchersKeys.forEach(key => deleteFetcher(key));\n } else {\n // We already called deleteFetcher() on these, can remove them from this\n // Set now that we've handed the keys off to the data layer\n deletedFetchersKeys.forEach(key => deletedFetchers.delete(key));\n }\n }\n // Complete a navigation returning the state.navigation back to the IDLE_NAVIGATION\n // and setting state.[historyAction/location/matches] to the new route.\n // - Location is a required param\n // - Navigation will always be set to IDLE_NAVIGATION\n // - Can pass any other state in newState\n function completeNavigation(location, newState, _temp) {\n var _location$state, _location$state2;\n let {\n flushSync\n } = _temp === void 0 ? {} : _temp;\n // Deduce if we're in a loading/actionReload state:\n // - We have committed actionData in the store\n // - The current navigation was a mutation submission\n // - We're past the submitting state and into the loading state\n // - The location being loaded is not the result of a redirect\n let isActionReload = state.actionData != null && state.navigation.formMethod != null && isMutationMethod(state.navigation.formMethod) && state.navigation.state === \"loading\" && ((_location$state = location.state) == null ? void 0 : _location$state._isRedirect) !== true;\n let actionData;\n if (newState.actionData) {\n if (Object.keys(newState.actionData).length > 0) {\n actionData = newState.actionData;\n } else {\n // Empty actionData -> clear prior actionData due to an action error\n actionData = null;\n }\n } else if (isActionReload) {\n // Keep the current data if we're wrapping up the action reload\n actionData = state.actionData;\n } else {\n // Clear actionData on any other completed navigations\n actionData = null;\n }\n // Always preserve any existing loaderData from re-used routes\n let loaderData = newState.loaderData ? mergeLoaderData(state.loaderData, newState.loaderData, newState.matches || [], newState.errors) : state.loaderData;\n // On a successful navigation we can assume we got through all blockers\n // so we can start fresh\n let blockers = state.blockers;\n if (blockers.size > 0) {\n blockers = new Map(blockers);\n blockers.forEach((_, k) => blockers.set(k, IDLE_BLOCKER));\n }\n // Always respect the user flag. Otherwise don't reset on mutation\n // submission navigations unless they redirect\n let preventScrollReset = pendingPreventScrollReset === true || state.navigation.formMethod != null && isMutationMethod(state.navigation.formMethod) && ((_location$state2 = location.state) == null ? void 0 : _location$state2._isRedirect) !== true;\n // Commit any in-flight routes at the end of the HMR revalidation \"navigation\"\n if (inFlightDataRoutes) {\n dataRoutes = inFlightDataRoutes;\n inFlightDataRoutes = undefined;\n }\n if (isUninterruptedRevalidation) ; else if (pendingAction === Action.Pop) ; else if (pendingAction === Action.Push) {\n init.history.push(location, location.state);\n } else if (pendingAction === Action.Replace) {\n init.history.replace(location, location.state);\n }\n let viewTransitionOpts;\n // On POP, enable transitions if they were enabled on the original navigation\n if (pendingAction === Action.Pop) {\n // Forward takes precedence so they behave like the original navigation\n let priorPaths = appliedViewTransitions.get(state.location.pathname);\n if (priorPaths && priorPaths.has(location.pathname)) {\n viewTransitionOpts = {\n currentLocation: state.location,\n nextLocation: location\n };\n } else if (appliedViewTransitions.has(location.pathname)) {\n // If we don't have a previous forward nav, assume we're popping back to\n // the new location and enable if that location previously enabled\n viewTransitionOpts = {\n currentLocation: location,\n nextLocation: state.location\n };\n }\n } else if (pendingViewTransitionEnabled) {\n // Store the applied transition on PUSH/REPLACE\n let toPaths = appliedViewTransitions.get(state.location.pathname);\n if (toPaths) {\n toPaths.add(location.pathname);\n } else {\n toPaths = new Set([location.pathname]);\n appliedViewTransitions.set(state.location.pathname, toPaths);\n }\n viewTransitionOpts = {\n currentLocation: state.location,\n nextLocation: location\n };\n }\n updateState(_extends({}, newState, {\n actionData,\n loaderData,\n historyAction: pendingAction,\n location,\n initialized: true,\n navigation: IDLE_NAVIGATION,\n revalidation: \"idle\",\n restoreScrollPosition: getSavedScrollPosition(location, newState.matches || state.matches),\n preventScrollReset,\n blockers\n }), {\n viewTransitionOpts,\n flushSync: flushSync === true\n });\n // Reset stateful navigation vars\n pendingAction = Action.Pop;\n pendingPreventScrollReset = false;\n pendingViewTransitionEnabled = false;\n isUninterruptedRevalidation = false;\n isRevalidationRequired = false;\n cancelledDeferredRoutes = [];\n }\n // Trigger a navigation event, which can either be a numerical POP or a PUSH\n // replace with an optional submission\n async function navigate(to, opts) {\n if (typeof to === \"number\") {\n init.history.go(to);\n return;\n }\n let normalizedPath = normalizeTo(state.location, state.matches, basename, future.v7_prependBasename, to, future.v7_relativeSplatPath, opts == null ? void 0 : opts.fromRouteId, opts == null ? void 0 : opts.relative);\n let {\n path,\n submission,\n error\n } = normalizeNavigateOptions(future.v7_normalizeFormMethod, false, normalizedPath, opts);\n let currentLocation = state.location;\n let nextLocation = createLocation(state.location, path, opts && opts.state);\n // When using navigate as a PUSH/REPLACE we aren't reading an already-encoded\n // URL from window.location, so we need to encode it here so the behavior\n // remains the same as POP and non-data-router usages. new URL() does all\n // the same encoding we'd get from a history.pushState/window.location read\n // without having to touch history\n nextLocation = _extends({}, nextLocation, init.history.encodeLocation(nextLocation));\n let userReplace = opts && opts.replace != null ? opts.replace : undefined;\n let historyAction = Action.Push;\n if (userReplace === true) {\n historyAction = Action.Replace;\n } else if (userReplace === false) ; else if (submission != null && isMutationMethod(submission.formMethod) && submission.formAction === state.location.pathname + state.location.search) {\n // By default on submissions to the current location we REPLACE so that\n // users don't have to double-click the back button to get to the prior\n // location. If the user redirects to a different location from the\n // action/loader this will be ignored and the redirect will be a PUSH\n historyAction = Action.Replace;\n }\n let preventScrollReset = opts && \"preventScrollReset\" in opts ? opts.preventScrollReset === true : undefined;\n let flushSync = (opts && opts.flushSync) === true;\n let blockerKey = shouldBlockNavigation({\n currentLocation,\n nextLocation,\n historyAction\n });\n if (blockerKey) {\n // Put the blocker into a blocked state\n updateBlocker(blockerKey, {\n state: \"blocked\",\n location: nextLocation,\n proceed() {\n updateBlocker(blockerKey, {\n state: \"proceeding\",\n proceed: undefined,\n reset: undefined,\n location: nextLocation\n });\n // Send the same navigation through\n navigate(to, opts);\n },\n reset() {\n let blockers = new Map(state.blockers);\n blockers.set(blockerKey, IDLE_BLOCKER);\n updateState({\n blockers\n });\n }\n });\n return;\n }\n return await startNavigation(historyAction, nextLocation, {\n submission,\n // Send through the formData serialization error if we have one so we can\n // render at the right error boundary after we match routes\n pendingError: error,\n preventScrollReset,\n replace: opts && opts.replace,\n enableViewTransition: opts && opts.viewTransition,\n flushSync\n });\n }\n // Revalidate all current loaders. If a navigation is in progress or if this\n // is interrupted by a navigation, allow this to \"succeed\" by calling all\n // loaders during the next loader round\n function revalidate() {\n interruptActiveLoads();\n updateState({\n revalidation: \"loading\"\n });\n // If we're currently submitting an action, we don't need to start a new\n // navigation, we'll just let the follow up loader execution call all loaders\n if (state.navigation.state === \"submitting\") {\n return;\n }\n // If we're currently in an idle state, start a new navigation for the current\n // action/location and mark it as uninterrupted, which will skip the history\n // update in completeNavigation\n if (state.navigation.state === \"idle\") {\n startNavigation(state.historyAction, state.location, {\n startUninterruptedRevalidation: true\n });\n return;\n }\n // Otherwise, if we're currently in a loading state, just start a new\n // navigation to the navigation.location but do not trigger an uninterrupted\n // revalidation so that history correctly updates once the navigation completes\n startNavigation(pendingAction || state.historyAction, state.navigation.location, {\n overrideNavigation: state.navigation,\n // Proxy through any rending view transition\n enableViewTransition: pendingViewTransitionEnabled === true\n });\n }\n // Start a navigation to the given action/location. Can optionally provide a\n // overrideNavigation which will override the normalLoad in the case of a redirect\n // navigation\n async function startNavigation(historyAction, location, opts) {\n // Abort any in-progress navigations and start a new one. Unset any ongoing\n // uninterrupted revalidations unless told otherwise, since we want this\n // new navigation to update history normally\n pendingNavigationController && pendingNavigationController.abort();\n pendingNavigationController = null;\n pendingAction = historyAction;\n isUninterruptedRevalidation = (opts && opts.startUninterruptedRevalidation) === true;\n // Save the current scroll position every time we start a new navigation,\n // and track whether we should reset scroll on completion\n saveScrollPosition(state.location, state.matches);\n pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;\n pendingViewTransitionEnabled = (opts && opts.enableViewTransition) === true;\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let loadingNavigation = opts && opts.overrideNavigation;\n let matches = opts != null && opts.initialHydration && state.matches && state.matches.length > 0 && !initialMatchesIsFOW ?\n // `matchRoutes()` has already been called if we're in here via `router.initialize()`\n state.matches : matchRoutes(routesToUse, location, basename);\n let flushSync = (opts && opts.flushSync) === true;\n // Short circuit if it's only a hash change and not a revalidation or\n // mutation submission.\n //\n // Ignore on initial page loads because since the initial hydration will always\n // be \"same hash\". For example, on /page#hash and submit a