diff --git a/css/pages/facilities.css b/css/pages/facilities.css new file mode 100644 index 0000000..d2b33e0 --- /dev/null +++ b/css/pages/facilities.css @@ -0,0 +1,474 @@ +/* Page-Specific Styles for Facilities */ + +.facilities-hero { + margin-top: 44px; /* Navbar height */ + padding: 100px 20px 60px; + text-align: center; + background: linear-gradient(135deg, #e0c3fc 0%, #8ec5fc 100%); + color: #1d1d1f; +} + +.facilities-hero h1 { + font-size: 48px; + font-weight: 700; + margin-bottom: 16px; + letter-spacing: -0.02em; +} + +.hero-subtitle { + font-size: 20px; + font-weight: 400; + opacity: 0.8; +} + +/* Container */ +.facilities-container { + max-width: 1200px; + margin: 0 auto; + padding: 40px 20px; +} + +/* Controls - Redesigned */ +.controls-section { + background: var(--card-bg); + padding: 30px; + border-radius: var(--radius-large); + box-shadow: 0 4px 20px rgba(0,0,0,0.05); + margin-bottom: 40px; +} + +.controls-header-row { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 24px; + flex-wrap: wrap; + gap: 20px; +} + +.section-title { + font-size: 24px; + font-weight: 600; + color: var(--text-primary); + margin: 0; +} + +.search-box { + position: relative; + max-width: 400px; + width: 100%; +} + +.search-box i { + position: absolute; + left: 16px; + top: 50%; + transform: translateY(-50%); + color: var(--text-secondary); +} + +.search-box input { + width: 100%; + padding: 10px 16px 10px 44px; + border: 1px solid rgba(0,0,0,0.1); + border-radius: 12px; + font-size: 15px; + background: #f5f5f7; + transition: var(--transition); +} + +.search-box input:focus { + outline: none; + background: #fff; + border-color: var(--accent-color); + box-shadow: 0 0 0 4px rgba(0, 113, 227, 0.1); +} + +.filters-wrapper { + display: flex; + flex-direction: column; + gap: 16px; + border-top: 1px solid rgba(0,0,0,0.05); + padding-top: 20px; +} + +.filter-group { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 12px; +} + +.filter-label { + font-weight: 600; + font-size: 14px; + color: var(--text-secondary); + min-width: 70px; /* Align labels */ + display: flex; + align-items: center; + gap: 6px; +} + +.filter-tags { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +.filter-tag { + background: #fff; + border: 1px solid rgba(0,0,0,0.1); + padding: 6px 14px; + border-radius: 18px; + font-size: 13px; + color: var(--text-secondary); + cursor: pointer; + transition: var(--transition); + display: flex; + align-items: center; + gap: 6px; +} + +.filter-tag:hover { + background: #f5f5f7; + color: var(--text-primary); + border-color: rgba(0,0,0,0.2); +} + +.filter-tag.active { + background: var(--text-primary); /* Use black/dark for active like Apple tags usually do, or accent */ + color: white; + border-color: var(--text-primary); +} + +/* Facilities Grid & Cards */ +.facilities-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); + gap: 24px; +} + +.facility-card { + background: var(--card-bg); + border-radius: var(--radius-medium); + padding: 24px; + box-shadow: 0 2px 12px rgba(0,0,0,0.04); /* Softer shadow */ + transition: var(--transition); + cursor: pointer; + display: flex; + flex-direction: column; + justify-content: space-between; + border: 1px solid rgba(0,0,0,0.03); +} + +.facility-card:hover { + transform: translateY(-4px); + box-shadow: 0 12px 32px rgba(0,0,0,0.08); +} + +.card-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 12px; +} + +.card-title { + font-size: 18px; + font-weight: 600; + color: var(--text-primary); + flex: 1; + margin-right: 10px; + line-height: 1.3; +} + +/* Status Pill in Card */ +.status-indicator-badge { + display: flex; + align-items: center; + gap: 6px; + font-size: 11px; + font-weight: 600; + padding: 4px 8px; + border-radius: 12px; + white-space: nowrap; +} + +.status-indicator-badge.status-online { background-color: #e8fceb; color: #15803d; } +.status-indicator-badge.status-maintenance { background-color: #fff8d6; color: #b45309; } +.status-indicator-badge.status-offline { background-color: #feebeb; color: #b91c1c; } + +.status-dot { + width: 6px; + height: 6px; + border-radius: 50%; +} +.status-online .status-dot { background-color: #22c55e; } +.status-maintenance .status-dot { background-color: #f59e0b; } +.status-offline .status-dot { background-color: #ef4444; } + + +.card-intro { + font-size: 14px; + color: var(--text-secondary); + margin-bottom: 24px; + line-height: 1.5; + flex-grow: 1; +} + +.card-meta { + display: flex; + gap: 8px; + flex-wrap: wrap; + border-top: 1px solid #f0f0f0; + padding-top: 16px; +} + +.meta-tag { + font-size: 11px; + background: #f5f5f7; + padding: 4px 10px; + border-radius: 6px; + color: var(--text-secondary); + font-weight: 500; +} + +/* Modal */ +.modal { + display: none; + position: fixed; + z-index: 2000; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.4); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); +} + +.facility-modal-content { + background-color: #fff; + margin: 40px auto; + border-radius: var(--radius-large); + max-width: 720px; + width: 90%; + padding: 0; /* Remove padding to handle header separately */ + box-shadow: 0 24px 60px rgba(0, 0, 0, 0.3); + position: relative; + max-height: 90vh; + overflow-y: auto; + display: flex; + flex-direction: column; +} + +.close-modal { + position: absolute; + top: 20px; + right: 24px; + font-size: 24px; + color: var(--text-secondary); + cursor: pointer; + transition: 0.2s; + z-index: 10; + background: rgba(255,255,255,0.8); + width: 36px; + height: 36px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; +} + +.close-modal:hover { + background: #f0f0f0; + color: var(--text-primary); +} + +.modal-header { + padding: 40px 40px 24px; + background: linear-gradient(to bottom, #fff, #fafafa); + border-bottom: 1px solid rgba(0,0,0,0.05); +} + +.modal-title { + font-size: 32px; + font-weight: 700; + margin-bottom: 16px; + line-height: 1.2; +} + +.modal-badges { + display: flex; + gap: 10px; + flex-wrap: wrap; +} + +.large-badge { + padding: 6px 14px; + border-radius: 8px; + font-size: 13px; + font-weight: 600; + display: flex; + align-items: center; + gap: 6px; +} + +.badge-status-online { background: #e8fceb; color: #15803d; } +.badge-status-maintenance { background: #fff8d6; color: #b45309; } +.badge-status-offline { background: #feebeb; color: #b91c1c; } +.badge-type { background: #e0f2fe; color: #0369a1; } + +.modal-body { + padding: 30px 40px 50px; +} + +.modal-section { + margin-top: 32px; +} + +.modal-section-title { + font-size: 16px; + font-weight: 700; + margin-bottom: 16px; + color: var(--text-primary); + display: flex; + align-items: center; + gap: 10px; + border-left: 4px solid var(--accent-color); + padding-left: 12px; +} + +.modal-section-title i { + color: var(--accent-color); + width: 20px; + text-align: center; +} + +.modal-intro { + font-size: 18px; + line-height: 1.6; + color: var(--text-primary); + margin-bottom: 30px; + font-weight: 400; +} + +.map-link { + display: inline-flex; + align-items: center; + gap: 6px; + color: #fff; + background: var(--accent-color); + padding: 6px 16px; + border-radius: 20px; + text-decoration: none; + font-weight: 500; + font-size: 13px; + margin-left: 12px; + transition: 0.2s; +} + +.map-link:hover { + background: #005bb5; + transform: translateY(-1px); +} + +.contributors-list { + display: flex; + flex-wrap: wrap; + gap: 10px; +} + +.contributor-tag { + display: flex; + align-items: center; + background: #ffffff; + border: 1px solid #eee; + padding: 6px 14px; + border-radius: 30px; + font-size: 14px; + color: var(--text-primary); + box-shadow: 0 2px 4px rgba(0,0,0,0.02); +} + +.contributor-tag img { + width: 24px; + height: 24px; + border-radius: 50%; + margin-right: 10px; + background: #eee; +} + +/* Instructions & Notes */ +.instruction-content, .notes-content { + background: #f9f9fa; + padding: 24px; + border-radius: 16px; + border: 1px solid rgba(0,0,0,0.03); +} + +.instruction-content p, .notes-content p { + font-size: 15px; + margin-bottom: 12px; + color: var(--text-primary); + line-height: 1.7; +} + +.instruction-content p:last-child, .notes-content p:last-child { + margin-bottom: 0; +} + +.instruction-content img, .notes-content img { + max-width: 100%; + border-radius: 12px; + margin: 12px 0 20px; + border: 1px solid rgba(0,0,0,0.05); + box-shadow: 0 4px 12px rgba(0,0,0,0.05); +} + +.no-results-message { + text-align: center; + padding: 60px; + color: var(--text-secondary); + font-size: 16px; + background: var(--card-bg); + border-radius: var(--radius-medium); +} + +.is-hidden { + display: none !important; +} + +@media (max-width: 768px) { + .facilities-hero h1 { + font-size: 32px; + } + .controls-header-row { + flex-direction: column; + align-items: stretch; + } + .search-box { + max-width: 100%; + } + .filter-label { + min-width: auto; + margin-bottom: 4px; + } + .facility-modal-content { + margin: 0; + width: 100%; + height: 100%; + max-height: 100%; + border-radius: 0; + } + .close-modal { + top: 15px; + right: 15px; + } + .modal-body { + padding: 24px 24px 80px; + } + .modal-header { + padding: 60px 24px 20px; + } +} diff --git a/data/facilities.json b/data/facilities.json new file mode 100644 index 0000000..e0c8fe5 --- /dev/null +++ b/data/facilities.json @@ -0,0 +1,106 @@ +[ + { + "id": "sand-duper", + "title": "公共刷沙机", + "intro": "位于末地的高效刷沙机,支持沙子、红沙、混凝土粉等重力方块的复制。", + "type": "resource", + "dimension": "end", + "status": "online", + "coordinates": { + "x": 1200, + "y": 64, + "z": -500 + }, + "contributors": ["Alice", "Bob"], + "instructions": [ + {"type": "text", "content": "1. 携带需要复制的重力方块(沙子、红沙、混凝土粉等)。"}, + {"type": "text", "content": "2. 前往末地主岛刷沙机位置。"}, + {"type": "text", "content": "3. 按照指示牌站在指定AFK点位。"}, + {"type": "text", "content": "4. 打开拉杆启动机器,确保不要移动。"}, + {"type": "text", "content": "5. 收集掉落到末地传送门的物品。"} + ], + "notes": [ + {"type": "text", "content": "请勿在服务器卡顿严重时使用。"}, + {"type": "text", "content": "使用完毕后请务必关闭机器。"} + ] + }, + { + "id": "gold-farm", + "title": "基岩层猪人塔", + "intro": "位于下界基岩上层的高效金粒与经验获取设施。", + "type": "xp", + "dimension": "nether", + "status": "maintenance", + "coordinates": { + "x": 0, + "y": 250, + "z": 0 + }, + "contributors": ["Charlie", "David"], + "instructions": [ + {"type": "text", "content": "1. 通过地狱交通前往0,0坐标并上到基岩层。"}, + {"type": "text", "content": "2. 站在中心挂机点。"}, + {"type": "text", "content": "3. 挥剑攻击猪人以获取经验。"} + ], + "notes": [ + {"type": "text", "content": "目前收集系统正在改造中,只能获取经验,物品会丢失。"} + ] + }, + { + "id": "iron-farm", + "title": "堆叠式刷铁机", + "intro": "主世界出生点附近的高效铁锭生产设施。", + "type": "resource", + "dimension": "overworld", + "status": "online", + "coordinates": { + "x": 100, + "y": 150, + "z": 100 + }, + "contributors": ["Eve"], + "instructions": [ + {"type": "text", "content": "直接从箱子中拿取铁锭即可。"} + ], + "notes": [] + }, + { + "id": "nether-hub", + "title": "地狱交通中心", + "intro": "连接各个主要生物群系和资源点的冰道枢纽。", + "type": "infrastructure", + "dimension": "nether", + "status": "online", + "coordinates": { + "x": 0, + "y": 120, + "z": 0 + }, + "contributors": ["Frank", "Grace", "Heidi"], + "instructions": [ + {"type": "text", "content": "请携带船只以便快速移动。"}, + {"type": "text", "content": "请勿破坏冰道。"} + ], + "notes": [ + {"type": "text", "content": "前往主岛的线路暂时封闭。"} + ] + }, + { + "id": "broken-farm", + "title": "旧版刷怪塔", + "intro": "已废弃的旧版本刷怪设施,不再维护。", + "type": "xp", + "dimension": "overworld", + "status": "offline", + "coordinates": { + "x": -500, + "y": 64, + "z": -500 + }, + "contributors": ["OldPlayer"], + "instructions": [], + "notes": [ + {"type": "text", "content": "该设施已损坏,请前往新的刷怪塔。"} + ] + } +] diff --git a/facilities.html b/facilities.html new file mode 100644 index 0000000..a476df1 --- /dev/null +++ b/facilities.html @@ -0,0 +1,122 @@ + + +
+ + +共同建设,共同分享,让生存更轻松。
+