Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

1225 строки
26KB

  1. /* ── Design System Tokens ────────────────────────────────────────────── */
  2. :root {
  3. --primary: #1F4E79;
  4. --primary-dark: #163b5c;
  5. --primary-light: #dbeafe;
  6. --secondary: #0F766E;
  7. --accent: #2563EB;
  8. --success: #2E7D32;
  9. --success-bg: #F0FDF4;
  10. --success-border: #BBF7D0;
  11. --warning: #B45309;
  12. --warning-bg: #FFFBEB;
  13. --warning-border: #FDE68A;
  14. --error: #B91C1C;
  15. --error-bg: #FEF2F2;
  16. --error-border: #FECACA;
  17. --info: #2563EB;
  18. --info-bg: #EFF6FF;
  19. --info-border: #BFDBFE;
  20. --overdue: #7F1D1D;
  21. --bg: #F7F9FC;
  22. --surface: #FFFFFF;
  23. --surface-raised: #F8FAFC;
  24. --border: #D0D7E2;
  25. --border-strong: #9FB6D6;
  26. --text: #111827;
  27. --text-secondary: #4B5563;
  28. --text-muted: #6B7280;
  29. --radius-xs: 4px;
  30. --radius-sm: 6px;
  31. --radius: 8px;
  32. --radius-lg: 10px;
  33. --radius-xl: 12px;
  34. --shadow-xs: 0 1px 2px rgba(15, 23, 42, 0.06);
  35. --shadow-sm: 0 1px 4px rgba(15, 23, 42, 0.08);
  36. --shadow: 0 4px 12px rgba(15, 23, 42, 0.10);
  37. --shadow-md: 0 8px 24px rgba(15, 23, 42, 0.12);
  38. }
  39. /* ── Reset / Base ────────────────────────────────────────────────────── */
  40. *, *::before, *::after {
  41. box-sizing: border-box;
  42. }
  43. [x-cloak] {
  44. display: none !important;
  45. }
  46. html {
  47. scroll-behavior: smooth;
  48. }
  49. body {
  50. margin: 0;
  51. min-height: 100vh;
  52. font-family: "Public Sans", "Segoe UI", Arial, sans-serif;
  53. font-size: 14px;
  54. line-height: 22px;
  55. font-weight: 400;
  56. color: var(--text);
  57. background: var(--bg);
  58. overflow-x: hidden;
  59. }
  60. a {
  61. color: inherit;
  62. }
  63. code {
  64. font-family: "IBM Plex Mono", Consolas, "Courier New", monospace;
  65. font-size: 13px;
  66. }
  67. h1, h2, h3, h4, h5, h6 {
  68. margin: 0;
  69. font-weight: 600;
  70. color: var(--text);
  71. }
  72. h1 { font-size: 28px; line-height: 36px; }
  73. h2 { font-size: 22px; line-height: 30px; }
  74. h3 { font-size: 18px; line-height: 26px; }
  75. h4 { font-size: 16px; line-height: 24px; }
  76. /* ── Layout ──────────────────────────────────────────────────────────── */
  77. .page-shell {
  78. min-height: 100vh;
  79. display: flex;
  80. flex-direction: column;
  81. }
  82. .container {
  83. width: min(1200px, calc(100% - 2rem));
  84. margin: 0 auto;
  85. }
  86. /* ── Site Header ─────────────────────────────────────────────────────── */
  87. .site-header {
  88. position: sticky;
  89. top: 0;
  90. z-index: 20;
  91. background: var(--primary);
  92. border-bottom: 1px solid var(--primary-dark);
  93. box-shadow: var(--shadow-sm);
  94. }
  95. .header-inner {
  96. display: flex;
  97. align-items: center;
  98. justify-content: space-between;
  99. gap: 1rem;
  100. padding: 0;
  101. height: 52px;
  102. }
  103. .brand {
  104. display: inline-flex;
  105. align-items: center;
  106. gap: 10px;
  107. text-decoration: none;
  108. }
  109. .brand-mark {
  110. display: inline-flex;
  111. align-items: center;
  112. justify-content: center;
  113. width: 32px;
  114. height: 32px;
  115. border-radius: var(--radius-sm);
  116. background: rgba(255, 255, 255, 0.18);
  117. color: #fff;
  118. font-weight: 800;
  119. font-size: 12px;
  120. letter-spacing: 0.04em;
  121. flex-shrink: 0;
  122. }
  123. .brand-copy {
  124. display: flex;
  125. flex-direction: column;
  126. line-height: 1.2;
  127. }
  128. .brand-copy strong {
  129. font-size: 14px;
  130. font-weight: 700;
  131. color: #fff;
  132. letter-spacing: 0.01em;
  133. }
  134. .brand-copy small {
  135. color: rgba(255, 255, 255, 0.6);
  136. font-size: 11px;
  137. text-transform: uppercase;
  138. letter-spacing: 0.1em;
  139. }
  140. .site-nav {
  141. display: flex;
  142. align-items: center;
  143. gap: 2px;
  144. flex-wrap: wrap;
  145. }
  146. .nav-user {
  147. padding: 0 8px;
  148. color: rgba(255, 255, 255, 0.7);
  149. font-size: 13px;
  150. font-weight: 600;
  151. }
  152. .nav-logout-form {
  153. display: contents;
  154. }
  155. .nav-link {
  156. text-decoration: none;
  157. color: rgba(255, 255, 255, 0.75);
  158. font-size: 13px;
  159. font-weight: 600;
  160. padding: 6px 12px;
  161. border-radius: var(--radius-sm);
  162. transition: background-color 120ms ease, color 120ms ease;
  163. }
  164. .nav-link:hover,
  165. .nav-link:focus-visible {
  166. color: #fff;
  167. background: rgba(255, 255, 255, 0.12);
  168. }
  169. .nav-link.is-active {
  170. color: #fff;
  171. background: rgba(255, 255, 255, 0.18);
  172. }
  173. /* ── Page Content ────────────────────────────────────────────────────── */
  174. .page-content {
  175. flex: 1;
  176. padding: 32px 0 40px;
  177. }
  178. .content-stack {
  179. display: grid;
  180. gap: 24px;
  181. }
  182. /* ── Section Heading ─────────────────────────────────────────────────── */
  183. .section-heading {
  184. max-width: 720px;
  185. }
  186. .section-heading h1 {
  187. margin: 4px 0 8px;
  188. font-size: 28px;
  189. line-height: 36px;
  190. }
  191. .section-heading p {
  192. margin: 0;
  193. color: var(--text-secondary);
  194. line-height: 22px;
  195. font-size: 14px;
  196. }
  197. /* ── Hero (home page) ────────────────────────────────────────────────── */
  198. .hero {
  199. display: grid;
  200. grid-template-columns: minmax(0, 1.5fr) minmax(280px, 0.9fr);
  201. gap: 16px;
  202. align-items: stretch;
  203. }
  204. .hero-copy,
  205. .hero-panel,
  206. .feature-card,
  207. .section-panel,
  208. .alert,
  209. .empty-state {
  210. background: var(--surface);
  211. border: 1px solid var(--border);
  212. box-shadow: var(--shadow-sm);
  213. }
  214. .hero-copy {
  215. padding: 32px;
  216. border-radius: var(--radius-lg);
  217. }
  218. .eyebrow {
  219. display: inline-block;
  220. margin-bottom: 16px;
  221. padding: 3px 10px;
  222. border-radius: 999px;
  223. background: var(--info-bg);
  224. border: 1px solid var(--info-border);
  225. color: var(--accent);
  226. font-size: 11px;
  227. font-weight: 700;
  228. text-transform: uppercase;
  229. letter-spacing: 0.1em;
  230. }
  231. .hero h1 {
  232. font-size: clamp(24px, 4vw, 36px);
  233. line-height: 1.15;
  234. letter-spacing: -0.02em;
  235. color: var(--primary);
  236. }
  237. .hero-text {
  238. max-width: 560px;
  239. margin: 16px 0 0;
  240. font-size: 14px;
  241. line-height: 22px;
  242. color: var(--text-secondary);
  243. }
  244. .hero-actions {
  245. display: flex;
  246. flex-wrap: wrap;
  247. gap: 8px;
  248. margin-top: 24px;
  249. }
  250. .hero-panel {
  251. display: flex;
  252. flex-direction: column;
  253. justify-content: space-between;
  254. padding: 24px;
  255. border-radius: var(--radius-lg);
  256. }
  257. .panel-label {
  258. margin: 0 0 12px;
  259. font-size: 11px;
  260. font-weight: 700;
  261. letter-spacing: 0.1em;
  262. text-transform: uppercase;
  263. color: var(--text-secondary);
  264. }
  265. .hero-panel code {
  266. display: block;
  267. padding: 12px 14px;
  268. border-radius: var(--radius);
  269. background: #0f172a;
  270. color: #e2e8f0;
  271. font-family: "IBM Plex Mono", Consolas, monospace;
  272. font-size: 12px;
  273. line-height: 20px;
  274. white-space: normal;
  275. }
  276. .route-callout {
  277. margin-top: 16px;
  278. padding: 12px 14px;
  279. border-radius: var(--radius);
  280. background: var(--surface-raised);
  281. border: 1px solid var(--border);
  282. }
  283. .route-callout span {
  284. display: block;
  285. margin-bottom: 6px;
  286. color: var(--text-secondary);
  287. font-size: 13px;
  288. }
  289. .route-callout a {
  290. color: var(--accent);
  291. font-weight: 700;
  292. text-decoration: none;
  293. }
  294. /* ── Feature Grid ────────────────────────────────────────────────────── */
  295. .feature-grid {
  296. display: grid;
  297. grid-template-columns: repeat(3, minmax(0, 1fr));
  298. gap: 16px;
  299. margin-top: 16px;
  300. }
  301. .feature-card {
  302. padding: 20px;
  303. border-radius: var(--radius-lg);
  304. }
  305. .feature-card h2 {
  306. margin-top: 0;
  307. margin-bottom: 8px;
  308. font-size: 16px;
  309. line-height: 24px;
  310. }
  311. .feature-card p {
  312. margin: 0;
  313. color: var(--text-secondary);
  314. line-height: 22px;
  315. font-size: 13px;
  316. }
  317. /* ── Panels & Controls ───────────────────────────────────────────────── */
  318. .controls-panel,
  319. .table-shell {
  320. overflow: hidden;
  321. background: var(--surface);
  322. border: 1px solid var(--border);
  323. }
  324. .controls-header {
  325. display: flex;
  326. align-items: flex-start;
  327. justify-content: space-between;
  328. gap: 16px;
  329. }
  330. .search-row {
  331. display: grid;
  332. grid-template-columns: minmax(0, 1fr);
  333. }
  334. .field-full {
  335. width: 100%;
  336. }
  337. .section-panel {
  338. padding: 24px;
  339. border-radius: var(--radius-lg);
  340. min-width: 0;
  341. }
  342. .panel-header {
  343. display: flex;
  344. align-items: flex-start;
  345. justify-content: space-between;
  346. gap: 16px;
  347. flex-wrap: wrap;
  348. margin-bottom: 16px;
  349. }
  350. .panel-actions {
  351. display: flex;
  352. align-items: center;
  353. gap: 8px;
  354. flex-wrap: wrap;
  355. }
  356. .panel-header h2 {
  357. margin: 0 0 4px;
  358. font-size: 18px;
  359. line-height: 26px;
  360. }
  361. .panel-header p {
  362. margin: 0;
  363. color: var(--text-secondary);
  364. line-height: 22px;
  365. font-size: 13px;
  366. }
  367. .job-type-table-stack {
  368. display: grid;
  369. gap: 16px;
  370. }
  371. .job-type-table-group {
  372. display: grid;
  373. gap: 8px;
  374. padding-top: 16px;
  375. border-top: 1px solid var(--border);
  376. }
  377. .job-type-table-group:first-child {
  378. padding-top: 0;
  379. border-top: 0;
  380. }
  381. .job-type-table-heading {
  382. display: flex;
  383. align-items: center;
  384. justify-content: space-between;
  385. gap: 16px;
  386. flex-wrap: wrap;
  387. }
  388. .job-type-table-heading h3 {
  389. margin: 0;
  390. font-size: 15px;
  391. line-height: 22px;
  392. }
  393. .job-type-table-heading span {
  394. color: var(--text-secondary);
  395. font-size: 12px;
  396. font-weight: 700;
  397. }
  398. /* ── Forms ───────────────────────────────────────────────────────────── */
  399. .form-grid {
  400. display: grid;
  401. grid-template-columns: repeat(2, minmax(0, 1fr));
  402. gap: 16px;
  403. }
  404. .field {
  405. display: grid;
  406. gap: 6px;
  407. font-weight: 600;
  408. font-size: 13px;
  409. }
  410. .field span {
  411. font-size: 13px;
  412. color: var(--text);
  413. }
  414. .input {
  415. width: 100%;
  416. padding: 7px 10px;
  417. border: 1px solid var(--border);
  418. border-radius: var(--radius-sm);
  419. background: var(--surface);
  420. color: var(--text);
  421. font: inherit;
  422. font-size: 14px;
  423. line-height: 20px;
  424. transition: border-color 120ms ease, box-shadow 120ms ease;
  425. }
  426. .input:focus {
  427. outline: none;
  428. border-color: var(--accent);
  429. box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.12);
  430. }
  431. .field-error {
  432. color: var(--error);
  433. font-size: 12px;
  434. font-weight: 600;
  435. }
  436. .form-actions {
  437. display: flex;
  438. justify-content: flex-start;
  439. align-items: center;
  440. gap: 8px;
  441. }
  442. /* ── Buttons ─────────────────────────────────────────────────────────── */
  443. .button {
  444. display: inline-flex;
  445. align-items: center;
  446. justify-content: center;
  447. padding: 7px 16px;
  448. border-radius: var(--radius-sm);
  449. text-decoration: none;
  450. font-family: inherit;
  451. font-size: 13px;
  452. font-weight: 600;
  453. line-height: 20px;
  454. border: 1px solid transparent;
  455. cursor: pointer;
  456. transition: background-color 120ms ease, border-color 120ms ease, box-shadow 120ms ease;
  457. }
  458. .button:focus-visible {
  459. outline: 2px solid var(--accent);
  460. outline-offset: 2px;
  461. }
  462. .button-primary {
  463. background: var(--primary);
  464. color: #fff;
  465. border-color: var(--primary-dark);
  466. }
  467. .button-primary:hover {
  468. background: var(--primary-dark);
  469. }
  470. .button-secondary {
  471. background: var(--surface);
  472. color: var(--text);
  473. border-color: var(--border);
  474. }
  475. .button-secondary:hover {
  476. background: var(--surface-raised);
  477. border-color: var(--border-strong);
  478. }
  479. .button-danger {
  480. background: var(--error);
  481. color: #fff;
  482. border-color: #991B1B;
  483. }
  484. .button-danger:hover,
  485. .button-danger:focus-visible {
  486. background: #991B1B;
  487. }
  488. .button-sm {
  489. padding: 4px 10px;
  490. font-size: 12px;
  491. border-radius: var(--radius-xs);
  492. border: 1px solid transparent;
  493. cursor: pointer;
  494. }
  495. /* ── Alerts & Empty States ───────────────────────────────────────────── */
  496. .alert,
  497. .empty-state {
  498. padding: 12px 16px;
  499. border-radius: var(--radius);
  500. font-size: 14px;
  501. }
  502. .alert-success {
  503. background: var(--success-bg);
  504. border-color: var(--success-border);
  505. color: var(--success);
  506. }
  507. .alert-error {
  508. background: var(--error-bg);
  509. border-color: var(--error-border);
  510. color: var(--error);
  511. }
  512. .empty-state p {
  513. margin: 0;
  514. color: var(--text-secondary);
  515. line-height: 22px;
  516. }
  517. .empty-state p + p {
  518. margin-top: 6px;
  519. }
  520. /* ── Stats Grid ──────────────────────────────────────────────────────── */
  521. .stats-grid {
  522. display: grid;
  523. grid-template-columns: repeat(3, minmax(0, 1fr));
  524. gap: 12px;
  525. }
  526. .stat-card {
  527. padding: 16px;
  528. border-radius: var(--radius);
  529. background: var(--surface);
  530. border: 1px solid var(--border);
  531. box-shadow: var(--shadow-xs);
  532. }
  533. .stat-card span {
  534. display: block;
  535. color: var(--text-secondary);
  536. font-size: 11px;
  537. text-transform: uppercase;
  538. letter-spacing: 0.08em;
  539. font-weight: 600;
  540. }
  541. .stat-card strong {
  542. display: block;
  543. margin-top: 6px;
  544. font-size: 28px;
  545. line-height: 1;
  546. color: var(--primary);
  547. }
  548. .summary-feature {
  549. margin-top: 16px;
  550. padding: 14px 16px;
  551. border-radius: var(--radius);
  552. background: var(--info-bg);
  553. border: 1px solid var(--info-border);
  554. }
  555. .summary-label {
  556. display: block;
  557. color: var(--text-secondary);
  558. font-size: 11px;
  559. text-transform: uppercase;
  560. letter-spacing: 0.08em;
  561. font-weight: 600;
  562. }
  563. .summary-feature h3 {
  564. margin: 6px 0 4px;
  565. font-size: 16px;
  566. line-height: 24px;
  567. color: var(--primary);
  568. }
  569. .summary-feature p {
  570. margin: 0;
  571. color: var(--text-secondary);
  572. font-size: 13px;
  573. }
  574. /* ── Dashboard ───────────────────────────────────────────────────────── */
  575. .stats-grid-4 {
  576. grid-template-columns: repeat(4, minmax(0, 1fr));
  577. }
  578. .dashboard-panels {
  579. display: grid;
  580. grid-template-columns: 1fr 1fr;
  581. gap: 16px;
  582. align-items: start;
  583. }
  584. .dashboard-table {
  585. width: 100%;
  586. border-collapse: collapse;
  587. font-size: 13px;
  588. }
  589. .dashboard-table th {
  590. text-align: left;
  591. padding: 6px 10px;
  592. font-size: 11px;
  593. text-transform: uppercase;
  594. letter-spacing: 0.06em;
  595. color: var(--text-secondary);
  596. border-bottom: 1px solid var(--border);
  597. }
  598. .dashboard-table td {
  599. padding: 8px 10px;
  600. border-bottom: 1px solid var(--border);
  601. color: var(--text-primary);
  602. }
  603. .dashboard-table tr:last-child td {
  604. border-bottom: none;
  605. }
  606. .dashboard-table-id {
  607. color: var(--text-secondary);
  608. font-variant-numeric: tabular-nums;
  609. width: 48px;
  610. }
  611. .dashboard-table-date {
  612. color: var(--text-secondary);
  613. white-space: nowrap;
  614. }
  615. .dashboard-table-action {
  616. text-align: right;
  617. width: 40px;
  618. }
  619. .dashboard-table-action a {
  620. color: var(--primary);
  621. font-size: 12px;
  622. }
  623. .type-breakdown {
  624. display: flex;
  625. flex-direction: column;
  626. gap: 10px;
  627. padding: 4px 0;
  628. }
  629. .type-breakdown-row {
  630. display: grid;
  631. grid-template-columns: 140px 1fr 36px;
  632. align-items: center;
  633. gap: 10px;
  634. font-size: 13px;
  635. }
  636. .type-name {
  637. color: var(--text-primary);
  638. white-space: nowrap;
  639. overflow: hidden;
  640. text-overflow: ellipsis;
  641. }
  642. .type-bar-wrap {
  643. height: 8px;
  644. background: var(--border);
  645. border-radius: 4px;
  646. overflow: hidden;
  647. }
  648. .type-bar {
  649. display: block;
  650. height: 100%;
  651. background: var(--primary);
  652. border-radius: 4px;
  653. min-width: 4px;
  654. transition: width 0.3s ease;
  655. }
  656. .type-count {
  657. text-align: right;
  658. font-variant-numeric: tabular-nums;
  659. color: var(--text-secondary);
  660. font-size: 12px;
  661. }
  662. @media (max-width: 860px) {
  663. .stats-grid-4 {
  664. grid-template-columns: repeat(2, minmax(0, 1fr));
  665. }
  666. .dashboard-panels {
  667. grid-template-columns: 1fr;
  668. }
  669. }
  670. /* ── Table Toolbar ───────────────────────────────────────────────────── */
  671. .table-toolbar {
  672. display: flex;
  673. align-items: center;
  674. justify-content: space-between;
  675. gap: 16px;
  676. margin-bottom: 12px;
  677. flex-wrap: wrap;
  678. padding: 8px 12px;
  679. border: 1px solid var(--border);
  680. border-radius: var(--radius);
  681. background: var(--surface);
  682. }
  683. .table-pill {
  684. display: inline-flex;
  685. align-items: center;
  686. padding: 3px 10px;
  687. border-radius: 999px;
  688. background: var(--info-bg);
  689. border: 1px solid var(--info-border);
  690. color: var(--accent);
  691. font-size: 12px;
  692. font-weight: 700;
  693. letter-spacing: 0.04em;
  694. }
  695. .table-caption {
  696. color: var(--text-secondary);
  697. font-size: 12px;
  698. }
  699. /* ── Tabulator ───────────────────────────────────────────────────────── */
  700. .tabulator-host {
  701. overflow-x: auto;
  702. width: 100%;
  703. }
  704. .directory-panel .tabulator-host {
  705. min-height: 38rem;
  706. }
  707. .tabulator-host .tabulator {
  708. border: 1px solid var(--border);
  709. border-radius: var(--radius-lg);
  710. overflow: hidden;
  711. background: var(--surface);
  712. box-shadow: var(--shadow-sm);
  713. }
  714. .tabulator-host .tabulator-header {
  715. border-bottom: 1px solid var(--border);
  716. background: var(--surface-raised);
  717. }
  718. .tabulator-host .tabulator-header .tabulator-col {
  719. min-height: 36px;
  720. background: transparent;
  721. border-right: 1px solid var(--border);
  722. }
  723. .tabulator-host .tabulator-header .tabulator-col:last-child {
  724. border-right: 0;
  725. }
  726. .tabulator-host .tabulator-header .tabulator-col .tabulator-col-content {
  727. padding: 8px 10px;
  728. }
  729. .tabulator-host .tabulator-header .tabulator-col .tabulator-col-title {
  730. font-size: 11px;
  731. font-weight: 700;
  732. letter-spacing: 0.06em;
  733. text-transform: uppercase;
  734. color: var(--text-secondary);
  735. }
  736. .tabulator-host .tabulator-col,
  737. .tabulator-host .tabulator-cell {
  738. border-right: 1px solid var(--border);
  739. }
  740. .tabulator-host .tabulator-row .tabulator-cell:last-child {
  741. border-right: 0;
  742. }
  743. .tabulator-host .tabulator-row {
  744. background: var(--surface);
  745. border-bottom: 1px solid var(--border);
  746. transition: background-color 100ms ease;
  747. }
  748. .tabulator-host .tabulator-row:nth-child(even) {
  749. background: var(--surface-raised);
  750. }
  751. .tabulator-host .tabulator-row:hover {
  752. background: var(--info-bg);
  753. }
  754. .tabulator-host .tabulator-row.tabulator-selected {
  755. background: var(--primary-light);
  756. }
  757. .tabulator-host .tabulator-cell {
  758. padding: 8px 10px;
  759. font-size: 13px;
  760. line-height: 20px;
  761. }
  762. .tabulator-host .tabulator-row .tabulator-cell:first-child {
  763. font-weight: 600;
  764. color: var(--text);
  765. }
  766. .tabulator-host .tabulator-footer {
  767. padding: 6px 8px;
  768. background: var(--surface-raised);
  769. border-top: 1px solid var(--border);
  770. }
  771. .tabulator-host .tabulator-footer .tabulator-paginator {
  772. font-family: inherit;
  773. font-size: 13px;
  774. }
  775. .tabulator-host .tabulator-footer .tabulator-page {
  776. margin: 0 2px;
  777. padding: 4px 8px;
  778. border: 1px solid var(--border);
  779. border-radius: var(--radius-xs);
  780. background: var(--surface);
  781. color: var(--text-secondary);
  782. font-weight: 600;
  783. font-size: 12px;
  784. }
  785. .tabulator-host .tabulator-footer .tabulator-page.active,
  786. .tabulator-host .tabulator-footer .tabulator-page:hover {
  787. background: var(--primary);
  788. border-color: var(--primary-dark);
  789. color: #fff;
  790. }
  791. .tabulator-host .tabulator-footer .tabulator-page:disabled {
  792. opacity: 0.4;
  793. }
  794. .tabulator-host .tabulator-placeholder {
  795. padding: 32px 16px;
  796. color: var(--text-secondary);
  797. font-size: 13px;
  798. font-weight: 600;
  799. }
  800. /* ── HTMX Indicators ─────────────────────────────────────────────────── */
  801. .htmx-indicator {
  802. display: none;
  803. }
  804. .htmx-request .htmx-indicator,
  805. .htmx-request.htmx-indicator {
  806. display: inline-flex;
  807. }
  808. .inline-indicator {
  809. color: var(--text-secondary);
  810. font-size: 13px;
  811. font-weight: 600;
  812. }
  813. /* ── Site Footer ─────────────────────────────────────────────────────── */
  814. .site-footer {
  815. margin-top: auto;
  816. border-top: 1px solid var(--border);
  817. background: var(--surface);
  818. }
  819. .footer-inner {
  820. display: flex;
  821. justify-content: space-between;
  822. gap: 16px;
  823. padding: 16px 0 24px;
  824. color: var(--text-muted);
  825. font-size: 12px;
  826. line-height: 18px;
  827. }
  828. .footer-inner p {
  829. margin: 0;
  830. }
  831. /* ── Page Toolbar ────────────────────────────────────────────────────── */
  832. .page-toolbar {
  833. display: flex;
  834. align-items: flex-start;
  835. justify-content: space-between;
  836. gap: 16px;
  837. flex-wrap: wrap;
  838. }
  839. .page-toolbar .section-heading {
  840. margin: 0;
  841. }
  842. .page-toolbar .section-heading h1 {
  843. margin: 0 0 4px;
  844. }
  845. /* ── Campaign Types / Import Forms ───────────────────────────────────── */
  846. .ct-form {
  847. display: grid;
  848. gap: 24px;
  849. }
  850. .form-section {
  851. display: grid;
  852. gap: 12px;
  853. }
  854. .form-section h3 {
  855. margin: 0;
  856. font-size: 15px;
  857. line-height: 22px;
  858. }
  859. .attributes-header {
  860. display: flex;
  861. flex-direction: column;
  862. gap: 4px;
  863. }
  864. .attributes-hint {
  865. margin: 0;
  866. color: var(--text-secondary);
  867. font-size: 13px;
  868. }
  869. .attribute-list {
  870. display: grid;
  871. gap: 6px;
  872. }
  873. .attribute-row {
  874. display: flex;
  875. align-items: flex-end;
  876. gap: 8px;
  877. flex-wrap: wrap;
  878. }
  879. .attr-drag-handle {
  880. cursor: grab;
  881. padding: 0 4px;
  882. color: var(--text-muted);
  883. font-size: 16px;
  884. user-select: none;
  885. align-self: flex-end;
  886. padding-bottom: 8px;
  887. line-height: 1;
  888. }
  889. .attr-drag-handle:active {
  890. cursor: grabbing;
  891. }
  892. .attribute-row.is-dragging {
  893. opacity: 0.35;
  894. }
  895. .attribute-row.is-drag-over {
  896. outline: 2px dashed var(--accent);
  897. border-radius: var(--radius-sm);
  898. background: var(--info-bg);
  899. }
  900. .attribute-order-field {
  901. flex: 0 0 5rem;
  902. min-width: 5rem;
  903. }
  904. .attribute-order-field .input {
  905. text-align: center;
  906. }
  907. .attribute-name-field {
  908. flex: 2;
  909. min-width: 160px;
  910. }
  911. .attribute-type-field {
  912. flex: 1;
  913. min-width: 110px;
  914. }
  915. .attribute-remove {
  916. padding-bottom: 0.1rem;
  917. }
  918. .input-error {
  919. border-color: var(--error) !important;
  920. }
  921. .required-mark {
  922. color: var(--error);
  923. }
  924. .delete-zone {
  925. margin-top: 32px;
  926. padding-top: 16px;
  927. border-top: 1px solid var(--error-border);
  928. }
  929. .delete-zone h4 {
  930. margin: 0 0 4px;
  931. color: var(--error);
  932. font-size: 14px;
  933. }
  934. .delete-zone p {
  935. margin: 0 0 12px;
  936. color: var(--text-secondary);
  937. font-size: 13px;
  938. }
  939. .attr-summary {
  940. color: var(--text-secondary);
  941. font-size: 13px;
  942. }
  943. .attr-empty {
  944. color: var(--text-muted);
  945. opacity: 0.6;
  946. }
  947. /* ── Import Tabs ─────────────────────────────────────────────────────── */
  948. .import-tabs {
  949. display: flex;
  950. gap: 2px;
  951. margin-bottom: 16px;
  952. border-bottom: 1px solid var(--border);
  953. padding-bottom: 0;
  954. }
  955. .import-tab {
  956. padding: 6px 14px;
  957. border: none;
  958. background: none;
  959. cursor: pointer;
  960. font: inherit;
  961. font-size: 13px;
  962. font-weight: 600;
  963. color: var(--text-secondary);
  964. border-bottom: 2px solid transparent;
  965. margin-bottom: -1px;
  966. border-radius: 0;
  967. transition: color 120ms, border-color 120ms;
  968. }
  969. .import-tab:hover { color: var(--accent); }
  970. .import-tab.is-active { color: var(--primary); border-bottom-color: var(--primary); }
  971. .import-grid {
  972. display: grid;
  973. grid-template-columns: minmax(260px, 1.4fr) minmax(180px, 0.8fr) minmax(180px, 0.8fr);
  974. gap: 16px;
  975. }
  976. .import-actions {
  977. margin-top: 16px;
  978. flex-wrap: wrap;
  979. }
  980. /* Campaign jobs table — horizontal scroll inside the panel */
  981. #campaign-jobs-page-table {
  982. overflow-x: auto;
  983. width: 100%;
  984. }
  985. /* ── Responsive ──────────────────────────────────────────────────────── */
  986. @media (max-width: 860px) {
  987. .header-inner,
  988. .footer-inner {
  989. flex-direction: column;
  990. align-items: flex-start;
  991. }
  992. .header-inner {
  993. height: auto;
  994. padding: 12px 0;
  995. }
  996. .hero,
  997. .feature-grid {
  998. grid-template-columns: 1fr;
  999. }
  1000. .controls-header,
  1001. .table-toolbar {
  1002. flex-direction: column;
  1003. align-items: flex-start;
  1004. }
  1005. .hero-copy,
  1006. .hero-panel {
  1007. padding: 24px;
  1008. }
  1009. .form-grid {
  1010. grid-template-columns: 1fr;
  1011. }
  1012. .import-grid {
  1013. grid-template-columns: 1fr;
  1014. }
  1015. .stats-grid {
  1016. grid-template-columns: 1fr;
  1017. }
  1018. .page-content {
  1019. padding-top: 24px;
  1020. }
  1021. }
  1022. @media (max-width: 560px) {
  1023. .container {
  1024. width: min(100% - 1rem, 1200px);
  1025. }
  1026. .site-nav {
  1027. width: 100%;
  1028. }
  1029. .nav-link {
  1030. width: 100%;
  1031. text-align: center;
  1032. }
  1033. .hero h1 {
  1034. font-size: 22px;
  1035. }
  1036. }

Powered by TurnKey Linux.