diff --git a/client/src/components/GroupsPanel.css b/client/src/components/GroupsPanel.css new file mode 100644 index 0000000..b9fbb25 --- /dev/null +++ b/client/src/components/GroupsPanel.css @@ -0,0 +1,423 @@ +.groups-panel { + padding: 1.5rem; + background: #0f172a; + border-radius: 0.5rem; + height: 100%; + overflow-y: auto; +} + +.groups-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1.5rem; +} + +.groups-header h2 { + font-size: 1.5rem; + font-weight: 700; + color: #f9fafb; + margin: 0; +} + +.group-count { + font-size: 0.875rem; + color: #94a3b8; + font-weight: 600; +} + +.message { + padding: 0.75rem 1rem; + border-radius: 0.5rem; + margin-bottom: 1rem; + font-size: 0.875rem; + font-weight: 600; + animation: slideIn 0.3s; +} + +.message.success { + background: #10b98133; + color: #10b981; + border: 1px solid #10b981; +} + +.message.error { + background: #ef444433; + color: #ef4444; + border: 1px solid #ef4444; +} + +@keyframes slideIn { + from { + opacity: 0; + transform: translateY(-10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* Create Group Section */ +.create-group-section { + background: #1e293b; + border-radius: 0.5rem; + padding: 1.5rem; + margin-bottom: 1.5rem; +} + +.create-group-section h3 { + font-size: 1rem; + font-weight: 600; + color: #f9fafb; + margin: 0 0 1rem 0; +} + +.create-group-form { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.create-group-form input { + padding: 0.75rem; + background: #0f172a; + border: 1px solid #334155; + border-radius: 0.375rem; + color: #e5e7eb; + font-size: 0.875rem; +} + +.create-group-form input:focus { + outline: none; + border-color: #3b82f6; +} + +.create-group-form input:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.color-picker { + display: flex; + gap: 0.5rem; + flex-wrap: wrap; +} + +.color-option { + width: 2.5rem; + height: 2.5rem; + border-radius: 0.375rem; + border: 2px solid transparent; + cursor: pointer; + transition: all 0.2s; + position: relative; +} + +.color-option:hover { + transform: scale(1.1); +} + +.color-option.active { + border-color: #e5e7eb; + box-shadow: 0 0 0 2px #0f172a, 0 0 0 4px currentColor; +} + +.create-group-form button[type="submit"] { + padding: 0.75rem 1.5rem; + background: #3b82f6; + border: none; + border-radius: 0.375rem; + color: white; + font-weight: 600; + cursor: pointer; + transition: all 0.2s; +} + +.create-group-form button[type="submit"]:hover:not(:disabled) { + background: #2563eb; + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(59, 130, 246, 0.4); +} + +.create-group-form button[type="submit"]:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +/* Groups List */ +.groups-list { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.group-card { + background: #1e293b; + border-radius: 0.5rem; + overflow: hidden; + transition: all 0.2s; +} + +.group-card:hover { + background: #334155; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); +} + +.group-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1rem 1.5rem; + border-left: 4px solid; +} + +.group-title { + display: flex; + align-items: center; + gap: 0.75rem; + flex: 1; +} + +.group-color-indicator { + width: 1rem; + height: 1rem; + border-radius: 50%; + border: 2px solid #0f172a; +} + +.group-title h3 { + font-size: 1.125rem; + font-weight: 600; + color: #f9fafb; + margin: 0; +} + +.member-count { + font-size: 0.75rem; + color: #94a3b8; + font-weight: 600; + padding: 0.25rem 0.5rem; + background: #0f172a; + border-radius: 0.25rem; +} + +.delete-group-btn { + padding: 0.5rem; + background: transparent; + border: none; + font-size: 1.25rem; + cursor: pointer; + opacity: 0.6; + transition: all 0.2s; +} + +.delete-group-btn:hover { + opacity: 1; + transform: scale(1.1); +} + +/* Group Members */ +.group-members { + padding: 0 1.5rem 1rem 1.5rem; +} + +.group-members h4 { + font-size: 0.875rem; + font-weight: 600; + color: #94a3b8; + margin: 0 0 0.75rem 0; + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.members-list { + display: flex; + flex-direction: column; + gap: 0.5rem; + margin-bottom: 0.75rem; +} + +.member-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.75rem; + background: #0f172a; + border-radius: 0.375rem; + transition: all 0.2s; +} + +.member-item:hover { + background: #1e293b; +} + +.member-info { + display: flex; + align-items: center; + gap: 0.5rem; + flex: 1; +} + +.member-icon { + font-size: 1.25rem; +} + +.member-name { + font-size: 0.875rem; + font-weight: 600; + color: #e5e7eb; +} + +.member-status { + font-size: 1rem; + margin-left: 0.25rem; +} + +.remove-member-btn { + padding: 0.25rem 0.5rem; + background: transparent; + border: none; + color: #ef4444; + font-size: 1rem; + cursor: pointer; + opacity: 0.6; + transition: all 0.2s; +} + +.remove-member-btn:hover { + opacity: 1; + transform: scale(1.2); +} + +.no-members { + text-align: center; + padding: 2rem 1rem; + color: #94a3b8; + font-size: 0.875rem; + font-style: italic; +} + +.add-member-section { + margin-top: 0.75rem; +} + +.add-member-section select { + width: 100%; + padding: 0.75rem; + background: #0f172a; + border: 1px solid #334155; + border-radius: 0.375rem; + color: #e5e7eb; + font-size: 0.875rem; + cursor: pointer; + transition: all 0.2s; +} + +.add-member-section select:hover { + border-color: #3b82f6; +} + +.add-member-section select:focus { + outline: none; + border-color: #3b82f6; +} + +/* Group Commands */ +.group-commands { + padding: 1rem 1.5rem 1.5rem 1.5rem; + border-top: 1px solid #334155; +} + +.group-commands h4 { + font-size: 0.875rem; + font-weight: 600; + color: #94a3b8; + margin: 0 0 0.75rem 0; + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.command-buttons { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); + gap: 0.5rem; +} + +.command-buttons button { + padding: 0.75rem 1rem; + background: #0f172a; + border: 1px solid #334155; + border-radius: 0.375rem; + color: #e5e7eb; + font-size: 0.875rem; + font-weight: 600; + cursor: pointer; + transition: all 0.2s; +} + +.command-buttons button:hover { + background: #1e293b; + border-color: #3b82f6; + transform: translateY(-2px); + box-shadow: 0 4px 8px rgba(59, 130, 246, 0.3); +} + +/* Empty State */ +.empty-state { + text-align: center; + padding: 4rem 2rem; +} + +.empty-icon { + font-size: 4rem; + margin-bottom: 1rem; + opacity: 0.5; +} + +.empty-title { + font-size: 1.25rem; + font-weight: 600; + color: #e5e7eb; + margin-bottom: 0.5rem; +} + +.empty-text { + font-size: 0.875rem; + color: #94a3b8; +} + +/* Mobile Responsive */ +@media (max-width: 768px) { + .groups-panel { + padding: 1rem; + } + + .group-header { + padding: 1rem; + } + + .group-members, + .group-commands { + padding-left: 1rem; + padding-right: 1rem; + } + + .command-buttons { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (max-width: 480px) { + .groups-header h2 { + font-size: 1.25rem; + } + + .color-picker { + justify-content: center; + } + + .command-buttons { + grid-template-columns: 1fr; + } +}