app.blade.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569
  1. {{-- api-v12/resources/views/library/layouts/app.blade.php --}}
  2. <!doctype html>
  3. <html lang="zh">
  4. <head>
  5. <meta charset="utf-8" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
  7. <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  8. <title>@yield('title', '巴利书库')</title>
  9. @stack('styles')
  10. <link href="https://cdn.jsdelivr.net/npm/@tabler/core@latest/dist/css/tabler.min.css" rel="stylesheet" />
  11. <link href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@latest/tabler-icons.min.css" rel="stylesheet" />
  12. <script src="https://cdn.jsdelivr.net/npm/@tabler/core@1.3.2/dist/js/tabler.min.js"></script>
  13. <style>
  14. .book-card {
  15. transition: transform 0.2s;
  16. }
  17. .book-card:hover {
  18. transform: translateY(-2px);
  19. }
  20. .book-cover {
  21. height: 200px;
  22. object-fit: cover;
  23. }
  24. @media (max-width: 768px) {
  25. .book-cover {
  26. height: 150px;
  27. }
  28. }
  29. .nav-overlay {
  30. position: absolute;
  31. }
  32. .hero-section {
  33. height: 250px;
  34. width: 100%;
  35. background-image: url('{{ URL::asset("assets/images/hero-2.jpg") }}');
  36. background-size: cover;
  37. background-position: center;
  38. background-repeat: no-repeat;
  39. position: relative;
  40. display: flex;
  41. align-items: center;
  42. justify-content: center;
  43. }
  44. .hero-overlay {
  45. position: absolute;
  46. top: 0;
  47. left: 0;
  48. right: 0;
  49. bottom: 0;
  50. background: rgba(0, 0, 0, 0.2);
  51. }
  52. .hero-content {
  53. position: relative;
  54. z-index: 2;
  55. text-align: center;
  56. color: white;
  57. max-width: 600px;
  58. padding: 0 1rem;
  59. }
  60. .hero-title {
  61. font-size: 2.5rem;
  62. font-weight: bold;
  63. margin-bottom: 1rem;
  64. text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
  65. }
  66. .hero-subtitle {
  67. font-size: 1.2rem;
  68. margin-bottom: 2rem;
  69. text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5);
  70. }
  71. .search-box {
  72. background: white;
  73. border-radius: 0.5rem;
  74. padding: 0.5rem;
  75. box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
  76. max-width: 500px;
  77. margin: 0 auto;
  78. }
  79. .feature-card {
  80. transition: transform 0.3s ease, box-shadow 0.3s ease;
  81. height: 100%;
  82. }
  83. .feature-card:hover {
  84. transform: translateY(-5px);
  85. box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
  86. }
  87. .stats-section {
  88. background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  89. color: white;
  90. }
  91. .stat-item {
  92. text-align: center;
  93. padding: 2rem 1rem;
  94. }
  95. .stat-number {
  96. font-size: 2.5rem;
  97. font-weight: bold;
  98. display: block;
  99. }
  100. .stat-label {
  101. font-size: 1rem;
  102. opacity: 0.9;
  103. margin-top: 0.5rem;
  104. }
  105. /* Navigation Styles */
  106. .top-nav {
  107. height: 50px;
  108. width: 100%;
  109. display: flex;
  110. justify-content: flex-end;
  111. align-items: center;
  112. padding: 0 2rem;
  113. position: relative;
  114. z-index: 10;
  115. }
  116. .nav-menu {
  117. display: flex;
  118. align-items: center;
  119. gap: 1.5rem;
  120. list-style: none;
  121. margin: 0;
  122. padding: 0;
  123. }
  124. .nav-item a {
  125. color: white;
  126. text-decoration: none;
  127. font-size: 0.95rem;
  128. font-weight: 500;
  129. transition: opacity 0.2s;
  130. white-space: nowrap;
  131. }
  132. .nav-item a:hover {
  133. opacity: 0.8;
  134. }
  135. /* Hamburger Menu */
  136. .hamburger-btn {
  137. display: none;
  138. background: rgba(255, 255, 255, 0.2);
  139. border: 2px solid white;
  140. border-radius: 0.375rem;
  141. color: white;
  142. font-size: 1.5rem;
  143. cursor: pointer;
  144. padding: 0.5rem 0.75rem;
  145. z-index: 1001;
  146. transition: background 0.2s;
  147. width: 44px;
  148. height: 44px;
  149. align-items: center;
  150. justify-content: center;
  151. }
  152. .hamburger-btn:hover {
  153. background: rgba(255, 255, 255, 0.3);
  154. }
  155. /* CSS Hamburger Icon */
  156. .hamburger-icon {
  157. display: flex;
  158. flex-direction: column;
  159. gap: 4px;
  160. width: 24px;
  161. }
  162. .hamburger-icon span {
  163. display: block;
  164. height: 2px;
  165. background: white;
  166. border-radius: 2px;
  167. transition: all 0.3s;
  168. }
  169. .hamburger-btn.active .hamburger-icon span:nth-child(1) {
  170. transform: translateY(6px) rotate(45deg);
  171. }
  172. .hamburger-btn.active .hamburger-icon span:nth-child(2) {
  173. opacity: 0;
  174. }
  175. .hamburger-btn.active .hamburger-icon span:nth-child(3) {
  176. transform: translateY(-6px) rotate(-45deg);
  177. }
  178. .mobile-menu {
  179. display: none;
  180. position: fixed;
  181. top: 0;
  182. right: -100%;
  183. width: 280px;
  184. height: 100vh;
  185. background: rgba(0, 0, 0, 0.95);
  186. backdrop-filter: blur(10px);
  187. transition: right 0.3s ease;
  188. z-index: 1000;
  189. padding-top: 60px;
  190. }
  191. .mobile-menu.active {
  192. right: 0;
  193. }
  194. .mobile-nav-menu {
  195. list-style: none;
  196. padding: 0;
  197. margin: 0;
  198. }
  199. .mobile-nav-item {
  200. border-bottom: 1px solid rgba(255, 255, 255, 0.1);
  201. }
  202. .mobile-nav-item a {
  203. display: block;
  204. color: white;
  205. text-decoration: none;
  206. padding: 1rem 2rem;
  207. font-size: 1rem;
  208. transition: background 0.2s;
  209. }
  210. .mobile-nav-item a:hover {
  211. background: rgba(255, 255, 255, 0.1);
  212. }
  213. .mobile-overlay {
  214. display: none;
  215. position: fixed;
  216. top: 0;
  217. left: 0;
  218. width: 100%;
  219. height: 100%;
  220. background: rgba(0, 0, 0, 0.5);
  221. z-index: 999;
  222. }
  223. .mobile-overlay.active {
  224. display: block;
  225. }
  226. /* Responsive */
  227. @media (max-width: 768px) {
  228. .hero-title {
  229. font-size: 2rem;
  230. }
  231. .hero-subtitle {
  232. font-size: 1rem;
  233. }
  234. .hero-section {
  235. height: 250px;
  236. }
  237. .stat-number {
  238. font-size: 2rem;
  239. }
  240. .top-nav {
  241. padding: 0 1rem;
  242. }
  243. .nav-menu {
  244. display: none;
  245. }
  246. .hamburger-btn {
  247. display: flex;
  248. }
  249. .mobile-menu {
  250. display: block;
  251. }
  252. }
  253. @media (max-width: 576px) {
  254. .hero-title {
  255. font-size: 1.5rem;
  256. }
  257. .hero-subtitle {
  258. font-size: 0.9rem;
  259. }
  260. .top-nav {
  261. padding: 0 0.5rem;
  262. }
  263. }
  264. </style>
  265. <style>
  266. :root {
  267. --sf: #c8860a;
  268. --sf-light: #f5e6c8;
  269. --sf-pale: #fdf8f0;
  270. --ink: #1a1208;
  271. --ink-soft: #4a3f2f;
  272. --ink-muted: #8a7a68;
  273. --bdr: #e8ddd0;
  274. --card-bg: #fffdf9;
  275. }
  276. /* Breadcrumb bar */
  277. .anthology-breadcrumb-bar {
  278. background: rgba(255, 255, 255, .55);
  279. border-bottom: 1px solid var(--bdr);
  280. padding: .5rem 0;
  281. }
  282. .anthology-breadcrumb-bar .bc-inner {
  283. display: flex;
  284. align-items: center;
  285. justify-content: space-between;
  286. gap: 1rem;
  287. }
  288. .anthology-breadcrumb-bar .breadcrumb {
  289. margin: 0;
  290. font-size: .78rem;
  291. flex-shrink: 0;
  292. }
  293. .anthology-breadcrumb-bar .breadcrumb-item a {
  294. color: var(--sf);
  295. text-decoration: none;
  296. }
  297. .anthology-breadcrumb-bar .breadcrumb-item.active {
  298. color: var(--ink-muted);
  299. }
  300. .anthology-breadcrumb-bar .breadcrumb-item+.breadcrumb-item::before {
  301. color: var(--ink-muted);
  302. }
  303. /* Top nav inside breadcrumb bar */
  304. .bc-nav {
  305. display: flex;
  306. align-items: center;
  307. gap: 1.25rem;
  308. list-style: none;
  309. margin: 0;
  310. padding: 0;
  311. flex-shrink: 0;
  312. }
  313. .bc-nav li a {
  314. font-size: .82rem;
  315. color: var(--ink-soft);
  316. text-decoration: none;
  317. white-space: nowrap;
  318. transition: color .15s;
  319. }
  320. .bc-nav li a:hover {
  321. color: var(--sf);
  322. }
  323. .bc-nav li a.active {
  324. color: var(--sf);
  325. font-weight: 600;
  326. }
  327. /* Mobile nav: hamburger */
  328. .bc-hamburger {
  329. display: none;
  330. background: none;
  331. border: 1px solid var(--bdr);
  332. border-radius: 5px;
  333. padding: 4px 8px;
  334. cursor: pointer;
  335. color: var(--ink-soft);
  336. line-height: 1;
  337. }
  338. .bc-hamburger:hover {
  339. border-color: var(--sf);
  340. color: var(--sf);
  341. }
  342. /* Mobile drawer */
  343. .bc-mobile-overlay {
  344. display: none;
  345. position: fixed;
  346. inset: 0;
  347. background: rgba(0, 0, 0, .4);
  348. z-index: 1040;
  349. }
  350. .bc-mobile-overlay.open {
  351. display: block;
  352. }
  353. .bc-mobile-drawer {
  354. position: fixed;
  355. top: 0;
  356. right: -100%;
  357. width: 240px;
  358. height: 100vh;
  359. background: var(--card-bg);
  360. border-left: 1px solid var(--bdr);
  361. z-index: 1050;
  362. transition: right .25s ease;
  363. padding: 1rem 0;
  364. box-shadow: -4px 0 20px rgba(0, 0, 0, .1);
  365. }
  366. .bc-mobile-drawer.open {
  367. right: 0;
  368. }
  369. .bc-mobile-drawer-header {
  370. display: flex;
  371. align-items: center;
  372. justify-content: space-between;
  373. padding: .5rem 1.25rem .75rem;
  374. border-bottom: 1px solid var(--bdr);
  375. margin-bottom: .5rem;
  376. }
  377. .bc-mobile-drawer-header span {
  378. font-size: .85rem;
  379. font-weight: 600;
  380. color: var(--ink-soft);
  381. }
  382. .bc-mobile-drawer-close {
  383. background: none;
  384. border: none;
  385. cursor: pointer;
  386. color: var(--ink-muted);
  387. font-size: 1rem;
  388. line-height: 1;
  389. padding: 2px;
  390. }
  391. .bc-mobile-nav {
  392. list-style: none;
  393. padding: 0;
  394. margin: 0;
  395. }
  396. .bc-mobile-nav li a {
  397. display: block;
  398. padding: .65rem 1.25rem;
  399. font-size: .9rem;
  400. color: var(--ink-soft);
  401. text-decoration: none;
  402. border-bottom: 1px solid rgba(232, 221, 208, .5);
  403. transition: background .15s;
  404. }
  405. .bc-mobile-nav li a:hover {
  406. background: var(--sf-pale);
  407. color: var(--sf);
  408. }
  409. .bc-mobile-nav li a.active {
  410. color: var(--sf);
  411. font-weight: 600;
  412. }
  413. @media (max-width: 640px) {
  414. .bc-nav {
  415. display: none;
  416. }
  417. .bc-hamburger {
  418. display: inline-flex;
  419. align-items: center;
  420. }
  421. }
  422. </style>
  423. </head>
  424. <body>
  425. <div class="page">
  426. <x-library.header />
  427. @yield('hero')
  428. <div class="page-wrapper">
  429. @yield('content')
  430. </div>
  431. </div>
  432. <!-- Tabler JS and Bootstrap -->
  433. <script src="https://cdn.jsdelivr.net/npm/@tabler/core@1.0.0-beta21/dist/js/tabler.min.js"></script>
  434. <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
  435. <script>
  436. // Hamburger Menu Toggle
  437. (function() {
  438. const btn = document.getElementById('bcHamburger');
  439. const overlay = document.getElementById('bcOverlay');
  440. const drawer = document.getElementById('bcDrawer');
  441. const close = document.getElementById('bcDrawerClose');
  442. if (!btn) return;
  443. function open() {
  444. drawer.classList.add('open');
  445. overlay.classList.add('open');
  446. }
  447. function shut() {
  448. drawer.classList.remove('open');
  449. overlay.classList.remove('open');
  450. }
  451. btn.addEventListener('click', open);
  452. overlay.addEventListener('click', shut);
  453. close.addEventListener('click', shut);
  454. drawer.querySelectorAll('a').forEach(a => {
  455. a.addEventListener('click', shut);
  456. });
  457. })();
  458. const mobileOverlay = document.getElementById('mobileOverlay');
  459. function toggleMenu() {
  460. mobileMenu.classList.toggle('active');
  461. mobileOverlay.classList.toggle('active');
  462. hamburgerBtn.classList.toggle('active');
  463. }
  464. hamburgerBtn.addEventListener('click', toggleMenu);
  465. mobileOverlay.addEventListener('click', toggleMenu);
  466. // Close menu when clicking on a link
  467. document.querySelectorAll('.mobile-nav-item a').forEach(link => {
  468. link.addEventListener('click', () => {
  469. toggleMenu();
  470. });
  471. });
  472. </script>
  473. @stack('scripts')
  474. </body>
  475. </html>