UNPKG

hotel-ai-widget

Version:

A customizable hotel chat widget for React and vanilla HTML

2,275 lines (1,929 loc) 37.2 kB
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; margin: 0; } * { margin: 0; } h1, h2, h3 { line-height: 0; } textarea { font-family: inherit; font-size: 100%; line-height: inherit; color: inherit; margin: 0; padding: 0; border-width: 0; background-color: transparent; } input { font-family: inherit; font-size: 100%; line-height: inherit; color: inherit; margin: 0; padding: 0; border-width: 0; background-color: transparent; } /* Reset and base styles for the widget container */ .hotel-ai-widget-container { /* Ensure widget doesn't interfere with host page */ all: initial; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /* Chat Input Styles */ .chat-input-container { padding: 0.75rem; } .chat-input-wrapper { padding: 0.5rem 0.75rem; border: 2px solid #d1d5db; border-radius: 1rem; display: flex; gap: 0.25rem; width: auto; } .chat-input-form { width: 100%; } .chat-input-textarea { width: 100%; outline: none; resize: none; min-height: 20px; max-height: 80px; overflow-y: auto; font-size: 0.75rem; border: none; background: transparent; } .chat-input-textarea::placeholder { color: #9ca3af; } .chat-input-textarea:disabled { opacity: 0.6; cursor: not-allowed; } .chat-input-actions { display: flex; justify-content: space-between; align-items: center; } .chat-input-send-button { width: 1rem; height: 1rem; color: #374151; cursor: pointer; transition: opacity 0.2s ease; } .chat-input-send-button.disabled { opacity: 0.5; pointer-events: none; } .chat-input-send-button:hover:not(.disabled) { color: #111827; } /* Responsive Design */ @media (max-width: 768px) { .chat-input-container { padding: 0.5rem; } .chat-input-wrapper { padding: 0.375rem 0.5rem; } .chat-input-textarea { font-size: 0.875rem; } } /* Position utilities */ .bottom-right { position: fixed; bottom: 1.5rem; /* 6 */ right: 1.5rem; z-index: 50; } .bottom-left { position: fixed; bottom: 1.5rem; left: 1.5rem; z-index: 50; } /* General modal and overlay */ .modal-overlay { position: fixed; inset: 0; z-index: 50; background-color: rgba(0, 0, 0, 0.5); display: flex; padding: 1rem; align-items: center; justify-content: center; } .modal-container { width: 100%; max-width: 112rem; height: 100%; max-height: 90vh; background-color: white; border-radius: 0.5rem; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); display: flex; flex-direction: column; } /* Header buttons */ .header-button { color: white; padding: 0.5rem; border-radius: 0.375rem; transition: background-color 0.2s; } .header-button:hover { background-color: #ca3f2a; /* darker blue */ } /* Widget */ .chat-widget { position: fixed; bottom: 1.5rem; right: 1.5rem; z-index: 50; } .chat-container { width: 24rem; background-color: white; border-radius: 0.5rem; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); transition: all 0.3s; overflow: hidden; } .chat-container.minimized { height: 3.5rem; } .chat-container.expanded { height: 600px; } /* Header */ .chat-header { display: flex; justify-content: space-between; align-items: center; background-color: #ca3f2a; color: white; padding: 0.75rem; border-top-left-radius: 0.5rem; border-top-right-radius: 0.5rem; } /* Tabs */ .tab-button { flex: 1; padding: 0.5rem; font-size: 0.75rem; font-weight: 500; display: flex; justify-content: center; align-items: center; gap: 0.25rem; transition: background-color 0.2s, color 0.2s; } .tab-button.active { background-color: #ca3f2a; color: white; } .tab-button.inactive { background-color: #f3f4f6; color: #374151; } .tab-button.inactive:hover { background-color: #e5e7eb; } /* Icons */ .icon-sm { width: 0.75rem; height: 0.75rem; } .icon-md { width: 1.25rem; height: 1.25rem; } /* Chat section header */ .section-header { background-color: #f9fafb; padding: 0.625rem 1rem; border-bottom: 1px solid #d1d5db; } .section-header h2 { font-weight: 600; color: #111827; } .chat-open-button { width: 3.5rem; /* w-14 */ height: 3.5rem; /* h-14 */ border-radius: 9999px; /* rounded-full */ background-color: #ca3f2a; /* bg-blue-600 */ color: white; display: flex; align-items: center; justify-content: center; box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1); /* shadow-lg */ transition: background-color 0.2s; /* transition-colors duration-200 */ border:1px solid #ca3f2a; } .chat-open-button:hover { background-color: #ca3f2a; /* hover:bg-blue-700 */ } .chat-open-icon { width: 1.25rem; height: 1.25rem; } /* Widget Container */ .chat-widget-container { position: fixed; z-index: 50; } .chat-widget-container.bottom-right { bottom: 1.5rem; right: 1.5rem; } .chat-widget-container.bottom-left { bottom: 1.5rem; left: 1.5rem; } .chat-widget-main { width: 28rem; background-color: white; border-radius: 1rem; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); transition: all 0.3s ease; height: 37.5rem; } .chat-widget-main.minimized { height: 3.5rem; } /* Widget Header */ .widget-header { display: flex; align-items: center; justify-content: space-between; padding: 0.75rem; background-color: #ca3f2a; color: white; border-top-left-radius: 1rem; border-top-right-radius: 1rem; } .widget-header-title { display: flex; align-items: center; gap: 0.5rem; } .widget-header-icon { width: 1rem; height: 1rem; } .widget-header-text { font-size: 0.875rem; font-weight: 600; } .widget-header-actions { display: flex; align-items: center; gap: 0.25rem; } .widget-header-button { color: white; background: none; border: none; padding: 0.25rem; border-radius: 0.25rem; cursor: pointer; transition: background-color 0.2s ease; } .widget-header-button:hover { background-color: #d34f3aff; } .widget-header-button-icon { width: 0.75rem; height: 0.75rem; } /* Widget Tabs */ .widget-tabs { display: flex; border-bottom: 1px solid #d1d5db; } .widget-tab { flex: 1; padding: 0.7rem; font-size: 0.75rem; font-weight: 500; display: flex; align-items: center; justify-content: center; gap: 0.25rem; transition: all 0.2s ease; background-color: #fff; color: #374151; border: none; cursor: pointer; } .widget-tab:hover { background-color: #e5e7eb; } .widget-tab.active { background-color: #fff; color: #ca3f2a; border-bottom: 2px solid #ca3f2a } .widget-tab-icon { width: 0.75rem; height: 0.75rem; } /* Widget Content */ .widget-content { height: 32.5rem; display: flex; flex-direction: column; } .widget-chat-container { flex: 1; display: flex; flex-direction: column; overflow-y: auto; } /* Chat Messages */ .chat-messages { display: flex; flex-direction: column; gap: 0.75rem; scroll-behavior: smooth; flex: 1; padding: 1rem 1rem 0.75rem; } .welcome-message { margin-bottom: 1rem; } .welcome-title { font-size: 1rem; font-weight: 600; margin-bottom: 0.5rem; } .welcome-content { display: flex; gap: 0.5rem; align-items: flex-start; } .welcome-icon { width: 1rem; height: 1rem; margin-top: 0.125rem; flex-shrink: 0; color: #ca3f2a; } .welcome-text { font-size: 0.75rem; color: #4b5563; } .user-message-container { display: flex; justify-content: flex-end; margin-bottom: 0.75rem; } .user-message { background-color: #f3f4f6; color: black; padding: 0.5rem 0.75rem; border-radius: 1rem; border-bottom-right-radius: 0.375rem; max-width: 80%; } .user-message-text { font-size: 0.75rem; white-space: pre-wrap; } .status-content { font-size: 0.75rem; color: #4b5563; font-style: italic; margin-bottom: 0.5rem; } .status-content-text { white-space: pre-wrap; } .main-content { font-size: 0.875rem; line-height: 1.6; margin-bottom: 0.75rem; position: relative; } .main-content-text { white-space: pre-wrap; font-size: 0.875rem; } .streaming-indicator { display: flex; gap: 0.25rem; align-items: center; color: #6b7280; margin-bottom: 0.75rem; } .streaming-dot { animation: bounce 1s infinite; font-size: 0.75rem; } .streaming-dot-delay-1 { animation-delay: 0.2s; } .streaming-dot-delay-2 { animation-delay: 0.4s; } @keyframes bounce { 0%, 20%, 50%, 80%, 100% { transform: translateY(0); } 40% { transform: translateY(-0.25rem); } 60% { transform: translateY(-0.125rem); } } .messages-end { overflow-anchor: none; } /* Place Links */ .place-link { color: #000000ff; padding: 0.25rem 0.5rem; border-radius: 0.5rem; font-weight: bold; transition: background-color 0.2s ease; cursor: pointer; } .place-link:hover { background-color: #e5e7eb; } /* Markdown Styles */ .markdown-paragraph { margin-bottom: 0.5rem; line-height: 1.6; font-size: 0.875rem; } .markdown-strong { font-weight: 600; } .markdown-em { font-style: italic; } .markdown-code { background-color: #f3f4f6; padding: 0.125rem 0.375rem; border-radius: 0.25rem; font-size: 0.75rem; font-family: ui-monospace, SFMono-Regular, "SF Mono", Consolas, "Liberation Mono", Menlo, monospace; } .markdown-pre { background-color: #f3f4f6; padding: 0.75rem; border-radius: 0.5rem; overflow-x: auto; margin: 0.75rem 0; } .markdown-pre-code { font-size: 0.75rem; font-family: ui-monospace, SFMono-Regular, "SF Mono", Consolas, "Liberation Mono", Menlo, monospace; } .markdown-ul { list-style-type: disc; padding-left: 1rem; margin: 0.5rem 0; } .markdown-ul > li { margin: 0.25rem 0; } .markdown-ol { list-style-type: decimal; padding-left: 1rem; margin: 0.5rem 0; } .markdown-ol > li { margin: 0.25rem 0; } .markdown-li { line-height: 1.6; font-size: 0.875rem; } .markdown-link { color: #ca3f2a; text-decoration: underline; font-size: 0.875rem; transition: color 0.2s ease; } .markdown-link:hover { color: #d34f3aff; } .markdown-h1 { font-size: 1.125rem; font-weight: 700; margin-bottom: 0.75rem; margin-top: 1rem; color: #111827; } .markdown-h2 { font-size: 1rem; font-weight: 700; margin-bottom: 0.5rem; margin-top: 0.75rem; color: #111827; } .markdown-h3 { font-size: 0.875rem; font-weight: 600; margin-bottom: 0.5rem; margin-top: 0.75rem; color: #111827; } .markdown-h4 { font-size: 0.875rem; font-weight: 600; margin-bottom: 0.25rem; margin-top: 0.5rem; color: #111827; } .markdown-h5 { font-size: 0.75rem; font-weight: 600; margin-bottom: 0.25rem; margin-top: 0.5rem; color: #111827; } .markdown-h6 { font-size: 0.75rem; font-weight: 600; margin-bottom: 0.25rem; margin-top: 0.5rem; color: #111827; } .markdown-blockquote { border-left: 4px solid #d1d5db; padding-left: 0.75rem; font-style: italic; margin: 0.75rem 0; color: #374151; font-size: 0.875rem; } .markdown-hr { border-color: #d1d5db; margin: 1rem 0; } .markdown-table-wrapper { overflow-x: auto; margin: 0.75rem 0; } .markdown-table { min-width: 100%; border-collapse: collapse; border: 1px solid #d1d5db; font-size: 0.75rem; } .markdown-thead { background-color: #f9fafb; } .markdown-tr { border-bottom: 1px solid #e5e7eb; } .markdown-tr:hover { background-color: #f9fafb; } .markdown-th { border: 1px solid #d1d5db; padding: 0.5rem 0.75rem; text-align: left; font-weight: 600; color: #111827; background-color: #f9fafb; font-size: 0.75rem; } .markdown-td { border: 1px solid #d1d5db; padding: 0.5rem 0.75rem; font-size: 0.75rem; } /* Modal Styles */ .modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.5); display: flex; align-items: center; justify-content: center; z-index: 1000; } .modal-container { width: 90vw; height: 90vh; max-width: 1200px; background-color: white; border-radius: 0.5rem; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); display: flex; flex-direction: column; overflow: hidden; } .chat-header { display: flex; align-items: center; justify-content: space-between; padding: 1rem; background-color: #ca3f2a; color: white; } .header-title { display: flex; align-items: center; gap: 1rem; } .header-icon { width: 1.25rem; height: 1.25rem; } .header-text { font-size: 1.125rem; font-weight: 600; } .header-actions { display: flex; align-items: center; gap: 1rem; } .header-button { color: white; background: none; border: none; padding: 0.5rem; border-radius: 0.25rem; cursor: pointer; transition: background-color 0.2s ease; } .header-button:hover { background-color: #d34f3aff; } .header-button-icon { width: 1rem; height: 1rem; } .modal-content { flex: 1; display: flex; overflow: hidden; } .modal-left-panel { width: 50%; display: flex; flex-direction: column; border-right: 1px solid #d1d5db; } .modal-panel-header { background-color: #f9fafb; padding: 0.625rem 1rem; border-bottom: 1px solid #d1d5db; } .modal-panel-title { font-weight: 600; color: #111827; } .modal-chat-messages { flex: 1; overflow-y: auto; } .modal-right-panel { width: 50%; display: flex; flex-direction: column; } .modal-right-panel-header { background-color: #f9fafb; padding: 0.54rem 1rem; border-bottom: 1px solid #d1d5db; display: flex; align-items: center; justify-content: space-between; } .modal-right-panel-tabs { display: flex; align-items: center; gap: 0.5rem; } .modal-right-panel-tab { display: flex; align-items: center; gap: 0.25rem; padding: 0.25rem 0.5rem; border-radius: 0.375rem; font-size: 0.75rem; font-weight: 500; transition: all 0.2s ease; color: #4b5563; background: none; border: none; cursor: pointer; } .modal-right-panel-tab:hover { color: #111827; background-color: #e5e7eb; } .modal-right-panel-tab.active { background-color: #ca3f2a; color: white; } .modal-right-panel-tab-icon { width: 0.75rem; height: 0.75rem; } /* Dark Theme */ .chat-widget.dark, .chat-widget-container.dark { /* Add dark theme styles if needed */ } /* Responsive Design */ @media (max-width: 768px) { .chat-widget-main { width: 20rem; } .modal-container { width: 95vw; height: 95vh; } .modal-content { flex-direction: column; } .modal-left-panel, .modal-right-panel { width: 100%; } .modal-left-panel { height: 50%; border-right: none; border-bottom: 1px solid #d1d5db; } .modal-right-panel { height: 50%; } } /* Hotel Images Section Styles */ .hotel-images-container { flex: 1; display: flex; flex-direction: column; overflow: hidden; } .hotel-images-loading { flex: 1; display: flex; align-items: center; justify-content: center; } .hotel-images-loading-content { text-align: center; } .hotel-images-spinner { animation: spin 1s linear infinite; border-radius: 50%; height: 1.5rem; width: 1.5rem; border-top: 2px solid #d34f3aff; margin: 0 auto 0.5rem; } .hotel-images-loading-text { font-size: 0.75rem; color: #6b7280; } .hotel-images-empty { flex: 1; display: flex; align-items: center; justify-content: center; } .hotel-images-empty-content { text-align: center; padding: 2rem 0; } .hotel-images-empty-icon { width: 2rem; height: 2rem; color: #d1d5db; margin: 0 auto 0.75rem; } .hotel-images-empty-title { color: #6b7280; font-size: 0.75rem; } .hotel-images-empty-subtitle { font-size: 0.75rem; color: #9ca3af; margin-top: 0.25rem; } .hotel-images-header { background-color: white; padding: 0.5rem 0.75rem; border-bottom: 1px solid #d1d5db; flex-shrink: 0; } .hotel-images-header-content { display: flex; align-items: center; justify-content: space-between; } .hotel-images-header-info { display: flex; align-items: baseline; gap: 0.5rem; } .hotel-images-title { font-size: 0.875rem; font-weight: 700; } .hotel-images-count { font-size: 0.75rem; color: #6b7280; } .hotel-images-view-toggle { display: flex; align-items: center; gap: 0.25rem; background-color: #f3f4f6; border-radius: 0.5rem; padding: 0.125rem; } .hotel-images-view-button { padding: 0.25rem; border-radius: 0.375rem; transition: all 0.2s ease; border: none; cursor: pointer; background: transparent; } .hotel-images-view-button.active { background-color: white; color: #111827; box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); } .hotel-images-view-button:not(.active) { color: #6b7280; } .hotel-images-view-button:not(.active):hover { color: #374151; } .hotel-images-view-icon { width: 0.75rem; height: 0.75rem; } .hotel-images-content { flex: 1; padding: 0.5rem 0.75rem; overflow-y: auto; } .hotel-images-category { margin-bottom: 1rem; } .hotel-images-category:last-child { margin-bottom: 0; } .hotel-images-category-button { display: flex; align-items: center; gap: 0.5rem; width: 100%; text-align: left; margin-bottom: 0.75rem; background: none; border: none; cursor: pointer; padding: 0; } .hotel-images-category-chevron { flex-shrink: 0; color: #6b7280; transition: transform 0.3s ease-in-out; width: 0.75rem; height: 0.75rem; } .hotel-images-category-chevron.expanded { transform: rotate(0deg); } .hotel-images-category-chevron.collapsed { transform: rotate(-90deg); } .hotel-images-category-info h2 { font-size: 0.75rem; font-weight: 600; text-transform: capitalize; transition: color 0.2s ease; } .hotel-images-category-button:hover h2 { color: #374151; } .hotel-images-category-count { font-size: 0.75rem; color: #6b7280; } .hotel-images-category-content { overflow: hidden; transition: all 0.3s ease-in-out; } .hotel-images-category-content.expanded { max-height: 1000px; opacity: 1; } .hotel-images-category-content.collapsed { max-height: 0; opacity: 0; } .hotel-images-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 0.5rem; } .hotel-images-grid-item { background-color: white; border: 1px solid #e5e7eb; border-radius: 0.5rem; overflow: hidden; transition: all 0.2s ease; } .hotel-images-grid-item:hover { border-color: #d1d5db; } .hotel-images-grid-image-container { aspect-ratio: 16 / 9; position: relative; overflow: hidden; } .hotel-images-grid-image { cursor: pointer; width: 100%; height: 100%; object-fit: cover; transition: transform 0.3s ease; } .hotel-images-grid-item:hover .hotel-images-grid-image { transform: scale(1.05); } .hotel-images-grid-description { padding: 0.5rem; } .hotel-images-grid-description p { font-size: 0.75rem; color: #4b5563; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } .hotel-images-list { display: flex; flex-direction: column; gap: 0.5rem; } .hotel-images-list-item { background-color: white; border: 1px solid #e5e7eb; border-radius: 0.5rem; padding: 0.5rem; transition: all 0.2s ease; } .hotel-images-list-item:hover { border-color: #d1d5db; } .hotel-images-list-content { display: flex; gap: 0.5rem; } .hotel-images-list-image-container { width: 3rem; height: 2.25rem; border-radius: 0.5rem; overflow: hidden; flex-shrink: 0; } .hotel-images-list-image { cursor: pointer; width: 100%; height: 100%; object-fit: cover; } .hotel-images-list-info { flex: 1; min-width: 0; } .hotel-images-list-title { font-weight: 500; color: #111827; margin-bottom: 0.25rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 0.75rem; } .hotel-images-list-description { font-size: 0.75rem; color: #4b5563; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } .hotel-images-modal { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.7); z-index: 50; display: flex; align-items: center; justify-content: center; } .hotel-images-modal-content { position: relative; max-width: 56rem; width: 100%; padding: 1rem; } .hotel-images-modal-close { position: absolute; top: 1rem; right: 1rem; color: white; font-size: 1.25rem; background-color: rgba(0, 0, 0, 0.5); border-radius: 50%; padding: 0.5rem; border: none; cursor: pointer; transition: background-color 0.2s ease; padding-left: 0.75rem; padding-right: 0.75rem; padding-bottom: 0.25rem; } .hotel-images-modal-close:hover { background-color: black; } .hotel-images-modal-image { max-height: 80vh; width: 100%; object-fit: contain; border-radius: 0.5rem; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } /* Responsive Design */ @media (max-width: 768px) { .hotel-images-grid { grid-template-columns: 1fr; } .hotel-images-header { padding: 0.375rem 0.5rem; } .hotel-images-content { padding: 0.375rem 0.5rem; } .hotel-images-modal-content { padding: 0.5rem; } } /* Inclusion Section Styles */ .inclusion-section-container { flex: 1; display: flex; flex-direction: column; overflow: hidden; } .inclusion-section-loading { flex: 1; display: flex; align-items: center; justify-content: center; } .inclusion-section-spinner { animation: spin 1s linear infinite; border-radius: 50%; height: 1.5rem; width: 1.5rem; border-top: 2px solid #d34f3aff; } .inclusion-section-empty { flex: 1; display: flex; align-items: center; justify-content: center; } .inclusion-section-empty-content { text-align: center; padding: 2rem 0; } .inclusion-section-empty-icon { width: 2rem; height: 2rem; color: #d1d5db; margin: 0 auto 0.5rem; } .inclusion-section-empty-title { color: #6b7280; font-size: 0.75rem; } .inclusion-section-empty-subtitle { font-size: 0.75rem; color: #9ca3af; margin-top: 0.25rem; } .inclusion-section-header { background-color: white; padding: 0.5rem 0.75rem; border-bottom: 1px solid #d1d5db; flex-shrink: 0; } .inclusion-section-title { font-size: 0.875rem; font-weight: 700; } .inclusion-section-content { flex: 1; padding: 0.5rem 0.75rem; overflow-y: auto; } .inclusion-section-items { display: flex; flex-direction: column; gap: 1rem; } .inclusion-category { margin-bottom: 0.75rem; } .inclusion-category-button { display: flex; align-items: center; gap: 0.5rem; width: 100%; text-align: left; margin-bottom: 0.5rem; background: none; border: none; cursor: pointer; padding: 0; } .inclusion-category-chevron { width: 0.75rem; height: 0.75rem; color: #6b7280; transition: transform 0.2s ease; } .inclusion-category-chevron.expanded { transform: rotate(0deg); } .inclusion-category-chevron.collapsed { transform: rotate(-90deg); } .inclusion-category-title { font-size: 0.75rem; font-weight: 600; } .inclusion-category-content { overflow: hidden; transition: all 0.3s ease; } .inclusion-category-content.expanded { opacity: 1; } .inclusion-category-content.collapsed { max-height: 0; opacity: 0; } .inclusion-items { display: flex; flex-direction: column; gap: 0.5rem; } .inclusion-item { border: 1px solid #f3f4f6; border-radius: 0.5rem; padding: 0.5rem; transition: border-color 0.2s ease; } .inclusion-item:hover { border-color: #e5e7eb; } .inclusion-item-content { display: flex; align-items: flex-start; gap: 0.5rem; } .inclusion-item-icon { width: 0.75rem; height: 0.75rem; color: #6b7280; margin-top: 0.125rem; flex-shrink: 0; } .inclusion-item-info { flex: 1; min-width: 0; } .inclusion-item-title { font-weight: 500; font-size: 0.75rem; margin-bottom: 0.25rem; } .inclusion-item-description { font-size: 0.75rem; color: #4b5563; margin-bottom: 0.25rem; } .inclusion-item-details { display: flex; flex-wrap: wrap; gap: 0.5rem; font-size: 0.75rem; color: #6b7280; } .inclusion-item-detail { display: flex; align-items: center; gap: 0.25rem; } .inclusion-item-detail-icon { width: 0.5rem; height: 0.5rem; } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } /* Responsive Design */ @media (max-width: 768px) { .inclusion-section-header { padding: 0.375rem 0.5rem; } .inclusion-section-content { padding: 0.375rem 0.5rem; } .inclusion-item { padding: 0.375rem; } .inclusion-item-details { flex-direction: column; gap: 0.25rem; } } /* Itinerary Section Styles */ .itinerary-section-container { flex: 1; display: flex; flex-direction: column; overflow: hidden; } .itinerary-section-loading { flex: 1; display: flex; align-items: center; justify-content: center; } .itinerary-section-spinner { animation: spin 1s linear infinite; border-radius: 50%; height: 1.5rem; width: 1.5rem; border-top: 2px solid #d34f3aff; } .itinerary-section-empty { flex: 1; display: flex; align-items: center; justify-content: center; } .itinerary-section-empty-content { text-align: center; padding: 2rem 0; } .itinerary-section-empty-icon { width: 2rem; height: 2rem; color: #d1d5db; margin: 0 auto 0.5rem; } .itinerary-section-empty-title { color: #6b7280; font-size: 0.75rem; } .itinerary-section-empty-subtitle { font-size: 0.75rem; color: #9ca3af; margin-top: 0.25rem; } .itinerary-section-header { background-color: white; padding: 0.5rem 0.75rem; border-bottom: 1px solid #d1d5db; flex-shrink: 0; } .itinerary-section-header-content { display: flex; align-items: center; justify-content: space-between; } .itinerary-section-title { font-size: 0.875rem; font-weight: 700; } .itinerary-section-days-count { font-size: 0.75rem; color: #6b7280; background-color: #f3f4f6; padding: 0.25rem 0.5rem; border-radius: 9999px; } .itinerary-section-content { flex: 1; padding: 0.5rem 0.75rem; overflow-y: auto; } .itinerary-days { display: flex; flex-direction: column; gap: 0.75rem; } .itinerary-day { border: 1px solid #e5e7eb; border-radius: 0.5rem; overflow: hidden; } .itinerary-day-button { display: flex; align-items: center; justify-content: space-between; width: 100%; padding: 0.5rem; background-color: #f9fafb; transition: background-color 0.2s ease; border: none; cursor: pointer; } .itinerary-day-button:hover { background-color: #f3f4f6; } .itinerary-day-info { text-align: left; } .itinerary-day-title { font-size: 0.75rem; font-weight: 600; color: #111827; } .itinerary-day-date { font-size: 0.75rem; color: #6b7280; } .itinerary-day-chevron { width: 0.75rem; height: 0.75rem; color: #6b7280; transition: transform 0.2s ease; } .itinerary-day-chevron.expanded { transform: rotate(0deg); } .itinerary-day-chevron.collapsed { transform: rotate(-90deg); } .itinerary-day-content { transition: all 0.3s ease-in-out; overflow: hidden; } .itinerary-day-content.expanded { opacity: 1; } .itinerary-day-content.collapsed { max-height: 0; opacity: 0; } .itinerary-day-inclusions { padding: 0.5rem; display: flex; flex-direction: column; gap: 0.5rem; background-color: white; } .itinerary-inclusion { border: 1px solid #f3f4f6; border-radius: 0.5rem; padding: 0.5rem; transition: border-color 0.2s ease; } .itinerary-inclusion:hover { border-color: #e5e7eb; } .itinerary-inclusion-content { display: flex; align-items: flex-start; gap: 0.5rem; } .itinerary-inclusion-icon-container { width: 1.25rem; height: 1.25rem; border-radius: 0.375rem; background-color: #f3f4f6; display: flex; align-items: center; justify-content: center; flex-shrink: 0; margin-top: 0.125rem; } .itinerary-inclusion-icon { width: 0.625rem; height: 0.625rem; color: #6b7280; } .itinerary-inclusion-info { flex: 1; min-width: 0; } .itinerary-inclusion-title { font-weight: 500; color: #111827; font-size: 0.75rem; margin-bottom: 0.25rem; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; } .itinerary-inclusion-details { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; margin-bottom: 0.25rem; } .itinerary-inclusion-detail { display: flex; align-items: center; gap: 0.25rem; font-size: 0.75rem; color: #4b5563; } .itinerary-inclusion-detail-icon { width: 0.625rem; height: 0.625rem; } .itinerary-inclusion-description { font-size: 0.75rem; color: #4b5563; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; margin-bottom: 0.25rem; } .itinerary-inclusion-badge { display: inline-flex; align-items: center; padding: 0.125rem 0.375rem; border-radius: 0.25rem; font-size: 0.75rem; font-weight: 500; text-transform: capitalize; } .itinerary-inclusion-badge.attraction { background-color: #dbeafe; color: #d34f3aff; } .itinerary-inclusion-badge.transport { background-color: #dcfce7; color: #16a34a; } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } /* Responsive Design */ @media (max-width: 768px) { .itinerary-section-header { padding: 0.375rem 0.5rem; } .itinerary-section-content { padding: 0.375rem 0.5rem; } .itinerary-day-button { padding: 0.375rem; } .itinerary-day-inclusions { padding: 0.375rem; } .itinerary-inclusion { padding: 0.375rem; } .itinerary-inclusion-details { flex-direction: column; align-items: flex-start; gap: 0.25rem; } } /* Map Section Styles */ .map-section-container { flex: 1; padding: 0.5rem; height: 92vh; } .map-marker { display: flex; align-items: center; transition: transform 0.2s ease-in-out; position: relative; } .map-marker.hovered { transform: scale(1.25); z-index: 999; top: -6px; } .map-marker:not(.hovered) { transform: scale(1); z-index: 10; top: 0; } .map-marker-pin { width: 2.5rem; height: 2.5rem; color: #ef4444; filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.2)); } .map-marker-label { background-color: white; padding: 0.25rem 0.5rem; border-radius: 0.25rem; box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1); font-size: 0.75rem; border: 1px solid #e5e7eb; margin-left: 0.25rem; white-space: nowrap; font-weight: 500; color: #374151; } .map-marker.hovered .map-marker-label { background-color: #ca3f2a; color: white; border-color: #ca3f2a; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1); } /* Map Container Styling */ .map-section-container > div { border-radius: 1rem; overflow: hidden; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1); } /* Loading State */ .map-loading { display: flex; align-items: center; justify-content: center; height: 100%; background-color: #f9fafb; border-radius: 1rem; } .map-loading-spinner { animation: spin 1s linear infinite; border-radius: 50%; height: 2rem; width: 2rem; border-top: 2px solid #d34f3aff; border-right: 2px solid transparent; } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } /* Responsive Design */ @media (max-width: 768px) { .map-section-container { padding: 0.25rem; height: 50vh; } .map-marker-pin { width: 2rem; height: 2rem; } .map-marker-label { font-size: 0.625rem; padding: 0.125rem 0.375rem; } .map-marker.hovered { transform: scale(1.15); } } /* Dark theme support */ @media (prefers-color-scheme: dark) { .map-marker-label { background-color: #374151; color: white; border-color: #4b5563; } .map-marker.hovered .map-marker-label { background-color: #d34f3aff; border-color: #d34f3aff; } } .image-text-hyperlink { color: #000000ff; padding: 0.25rem 0.5rem; border-radius: 0.5rem; font-weight: bold; transition: background-color 0.2s ease; cursor: pointer; } .image-text-hyperlink:hover { background-color: #e5e7eb; } /* Widget Lightbox Styles */ .lightbox-overlay { position: fixed; inset: 0; background-color: rgba(0, 0, 0, 0.8); backdrop-filter: blur(4px); z-index: 50; display: flex; align-items: center; justify-content: center; padding: 1rem; } .lightbox-container { position: relative; max-width: 96rem; width: 80%; height: 80vh; background-color: white; border-radius: 0.75rem; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); overflow: hidden; } .close-button { position: absolute; top: 1rem; right: 1rem; z-index: 10; background-color: rgba(0, 0, 0, 0.5); color: white; border-radius: 50%; padding: 0.5rem; border: none; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background-color 0.2s; } .close-button:hover { background-color: rgba(0, 0, 0, 0.7); } .close-icon { height: 1.25rem; width: 1.25rem; } .lightbox-content { display: flex; flex-direction: column; height: 100%; } @media (min-width: 1024px) { .lightbox-content { flex-direction: row; } } .image-section { flex: 1; display: flex; align-items: center; justify-content: center; background-color: #f9fafb; } .lightbox-image { max-height: 60vh; max-width: 100%; object-fit: contain; border-radius: 0.5rem; box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1); } .info-panel { width: 100%; height: 24rem; background-color: white; border-left: 1px solid #e5e7eb; display: flex; flex-direction: column; } @media (min-width: 1024px) { .info-panel { width: 20rem; height: 100%; } } .info-content { padding: 1.5rem; height: 100%; overflow-y: auto; } .header-section { margin-bottom: 1.5rem; } .header-label { display: flex; align-items: center; gap: 0.5rem; font-size: 0.875rem; color: #6b7280; margin-bottom: 0.5rem; } .header-icon { height: 1rem; width: 1rem; } .image-title { font-weight: 600; font-size: 1.125rem; line-height: 1.25; color: #111827; } .divider { border-top: 1px solid #e5e7eb; margin-bottom: 1.5rem; } .description-section { margin-bottom: 1.5rem; } .section-label { display: flex; align-items: center; gap: 0.5rem; font-size: 0.875rem; font-weight: 500; color: #111827; margin-bottom: 0.5rem; } .section-icon { height: 1rem; width: 1rem; } .description-text { font-size: 0.875rem; color: #4b5563; line-height: 1.5; } .categories-section { margin-bottom: 1.5rem; } .categories-wrapper { margin-bottom: 0.5rem; } .tags-container { display: flex; flex-wrap: wrap; gap: 0.5rem; } .tag { display: inline-flex; align-items: center; padding: 0.125rem 0.625rem; border-radius: 9999px; font-size: 0.75rem; font-weight: 500; } .tag-primary { background-color: #dbeafe; color: #1e40af; } .tag-secondary { background-color: #f3f4f6; color: #1f2937; border: 1px solid #d1d5db; } .metadata-section { margin-bottom: 1.5rem; } .metadata-toggle { display: flex; align-items: center; justify-content: space-between; width: 100%; background: none; border: none; cursor: pointer; margin-bottom: 0.75rem; transition: color 0.2s; } .metadata-toggle:hover .metadata-title { color: #374151; } .metadata-title { font-size: 0.875rem; font-weight: 500; color: #111827; margin: 0; } .metadata-chevron { height: 1rem; width: 1rem; } .metadata-content { margin-top: 0.75rem; } .metadata-list { margin-bottom: 1rem; } .metadata-item { display: flex; align-items: center; gap: 0.5rem; font-size: 0.875rem; margin-bottom: 0.5rem; } .metadata-icon { height: 0.75rem; width: 0.75rem; color: #9ca3af; } .metadata-label { color: #6b7280; } .metadata-value { font-family: ui-monospace, SFMono-Regular, "SF Mono", Consolas, "Liberation Mono", Menlo, monospace; font-size: 0.75rem; background-color: #f3f4f6; padding: 0.25rem 0.5rem; border-radius: 0.25rem; color: #111827; } .metadata-text { text-transform: capitalize; color: #111827; } .url-section { background-color: #f9fafb; border-radius: 0.5rem; padding: 0.75rem; border: 1px solid #e5e7eb; margin-top: 1rem; } .url-container { font-size: 0.75rem; color: #6b7280; } .url-label { font-weight: 500; margin-bottom: 0.5rem; display: flex; align-items: center; gap: 0.5rem; } .url-text { font-family: ui-monospace, SFMono-Regular, "SF Mono", Consolas, "Liberation Mono", Menlo, monospace; word-break: break-all; background-color: white; padding: 0.5rem; border-radius: 0.25rem; border: 1px solid #e5e7eb; color: #111827; }