diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..c08b0ca --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,59 @@ +# Contributing to the Ionic Vue Conference Application + +Thank you for taking the time to contribute! :tada::+1: + +The following is a set of guidelines for contributing to the conference app. These are just guidelines, not rules, use your best judgment and feel free to propose changes to this document in a pull request. + +## Table of Contents +- [Reporting Issues](#reporting-issues) + - [Before Submitting an Issue](#before-submitting-an-issue) + - [Determining the Repository](#determining-the-repository) + - [Submitting the Issue](#submitting-the-issue) +- [Submitting a Pull Request](#submitting-a-pull-request) + - [Guidelines for Submitting](#guidelines-for-submitting) + - [Code Style](#code-style) + +## Reporting Issues + +Before submitting an issue, please go through [the list below](#before-submitting-an-issue) as you might find a solution to your issue. + +### Before Submitting an Issue + +* Make sure you get the latest version of the code and run through the [Getting Started](https://github.com/ionic-team/ionic-vue-conference-app#getting-started) steps to see if this resolves your issue. +* Check the [forum](https://forum.ionicframework.com) for similar questions and answers. +* Go through [all issues](https://github.com/ionic-team/ionic-vue-conference-app/issues?utf8=%E2%9C%93&q=is%3Aissue) on this repository to see if the issue has already been created. It could have been closed with a resolution, so check closed issues, too. +* Chat with us on [Discord](https://ionic.link/discord) to see if we can find a solution to the problem! +* [Determine which repository](#determining-the-repository) the problem should be reported in. + +### Determining the Repository + +There are several repositories being used for Ionic, which makes it difficult to determine which one to report an issue to. Don't worry if you aren't sure, we can always move it! + +* The [Ionic Framework repository](https://github.com/ionic-team/ionic-framework) is a repository for all things related to the Ionic Framework. If you are able to reproduce the issue in any of the Ionic starters (or an existing project), you'll want to submit the issue [here](https://github.com/ionic-team/ionic-framework/issues). +* The [Ionic CLI repository](https://github.com/ionic-team/ionic-cli) contains all of the code that allows you to run `ionic` commands from a terminal window. It is safe to put any issues [here](https://github.com/ionic-team/ionic-cli/issues) that relate to running an `ionic` command. +* **This repository** is a demo of the Ionic Framework. If you find an issue with this app that does not occur on [a new app](https://ionicframework.com/docs/intro/cli#start-an-app), please submit the issue [here](https://github.com/ionic-team/ionic-vue-conference-app/issues). + +### Submitting the Issue + +* **Use a clear and descriptive title** for the issue to identify the problem. This makes it easier for others to find. +* **Describe the exact steps to reproduce the problem** with as many details as needed. +* **Provide your configuration** by running `ionic info` in a terminal from *within* the project folder and pasting this information in the issue. + +## Submitting a Pull Request + +### Guidelines for Submitting + +When in doubt, keep your pull requests small. To give a PR the best chance of getting accepted, do not bundle more than one "feature" or bug fix per PR. Doing so makes it very hard to accept it if one of the fixes has issues. + +It's always best to create two smaller PRs than one big one. + +Talk to us before creating a PR that refactors the code or directory structure of the project. This project is constantly changing to reflect the latest version of Ionic Framework so sometimes it will be in the process of getting fixed. + +### Code Style + +Make sure to follow the existing code style as much as possible. + +* No underscores prefixing JS functions. +* Use flat Sass: + * **Don't** use [BEM conventions](https://css-tricks.com/bem-101/) + * Avoid nesting selectors. This is done to make it easier for users without Sass experience to understand and read. diff --git a/README.md b/README.md index 8aa8fb9..14a0ad4 100644 --- a/README.md +++ b/README.md @@ -1,62 +1,70 @@ -# Ionic Vue Conference Application +# Ionic Vue Conference App +[![Built with Ionic](https://img.shields.io/badge/-Built%20with%20Ionic-3880FF?style=flat&logo=ionic&logoColor=white)](https://ionicframework.com) +[![Vue.js](https://img.shields.io/badge/-Vue.js-4FC08D?style=flat&logo=vue.js&logoColor=white)](https://vuejs.org) +[![MIT License](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) -This application is purely a kitchen-sink demo of the Ionic Framework and Vue. +This is a **kitchen-sink demo application** built with **Ionic Framework** and **Vue**. It showcases a wide range of Ionic components and features in the context of a fictional tech conference app. -**There is not an actual Ionic Conference at this time.** This project is just to show off Ionic components in a real-world application. +**Note**: There is no actual Ionic Conference. This project is purely for demonstration purposes. -## React and Angular versions +👉 [Try the Live Demo](https://ionic-vue-conference-app-git-main-ionic1.vercel.app/tutorial) -We've built versions of this Conference app in React and Angular for developers that would prefer to use one of those framework options: +## 🧱 Framework Variants -https://github.com/ionic-team/ionic-react-conference-app +This app is also available in other frameworks: -https://github.com/ionic-team/ionic-conference-app +- 🔗 [Ionic Angular Conference App](https://github.com/ionic-team/ionic-conference-app) +- 🔗 [Ionic React Conference App](https://github.com/ionic-team/ionic-react-conference-app) +- ✅ **You're viewing the Vue version** -## Table of Contents -- [Getting Started](#getting-started) -- [App Preview](#app-preview) +## ✨ Features -## Getting Started +- Browse conference schedule with filtering +- View speaker bios and session details +- User authentication and profile management +- Interactive maps for venue navigation +- Push notifications support +- Dark/Light mode toggling +- Cross-platform support: iOS, Android, and Web -* [Download the installer](https://nodejs.org/) for Node LTS. -* Install the ionic CLI globally: `npm install -g ionic` -* Clone this repository: `git clone https://github.com/ionic-team/ionic-vue-conference-app.git`. -* Run `npm install` from the project root. -* Run `ionic serve` in a terminal from the project root. -* Profit. :tada: +## ⚙️ Getting Started -## App Preview +### Prerequisites -### [Menu](https://github.com/ionic-team/ionic-vue-conference-app/blob/main/src/components/Menu.vue) +- Node.js (LTS version recommended) → [Download](https://nodejs.org/) +- npm (included with Node.js) +- Ionic CLI → Install globally: + ```bash + npm install -g @ionic/cli + ``` -| Material Design | iOS | -| -----------------| -----| -| ![Android Menu](/resources/screenshots/android-menu.png) | ![iOS Menu](/resources/screenshots/ios-menu.png) | +### Installation +1. Clone the repository: + ```bash + git clone https://github.com/ionic-team/ionic-vue-conference-app.git + ``` +2. Navigate into the project: + ```bash + cd ionic-vue-conference-app + ``` +3. Install dependencies: + ```bash + npm install + ``` +4. Start the dev server: + ```bash + ionic serve + ``` +5. Open your browser to: + ``` + http://localhost:8100 + ``` +## 🤝 Contributing -### [Schedule Page](https://github.com/ionic-team/ionic-vue-conference-app/blob/main/src/views/SessionList.vue) - -| Material Design | iOS | -| -----------------| -----| -| ![Android Schedule](/resources/screenshots/android-schedule.png) | ![iOS Schedule](/resources/screenshots/ios-schedule.png) | - -### [Speakers Page](https://github.com/ionic-team/ionic-vue-conference-app/blob/main/src/views/SpeakerList.vue) - -| Material Design | iOS | -| -----------------| -----| -| ![Android Speakers](/resources/screenshots/android-speakers.png) | ![iOS Speakers](/resources/screenshots/ios-speakers.png) | - -### [Speaker Detail Page](https://github.com/ionic-team/ionic-vue-conference-app/blob/main/src/views/SpeakerDetail.vue) - -| Material Design | iOS | -| -----------------| -----| -| ![Android Speaker Detail](/resources/screenshots/android-speaker-detail.png) | ![iOS Speaker Detail](/resources/screenshots/ios-speaker-detail.png) | - -### [About Page](https://github.com/ionic-team/ionic-vue-conference-app/blob/main/src/views/About.vue) - -| Material Design | iOS | -| -----------------| -----| -| ![Android About](/resources/screenshots/android-about.png) | ![iOS About](/resources/screenshots/ios-about.png) | +We welcome contributions! Please see our [Contributing Guide](.github/CONTRIBUTING.md) for details on how to submit pull requests, report issues, and contribute to the project. +## 📄 License +This project is licensed under the MIT [License](./LICENSE). diff --git a/index.html b/index.html index ac54776..d41dfe6 100644 --- a/index.html +++ b/index.html @@ -2,11 +2,10 @@ - Ionic App + Ionic Conference App - - + - - + + diff --git a/package-lock.json b/package-lock.json index 3ef88b6..a0cf080 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,13 @@ { "name": "ionic-conference-app-vue", - "version": "0.1.0", + "version": "0.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ionic-conference-app-vue", - "version": "0.1.0", + "version": "0.0.0", + "license": "MIT", "dependencies": { "@capacitor/app": "5.0.6", "@capacitor/core": "5.4.0", @@ -16,9 +17,10 @@ "@ionic/storage": "^4.0.0", "@ionic/vue": "^8.0.0", "@ionic/vue-router": "^8.0.0", + "@types/leaflet": "^1.9.17", "date-fns": "^2.30.0", "ionicons": "^7.0.0", - "swiper": "^10.3.0", + "leaflet": "^1.9.4", "vue": "^3.4.21", "vue-router": "^4.3.0", "vuex": "^4.1.0" @@ -2666,12 +2668,27 @@ "@types/node": "*" } }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, "node_modules/@types/json-schema": { "version": "7.0.13", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", "dev": true }, + "node_modules/@types/leaflet": { + "version": "1.9.17", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.17.tgz", + "integrity": "sha512-IJ4K6t7I3Fh5qXbQ1uwL3CFVbCi6haW9+53oLWgdKlLP7EaS21byWFJxxqOx9y8I0AP0actXSJLVMbyvxhkUTA==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, "node_modules/@types/node": { "version": "20.6.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.3.tgz", @@ -6044,6 +6061,12 @@ "node": "> 0.8" } }, + "node_modules/leaflet": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", + "license": "BSD-2-Clause" + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -7723,24 +7746,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/swiper": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/swiper/-/swiper-10.3.0.tgz", - "integrity": "sha512-o81KZH4phL/dJxKFWpZ/zf78QxOyFMood+c86vJJO0ZeSOoniyzV8HWDsw12KOlQdm4WRxrc/6kfGImAcxcS3w==", - "funding": [ - { - "type": "patreon", - "url": "https://www.patreon.com/swiperjs" - }, - { - "type": "open_collective", - "url": "http://opencollective.com/swiper" - } - ], - "engines": { - "node": ">= 4.7.0" - } - }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", diff --git a/package.json b/package.json index 28527d6..74342b9 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,9 @@ { "name": "ionic-conference-app-vue", - "version": "0.1.0", - "private": true, + "version": "0.0.0", + "description": "Ionic Conference App", + "author": "Ionic Team ", + "license": "MIT", "type": "module", "scripts": { "dev": "vite", @@ -20,9 +22,10 @@ "@ionic/storage": "^4.0.0", "@ionic/vue": "^8.0.0", "@ionic/vue-router": "^8.0.0", + "@types/leaflet": "^1.9.17", "date-fns": "^2.30.0", "ionicons": "^7.0.0", - "swiper": "^10.3.0", + "leaflet": "^1.9.4", "vue": "^3.4.21", "vue-router": "^4.3.0", "vuex": "^4.1.0" @@ -41,6 +44,5 @@ "vite": "^4.3.9", "vitest": "^0.32.2", "vue-tsc": "^1.0.24" - }, - "description": "An Ionic project" + } } diff --git a/public/assets/icon/favicon.png b/public/assets/icon/favicon.png new file mode 100644 index 0000000..51888a7 Binary files /dev/null and b/public/assets/icon/favicon.png differ diff --git a/public/assets/img/appicon.png b/public/assets/img/appicon.png index 1c24dc0..3aa6ee2 100644 Binary files a/public/assets/img/appicon.png and b/public/assets/img/appicon.png differ diff --git a/public/assets/img/appicon.svg b/public/assets/img/appicon.svg index 5962da1..3d2a03b 100644 --- a/public/assets/img/appicon.svg +++ b/public/assets/img/appicon.svg @@ -1,3 +1,2 @@ - \ No newline at end of file + + diff --git a/public/assets/img/speaker-background.png b/public/assets/img/speaker-background.png new file mode 100644 index 0000000..220634e Binary files /dev/null and b/public/assets/img/speaker-background.png differ diff --git a/public/data/data.json b/public/data/data.json new file mode 100644 index 0000000..1cda114 --- /dev/null +++ b/public/data/data.json @@ -0,0 +1,467 @@ +{ + "schedule": [ + { + "date": "2047-05-17", + "groups": [ + { + "time": "8:00 am", + "sessions": [ + { + "name": "Breakfast", + "timeStart": "8:00 am", + "timeEnd": "9:00 am", + "location": "Dining Hall", + "tracks": ["Food"], + "id": "1" + } + ] + }, + { + "time": "9:15 am", + "sessions": [ + { + "name": "Getting Started with Ionic", + "location": "Hall 2", + "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Vue, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Vue.", + "speakerNames": ["Ted Turtle"], + "timeStart": "9:30 am", + "timeEnd": "9:45 am", + "tracks": ["Ionic"], + "id": "2" + }, + { + "name": "Ionic Tooling", + "location": "Executive Ballroom", + "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Vue, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Vue.", + "speakerNames": ["Rachel Rabbit"], + "timeStart": "9:45 am", + "timeEnd": "10:00 am", + "tracks": ["Tooling"], + "id": "3" + }, + { + "name": "University of Ionic", + "location": "Hall 3", + "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Vue, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Vue.", + "speakerNames": ["Ellie Elephant"], + "timeStart": "9:15 am", + "timeEnd": "9:30 am", + "tracks": ["Ionic"], + "id": "4" + } + ] + }, + { + "time": "10:00 am", + "sessions": [ + { + "name": "Migrating to Ionic", + "location": "Hall 1", + "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Vue, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Vue.", + "speakerNames": ["Eva Eagle", "Lionel Lion"], + "timeStart": "10:00 am", + "timeEnd": "10:15 am", + "tracks": ["Ionic"], + "id": "5" + }, + { + "name": "What's New in Vue", + "location": "Hall 3", + "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Vue, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Vue.", + "speakerNames": ["Rachel Rabbit"], + "timeStart": "10:15 am", + "timeEnd": "10:30 am", + "tracks": ["Vue"], + "id": "6" + }, + { + "name": "The Evolution of Ionicons", + "location": "Hall 2", + "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Vue, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Vue.", + "speakerNames": ["Isabella Iguana", "Eva Eagle"], + "timeStart": "10:15 am", + "timeEnd": "10:30 am", + "tracks": ["Design"], + "id": "7" + }, + { + "name": "Ionic Pro", + "location": "Grand Ballroom A", + "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Vue, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Vue.", + "speakerNames": ["Charlie Cheetah"], + "timeStart": "10:45 am", + "timeEnd": "11:00 am", + "tracks": ["Services"], + "id": "8" + } + ] + }, + { + "time": "11:00 am", + "sessions": [ + { + "name": "Ionic Workshop", + "location": "Hall 1", + "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Vue, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Vue.", + "speakerNames": ["Karl Kitten", "Lionel Lion"], + "timeStart": "11:00 am", + "timeEnd": "11:45 am", + "tracks": ["Workshop"], + "id": "9" + }, + { + "name": "Community Interaction", + "location": "Hall 3", + "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Vue, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Vue.", + "speakerNames": ["Lionel Lion", "Gino Giraffe"], + "timeStart": "11:30 am", + "timeEnd": "11:50 am", + "tracks": ["Communication"], + "id": "10" + }, + { + "name": "Navigation in Ionic", + "location": "Grand Ballroom A", + "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Vue, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Vue.", + "speakerNames": ["Rachel Rabbit", "Eva Eagle"], + "timeStart": "11:30 am", + "timeEnd": "12:00 pm", + "tracks": ["Navigation"], + "id": "11" + } + ] + }, + { + "time": "12:00 pm", + "sessions": [ + { + "name": "Lunch", + "location": "Dining Hall", + "description": "Come grab lunch with all the Ionic fanatics and talk all things Ionic", + "timeStart": "12:00 pm", + "timeEnd": "1:00 pm", + "tracks": ["Food"], + "id": "12" + } + ] + }, + { + "time": "1:00 pm", + "sessions": [ + { + "name": "Ionic in the Enterprise", + "location": "Hall 1", + "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Vue, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Vue.", + "speakerNames": ["Paul Puppy"], + "timeStart": "1:00 pm", + "timeEnd": "1:15 pm", + "tracks": ["Communication"], + "id": "13" + }, + { + "name": "Ionic Worldwide", + "location": "Hall 1", + "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Vue, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Vue.", + "speakerNames": ["Gino Giraffe"], + "timeStart": "1:15 pm", + "timeEnd": "1:30 pm", + "tracks": ["Communication"], + "id": "14" + }, + { + "name": "The Ionic Package", + "location": "Grand Ballroom B", + "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Vue, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Vue.", + "speakerNames": ["Molly Mouse", "Burt Bear"], + "timeStart": "1:30 pm", + "timeEnd": "2:00 pm", + "tracks": ["Services"], + "id": "15" + } + ] + }, + { + "time": "2:00 pm", + "sessions": [ + { + "name": "Push Notifications in Ionic", + "location": "Hall 2", + "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Vue, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Vue.", + "speakerNames": ["Burt Bear", "Charlie Cheetah"], + "timeStart": "2:00 pm", + "timeEnd": "2:30 pm", + "tracks": ["Services"], + "id": "16" + }, + { + "name": "Ionic Documentation", + "location": "Grand Ballroom B", + "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Vue, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Vue.", + "speakerNames": ["Donald Duck"], + "timeStart": "2:30 pm", + "timeEnd": "2:45 pm", + "tracks": ["Documentation"], + "id": "17" + }, + { + "name": "UX in Ionic", + "location": "Hall 3", + "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Vue, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Vue.", + "speakerNames": ["Isabella Iguana", "Ellie Elephant"], + "timeStart": "2:45 pm", + "timeEnd": "3:00 pm", + "tracks": ["Design"], + "id": "18" + } + ] + }, + { + "time": "3:00 pm", + "sessions": [ + { + "name": "Building with Ionic and Vue", + "location": "Hall 1", + "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Vue, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Vue.", + "speakerNames": ["Ted Turtle"], + "timeStart": "3:00 pm", + "timeEnd": "3:30 pm", + "tracks": ["Vue"], + "id": "19" + }, + { + "name": "Mobile States", + "location": "Hall 2", + "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Vue, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Vue.", + "speakerNames": ["Rachel Rabbit"], + "timeStart": "3:30 pm", + "timeEnd": "3:45 pm", + "tracks": ["Navigation"], + "id": "20" + } + ] + } + ] + } + ], + + "speakers": [ + { + "name": "Burt Bear", + "profilePic": "/assets/img/speakers/bear.jpg", + "instagram": "ionicframework", + "twitter": "ionicframework", + "about": "Burt is a Bear. Burt's interests include poetry, dashing space heroes, and lions.", + "title": "Software Engineer", + "location": "Everywhere", + "email": "burt@example.com", + "phone": "+1-541-754-3010", + "id": "1" + }, + { + "name": "Charlie Cheetah", + "profilePic": "/assets/img/speakers/cheetah.jpg", + "instagram": "ionicframework", + "twitter": "ionicframework", + "about": "Charlie is a Cheetah. Charlie's interests include country music, plush animals, pyrotechnics, and skeletons.", + "title": "Software Engineer", + "location": "Everywhere", + "email": "charlie@example.com", + "phone": "+1-541-754-3010", + "id": "2" + }, + { + "name": "Donald Duck", + "profilePic": "/assets/img/speakers/duck.jpg", + "instagram": "ionicframework", + "twitter": "ionicframework", + "about": "Donald is a Duck. Donald's interests include carpentry, superheroes, merpeople, and glam rock.", + "title": "Software Engineer", + "location": "Everywhere", + "email": "donald@example.com", + "phone": "+1-541-754-3010", + "id": "3" + }, + { + "name": "Eva Eagle", + "profilePic": "/assets/img/speakers/eagle.jpg", + "instagram": "ionicframework", + "twitter": "ionicframework", + "about": "Eva is an Eagle. Eva's interests include ants, seashells, and cupcakes.", + "title": "Developer Advocate", + "location": "Everywhere", + "email": "eva@example.com", + "phone": "+1-541-754-3010", + "id": "4" + }, + { + "name": "Ellie Elephant", + "profilePic": "/assets/img/speakers/elephant.jpg", + "instagram": "ionicframework", + "twitter": "ionicframework", + "about": "Ellie is an Elephant. Ellie's interests include pocket watches, pool, hand fans, and ninjas.", + "title": "Software Engineer", + "location": "Everywhere", + "email": "ellie@example.com", + "phone": "+1-541-754-3010", + "id": "5" + }, + { + "name": "Gino Giraffe", + "profilePic": "/assets/img/speakers/giraffe.jpg", + "instagram": "ionicframework", + "twitter": "ionicframework", + "about": "Gino is a Giraffe. Gino's interests include candy-making, unicorns, and birdhouses.", + "title": "Software Engineer", + "location": "Everywhere", + "email": "gino@example.com", + "phone": "+1-541-754-3010", + "id": "6" + }, + { + "name": "Isabella Iguana", + "profilePic": "/assets/img/speakers/iguana.jpg", + "instagram": "ionicframework", + "twitter": "ionicframework", + "about": "Isabella is an Iguana. Isabella's interests include crystals, architecture, and candle-making.", + "title": "Software Engineer", + "location": "Everywhere", + "email": "isabella@example.com", + "phone": "+1-541-754-3010", + "id": "7" + }, + { + "name": "Karl Kitten", + "profilePic": "/assets/img/speakers/kitten.jpg", + "instagram": "ionicframework", + "twitter": "ionicframework", + "about": "Karl is a Kitten. Karl's interests include skiing, jewelry, and needlepoint.", + "title": "Developer Advocate", + "location": "Everywhere", + "email": "karl@example.com", + "phone": "+1-541-754-3010", + "id": "8" + }, + { + "name": "Lionel Lion", + "profilePic": "/assets/img/speakers/lion.jpg", + "instagram": "ionicframework", + "twitter": "ionicframework", + "about": "Lionel is a Lion. Lionel's interests include lizards and mathematics.", + "title": "Developer Advocate", + "location": "Everywhere", + "email": "lionel@example.com", + "phone": "+1-541-754-3010", + "id": "9" + }, + { + "name": "Molly Mouse", + "profilePic": "/assets/img/speakers/mouse.jpg", + "instagram": "ionicframework", + "twitter": "ionicframework", + "about": "Molly is a Mouse. Molly's interests include werewolves and magic.", + "title": "Software Engineer", + "location": "Everywhere", + "email": "molly@example.com", + "phone": "+1-541-754-3010", + "id": "10" + }, + { + "name": "Paul Puppy", + "profilePic": "/assets/img/speakers/puppy.jpg", + "instagram": "ionicframework", + "twitter": "ionicframework", + "about": "Paul is a Puppy. Paul's interests include maps, whales, and dragons.", + "title": "Software Engineer", + "location": "Everywhere", + "email": "paul@example.com", + "phone": "+1-541-754-3010", + "id": "11" + }, + { + "name": "Rachel Rabbit", + "profilePic": "/assets/img/speakers/rabbit.jpg", + "instagram": "ionicframework", + "twitter": "ionicframework", + "about": "Rachel is a Rabbit. Rachel's interests include clowns, skeletons, and yo-yos.", + "title": "Senior Software Engineer", + "location": "Everywhere", + "email": "rachel@example.com", + "phone": "+1-541-754-3010", + "id": "12" + }, + { + "name": "Ted Turtle", + "profilePic": "/assets/img/speakers/turtle.jpg", + "instagram": "ionicframework", + "twitter": "ionicframework", + "about": "Ted is a Turtle. Ted's interests include butterflies, skiing, and cupcakes.", + "title": "Software Engineer", + "location": "Everywhere", + "email": "ted@example.com", + "phone": "+1-541-754-3010", + "id": "13" + } + ], + + "map": [ + { + "name": "Monona Terrace Convention Center", + "lat": 43.071584, + "lng": -89.38012, + "center": true + }, + { + "name": "Ionic HQ", + "lat": 43.074395, + "lng": -89.381056 + }, + { + "name": "Afterparty - Brocach Irish Pub", + "lat": 43.07336, + "lng": -89.38335 + } + ], + + "tracks": [ + { + "name": "Vue", + "icon": "logo-vue" + }, + { + "name": "Documentation", + "icon": "document" + }, + { + "name": "Food", + "icon": "restaurant" + }, + { + "name": "Ionic", + "icon": "logo-ionic" + }, + { + "name": "Tooling", + "icon": "hammer" + }, + { + "name": "Design", + "icon": "color-palette" + }, + { + "name": "Services", + "icon": "cog" + }, + { + "name": "Workshop", + "icon": "construct" + }, + { + "name": "Communication", + "icon": "call" + }, + { + "name": "Navigation", + "icon": "compass" + } + ] +} diff --git a/public/data/locations.json b/public/data/locations.json deleted file mode 100644 index 7743cc9..0000000 --- a/public/data/locations.json +++ /dev/null @@ -1,23 +0,0 @@ -[ - { - "id": 1, - "name": "Map Center", - "lat": 43.071584, - "lng": -89.380120 - }, { - "id": 2, - "name": "Monona Terrace Convention Center", - "lat": 43.071584, - "lng": -89.380120 - }, { - "id": 3, - "name": "Ionic HQ", - "lat": 43.074395, - "lng": -89.381056 - }, { - "id": 4, - "name": "Afterparty - Brocach Irish Pub", - "lat": 43.07336, - "lng": -89.38335 - } -] diff --git a/public/data/sessions.json b/public/data/sessions.json deleted file mode 100755 index d1e62eb..0000000 --- a/public/data/sessions.json +++ /dev/null @@ -1,172 +0,0 @@ -[{ - "id": 1, - "dateTimeStart": "2047-05-17T08:00", - "dateTimeEnd": "2047-05-17T09:00", - "name": "Breakfast", - "location": "Main hallway", - "description": "Come grab breakfast with all the Ionic fanatics and talk all things Ionic", - "speakerIds": [], - "tracks": ["Food"] -}, { - "id": 2, - "dateTimeStart": "2047-05-17T09:00", - "dateTimeEnd": "2047-05-17T09:30", - "name": "Introduction to Appcamp.io", - "location": "Room 2203", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Angular, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Angular.", - "speakerIds": [5], - "tracks": ["Ionic"] -}, { - "id": 3, - "dateTimeStart": "2047-05-17T09:30", - "dateTimeEnd": "2047-05-17T09:45", - "name": "Getting started with Ionic", - "location": "Room 2202", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Angular, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Angular.", - "speakerIds": [13], - "tracks": ["Ionic"] -}, { - "id": 4, - "dateTimeStart": "2047-05-17T09:45", - "dateTimeEnd": "2047-05-17T10:00", - "name": "Tooling for Ionic", - "location": "Room 2201", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Angular, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Angular.", - "speakerIds": [12], - "tracks": ["Tooling"] -}, { - "id": 5, - "dateTimeStart": "2047-05-17T10:00", - "dateTimeEnd": "2047-05-17T10:15", - "name": "Migrating to Ionic 7", - "location": "Room 2201", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Angular, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Angular.", - "speakerIds": [4, 9], - "tracks": ["Ionic"] -}, { - "id": 6, - "dateTimeStart": "2047-05-17T10:15", - "dateTimeEnd": "2047-05-17T10:30", - "name": "The evolution of Ionicons", - "location": "Room 2202", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Angular, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Angular.", - "speakerIds": [7, 4], - "tracks": ["Design"] -}, { - "id": 7, - "dateTimeStart": "2047-05-17T10:30", - "dateTimeEnd": "2047-05-17T11:00", - "name": "Ionic.io Services", - "location": "Room 2202", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Angular, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Angular.", - "speakerIds": [2], - "tracks": ["Services"] -}, { - "id": 8, - "dateTimeStart": "2047-05-17T11:00", - "dateTimeEnd": "2047-05-17T11:45", - "name": "Ionic Workshop", - "location": "Room 2201", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Angular, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Angular.", - "speakerIds": [8, 9], - "tracks": ["Workshop"] -}, { - "id": 9, - "dateTimeStart": "2047-05-17T11:30", - "dateTimeEnd": "2047-05-17T11:50", - "name": "Community Interaction", - "location": "Room 2203", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Angular, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Angular.", - "speakerIds": [9, 6], - "tracks": ["Communication"] -}, { - "id": 10, - "dateTimeStart": "2047-05-17T11:30", - "dateTimeEnd": "2047-05-17T12:00", - "name": "Navigation in Ionic", - "location": "Room 2203", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Angular, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Angular.", - "speakerIds": [12, 4], - "tracks": ["Navigation"] -}, { - "id": 11, - "dateTimeStart": "2047-05-17T12:00", - "dateTimeEnd": "2047-05-17T13:00", - "name": "Lunch", - "location": "Auditorium", - "description": "Come grab lunch with all the Ionic fanatics and talk all things Ionic", - "speakerIds": [], - "tracks": ["Food"] -}, { - "id": 12, - "dateTimeStart": "2047-05-17T13:00", - "dateTimeEnd": "2047-05-17T13:15", - "name": "Ionic in the Enterprise", - "location": "Room 2201", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Angular, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Angular.", - "speakerIds": [11], - "tracks": ["Communication"] -}, { - "id": 13, - "dateTimeStart": "2047-05-17T13:15", - "dateTimeEnd": "2047-05-17T13:30", - "name": "Ionic Worldwide", - "location": "Room 2201", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Angular, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Angular.", - "speakerIds": [6], - "tracks": ["Communication"] -}, { - "id": 14, - "dateTimeStart": "2047-05-17T13:30", - "dateTimeEnd": "2047-05-17T14:00", - "name": "The Ionic package service", - "location": "Room 2203", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Angular, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Angular.", - "speakerIds": [10, 1], - "tracks": ["Services"] -}, { - "id": 15, - "dateTimeStart": "2047-05-17T14:00", - "dateTimeEnd": "2047-05-17T14:30", - "name": "Push Notifications in Ionic", - "location": "Room 2202", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Angular, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Angular.", - "speakerIds": [1, 2], - "tracks": ["Services"] -}, { - "id": 16, - "dateTimeStart": "2047-05-17T14:30", - "dateTimeEnd": "2047-05-17T14:45", - "name": "Ionic Documentation", - "location": "Room 2202", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Angular, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Angular.", - "speakerIds": [3], - "tracks": ["Documentation"] -}, { - "id": 17, - "dateTimeStart": "2047-05-17T14:45", - "dateTimeEnd": "2047-05-17T15:00", - "name": "UX planning in Ionic", - "location": "Room 2203", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Angular, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Angular.", - "speakerIds": [7, 5], - "tracks": ["Design"] -}, { - "id": 18, - "dateTimeStart": "2047-05-17T15:00", - "dateTimeEnd": "2047-05-17T15:30", - "name": "Directives in Ionic", - "location": "Room 2201", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Angular, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Angular.", - "speakerIds": [13], - "tracks": ["Angular"] -}, { - "id": 19, - "dateTimeStart": "2047-05-17T15:30", - "dateTimeEnd": "2047-05-17T15:45", - "name": "Mobile States", - "location": "Room 2202", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Angular, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Angular.", - "speakerIds": [12], - "tracks": ["Navigation"] -}] diff --git a/public/data/speakers.json b/public/data/speakers.json deleted file mode 100644 index 4a2d58c..0000000 --- a/public/data/speakers.json +++ /dev/null @@ -1,131 +0,0 @@ -[{ - "id": 1, - "name": "Burt Bear", - "title": "Software Engineer", - "profilePic": "/assets/img/speakers/bear.jpg", - "twitter": "ionicframework", - "about": "Burt is a Bear.", - "location": "Everywhere", - "email": "burt@example.com", - "phone": "+1-541-754-3010" -}, { - "id": 2, - "name": "Charlie Cheetah", - "title": "Software Engineer", - "profilePic": "/assets/img/speakers/cheetah.jpg", - "twitter": "ionicframework", - "about": "Charlie is a Cheetah.", - "location": "Everywhere", - "email": "charlie@example.com", - "phone": "+1-541-754-3010" -}, { - "id": 3, - "name": "Donald Duck", - "title": "Software Engineer", - "profilePic": "/assets/img/speakers/duck.jpg", - "twitter": "ionicframework", - "about": "Donald is a Duck.", - "location": "Everywhere", - "email": "donald@example.com", - "phone": "+1-541-754-3010" -}, { - "id": 4, - "name": "Eva Eagle", - "title": "Software Engineer", - "profilePic": "/assets/img/speakers/eagle.jpg", - "twitter": "ionicframework", - "about": "Eva is an Eagle.", - "location": "Everywhere", - "email": "eva@example.com", - "phone": "+1-541-754-3010" -}, { - "id": 5, - "name": "Ellie Elephant", - "title": "Software Engineer", - "profilePic": "/assets/img/speakers/elephant.jpg", - "twitter": "ionicframework", - "about": "Ellie is an Elephant.", - "location": "Everywhere", - "email": "ellie@example.com", - "phone": "+1-541-754-3010" -}, { - "id": 6, - "name": "Gino Giraffe", - "title": "Software Engineer", - "profilePic": "/assets/img/speakers/giraffe.jpg", - "twitter": "ionicframework", - "about": "Gino is a Giraffe.", - "location": "Everywhere", - "email": "gino@example.com", - "phone": "+1-541-754-3010" -}, { - "id": 7, - "name": "Isabella Iguana", - "title": "Software Engineer", - "profilePic": "/assets/img/speakers/iguana.jpg", - "twitter": "ionicframework", - "about": "Isabella is an Iguana.", - "location": "Everywhere", - "email": "isabella@example.com", - "phone": "+1-541-754-3010" -}, { - "id": 8, - "name": "Karl Kitten", - "title": "Software Engineer", - "profilePic": "/assets/img/speakers/kitten.jpg", - "twitter": "ionicframework", - "about": "Karl is a Kitten.", - "location": "Everywhere", - "email": "karl@example.com", - "phone": "+1-541-754-3010" -}, { - "id": 9, - "name": "Lionel Lion", - "title": "Software Engineer", - "profilePic": "/assets/img/speakers/lion.jpg", - "twitter": "ionicframework", - "about": "Lionel is a Lion.", - "location": "Everywhere", - "email": "lionel@example.com", - "phone": "+1-541-754-3010" -}, { - "id": 10, - "name": "Molly Mouse", - "title": "Software Engineer", - "profilePic": "/assets/img/speakers/mouse.jpg", - "twitter": "ionicframework", - "about": "Molly is a Mouse.", - "location": "Everywhere", - "email": "molly@example.com", - "phone": "+1-541-754-3010" -}, { - "id": 11, - "name": "Paul Puppy", - "title": "Software Engineer", - "profilePic": "/assets/img/speakers/puppy.jpg", - "twitter": "ionicframework", - "about": "Paul is a Puppy.", - "location": "Everywhere", - "email": "paul@example.com", - "phone": "+1-541-754-3010" -}, { - "id": 12, - "name": "Rachel Rabbit", - "title": "Software Engineer", - "profilePic": "/assets/img/speakers/rabbit.jpg", - "twitter": "ionicframework", - "about": "Rachel is a Rabbit.", - "location": "Everywhere", - "email": "rachel@example.com", - "phone": "+1-541-754-3010" -}, { - "id": 13, - "name": "Ted Turtle", - "title": "Software Engineer", - "profilePic": "/assets/img/speakers/turtle.jpg", - "twitter": "ionicframework", - "about": "Ted is a Turtle.", - "location": "Everywhere", - "email": "ted@example.com", - "phone": "+1-541-754-3010" -}] diff --git a/public/data/tracks.json b/public/data/tracks.json deleted file mode 100644 index f2a01df..0000000 --- a/public/data/tracks.json +++ /dev/null @@ -1,42 +0,0 @@ -[ - { - "name": "Angular", - "icon": "logoAngular" - }, - { - "name": "Documentation", - "icon": "document" - }, - { - "name": "Food", - "icon": "restaurant" - }, - { - "name": "Ionic", - "icon": "logoIonic" - }, - { - "name": "Tooling", - "icon": "hammer" - }, - { - "name": "Design", - "icon": "colorPalette" - }, - { - "name": "Services", - "icon": "cog" - }, - { - "name": "Workshop", - "icon": "construct" - }, - { - "name": "Communication", - "icon": "call" - }, - { - "name": "Navigation", - "icon": "compass" - } -] \ No newline at end of file diff --git a/resources/screenshots/android-about.png b/resources/screenshots/android-about.png deleted file mode 100644 index 4a742f2..0000000 Binary files a/resources/screenshots/android-about.png and /dev/null differ diff --git a/resources/screenshots/android-menu.png b/resources/screenshots/android-menu.png deleted file mode 100644 index 2227764..0000000 Binary files a/resources/screenshots/android-menu.png and /dev/null differ diff --git a/resources/screenshots/android-schedule.png b/resources/screenshots/android-schedule.png deleted file mode 100644 index 7c7629a..0000000 Binary files a/resources/screenshots/android-schedule.png and /dev/null differ diff --git a/resources/screenshots/android-speaker-detail.png b/resources/screenshots/android-speaker-detail.png deleted file mode 100644 index 9aca16f..0000000 Binary files a/resources/screenshots/android-speaker-detail.png and /dev/null differ diff --git a/resources/screenshots/android-speakers.png b/resources/screenshots/android-speakers.png deleted file mode 100644 index b59ab00..0000000 Binary files a/resources/screenshots/android-speakers.png and /dev/null differ diff --git a/resources/screenshots/ios-about.png b/resources/screenshots/ios-about.png deleted file mode 100644 index 86a8e81..0000000 Binary files a/resources/screenshots/ios-about.png and /dev/null differ diff --git a/resources/screenshots/ios-menu.png b/resources/screenshots/ios-menu.png deleted file mode 100644 index 4803f31..0000000 Binary files a/resources/screenshots/ios-menu.png and /dev/null differ diff --git a/resources/screenshots/ios-schedule.png b/resources/screenshots/ios-schedule.png deleted file mode 100644 index c581de1..0000000 Binary files a/resources/screenshots/ios-schedule.png and /dev/null differ diff --git a/resources/screenshots/ios-speaker-detail.png b/resources/screenshots/ios-speaker-detail.png deleted file mode 100644 index 761a9ec..0000000 Binary files a/resources/screenshots/ios-speaker-detail.png and /dev/null differ diff --git a/resources/screenshots/ios-speakers.png b/resources/screenshots/ios-speakers.png deleted file mode 100644 index b938fd1..0000000 Binary files a/resources/screenshots/ios-speakers.png and /dev/null differ diff --git a/src/App.vue b/src/App.vue index 900da57..7de93b7 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,9 +1,10 @@ @@ -11,10 +12,11 @@ + + diff --git a/src/filters/dateFormat.ts b/src/filters/dateFormat.ts index af6cc15..8be39c5 100644 --- a/src/filters/dateFormat.ts +++ b/src/filters/dateFormat.ts @@ -1,15 +1,15 @@ -import { format as dateFnsFormat } from 'date-fns'; +import { format as dateFnsFormat, parseISO } from 'date-fns'; export function dateFormat(dateString: string, formatString: string): string { if (!dateString) { return ''; } - const parsedTime = new Date(dateString); - - if (isNaN(parsedTime.getTime())) { - return ''; + try { + const date = parseISO(dateString); + return dateFnsFormat(date, formatString); + } catch (error) { + console.error('Error formatting date:', error); + return dateString; } - - return dateFnsFormat(parsedTime, formatString); } diff --git a/src/main.ts b/src/main.ts index 5679402..f52f427 100644 --- a/src/main.ts +++ b/src/main.ts @@ -38,9 +38,8 @@ import '@ionic/core/css/ionic.bundle.css'; // import "@ionic/vue/css/palettes/dark.system.css"; import "@ionic/vue/css/palettes/dark.class.css"; -import { register } from 'swiper/element/bundle'; - -register(); +/* Leaflet CSS */ +import 'leaflet/dist/leaflet.css'; const app = createApp(App) .use(IonicVue) diff --git a/src/router.ts b/src/router.ts index 731bb1b..f1626cf 100644 --- a/src/router.ts +++ b/src/router.ts @@ -1,6 +1,8 @@ import { createRouter, createWebHistory } from '@ionic/vue-router'; import { RouteRecordRaw } from 'vue-router'; import store from './store'; +import { IonicVue } from '@ionic/vue'; +import { App } from 'vue'; const privateRoute: RouteRecordRaw['beforeEnter'] = function(to, from, next) { if (!store.state.user.isAuthenticated) { @@ -10,6 +12,20 @@ const privateRoute: RouteRecordRaw['beforeEnter'] = function(to, from, next) { } }; +const ensureSessionData: RouteRecordRaw['beforeEnter'] = async function(to, from, next) { + if (store.state.sessions.sessions.length === 0) { + await store.dispatch("loadSessionData"); + } + next(); +}; + +const ensureSpeakerData: RouteRecordRaw['beforeEnter'] = async function(to, from, next) { + if (store.state.speakers.speakers.length === 0) { + await store.dispatch("loadSpeakerData"); + } + next(); +}; + const routes: Array = [ { path: '/tutorial', @@ -54,9 +70,9 @@ const routes: Array = [ { name: 'session-detail', path: 'schedule/session/:sessionId', - component: () => import('@/views/SessionDetail.vue') + component: () => import('@/views/SessionDetail.vue'), + beforeEnter: ensureSessionData }, - { path: 'speakers', name: 'speakers', @@ -65,12 +81,14 @@ const routes: Array = [ { path: 'speakers/speaker/:speakerId', name: 'speaker-detail', - component: () => import('@/views/SpeakerDetail.vue') + component: () => import('@/views/SpeakerDetail.vue'), + beforeEnter: ensureSpeakerData }, { path: 'speakers/session/:sessionId', name: 'speaker-session-detail', - component: () => import('@/views/SessionDetail.vue') + component: () => import('@/views/SessionDetail.vue'), + beforeEnter: ensureSessionData }, { path: 'map', @@ -88,9 +106,16 @@ const routes: Array = [ ]; const router = createRouter({ - // @ts-ignore - history: createWebHistory(import.meta.env.BASE_URL), + history: createWebHistory(), routes }); -export default router; \ No newline at end of file +export function configureRouter(app: App) { + app.use(router); + app.use(IonicVue, { + maxPageCacheSize: 10 + }); + return router; +} + +export default router; diff --git a/src/store/modules/locations.ts b/src/store/modules/locations.ts index 0b92df4..3bc8f52 100644 --- a/src/store/modules/locations.ts +++ b/src/store/modules/locations.ts @@ -2,41 +2,57 @@ import { Module } from 'vuex'; export interface Location { id: number; - name?: string; + name: string; lat: number; lng: number; + center?: boolean; } export interface LocationState { - mapCenterId: number - locations: Location[] + locations: Location[]; } -const locationStore: Module = { +const locationsModule: Module = { + namespaced: true, state: { - mapCenterId: 1, locations: [] }, mutations: { - updateLocations(state, locations: Location[]) { + setLocations(state, locations: Location[]) { state.locations = locations; - }, - }, - actions: { - async loadLocationData({ commit }) { - const response = await fetch('/data/locations.json'); - const data = await response.json(); - commit('updateLocations', data); } }, - getters: { - mapCenter(state) { - return state.locations.find(l => l.id === state.mapCenterId) - }, - allLocations(state) { - return state.locations.filter(l => l.id !== state.mapCenterId) + actions: { + async loadLocations({ commit }) { + try { + const response = await fetch('/data/data.json'); + const data = await response.json(); + + if (data.map && Array.isArray(data.map)) { + // Add IDs to locations + const locations = data.map.map((location: any, index: number) => ({ + ...location, + id: index + 1 + })); + commit('setLocations', locations); + } else { + throw new Error('Invalid data format: map array not found'); + } + } catch (error) { + console.error('Error loading locations:', error); + // Set default locations if data cannot be loaded + commit('setLocations', [ + { + id: 1, + name: 'Monona Terrace Convention Center', + lat: 43.071584, + lng: -89.38012, + center: true + } + ]); + } } } }; -export default locationStore; +export default locationsModule; diff --git a/src/store/modules/sessions.ts b/src/store/modules/sessions.ts index dd7134b..8fffa9a 100644 --- a/src/store/modules/sessions.ts +++ b/src/store/modules/sessions.ts @@ -1,16 +1,18 @@ import { Module } from 'vuex'; -import { parse as parseDate } from 'date-fns'; +import { parse as parseDate, format as formatDate } from 'date-fns'; export interface Session { id: number; - dateTimeStart: string; - dateTimeEnd: string; + timeStart: string; + timeEnd: string; name: string; location: string; description: string; speakerIds: number[]; tracks: string[]; selectedTrackFilters: string[]; + groupTime: string; + hide?: boolean; } export interface SessionState { @@ -21,6 +23,7 @@ export interface SessionState { tracks: any[]; selectedTrackFilters: string[]; isFirstLoad: boolean; + schedule: any[]; } export interface SessionGroup { @@ -36,7 +39,8 @@ const defaultState: SessionState = { favoriteSessions: [], tracks: [], selectedTrackFilters: [], - isFirstLoad: true + isFirstLoad: true, + schedule: [] } const sessionStore: Module = { @@ -45,6 +49,9 @@ const sessionStore: Module = { updateSessions(state, sessions: Session[]) { state.sessions = sessions; }, + updateSchedule(state, schedule: any[]) { + state.schedule = schedule; + }, setSearchText(state, searchText: string) { state.searchText = searchText; }, @@ -81,8 +88,8 @@ const sessionStore: Module = { }, }, actions: { - loadSessionData({ commit }) { - return fetch('/data/sessions.json') + loadSessionData({ commit, state }) { + return fetch('/data/data.json') .then(response => { if (!response.ok) { throw Error(`HTTP error! Status: ${response.status}`); @@ -90,26 +97,54 @@ const sessionStore: Module = { return response.json(); }) .then(data => { - commit('updateSessions', data); + commit('updateSchedule', data.schedule); + + // Create a map of speaker names to IDs + const speakerNameToId = new Map( + data.speakers.map((s: any) => [s.name, parseInt(s.id)]) + ); + + const sessions = data.schedule[0].groups.flatMap((group: any) => + group.sessions.map((session: any) => ({ + id: parseInt(session.id), + timeStart: session.timeStart, + timeEnd: session.timeEnd, + name: session.name, + location: session.location, + description: session.description || '', + speakerIds: (session.speakerNames || []).map((name: string) => speakerNameToId.get(name)), + tracks: session.tracks, + selectedTrackFilters: [], + groupTime: group.time + })) + ); + commit('updateSessions', sessions); + + // If this is the first load, initialize all tracks as selected + if (state.isFirstLoad) { + const allTracks = [...new Set(sessions.flatMap((s: Session) => s.tracks))]; + commit('updateTrackFilters', allTracks); + commit('setFirstLoad', false); + } }) .catch(error => { console.error('Error loading session data:', error); }); }, fetchTracks({ commit }) { - return fetch('/data/tracks.json') - .then(response => { - if (!response.ok) { - throw Error(`HTTP error! Status: ${response.status}`); - } - return response.json(); - }) - .then(data => { - commit('setTracks', data); - }) - .catch(error => { - console.error('Error loading session data:', error); - }); + return fetch('/data/data.json') + .then(response => { + if (!response.ok) { + throw Error(`HTTP error! Status: ${response.status}`); + } + return response.json(); + }) + .then(data => { + commit('setTracks', data.tracks); + }) + .catch(error => { + console.error('Error loading tracks data:', error); + }); }, setSearchText({ commit }, searchText: string) { commit('setSearchText', searchText) @@ -134,17 +169,17 @@ const sessionStore: Module = { }, setSelectedTrackFilters({ commit }, trackFilters) { commit('updateSelectedTrackFilters', trackFilters); - }, + } }, getters: { conferenceStart(state) { const firstSession = state.sessions .concat() .sort((a, b) => ( - parseDate(a.dateTimeStart, 'yyyy-MM-dd HH:mm:ss', new Date()).valueOf() - - parseDate(b.dateTimeStart, 'yyyy-MM-dd HH:mm:ss', new Date()).valueOf() + parseDate(a.timeStart, 'HH:mm:ss', new Date()).valueOf() - + parseDate(b.timeStart, 'HH:mm:ss', new Date()).valueOf() ))[0]; - return firstSession ? firstSession.dateTimeStart : null; + return firstSession ? firstSession.timeStart : null; }, allTracks(state) { return state.sessions @@ -153,28 +188,43 @@ const sessionStore: Module = { .sort(); }, allTracksFilter(state) { - return state.tracks; + return state.tracks + ? state.tracks.slice().sort((a, b) => a.name.localeCompare(b.name)) + : []; }, allFiltered(state) { - let searchSessions = searchText(state.searchText); - let searchTracks = filterByTrack(state.trackFilters); + return state.sessions.filter((session: Session) => { + // If no tracks are selected, show no sessions + if (state.trackFilters.length === 0) return false; - return state.sessions - .filter(searchSessions) - .filter(searchTracks); + // Check if session matches track filters + const matchesTracks = session.tracks.every(track => state.trackFilters.includes(track)); + + // Check if session matches search text + const matchesSearch = state.searchText + ? session.name.toLowerCase().includes(state.searchText.toLowerCase()) + : true; + + return matchesTracks && matchesSearch; + }); }, favoritesFiltered(state) { - let searchSessions = searchText(state.searchText); - let searchTracks = filterByTrack(state.trackFilters); + return state.sessions.filter((session: Session) => { + if (!state.favoriteSessions.includes(session.id)) return false; - function isFavorite(session: Session) { - return state.favoriteSessions.indexOf(session.id) !== -1; - } + // If no tracks are selected, show no sessions + if (state.trackFilters.length === 0) return false; - return state.sessions - .filter(isFavorite) - .filter(searchSessions) - .filter(searchTracks); + // Check if session matches track filters + const matchesTracks = session.tracks.every(track => state.trackFilters.includes(track)); + + // Check if session matches search text + const matchesSearch = state.searchText + ? session.name.toLowerCase().includes(state.searchText.toLowerCase()) + : true; + + return matchesTracks && matchesSearch; + }); } } }; diff --git a/src/store/modules/speakers.ts b/src/store/modules/speakers.ts index b37bddd..be7129c 100644 --- a/src/store/modules/speakers.ts +++ b/src/store/modules/speakers.ts @@ -1,15 +1,19 @@ import { Module } from 'vuex'; +import { Session } from './sessions'; export interface Speaker { id: number; name: string; profilePic: string; twitter: string; + github: string; + instagram: string; about: string; title: string; location: string; email: string; phone: string; + sessions: Session[]; } export interface SpeakerState { @@ -25,11 +29,55 @@ const speakerStore: Module = { state.speakers = speakers; }, }, + getters: { + allSpeakers: (state): Speaker[] => state.speakers, + + // Get a specific speaker by ID + getSpeakerById: (state) => (id: number): Speaker | undefined => { + return state.speakers.find(speaker => speaker.id === id); + }, + + // Get multiple speakers by their IDs + getSpeakersByIds: (state) => (ids: number[]): Speaker[] => { + return state.speakers.filter(speaker => ids.includes(speaker.id)); + }, + + // Get speakers sorted by name + getSpeakersSortedByName: (state): Speaker[] => { + return [...state.speakers].sort((a, b) => a.name.localeCompare(b.name)); + } + }, actions: { - async loadSpeakerData({ commit }) { - const response = await fetch('/data/speakers.json'); - const data = await response.json(); - commit('updateSpeakers', data); + loadSpeakerData({ commit }) { + return fetch('/data/data.json') + .then(response => { + if (!response.ok) { + throw Error(`HTTP error! Status: ${response.status}`); + } + return response.json(); + }) + .then(data => { + const speakers = data.speakers.map((speaker: any): Speaker => ({ + id: parseInt(speaker.id), + name: speaker.name || '', + profilePic: speaker.profilePic, + twitter: speaker.twitter || '', + github: speaker.github || '', + instagram: speaker.instagram || '', + about: speaker.about || '', + title: speaker.title || '', + location: speaker.location || '', + email: speaker.email || '', + phone: speaker.phone || '', + sessions: speaker.sessions || [] + })); + commit('updateSpeakers', speakers); + return speakers; + }) + .catch(error => { + console.error('Error loading speaker data:', error); + throw error; + }); } } }; diff --git a/src/theme/custom.css b/src/theme/custom.css index 947792b..e69de29 100644 --- a/src/theme/custom.css +++ b/src/theme/custom.css @@ -1,89 +0,0 @@ -ion-menu ion-content { - --padding-top: 20px; - --padding-bottom: 20px; - --background: var(--ion-item-background, var(--ion-background-color, #ffffff)); - } - - /* Remove background transitions for switching themes */ - ion-menu ion-item { - --transition: none; - } - - ion-item.selected { - --color: var(--ion-color-primary); - } - - /* - * Material Design Menu - */ - ion-menu.md ion-list { - padding: 20px 0; - } - - ion-menu.md ion-list-header { - padding-right: 18px; - padding-left: 18px; - - font-weight: 450; - - letter-spacing: .1em; - - text-transform: uppercase; - } - - ion-menu.md ion-item { - --padding-start: 18px; - - margin-right: 10px; - - border-radius: 0 50px 50px 0; - - font-weight: 500; - } - - ion-menu.md ion-item.selected { - --background: rgb(var(--ion-color-primary-rgb) 0.14); - } - - ion-menu.md ion-item.selected ion-icon { - color: var(--ion-color-primary); - } - - ion-menu.md ion-list-header, - ion-menu.md ion-item ion-icon { - color: var(--ion-color-step-650, #5f6368); - } - - ion-menu.md ion-list:not(:last-of-type) { - border-bottom: 1px solid var(--ion-color-step-150, #d7d8da); - } - - - /* - * iOS Menu - */ - ion-menu.ios ion-list-header { - margin-bottom: 8px; - - padding-right: 16px; - padding-left: 16px; - } - - ion-menu.ios ion-list { - padding: 20px 0 0; - } - - ion-menu.ios ion-item { - --padding-start: 16px; - --min-height: 50px; - } - - ion-menu.ios ion-item ion-icon { - color: #73849a; - - font-size: 24px; - } - - ion-menu.ios ion-item.selected ion-icon { - color: var(--ion-color-primary); - } diff --git a/src/theme/variables.css b/src/theme/variables.css index c70fafe..18c1d85 100644 --- a/src/theme/variables.css +++ b/src/theme/variables.css @@ -18,114 +18,177 @@ * https://ionicframework.com/docs/theming/colors#new-color-creator */ - :root { +:root { + --ion-color-primary: #3880ff; + --ion-color-primary-rgb: 56, 128, 255; + --ion-color-primary-contrast: #ffffff; + --ion-color-primary-contrast-rgb: 255, 255, 255; + --ion-color-primary-shade: #3171e0; + --ion-color-primary-tint: #4c8dff; + + --ion-color-secondary: #3dc2ff; + --ion-color-secondary-rgb: 61, 194, 255; + --ion-color-secondary-contrast: #ffffff; + --ion-color-secondary-contrast-rgb: 255, 255, 255; + --ion-color-secondary-shade: #36abe0; + --ion-color-secondary-tint: #50c8ff; + + --ion-color-tertiary: #5260ff; + --ion-color-tertiary-rgb: 82, 96, 255; + --ion-color-tertiary-contrast: #ffffff; + --ion-color-tertiary-contrast-rgb: 255, 255, 255; + --ion-color-tertiary-shade: #4854e0; + --ion-color-tertiary-tint: #6370ff; + + --ion-color-success: #2dd36f; + --ion-color-success-rgb: 45, 211, 111; + --ion-color-success-contrast: #ffffff; + --ion-color-success-contrast-rgb: 255, 255, 255; + --ion-color-success-shade: #28ba62; + --ion-color-success-tint: #42d77d; + + --ion-color-warning: #ffc409; + --ion-color-warning-rgb: 255, 196, 9; + --ion-color-warning-contrast: #000000; + --ion-color-warning-contrast-rgb: 0, 0, 0; + --ion-color-warning-shade: #e0ac08; + --ion-color-warning-tint: #ffca22; + + --ion-color-danger: #eb445a; + --ion-color-danger-rgb: 235, 68, 90; + --ion-color-danger-contrast: #ffffff; + --ion-color-danger-contrast-rgb: 255, 255, 255; + --ion-color-danger-shade: #cf3c4f; + --ion-color-danger-tint: #ed576b; + + --ion-color-dark: #222428; + --ion-color-dark-rgb: 34, 36, 40; + --ion-color-dark-contrast: #ffffff; + --ion-color-dark-contrast-rgb: 255, 255, 255; + --ion-color-dark-shade: #1e2023; + --ion-color-dark-tint: #383a3e; + + --ion-color-medium: #92949c; + --ion-color-medium-rgb: 146, 148, 156; + --ion-color-medium-contrast: #ffffff; + --ion-color-medium-contrast-rgb: 255, 255, 255; + --ion-color-medium-shade: #808289; + --ion-color-medium-tint: #9d9fa6; + + --ion-color-light: #f4f5f8; + --ion-color-light-rgb: 244, 245, 248; + --ion-color-light-contrast: #000000; + --ion-color-light-contrast-rgb: 0, 0, 0; + --ion-color-light-shade: #d7d8da; + --ion-color-light-tint: #f5f6f9; + --ion-color-favorite: #69bb7b; - --ion-color-favorite-rgb: 105,187,123; + --ion-color-favorite-rgb: 105, 187, 123; --ion-color-favorite-contrast: #ffffff; - --ion-color-favorite-contrast-rgb: 255,255,255; + --ion-color-favorite-contrast-rgb: 255, 255, 255; --ion-color-favorite-shade: #5ca56c; --ion-color-favorite-tint: #78c288; --ion-color-twitter: #1da1f4; - --ion-color-twitter-rgb: 29,161,244; + --ion-color-twitter-rgb: 29, 161, 244; --ion-color-twitter-contrast: #ffffff; - --ion-color-twitter-contrast-rgb: 255,255,255; + --ion-color-twitter-contrast-rgb: 255, 255, 255; --ion-color-twitter-shade: #1a8ed7; --ion-color-twitter-tint: #34aaf5; --ion-color-instagram: #5956d8; - --ion-color-instagram-rgb: 89,86,216; + --ion-color-instagram-rgb: 89, 86, 216; --ion-color-instagram-contrast: #ffffff; - --ion-color-instagram-contrast-rgb: 255,255,255; + --ion-color-instagram-contrast-rgb: 255, 255, 255; --ion-color-instagram-shade: #4e4cbe; --ion-color-instagram-tint: #6a67dc; --ion-color-vimeo: #23b6ea; - --ion-color-vimeo-rgb: 35,182,234; + --ion-color-vimeo-rgb: 35, 182, 234; --ion-color-vimeo-contrast: #ffffff; - --ion-color-vimeo-contrast-rgb: 255,255,255; + --ion-color-vimeo-contrast-rgb: 255, 255, 255; --ion-color-vimeo-shade: #1fa0ce; --ion-color-vimeo-tint: #39bdec; --ion-color-facebook: #3b5998; - --ion-color-facebook-rgb: 59,89,152; + --ion-color-facebook-rgb: 59, 89, 152; --ion-color-facebook-contrast: #ffffff; - --ion-color-facebook-contrast-rgb: 255,255,255; + --ion-color-facebook-contrast-rgb: 255, 255, 255; --ion-color-facebook-shade: #344e86; --ion-color-facebook-tint: #4f6aa2; - } - - .ion-color-favorite { - --ion-color-base: var(--ion-color-favorite); - --ion-color-base-rgb: var(--ion-color-favorite-rgb); - --ion-color-contrast: var(--ion-color-favorite-contrast); - --ion-color-contrast-rgb: var(--ion-color-favorite-contrast-rgb); - --ion-color-shade: var(--ion-color-favorite-shade); - --ion-color-tint: var(--ion-color-favorite-tint); - } - - .ion-color-twitter { - --ion-color-base: var(--ion-color-twitter); - --ion-color-base-rgb: var(--ion-color-twitter-rgb); - --ion-color-contrast: var(--ion-color-twitter-contrast); - --ion-color-contrast-rgb: var(--ion-color-twitter-contrast-rgb); - --ion-color-shade: var(--ion-color-twitter-shade); - --ion-color-tint: var(--ion-color-twitter-tint); - } - - .ion-color-google { - --ion-color-base: var(--ion-color-google); - --ion-color-base-rgb: var(--ion-color-google-rgb); - --ion-color-contrast: var(--ion-color-google-contrast); - --ion-color-contrast-rgb: var(--ion-color-google-contrast-rgb); - --ion-color-shade: var(--ion-color-google-shade); - --ion-color-tint: var(--ion-color-google-tint); - } - - .ion-color-instagram { - --ion-color-base: var(--ion-color-instagram); - --ion-color-base-rgb: var(--ion-color-instagram-rgb); - --ion-color-contrast: var(--ion-color-instagram-contrast); - --ion-color-contrast-rgb: var(--ion-color-instagram-contrast-rgb); - --ion-color-shade: var(--ion-color-instagram-shade); - --ion-color-tint: var(--ion-color-instagram-tint); - } - - .ion-color-vimeo { - --ion-color-base: var(--ion-color-vimeo); - --ion-color-base-rgb: var(--ion-color-vimeo-rgb); - --ion-color-contrast: var(--ion-color-vimeo-contrast); - --ion-color-contrast-rgb: var(--ion-color-vimeo-contrast-rgb); - --ion-color-shade: var(--ion-color-vimeo-shade); - --ion-color-tint: var(--ion-color-vimeo-tint); - } - - .ion-color-facebook { - --ion-color-base: var(--ion-color-facebook); - --ion-color-base-rgb: var(--ion-color-facebook-rgb); - --ion-color-contrast: var(--ion-color-facebook-contrast); - --ion-color-contrast-rgb: var(--ion-color-facebook-contrast-rgb); - --ion-color-shade: var(--ion-color-facebook-shade); - --ion-color-tint: var(--ion-color-facebook-tint); - } - - .ion-color-github { - --ion-color-base: #211F1F; - --ion-color-base-rgb: 33,31,31; - --ion-color-contrast: #ffffff; - --ion-color-contrast-rgb: 255,255,255; - --ion-color-shade: #1d1b1b; - --ion-color-tint: #373535; - } - - .ion-color-instagram { - --ion-color-base: #9537BC; - --ion-color-base-rgb: 149,55,188; - --ion-color-contrast: #ffffff; - --ion-color-contrast-rgb: 255,255,255; - --ion-color-shade: #8330a5; - --ion-color-tint: #a04bc3; - } +} + +.ion-color-favorite { + --ion-color-base: var(--ion-color-favorite); + --ion-color-base-rgb: var(--ion-color-favorite-rgb); + --ion-color-contrast: var(--ion-color-favorite-contrast); + --ion-color-contrast-rgb: var(--ion-color-favorite-contrast-rgb); + --ion-color-shade: var(--ion-color-favorite-shade); + --ion-color-tint: var(--ion-color-favorite-tint); +} + +.ion-color-twitter { + --ion-color-base: var(--ion-color-twitter); + --ion-color-base-rgb: var(--ion-color-twitter-rgb); + --ion-color-contrast: var(--ion-color-twitter-contrast); + --ion-color-contrast-rgb: var(--ion-color-twitter-contrast-rgb); + --ion-color-shade: var(--ion-color-twitter-shade); + --ion-color-tint: var(--ion-color-twitter-tint); +} + +.ion-color-google { + --ion-color-base: var(--ion-color-google); + --ion-color-base-rgb: var(--ion-color-google-rgb); + --ion-color-contrast: var(--ion-color-google-contrast); + --ion-color-contrast-rgb: var(--ion-color-google-contrast-rgb); + --ion-color-shade: var(--ion-color-google-shade); + --ion-color-tint: var(--ion-color-google-tint); +} + +.ion-color-instagram { + --ion-color-base: var(--ion-color-instagram); + --ion-color-base-rgb: var(--ion-color-instagram-rgb); + --ion-color-contrast: var(--ion-color-instagram-contrast); + --ion-color-contrast-rgb: var(--ion-color-instagram-contrast-rgb); + --ion-color-shade: var(--ion-color-instagram-shade); + --ion-color-tint: var(--ion-color-instagram-tint); +} + +.ion-color-vimeo { + --ion-color-base: var(--ion-color-vimeo); + --ion-color-base-rgb: var(--ion-color-vimeo-rgb); + --ion-color-contrast: var(--ion-color-vimeo-contrast); + --ion-color-contrast-rgb: var(--ion-color-vimeo-contrast-rgb); + --ion-color-shade: var(--ion-color-vimeo-shade); + --ion-color-tint: var(--ion-color-vimeo-tint); +} + +.ion-color-facebook { + --ion-color-base: var(--ion-color-facebook); + --ion-color-base-rgb: var(--ion-color-facebook-rgb); + --ion-color-contrast: var(--ion-color-facebook-contrast); + --ion-color-contrast-rgb: var(--ion-color-facebook-contrast-rgb); + --ion-color-shade: var(--ion-color-facebook-shade); + --ion-color-tint: var(--ion-color-facebook-tint); +} + +.ion-color-github { + --ion-color-base: #211f1f; + --ion-color-base-rgb: 33, 31, 31; + --ion-color-contrast: #ffffff; + --ion-color-contrast-rgb: 255, 255, 255; + --ion-color-shade: #1d1b1b; + --ion-color-tint: #373535; +} + +.ion-color-instagram { + --ion-color-base: #9537bc; + --ion-color-base-rgb: 149, 55, 188; + --ion-color-contrast: #ffffff; + --ion-color-contrast-rgb: 255, 255, 255; + --ion-color-shade: #8330a5; + --ion-color-tint: #a04bc3; +} /* * Shared Variables @@ -139,7 +202,8 @@ :root { --ion-headings-font-weight: 300; - --ion-color-angular: #ac282b; + --ion-color-ionic: var(--ion-color-primary); + --ion-color-vue: #34495e; --ion-color-communication: #8e8d93; --ion-color-tooling: #fe4c52; --ion-color-services: #fd8b2d; diff --git a/src/types/images.d.ts b/src/types/images.d.ts new file mode 100644 index 0000000..403b544 --- /dev/null +++ b/src/types/images.d.ts @@ -0,0 +1,4 @@ +declare module '*.png' { + const content: string; + export default content; +} diff --git a/src/views/About.vue b/src/views/About.vue index 53acf55..255f84c 100644 --- a/src/views/About.vue +++ b/src/views/About.vue @@ -8,7 +8,11 @@ - + @@ -16,26 +20,47 @@
-
-
-
-
+
+
+
+

About

- The Ionic Conference is a one-day conference on - {{ dateFormat(conferenceDate, "MMM dd, yyyy") }} - featuring talks from the Ionic team. It is focused on Ionic applications being built with Ionic Framework. This includes migrating apps to the latest version of the framework, Angular concepts, Webpack, Sass, and many other technologies used in Ionic 7. Tickets are completely sold out, and we’re expecting more than 1000 developers – making this the largest Ionic conference ever! + The Ionic Conference is a one-day event happening on + {{ dateFormat(conferenceDate, "MMM dd, yyyy") }}, + featuring talks from the Ionic team. The conference focuses on + building applications with Ionic Framework, including topics such + as app migration to the latest version, Vue best practices, Webpack, + Sass, and other technologies commonly used in the Ionic ecosystem. Tickets + are completely sold out, and we're expecting over 1,000 developers — + making this the largest Ionic conference to date!

Details

- + Madison, WI Austin, TX Chicago, IL @@ -43,12 +68,20 @@ - - Date - + Date {{ dateFormat(conferenceDate, "MMM dd, yyyy") }} - - + + @@ -57,23 +90,18 @@ - - Wifi network - + Wifi network - ica{{ dateFormat(conferenceDate, "y") }} + ica{{ dateFormat(conferenceDate, "yyyy") }} - - Password - - - makegoodthings - + Password + makegoodthings
+ @@ -104,7 +132,6 @@ ion-toolbar { --background: transparent; --color: white; position: absolute; - top: 0; right: 0; left: 0; @@ -118,7 +145,6 @@ ion-toolbar ion-menu-button { .about-header { position: relative; - width: 100%; height: 30%; } @@ -134,19 +160,19 @@ ion-toolbar ion-menu-button { } .about-header .madison { - background-image: url("../../public/assets/img/about/madison.jpg"); + background-image: url("/assets/img/about/madison.jpg"); } .about-header .austin { - background-image: url("../../public/assets/img/about/austin.jpg"); + background-image: url("/assets/img/about/austin.jpg"); } .about-header .chicago { - background-image: url("../../public/assets/img/about/chicago.jpg"); + background-image: url("/assets/img/about/chicago.jpg"); } .about-header .seattle { - background-image: url("../../public/assets/img/about/seattle.jpg"); + background-image: url("/assets/img/about/seattle.jpg"); } .about-info { @@ -167,7 +193,6 @@ ion-toolbar ion-menu-button { .about-info p { color: var(--ion-color-dark); - line-height: 130%; } @@ -181,10 +206,6 @@ ion-toolbar ion-menu-button { --width: 336px; } -/* - * iOS Only - */ - .ios .about-info { --ion-padding: 19px; } @@ -192,10 +213,8 @@ ion-toolbar ion-menu-button { .ios .about-info h3 { font-weight: 700; } - - diff --git a/src/views/Login.vue b/src/views/Login.vue index 7cb980b..c53b332 100644 --- a/src/views/Login.vue +++ b/src/views/Login.vue @@ -9,68 +9,55 @@ - + -
- - - - - - - - - - - - - Login - - - Signup - - -
- +
diff --git a/src/views/Map.vue b/src/views/Map.vue index 9dec1a7..edf612d 100644 --- a/src/views/Map.vue +++ b/src/views/Map.vue @@ -18,10 +18,15 @@ diff --git a/src/views/SessionDetail.vue b/src/views/SessionDetail.vue index 10dd000..8d1cdfb 100644 --- a/src/views/SessionDetail.vue +++ b/src/views/SessionDetail.vue @@ -3,55 +3,56 @@ - + + + + + + + + + + - {{ session ? session.name : '' }} - -
+ +

{{ session.name }}

- - - - {{ track }} - - - - - + {{ track }}

{{ session.description }}

- {{ dateFormat(session.dateTimeStart, "h:mm a") }} — {{ dateFormat(session.dateTimeEnd, "h:mm a") }} -
+ {{ session.timeStart }} – {{ session.timeEnd }} +
{{ session.location }}
- + Watch - + Add to Calendar - + Mark as Unwatched - + Download Video - + - + Leave Feedback @@ -64,28 +65,75 @@ color: var(--ion-color-primary); } -.session-track-angular { - color: var(--ion-color-angular); +.session-track-vue { + color: var(--ion-color-vue); +} + +.session-track-communication { + color: var(--ion-color-communication); +} + +.session-track-tooling { + color: var(--ion-color-tooling); } +.session-track-services { + color: var(--ion-color-services); +} + +.session-track-design { + color: var(--ion-color-design); +} + +.session-track-workshop { + color: var(--ion-color-workshop); +} + +.session-track-food { + color: var(--ion-color-food); +} + +.session-track-documentation { + color: var(--ion-color-documentation); +} + +.session-track-navigation { + color: var(--ion-color-navigation); +} + +/* Favorite Icon + * -------------------------------------------------------- + */ + .show-favorite { position: relative; } -.icon-heart-empty { +.icon-heart-empty, +.icon-heart { + --border-radius: 50%; + --padding-start: 0; + --padding-end: 0; + position: absolute; + top: 5px; right: 5px; + + width: 48px; + height: 48px; + + transition: transform 300ms ease; + + font-size: 16px; +} + +.icon-heart-empty { transform: scale(1); - transition: transform 0.3s ease; } .icon-heart { - position: absolute; - top: 5px; - right: 5px; transform: scale(0); - transition: transform 0.3s ease; } .show-favorite .icon-heart { @@ -95,18 +143,22 @@ .show-favorite .icon-heart-empty { transform: scale(0); } + +h1 { + margin: 0; +} - \ No newline at end of file + +onMounted(async () => { + // Check if sessions are loaded, if not load them + if (store.state.sessions.sessions.length === 0) { + await store.dispatch("loadSessionData"); + } + + session.value = store.state.sessions.sessions.find( + (s) => s.id === parseInt(route.params.sessionId.toString()) + ); +}); + diff --git a/src/views/SessionList.vue b/src/views/SessionList.vue index 865c1b2..f73df26 100644 --- a/src/views/SessionList.vue +++ b/src/views/SessionList.vue @@ -1,23 +1,48 @@ - + - - diff --git a/src/views/SessionListFilter.vue b/src/views/SessionListFilter.vue index 242113e..c908cf7 100644 --- a/src/views/SessionListFilter.vue +++ b/src/views/SessionListFilter.vue @@ -1,30 +1,36 @@ diff --git a/src/views/Signup.vue b/src/views/Signup.vue index 4e496aa..b9cb55d 100644 --- a/src/views/Signup.vue +++ b/src/views/Signup.vue @@ -1,17 +1,3 @@ - - - + + diff --git a/src/views/SpeakerDetail.vue b/src/views/SpeakerDetail.vue index 171279d..502c033 100644 --- a/src/views/SpeakerDetail.vue +++ b/src/views/SpeakerDetail.vue @@ -1,47 +1,162 @@ diff --git a/src/views/SpeakerList.vue b/src/views/SpeakerList.vue index c2238ea..83b8434 100644 --- a/src/views/SpeakerList.vue +++ b/src/views/SpeakerList.vue @@ -1,11 +1,11 @@ + + diff --git a/src/views/Support.vue b/src/views/Support.vue index bdfefab..8296194 100644 --- a/src/views/Support.vue +++ b/src/views/Support.vue @@ -10,6 +10,14 @@ .support-logo img { max-width: 150px; } + +.list { + margin-bottom: 0; +} + +.support-form { + padding: 16px; +} - diff --git a/src/views/Tutorial.vue b/src/views/Tutorial.vue index bdbb588..70367b2 100644 --- a/src/views/Tutorial.vue +++ b/src/views/Tutorial.vue @@ -1,111 +1,139 @@ \ No newline at end of file +onActivated(() => { + resetScroll(); +}); + diff --git a/vite.config.ts b/vite.config.ts index 5f24224..634fd5c 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -17,5 +17,8 @@ export default defineConfig({ test: { globals: true, environment: 'jsdom' + }, + define: { + __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'false' } })