You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

614 lines
18 KiB

  1. <template>
  2. <div>
  3. <button class="btn btn--primary sidebar-button" @click="showSidebar">
  4. <svg
  5. v-if="!isSidebarVisible"
  6. xmlns="http://www.w3.org/2000/svg"
  7. class="icon icon-tabler icon-tabler-menu"
  8. width="24"
  9. height="24"
  10. viewBox="0 0 24 24"
  11. stroke-width="3"
  12. stroke="#ffffff"
  13. fill="none"
  14. stroke-linecap="round"
  15. stroke-linejoin="round"
  16. >
  17. <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  18. <line x1="4" y1="8" x2="20" y2="8" />
  19. <line x1="4" y1="16" x2="20" y2="16" />
  20. </svg>
  21. <svg
  22. v-if="isSidebarVisible"
  23. xmlns="http://www.w3.org/2000/svg"
  24. class="icon icon-tabler icon-tabler-arrow-bar-to-right"
  25. width="24"
  26. height="24"
  27. viewBox="0 0 24 24"
  28. stroke-width="3"
  29. stroke="#ffffff"
  30. fill="none"
  31. stroke-linecap="round"
  32. stroke-linejoin="round"
  33. >
  34. <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  35. <line x1="14" y1="12" x2="4" y2="12" />
  36. <line x1="14" y1="12" x2="10" y2="16" />
  37. <line x1="14" y1="12" x2="10" y2="8" />
  38. <line x1="20" y1="4" x2="20" y2="20" />
  39. </svg>
  40. </button>
  41. <aside
  42. :class="[
  43. 'sidebar-container',
  44. { 'sidebar-container--hide': !isSidebarVisible },
  45. { 'sidebar-container--show': isSidebarVisible },
  46. ]"
  47. >
  48. <div class="sidebar">
  49. <div class="sidebar-content">
  50. <h1 class="h1--about">
  51. What is<br>FlyLocal Alaska?
  52. </h1>
  53. <div class="img-divider">
  54. <img
  55. class="img--about"
  56. src="https://openmoji.org/data/black/svg/1F3D4.svg"
  57. alt=""
  58. srcset=""
  59. >
  60. <img
  61. class="img--about"
  62. src="https://openmoji.org/data/black/svg/1F4C5.svg"
  63. alt=""
  64. srcset=""
  65. >
  66. <img
  67. class="img--about"
  68. src="https://openmoji.org/data/black/svg/1F601.svg"
  69. alt=""
  70. srcset=""
  71. >
  72. </div>
  73. <p class="text--about">
  74. <strong>FlyLocal-Alaska</strong> is an easy way to view the
  75. schedules for your favorite Alaskan airlines - all in one place.
  76. </p>
  77. <h1 class="h1--about">
  78. Why FlyLocal<br>in Alaska?
  79. </h1>
  80. <div class="img-divider">
  81. <img
  82. class="img--about"
  83. src="https://openmoji.org/data/black/svg/1F6AB.svg"
  84. alt=""
  85. srcset=""
  86. >
  87. <img
  88. class="img--about"
  89. src="https://openmoji.org/data/black/svg/1F697.svg"
  90. alt=""
  91. srcset=""
  92. >
  93. <img
  94. class="img--about"
  95. src="https://openmoji.org/data/black/svg/1F6E3.svg"
  96. alt=""
  97. srcset=""
  98. >
  99. </div>
  100. <p class="text--about">
  101. <strong>80% of Alaskan communities are not connected to the road
  102. system.</strong>
  103. Therefore, they rely heavily on local airlines for transportation.
  104. </p>
  105. <div class="img-divider">
  106. <img
  107. class="img--about"
  108. src="https://openmoji.org/data/black/svg/1F6A3.svg"
  109. alt=""
  110. srcset=""
  111. >
  112. <img
  113. class="img--about"
  114. src="https://openmoji.org/data/black/svg/1F3D5.svg"
  115. alt=""
  116. srcset=""
  117. >
  118. <img
  119. class="img--about"
  120. src="https://openmoji.org/data/black/svg/1F43B.svg"
  121. alt=""
  122. srcset=""
  123. >
  124. </div>
  125. <p class="text--about">
  126. <strong>See new places.</strong> There are ~400 public airports in
  127. Alaska, but only 20 (or 5%) with service from major US carriers.
  128. </p>
  129. <div class="img-divider">
  130. <img
  131. class="img--about"
  132. src="https://openmoji.org/data/black/svg/1F6E9.svg"
  133. alt=""
  134. srcset=""
  135. >
  136. <img
  137. class="img--about"
  138. src="https://openmoji.org/data/black/svg/1F681.svg"
  139. alt=""
  140. srcset=""
  141. >
  142. <img
  143. class="img--about"
  144. src="https://openmoji.org/data/black/svg/1F6F8.svg"
  145. alt=""
  146. srcset=""
  147. >
  148. </div>
  149. <p class="text--about">
  150. Enjoy a completely <strong>unique flying experience</strong>. Have
  151. you ever landed on a lake in a seaplane? Now is your chance to check
  152. it off the bucket-list.
  153. </p>
  154. <h1 class="h1--about">
  155. Up-to-date<br>Travel Info
  156. </h1>
  157. <ul class="about-carriers list-lrg">
  158. <li @click="clickedLink('alaska-travel-info')">
  159. <a href="https://covid19.alaska.gov/travelers/" target="_blank">
  160. <img
  161. class="img--carrier-logo"
  162. :src="require(`@/assets/images/orgs/alaska-travel-info.png`)"
  163. alt="Alaska Travel Info"
  164. title="Alaska Travel Info"
  165. >
  166. </a>
  167. </li>
  168. </ul>
  169. <h1 class="h1--about">
  170. Explore Alaska<br>on these great local airlines
  171. </h1>
  172. <ul class="about-carriers">
  173. <li v-for="carrier in carriers" :key="carrier.id" @click="clickedCarrier(carrier.fields.Slug)">
  174. <a :href="carrier.fields.BookingLink" target="_blank">
  175. <img
  176. class="img--carrier-logo"
  177. :src="require(`@/assets/images/carriers/${carrier.fields.Slug}.png`)"
  178. :alt="carrier.fields.Name"
  179. :title="carrier.fields.Name"
  180. >
  181. </a>
  182. </li>
  183. </ul>
  184. <h1 class="h1--about">
  185. Proud Member of
  186. </h1>
  187. <ul class="about-carriers list-med">
  188. <li @click="clickedLink('aaca')">
  189. <a href="https://alaskaaircarriers.org" target="_blank">
  190. <img
  191. class="img--carrier-logo"
  192. :src="require(`@/assets/images/orgs/aaca.png`)"
  193. alt="Alaska Air Carriers Association"
  194. title="Alaska Air Carriers Association"
  195. >
  196. </a>
  197. </li>
  198. <li @click="clickedLink('alaska-tia')">
  199. <a href="https://alaskatia.org" target="_blank">
  200. <img
  201. class="img--carrier-logo"
  202. :src="require(`@/assets/images/orgs/alaska-tia.png`)"
  203. alt="Alaska Travel Industry Association"
  204. title="Alaska Travel Industry Association"
  205. >
  206. </a>
  207. </li>
  208. </ul>
  209. <h1 class="h1--about">
  210. Featured on
  211. </h1>
  212. <ul class="about-carriers list-med">
  213. <li @click="clickedLink('1-million-cups')">
  214. <a href="https://www.1millioncups.com/anchorage/presentations/flylocal-alaska-35304" target="_blank">
  215. <img
  216. class="img--carrier-logo"
  217. :src="require(`@/assets/images/orgs/1-million-cups.png`)"
  218. alt="1 Million Cups"
  219. title="1 Million Cups"
  220. >
  221. </a>
  222. </li>
  223. <li @click="clickedLink('travel-alaska')">
  224. <a href="https://www.travelalaska.com/offers/FlyLocal/Plane-Statewide.aspx" target="_blank">
  225. <img
  226. class="img--carrier-logo"
  227. style="background: black; border-radius: 0.5rem; padding-left: 0.4rem;"
  228. :src="require(`@/assets/images/orgs/travel-alaska.png`)"
  229. alt="Travel Alaska"
  230. title="Travel Alaska"
  231. >
  232. </a>
  233. </li>
  234. </ul>
  235. <div class="company-footer">
  236. &nbsp; FlyLocal v5.0.2.3 &nbsp;&nbsp;𐄙&nbsp;&nbsp; ©2021 FlyLocal, Inc &nbsp;
  237. </div>
  238. </div>
  239. <ul class="contact">
  240. <li class="contact-item" @click="clickedLink('twitter')">
  241. <a href="https://twitter.com/fly_local" target="_blank">
  242. <svg
  243. xmlns="http://www.w3.org/2000/svg"
  244. class="icon icon-tabler icon-tabler-brand-twitter"
  245. width="40"
  246. height="40"
  247. viewBox="0 0 24 24"
  248. stroke-width="2"
  249. stroke="#007fff"
  250. fill="none"
  251. stroke-linecap="round"
  252. stroke-linejoin="round"
  253. >
  254. <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  255. <path
  256. d="M22 4.01c-1 .49 -1.98 .689 -3 .99c-1.121 -1.265 -2.783 -1.335 -4.38 -.737s-2.643 2.06 -2.62 3.737v1c-3.245 .083 -6.135 -1.395 -8 -4c0 0 -4.182 7.433 4 11c-1.872 1.247 -3.739 2.088 -6 2c3.308 1.803 6.913 2.423 10.034 1.517c3.58 -1.04 6.522 -3.723 7.651 -7.742a13.84 13.84 0 0 0 .497 -3.753c-.002 -.249 1.51 -2.772 1.818 -4.013z"
  257. />
  258. </svg>
  259. <span>@fly_local</span>
  260. </a>
  261. </li>
  262. <li class="contact-item" @click="clickedLink('facebook')">
  263. <a href="https://facebook.com/iFlyLocal" target="_blank">
  264. <svg
  265. xmlns="http://www.w3.org/2000/svg"
  266. class="icon icon-tabler icon-tabler-brand-facebook"
  267. width="40"
  268. height="40"
  269. viewBox="0 0 24 24"
  270. stroke-width="2"
  271. stroke="#007fff"
  272. fill="none"
  273. stroke-linecap="round"
  274. stroke-linejoin="round"
  275. >
  276. <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  277. <path
  278. d="M7 10v4h3v7h4v-7h3l1 -4h-4v-2a1 1 0 0 1 1 -1h3v-4h-3a5 5 0 0 0 -5 5v2h-3"
  279. />
  280. </svg>
  281. <span>@iFlyLocal</span>
  282. </a>
  283. </li>
  284. <li class="contact-item" @click="clickedLink('instagram')">
  285. <a href="https://instagram.com/fly_local" target="_blank">
  286. <svg
  287. xmlns="http://www.w3.org/2000/svg"
  288. class="icon icon-tabler icon-tabler-brand-instagram"
  289. width="40"
  290. height="40"
  291. viewBox="0 0 24 24"
  292. stroke-width="2"
  293. stroke="#007fff"
  294. fill="none"
  295. stroke-linecap="round"
  296. stroke-linejoin="round"
  297. >
  298. <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  299. <rect x="4" y="4" width="16" height="16" rx="4" />
  300. <circle cx="12" cy="12" r="3" />
  301. <line x1="16.5" y1="7.5" x2="16.5" y2="7.501" />
  302. </svg>
  303. <span>@fly_local</span>
  304. </a>
  305. </li>
  306. <li class="contact-item" @click="clickedLink('team-email')">
  307. <a href="mailto:team@iflylocal.com" target="_blank">
  308. <svg
  309. xmlns="http://www.w3.org/2000/svg"
  310. class="icon icon-tabler icon-tabler-user"
  311. width="40"
  312. height="40"
  313. viewBox="0 0 24 24"
  314. stroke-width="2"
  315. stroke="#007fff"
  316. fill="none"
  317. stroke-linecap="round"
  318. stroke-linejoin="round"
  319. >
  320. <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  321. <circle cx="12" cy="7" r="4" />
  322. <path d="M6 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2" />
  323. </svg>
  324. <span>contact us</span>
  325. </a>
  326. </li>
  327. <li class="contact-item" @click="clickedLink('partners-email')">
  328. <a href="mailto:partners@iflylocal.com" target="_blank">
  329. <svg
  330. xmlns="http://www.w3.org/2000/svg"
  331. class="icon icon-tabler icon-tabler-briefcase"
  332. width="40"
  333. height="40"
  334. viewBox="0 0 24 24"
  335. stroke-width="2"
  336. stroke="#007fff"
  337. fill="none"
  338. stroke-linecap="round"
  339. stroke-linejoin="round"
  340. >
  341. <path stroke="none" d="M0 0h24v24H0z" fill="none" />
  342. <rect x="3" y="7" width="18" height="13" rx="2" />
  343. <path d="M8 7v-2a2 2 0 0 1 2 -2h4a2 2 0 0 1 2 2v2" />
  344. <line x1="12" y1="12" x2="12" y2="12.01" />
  345. <path d="M3 13a20 20 0 0 0 18 0" />
  346. </svg>
  347. <span>partner with us</span>
  348. </a>
  349. </li>
  350. </ul>
  351. </div>
  352. </aside>
  353. <div
  354. :class="[
  355. 'sidebar-blockui',
  356. { 'sidebar-blockui--show': isSidebarVisible },
  357. ]"
  358. />
  359. </div>
  360. </template>
  361. <script>
  362. export default {
  363. data: () => ({
  364. isSidebarVisible: false,
  365. carriers: []
  366. }),
  367. async fetch () {
  368. const filterFormula = 'AND(IsActive=1,FIND("Alaska",Region)>0)'
  369. const sortFormula = '&sort[0][field]=Name&sort[0][direction]=asc'
  370. let offset
  371. let data = []
  372. while (true) {
  373. const offsetParam = offset ? `&offset=${offset}` : ''
  374. const res = await fetch(`https://api.airtable.com/v0/appiQwfVZixRgRICe/Carriers_Alaska?filterByFormula=${filterFormula}${sortFormula}${offsetParam}`, {
  375. method: 'GET',
  376. headers: {
  377. 'Content-Type': 'application/x-www-form-urlencoded',
  378. Authorization: 'Bearer keyJ2ht64ZSN57AG1'
  379. }
  380. })
  381. const json = await res.json()
  382. offset = await json.offset
  383. data = [...data, ...await json.records]
  384. // await console.log(data.length)
  385. if (await !offset) { break } // Were done let's stop this thing
  386. }
  387. this.carriers = [...data]
  388. },
  389. methods: {
  390. showSidebar () {
  391. this.isSidebarVisible = !this.isSidebarVisible
  392. if(this.isSidebarVisible) {
  393. this.$segment.track('sidebar__show_sidebar')
  394. } else {
  395. this.$segment.track('sidebar__hide_sidebar')
  396. }
  397. },
  398. clickedCarrier (slug) {
  399. this.$segment.track('sidebar__open_carrier', {
  400. carrier: slug
  401. });
  402. },
  403. clickedLink (slug) {
  404. this.$segment.track('sidebar__open_link', {
  405. carrier: slug
  406. });
  407. }
  408. }
  409. }
  410. </script>
  411. <style>
  412. :root {
  413. --sidebar-width: 50ch;
  414. }
  415. .sidebar-container {
  416. z-index: 1002;
  417. position: fixed;
  418. top: 0;
  419. right: 0;
  420. display: flex;
  421. justify-content: flex-start;
  422. height: 100vh;
  423. transition: all 0.3s;
  424. pointer-events: none;
  425. }
  426. .sidebar-container.sidebar-container--hide {
  427. transform: translateX(calc(var(--sidebar-width) + 6rem));
  428. }
  429. .sidebar-container.sidebar-container--show {
  430. transform: translateX(0);
  431. }
  432. .sidebar {
  433. background: white;
  434. padding: 3rem 0 3rem 3rem;
  435. border-radius: 3rem 0 0 3rem;
  436. pointer-events: all;
  437. display: flex;
  438. flex-direction: column;
  439. align-items: flex-end;
  440. }
  441. .sidebar-content {
  442. overflow: auto;
  443. max-width: var(--sidebar-width);
  444. height: calc(100vh - 11rem);
  445. padding-right: 3rem;
  446. display: flex;
  447. flex-direction: column;
  448. align-items: center;
  449. }
  450. .img--about {
  451. height: min(3rem, 60px);
  452. display: inline-block;
  453. }
  454. div.img-divider {
  455. display: flex;
  456. justify-content: space-around;
  457. padding: 0 25%;
  458. }
  459. .img--carrier-logo {
  460. max-width: 6rem;
  461. max-height: 6rem;
  462. }
  463. .list-med .img--carrier-logo {
  464. max-width: 9rem;
  465. max-height: 9rem;
  466. }
  467. .list-lrg .img--carrier-logo {
  468. max-width: 15rem;
  469. max-height: 15rem;
  470. }
  471. h1.h1--about {
  472. font-weight: 200;
  473. text-transform: uppercase;
  474. color: #007fff;
  475. font-size: min(2.7rem, 50px);
  476. line-height: 1;
  477. text-align: center;
  478. margin-bottom: 1rem;
  479. }
  480. .text--about {
  481. margin-top: 1rem;
  482. margin-bottom: 1rem;
  483. max-width: 40ch;
  484. font-size: min(1rem, 18px);
  485. }
  486. .text--about:nth-of-type(1),
  487. .text--about:nth-of-type(4) {
  488. margin-bottom: 5rem;
  489. }
  490. .about-carriers {
  491. display: flex;
  492. flex-direction: row;
  493. flex-wrap: wrap;
  494. gap: 2rem;
  495. align-items: center;
  496. justify-content: space-around;
  497. margin-bottom: 5rem;
  498. }
  499. .about-carriers li {
  500. filter: saturate(0%);
  501. transition: 0.3s all;
  502. position: relative;
  503. }
  504. /* .about-carriers li::after {
  505. position: absolute;
  506. top: 0;
  507. right: 0;
  508. bottom: 0;
  509. left: 0;
  510. background-color: red;
  511. content: '';
  512. } */
  513. .about-carriers li:hover {
  514. filter: saturate(100%);
  515. transform: scale(1.05);
  516. }
  517. .sidebar-button {
  518. position: fixed;
  519. top: 1rem;
  520. right: 1rem;
  521. z-index: 1003;
  522. }
  523. .sidebar-blockui {
  524. position: fixed;
  525. top: 0;
  526. right: 0;
  527. bottom: 0;
  528. left: 0;
  529. opacity: 0;
  530. filter: blur(0.5);
  531. background-color: #007fff;
  532. transition: all 0.3s;
  533. pointer-events: none;
  534. z-index: 1001;
  535. }
  536. .sidebar-blockui.sidebar-blockui--show {
  537. opacity: 0.8;
  538. pointer-events: all;
  539. }
  540. ul.contact {
  541. display: flex;
  542. flex-direction: row;
  543. align-items: center;
  544. justify-content: center;
  545. gap: 1rem;
  546. flex-wrap: wrap;
  547. margin: 3rem 3rem 0 0;
  548. max-width: var(--sidebar-width);
  549. }
  550. li.contact-item a span {
  551. color: #007fff;
  552. transition: all 0.3s;
  553. }
  554. ul.contact li.contact-item a {
  555. display: flex;
  556. flex-direction: row;
  557. align-items: center;
  558. transition: all 0.3s;
  559. }
  560. ul.contact li.contact-item a:hover span {
  561. color: #00ca00;
  562. }
  563. ul.contact li.contact-item a svg {
  564. max-height: 2rem;
  565. max-width: 2rem;
  566. stroke-width: 1;
  567. transition: all 0.3s;
  568. }
  569. ul.contact li.contact-item a:hover svg {
  570. stroke: #00ca00;
  571. }
  572. .company-footer {
  573. font-family: monospace;
  574. font-size: 0.8rem;
  575. text-transform: uppercase;
  576. color: gray;
  577. }
  578. </style>