diff --git a/frontend/src/components/create_event_modal.rs b/frontend/src/components/create_event_modal.rs
index cb4ba0f..dd5655f 100644
--- a/frontend/src/components/create_event_modal.rs
+++ b/frontend/src/components/create_event_modal.rs
@@ -1,5 +1,6 @@
use yew::prelude::*;
use web_sys::{HtmlInputElement, HtmlTextAreaElement, HtmlSelectElement};
+use wasm_bindgen::JsCast;
use chrono::{NaiveDate, NaiveTime, Local, TimeZone, Utc};
use crate::services::calendar_service::CalendarInfo;
use crate::models::ical::VEvent;
@@ -238,9 +239,26 @@ impl EventCreationData {
}
+#[derive(Clone, PartialEq)]
+enum ModalTab {
+ BasicDetails,
+ Advanced,
+ People,
+ Categories,
+ Location,
+ Reminders,
+}
+
+impl Default for ModalTab {
+ fn default() -> Self {
+ ModalTab::BasicDetails
+ }
+}
+
#[function_component(CreateEventModal)]
pub fn create_event_modal(props: &CreateEventModalProps) -> Html {
let event_data = use_state(|| EventCreationData::default());
+ let active_tab = use_state(|| ModalTab::default());
// Initialize with selected date or event data if provided
use_effect_with((props.selected_date, props.event_to_edit.clone(), props.is_open, props.available_calendars.clone(), props.initial_start_time, props.initial_end_time), {
@@ -554,6 +572,14 @@ pub fn create_event_modal(props: &CreateEventModalProps) -> Html {
})
};
+ // Tab switching callbacks
+ let switch_to_tab = {
+ let active_tab = active_tab.clone();
+ Callback::from(move |tab: ModalTab| {
+ active_tab.set(tab);
+ })
+ };
+
let data = &*event_data;
html! {
@@ -568,273 +594,912 @@ pub fn create_event_modal(props: &CreateEventModalProps) -> Html {
-
- {"Title *"}
-
-
-
-
+
+ // Tab Content
+
+ {
+ match *active_tab {
+ ModalTab::BasicDetails => html! {
+
+
+ {"Title *"}
+
+
-
- {"Description"}
-
-
-
-
-
-
- {" All Day"}
-
-
-
-
-
-
-
-
- {"Location"}
-
-
-
-
-
-
- {"Priority (0-9, optional)"}
-
-
-
-
- {"Organizer Email"}
-
-
-
-
- {"Attendees (comma-separated emails)"}
-
-
-
-
- {"Categories (comma-separated)"}
-
-
-
-
-
- // Show weekday selection only when weekly recurrence is selected
- if matches!(data.recurrence, RecurrenceType::Weekly) {
-
+
+
+ {"Description"}
+
+
+
+
+
+
+ {" All Day"}
+
+
+
+
+
+
+
+
+ {"Location"}
+
+
+
+
+
+ // Show weekday selection only when weekly recurrence is selected
+ if matches!(data.recurrence, RecurrenceType::Weekly) {
+
+ }
+
+ },
+ ModalTab::Advanced => html! {
+
+
+
+
+
+
+
+
+
+ // Show advanced weekday selection when weekly recurrence is selected
+ if matches!(data.recurrence, RecurrenceType::Weekly) {
+
+ }
+
+
+
{"Advanced Features"}
+
+ {"Time transparency and free/busy status"}
+ {"Complex recurrence rules with exceptions"}
+ {"Multiple alarm configurations"}
+ {"Custom properties and metadata"}
+
+
{"These features follow RFC 5545 iCalendar standards"}
+
+
+ },
+ ModalTab::People => html! {
+
+
+
+
+
+
+
{"Invitation & Response Management"}
+
+ {"Invitations are sent automatically when the event is saved"}
+ {"Attendees can respond with Accept, Decline, or Tentative"}
+ {"Response tracking follows RFC 5545 PARTSTAT standards"}
+ {"Delegation and role management available after event creation"}
+
+
+
+
{"Email Validation"}
+
{"Email addresses will be validated when you save the event. Invalid emails will be highlighted and must be corrected before proceeding."}
+
+
+
+
+
{"Advanced Attendee Features"}
+
+
+ {"Chair:"}
+ {"Meeting leader or event host"}
+
+
+ {"Required Participant:"}
+ {"Attendance is required"}
+
+
+ {"Optional Participant:"}
+ {"Attendance is optional"}
+
+
+ {"Non-Participant:"}
+ {"For information only"}
+
+
+
{"Advanced role assignment and RSVP management will be available in future versions"}
+
+
+ },
+ ModalTab::Categories => html! {
+
+
+
+
+
{"Common Categories"}
+
+ {"work"}
+ {"meeting"}
+ {"personal"}
+ {"project"}
+ {"urgent"}
+ {"social"}
+
+
{"Click to add these common categories to your event"}
+
+
+
+
{"Event Organization & Filtering"}
+
+ {"Categories help organize events in calendar views"}
+ {"Filter events by category to focus on specific types"}
+ {"Categories are searchable and can be used for reporting"}
+ {"Multiple categories per event are fully supported"}
+
+
+
+
{"Resources & Related Events"}
+
{"Advanced resource management features will include:"}
+
+
+ {"Equipment Resources:"}
+ {"Projectors, rooms, vehicles"}
+
+
+ {"Human Resources:"}
+ {"Required staff, specialists"}
+
+
+ {"Related Events:"}
+ {"Link dependencies and sequences"}
+
+
+ {"Comments & Notes:"}
+ {"Internal notes and documentation"}
+
+
+
+
+
+
+
{"Quick Actions"}
+
+ {"Clear Categories"}
+
+
{"Remove all categories from this event"}
+
+
+ },
+ ModalTab::Location => html! {
+
+
+
+
+
{"Common Locations"}
+
+ {"Conference Room"}
+ {"Online Meeting"}
+ {"Main Office"}
+ {"Client Site"}
+ {"Home Office"}
+
+
{"Click to quickly set common location types"}
+
+
+
+
{"Location Features & Integration"}
+
+ {"Location information is included in calendar invitations"}
+ {"Supports both physical addresses and virtual meeting links"}
+ {"Compatible with mapping and navigation applications"}
+ {"Room booking integration available for enterprise setups"}
+
+
+
+
{"Geographic Coordinates (Advanced)"}
+
{"Future versions will support:"}
+
+
+ {"GPS Coordinates:"}
+ {"Precise latitude/longitude positioning"}
+
+
+ {"Map Integration:"}
+ {"Embedded maps in event details"}
+
+
+ {"Travel Time:"}
+ {"Automatic travel time calculation"}
+
+
+ {"Location History:"}
+ {"Smart suggestions based on past events"}
+
+
+
+
+
+
+
{"Location Type Examples"}
+
+
+
{"Physical Locations:"}
+
+ {"123 Business Ave, Suite 400, City, State 12345"}
+ {"Conference Room B, 2nd Floor, Main Building"}
+ {"Central Park, 5th Avenue entrance"}
+
+
+
+
{"Virtual Locations:"}
+
+ {"Zoom Meeting ID: 123-456-7890"}
+ {"Microsoft Teams: team.microsoft.com/meeting/..."}
+ {"Google Meet: meet.google.com/abc-defg-hij"}
+
+
+
+
{"Both physical addresses and virtual meeting information are fully supported"}
+
+
+
+
{"Quick Actions"}
+
+ {"Clear Location"}
+
+
{"Remove location information from this event"}
+
+
+ },
+ ModalTab::Reminders => html! {
+
+
+
+
+
{"Reminder & Alarm Types"}
+
+
+
{"🔔 Display Alarm"}
+
{"Pop-up notification on your device"}
+
+
+
{"📧 Email Reminder"}
+
{"Email notification sent to your address"}
+
+
+
{"🔊 Audio Alert"}
+
{"Sound notification with custom audio"}
+
+
+
{"📱 SMS/Text"}
+
{"Text message reminder (enterprise feature)"}
+
+
+
{"Multiple alarm types follow RFC 5545 VALARM standards"}
+
+
+
+
{"Advanced Reminder Features"}
+
+ {"Multiple reminders per event with different timing"}
+ {"Custom reminder messages and descriptions"}
+ {"Recurring reminders for recurring events"}
+ {"Snooze and dismiss functionality"}
+ {"Integration with system notifications"}
+
+
+
+
{"File Attachments & Documents"}
+
{"Future attachment features will include:"}
+
+
+ {"📎 File Uploads:"}
+ {"Documents, images, presentations"}
+
+
+ {"🔗 URL Links:"}
+ {"Web resources and reference materials"}
+
+
+ {"💾 Cloud Storage:"}
+ {"Google Drive, Dropbox, OneDrive integration"}
+
+
+ {"📝 Meeting Notes:"}
+ {"Collaborative note-taking and agenda items"}
+
+
+
+
+
+
+
{"Common Reminder Patterns"}
+
+
+ {"📅 Meetings:"}
+ {"15 minutes before (preparation time)"}
+
+
+ {"✈️ Travel Events:"}
+ {"2 hours before (traffic and check-in)"}
+
+
+ {"🎂 Personal Events:"}
+ {"1 day before (preparation and gifts)"}
+
+
+ {"📋 Deadlines:"}
+ {"1 week before (completion buffer)"}
+
+
+
{"Suggested timing based on common event types"}
+
+
+
+
{"Quick Actions"}
+
+ {"Set 15min Reminder"}
+ {"No Reminder"}
+
+
{"Quickly set or clear event reminders"}
+
+
+
+
{"🎉 Modal Complete!"}
+
{"You've reached the final tab of the comprehensive event creation interface. This modal now provides access to all major VEvent properties following RFC 5545 standards."}
+
+
+
+ {"✅ Basic Details"}
+ {"Title, calendar, dates, location, basic recurrence"}
+
+
+ {"✅ Advanced"}
+ {"Status, priority, classification, advanced options"}
+
+
+ {"✅ People"}
+ {"Organizer, attendees, invitation management"}
+
+
+ {"✅ Categories"}
+ {"Event tagging and organizational features"}
+
+
+ {"✅ Location"}
+ {"Physical and virtual location management"}
+
+
+ {"✅ Reminders"}
+ {"Alarm configuration and future attachments"}
+
+
+
+
+ },
+ }
}
diff --git a/frontend/styles.css b/frontend/styles.css
index c9afe62..50f0d58 100644
--- a/frontend/styles.css
+++ b/frontend/styles.css
@@ -1900,6 +1900,1052 @@ body {
}
}
+/* Tabbed Modal Interface Styles */
+.tab-navigation {
+ display: flex;
+ border-bottom: 2px solid #e9ecef;
+ margin-bottom: 1.5rem;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ scrollbar-width: none;
+ -ms-overflow-style: none;
+}
+
+.tab-navigation::-webkit-scrollbar {
+ display: none;
+}
+
+.tab-button {
+ background: none;
+ border: none;
+ padding: 0.75rem 1rem;
+ cursor: pointer;
+ font-size: 0.85rem;
+ font-weight: 500;
+ color: #6c757d;
+ transition: all 0.2s ease;
+ border-bottom: 3px solid transparent;
+ white-space: nowrap;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ min-width: max-content;
+}
+
+.tab-button:hover {
+ color: #495057;
+ background: #f8f9fa;
+}
+
+.tab-button.active {
+ color: #667eea;
+ border-bottom-color: #667eea;
+ background: #f8f9ff;
+}
+
+.tab-content {
+ min-height: 300px;
+ max-height: 50vh;
+ overflow-y: auto;
+ padding-right: 0.5rem;
+}
+
+.tab-panel {
+ animation: fadeIn 0.2s ease-in-out;
+}
+
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(10px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+/* Mobile adjustments for tabbed interface */
+@media (max-width: 768px) {
+ .tab-navigation {
+ gap: 0;
+ margin-bottom: 1rem;
+ }
+
+ .tab-button {
+ padding: 0.5rem 0.75rem;
+ font-size: 0.8rem;
+ flex: 1;
+ justify-content: center;
+ min-width: unset;
+ }
+
+ .tab-content {
+ min-height: 250px;
+ max-height: 45vh;
+ }
+}
+
+/* Form Help Text and Advanced Info Styles */
+.form-help-text {
+ font-size: 0.8rem;
+ color: #6c757d;
+ margin-top: 0.25rem;
+ margin-bottom: 0;
+ line-height: 1.4;
+ font-style: italic;
+}
+
+.advanced-info {
+ background: #f8f9fa;
+ border: 1px solid #e9ecef;
+ border-radius: 8px;
+ padding: 1rem;
+ margin-top: 1.5rem;
+}
+
+.advanced-info h5 {
+ margin: 0 0 0.75rem 0;
+ color: #495057;
+ font-size: 0.9rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+.advanced-info ul {
+ margin: 0 0 0.75rem 0;
+ padding-left: 1.2rem;
+ list-style-type: disc;
+}
+
+.advanced-info li {
+ font-size: 0.85rem;
+ color: #6c757d;
+ line-height: 1.4;
+ margin-bottom: 0.25rem;
+}
+
+.advanced-info .form-help-text {
+ margin-top: 0.5rem;
+ margin-bottom: 0;
+ border-top: 1px solid #e9ecef;
+ padding-top: 0.5rem;
+}
+
+/* Theme compatibility for advanced info */
+[data-theme="dark"] .advanced-info {
+ background: #2a2a2a;
+ border-color: #444444;
+}
+
+[data-theme="dark"] .advanced-info h5 {
+ color: #e0e0e0;
+}
+
+[data-theme="dark"] .advanced-info li {
+ color: #b0b0b0;
+}
+
+[data-theme="dark"] .advanced-info .form-help-text {
+ border-color: #444444;
+}
+
+/* People Tab Styles */
+.people-info {
+ background: #f8f9fa;
+ border: 1px solid #e9ecef;
+ border-radius: 8px;
+ padding: 1rem;
+ margin-top: 1.5rem;
+}
+
+.people-info h5,
+.people-info h6 {
+ margin: 0 0 0.75rem 0;
+ color: #495057;
+ font-size: 0.9rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+.people-info h6 {
+ font-size: 0.8rem;
+ margin-top: 1rem;
+ margin-bottom: 0.5rem;
+}
+
+.people-validation {
+ margin-top: 1rem;
+ padding-top: 1rem;
+ border-top: 1px solid #e9ecef;
+}
+
+.attendee-roles-preview {
+ background: #f8f9fa;
+ border: 1px solid #e9ecef;
+ border-radius: 8px;
+ padding: 1rem;
+ margin-top: 1rem;
+}
+
+.attendee-roles-preview h5 {
+ margin: 0 0 0.75rem 0;
+ color: #495057;
+ font-size: 0.9rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+.role-examples {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+ margin-bottom: 1rem;
+}
+
+.role-item {
+ display: flex;
+ align-items: flex-start;
+ gap: 0.5rem;
+ padding: 0.5rem;
+ background: white;
+ border-radius: 6px;
+ border: 1px solid #e9ecef;
+}
+
+.role-item strong {
+ color: #495057;
+ font-size: 0.85rem;
+ font-weight: 600;
+ min-width: 140px;
+ flex-shrink: 0;
+}
+
+.role-item span {
+ color: #6c757d;
+ font-size: 0.85rem;
+ line-height: 1.3;
+}
+
+/* Theme compatibility for people info */
+[data-theme="dark"] .people-info,
+[data-theme="dark"] .attendee-roles-preview {
+ background: #2a2a2a;
+ border-color: #444444;
+}
+
+[data-theme="dark"] .people-info h5,
+[data-theme="dark"] .people-info h6,
+[data-theme="dark"] .attendee-roles-preview h5 {
+ color: #e0e0e0;
+}
+
+[data-theme="dark"] .people-validation {
+ border-color: #444444;
+}
+
+[data-theme="dark"] .role-item {
+ background: #1f1f1f;
+ border-color: #444444;
+}
+
+[data-theme="dark"] .role-item strong {
+ color: #e0e0e0;
+}
+
+[data-theme="dark"] .role-item span {
+ color: #b0b0b0;
+}
+
+/* Mobile adjustments for people tab */
+@media (max-width: 768px) {
+ .role-item {
+ flex-direction: column;
+ gap: 0.25rem;
+ }
+
+ .role-item strong {
+ min-width: unset;
+ }
+}
+
+/* Categories Tab Styles */
+.categories-suggestions {
+ background: #f8f9fa;
+ border: 1px solid #e9ecef;
+ border-radius: 8px;
+ padding: 1rem;
+ margin-top: 1.5rem;
+}
+
+.categories-suggestions h5 {
+ margin: 0 0 0.75rem 0;
+ color: #495057;
+ font-size: 0.9rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+.category-tags {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+ margin-bottom: 0.75rem;
+}
+
+.category-tag {
+ background: white;
+ border: 1px solid #667eea;
+ color: #667eea;
+ padding: 0.4rem 0.8rem;
+ border-radius: 20px;
+ font-size: 0.8rem;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.2s ease;
+}
+
+.category-tag:hover {
+ background: #667eea;
+ color: white;
+ transform: translateY(-1px);
+ box-shadow: 0 2px 4px rgba(102, 126, 234, 0.2);
+}
+
+.categories-info {
+ background: #f8f9fa;
+ border: 1px solid #e9ecef;
+ border-radius: 8px;
+ padding: 1rem;
+ margin-top: 1rem;
+}
+
+.categories-info h5,
+.categories-info h6 {
+ margin: 0 0 0.75rem 0;
+ color: #495057;
+ font-size: 0.9rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+.categories-info h6 {
+ font-size: 0.8rem;
+ margin-top: 1rem;
+ margin-bottom: 0.5rem;
+}
+
+.resources-section {
+ margin-top: 1rem;
+ padding-top: 1rem;
+ border-top: 1px solid #e9ecef;
+}
+
+.resource-features {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+ margin-top: 0.75rem;
+}
+
+.feature-item {
+ display: flex;
+ align-items: flex-start;
+ gap: 0.5rem;
+ padding: 0.5rem;
+ background: white;
+ border-radius: 6px;
+ border: 1px solid #e9ecef;
+}
+
+.feature-item strong {
+ color: #495057;
+ font-size: 0.85rem;
+ font-weight: 600;
+ min-width: 140px;
+ flex-shrink: 0;
+}
+
+.feature-item span {
+ color: #6c757d;
+ font-size: 0.85rem;
+ line-height: 1.3;
+}
+
+.quick-actions {
+ background: #f8f9fa;
+ border: 1px solid #e9ecef;
+ border-radius: 8px;
+ padding: 1rem;
+ margin-top: 1rem;
+}
+
+.quick-actions h5 {
+ margin: 0 0 0.75rem 0;
+ color: #495057;
+ font-size: 0.9rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+.action-buttons {
+ display: flex;
+ gap: 0.5rem;
+ margin-bottom: 0.5rem;
+}
+
+.action-btn {
+ background: #dc3545;
+ border: 1px solid #dc3545;
+ color: white;
+ padding: 0.5rem 1rem;
+ border-radius: 6px;
+ font-size: 0.85rem;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.2s ease;
+}
+
+.action-btn:hover {
+ background: #c82333;
+ border-color: #bd2130;
+ transform: translateY(-1px);
+ box-shadow: 0 2px 4px rgba(220, 53, 69, 0.2);
+}
+
+/* Theme compatibility for categories */
+[data-theme="dark"] .categories-suggestions,
+[data-theme="dark"] .categories-info,
+[data-theme="dark"] .quick-actions {
+ background: #2a2a2a;
+ border-color: #444444;
+}
+
+[data-theme="dark"] .categories-suggestions h5,
+[data-theme="dark"] .categories-info h5,
+[data-theme="dark"] .categories-info h6,
+[data-theme="dark"] .quick-actions h5 {
+ color: #e0e0e0;
+}
+
+[data-theme="dark"] .category-tag {
+ background: #1f1f1f;
+ border-color: #667eea;
+ color: #667eea;
+}
+
+[data-theme="dark"] .category-tag:hover {
+ background: #667eea;
+ color: white;
+}
+
+[data-theme="dark"] .feature-item {
+ background: #1f1f1f;
+ border-color: #444444;
+}
+
+[data-theme="dark"] .feature-item strong {
+ color: #e0e0e0;
+}
+
+[data-theme="dark"] .feature-item span {
+ color: #b0b0b0;
+}
+
+[data-theme="dark"] .resources-section {
+ border-color: #444444;
+}
+
+/* Mobile adjustments for categories tab */
+@media (max-width: 768px) {
+ .category-tags {
+ gap: 0.25rem;
+ }
+
+ .category-tag {
+ padding: 0.3rem 0.6rem;
+ font-size: 0.75rem;
+ }
+
+ .feature-item {
+ flex-direction: column;
+ gap: 0.25rem;
+ }
+
+ .feature-item strong {
+ min-width: unset;
+ }
+
+ .action-buttons {
+ flex-direction: column;
+ }
+}
+
+/* Location Tab Styles */
+.location-suggestions {
+ background: #f8f9fa;
+ border: 1px solid #e9ecef;
+ border-radius: 8px;
+ padding: 1rem;
+ margin-top: 1.5rem;
+}
+
+.location-suggestions h5 {
+ margin: 0 0 0.75rem 0;
+ color: #495057;
+ font-size: 0.9rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+.location-tags {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+ margin-bottom: 0.75rem;
+}
+
+.location-tag {
+ background: white;
+ border: 1px solid #28a745;
+ color: #28a745;
+ padding: 0.4rem 0.8rem;
+ border-radius: 20px;
+ font-size: 0.8rem;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.2s ease;
+}
+
+.location-tag:hover {
+ background: #28a745;
+ color: white;
+ transform: translateY(-1px);
+ box-shadow: 0 2px 4px rgba(40, 167, 69, 0.2);
+}
+
+.location-info {
+ background: #f8f9fa;
+ border: 1px solid #e9ecef;
+ border-radius: 8px;
+ padding: 1rem;
+ margin-top: 1rem;
+}
+
+.location-info h5,
+.location-info h6 {
+ margin: 0 0 0.75rem 0;
+ color: #495057;
+ font-size: 0.9rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+.location-info h6 {
+ font-size: 0.8rem;
+ margin-top: 1rem;
+ margin-bottom: 0.5rem;
+}
+
+.geo-section {
+ margin-top: 1rem;
+ padding-top: 1rem;
+ border-top: 1px solid #e9ecef;
+}
+
+.geo-features {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+ margin-top: 0.75rem;
+}
+
+.geo-item {
+ display: flex;
+ align-items: flex-start;
+ gap: 0.5rem;
+ padding: 0.5rem;
+ background: white;
+ border-radius: 6px;
+ border: 1px solid #e9ecef;
+}
+
+.geo-item strong {
+ color: #495057;
+ font-size: 0.85rem;
+ font-weight: 600;
+ min-width: 120px;
+ flex-shrink: 0;
+}
+
+.geo-item span {
+ color: #6c757d;
+ font-size: 0.85rem;
+ line-height: 1.3;
+}
+
+.location-types {
+ background: #f8f9fa;
+ border: 1px solid #e9ecef;
+ border-radius: 8px;
+ padding: 1rem;
+ margin-top: 1rem;
+}
+
+.location-types h5 {
+ margin: 0 0 0.75rem 0;
+ color: #495057;
+ font-size: 0.9rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+.type-examples {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+ margin-bottom: 1rem;
+}
+
+.type-category {
+ padding: 0.75rem;
+ background: white;
+ border-radius: 6px;
+ border: 1px solid #e9ecef;
+}
+
+.type-category strong {
+ display: block;
+ color: #495057;
+ font-size: 0.9rem;
+ font-weight: 600;
+ margin-bottom: 0.5rem;
+}
+
+.type-category ul {
+ margin: 0;
+ padding-left: 1.2rem;
+ list-style-type: disc;
+}
+
+.type-category li {
+ color: #6c757d;
+ font-size: 0.85rem;
+ line-height: 1.4;
+ margin-bottom: 0.25rem;
+ font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', monospace;
+ background: #f8f9fa;
+ padding: 0.2rem 0.4rem;
+ border-radius: 3px;
+}
+
+.action-btn.secondary {
+ background: #6c757d;
+ border-color: #6c757d;
+}
+
+.action-btn.secondary:hover {
+ background: #5a6268;
+ border-color: #545b62;
+ box-shadow: 0 2px 4px rgba(108, 117, 125, 0.2);
+}
+
+/* Theme compatibility for location */
+[data-theme="dark"] .location-suggestions,
+[data-theme="dark"] .location-info,
+[data-theme="dark"] .location-types {
+ background: #2a2a2a;
+ border-color: #444444;
+}
+
+[data-theme="dark"] .location-suggestions h5,
+[data-theme="dark"] .location-info h5,
+[data-theme="dark"] .location-info h6,
+[data-theme="dark"] .location-types h5 {
+ color: #e0e0e0;
+}
+
+[data-theme="dark"] .location-tag {
+ background: #1f1f1f;
+ border-color: #28a745;
+ color: #28a745;
+}
+
+[data-theme="dark"] .location-tag:hover {
+ background: #28a745;
+ color: white;
+}
+
+[data-theme="dark"] .geo-item,
+[data-theme="dark"] .type-category {
+ background: #1f1f1f;
+ border-color: #444444;
+}
+
+[data-theme="dark"] .geo-item strong,
+[data-theme="dark"] .type-category strong {
+ color: #e0e0e0;
+}
+
+[data-theme="dark"] .geo-item span {
+ color: #b0b0b0;
+}
+
+[data-theme="dark"] .type-category li {
+ color: #b0b0b0;
+ background: #2a2a2a;
+}
+
+[data-theme="dark"] .geo-section {
+ border-color: #444444;
+}
+
+/* Mobile adjustments for location tab */
+@media (max-width: 768px) {
+ .location-tags {
+ gap: 0.25rem;
+ }
+
+ .location-tag {
+ padding: 0.3rem 0.6rem;
+ font-size: 0.75rem;
+ }
+
+ .geo-item {
+ flex-direction: column;
+ gap: 0.25rem;
+ }
+
+ .geo-item strong {
+ min-width: unset;
+ }
+
+ .type-examples {
+ gap: 0.75rem;
+ }
+
+ .type-category {
+ padding: 0.5rem;
+ }
+
+ .type-category li {
+ font-size: 0.8rem;
+ }
+}
+
+/* Reminders & Attachments Tab Styles */
+.reminder-types {
+ background: #f8f9fa;
+ border: 1px solid #e9ecef;
+ border-radius: 8px;
+ padding: 1rem;
+ margin-top: 1.5rem;
+}
+
+.reminder-types h5 {
+ margin: 0 0 0.75rem 0;
+ color: #495057;
+ font-size: 0.9rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+.alarm-examples {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+ gap: 0.75rem;
+ margin-bottom: 0.75rem;
+}
+
+.alarm-type {
+ padding: 0.75rem;
+ background: white;
+ border-radius: 6px;
+ border: 1px solid #e9ecef;
+ text-align: center;
+}
+
+.alarm-type strong {
+ display: block;
+ color: #495057;
+ font-size: 0.9rem;
+ font-weight: 600;
+ margin-bottom: 0.5rem;
+}
+
+.alarm-type p {
+ color: #6c757d;
+ font-size: 0.8rem;
+ margin: 0;
+ line-height: 1.3;
+}
+
+.reminder-info {
+ background: #f8f9fa;
+ border: 1px solid #e9ecef;
+ border-radius: 8px;
+ padding: 1rem;
+ margin-top: 1rem;
+}
+
+.reminder-info h5,
+.reminder-info h6 {
+ margin: 0 0 0.75rem 0;
+ color: #495057;
+ font-size: 0.9rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+.reminder-info h6 {
+ font-size: 0.8rem;
+ margin-top: 1rem;
+ margin-bottom: 0.5rem;
+}
+
+.attachments-section {
+ margin-top: 1rem;
+ padding-top: 1rem;
+ border-top: 1px solid #e9ecef;
+}
+
+.attachment-features {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+ margin-top: 0.75rem;
+}
+
+.attachment-type {
+ display: flex;
+ align-items: flex-start;
+ gap: 0.5rem;
+ padding: 0.5rem;
+ background: white;
+ border-radius: 6px;
+ border: 1px solid #e9ecef;
+}
+
+.attachment-type strong {
+ color: #495057;
+ font-size: 0.85rem;
+ font-weight: 600;
+ min-width: 120px;
+ flex-shrink: 0;
+}
+
+.attachment-type span {
+ color: #6c757d;
+ font-size: 0.85rem;
+ line-height: 1.3;
+}
+
+.reminder-patterns {
+ background: #f8f9fa;
+ border: 1px solid #e9ecef;
+ border-radius: 8px;
+ padding: 1rem;
+ margin-top: 1rem;
+}
+
+.reminder-patterns h5 {
+ margin: 0 0 0.75rem 0;
+ color: #495057;
+ font-size: 0.9rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+.pattern-examples {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+ margin-bottom: 0.75rem;
+}
+
+.pattern-item {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.5rem;
+ background: white;
+ border-radius: 6px;
+ border: 1px solid #e9ecef;
+}
+
+.pattern-item strong {
+ color: #495057;
+ font-size: 0.85rem;
+ font-weight: 600;
+ min-width: 100px;
+ flex-shrink: 0;
+}
+
+.pattern-item span {
+ color: #6c757d;
+ font-size: 0.85rem;
+ line-height: 1.3;
+}
+
+.action-btn.tertiary {
+ background: #17a2b8;
+ border-color: #17a2b8;
+ color: white;
+}
+
+.action-btn.tertiary:hover {
+ background: #138496;
+ border-color: #117a8b;
+ box-shadow: 0 2px 4px rgba(23, 162, 184, 0.2);
+}
+
+.completion-status {
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+ color: white;
+ border-radius: 8px;
+ padding: 1.5rem;
+ margin-top: 2rem;
+ text-align: center;
+}
+
+.completion-status h5 {
+ margin: 0 0 0.75rem 0;
+ font-size: 1.1rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+.completion-status p {
+ margin: 0 0 1rem 0;
+ opacity: 0.9;
+ line-height: 1.5;
+}
+
+.feature-summary {
+ background: rgba(255, 255, 255, 0.1);
+ border-radius: 6px;
+ padding: 1rem;
+ margin-top: 1rem;
+}
+
+.summary-row {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 0.5rem 0;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
+}
+
+.summary-row:last-child {
+ border-bottom: none;
+}
+
+.tab-name {
+ font-weight: 600;
+ font-size: 0.9rem;
+}
+
+.tab-desc {
+ font-size: 0.8rem;
+ opacity: 0.8;
+ text-align: right;
+ max-width: 60%;
+}
+
+/* Theme compatibility for reminders */
+[data-theme="dark"] .reminder-types,
+[data-theme="dark"] .reminder-info,
+[data-theme="dark"] .reminder-patterns {
+ background: #2a2a2a;
+ border-color: #444444;
+}
+
+[data-theme="dark"] .reminder-types h5,
+[data-theme="dark"] .reminder-info h5,
+[data-theme="dark"] .reminder-info h6,
+[data-theme="dark"] .reminder-patterns h5 {
+ color: #e0e0e0;
+}
+
+[data-theme="dark"] .alarm-type,
+[data-theme="dark"] .attachment-type,
+[data-theme="dark"] .pattern-item {
+ background: #1f1f1f;
+ border-color: #444444;
+}
+
+[data-theme="dark"] .alarm-type strong,
+[data-theme="dark"] .attachment-type strong,
+[data-theme="dark"] .pattern-item strong {
+ color: #e0e0e0;
+}
+
+[data-theme="dark"] .alarm-type p,
+[data-theme="dark"] .attachment-type span,
+[data-theme="dark"] .pattern-item span {
+ color: #b0b0b0;
+}
+
+[data-theme="dark"] .attachments-section {
+ border-color: #444444;
+}
+
+/* Mobile adjustments for reminders tab */
+@media (max-width: 768px) {
+ .alarm-examples {
+ grid-template-columns: 1fr;
+ gap: 0.5rem;
+ }
+
+ .alarm-type {
+ padding: 0.5rem;
+ }
+
+ .attachment-type,
+ .pattern-item {
+ flex-direction: column;
+ gap: 0.25rem;
+ align-items: flex-start;
+ }
+
+ .attachment-type strong,
+ .pattern-item strong {
+ min-width: unset;
+ }
+
+ .summary-row {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 0.25rem;
+ }
+
+ .tab-desc {
+ text-align: left;
+ max-width: 100%;
+ }
+
+ .completion-status {
+ padding: 1rem;
+ }
+
+ .completion-status h5 {
+ font-size: 1rem;
+ }
+}
+
/* Theme Selector Styles */
.theme-selector {
margin-bottom: 1rem;