From 60e1b0a43c4060cfb5b3a0af42a357206d24e5cc Mon Sep 17 00:00:00 2001 From: Chris Veleris Date: Sat, 26 Oct 2024 00:57:49 +0300 Subject: [PATCH] Cleanup old code --- Dockerfile | 40 +++++++++- app.rb | 6 +- .../components/Project/ProjectModal.tsx | 2 +- app/helpers/authentication_helper.rb | 6 +- app/helpers/task_helper.rb | 77 ------------------- app/models/project.rb | 1 - app/routes/areas_routes.rb | 8 -- app/routes/authentication_routes.rb | 7 -- app/routes/notes_routes.rb | 12 +-- app/routes/projects_routes.rb | 27 ------- app/routes/tags_routes.rb | 28 +------ app/routes/tasks_routes.rb | 42 ++++------ app/routes/users_routes.rb | 16 ---- public/js/bundle.js | 6 +- 14 files changed, 63 insertions(+), 215 deletions(-) delete mode 100644 app/helpers/task_helper.rb diff --git a/Dockerfile b/Dockerfile index d7aa1a0..2e359da 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,23 +1,55 @@ +# Stage 1: Build the React frontend +FROM node:16 AS frontend-builder + +WORKDIR /app + +# Copy and install frontend dependencies +COPY package*.json ./ +RUN npm install + +# Copy the rest of the frontend code +COPY . . + +# Build the frontend assets +RUN npm run build + +# Stage 2: Build the Sinatra backend FROM ruby:3.2.2-slim -RUN apt-get update -qq && apt-get install -y build-essential libsqlite3-dev openssl libffi-dev libpq-dev +# Install necessary packages +RUN apt-get update -qq && apt-get install -y \ + build-essential \ + libsqlite3-dev \ + openssl \ + libffi-dev \ + libpq-dev WORKDIR /usr/src/app +# Copy and install backend dependencies COPY Gemfile* ./ - RUN bundle config set without 'development test' && bundle install +# Copy the backend code COPY . . +# Remove any existing development databases RUN rm -f db/development* +# Copy built frontend assets from the frontend builder stage +COPY --from=frontend-builder /app/public ./public + +# Expose the application port EXPOSE 9292 +# Set environment variables ENV RACK_ENV=production ENV TUDUDI_INTERNAL_SSL_ENABLED=false +# Generate SSL certificates RUN mkdir -p certs && \ - openssl req -x509 -newkey rsa:4096 -keyout certs/server.key -out certs/server.crt -days 365 -nodes -subj '/CN=localhost' + openssl req -x509 -newkey rsa:4096 -keyout certs/server.key -out certs/server.crt \ + -days 365 -nodes -subj '/CN=localhost' -CMD rake db:migrate; puma -C app/config/puma.rb +# Run database migrations and start the Puma server +CMD rake db:migrate && puma -C app/config/puma.rb diff --git a/app.rb b/app.rb index 88b0400..9eea234 100644 --- a/app.rb +++ b/app.rb @@ -33,9 +33,11 @@ set :public_folder, 'public' configure do enable :sessions - set :sessions, httponly: true, secure: (production? && ENV['TUDUDI_INTERNAL_SSL_ENABLED'] == 'true'), + secure_flag = production? && ENV['TUDUDI_INTERNAL_SSL_ENABLED'] == 'true' + set :sessions, httponly: true, + secure: secure_flag, expire_after: 2_592_000, - same_site: production? ? :none : :lax + same_site: secure_flag ? :none : :lax set :session_secret, ENV.fetch('TUDUDI_SESSION_SECRET') { SecureRandom.hex(64) } # Auto-create user if not exists diff --git a/app/frontend/components/Project/ProjectModal.tsx b/app/frontend/components/Project/ProjectModal.tsx index 8a2e8a4..f7a9487 100644 --- a/app/frontend/components/Project/ProjectModal.tsx +++ b/app/frontend/components/Project/ProjectModal.tsx @@ -65,7 +65,7 @@ const ProjectModal: React.FC = ({ isOpen, onClose, onSave, on return (
-
+
diff --git a/app/helpers/authentication_helper.rb b/app/helpers/authentication_helper.rb index f960f32..b0e19c9 100644 --- a/app/helpers/authentication_helper.rb +++ b/app/helpers/authentication_helper.rb @@ -8,16 +8,14 @@ module AuthenticationHelper end def require_login - # Allow requests to '/login' and '/logout' without checking for login return if ['/login', '/logout', '/api/current_user'].include? request.path - # If the user is not logged in and the request is not an API request, redirect to login return if logged_in? if request.xhr? || request.path.start_with?('/api/') - halt 401, { error: 'You must be logged in' }.to_json # For API calls, return a 401 status + halt 401, { error: 'You must be logged in' }.to_json else - redirect '/login' # For non-API calls, redirect to login page + redirect '/login' end end end diff --git a/app/helpers/task_helper.rb b/app/helpers/task_helper.rb deleted file mode 100644 index 0ccc15a..0000000 --- a/app/helpers/task_helper.rb +++ /dev/null @@ -1,77 +0,0 @@ -module TaskHelper - def priority_class(task) - return 'text-success' if task.done? - - case task.priority - when 'medium' - 'text-warning' - when 'high' - 'text-danger' - else - 'text-secondary' - end - end - - def due_date_badge_class(due_date) - return 'bg-light text-dark' unless due_date - - case due_date.to_date - when Date.today - 'bg-primary' - when Date.tomorrow - 'bg-info' - else - if due_date.to_date < Date.today - 'bg-danger' - else - 'bg-light text-dark' - end - end - end - - def format_due_date(due_date) - return '' unless due_date - - case due_date.to_date - when Date.today - 'TODAY' - when Date.tomorrow - 'TOMORROW' - when Date.yesterday - 'YESTERDAY' - else - due_date.strftime('%Y-%m-%d') - end - end - - def status_badge_class(status) - case status - when 'not_started' - 'bg-warning-subtle text-warning' - when 'in_progress' - 'bg-primary-subtle text-primary' - when 'done' - 'bg-success-subtle text-success' - else - 'bg-secondary-subtle text-secondary' - end - end - - def order_name(order_by) - return 'Select' unless order_by - - field, direction = order_by.split(':') - name = case field - when 'due_date' then 'Due Date' - when 'name' then 'Name' - when 'priority' then 'Priority' - when 'status' then 'Status' - when 'created_at' then 'Created At' - else 'Select' - end - - direction_icon = direction == 'asc' ? '' : '' - - "#{name} #{direction_icon}" - end -end diff --git a/app/models/project.rb b/app/models/project.rb index c841773..d741560 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1,4 +1,3 @@ -# models/project.rb class Project < ActiveRecord::Base belongs_to :user belongs_to :area, optional: true diff --git a/app/routes/areas_routes.rb b/app/routes/areas_routes.rb index 0d94885..94b322a 100644 --- a/app/routes/areas_routes.rb +++ b/app/routes/areas_routes.rb @@ -1,21 +1,14 @@ -# app.rb or your main Sinatra application file - require 'sinatra' require 'json' -# Assuming you have a helper method `current_user` to get the authenticated user - -# Create a new Area post '/api/areas' do content_type :json begin request_body = request.body.read area_data = JSON.parse(request_body, symbolize_names: true) - # Validate required fields halt 400, { error: 'Area name is required.' }.to_json unless area_data[:name] && !area_data[:name].strip.empty? - # Create new Area area = current_user.areas.build(name: area_data[:name], description: area_data[:description]) if area.save @@ -76,7 +69,6 @@ delete '/api/areas/:id' do end end -# Fetch all Areas get '/api/areas' do content_type :json areas = current_user.areas diff --git a/app/routes/authentication_routes.rb b/app/routes/authentication_routes.rb index 7a31a0e..ff60385 100644 --- a/app/routes/authentication_routes.rb +++ b/app/routes/authentication_routes.rb @@ -1,12 +1,6 @@ require 'json' class Sinatra::Application - # Serve the login page (if needed for non-React or fallback) - # get '/login' do - # erb :login - # end - - # Handle login requests (now accepting JSON) get '/api/current_user' do content_type :json @@ -42,7 +36,6 @@ class Sinatra::Application end end - # Handle logout get '/logout' do session.clear redirect '/login' diff --git a/app/routes/notes_routes.rb b/app/routes/notes_routes.rb index 94ebf16..15bbcb9 100644 --- a/app/routes/notes_routes.rb +++ b/app/routes/notes_routes.rb @@ -36,25 +36,21 @@ class Sinatra::Application halt 404, { error: 'Note not found.' }.to_json unless note - # Return the note and its associated tags as JSON note.to_json(include: :tags) end post '/api/note' do content_type :json - # Parse the request body to extract the JSON data request_body = request.body.read note_data = JSON.parse(request_body, symbolize_names: true) - # Extract the attributes from the parsed JSON data note_attributes = { title: note_data[:title], content: note_data[:content], user_id: current_user.id } - # Check for the presence of a project_id if note_data[:project_id].to_s.empty? note = current_user.notes.build(note_attributes) else @@ -63,7 +59,6 @@ class Sinatra::Application note = project.notes.build(note_attributes) end - # Save the note and update its tags if note.save update_note_tags(note, note_data[:tags]) status 201 @@ -79,7 +74,6 @@ class Sinatra::Application note = current_user.notes.find_by(id: params[:id]) halt 404, { error: 'Note not found.' }.to_json unless note - # Parse the request body to get the content, title, and tags request_body = request.body.read request_data = JSON.parse(request_body) @@ -88,7 +82,6 @@ class Sinatra::Application content: request_data['content'] } - # Handle project association if provided if request_data['project_id'] && !request_data['project_id'].to_s.empty? project = current_user.projects.find_by(id: request_data['project_id']) halt 400, { error: 'Invalid project.' }.to_json unless project @@ -97,10 +90,9 @@ class Sinatra::Application note.project = nil end - # Update the note and its tags if note.update(note_attributes) - update_note_tags(note, request_data['tags']) # Process tags correctly - note.to_json(include: :tags) # Return updated note with tags + update_note_tags(note, request_data['tags']) + note.to_json(include: :tags) else status 400 { error: 'There was a problem updating the note.', details: note.errors.full_messages }.to_json diff --git a/app/routes/projects_routes.rb b/app/routes/projects_routes.rb index 6e1ee38..f0e8598 100644 --- a/app/routes/projects_routes.rb +++ b/app/routes/projects_routes.rb @@ -1,19 +1,14 @@ require 'sinatra/namespace' class Sinatra::Application - # Include the namespace module register Sinatra::Namespace - # Namespace your routes under /api namespace '/api' do before do content_type :json end - # Get all projects and associated tasks with JSON response - # Get all projects and associated tasks with JSON response get '/projects' do - # Parse query parameters for 'active', 'pin_to_sidebar', and 'area_id' active_param = params[:active] is_active = active_param == 'true' unless active_param.nil? @@ -22,30 +17,20 @@ class Sinatra::Application area_id_param = params[:area_id] - # Build the query projects = current_user.projects .left_joins(:tasks, :area) .distinct .order('projects.name ASC') - # Apply 'active' filter if provided projects = projects.where(active: is_active) unless is_active.nil? - - # Apply 'pin_to_sidebar' filter if provided projects = projects.where(pin_to_sidebar: is_pinned) unless is_pinned.nil? - - # Apply 'area_id' filter if provided projects = projects.where(area_id: area_id_param) if area_id_param - - # Count task statuses for each project task_status_counts = projects.each_with_object({}) do |project, counts| counts[project.id] = project.task_status_counts end - # Group projects by area grouped_projects = projects.group_by(&:area) - # Return projects, task counts, and grouped projects as JSON { projects: projects.as_json(include: { tasks: {}, area: { only: :name } }), task_status_counts: task_status_counts, @@ -53,20 +38,15 @@ class Sinatra::Application }.to_json end - # Get a specific project by ID with JSON response get '/project/:id' do - # Find the project and include associated tasks project = current_user.projects.includes(:tasks).find_by(id: params[:id]) halt 404, { error: 'Project not found' }.to_json unless project - # Return the project and associated tasks as JSON project.as_json(include: { tasks: {}, area: { only: %i[id name] } }).to_json end - # Create a new project with JSON response post '/project' do - # Parse the request body as JSON request_body = request.body.read project_data = begin JSON.parse(request_body) @@ -74,7 +54,6 @@ class Sinatra::Application halt 400, { error: 'Invalid JSON format.' }.to_json end - # Build a new project with the provided parameters project = current_user.projects.new( name: project_data['name'], description: project_data['description'] || '', @@ -92,14 +71,11 @@ class Sinatra::Application end end - # Update an existing project by ID with JSON response patch '/project/:id' do - # Find the project by ID project = current_user.projects.find_by(id: params[:id]) halt 404, { error: 'Project not found.' }.to_json unless project - # Parse the request body as JSON request_body = request.body.read project_data = begin JSON.parse(request_body) @@ -107,7 +83,6 @@ class Sinatra::Application halt 400, { error: 'Invalid JSON format.' }.to_json end - # Update the project with the provided parameters project.assign_attributes( name: project_data['name'], description: project_data['description'], @@ -124,9 +99,7 @@ class Sinatra::Application end end - # Delete an existing project by ID with JSON response delete '/project/:id' do - # Find the project by ID project = current_user.projects.find_by(id: params[:id]) halt 404, { error: 'Project not found' }.to_json unless project diff --git a/app/routes/tags_routes.rb b/app/routes/tags_routes.rb index a002979..871df2a 100644 --- a/app/routes/tags_routes.rb +++ b/app/routes/tags_routes.rb @@ -1,90 +1,64 @@ class Sinatra::Application - # Get all tags with JSON response get '/api/tags' do content_type :json - # Fetch all tags for the current user tags = current_user.tags.order('name ASC') - # Return the tags as JSON tags.as_json(only: %i[id name]).to_json end - # Get a specific tag by ID with JSON response get '/api/tag/:id' do content_type :json - # Find the tag by ID tag = current_user.tags.find_by(id: params[:id]) - # Return a 404 status if the tag is not found halt 404, { error: 'Tag not found' }.to_json unless tag - # Return the tag as JSON tag.as_json(only: %i[id name]).to_json end - # Create a new tag with JSON response post '/api/tag' do content_type :json - # Parse the request body to get the tag name request_body = JSON.parse(request.body.read) tag = current_user.tags.new(name: request_body['name']) - # Attempt to save the tag if tag.save - # Return the newly created tag as JSON status 201 tag.as_json(only: %i[id name]).to_json else - # Return an error message with a 400 status if the tag creation fails status 400 { error: 'There was a problem creating the tag.' }.to_json end end - # Update an existing tag by ID with JSON response - patch '/api/tag/:id' do += patch '/api/tag/:id' do content_type :json - # Find the tag by ID tag = current_user.tags.find_by(id: params[:id]) - # Return a 404 status if the tag is not found halt 404, { error: 'Tag not found' }.to_json unless tag - # Parse the request body to get the updated tag name request_body = JSON.parse(request.body.read) tag.name = request_body['name'] - # Attempt to save the updated tag if tag.save - # Return the updated tag as JSON tag.as_json(only: %i[id name]).to_json - else - # Return an error message with a 400 status if the update fails status 400 { error: 'There was a problem updating the tag.' }.to_json end end - # Delete an existing tag by ID with JSON response delete '/api/tag/:id' do content_type :json - # Find the tag by ID tag = current_user.tags.find_by(id: params[:id]) - # Return a 404 status if the tag is not found halt 404, { error: 'Tag not found' }.to_json unless tag - # Attempt to delete the tag if tag.destroy - # Return a success message { message: 'Tag successfully deleted' }.to_json else - # Return an error message with a 400 status if deletion fails status 400 { error: 'There was a problem deleting the tag.' }.to_json end diff --git a/app/routes/tasks_routes.rb b/app/routes/tasks_routes.rb index aca3512..8d21a18 100644 --- a/app/routes/tasks_routes.rb +++ b/app/routes/tasks_routes.rb @@ -3,25 +3,20 @@ module Sinatra def update_task_tags(task, tags_data) return if tags_data.nil? - # Filter out nil or empty tag names, then ensure uniqueness with `uniq` tag_names = tags_data.map { |tag| tag['name'] }.compact.reject(&:empty?).uniq - # Find or create tags based on the tag names existing_tags = Tag.where(name: tag_names) new_tags = tag_names - existing_tags.pluck(:name) created_tags = new_tags.map { |name| Tag.create(name: name) } - # Associate only unique tags with the task task.tags = (existing_tags + created_tags).uniq end get '/api/tasks' do content_type :json - # Start with a base query for tasks belonging to the current user @tasks = current_user.tasks.includes(:project, :tags) - # Filter tasks based on the provided `type` parameter @tasks = case params[:type] when 'today' @tasks.due_today @@ -39,31 +34,33 @@ module Sinatra params[:status] == 'done' ? @tasks.complete : @tasks.incomplete end - # Apply ordering by due_date or other columns + @tasks = @tasks.with_tag(params[:tag]) if params[:tag] + if params[:order_by] order_column, order_direction = params[:order_by].split(':') order_direction ||= 'asc' + order_direction = order_direction.downcase == 'desc' ? :desc : :asc - @tasks = if order_column == 'due_date' - @tasks.ordered_by_due_date(order_direction) - else - @tasks.order("#{order_column} #{order_direction}") - end + allowed_columns = %w[created_at updated_at name priority status due_date] + if allowed_columns.include?(order_column) + @tasks = if order_column == 'due_date' + @tasks.ordered_by_due_date(order_direction) + else + @tasks.order("tasks.#{order_column} #{order_direction}") + end + else + halt 400, { error: 'Invalid order column specified.' }.to_json + end end - # Filter by tag if provided - @tasks = @tasks.with_tag(params[:tag]) if params[:tag] - @tasks = @tasks.left_joins(:tags).distinct - # Return the tasks in JSON format with their tags and project @tasks.to_json(include: { tags: { only: %i[id name] }, project: { only: :name } }) end post '/api/task' do content_type :json - # Parse the request body as JSON request_body = request.body.read task_data = begin JSON.parse(request_body) @@ -71,20 +68,17 @@ module Sinatra halt 400, { error: 'Invalid JSON format.' }.to_json end - # Build task attributes task_attributes = { name: task_data['name'], - priority: task_data['priority'] || 'medium', # Default priority + priority: task_data['priority'] || 'medium', due_date: task_data['due_date'], status: task_data['status'] || Task.statuses[:not_started], note: task_data['note'], user_id: current_user.id } - # Create and assign task to variable value = task_data['project_id'] task = if value.nil? || value.to_s.strip.empty? - # Assign the built task to the 'task' variable current_user.tasks.build(task_attributes) else project = current_user.projects.find_by(id: value) @@ -92,13 +86,11 @@ module Sinatra project.tasks.build(task_attributes) end - # Save task and respond if task.save update_task_tags(task, task_data['tags']) status 201 task.to_json(include: { tags: { only: :name }, project: { only: :name } }) else - # Collect error messages for better debugging errors = task.errors.full_messages halt 400, { error: 'There was a problem creating the task.', details: errors }.to_json end @@ -109,7 +101,6 @@ module Sinatra puts "Request to update task with ID: #{params[:id]}" puts "Current user: #{current_user&.id}" - # Parse the request body as JSON request_body = request.body.read task_data = begin JSON.parse(request_body) @@ -117,12 +108,10 @@ module Sinatra halt 400, { error: 'Invalid JSON format.' }.to_json end - # Find the task belonging to the current user task = current_user.tasks.find_by(id: params[:id]) halt 404, { error: 'Task not found.' }.to_json unless task - # Build task attributes task_attributes = { name: task_data['name'], # Get the name from the JSON body priority: task_data['priority'], @@ -131,7 +120,6 @@ module Sinatra due_date: task_data['due_date'] } - # Safely handle project_id if task_data['project_id'] && !task_data['project_id'].to_s.strip.empty? project = current_user.projects.find_by(id: task_data['project_id']) halt 400, { error: 'Invalid project.' }.to_json unless project @@ -140,12 +128,10 @@ module Sinatra task.project = nil end - # Update task attributes if task.update(task_attributes) update_task_tags(task, task_data['tags']) task.to_json(include: { tags: { only: :name }, project: { only: :name } }) else - # Collect error messages for better debugging errors = task.errors.full_messages halt 400, { error: 'There was a problem updating the task.', details: errors }.to_json end diff --git a/app/routes/users_routes.rb b/app/routes/users_routes.rb index eead21a..fd7d3ca 100644 --- a/app/routes/users_routes.rb +++ b/app/routes/users_routes.rb @@ -2,7 +2,6 @@ module Sinatra class Application - # GET /api/profile - Fetch the current user's profile get '/api/profile' do content_type :json user = current_user @@ -14,7 +13,6 @@ module Sinatra end end - # PATCH /api/profile - Update the current user's profile patch '/api/profile' do content_type :json @@ -28,27 +26,13 @@ module Sinatra halt 404, { error: 'Profile not found.' }.to_json if user.nil? - # Permit only allowed parameters allowed_params = {} allowed_params[:appearance] = request_payload['appearance'] if request_payload.key?('appearance') allowed_params[:language] = request_payload['language'] if request_payload.key?('language') allowed_params[:timezone] = request_payload['timezone'] if request_payload.key?('timezone') allowed_params[:avatar_image] = request_payload['avatar_image'] if request_payload.key?('avatar_image') - # Handle avatar image upload if using Active Storage - # Uncomment if using Active Storage - # if request_payload['avatar_image'] - # begin - # decoded_image = Base64.decode64(request_payload['avatar_image'].split(',')[1]) - # user.avatar_image.attach(io: StringIO.new(decoded_image), filename: "avatar_#{Time.now.to_i}.png", content_type: 'image/png') - # rescue => e - # halt 400, { error: 'Invalid avatar image format.' }.to_json - # end - # end - if user.update(allowed_params) - # If handling tags on user profile, implement here - # For now, we're not associating tags with user profiles user.to_json(only: %i[id email appearance language timezone avatar_image]) else status 400 diff --git a/public/js/bundle.js b/public/js/bundle.js index eb9fc0b..ad14117 100644 --- a/public/js/bundle.js +++ b/public/js/bundle.js @@ -246,7 +246,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((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\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 _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 ProjectModal = function ProjectModal(_ref) {\n _s();\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 pin_to_sidebar: false\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 (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var handleClickOutside = function handleClickOutside(event) {\n if (modalRef.current && !modalRef.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 (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (project) {\n setFormData(project);\n }\n }, [project]);\n var handleChange = function handleChange(e) {\n var _e$target = e.target,\n name = _e$target.name,\n value = _e$target.value,\n type = _e$target.type,\n checked = _e$target.checked;\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, name, type === 'checkbox' ? checked : value));\n });\n };\n var handleSubmit = function handleSubmit(e) {\n e.preventDefault();\n onSave(formData);\n onClose();\n };\n if (!isOpen) return null;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"fixed inset-0 flex items-center justify-center bg-gray-900 bg-opacity-80 z-50\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n ref: modalRef,\n className: \"bg-white dark:bg-gray-800 rounded-lg shadow-lg w-full max-w-lg mx-auto overflow-hidden\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"form\", {\n onSubmit: handleSubmit\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"fieldset\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-4 space-y-4 max-h-[70vh] overflow-y-auto\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: \"projectName\",\n className: \"block text-sm font-medium text-gray-700 dark:text-gray-300\"\n }, \"Project Name\"), /*#__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: \"mt-1 block w-full border border-gray-300 dark:border-gray-700 rounded-md shadow-sm px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-gray-100\",\n placeholder: \"Enter project name\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: \"projectDescription\",\n className: \"block text-sm font-medium text-gray-700 dark:text-gray-300\"\n }, \"Description\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"textarea\", {\n id: \"projectDescription\",\n name: \"description\",\n rows: 3,\n value: formData.description || '',\n onChange: handleChange,\n className: \"mt-1 block w-full border border-gray-300 dark:border-gray-700 rounded-md shadow-sm px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-gray-100\",\n placeholder: \"Enter project description (optional)\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: \"projectArea\",\n className: \"block text-sm font-medium text-gray-700 dark:text-gray-300\"\n }, \"Area (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: \"mt-1 block w-full border border-gray-300 dark:border-gray-700 rounded-md shadow-sm px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-gray-100\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"\"\n }, \"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(\"input\", {\n type: \"checkbox\",\n id: \"active\",\n name: \"active\",\n checked: formData.active,\n onChange: handleChange,\n className: \"h-5 w-5 appearance-none border border-gray-300 rounded-md bg-white dark:bg-gray-700 checked:bg-blue-600 checked:border-transparent focus:outline-none focus:ring-2 focus:ring-blue-500\"\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 }, \"Active\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex justify-between items-center p-4 border-t border-gray-200 dark:border-gray-700\"\n }, project && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: onDelete,\n className: \"px-3 py-1 text-sm bg-red-600 text-white rounded hover:bg-red-700 dark:bg-red-500 dark:hover:bg-red-600\"\n }, \"Delete\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex space-x-2 \".concat(!project ? 'ml-auto' : '')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: onClose,\n className: \"px-3 py-1 text-sm bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-200 rounded hover:bg-gray-300 dark:hover:bg-gray-600\"\n }, \"Cancel\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"submit\",\n className: \"px-3 py-1 text-sm bg-blue-600 dark:bg-blue-500 text-white rounded hover:bg-blue-700 dark:hover:bg-blue-600\"\n }, project ? 'Update Project' : 'Create Project')))))));\n};\n_s(ProjectModal, \"0VKqaEecLunDfCh56ihT3L4PCao=\");\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/./app/frontend/components/Project/ProjectModal.tsx?"); +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\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 _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 ProjectModal = function ProjectModal(_ref) {\n _s();\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 pin_to_sidebar: false\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 (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var handleClickOutside = function handleClickOutside(event) {\n if (modalRef.current && !modalRef.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 (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (project) {\n setFormData(project);\n }\n }, [project]);\n var handleChange = function handleChange(e) {\n var _e$target = e.target,\n name = _e$target.name,\n value = _e$target.value,\n type = _e$target.type,\n checked = _e$target.checked;\n setFormData(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, name, type === 'checkbox' ? checked : value));\n });\n };\n var handleSubmit = function handleSubmit(e) {\n e.preventDefault();\n onSave(formData);\n onClose();\n };\n if (!isOpen) return null;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"fixed inset-0 flex items-center justify-center bg-gray-900 bg-opacity-80 z-50\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n ref: modalRef,\n className: \"bg-white dark:bg-gray-800 rounded-lg shadow-lg w-full max-w-2xl mx-auto overflow-hidden\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"form\", {\n onSubmit: handleSubmit\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"fieldset\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"p-4 space-y-4 max-h-[70vh] overflow-y-auto\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: \"projectName\",\n className: \"block text-sm font-medium text-gray-700 dark:text-gray-300\"\n }, \"Project Name\"), /*#__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: \"mt-1 block w-full border border-gray-300 dark:border-gray-700 rounded-md shadow-sm px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-gray-100\",\n placeholder: \"Enter project name\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: \"projectDescription\",\n className: \"block text-sm font-medium text-gray-700 dark:text-gray-300\"\n }, \"Description\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"textarea\", {\n id: \"projectDescription\",\n name: \"description\",\n rows: 3,\n value: formData.description || '',\n onChange: handleChange,\n className: \"mt-1 block w-full border border-gray-300 dark:border-gray-700 rounded-md shadow-sm px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-gray-100\",\n placeholder: \"Enter project description (optional)\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: \"projectArea\",\n className: \"block text-sm font-medium text-gray-700 dark:text-gray-300\"\n }, \"Area (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: \"mt-1 block w-full border border-gray-300 dark:border-gray-700 rounded-md shadow-sm px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-gray-100\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"\"\n }, \"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(\"input\", {\n type: \"checkbox\",\n id: \"active\",\n name: \"active\",\n checked: formData.active,\n onChange: handleChange,\n className: \"h-5 w-5 appearance-none border border-gray-300 rounded-md bg-white dark:bg-gray-700 checked:bg-blue-600 checked:border-transparent focus:outline-none focus:ring-2 focus:ring-blue-500\"\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 }, \"Active\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex justify-between items-center p-4 border-t border-gray-200 dark:border-gray-700\"\n }, project && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: onDelete,\n className: \"px-3 py-1 text-sm bg-red-600 text-white rounded hover:bg-red-700 dark:bg-red-500 dark:hover:bg-red-600\"\n }, \"Delete\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"flex space-x-2 \".concat(!project ? 'ml-auto' : '')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: onClose,\n className: \"px-3 py-1 text-sm bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-200 rounded hover:bg-gray-300 dark:hover:bg-gray-600\"\n }, \"Cancel\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"submit\",\n className: \"px-3 py-1 text-sm bg-blue-600 dark:bg-blue-500 text-white rounded hover:bg-blue-700 dark:hover:bg-blue-600\"\n }, project ? 'Update Project' : 'Create Project')))))));\n};\n_s(ProjectModal, \"0VKqaEecLunDfCh56ihT3L4PCao=\");\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/./app/frontend/components/Project/ProjectModal.tsx?"); /***/ }), @@ -652,7 +652,7 @@ eval("\n\n//# sourceURL=webpack://tududi/./node_modules/client-only/index.js?"); /***/ ((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_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* ./app/frontend/styles/tailwind.css */\n*, ::before, ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n/* ! tailwindcss v3.4.13 | MIT License | https://tailwindcss.com */\n/*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: #e0e0e0; /* 2 */\n}\n::before,\n::after {\n --tw-content: '';\n}\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user's configured \\`sans\\` font-family by default.\n5. Use the user's configured \\`sans\\` font-feature-settings by default.\n6. Use the user's configured \\`sans\\` font-variation-settings by default.\n7. Disable tap highlights on iOS\n*/\nhtml,\n:host {\n line-height: 1.5; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n -moz-tab-size: 4; /* 3 */\n -o-tab-size: 4;\n tab-size: 4; /* 3 */\n font-family: ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"; /* 4 */\n font-feature-settings: normal; /* 5 */\n font-variation-settings: normal; /* 6 */\n -webkit-tap-highlight-color: transparent; /* 7 */\n}\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from \\`html\\` so users can set them as a class directly on the \\`html\\` element.\n*/\nbody {\n margin: 0; /* 1 */\n line-height: inherit; /* 2 */\n}\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\nhr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n border-top-width: 1px; /* 3 */\n}\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\n/*\nRemove the default font size and weight for headings.\n*/\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\na {\n color: inherit;\n text-decoration: inherit;\n}\n/*\nAdd the correct font weight in Edge and Safari.\n*/\nb,\nstrong {\n font-weight: bolder;\n}\n/*\n1. Use the user's configured \\`mono\\` font-family by default.\n2. Use the user's configured \\`mono\\` font-feature-settings by default.\n3. Use the user's configured \\`mono\\` font-variation-settings by default.\n4. Correct the odd \\`em\\` font sizing in all browsers.\n*/\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace; /* 1 */\n font-feature-settings: normal; /* 2 */\n font-variation-settings: normal; /* 3 */\n font-size: 1em; /* 4 */\n}\n/*\nAdd the correct font size in all browsers.\n*/\nsmall {\n font-size: 80%;\n}\n/*\nPrevent \\`sub\\` and \\`sup\\` elements from affecting the line height in all browsers.\n*/\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsub {\n bottom: -0.25em;\n}\nsup {\n top: -0.5em;\n}\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\ntable {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n border-collapse: collapse; /* 3 */\n}\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-feature-settings: inherit; /* 1 */\n font-variation-settings: inherit; /* 1 */\n font-size: 100%; /* 1 */\n font-weight: inherit; /* 1 */\n line-height: inherit; /* 1 */\n letter-spacing: inherit; /* 1 */\n color: inherit; /* 1 */\n margin: 0; /* 2 */\n padding: 0; /* 3 */\n}\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\nbutton,\nselect {\n text-transform: none;\n}\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\nbutton,\ninput:where([type='button']),\ninput:where([type='reset']),\ninput:where([type='submit']) {\n -webkit-appearance: button; /* 1 */\n background-color: transparent; /* 2 */\n background-image: none; /* 2 */\n}\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n:-moz-focusring {\n outline: auto;\n}\n/*\nRemove the additional \\`:invalid\\` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n:-moz-ui-invalid {\n box-shadow: none;\n}\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\nprogress {\n vertical-align: baseline;\n}\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n[type='search'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to \\`inherit\\` in Safari.\n*/\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n/*\nAdd the correct display in Chrome and Safari.\n*/\nsummary {\n display: list-item;\n}\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\nfieldset {\n margin: 0;\n padding: 0;\n}\nlegend {\n padding: 0;\n}\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n/*\nReset default styling for dialogs.\n*/\ndialog {\n padding: 0;\n}\n/*\nPrevent resizing textareas horizontally by default.\n*/\ntextarea {\n resize: vertical;\n}\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user's configured gray 400 color.\n*/\ninput::-moz-placeholder, textarea::-moz-placeholder {\n opacity: 1; /* 1 */\n color: #a0a0a0; /* 2 */\n}\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1; /* 1 */\n color: #a0a0a0; /* 2 */\n}\n/*\nSet the default cursor for buttons.\n*/\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n/*\nMake sure disabled buttons don't get the pointer cursor.\n*/\n:disabled {\n cursor: default;\n}\n/*\n1. Make replaced elements \\`display: block\\` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add \\`vertical-align: middle\\` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n/* Make elements with the HTML hidden attribute stay hidden by default */\n[hidden] {\n display: none;\n}\n.container {\n width: 100%;\n}\n@media (min-width: 640px) {\n .container {\n max-width: 640px;\n }\n}\n@media (min-width: 768px) {\n .container {\n max-width: 768px;\n }\n}\n@media (min-width: 1024px) {\n .container {\n max-width: 1024px;\n }\n}\n@media (min-width: 1280px) {\n .container {\n max-width: 1280px;\n }\n}\n@media (min-width: 1536px) {\n .container {\n max-width: 1536px;\n }\n}\n.collapse {\n visibility: collapse;\n}\n.fixed {\n position: fixed;\n}\n.absolute {\n position: absolute;\n}\n.relative {\n position: relative;\n}\n.inset-0 {\n inset: 0px;\n}\n.bottom-4 {\n bottom: 1rem;\n}\n.bottom-full {\n bottom: 100%;\n}\n.left-0 {\n left: 0px;\n}\n.right-0 {\n right: 0px;\n}\n.right-4 {\n right: 1rem;\n}\n.z-10 {\n z-index: 10;\n}\n.z-50 {\n z-index: 50;\n}\n.col-span-full {\n grid-column: 1 / -1;\n}\n.mx-2 {\n margin-left: 0.5rem;\n margin-right: 0.5rem;\n}\n.mx-3 {\n margin-left: 0.75rem;\n margin-right: 0.75rem;\n}\n.mx-auto {\n margin-left: auto;\n margin-right: auto;\n}\n.my-2 {\n margin-top: 0.5rem;\n margin-bottom: 0.5rem;\n}\n.my-3 {\n margin-top: 0.75rem;\n margin-bottom: 0.75rem;\n}\n.-mr-1 {\n margin-right: -0.25rem;\n}\n.mb-0 {\n margin-bottom: 0px;\n}\n.mb-1 {\n margin-bottom: 0.25rem;\n}\n.mb-2 {\n margin-bottom: 0.5rem;\n}\n.mb-3 {\n margin-bottom: 0.75rem;\n}\n.mb-4 {\n margin-bottom: 1rem;\n}\n.mb-5 {\n margin-bottom: 1.25rem;\n}\n.mb-6 {\n margin-bottom: 1.5rem;\n}\n.mb-8 {\n margin-bottom: 2rem;\n}\n.mb-auto {\n margin-bottom: auto;\n}\n.me-1 {\n margin-inline-end: 0.25rem;\n}\n.me-2 {\n margin-inline-end: 0.5rem;\n}\n.me-3 {\n margin-inline-end: 0.75rem;\n}\n.me-4 {\n margin-inline-end: 1rem;\n}\n.ml-2 {\n margin-left: 0.5rem;\n}\n.ml-4 {\n margin-left: 1rem;\n}\n.ml-auto {\n margin-left: auto;\n}\n.mr-1 {\n margin-right: 0.25rem;\n}\n.mr-2 {\n margin-right: 0.5rem;\n}\n.mr-4 {\n margin-right: 1rem;\n}\n.ms-1 {\n margin-inline-start: 0.25rem;\n}\n.ms-2 {\n margin-inline-start: 0.5rem;\n}\n.ms-3 {\n margin-inline-start: 0.75rem;\n}\n.ms-4 {\n margin-inline-start: 1rem;\n}\n.mt-1 {\n margin-top: 0.25rem;\n}\n.mt-2 {\n margin-top: 0.5rem;\n}\n.mt-3 {\n margin-top: 0.75rem;\n}\n.mt-4 {\n margin-top: 1rem;\n}\n.mt-5 {\n margin-top: 1.25rem;\n}\n.mt-6 {\n margin-top: 1.5rem;\n}\n.mt-auto {\n margin-top: auto;\n}\n.line-clamp-2 {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n}\n.block {\n display: block;\n}\n.inline-block {\n display: inline-block;\n}\n.flex {\n display: flex;\n}\n.inline-flex {\n display: inline-flex;\n}\n.table {\n display: table;\n}\n.grid {\n display: grid;\n}\n.hidden {\n display: none;\n}\n.h-2 {\n height: 0.5rem;\n}\n.h-24 {\n height: 6rem;\n}\n.h-4 {\n height: 1rem;\n}\n.h-5 {\n height: 1.25rem;\n}\n.h-6 {\n height: 1.5rem;\n}\n.h-full {\n height: 100%;\n}\n.h-screen {\n height: 100vh;\n}\n.max-h-\\\\[70vh\\\\] {\n max-height: 70vh;\n}\n.min-h-screen {\n min-height: 100vh;\n}\n.w-10 {\n width: 2.5rem;\n}\n.w-24 {\n width: 6rem;\n}\n.w-28 {\n width: 7rem;\n}\n.w-4 {\n width: 1rem;\n}\n.w-5 {\n width: 1.25rem;\n}\n.w-56 {\n width: 14rem;\n}\n.w-6 {\n width: 1.5rem;\n}\n.w-72 {\n width: 18rem;\n}\n.w-full {\n width: 100%;\n}\n.max-w-2xl {\n max-width: 42rem;\n}\n.max-w-3xl {\n max-width: 48rem;\n}\n.max-w-4xl {\n max-width: 56rem;\n}\n.max-w-5xl {\n max-width: 64rem;\n}\n.max-w-6xl {\n max-width: 72rem;\n}\n.max-w-lg {\n max-width: 32rem;\n}\n.max-w-md {\n max-width: 28rem;\n}\n.max-w-sm {\n max-width: 24rem;\n}\n.flex-1 {\n flex: 1 1 0%;\n}\n.flex-shrink-0 {\n flex-shrink: 0;\n}\n.flex-grow {\n flex-grow: 1;\n}\n.origin-top-right {\n transform-origin: top right;\n}\n.-translate-x-full {\n --tw-translate-x: -100%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.translate-x-0 {\n --tw-translate-x: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.scale-100 {\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.scale-95 {\n --tw-scale-x: .95;\n --tw-scale-y: .95;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.transform {\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.cursor-not-allowed {\n cursor: not-allowed;\n}\n.cursor-pointer {\n cursor: pointer;\n}\n.appearance-none {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.grid-cols-1 {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n}\n.grid-cols-3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n}\n.flex-col {\n flex-direction: column;\n}\n.flex-wrap {\n flex-wrap: wrap;\n}\n.items-start {\n align-items: flex-start;\n}\n.items-center {\n align-items: center;\n}\n.justify-start {\n justify-content: flex-start;\n}\n.justify-end {\n justify-content: flex-end;\n}\n.justify-center {\n justify-content: center;\n}\n.justify-between {\n justify-content: space-between;\n}\n.gap-2 {\n gap: 0.5rem;\n}\n.gap-4 {\n gap: 1rem;\n}\n.space-x-1 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(0.25rem * var(--tw-space-x-reverse));\n margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse)));\n}\n.space-x-2 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(0.5rem * var(--tw-space-x-reverse));\n margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));\n}\n.space-x-3 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(0.75rem * var(--tw-space-x-reverse));\n margin-left: calc(0.75rem * calc(1 - var(--tw-space-x-reverse)));\n}\n.space-x-4 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(1rem * var(--tw-space-x-reverse));\n margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse)));\n}\n.space-y-1 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.25rem * var(--tw-space-y-reverse));\n}\n.space-y-2 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.5rem * var(--tw-space-y-reverse));\n}\n.space-y-3 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.75rem * var(--tw-space-y-reverse));\n}\n.space-y-4 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(1rem * var(--tw-space-y-reverse));\n}\n.overflow-hidden {\n overflow: hidden;\n}\n.overflow-y-auto {\n overflow-y: auto;\n}\n.truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.whitespace-pre-line {\n white-space: pre-line;\n}\n.rounded {\n border-radius: 0.25rem;\n}\n.rounded-full {\n border-radius: 9999px;\n}\n.rounded-lg {\n border-radius: 0.5rem;\n}\n.rounded-md {\n border-radius: 0.375rem;\n}\n.rounded-t-lg {\n border-top-left-radius: 0.5rem;\n border-top-right-radius: 0.5rem;\n}\n.border {\n border-width: 1px;\n}\n.border-0 {\n border-width: 0px;\n}\n.border-b {\n border-bottom-width: 1px;\n}\n.border-t {\n border-top-width: 1px;\n}\n.border-none {\n border-style: none;\n}\n.border-black {\n --tw-border-opacity: 1;\n border-color: rgb(0 0 0 / var(--tw-border-opacity));\n}\n.border-blue-400 {\n --tw-border-opacity: 1;\n border-color: rgb(96 165 250 / var(--tw-border-opacity));\n}\n.border-gray-200 {\n --tw-border-opacity: 1;\n border-color: rgb(224 224 224 / var(--tw-border-opacity));\n}\n.border-gray-300 {\n --tw-border-opacity: 1;\n border-color: rgb(192 192 192 / var(--tw-border-opacity));\n}\n.border-gray-400 {\n --tw-border-opacity: 1;\n border-color: rgb(160 160 160 / var(--tw-border-opacity));\n}\n.border-green-400 {\n --tw-border-opacity: 1;\n border-color: rgb(74 222 128 / var(--tw-border-opacity));\n}\n.border-transparent {\n border-color: transparent;\n}\n.bg-black {\n --tw-bg-opacity: 1;\n background-color: rgb(0 0 0 / var(--tw-bg-opacity));\n}\n.bg-blue-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(59 130 246 / var(--tw-bg-opacity));\n}\n.bg-blue-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(37 99 235 / var(--tw-bg-opacity));\n}\n.bg-blue-700 {\n --tw-bg-opacity: 1;\n background-color: rgb(29 78 216 / var(--tw-bg-opacity));\n}\n.bg-gray-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(240 240 240 / var(--tw-bg-opacity));\n}\n.bg-gray-200 {\n --tw-bg-opacity: 1;\n background-color: rgb(224 224 224 / var(--tw-bg-opacity));\n}\n.bg-gray-300 {\n --tw-bg-opacity: 1;\n background-color: rgb(192 192 192 / var(--tw-bg-opacity));\n}\n.bg-gray-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(249 249 249 / var(--tw-bg-opacity));\n}\n.bg-gray-800 {\n --tw-bg-opacity: 1;\n background-color: rgb(32 32 32 / var(--tw-bg-opacity));\n}\n.bg-gray-900 {\n --tw-bg-opacity: 1;\n background-color: rgb(16 16 16 / var(--tw-bg-opacity));\n}\n.bg-green-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(34 197 94 / var(--tw-bg-opacity));\n}\n.bg-red-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(239 68 68 / var(--tw-bg-opacity));\n}\n.bg-red-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(220 38 38 / var(--tw-bg-opacity));\n}\n.bg-red-700 {\n --tw-bg-opacity: 1;\n background-color: rgb(185 28 28 / var(--tw-bg-opacity));\n}\n.bg-transparent {\n background-color: transparent;\n}\n.bg-white {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity));\n}\n.bg-opacity-50 {\n --tw-bg-opacity: 0.5;\n}\n.bg-opacity-80 {\n --tw-bg-opacity: 0.8;\n}\n.object-cover {\n -o-object-fit: cover;\n object-fit: cover;\n}\n.p-0 {\n padding: 0px;\n}\n.p-2 {\n padding: 0.5rem;\n}\n.p-3 {\n padding: 0.75rem;\n}\n.p-4 {\n padding: 1rem;\n}\n.p-6 {\n padding: 1.5rem;\n}\n.p-8 {\n padding: 2rem;\n}\n.px-0 {\n padding-left: 0px;\n padding-right: 0px;\n}\n.px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.px-3 {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n.py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n.py-1\\\\.5 {\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n}\n.py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.py-3 {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n}\n.py-4 {\n padding-top: 1rem;\n padding-bottom: 1rem;\n}\n.pb-0 {\n padding-bottom: 0px;\n}\n.pb-1 {\n padding-bottom: 0.25rem;\n}\n.pb-3 {\n padding-bottom: 0.75rem;\n}\n.pl-6 {\n padding-left: 1.5rem;\n}\n.pr-4 {\n padding-right: 1rem;\n}\n.pt-2 {\n padding-top: 0.5rem;\n}\n.pt-20 {\n padding-top: 5rem;\n}\n.pt-3 {\n padding-top: 0.75rem;\n}\n.text-left {\n text-align: left;\n}\n.text-center {\n text-align: center;\n}\n.text-end {\n text-align: end;\n}\n.text-2xl {\n font-size: 1.5rem;\n line-height: 2rem;\n}\n.text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.text-xl {\n font-size: 1.25rem;\n line-height: 1.75rem;\n}\n.text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n.font-bold {\n font-weight: 700;\n}\n.font-extrabold {\n font-weight: 800;\n}\n.font-light {\n font-weight: 300;\n}\n.font-medium {\n font-weight: 500;\n}\n.font-semibold {\n font-weight: 600;\n}\n.uppercase {\n text-transform: uppercase;\n}\n.capitalize {\n text-transform: capitalize;\n}\n.tracking-wider {\n letter-spacing: 0.05em;\n}\n.text-blue-400 {\n --tw-text-opacity: 1;\n color: rgb(96 165 250 / var(--tw-text-opacity));\n}\n.text-blue-500 {\n --tw-text-opacity: 1;\n color: rgb(59 130 246 / var(--tw-text-opacity));\n}\n.text-blue-600 {\n --tw-text-opacity: 1;\n color: rgb(37 99 235 / var(--tw-text-opacity));\n}\n.text-gray-300 {\n --tw-text-opacity: 1;\n color: rgb(192 192 192 / var(--tw-text-opacity));\n}\n.text-gray-400 {\n --tw-text-opacity: 1;\n color: rgb(160 160 160 / var(--tw-text-opacity));\n}\n.text-gray-500 {\n --tw-text-opacity: 1;\n color: rgb(128 128 128 / var(--tw-text-opacity));\n}\n.text-gray-600 {\n --tw-text-opacity: 1;\n color: rgb(96 96 96 / var(--tw-text-opacity));\n}\n.text-gray-700 {\n --tw-text-opacity: 1;\n color: rgb(64 64 64 / var(--tw-text-opacity));\n}\n.text-gray-800 {\n --tw-text-opacity: 1;\n color: rgb(32 32 32 / var(--tw-text-opacity));\n}\n.text-gray-900 {\n --tw-text-opacity: 1;\n color: rgb(16 16 16 / var(--tw-text-opacity));\n}\n.text-green-400 {\n --tw-text-opacity: 1;\n color: rgb(74 222 128 / var(--tw-text-opacity));\n}\n.text-green-500 {\n --tw-text-opacity: 1;\n color: rgb(34 197 94 / var(--tw-text-opacity));\n}\n.text-red-500 {\n --tw-text-opacity: 1;\n color: rgb(239 68 68 / var(--tw-text-opacity));\n}\n.text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n.text-yellow-500 {\n --tw-text-opacity: 1;\n color: rgb(234 179 8 / var(--tw-text-opacity));\n}\n.no-underline {\n text-decoration-line: none;\n}\n.placeholder-gray-400::-moz-placeholder {\n --tw-placeholder-opacity: 1;\n color: rgb(160 160 160 / var(--tw-placeholder-opacity));\n}\n.placeholder-gray-400::placeholder {\n --tw-placeholder-opacity: 1;\n color: rgb(160 160 160 / var(--tw-placeholder-opacity));\n}\n.opacity-0 {\n opacity: 0;\n}\n.opacity-100 {\n opacity: 1;\n}\n.opacity-20 {\n opacity: 0.2;\n}\n.opacity-25 {\n opacity: 0.25;\n}\n.opacity-50 {\n opacity: 0.5;\n}\n.opacity-75 {\n opacity: 0.75;\n}\n.shadow {\n --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.shadow-2xl {\n --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);\n --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.shadow-lg {\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.shadow-md {\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.shadow-sm {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.ring-1 {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n.ring-black {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity));\n}\n.ring-opacity-5 {\n --tw-ring-opacity: 0.05;\n}\n.filter {\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.transition-all {\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-colors {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-opacity {\n transition-property: opacity;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-transform {\n transition-property: transform;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.duration-200 {\n transition-duration: 200ms;\n}\n.duration-300 {\n transition-duration: 300ms;\n}\n.ease-in-out {\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n}\n\ninput:focus, select:focus, textarea:focus {\n outline: none;\n box-shadow: none;\n}\n\n.file\\\\:mr-4::file-selector-button {\n margin-right: 1rem;\n}\n\n.file\\\\:rounded-full::file-selector-button {\n border-radius: 9999px;\n}\n\n.file\\\\:border-0::file-selector-button {\n border-width: 0px;\n}\n\n.file\\\\:bg-blue-50::file-selector-button {\n --tw-bg-opacity: 1;\n background-color: rgb(239 246 255 / var(--tw-bg-opacity));\n}\n\n.file\\\\:px-4::file-selector-button {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n\n.file\\\\:py-2::file-selector-button {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.file\\\\:text-sm::file-selector-button {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.file\\\\:font-semibold::file-selector-button {\n font-weight: 600;\n}\n\n.file\\\\:text-blue-700::file-selector-button {\n --tw-text-opacity: 1;\n color: rgb(29 78 216 / var(--tw-text-opacity));\n}\n\n.checked\\\\:border-transparent:checked {\n border-color: transparent;\n}\n\n.checked\\\\:bg-blue-600:checked {\n --tw-bg-opacity: 1;\n background-color: rgb(37 99 235 / var(--tw-bg-opacity));\n}\n\n.hover\\\\:bg-blue-600:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(37 99 235 / var(--tw-bg-opacity));\n}\n\n.hover\\\\:bg-blue-700:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(29 78 216 / var(--tw-bg-opacity));\n}\n\n.hover\\\\:bg-gray-100:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(240 240 240 / var(--tw-bg-opacity));\n}\n\n.hover\\\\:bg-gray-200:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(224 224 224 / var(--tw-bg-opacity));\n}\n\n.hover\\\\:bg-gray-300:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(192 192 192 / var(--tw-bg-opacity));\n}\n\n.hover\\\\:bg-gray-400:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(160 160 160 / var(--tw-bg-opacity));\n}\n\n.hover\\\\:bg-gray-50:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(249 249 249 / var(--tw-bg-opacity));\n}\n\n.hover\\\\:bg-red-600:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(220 38 38 / var(--tw-bg-opacity));\n}\n\n.hover\\\\:bg-red-700:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(185 28 28 / var(--tw-bg-opacity));\n}\n\n.hover\\\\:text-black:hover {\n --tw-text-opacity: 1;\n color: rgb(0 0 0 / var(--tw-text-opacity));\n}\n\n.hover\\\\:text-blue-700:hover {\n --tw-text-opacity: 1;\n color: rgb(29 78 216 / var(--tw-text-opacity));\n}\n\n.hover\\\\:text-gray-600:hover {\n --tw-text-opacity: 1;\n color: rgb(96 96 96 / var(--tw-text-opacity));\n}\n\n.hover\\\\:text-gray-700:hover {\n --tw-text-opacity: 1;\n color: rgb(64 64 64 / var(--tw-text-opacity));\n}\n\n.hover\\\\:text-red-500:hover {\n --tw-text-opacity: 1;\n color: rgb(239 68 68 / var(--tw-text-opacity));\n}\n\n.hover\\\\:text-red-700:hover {\n --tw-text-opacity: 1;\n color: rgb(185 28 28 / var(--tw-text-opacity));\n}\n\n.hover\\\\:underline:hover {\n text-decoration-line: underline;\n}\n\n.hover\\\\:file\\\\:bg-blue-100::file-selector-button:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(219 234 254 / var(--tw-bg-opacity));\n}\n\n.focus\\\\:border-blue-500:focus {\n --tw-border-opacity: 1;\n border-color: rgb(59 130 246 / var(--tw-border-opacity));\n}\n\n.focus\\\\:border-indigo-500:focus {\n --tw-border-opacity: 1;\n border-color: rgb(99 102 241 / var(--tw-border-opacity));\n}\n\n.focus\\\\:outline-none:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n\n.focus\\\\:ring-0:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n.focus\\\\:ring-2:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n.focus\\\\:ring-blue-500:focus {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));\n}\n\n.focus\\\\:ring-indigo-500:focus {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity));\n}\n\n.focus\\\\:ring-red-500:focus {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity));\n}\n\n.focus\\\\:ring-offset-2:focus {\n --tw-ring-offset-width: 2px;\n}\n\n.dark\\\\:border-blue-700:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(29 78 216 / var(--tw-border-opacity));\n}\n\n.dark\\\\:border-gray-700:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(64 64 64 / var(--tw-border-opacity));\n}\n\n.dark\\\\:border-gray-800:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(32 32 32 / var(--tw-border-opacity));\n}\n\n.dark\\\\:border-gray-900:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(16 16 16 / var(--tw-border-opacity));\n}\n\n.dark\\\\:border-green-700:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(21 128 61 / var(--tw-border-opacity));\n}\n\n.dark\\\\:bg-blue-500:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(59 130 246 / var(--tw-bg-opacity));\n}\n\n.dark\\\\:bg-gray-700:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(64 64 64 / var(--tw-bg-opacity));\n}\n\n.dark\\\\:bg-gray-800:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(32 32 32 / var(--tw-bg-opacity));\n}\n\n.dark\\\\:bg-gray-900:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(16 16 16 / var(--tw-bg-opacity));\n}\n\n.dark\\\\:bg-red-500:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(239 68 68 / var(--tw-bg-opacity));\n}\n\n.dark\\\\:bg-transparent:is(.dark *) {\n background-color: transparent;\n}\n\n.dark\\\\:text-blue-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(96 165 250 / var(--tw-text-opacity));\n}\n\n.dark\\\\:text-gray-100:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(240 240 240 / var(--tw-text-opacity));\n}\n\n.dark\\\\:text-gray-200:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(224 224 224 / var(--tw-text-opacity));\n}\n\n.dark\\\\:text-gray-300:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(192 192 192 / var(--tw-text-opacity));\n}\n\n.dark\\\\:text-gray-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(160 160 160 / var(--tw-text-opacity));\n}\n\n.dark\\\\:text-green-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(74 222 128 / var(--tw-text-opacity));\n}\n\n.dark\\\\:text-red-300:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(252 165 165 / var(--tw-text-opacity));\n}\n\n.dark\\\\:text-white:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n\n.dark\\\\:placeholder-gray-600:is(.dark *)::-moz-placeholder {\n --tw-placeholder-opacity: 1;\n color: rgb(96 96 96 / var(--tw-placeholder-opacity));\n}\n\n.dark\\\\:placeholder-gray-600:is(.dark *)::placeholder {\n --tw-placeholder-opacity: 1;\n color: rgb(96 96 96 / var(--tw-placeholder-opacity));\n}\n\n.dark\\\\:file\\\\:bg-gray-700:is(.dark *)::file-selector-button {\n --tw-bg-opacity: 1;\n background-color: rgb(64 64 64 / var(--tw-bg-opacity));\n}\n\n.dark\\\\:file\\\\:text-gray-200:is(.dark *)::file-selector-button {\n --tw-text-opacity: 1;\n color: rgb(224 224 224 / var(--tw-text-opacity));\n}\n\n.dark\\\\:hover\\\\:bg-blue-600:hover:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(37 99 235 / var(--tw-bg-opacity));\n}\n\n.dark\\\\:hover\\\\:bg-gray-600:hover:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(96 96 96 / var(--tw-bg-opacity));\n}\n\n.dark\\\\:hover\\\\:bg-gray-700:hover:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(64 64 64 / var(--tw-bg-opacity));\n}\n\n.dark\\\\:hover\\\\:bg-red-600:hover:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(220 38 38 / var(--tw-bg-opacity));\n}\n\n.dark\\\\:hover\\\\:text-blue-300:hover:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(147 197 253 / var(--tw-text-opacity));\n}\n\n.dark\\\\:hover\\\\:text-gray-400:hover:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(160 160 160 / var(--tw-text-opacity));\n}\n\n.dark\\\\:hover\\\\:text-red-300:hover:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(252 165 165 / var(--tw-text-opacity));\n}\n\n.dark\\\\:hover\\\\:text-white:hover:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n\n.dark\\\\:hover\\\\:file\\\\:bg-gray-600:is(.dark *)::file-selector-button:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(96 96 96 / var(--tw-bg-opacity));\n}\n\n@media (min-width: 640px) {\n .sm\\\\:grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n .sm\\\\:p-6 {\n padding: 1.5rem;\n }\n .sm\\\\:text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n }\n}\n\n@media (min-width: 768px) {\n .md\\\\:mb-0 {\n margin-bottom: 0px;\n }\n .md\\\\:flex {\n display: flex;\n }\n .md\\\\:hidden {\n display: none;\n }\n .md\\\\:w-1\\\\/3 {\n width: 33.333333%;\n }\n .md\\\\:grid-cols-3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n .md\\\\:flex-row {\n flex-direction: row;\n }\n .md\\\\:items-center {\n align-items: center;\n }\n .md\\\\:justify-end {\n justify-content: flex-end;\n }\n .md\\\\:justify-between {\n justify-content: space-between;\n }\n .md\\\\:space-x-4 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(1rem * var(--tw-space-x-reverse));\n margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse)));\n }\n}\n\n@media (min-width: 1024px) {\n .lg\\\\:static {\n position: static;\n }\n .lg\\\\:flex {\n display: flex;\n }\n .lg\\\\:hidden {\n display: none;\n }\n .lg\\\\:translate-x-0 {\n --tw-translate-x: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n }\n .lg\\\\:grid-cols-3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n .lg\\\\:grid-cols-4 {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n }\n .lg\\\\:flex-col {\n flex-direction: column;\n }\n .lg\\\\:p-8 {\n padding: 2rem;\n }\n}`, \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://tududi/./app/frontend/styles/tailwind.css?./node_modules/css-loader/dist/cjs.js!./node_modules/postcss-loader/dist/cjs.js"); +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_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* ./app/frontend/styles/tailwind.css */\n*, ::before, ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n/* ! tailwindcss v3.4.13 | MIT License | https://tailwindcss.com */\n/*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: #e0e0e0; /* 2 */\n}\n::before,\n::after {\n --tw-content: '';\n}\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user's configured \\`sans\\` font-family by default.\n5. Use the user's configured \\`sans\\` font-feature-settings by default.\n6. Use the user's configured \\`sans\\` font-variation-settings by default.\n7. Disable tap highlights on iOS\n*/\nhtml,\n:host {\n line-height: 1.5; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n -moz-tab-size: 4; /* 3 */\n -o-tab-size: 4;\n tab-size: 4; /* 3 */\n font-family: ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"; /* 4 */\n font-feature-settings: normal; /* 5 */\n font-variation-settings: normal; /* 6 */\n -webkit-tap-highlight-color: transparent; /* 7 */\n}\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from \\`html\\` so users can set them as a class directly on the \\`html\\` element.\n*/\nbody {\n margin: 0; /* 1 */\n line-height: inherit; /* 2 */\n}\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\nhr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n border-top-width: 1px; /* 3 */\n}\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\n/*\nRemove the default font size and weight for headings.\n*/\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\na {\n color: inherit;\n text-decoration: inherit;\n}\n/*\nAdd the correct font weight in Edge and Safari.\n*/\nb,\nstrong {\n font-weight: bolder;\n}\n/*\n1. Use the user's configured \\`mono\\` font-family by default.\n2. Use the user's configured \\`mono\\` font-feature-settings by default.\n3. Use the user's configured \\`mono\\` font-variation-settings by default.\n4. Correct the odd \\`em\\` font sizing in all browsers.\n*/\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace; /* 1 */\n font-feature-settings: normal; /* 2 */\n font-variation-settings: normal; /* 3 */\n font-size: 1em; /* 4 */\n}\n/*\nAdd the correct font size in all browsers.\n*/\nsmall {\n font-size: 80%;\n}\n/*\nPrevent \\`sub\\` and \\`sup\\` elements from affecting the line height in all browsers.\n*/\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsub {\n bottom: -0.25em;\n}\nsup {\n top: -0.5em;\n}\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\ntable {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n border-collapse: collapse; /* 3 */\n}\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-feature-settings: inherit; /* 1 */\n font-variation-settings: inherit; /* 1 */\n font-size: 100%; /* 1 */\n font-weight: inherit; /* 1 */\n line-height: inherit; /* 1 */\n letter-spacing: inherit; /* 1 */\n color: inherit; /* 1 */\n margin: 0; /* 2 */\n padding: 0; /* 3 */\n}\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\nbutton,\nselect {\n text-transform: none;\n}\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\nbutton,\ninput:where([type='button']),\ninput:where([type='reset']),\ninput:where([type='submit']) {\n -webkit-appearance: button; /* 1 */\n background-color: transparent; /* 2 */\n background-image: none; /* 2 */\n}\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n:-moz-focusring {\n outline: auto;\n}\n/*\nRemove the additional \\`:invalid\\` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n:-moz-ui-invalid {\n box-shadow: none;\n}\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\nprogress {\n vertical-align: baseline;\n}\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n[type='search'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to \\`inherit\\` in Safari.\n*/\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n/*\nAdd the correct display in Chrome and Safari.\n*/\nsummary {\n display: list-item;\n}\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\nfieldset {\n margin: 0;\n padding: 0;\n}\nlegend {\n padding: 0;\n}\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n/*\nReset default styling for dialogs.\n*/\ndialog {\n padding: 0;\n}\n/*\nPrevent resizing textareas horizontally by default.\n*/\ntextarea {\n resize: vertical;\n}\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user's configured gray 400 color.\n*/\ninput::-moz-placeholder, textarea::-moz-placeholder {\n opacity: 1; /* 1 */\n color: #a0a0a0; /* 2 */\n}\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1; /* 1 */\n color: #a0a0a0; /* 2 */\n}\n/*\nSet the default cursor for buttons.\n*/\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n/*\nMake sure disabled buttons don't get the pointer cursor.\n*/\n:disabled {\n cursor: default;\n}\n/*\n1. Make replaced elements \\`display: block\\` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add \\`vertical-align: middle\\` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n/* Make elements with the HTML hidden attribute stay hidden by default */\n[hidden] {\n display: none;\n}\n.container {\n width: 100%;\n}\n@media (min-width: 640px) {\n .container {\n max-width: 640px;\n }\n}\n@media (min-width: 768px) {\n .container {\n max-width: 768px;\n }\n}\n@media (min-width: 1024px) {\n .container {\n max-width: 1024px;\n }\n}\n@media (min-width: 1280px) {\n .container {\n max-width: 1280px;\n }\n}\n@media (min-width: 1536px) {\n .container {\n max-width: 1536px;\n }\n}\n.fixed {\n position: fixed;\n}\n.absolute {\n position: absolute;\n}\n.relative {\n position: relative;\n}\n.inset-0 {\n inset: 0px;\n}\n.bottom-4 {\n bottom: 1rem;\n}\n.bottom-full {\n bottom: 100%;\n}\n.left-0 {\n left: 0px;\n}\n.right-0 {\n right: 0px;\n}\n.right-4 {\n right: 1rem;\n}\n.z-10 {\n z-index: 10;\n}\n.z-50 {\n z-index: 50;\n}\n.col-span-full {\n grid-column: 1 / -1;\n}\n.mx-auto {\n margin-left: auto;\n margin-right: auto;\n}\n.-mr-1 {\n margin-right: -0.25rem;\n}\n.mb-1 {\n margin-bottom: 0.25rem;\n}\n.mb-2 {\n margin-bottom: 0.5rem;\n}\n.mb-3 {\n margin-bottom: 0.75rem;\n}\n.mb-4 {\n margin-bottom: 1rem;\n}\n.mb-6 {\n margin-bottom: 1.5rem;\n}\n.mb-8 {\n margin-bottom: 2rem;\n}\n.me-2 {\n margin-inline-end: 0.5rem;\n}\n.ml-2 {\n margin-left: 0.5rem;\n}\n.ml-4 {\n margin-left: 1rem;\n}\n.ml-auto {\n margin-left: auto;\n}\n.mr-1 {\n margin-right: 0.25rem;\n}\n.mr-2 {\n margin-right: 0.5rem;\n}\n.mr-4 {\n margin-right: 1rem;\n}\n.mt-1 {\n margin-top: 0.25rem;\n}\n.mt-2 {\n margin-top: 0.5rem;\n}\n.mt-3 {\n margin-top: 0.75rem;\n}\n.mt-4 {\n margin-top: 1rem;\n}\n.mt-6 {\n margin-top: 1.5rem;\n}\n.mt-auto {\n margin-top: auto;\n}\n.line-clamp-2 {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n}\n.block {\n display: block;\n}\n.inline-block {\n display: inline-block;\n}\n.flex {\n display: flex;\n}\n.inline-flex {\n display: inline-flex;\n}\n.grid {\n display: grid;\n}\n.hidden {\n display: none;\n}\n.h-2 {\n height: 0.5rem;\n}\n.h-24 {\n height: 6rem;\n}\n.h-4 {\n height: 1rem;\n}\n.h-5 {\n height: 1.25rem;\n}\n.h-6 {\n height: 1.5rem;\n}\n.h-full {\n height: 100%;\n}\n.h-screen {\n height: 100vh;\n}\n.max-h-\\\\[70vh\\\\] {\n max-height: 70vh;\n}\n.min-h-screen {\n min-height: 100vh;\n}\n.w-10 {\n width: 2.5rem;\n}\n.w-24 {\n width: 6rem;\n}\n.w-28 {\n width: 7rem;\n}\n.w-4 {\n width: 1rem;\n}\n.w-5 {\n width: 1.25rem;\n}\n.w-56 {\n width: 14rem;\n}\n.w-6 {\n width: 1.5rem;\n}\n.w-72 {\n width: 18rem;\n}\n.w-full {\n width: 100%;\n}\n.max-w-2xl {\n max-width: 42rem;\n}\n.max-w-3xl {\n max-width: 48rem;\n}\n.max-w-4xl {\n max-width: 56rem;\n}\n.max-w-5xl {\n max-width: 64rem;\n}\n.max-w-6xl {\n max-width: 72rem;\n}\n.max-w-md {\n max-width: 28rem;\n}\n.max-w-sm {\n max-width: 24rem;\n}\n.flex-1 {\n flex: 1 1 0%;\n}\n.flex-shrink-0 {\n flex-shrink: 0;\n}\n.flex-grow {\n flex-grow: 1;\n}\n.origin-top-right {\n transform-origin: top right;\n}\n.-translate-x-full {\n --tw-translate-x: -100%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.translate-x-0 {\n --tw-translate-x: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.scale-100 {\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.scale-95 {\n --tw-scale-x: .95;\n --tw-scale-y: .95;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.transform {\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.cursor-not-allowed {\n cursor: not-allowed;\n}\n.cursor-pointer {\n cursor: pointer;\n}\n.appearance-none {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.grid-cols-1 {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n}\n.flex-col {\n flex-direction: column;\n}\n.flex-wrap {\n flex-wrap: wrap;\n}\n.items-start {\n align-items: flex-start;\n}\n.items-center {\n align-items: center;\n}\n.justify-start {\n justify-content: flex-start;\n}\n.justify-end {\n justify-content: flex-end;\n}\n.justify-center {\n justify-content: center;\n}\n.justify-between {\n justify-content: space-between;\n}\n.gap-2 {\n gap: 0.5rem;\n}\n.gap-4 {\n gap: 1rem;\n}\n.space-x-1 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(0.25rem * var(--tw-space-x-reverse));\n margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse)));\n}\n.space-x-2 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(0.5rem * var(--tw-space-x-reverse));\n margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));\n}\n.space-x-3 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(0.75rem * var(--tw-space-x-reverse));\n margin-left: calc(0.75rem * calc(1 - var(--tw-space-x-reverse)));\n}\n.space-x-4 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(1rem * var(--tw-space-x-reverse));\n margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse)));\n}\n.space-y-1 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.25rem * var(--tw-space-y-reverse));\n}\n.space-y-2 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.5rem * var(--tw-space-y-reverse));\n}\n.space-y-3 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.75rem * var(--tw-space-y-reverse));\n}\n.space-y-4 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(1rem * var(--tw-space-y-reverse));\n}\n.overflow-hidden {\n overflow: hidden;\n}\n.overflow-y-auto {\n overflow-y: auto;\n}\n.truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.whitespace-pre-line {\n white-space: pre-line;\n}\n.rounded {\n border-radius: 0.25rem;\n}\n.rounded-full {\n border-radius: 9999px;\n}\n.rounded-lg {\n border-radius: 0.5rem;\n}\n.rounded-md {\n border-radius: 0.375rem;\n}\n.rounded-t-lg {\n border-top-left-radius: 0.5rem;\n border-top-right-radius: 0.5rem;\n}\n.border {\n border-width: 1px;\n}\n.border-b {\n border-bottom-width: 1px;\n}\n.border-t {\n border-top-width: 1px;\n}\n.border-none {\n border-style: none;\n}\n.border-blue-400 {\n --tw-border-opacity: 1;\n border-color: rgb(96 165 250 / var(--tw-border-opacity));\n}\n.border-gray-200 {\n --tw-border-opacity: 1;\n border-color: rgb(224 224 224 / var(--tw-border-opacity));\n}\n.border-gray-300 {\n --tw-border-opacity: 1;\n border-color: rgb(192 192 192 / var(--tw-border-opacity));\n}\n.border-gray-400 {\n --tw-border-opacity: 1;\n border-color: rgb(160 160 160 / var(--tw-border-opacity));\n}\n.border-green-400 {\n --tw-border-opacity: 1;\n border-color: rgb(74 222 128 / var(--tw-border-opacity));\n}\n.bg-black {\n --tw-bg-opacity: 1;\n background-color: rgb(0 0 0 / var(--tw-bg-opacity));\n}\n.bg-blue-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(59 130 246 / var(--tw-bg-opacity));\n}\n.bg-blue-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(37 99 235 / var(--tw-bg-opacity));\n}\n.bg-blue-700 {\n --tw-bg-opacity: 1;\n background-color: rgb(29 78 216 / var(--tw-bg-opacity));\n}\n.bg-gray-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(240 240 240 / var(--tw-bg-opacity));\n}\n.bg-gray-200 {\n --tw-bg-opacity: 1;\n background-color: rgb(224 224 224 / var(--tw-bg-opacity));\n}\n.bg-gray-300 {\n --tw-bg-opacity: 1;\n background-color: rgb(192 192 192 / var(--tw-bg-opacity));\n}\n.bg-gray-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(249 249 249 / var(--tw-bg-opacity));\n}\n.bg-gray-900 {\n --tw-bg-opacity: 1;\n background-color: rgb(16 16 16 / var(--tw-bg-opacity));\n}\n.bg-green-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(34 197 94 / var(--tw-bg-opacity));\n}\n.bg-red-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(239 68 68 / var(--tw-bg-opacity));\n}\n.bg-red-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(220 38 38 / var(--tw-bg-opacity));\n}\n.bg-red-700 {\n --tw-bg-opacity: 1;\n background-color: rgb(185 28 28 / var(--tw-bg-opacity));\n}\n.bg-transparent {\n background-color: transparent;\n}\n.bg-white {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity));\n}\n.bg-opacity-50 {\n --tw-bg-opacity: 0.5;\n}\n.bg-opacity-80 {\n --tw-bg-opacity: 0.8;\n}\n.object-cover {\n -o-object-fit: cover;\n object-fit: cover;\n}\n.p-2 {\n padding: 0.5rem;\n}\n.p-3 {\n padding: 0.75rem;\n}\n.p-4 {\n padding: 1rem;\n}\n.p-6 {\n padding: 1.5rem;\n}\n.p-8 {\n padding: 2rem;\n}\n.px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.px-3 {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n.py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n.py-1\\\\.5 {\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n}\n.py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.py-3 {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n}\n.py-4 {\n padding-top: 1rem;\n padding-bottom: 1rem;\n}\n.pb-3 {\n padding-bottom: 0.75rem;\n}\n.pl-6 {\n padding-left: 1.5rem;\n}\n.pr-4 {\n padding-right: 1rem;\n}\n.pt-20 {\n padding-top: 5rem;\n}\n.pt-3 {\n padding-top: 0.75rem;\n}\n.text-left {\n text-align: left;\n}\n.text-center {\n text-align: center;\n}\n.text-2xl {\n font-size: 1.5rem;\n line-height: 2rem;\n}\n.text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.text-xl {\n font-size: 1.25rem;\n line-height: 1.75rem;\n}\n.text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n.font-bold {\n font-weight: 700;\n}\n.font-extrabold {\n font-weight: 800;\n}\n.font-light {\n font-weight: 300;\n}\n.font-medium {\n font-weight: 500;\n}\n.font-semibold {\n font-weight: 600;\n}\n.uppercase {\n text-transform: uppercase;\n}\n.capitalize {\n text-transform: capitalize;\n}\n.tracking-wider {\n letter-spacing: 0.05em;\n}\n.text-blue-400 {\n --tw-text-opacity: 1;\n color: rgb(96 165 250 / var(--tw-text-opacity));\n}\n.text-blue-500 {\n --tw-text-opacity: 1;\n color: rgb(59 130 246 / var(--tw-text-opacity));\n}\n.text-blue-600 {\n --tw-text-opacity: 1;\n color: rgb(37 99 235 / var(--tw-text-opacity));\n}\n.text-gray-300 {\n --tw-text-opacity: 1;\n color: rgb(192 192 192 / var(--tw-text-opacity));\n}\n.text-gray-400 {\n --tw-text-opacity: 1;\n color: rgb(160 160 160 / var(--tw-text-opacity));\n}\n.text-gray-500 {\n --tw-text-opacity: 1;\n color: rgb(128 128 128 / var(--tw-text-opacity));\n}\n.text-gray-600 {\n --tw-text-opacity: 1;\n color: rgb(96 96 96 / var(--tw-text-opacity));\n}\n.text-gray-700 {\n --tw-text-opacity: 1;\n color: rgb(64 64 64 / var(--tw-text-opacity));\n}\n.text-gray-800 {\n --tw-text-opacity: 1;\n color: rgb(32 32 32 / var(--tw-text-opacity));\n}\n.text-gray-900 {\n --tw-text-opacity: 1;\n color: rgb(16 16 16 / var(--tw-text-opacity));\n}\n.text-green-400 {\n --tw-text-opacity: 1;\n color: rgb(74 222 128 / var(--tw-text-opacity));\n}\n.text-green-500 {\n --tw-text-opacity: 1;\n color: rgb(34 197 94 / var(--tw-text-opacity));\n}\n.text-red-500 {\n --tw-text-opacity: 1;\n color: rgb(239 68 68 / var(--tw-text-opacity));\n}\n.text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n.text-yellow-500 {\n --tw-text-opacity: 1;\n color: rgb(234 179 8 / var(--tw-text-opacity));\n}\n.no-underline {\n text-decoration-line: none;\n}\n.placeholder-gray-400::-moz-placeholder {\n --tw-placeholder-opacity: 1;\n color: rgb(160 160 160 / var(--tw-placeholder-opacity));\n}\n.placeholder-gray-400::placeholder {\n --tw-placeholder-opacity: 1;\n color: rgb(160 160 160 / var(--tw-placeholder-opacity));\n}\n.opacity-0 {\n opacity: 0;\n}\n.opacity-100 {\n opacity: 1;\n}\n.opacity-20 {\n opacity: 0.2;\n}\n.opacity-50 {\n opacity: 0.5;\n}\n.shadow {\n --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.shadow-2xl {\n --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);\n --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.shadow-lg {\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.shadow-md {\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.shadow-sm {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.ring-1 {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n.ring-black {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity));\n}\n.ring-opacity-5 {\n --tw-ring-opacity: 0.05;\n}\n.filter {\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.transition-all {\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-colors {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-opacity {\n transition-property: opacity;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-transform {\n transition-property: transform;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.duration-200 {\n transition-duration: 200ms;\n}\n.duration-300 {\n transition-duration: 300ms;\n}\n.ease-in-out {\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n}\n\ninput:focus, select:focus, textarea:focus {\n outline: none;\n box-shadow: none;\n}\n\n.file\\\\:mr-4::file-selector-button {\n margin-right: 1rem;\n}\n\n.file\\\\:rounded-full::file-selector-button {\n border-radius: 9999px;\n}\n\n.file\\\\:border-0::file-selector-button {\n border-width: 0px;\n}\n\n.file\\\\:bg-blue-50::file-selector-button {\n --tw-bg-opacity: 1;\n background-color: rgb(239 246 255 / var(--tw-bg-opacity));\n}\n\n.file\\\\:px-4::file-selector-button {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n\n.file\\\\:py-2::file-selector-button {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.file\\\\:text-sm::file-selector-button {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.file\\\\:font-semibold::file-selector-button {\n font-weight: 600;\n}\n\n.file\\\\:text-blue-700::file-selector-button {\n --tw-text-opacity: 1;\n color: rgb(29 78 216 / var(--tw-text-opacity));\n}\n\n.checked\\\\:border-transparent:checked {\n border-color: transparent;\n}\n\n.checked\\\\:bg-blue-600:checked {\n --tw-bg-opacity: 1;\n background-color: rgb(37 99 235 / var(--tw-bg-opacity));\n}\n\n.hover\\\\:bg-blue-600:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(37 99 235 / var(--tw-bg-opacity));\n}\n\n.hover\\\\:bg-blue-700:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(29 78 216 / var(--tw-bg-opacity));\n}\n\n.hover\\\\:bg-gray-100:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(240 240 240 / var(--tw-bg-opacity));\n}\n\n.hover\\\\:bg-gray-200:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(224 224 224 / var(--tw-bg-opacity));\n}\n\n.hover\\\\:bg-gray-300:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(192 192 192 / var(--tw-bg-opacity));\n}\n\n.hover\\\\:bg-gray-400:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(160 160 160 / var(--tw-bg-opacity));\n}\n\n.hover\\\\:bg-gray-50:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(249 249 249 / var(--tw-bg-opacity));\n}\n\n.hover\\\\:bg-red-600:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(220 38 38 / var(--tw-bg-opacity));\n}\n\n.hover\\\\:bg-red-700:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(185 28 28 / var(--tw-bg-opacity));\n}\n\n.hover\\\\:text-black:hover {\n --tw-text-opacity: 1;\n color: rgb(0 0 0 / var(--tw-text-opacity));\n}\n\n.hover\\\\:text-blue-700:hover {\n --tw-text-opacity: 1;\n color: rgb(29 78 216 / var(--tw-text-opacity));\n}\n\n.hover\\\\:text-gray-700:hover {\n --tw-text-opacity: 1;\n color: rgb(64 64 64 / var(--tw-text-opacity));\n}\n\n.hover\\\\:text-red-500:hover {\n --tw-text-opacity: 1;\n color: rgb(239 68 68 / var(--tw-text-opacity));\n}\n\n.hover\\\\:text-red-700:hover {\n --tw-text-opacity: 1;\n color: rgb(185 28 28 / var(--tw-text-opacity));\n}\n\n.hover\\\\:underline:hover {\n text-decoration-line: underline;\n}\n\n.hover\\\\:file\\\\:bg-blue-100::file-selector-button:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(219 234 254 / var(--tw-bg-opacity));\n}\n\n.focus\\\\:border-blue-500:focus {\n --tw-border-opacity: 1;\n border-color: rgb(59 130 246 / var(--tw-border-opacity));\n}\n\n.focus\\\\:outline-none:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n\n.focus\\\\:ring-0:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n.focus\\\\:ring-2:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n.focus\\\\:ring-blue-500:focus {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));\n}\n\n.dark\\\\:border-blue-700:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(29 78 216 / var(--tw-border-opacity));\n}\n\n.dark\\\\:border-gray-700:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(64 64 64 / var(--tw-border-opacity));\n}\n\n.dark\\\\:border-gray-800:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(32 32 32 / var(--tw-border-opacity));\n}\n\n.dark\\\\:border-gray-900:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(16 16 16 / var(--tw-border-opacity));\n}\n\n.dark\\\\:border-green-700:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(21 128 61 / var(--tw-border-opacity));\n}\n\n.dark\\\\:bg-blue-500:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(59 130 246 / var(--tw-bg-opacity));\n}\n\n.dark\\\\:bg-gray-700:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(64 64 64 / var(--tw-bg-opacity));\n}\n\n.dark\\\\:bg-gray-800:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(32 32 32 / var(--tw-bg-opacity));\n}\n\n.dark\\\\:bg-gray-900:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(16 16 16 / var(--tw-bg-opacity));\n}\n\n.dark\\\\:bg-red-500:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(239 68 68 / var(--tw-bg-opacity));\n}\n\n.dark\\\\:bg-transparent:is(.dark *) {\n background-color: transparent;\n}\n\n.dark\\\\:text-blue-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(96 165 250 / var(--tw-text-opacity));\n}\n\n.dark\\\\:text-gray-100:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(240 240 240 / var(--tw-text-opacity));\n}\n\n.dark\\\\:text-gray-200:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(224 224 224 / var(--tw-text-opacity));\n}\n\n.dark\\\\:text-gray-300:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(192 192 192 / var(--tw-text-opacity));\n}\n\n.dark\\\\:text-gray-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(160 160 160 / var(--tw-text-opacity));\n}\n\n.dark\\\\:text-green-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(74 222 128 / var(--tw-text-opacity));\n}\n\n.dark\\\\:text-red-300:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(252 165 165 / var(--tw-text-opacity));\n}\n\n.dark\\\\:text-white:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n\n.dark\\\\:placeholder-gray-600:is(.dark *)::-moz-placeholder {\n --tw-placeholder-opacity: 1;\n color: rgb(96 96 96 / var(--tw-placeholder-opacity));\n}\n\n.dark\\\\:placeholder-gray-600:is(.dark *)::placeholder {\n --tw-placeholder-opacity: 1;\n color: rgb(96 96 96 / var(--tw-placeholder-opacity));\n}\n\n.dark\\\\:file\\\\:bg-gray-700:is(.dark *)::file-selector-button {\n --tw-bg-opacity: 1;\n background-color: rgb(64 64 64 / var(--tw-bg-opacity));\n}\n\n.dark\\\\:file\\\\:text-gray-200:is(.dark *)::file-selector-button {\n --tw-text-opacity: 1;\n color: rgb(224 224 224 / var(--tw-text-opacity));\n}\n\n.dark\\\\:hover\\\\:bg-blue-600:hover:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(37 99 235 / var(--tw-bg-opacity));\n}\n\n.dark\\\\:hover\\\\:bg-gray-600:hover:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(96 96 96 / var(--tw-bg-opacity));\n}\n\n.dark\\\\:hover\\\\:bg-gray-700:hover:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(64 64 64 / var(--tw-bg-opacity));\n}\n\n.dark\\\\:hover\\\\:bg-red-600:hover:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(220 38 38 / var(--tw-bg-opacity));\n}\n\n.dark\\\\:hover\\\\:text-blue-300:hover:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(147 197 253 / var(--tw-text-opacity));\n}\n\n.dark\\\\:hover\\\\:text-gray-400:hover:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(160 160 160 / var(--tw-text-opacity));\n}\n\n.dark\\\\:hover\\\\:text-red-300:hover:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(252 165 165 / var(--tw-text-opacity));\n}\n\n.dark\\\\:hover\\\\:text-white:hover:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n\n.dark\\\\:hover\\\\:file\\\\:bg-gray-600:is(.dark *)::file-selector-button:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(96 96 96 / var(--tw-bg-opacity));\n}\n\n@media (min-width: 640px) {\n .sm\\\\:grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n .sm\\\\:p-6 {\n padding: 1.5rem;\n }\n}\n\n@media (min-width: 768px) {\n .md\\\\:mb-0 {\n margin-bottom: 0px;\n }\n .md\\\\:flex {\n display: flex;\n }\n .md\\\\:hidden {\n display: none;\n }\n .md\\\\:w-1\\\\/3 {\n width: 33.333333%;\n }\n .md\\\\:grid-cols-3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n .md\\\\:flex-row {\n flex-direction: row;\n }\n .md\\\\:items-center {\n align-items: center;\n }\n .md\\\\:justify-end {\n justify-content: flex-end;\n }\n .md\\\\:justify-between {\n justify-content: space-between;\n }\n .md\\\\:space-x-4 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(1rem * var(--tw-space-x-reverse));\n margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse)));\n }\n}\n\n@media (min-width: 1024px) {\n .lg\\\\:static {\n position: static;\n }\n .lg\\\\:flex {\n display: flex;\n }\n .lg\\\\:hidden {\n display: none;\n }\n .lg\\\\:translate-x-0 {\n --tw-translate-x: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n }\n .lg\\\\:grid-cols-3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n .lg\\\\:grid-cols-4 {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n }\n .lg\\\\:flex-col {\n flex-direction: column;\n }\n .lg\\\\:p-8 {\n padding: 2rem;\n }\n}`, \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://tududi/./app/frontend/styles/tailwind.css?./node_modules/css-loader/dist/cjs.js!./node_modules/postcss-loader/dist/cjs.js"); /***/ }), @@ -3056,7 +3056,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /******/ /******/ /* webpack/runtime/getFullHash */ /******/ (() => { -/******/ __webpack_require__.h = () => ("91d8237d084a08bd5c28") +/******/ __webpack_require__.h = () => ("a5c63e3f03de8a563175") /******/ })(); /******/ /******/ /* webpack/runtime/global */