course-center-page.component.scss 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. :host { display: block; min-height: 100%; background: var(--surface-muted); }
  2. .center-page { min-height: 100%; padding-bottom: 18px; }
  3. .course-band, .schedule-band { margin: 12px 14px 0; overflow: hidden; background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); }
  4. .course-band > header, .schedule-band > header { display: grid; min-height: 56px; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; padding: 0 16px; color: white; background: var(--brand-strong); border-bottom: 1px solid color-mix(in srgb, var(--brand-strong) 82%, black); gap: 9px; }
  5. header h2 { margin: 0; color: var(--ink); font-size: 17px; letter-spacing: 0; }
  6. header span { color: var(--ink-soft); font-size: 12px; }
  7. .course-band > header h2, .schedule-band > header h2 { color: white; }
  8. .course-band > header span, .schedule-band > header span { color: rgb(255 255 255 / 78%); }
  9. .course-toggle { display: flex; width: 100%; min-height: 44px; align-items: center; justify-content: center; gap: 6px; padding: 8px 16px; color: var(--brand-deep); background: var(--brand-wash); border: 0; border-top: 1px solid var(--line); font: inherit; font-size: 12px; cursor: pointer; }
  10. .course-toggle lucide-icon.expanded { transform: rotate(180deg); }
  11. .course-list { margin: 0; padding: 0; list-style: none; }
  12. .course-list li { border-bottom: 1px solid var(--line); }
  13. .course-list li:last-child { border-bottom: 0; }
  14. .course-list button { display: grid; width: 100%; min-height: 68px; grid-template-columns: minmax(0, 1fr) auto; align-items: center; padding: 10px 16px; color: var(--ink); text-align: left; background: transparent; border: 0; gap: 10px; }
  15. .course-list button > span { display: flex; min-width: 0; flex-direction: column; gap: 4px; }
  16. .course-list strong { overflow: hidden; font-size: 14px; text-overflow: ellipsis; white-space: nowrap; }
  17. .course-list small { color: var(--ink-soft); font-size: 11px; }
  18. .course-list button > lucide-icon { color: var(--ink-soft); }
  19. .course-list button:disabled { cursor: not-allowed; opacity: .58; }
  20. .course-list button.readonly:disabled { cursor: default; opacity: 1; }
  21. .course-list button.readonly em { padding: 4px 8px; color: var(--ink-soft); background: var(--surface-muted); border: 1px solid var(--line); border-radius: 999px; font-size: 10px; font-style: normal; white-space: nowrap; }
  22. .schedule-tools { padding: 12px 14px 14px; background: linear-gradient(180deg, color-mix(in srgb, var(--brand-pale) 42%, white), white 72%); border-bottom: 1px solid var(--line); }
  23. .schedule-toolbar { display: grid; grid-template-columns: 1fr; align-items: end; gap: 10px; }
  24. .schedule-toolbar:has(.student-filter) { grid-template-columns: minmax(0, 1fr) minmax(150px, 190px); }
  25. .range-tabs { display: grid; height: 48px; grid-template-columns: repeat(4, 1fr); padding: 3px; background: rgb(255 255 255 / 82%); border: 1px solid var(--line); border-radius: 10px; gap: 3px; }
  26. .range-tabs button { min-height: 40px; padding: 6px 4px; color: var(--ink-soft); background: transparent; border: 0; border-radius: 8px; font-size: 12px; }
  27. .range-tabs.schedule-actions { grid-template-columns: none; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); }
  28. .schedule-actions button { min-width: 0; text-align: center; }
  29. .range-tabs button.active { color: white; background: var(--brand-strong); box-shadow: 0 4px 12px rgb(20 53 45 / 16%); font-weight: 700; }
  30. .student-filter { position: relative; display: flex; min-width: 0; flex-direction: column; gap: 4px; }
  31. .student-filter > span { color: var(--ink-soft); font-size: 11px; line-height: 13px; }
  32. .history-filter-panel { padding: 14px; background: linear-gradient(180deg, color-mix(in srgb, var(--brand-pale) 42%, white), white); border-bottom: 1px solid var(--line); }
  33. .history-filter-grid { display: grid; grid-template-columns: minmax(140px, .85fr) minmax(170px, 1.15fr); gap: 10px; }
  34. .history-filter-grid label { display: flex; min-width: 0; flex-direction: column; gap: 5px; }
  35. .history-filter-grid label > span { color: var(--ink-soft); font-size: 11px; line-height: 14px; }
  36. .history-filter-control { position: relative; display: flex; min-width: 0; align-items: center; }
  37. .history-filter-control > lucide-icon { position: absolute; left: 12px; z-index: 1; color: var(--brand-strong); pointer-events: none; }
  38. .history-filter-control select, .history-filter-control input { width: 100%; height: 46px; padding: 0 12px 0 39px; color: var(--ink); appearance: none; background: white; border: 1px solid var(--line); border-radius: 11px; box-shadow: 0 3px 10px rgb(20 53 45 / 4%); font: inherit; font-size: 13px; outline: 0; }
  39. .history-filter-control select:focus, .history-filter-control input:focus { border-color: var(--brand); box-shadow: 0 0 0 3px color-mix(in srgb, var(--brand-pale) 76%, transparent); }
  40. .history-filter-control input::placeholder { color: color-mix(in srgb, var(--ink-soft) 72%, white); }
  41. .history-filter-control input::-webkit-search-cancel-button { display: none; }
  42. .month-control select { padding-right: 34px; }
  43. .history-filter-panel footer { display: flex; min-height: 25px; align-items: end; justify-content: space-between; margin-top: 8px; color: var(--ink-soft); font-size: 11px; gap: 8px; }
  44. .history-filter-panel footer strong { color: var(--brand-strong); font-size: 13px; }
  45. .history-filter-panel footer button { display: inline-flex; min-height: 28px; align-items: center; padding: 4px 8px; color: var(--brand-strong); background: transparent; border: 0; border-radius: 7px; font-size: 11px; gap: 3px; }
  46. .history-filter-panel footer button:active { background: var(--brand-pale); }
  47. .schedule-filters { display: grid; grid-template-columns: repeat(3, 1fr); margin: 12px 14px 8px; padding: 3px; background: var(--surface-muted); border: 1px solid var(--line); border-radius: 8px; gap: 3px; }
  48. .schedule-tools .schedule-filters { margin: 10px 0 0; background: rgb(255 255 255 / 78%); }
  49. .schedule-filters button { min-height: 36px; padding: 6px 4px; color: var(--ink-soft); background: transparent; border: 0; border-radius: 6px; font-size: 12px; }
  50. .schedule-filters button span { margin-left: 2px; color: inherit; font-size: 10px; }
  51. .schedule-filters button.active { color: var(--brand-strong); background: white; box-shadow: 0 1px 4px rgb(20 53 45 / 10%); font-weight: 650; }
  52. .calendar-panel { margin-top: 12px; padding: 11px; background: white; border: 1px solid var(--line); border-radius: 14px; box-shadow: 0 8px 18px rgb(20 53 45 / 6%); }
  53. .calendar-heading { display: grid; grid-template-columns: 38px minmax(0, 1fr) 38px; align-items: center; margin-bottom: 8px; text-align: center; }
  54. .calendar-heading strong { color: var(--ink); font-size: 15px; }
  55. .calendar-heading button { display: grid; width: 34px; height: 34px; padding: 0; color: var(--brand-strong); background: var(--brand-pale); border: 0; border-radius: 50%; font-size: 24px; line-height: 1; place-items: center; }
  56. .calendar-weekdays, .calendar-grid { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 5px; }
  57. .calendar-weekdays { margin-bottom: 6px; color: var(--ink-soft); font-size: 11px; text-align: center; }
  58. .calendar-day { position: relative; display: grid; min-width: 0; min-height: 42px; padding: 5px 2px 4px; color: var(--ink); background: var(--surface-muted); border: 1px solid transparent; border-radius: 11px; font-size: 13px; place-items: center; }
  59. .calendar-day span { line-height: 1; }
  60. .calendar-day em { display: grid; min-width: 17px; height: 17px; margin-top: 3px; padding: 0 4px; color: white; background: var(--brand-strong); border-radius: 999px; font-size: 10px; font-style: normal; line-height: 17px; }
  61. .calendar-day.outside { color: color-mix(in srgb, var(--ink-soft) 55%, white); background: rgb(247 249 246 / 72%); }
  62. .calendar-day.today { border-color: var(--brand); }
  63. .calendar-day.selected { color: white; background: var(--brand-strong); box-shadow: 0 5px 14px rgb(20 53 45 / 18%); }
  64. .calendar-day.selected em { color: var(--brand-strong); background: white; }
  65. .calendar-day.finished-course:not(.selected) { color: var(--brand-strong); background: color-mix(in srgb, var(--brand-pale) 62%, white); border-color: color-mix(in srgb, var(--brand) 46%, white); }
  66. .calendar-day.planned-course:not(.selected) { color: #2f5f9c; background: #edf4ff; border-color: #b8d0ef; }
  67. .calendar-day.finished-course em { background: var(--brand-strong); }
  68. .calendar-day.planned-course em { background: #7fa8d8; }
  69. .calendar-day.selected.finished-course { background: var(--brand-strong); }
  70. .calendar-day.selected.planned-course { background: #2f5f9c; box-shadow: 0 5px 14px rgb(47 95 156 / 18%); }
  71. .calendar-day.selected em { background: white; }
  72. .calendar-day.selected.finished-course em { color: var(--brand-strong); }
  73. .calendar-day.selected.planned-course em { color: #2f5f9c; }
  74. .schedule-summary { margin: 10px 2px 0; color: var(--ink-soft); font-size: 12px; text-align: center; }
  75. .schedule-band h3 { margin: 0; padding: 10px 16px 7px; color: var(--ink-soft); background: var(--surface-muted); font-size: 12px; letter-spacing: 0; }
  76. .schedule-list article { display: grid; min-height: 76px; grid-template-columns: 64px minmax(0, 1fr) auto auto auto; align-items: center; padding: 10px 12px 10px 16px; border-bottom: 1px solid var(--line); cursor: pointer; gap: 9px; }
  77. .schedule-list article:last-child { border-bottom: 0; }
  78. .schedule-list time { font-size: 13px; font-weight: 650; }
  79. .schedule-copy { display: flex; min-width: 0; flex-direction: column; gap: 5px; }
  80. .schedule-copy strong, .schedule-copy span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  81. .schedule-copy strong { font-size: 14px; }
  82. .schedule-copy span { color: var(--ink-soft); font-size: 12px; }
  83. .status { padding: 4px 7px; color: #606266; background: #f0f1f2; border-radius: 4px; font-size: 11px; white-space: nowrap; }
  84. .status-10 { color: #1f5f91; background: #e6f3fc; }
  85. .status-11, .status-20 { color: #82580e; background: #fff4dc; }
  86. .status-30 { color: #236b59; background: #e6f4ef; }
  87. .report-button { display: grid; width: 34px; height: 34px; padding: 0; color: var(--brand-strong); background: transparent; border: 0; place-items: center; }
  88. .chevron { color: var(--ink-soft); }
  89. .band-empty { margin: 0; padding: 28px 16px; color: var(--ink-soft); text-align: center; }
  90. .center-state { display: flex; min-height: 240px; align-items: center; justify-content: center; color: var(--ink-soft); flex-direction: column; gap: 10px; }
  91. .center-sync { display: flex; min-height: 42px; align-items: center; justify-content: center; margin: 10px 14px 0; padding: 9px 14px; color: var(--brand-strong); background: color-mix(in srgb, var(--brand-pale) 72%, white); border: 1px solid color-mix(in srgb, var(--brand) 26%, white); border-radius: 12px; font-size: 12px; gap: 8px; }
  92. .center-sync.delayed { color: #8d570b; background: #fff7e9; border-color: #e7bd72; }
  93. .center-state.error { min-height: 140px; margin: 12px 14px 0; padding: 20px; background: white; border: 1px solid var(--line); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); }
  94. .spin { animation: spin .8s linear infinite; }
  95. @keyframes spin { to { transform: rotate(360deg); } }
  96. @media (max-width: 420px) {
  97. .schedule-toolbar, .schedule-toolbar:has(.student-filter) { grid-template-columns: 1fr; }
  98. .schedule-list article { grid-template-columns: 54px minmax(0, 1fr) auto auto auto; gap: 7px; }
  99. .schedule-list article:not(:has(.report-button)) { grid-template-columns: 54px minmax(0, 1fr) auto auto; }
  100. .status { width: fit-content; }
  101. }
  102. @media (max-width: 360px) {
  103. .course-band, .schedule-band, .center-state.error { margin-inline: 10px; }
  104. .schedule-tools { padding-inline: 10px; }
  105. .history-filter-grid { grid-template-columns: 1fr; }
  106. .calendar-panel { padding-inline: 8px; }
  107. .calendar-weekdays, .calendar-grid { gap: 4px; }
  108. .calendar-day { min-height: 39px; border-radius: 9px; }
  109. }
  110. @media (min-width: 760px) { .center-page { max-width: 760px; margin: 0 auto; border-inline: 1px solid var(--line); } }
  111. .schedule-list article.has-lesson-pay { grid-template-columns: 44px minmax(0, 1fr) auto 28px 14px; gap: 8px; }
  112. .has-lesson-pay time { grid-area: 1 / 1; }
  113. .has-lesson-pay .schedule-copy { grid-area: 1 / 2; }
  114. .has-lesson-pay .status { grid-area: 1 / 3; }
  115. .has-lesson-pay .report-button { grid-area: 1 / 4; }
  116. .has-lesson-pay .chevron { grid-area: 1 / 5; }
  117. .lesson-pay { grid-column: 2 / -1; grid-row: 2; display:flex; align-items:center; flex-wrap:wrap; gap:4px 12px; min-width:0; color:var(--brand-strong); }
  118. .lesson-pay small { color:var(--ink-soft); font-size:12px; }
  119. .lesson-pay small.feedback-pending { color:#b45309; font-weight:600; }