├── .firebaserc ├── .github └── workflows │ ├── firebase-hosting-preview.yml │ ├── firebase-hosting-production.yml │ └── gh-pages.yml ├── .gitignore ├── .metadata ├── .vscode ├── launch.json └── settings.json ├── CONTRIBUTING.ja.md ├── CONTRIBUTING.md ├── README.md ├── analysis_options.yaml ├── android ├── .gitignore ├── app │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── kotlin │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── website │ │ │ │ └── MainActivity.kt │ │ └── res │ │ │ ├── drawable │ │ │ └── launch_background.xml │ │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── values-night │ │ │ └── styles.xml │ │ │ └── values │ │ │ └── styles.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties └── settings.gradle ├── assets ├── banner.png ├── discord_logo.svg ├── flutterkaigi-navbar_logo.svg ├── flutterkaigi_logo.svg ├── github_logo.svg ├── music │ ├── bensound-dreams.mp3 │ └── bensound-thelounge.mp3 ├── photo │ └── katsummy.png ├── twitter_logo.svg └── twitter_white.svg ├── firebase.json ├── ios ├── .gitignore ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Podfile ├── Podfile.lock ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings ├── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ ├── Icon-App-20x20@1x.png │ │ │ ├── Icon-App-20x20@2x.png │ │ │ ├── Icon-App-20x20@3x.png │ │ │ ├── Icon-App-29x29@1x.png │ │ │ ├── Icon-App-29x29@2x.png │ │ │ ├── Icon-App-29x29@3x.png │ │ │ ├── Icon-App-40x40@1x.png │ │ │ ├── Icon-App-40x40@2x.png │ │ │ ├── Icon-App-40x40@3x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ ├── Icon-App-76x76@1x.png │ │ │ ├── Icon-App-76x76@2x.png │ │ │ └── Icon-App-83.5x83.5@2x.png │ │ └── LaunchImage.imageset │ │ │ ├── Contents.json │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ └── README.md │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ ├── Info.plist │ └── Runner-Bridging-Header.h └── build │ └── Pods.build │ └── Release-iphonesimulator │ ├── Flutter.build │ └── dgph │ ├── Pods-Runner.build │ └── dgph │ └── url_launcher.build │ └── dgph ├── l10n.yaml ├── lib ├── data │ ├── speaker.dart │ └── staff.dart ├── entity │ └── timetable_entity.dart ├── gen │ └── assets.gen.dart ├── l10n │ ├── app_en.arb │ └── app_ja.arb ├── main.dart ├── pages │ ├── index.dart │ ├── session.dart │ ├── staff.dart │ ├── teaser.dart │ └── timetable.dart ├── responsive_layout_builder.dart ├── router │ ├── index.dart │ └── simple_route.dart ├── theme.dart └── widgets │ ├── background.dart │ ├── cfs_button.dart │ ├── connpass_button.dart │ ├── footer.dart │ └── social.dart ├── linux ├── .gitignore ├── CMakeLists.txt ├── flutter │ ├── CMakeLists.txt │ ├── generated_plugin_registrant.cc │ ├── generated_plugin_registrant.h │ └── generated_plugins.cmake ├── main.cc ├── my_application.cc └── my_application.h ├── macos ├── .gitignore ├── Flutter │ ├── Flutter-Debug.xcconfig │ ├── Flutter-Release.xcconfig │ └── GeneratedPluginRegistrant.swift ├── Podfile ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ └── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── app_icon_1024.png │ │ ├── app_icon_128.png │ │ ├── app_icon_16.png │ │ ├── app_icon_256.png │ │ ├── app_icon_32.png │ │ ├── app_icon_512.png │ │ └── app_icon_64.png │ ├── Base.lproj │ └── MainMenu.xib │ ├── Configs │ ├── AppInfo.xcconfig │ ├── Debug.xcconfig │ ├── Release.xcconfig │ └── Warnings.xcconfig │ ├── DebugProfile.entitlements │ ├── Info.plist │ ├── MainFlutterWindow.swift │ └── Release.entitlements ├── pubspec.lock ├── pubspec.yaml ├── test └── widget_test.dart └── web ├── assets ├── discord_logo.svg ├── flutter.png ├── flutterkaigi-navbar_logo.svg ├── flutterkaigi_log.svg ├── flutterkaigi_ogp.png ├── github_logo.svg ├── twitter_logo.svg └── twitter_white.svg ├── favicon.png ├── icons ├── Icon-192.png └── Icon-512.png ├── index.html ├── manifest.json └── service-worker.js /.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "projects": { 3 | "default": "flutterkaigi" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /.github/workflows/firebase-hosting-preview.yml: -------------------------------------------------------------------------------- 1 | name: Deploy to Firebase hosting 2 | 3 | on: pull_request 4 | 5 | jobs: 6 | build-deploy: 7 | runs-on: ubuntu-18.04 8 | 9 | steps: 10 | - uses: actions/checkout@master 11 | 12 | - name: Setup Flutter 13 | uses: subosito/flutter-action@v1 14 | 15 | - name: Install dependencies 16 | run: | 17 | flutter pub get 18 | 19 | - name: Transpile 20 | run: | 21 | flutter build web --web-renderer html 22 | 23 | - name: Deploy 24 | uses: FirebaseExtended/action-hosting-deploy@v0 25 | with: 26 | repoToken: "${{ secrets.GITHUB_TOKEN }}" 27 | firebaseServiceAccount: "${{ secrets.FIREBASE_SERVICE_ACCOUNT_FLUTTERKAIGI }}" 28 | projectId: flutterkaigi 29 | env: 30 | FIREBASE_CLI_PREVIEWS: hostingchannels 31 | -------------------------------------------------------------------------------- /.github/workflows/firebase-hosting-production.yml: -------------------------------------------------------------------------------- 1 | name: Deploy to Firebase hosting 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | build-deploy: 10 | runs-on: ubuntu-18.04 11 | 12 | steps: 13 | - uses: actions/checkout@master 14 | 15 | - name: Setup Flutter 16 | uses: subosito/flutter-action@v1 17 | 18 | - name: Install dependencies 19 | run: | 20 | flutter pub get 21 | 22 | - name: Transpile 23 | run: | 24 | flutter build web --web-renderer html 25 | 26 | - name: Deploy 27 | uses: FirebaseExtended/action-hosting-deploy@v0 28 | with: 29 | repoToken: "${{ secrets.GITHUB_TOKEN }}" 30 | firebaseServiceAccount: "${{ secrets.FIREBASE_SERVICE_ACCOUNT_FLUTTERKAIGI }}" 31 | projectId: flutterkaigi 32 | channelId: live 33 | env: 34 | FIREBASE_CLI_PREVIEWS: hostingchannels 35 | -------------------------------------------------------------------------------- /.github/workflows/gh-pages.yml: -------------------------------------------------------------------------------- 1 | name: Deploy to Github pages 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | build-deploy: 10 | runs-on: ubuntu-18.04 11 | 12 | steps: 13 | - uses: actions/checkout@master 14 | 15 | - name: Setup Flutter 16 | uses: subosito/flutter-action@v1 17 | 18 | - name: Install dependencies 19 | run: | 20 | flutter pub get 21 | 22 | - name: Transpile 23 | run: | 24 | flutter build web --web-renderer html 25 | 26 | - name: Deploy 27 | uses: peaceiris/actions-gh-pages@v2.8.0 28 | env: 29 | ACTIONS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }} 30 | PUBLISH_BRANCH: gh-pages 31 | PUBLISH_DIR: ./build/web 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | **/ios/Flutter/.last_build_id 26 | .dart_tool/ 27 | .firebase 28 | .flutter-plugins 29 | .flutter-plugins-dependencies 30 | .packages 31 | .pub-cache/ 32 | .pub/ 33 | /build/ 34 | 35 | # Web related 36 | lib/generated_plugin_registrant.dart 37 | 38 | # Symbolication related 39 | app.*.symbols 40 | 41 | # Obfuscation related 42 | app.*.map.json 43 | 44 | # Exceptions to above rules. 45 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 46 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 8badf93609b35c107f9ee71f32377232ac4ee72f 8 | channel: master 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "confwebsite2021", 9 | "request": "launch", 10 | "type": "dart" 11 | }, 12 | { 13 | "name": "confwebsite2021 (profile mode)", 14 | "request": "launch", 15 | "type": "dart", 16 | "flutterMode": "profile" 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "git.ignoreLimitWarning": true, 3 | 4 | // "dart.flutterSdkPath": ".fvm/flutter_sdk", 5 | // Remove .fvm files from search 6 | "search.exclude": { 7 | "**/.fvm": true, 8 | "**/.history": true, 9 | "**/*.ast.gql.dart": true, 10 | "**/*.req.gql.dart": true, 11 | "**/*.data.gql.dart": true, 12 | "**/*.var.gql.dart": true, 13 | "**/*.gql.g.dart": true 14 | }, 15 | // Remove from file watching 16 | "files.watcherExclude": { 17 | "**/.fvm": true, 18 | "**/.history": true 19 | }, 20 | 21 | // @see https://dartcode.org/docs/settings/#dartlinelength 22 | "dart.lineLength": 80, 23 | 24 | // @see https://dartcode.org/docs/recommended-settings/ 25 | "[dart]": { 26 | // Automatically format code on save and during typing of certain characters 27 | // (like `;` and `}`). 28 | "editor.formatOnSave": true, 29 | "editor.formatOnType": true, 30 | 31 | "editor.codeActionsOnSave": { 32 | "source.organizeImports": true, 33 | }, 34 | 35 | // Draw a guide line at 80 characters, where Dart's formatting will wrap code. 36 | "editor.rulers": [80], 37 | 38 | // Disables built-in highlighting of words that match your selection. Without 39 | // this, all instances of the selected text will be highlighted, interfering 40 | // with Dart's ability to highlight only exact references to the selected variable. 41 | "editor.selectionHighlight": false, 42 | 43 | // By default, VS Code prevents code completion from popping open when in 44 | // "snippet mode" (editing placeholders in inserted code). Setting this option 45 | // to `false` stops that and allows completion to open as normal, as if you 46 | // weren't in a snippet placeholder. 47 | "editor.suggest.snippetsPreventQuickSuggestions": false, 48 | 49 | // By default, VS Code will pre-select the most recently used item from code 50 | // completion. This is usually not the most relevant item. 51 | // 52 | // "first" will always select top item 53 | // "recentlyUsedByPrefix" will filter the recently used items based on the 54 | // text immediately preceding where completion was invoked. 55 | "editor.suggestSelection": "first", 56 | 57 | // Allows pressing to complete snippets such as `for` even when the 58 | // completion list is not visible. 59 | "editor.tabCompletion": "onlySnippets", 60 | 61 | // By default, VS Code will populate code completion with words found in the 62 | // current file when a language service does not provide its own completions. 63 | // This results in code completion suggesting words when editing comments and 64 | // strings. This setting will prevent that. 65 | "editor.wordBasedSuggestions": false, 66 | 67 | "editor.tabSize": 2, 68 | "editor.insertSpaces": true, 69 | "editor.detectIndentation": false, 70 | "editor.suggest.insertMode": "replace", 71 | 72 | "editor.wordWrap": "wordWrapColumn", 73 | "editor.wordWrapColumn": 80 74 | }, 75 | "editor.codeActionsOnSave": { 76 | "source.organizeImports": true 77 | }, 78 | "cSpell.words": [ 79 | "mockito", 80 | "riverpod" 81 | ], 82 | 83 | "peacock.color": "#03a9f4", 84 | "workbench.colorCustomizations": { 85 | "activityBar.activeBackground": "#027DFD", 86 | "activityBar.activeBorder": "#422c74", 87 | "activityBar.background": "#027DFD", 88 | "activityBar.foreground": "#e7e7e7", 89 | "activityBar.inactiveForeground": "#e7e7e7", 90 | "activityBarBadge.background": "#F25D50", 91 | "activityBarBadge.foreground": "#e7e7e7", 92 | "editorGroup.border": "#027DFD", 93 | "panel.border": "#027DFD", 94 | "sash.hoverBorder": "#027DFD", 95 | "sideBar.border": "#027DFD", 96 | "statusBar.background": "#0553B1", 97 | "statusBar.foreground": "#b2b2b2", 98 | "statusBarItem.hoverBackground": "#027DFD", 99 | "statusBarItem.remoteBackground": "#0553B1", 100 | "statusBarItem.remoteForeground": "#b2b2b2", 101 | "titleBar.activeBackground": "#042B59", 102 | "titleBar.activeForeground": "#b2b2b2", 103 | "titleBar.inactiveBackground": "#042B59", 104 | "titleBar.inactiveForeground": "#b2b2b2" 105 | } 106 | } -------------------------------------------------------------------------------- /CONTRIBUTING.ja.md: -------------------------------------------------------------------------------- 1 | # コントリビュート 2 | 3 | あなたのコントリビュートをお待ちしております! 4 | 5 | ## コントリビュート方法 6 | 7 | ### タスクの見つけ方 8 | 9 | タスク管理に GitHub Issue を使っています。こちらでコントリビュートしたい Issue をお探しください。 Issue がない Pull Request でも大丈夫です。その場合は Pull Request に理由、原因、解決策などの詳細をご記入ください。 10 | 11 | ### コントリビュートの始め方 12 | 13 | もし取り組みたいタスクを見つけたら、他の人と重複して作業しないようにするため Issue に "🙋" などのコメントをしてください。なるべく早くいただいたコメントにリアクションしますが Issue にコメントを書いたらタスクを始めていただいて構いません。 14 | 15 | ## ウェブサイト FlutterKaigi.jp の改善に貢献する 16 | 17 | ウェブサイト FlutterKaigi.jp (以下・当ウェブサイト) の改善にご協力いただく際の方法について説明します。 18 | 19 | ### バグを報告する 20 | 21 | 当ウェブサイトの改善に貢献する方法の中でも、非常に簡単かつ効果的なものとして、バグの報告があります。 22 | 23 | ### コーディングに貢献する 24 | 25 | FlutterKaigi 実行委員会はコード修正案の投稿を歓迎しており精力的に審査しています。ぜひソースコードをチェックアウトして特定のバグや機能を対象とするコード修正案をご投稿ください。 26 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contribution 2 | 3 | We look forward to your contribution! 4 | 5 | ## How to contribute 6 | 7 | ### How to find a task 8 | 9 | We are using GitHub Issue for task management. Please find the Issue you want to contribute here. You can also make Pull Requests without relation to any issues. In this case, please provide details such as the reason, cause, and solution in the Pull Request. 10 | 11 | ### How to get started with a contribution 12 | 13 | If you find a task you want to work on, comment on the Issue, such as "🙋", to avoid duplicating work with others. We will react to the comments you received as soon as possible, but you can start the task after writing a comment on the Issue. 14 | 15 | ## Contribute to improving the website FlutterKaigi.jp 16 | 17 | We will explain how to help improve the website FlutterKaigi.jp (referred to as "this website" below). 18 | 19 | ### Report a bug 20 | 21 | One of the easiest and most effective ways to help improve this website is to report a bug. 22 | 23 | ### Contribute to coding 24 | 25 | The FlutterKaigi Executive Committee welcomes submissions of proposed code amendments and is vigorously reviewing them. Please check out the source code and post any code fixes that target specific bugs or features. 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FlutterKaigi 2021 official website 2 | 3 | [FlutterKaigi 2021](https://flutterkaigi.jp) 4 | 5 | ## Development 6 | 7 | We will deliver sessions related to FlutterKaigi. 8 | 9 | |Home| 10 | |:---:| 11 | |![](https://i.imgur.com/8A2tHCP.jpg)| 12 | 13 | ### Contributing 14 | 15 | We always welcome all contributions! See [CONTRIBUTING.md](./CONTRIBUTING.md) for more information. 16 | 17 | For Japanese, please see [CONTRIBUTING.ja.md](./CONTRIBUTING.ja.md). 18 | 19 | ### Tech Stacks 20 | 21 | - [Flutter](https://flutter.dev/) 22 | - [Firebase Hosting](https://firebase.google.com/docs/hosting) 23 | 24 | ## Thanks 25 | 26 | Thank you for contributing! 27 | 28 | ### Contributors 29 | 30 | GitHub: [Contributors](https://github.com/FlutterKaigi/confwebsite2021/graphs/contributors) 31 | -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | include: package:flutter_lints/flutter.yaml 2 | 3 | analyzer: 4 | strong-mode: 5 | implicit-casts: true 6 | implicit-dynamic: true 7 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | 28 | android { 29 | compileSdkVersion 29 30 | 31 | sourceSets { 32 | main.java.srcDirs += 'src/main/kotlin' 33 | } 34 | 35 | lintOptions { 36 | disable 'InvalidPackage' 37 | } 38 | 39 | defaultConfig { 40 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 41 | applicationId "com.example.confwebsite2021" 42 | minSdkVersion 16 43 | targetSdkVersion 29 44 | versionCode flutterVersionCode.toInteger() 45 | versionName flutterVersionName 46 | } 47 | 48 | buildTypes { 49 | release { 50 | // TODO: Add your own signing config for the release build. 51 | // Signing with the debug keys for now, so `flutter run --release` works. 52 | signingConfig signingConfigs.debug 53 | } 54 | } 55 | } 56 | 57 | flutter { 58 | source '../..' 59 | } 60 | 61 | dependencies { 62 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 63 | } 64 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 8 | 11 | 18 | 22 | 26 | 31 | 35 | 36 | 37 | 38 | 39 | 40 | 42 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/example/website/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.confwebsite2021 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.3.50' 3 | repositories { 4 | google() 5 | jcenter() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:3.5.0' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | } 12 | } 13 | 14 | allprojects { 15 | repositories { 16 | google() 17 | jcenter() 18 | } 19 | } 20 | 21 | rootProject.buildDir = '../build' 22 | subprojects { 23 | project.buildDir = "${rootProject.buildDir}/${project.name}" 24 | } 25 | subprojects { 26 | project.evaluationDependsOn(':app') 27 | } 28 | 29 | task clean(type: Delete) { 30 | delete rootProject.buildDir 31 | } 32 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.enableR8=true 3 | android.useAndroidX=true 4 | android.enableJetifier=true 5 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip 7 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties") 4 | def properties = new Properties() 5 | 6 | assert localPropertiesFile.exists() 7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } 8 | 9 | def flutterSdkPath = properties.getProperty("flutter.sdk") 10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 12 | -------------------------------------------------------------------------------- /assets/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/assets/banner.png -------------------------------------------------------------------------------- /assets/discord_logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flutterkaigi-navbar_logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 15 | 17 | 37 | 41 | 45 | 49 | 53 | 57 | 61 | 65 | 69 | 73 | 77 | 81 | 85 | 91 | 94 | 97 | 104 | 105 | 106 | 112 | 116 | 117 | -------------------------------------------------------------------------------- /assets/flutterkaigi_logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /assets/github_logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/music/bensound-dreams.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/assets/music/bensound-dreams.mp3 -------------------------------------------------------------------------------- /assets/music/bensound-thelounge.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/assets/music/bensound-thelounge.mp3 -------------------------------------------------------------------------------- /assets/photo/katsummy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/assets/photo/katsummy.png -------------------------------------------------------------------------------- /assets/twitter_logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/twitter_white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 17 | -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "hosting": { 3 | "public": "build/web", 4 | "ignore": [ 5 | "firebase.json", 6 | "**/.*", 7 | "**/node_modules/**" 8 | ] 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | *.mode1v3 2 | *.mode2v3 3 | *.moved-aside 4 | *.pbxuser 5 | *.perspectivev3 6 | **/*sync/ 7 | .sconsign.dblite 8 | .tags* 9 | **/.vagrant/ 10 | **/DerivedData/ 11 | Icon? 12 | **/Pods/ 13 | **/.symlinks/ 14 | profile 15 | xcuserdata 16 | **/.generated/ 17 | Flutter/App.framework 18 | Flutter/Flutter.framework 19 | Flutter/Flutter.podspec 20 | Flutter/Generated.xcconfig 21 | Flutter/app.flx 22 | Flutter/app.zip 23 | Flutter/flutter_assets/ 24 | Flutter/flutter_export_environment.sh 25 | ServiceDefinitions.json 26 | Runner/GeneratedPluginRegistrant.* 27 | 28 | # Exceptions to above rules. 29 | !default.mode1v3 30 | !default.mode2v3 31 | !default.pbxuser 32 | !default.perspectivev3 33 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 8.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 6 | 7 | project 'Runner', { 8 | 'Debug' => :debug, 9 | 'Profile' => :release, 10 | 'Release' => :release, 11 | } 12 | 13 | def flutter_root 14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) 15 | unless File.exist?(generated_xcode_build_settings_path) 16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" 17 | end 18 | 19 | File.foreach(generated_xcode_build_settings_path) do |line| 20 | matches = line.match(/FLUTTER_ROOT\=(.*)/) 21 | return matches[1].strip if matches 22 | end 23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" 24 | end 25 | 26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) 27 | 28 | flutter_ios_podfile_setup 29 | 30 | target 'Runner' do 31 | use_frameworks! 32 | use_modular_headers! 33 | 34 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) 35 | end 36 | 37 | post_install do |installer| 38 | installer.pods_project.targets.each do |target| 39 | flutter_additional_ios_build_settings(target) 40 | end 41 | end 42 | -------------------------------------------------------------------------------- /ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Flutter (1.0.0) 3 | - url_launcher (0.0.1): 4 | - Flutter 5 | 6 | DEPENDENCIES: 7 | - Flutter (from `Flutter`) 8 | - url_launcher (from `.symlinks/plugins/url_launcher/ios`) 9 | 10 | EXTERNAL SOURCES: 11 | Flutter: 12 | :path: Flutter 13 | url_launcher: 14 | :path: ".symlinks/plugins/url_launcher/ios" 15 | 16 | SPEC CHECKSUMS: 17 | Flutter: 434fef37c0980e73bb6479ef766c45957d4b510c 18 | url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef 19 | 20 | PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c 21 | 22 | COCOAPODS: 1.10.1 23 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | confwebsite2021 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | $(FLUTTER_BUILD_NAME) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UIViewControllerBasedStatusBarAppearance 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /ios/build/Pods.build/Release-iphonesimulator/Flutter.build/dgph: -------------------------------------------------------------------------------- 1 | DGPH1.04 Jun 8 202114:00:05/Usersyuukitprojectconfwebsite2021iosPods -------------------------------------------------------------------------------- /ios/build/Pods.build/Release-iphonesimulator/Pods-Runner.build/dgph: -------------------------------------------------------------------------------- 1 | DGPH1.04 Jun 8 202114:00:05/Usersyuukitprojectconfwebsite2021iosPods -------------------------------------------------------------------------------- /ios/build/Pods.build/Release-iphonesimulator/url_launcher.build/dgph: -------------------------------------------------------------------------------- 1 | DGPH1.04 Jun 8 202114:00:05/Usersyuukitprojectconfwebsite2021iosPods -------------------------------------------------------------------------------- /l10n.yaml: -------------------------------------------------------------------------------- 1 | arb-dir: lib/l10n 2 | template-arb-file: app_ja.arb 3 | output-localization-file: app_localizations.dart 4 | -------------------------------------------------------------------------------- /lib/data/speaker.dart: -------------------------------------------------------------------------------- 1 | final kSpeakerList = { 2 | 0: { 3 | 'title': 'FlutterでのMaterial You対応の状況と今後の展望', 4 | 'name': 'kafumi', 5 | 'datetime': '11/29 17:15-17:45', 6 | 'twitter': 'https://twitter.com/kafumi__', 7 | 'fortee': 8 | 'https://fortee.jp/flutterkaigi-2021/proposal/46f30016-baa5-4d40-855e-78dab97fb2b8', 9 | 'youtube': '', 10 | }, 11 | 1: { 12 | 'title': 'Atomic Designを用いてFlutterアプリの責務分担を明確化しよう', 13 | 'name': '千葉 諒', 14 | 'datetime': '11/29 17:50-18:20', 15 | 'twitter': 'https://twitter.com/MHTcode_chibird', 16 | 'fortee': 17 | 'https://fortee.jp/flutterkaigi-2021/proposal/760c846a-c473-489a-a34e-2b007e2b7f76', 18 | 'youtube': '', 19 | }, 20 | 2: { 21 | 'title': 'FlutterでGraphQLを扱う', 22 | 'name': '伊賀 裕展', 23 | 'datetime': '11/29 18:25-18:55', 24 | 'twitter': 'https://twitter.com/iganin_dev', 25 | 'fortee': 26 | 'https://fortee.jp/flutterkaigi-2021/proposal/768e5a3e-15ba-4bf7-8944-293f382f7c04', 27 | 'youtube': '', 28 | }, 29 | 3: { 30 | 'title': 'Everything is an "Element"', 31 | 'name': 'ちゅーやん', 32 | 'datetime': '11/29 19:10-19:40', 33 | 'twitter': 'https://twitter.com/chooyan_i18n', 34 | 'fortee': 35 | 'https://fortee.jp/flutterkaigi-2021/proposal/35f31f8d-1199-40ed-830b-f582cf2b2e58', 36 | 'youtube': '', 37 | }, 38 | 4: { 39 | 'title': '実例と歴史から学ぶ!Flutterの状態管理方法の選定', 40 | 'name': 'entaku', 41 | 'datetime': '11/29 19:45-20:15', 42 | 'twitter': 'https://twitter.com/entaku_0818', 43 | 'fortee': 44 | 'https://fortee.jp/flutterkaigi-2021/proposal/b19c70dc-86c7-4802-b632-73d95fb0d7b1', 45 | 'youtube': '', 46 | }, 47 | 5: { 48 | 'title': 'Flutterにおける過不足のないセキュリティの実装', 49 | 'name': '山本小龍', 50 | 'datetime': '11/29 20:20-20:50', 51 | 'twitter': 'https://twitter.com/shoryu927', 52 | 'fortee': 53 | 'https://fortee.jp/flutterkaigi-2021/proposal/d9d7fd4e-4035-44ab-ae1b-81cd90d26ff5', 54 | 'youtube': '', 55 | }, 56 | 6: { 57 | 'title': 'FlutterにUIのマイクロサービス開発を導入し、圧倒的なDXを実現しよう!', 58 | 'name': '若宮浩司', 59 | 'datetime': '11/30 17:15-17:45', 60 | 'twitter': 'https://twitter.com/D_R_1009', 61 | 'fortee': 62 | 'https://fortee.jp/flutterkaigi-2021/proposal/14be2d28-e0e4-44bb-9579-3777e2e80e51', 63 | 'youtube': '', 64 | }, 65 | 7: { 66 | 'title': 'FlutterのバックグラウンドDartコード実行を理解する', 67 | 'name': 'Kurogoma4D', 68 | 'datetime': '11/30 17:50-18:20', 69 | 'twitter': 'https://twitter.com/Krgm4D', 70 | 'fortee': 71 | 'https://fortee.jp/flutterkaigi-2021/proposal/7c59b637-5932-4b8a-a85a-e838a1b7e08e', 72 | 'youtube': '', 73 | }, 74 | 8: { 75 | 'title': 'Deep dive into Sliver', 76 | 'name': '塚本 武志', 77 | 'datetime': '11/30 18:25-18:55', 78 | 'twitter': 'https://twitter.com/itometeam', 79 | 'fortee': 80 | 'https://fortee.jp/flutterkaigi-2021/proposal/40507589-8b70-4bae-b41d-40160d3d179f', 81 | 'youtube': '', 82 | }, 83 | 9: { 84 | 'title': 'Textの構造を理解する', 85 | 'name': 'batch', 86 | 'datetime': '11/30 19:10-19:40', 87 | 'twitter': 'https://twitter.com/b4tchkn', 88 | 'fortee': 89 | 'https://fortee.jp/flutterkaigi-2021/proposal/5478a174-07ca-4604-8402-bf4487e1adf0', 90 | 'youtube': '', 91 | }, 92 | 10: { 93 | 'title': 'アクセシビリティが高いFlutterアプリケーションを開発する', 94 | 'name': '1059999', 95 | 'datetime': '11/30 19:45-20:15', 96 | 'twitter': 'https://twitter.com/akihisasen', 97 | 'fortee': 98 | 'https://fortee.jp/flutterkaigi-2021/proposal/d80e1204-3fd5-4c55-b728-83ee1dbf1d01', 99 | 'youtube': '', 100 | }, 101 | 11: { 102 | 'title': 'UIカタログアプリで実現する Visual Regression Testing', 103 | 'name': 'KyoheiG3', 104 | 'datetime': '11/30 20:20-20:50', 105 | 'twitter': 'https://twitter.com/KyoheiG3', 106 | 'fortee': 107 | 'https://fortee.jp/flutterkaigi-2021/proposal/df0e4a77-790c-43f6-87d6-d2693eca7c8c', 108 | 'youtube': '', 109 | }, 110 | }; 111 | -------------------------------------------------------------------------------- /lib/data/staff.dart: -------------------------------------------------------------------------------- 1 | final kStaffList = [ 2 | { 3 | 'name': '大西', 4 | 'photo': 5 | 'https://pbs.twimg.com/profile_images/1057295751821160448/OZCsixgP_400x400.jpg', 6 | 'url': 'https://twitter.com/camdekka', 7 | }, 8 | { 9 | 'name': 'yagitatsu', 10 | 'photo': 11 | 'https://pbs.twimg.com/profile_images/1435550945157337091/GNxormVJ_400x400.jpg', 12 | 'url': 'https://twitter.com/yagitatsu3', 13 | }, 14 | { 15 | 'name': 'すなが', 16 | 'photo': 17 | 'https://pbs.twimg.com/profile_images/1241028282843197441/XSQf3tJk_400x400.jpg', 18 | 'url': 'https://twitter.com/SKKbySSK_TC', 19 | }, 20 | { 21 | 'name': 'y-shika', 22 | 'photo': 'https://avatars.githubusercontent.com/u/34807109?v=4', 23 | 'url': 'https://twitter.com/y_sh1ka', 24 | }, 25 | { 26 | 'name': 'wasabeef', 27 | 'photo': 'https://avatars.githubusercontent.com/u/1833474?v=4', 28 | 'url': 'https://twitter.com/wasabeef_jp', 29 | }, 30 | { 31 | 'name': 'ssoejima', 32 | 'photo': 33 | 'https://pbs.twimg.com/profile_images/1433810816633999362/IYkUyXNP_400x400.jpg', 34 | 'url': 'https://twitter.com/highballegg', 35 | }, 36 | { 37 | 'name': 'm.kosuke', 38 | 'photo': 39 | 'https://pbs.twimg.com/profile_images/949876562035290112/WHda0iOA_400x400.jpg', 40 | 'url': 'https://twitter.com/kosuke_mtm', 41 | }, 42 | { 43 | 'name': 'kikuchy', 44 | 'photo': 45 | 'https://pbs.twimg.com/profile_images/481267728/icon_128_400x400.png', 46 | 'url': 'https://twitter.com/kikuchy', 47 | }, 48 | { 49 | 'name': 'robo', 50 | 'photo': 51 | 'https://pbs.twimg.com/profile_images/1419301002/robo_2_400x400.png', 52 | 'url': 'https://twitter.com/cch_robo', 53 | }, 54 | { 55 | 'name': 'ストクロ', 56 | 'photo': 57 | 'https://pbs.twimg.com/profile_images/678582858991034368/pcfPc0XB_400x400.jpg', 58 | 'url': 'https://twitter.com/kurotyann9696', 59 | }, 60 | { 61 | 'name': 'キンパツ', 62 | 'photo': 63 | 'https://pbs.twimg.com/profile_images/1382266781826383873/-L96g3tE_400x400.jpg', 64 | 'url': 'https://twitter.com/operandoOS', 65 | }, 66 | { 67 | 'name': 'jiyuujin', 68 | 'photo': 69 | 'https://pbs.twimg.com/profile_images/1154037739035119620/IX0vq03C_400x400.jpg', 70 | 'url': 'https://twitter.com/jiyuujinlab', 71 | }, 72 | { 73 | 'name': 'katsummy', 74 | // 'photo': Assets.photo.katsummy.path, 75 | 'photo': 76 | 'https://pbs.twimg.com/profile_images/378800000593680476/aa0280b76541ed89ca802472ea174c57_400x400.png', 77 | 'url': 'https://twitter.com/katsummy', 78 | }, 79 | ]; 80 | -------------------------------------------------------------------------------- /lib/entity/timetable_entity.dart: -------------------------------------------------------------------------------- 1 | class TimetableEntity { 2 | List timetable = []; 3 | 4 | TimetableEntity({required this.timetable}); 5 | 6 | TimetableEntity.fromJson(Map json) { 7 | if (json['timetable'] != null) { 8 | json['timetable'].forEach((v) { 9 | timetable.add(Timetable.fromJson(v)); 10 | }); 11 | } 12 | } 13 | 14 | Map? toJson() { 15 | final data = {}; 16 | data['timetable'] = timetable.map((v) => v.toJson()).toList(); 17 | return data; 18 | } 19 | 20 | TimetableEntity.empty() { 21 | timetable = []; 22 | } 23 | 24 | @override 25 | String toString() => 'TimetableEntity(timetable: $timetable)'; 26 | } 27 | 28 | class Timetable { 29 | String? type; 30 | String? uuid; 31 | String? title; 32 | String? abstract; 33 | Track? track; 34 | String? startsAt; 35 | int? lengthMin; 36 | Speaker? speaker; 37 | bool? accepted; 38 | int? favCount; 39 | Feedback? feedback; 40 | 41 | Timetable( 42 | {this.type, 43 | this.uuid, 44 | this.title, 45 | this.abstract, 46 | this.track, 47 | this.startsAt, 48 | this.lengthMin, 49 | this.speaker, 50 | this.accepted, 51 | this.favCount, 52 | this.feedback}); 53 | 54 | Timetable.fromJson(Map json) { 55 | type = json['type']; 56 | uuid = json['uuid']; 57 | title = json['title']; 58 | abstract = json['abstract']; 59 | track = json['track'] != null ? Track.fromJson(json['track']) : null; 60 | startsAt = json['starts_at']; 61 | lengthMin = json['length_min']; 62 | speaker = 63 | json['speaker'] != null ? Speaker.fromJson(json['speaker']) : null; 64 | accepted = json['accepted']; 65 | favCount = json['fav_count']; 66 | feedback = 67 | json['feedback'] != null ? Feedback.fromJson(json['feedback']) : null; 68 | } 69 | 70 | Map toJson() { 71 | final data = {}; 72 | data['type'] = type; 73 | data['uuid'] = uuid; 74 | data['title'] = title; 75 | data['abstract'] = abstract; 76 | data['track'] = track?.toJson(); 77 | data['starts_at'] = startsAt; 78 | data['length_min'] = lengthMin; 79 | data['speaker'] = speaker?.toJson(); 80 | data['accepted'] = accepted; 81 | data['fav_count'] = favCount; 82 | data['feedback'] = feedback?.toJson(); 83 | return data; 84 | } 85 | 86 | @override 87 | String toString() { 88 | return 'Timetable(type: $type, uuid: $uuid, title: $title, abstract: $abstract, track: $track, startsAt: $startsAt, lengthMin: $lengthMin, speaker: $speaker, accepted: $accepted, favCount: $favCount, feedback: $feedback)'; 89 | } 90 | } 91 | 92 | class Track { 93 | String? name; 94 | int? sort; 95 | 96 | Track({this.name, this.sort}); 97 | 98 | Track.fromJson(Map json) { 99 | name = json['name']; 100 | sort = json['sort']; 101 | } 102 | 103 | Map toJson() { 104 | final data = {}; 105 | data['name'] = name; 106 | data['sort'] = sort; 107 | return data; 108 | } 109 | 110 | @override 111 | String toString() => 'Track(name: $name, sort: $sort)'; 112 | } 113 | 114 | class Speaker { 115 | String? name; 116 | String? kana; 117 | String? twitter; 118 | String? avatarUrl; 119 | 120 | Speaker({this.name, this.kana, this.twitter, this.avatarUrl}); 121 | 122 | Speaker.fromJson(Map json) { 123 | name = json['name']; 124 | kana = json['kana']; 125 | twitter = json['twitter']; 126 | avatarUrl = json['avatar_url']; 127 | } 128 | 129 | Map toJson() { 130 | final data = {}; 131 | data['name'] = name; 132 | data['kana'] = kana; 133 | data['twitter'] = twitter; 134 | data['avatar_url'] = avatarUrl; 135 | return data; 136 | } 137 | 138 | @override 139 | String toString() { 140 | return 'Speaker(name: $name, kana: $kana, twitter: $twitter, avatarUrl: $avatarUrl)'; 141 | } 142 | } 143 | 144 | class Feedback { 145 | bool? open; 146 | 147 | Feedback({this.open}); 148 | 149 | Feedback.fromJson(Map json) { 150 | open = json['open']; 151 | } 152 | 153 | Map toJson() { 154 | final data = {}; 155 | data['open'] = open; 156 | return data; 157 | } 158 | 159 | @override 160 | String toString() => 'Feedback(open: $open)'; 161 | } 162 | -------------------------------------------------------------------------------- /lib/gen/assets.gen.dart: -------------------------------------------------------------------------------- 1 | /// GENERATED CODE - DO NOT MODIFY BY HAND 2 | /// ***************************************************** 3 | /// FlutterGen 4 | /// ***************************************************** 5 | 6 | // ignore_for_file: directives_ordering 7 | 8 | import 'package:flutter/widgets.dart'; 9 | 10 | class $AssetsMusicGen { 11 | const $AssetsMusicGen(); 12 | 13 | /// File path: assets/music/bensound-dreams.mp3 14 | String get bensoundDreams => 'assets/music/bensound-dreams.mp3'; 15 | 16 | /// File path: assets/music/bensound-thelounge.mp3 17 | String get bensoundThelounge => 'assets/music/bensound-thelounge.mp3'; 18 | } 19 | 20 | class $AssetsPhotoGen { 21 | const $AssetsPhotoGen(); 22 | 23 | /// File path: assets/photo/katsummy.png 24 | AssetGenImage get katsummy => 25 | const AssetGenImage('assets/photo/katsummy.png'); 26 | } 27 | 28 | class Assets { 29 | Assets._(); 30 | 31 | static const AssetGenImage banner = AssetGenImage('assets/banner.png'); 32 | static const String discordLogo = 'assets/discord_logo.svg'; 33 | static const String flutterkaigiNavbarLogo = 34 | 'assets/flutterkaigi-navbar_logo.svg'; 35 | static const String flutterkaigiLogo = 'assets/flutterkaigi_logo.svg'; 36 | static const String githubLogo = 'assets/github_logo.svg'; 37 | static const $AssetsMusicGen music = $AssetsMusicGen(); 38 | static const $AssetsPhotoGen photo = $AssetsPhotoGen(); 39 | static const String twitterLogo = 'assets/twitter_logo.svg'; 40 | static const String twitterWhite = 'assets/twitter_white.svg'; 41 | } 42 | 43 | class AssetGenImage extends AssetImage { 44 | const AssetGenImage(String assetName) : super(assetName); 45 | 46 | Image image({ 47 | Key? key, 48 | ImageFrameBuilder? frameBuilder, 49 | ImageLoadingBuilder? loadingBuilder, 50 | ImageErrorWidgetBuilder? errorBuilder, 51 | String? semanticLabel, 52 | bool excludeFromSemantics = false, 53 | double? width, 54 | double? height, 55 | Color? color, 56 | BlendMode? colorBlendMode, 57 | BoxFit? fit, 58 | AlignmentGeometry alignment = Alignment.center, 59 | ImageRepeat repeat = ImageRepeat.noRepeat, 60 | Rect? centerSlice, 61 | bool matchTextDirection = false, 62 | bool gaplessPlayback = false, 63 | bool isAntiAlias = false, 64 | FilterQuality filterQuality = FilterQuality.low, 65 | }) { 66 | return Image( 67 | key: key, 68 | image: this, 69 | frameBuilder: frameBuilder, 70 | loadingBuilder: loadingBuilder, 71 | errorBuilder: errorBuilder, 72 | semanticLabel: semanticLabel, 73 | excludeFromSemantics: excludeFromSemantics, 74 | width: width, 75 | height: height, 76 | color: color, 77 | colorBlendMode: colorBlendMode, 78 | fit: fit, 79 | alignment: alignment, 80 | repeat: repeat, 81 | centerSlice: centerSlice, 82 | matchTextDirection: matchTextDirection, 83 | gaplessPlayback: gaplessPlayback, 84 | isAntiAlias: isAntiAlias, 85 | filterQuality: filterQuality, 86 | ); 87 | } 88 | 89 | String get path => assetName; 90 | } 91 | -------------------------------------------------------------------------------- /lib/l10n/app_en.arb: -------------------------------------------------------------------------------- 1 | { 2 | "home": "Home", 3 | "event": "Past Events", 4 | "tweet": "Tweet", 5 | "letsTweet": "Tweet #FlutterKaigi!", 6 | "proposalSubmissionStart": "Talk Submission Has Started!", 7 | "proposalList": "List of Proposals", 8 | "schedule": "Schedule", 9 | "showSchedule": "Show the schedule", 10 | "applyMainEvent": "Register now", 11 | "openMainEventPage": "Open the registration page", 12 | "submitProposal": "Submit Talk Proposals", 13 | "showProposals": "Show all submitted talk proposals", 14 | "codeOfConduct": "Code of Conduct", 15 | "privacyPolicy": "Privacy Policy", 16 | "contactUs": "Contact Us", 17 | "thanksToEveryone": "Thanks to everyone, FlutterKaigi 2021 has been successfully completed", 18 | "staff": "Staffs", 19 | "session": "Sessions", 20 | "checkSessionDetailsInFortee": "Check session details in fortee", 21 | "checkSessionDetailsInYouTube": "Check session details in YouTube", 22 | "alphabeticalOrder": "listed alphabetically", 23 | "timetableOrder": "Ordered by start time", 24 | "copyright" : "© 2021 FlutterKaigi Executive Committee", 25 | "licenses": "Licenses", 26 | "teaser": "Teaser", 27 | "interlude": "Interlude", 28 | "disclaimer": "Flutter and the related logo are trademarks of Google LLC. FlutterKaigi is not affiliated with or otherwise sponsored by Google LLC.", 29 | "trademark" : "The \"Flutter\" name and the Flutter logo (the \"Flutter Marks\") are trademarks owned by Google.", 30 | "acknowledgements": "Special thanks to Diverse, Inc. & DeNA Co., Ltd. for hosting and live streaming" 31 | } 32 | -------------------------------------------------------------------------------- /lib/l10n/app_ja.arb: -------------------------------------------------------------------------------- 1 | { 2 | "home": "ホーム", 3 | "event": "イベント", 4 | "tweet": "ツイート", 5 | "letsTweet": "#FlutterKaigi でツイートしよう!", 6 | "proposalSubmissionStart": "トーク募集開始!", 7 | "proposalList": "プロポーザル一覧", 8 | "schedule": "タイムテーブル", 9 | "showSchedule": "タイムテーブルを開く", 10 | "applyMainEvent": "イベントに申し込む", 11 | "openMainEventPage": "イベントページを開く", 12 | "submitProposal": "トークを提出する", 13 | "showProposals": "プロポーザル一覧を開く", 14 | "codeOfConduct": "行動規範", 15 | "privacyPolicy": "プライバシーポリシー", 16 | "contactUs": "お問い合わせ", 17 | "thanksToEveryone": "FlutterKaigi 2021 は皆様のおかげで無事終了いたしました", 18 | "staff": "スタッフ", 19 | "session": "セッション", 20 | "checkSessionDetailsInFortee": "forteeでセッションの詳細をチェック", 21 | "checkSessionDetailsInYouTube": "YouTubeでセッションの詳細をチェック", 22 | "alphabeticalOrder": "アルファベット順", 23 | "displayAlphabeticalOrder": "アルファベット順で表示しています", 24 | "timetableOrder": "タイムテーブル順", 25 | "copyright" : "© 2021 FlutterKaigi 実行委員会", 26 | "licenses": "ライセンス", 27 | "teaser": "ティーザー", 28 | "interlude": "インタールード", 29 | "disclaimer": "Flutter and the related logo are trademarks of Google LLC. FlutterKaigi is not affiliated with or otherwise sponsored by Google LLC.", 30 | "trademark" : "The \"Flutter\" name and the Flutter logo (the \"Flutter Marks\") are trademarks owned by Google.", 31 | "acknowledgements": "ホスティング、ライブ配信は株式会社 Diverse 様、株式会社ディー・エヌ・エー 様にご協力いただいています。" 32 | } 33 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:confwebsite2021/router/index.dart'; 2 | import 'package:confwebsite2021/theme.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter_gen/gen_l10n/app_localizations.dart'; 5 | 6 | void main() { 7 | runApp(const MyApp()); 8 | } 9 | 10 | class MyApp extends StatelessWidget { 11 | const MyApp({Key? key}) : super(key: key); 12 | 13 | @override 14 | Widget build(BuildContext context) { 15 | return MaterialApp( 16 | debugShowCheckedModeBanner: false, 17 | title: 'FlutterKaigi 2021', 18 | theme: AppTheme.theme, 19 | onGenerateRoute: buildRouters, 20 | initialRoute: '/', 21 | localizationsDelegates: AppLocalizations.localizationsDelegates, 22 | supportedLocales: AppLocalizations.supportedLocales, 23 | ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lib/pages/index.dart: -------------------------------------------------------------------------------- 1 | import 'package:confwebsite2021/gen/assets.gen.dart'; 2 | import 'package:confwebsite2021/responsive_layout_builder.dart'; 3 | import 'package:confwebsite2021/widgets/background.dart'; 4 | import 'package:confwebsite2021/widgets/cfs_button.dart'; 5 | import 'package:confwebsite2021/widgets/footer.dart'; 6 | import 'package:confwebsite2021/widgets/social.dart'; 7 | import 'package:flutter/material.dart'; 8 | import 'package:flutter_gen/gen_l10n/app_localizations.dart'; 9 | import 'package:flutter_svg/flutter_svg.dart'; 10 | import 'package:gap/gap.dart'; 11 | import 'package:url_launcher/url_launcher.dart'; 12 | 13 | enum MenuItem { event, tweet } 14 | 15 | class TopPage extends StatelessWidget { 16 | const TopPage({Key? key}) : super(key: key); 17 | 18 | @override 19 | Widget build(BuildContext context) { 20 | return ResponsiveLayoutBuilder(builder: (context, layout, width) { 21 | return Scaffold( 22 | appBar: AppBar( 23 | title: SvgPicture.asset( 24 | Assets.flutterkaigiNavbarLogo, 25 | // height: kToolbarHeight, 26 | width: 240, 27 | ), 28 | centerTitle: false, 29 | backgroundColor: Colors.white, 30 | elevation: 0, 31 | actions: buildActions(context, layout, width), 32 | ), 33 | body: Stack( 34 | children: [ 35 | const Body(), 36 | BackgroundCanvas(size: MediaQuery.of(context).size), 37 | ], 38 | ), 39 | ); 40 | }); 41 | } 42 | 43 | List buildActions( 44 | BuildContext context, ResponsiveLayout layout, double width) { 45 | if (layout == ResponsiveLayout.slim) { 46 | return buildPopupMenuButton(context); 47 | } else { 48 | return buildActionButtons(context); 49 | } 50 | } 51 | 52 | List buildPopupMenuButton(BuildContext context) { 53 | final appLocalizations = AppLocalizations.of(context)!; 54 | return [ 55 | PopupMenuButton( 56 | icon: const Icon(Icons.menu, color: Colors.black), 57 | onSelected: (MenuItem result) async { 58 | String urlString; 59 | switch (result) { 60 | case MenuItem.event: 61 | urlString = 'https://flutter-jp.connpass.com/'; 62 | break; 63 | case MenuItem.tweet: 64 | urlString = 65 | 'https://twitter.com/intent/tweet?hashtags=FlutterKaigi'; 66 | break; 67 | } 68 | await launch( 69 | urlString, 70 | webOnlyWindowName: '_blank', 71 | ); 72 | }, 73 | itemBuilder: (BuildContext context) => >[ 74 | PopupMenuItem( 75 | value: MenuItem.event, 76 | child: Text(appLocalizations.event), 77 | ), 78 | PopupMenuItem( 79 | value: MenuItem.tweet, 80 | child: Container( 81 | padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), 82 | decoration: BoxDecoration( 83 | shape: BoxShape.rectangle, 84 | color: Colors.blue, 85 | borderRadius: BorderRadius.circular(32), 86 | ), 87 | child: Row( 88 | mainAxisSize: MainAxisSize.min, 89 | children: [ 90 | SvgPicture.asset(Assets.twitterWhite, width: 20), 91 | const Gap(8), 92 | Text( 93 | appLocalizations.tweet, 94 | style: Theme.of(context).textTheme.button?.copyWith( 95 | color: Colors.white, 96 | fontWeight: FontWeight.bold, 97 | ), 98 | ), 99 | ], 100 | ), 101 | ), 102 | ), 103 | ], 104 | ) 105 | ]; 106 | } 107 | 108 | List buildActionButtons(BuildContext context) { 109 | final appLocalizations = AppLocalizations.of(context)!; 110 | return [ 111 | Container( 112 | margin: const EdgeInsets.all(8), 113 | child: Tooltip( 114 | message: 'https://flutter-jp.connpass.com/', 115 | child: TextButton( 116 | onPressed: () async { 117 | await launch( 118 | 'https://flutter-jp.connpass.com/', 119 | webOnlyWindowName: '_blank', 120 | ); 121 | }, 122 | child: Text(appLocalizations.event), 123 | ), 124 | ), 125 | ), 126 | Container( 127 | margin: const EdgeInsets.all(8), 128 | child: Tooltip( 129 | message: appLocalizations.letsTweet, 130 | child: ElevatedButton.icon( 131 | onPressed: () async { 132 | await launch( 133 | 'https://twitter.com/intent/tweet?hashtags=FlutterKaigi', 134 | webOnlyWindowName: '_blank', 135 | ); 136 | }, 137 | style: ElevatedButton.styleFrom( 138 | shape: const StadiumBorder(), 139 | ), 140 | icon: SvgPicture.asset(Assets.twitterWhite, width: 20), 141 | label: Text(appLocalizations.tweet), 142 | ), 143 | ), 144 | ), 145 | ]; 146 | } 147 | } 148 | 149 | class Body extends StatelessWidget { 150 | const Body({Key? key}) : super(key: key); 151 | 152 | TextStyle get titleTextStyle => const TextStyle(fontSize: 64); 153 | 154 | TextStyle get subtitleTextStyle => const TextStyle(fontSize: 36); 155 | 156 | TextStyle get thanksTextStyle => const TextStyle(fontSize: 14); 157 | 158 | int get logoWidth => 320; 159 | 160 | @override 161 | Widget build(BuildContext context) { 162 | final appLocalizations = AppLocalizations.of(context)!; 163 | 164 | return ResponsiveLayoutBuilder(builder: (context, layout, width) { 165 | final sizeFactor = (layout == ResponsiveLayout.slim) ? 0.6 : 1.0; 166 | 167 | return CustomScrollView( 168 | slivers: [ 169 | SliverFillRemaining( 170 | hasScrollBody: false, 171 | child: Column( 172 | children: [ 173 | Container( 174 | padding: const EdgeInsets.symmetric(vertical: 16), 175 | child: Column( 176 | children: [ 177 | SvgPicture.asset( 178 | Assets.flutterkaigiLogo, 179 | width: logoWidth * sizeFactor, 180 | ), 181 | FittedBox( 182 | fit: BoxFit.contain, 183 | child: Text( 184 | 'FlutterKaigi', 185 | style: 186 | titleTextStyle.apply(fontSizeFactor: sizeFactor), 187 | ), 188 | ), 189 | Gap(32 * sizeFactor), 190 | FittedBox( 191 | fit: BoxFit.contain, 192 | child: Text( 193 | '@ONLINE / November 29-30, 2021', 194 | style: subtitleTextStyle.apply( 195 | fontSizeFactor: sizeFactor), 196 | ), 197 | ), 198 | const Gap(32), 199 | FittedBox( 200 | fit: BoxFit.contain, 201 | child: Text( 202 | appLocalizations.thanksToEveryone, 203 | style: 204 | thanksTextStyle.apply(fontSizeFactor: sizeFactor), 205 | ), 206 | ), 207 | const Gap(16), 208 | const CfsButton(), 209 | const Gap(16), 210 | const Social(), 211 | ], 212 | ), 213 | ), 214 | const Spacer(), 215 | const Footer(), 216 | ], 217 | ), 218 | ) 219 | ], 220 | ); 221 | }); 222 | } 223 | } 224 | -------------------------------------------------------------------------------- /lib/pages/session.dart: -------------------------------------------------------------------------------- 1 | import 'package:confwebsite2021/data/speaker.dart'; 2 | import 'package:confwebsite2021/responsive_layout_builder.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter_gen/gen_l10n/app_localizations.dart'; 5 | import 'package:flutter_svg/flutter_svg.dart'; 6 | import 'package:url_launcher/url_launcher.dart'; 7 | 8 | class SessionPage extends StatelessWidget { 9 | const SessionPage({Key? key}) : super(key: key); 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | final appLocalizations = AppLocalizations.of(context)!; 14 | 15 | return Scaffold( 16 | appBar: AppBar( 17 | title: Text(appLocalizations.session), 18 | ), 19 | body: ResponsiveLayoutBuilder(builder: (context, layout, width) { 20 | return Scrollbar( 21 | child: SingleChildScrollView( 22 | physics: const ScrollPhysics(), 23 | child: Column( 24 | children: [ 25 | Container( 26 | alignment: Alignment.centerRight, 27 | child: Padding( 28 | padding: const EdgeInsets.all(4), 29 | child: Tooltip( 30 | message: appLocalizations.timetableOrder, 31 | child: Text( 32 | appLocalizations.timetableOrder, 33 | style: const TextStyle( 34 | fontWeight: FontWeight.bold, 35 | ), 36 | ), 37 | ), 38 | ), 39 | ), 40 | ListView.builder( 41 | physics: const NeverScrollableScrollPhysics(), 42 | shrinkWrap: true, 43 | itemCount: kSpeakerList.length, 44 | padding: const EdgeInsets.only(top: 10.0), 45 | itemBuilder: (context, index) { 46 | if (index == 0) { 47 | return Column( 48 | children: [ 49 | const DaySeparator(day: 1), 50 | CardItem( 51 | title: kSpeakerList[index]!['title'] ?? '', 52 | name: kSpeakerList[index]!['name'] ?? '', 53 | datetime: kSpeakerList[index]!['datetime'] ?? '', 54 | twitter: kSpeakerList[index]!['twitter'] ?? '', 55 | fortee: kSpeakerList[index]!['fortee'] ?? '', 56 | youtube: kSpeakerList[index]!['youtube'] ?? '', 57 | ), 58 | ], 59 | ); 60 | } 61 | if (index == 6) { 62 | return Column( 63 | children: [ 64 | const DaySeparator(day: 2), 65 | CardItem( 66 | title: kSpeakerList[index]!['title'] ?? '', 67 | name: kSpeakerList[index]!['name'] ?? '', 68 | datetime: kSpeakerList[index]!['datetime'] ?? '', 69 | twitter: kSpeakerList[index]!['twitter'] ?? '', 70 | fortee: kSpeakerList[index]!['fortee'] ?? '', 71 | youtube: kSpeakerList[index]!['youtube'] ?? '', 72 | ) 73 | ], 74 | ); 75 | } 76 | return CardItem( 77 | title: kSpeakerList[index]!['title'] ?? '', 78 | name: kSpeakerList[index]!['name'] ?? '', 79 | datetime: kSpeakerList[index]!['datetime'] ?? '', 80 | twitter: kSpeakerList[index]!['twitter'] ?? '', 81 | fortee: kSpeakerList[index]!['fortee'] ?? '', 82 | youtube: kSpeakerList[index]!['youtube'] ?? '', 83 | ); 84 | }), 85 | ], 86 | ), 87 | )); 88 | }), 89 | ); 90 | } 91 | } 92 | 93 | class CardItem extends StatelessWidget { 94 | const CardItem({ 95 | Key? key, 96 | required this.title, 97 | required this.name, 98 | required this.datetime, 99 | required this.twitter, 100 | required this.fortee, 101 | required this.youtube, 102 | }) : super(key: key); 103 | final String title; 104 | final String name; 105 | final String datetime; 106 | final String twitter; 107 | final String fortee; 108 | final String youtube; 109 | 110 | @override 111 | Widget build(BuildContext context) { 112 | final appLocalizations = AppLocalizations.of(context)!; 113 | 114 | return Tooltip( 115 | message: appLocalizations.checkSessionDetailsInFortee, 116 | child: Card( 117 | elevation: 3, 118 | child: Column(mainAxisSize: MainAxisSize.min, children: [ 119 | ListTile( 120 | dense: true, 121 | leading: const Icon(Icons.movie), 122 | title: Text( 123 | title, 124 | style: const TextStyle( 125 | fontSize: 15.0, fontWeight: FontWeight.bold), 126 | ), 127 | subtitle: Column( 128 | mainAxisAlignment: MainAxisAlignment.start, 129 | crossAxisAlignment: CrossAxisAlignment.start, 130 | children: [ 131 | Container( 132 | padding: const EdgeInsets.only(top: 4), 133 | child: Text(name, 134 | style: const TextStyle( 135 | fontSize: 14.0, fontWeight: FontWeight.normal)), 136 | ), 137 | Container( 138 | padding: const EdgeInsets.only(top: 4), 139 | child: Text(datetime, 140 | style: const TextStyle( 141 | fontSize: 12.0, fontWeight: FontWeight.normal)), 142 | ), 143 | ]), 144 | trailing: Column( 145 | mainAxisAlignment: MainAxisAlignment.start, 146 | crossAxisAlignment: CrossAxisAlignment.start, 147 | children: [ 148 | Tooltip( 149 | message: twitter, 150 | child: IconButton( 151 | icon: SvgPicture.asset( 152 | '/twitter_logo.svg', 153 | width: 40, 154 | ), 155 | onPressed: () async { 156 | await launch( 157 | twitter, 158 | webOnlyWindowName: '_blank', 159 | ); 160 | }, 161 | ), 162 | ), 163 | ]), 164 | onTap: () async { 165 | await launch( 166 | fortee, 167 | webOnlyWindowName: '_blank', 168 | ); 169 | }, 170 | ), 171 | ]))); 172 | } 173 | } 174 | 175 | class DaySeparator extends StatelessWidget { 176 | const DaySeparator({ 177 | Key? key, 178 | required this.day, 179 | }) : super(key: key); 180 | final int day; 181 | 182 | @override 183 | Widget build(BuildContext context) { 184 | return Tooltip( 185 | message: 'Day $day', 186 | child: Card( 187 | elevation: 3, 188 | child: Column(mainAxisSize: MainAxisSize.min, children: [ 189 | ListTile( 190 | dense: true, 191 | title: Column( 192 | mainAxisAlignment: MainAxisAlignment.center, 193 | crossAxisAlignment: CrossAxisAlignment.center, 194 | children: [ 195 | Text('Day $day', 196 | style: const TextStyle( 197 | fontSize: 14.0, fontWeight: FontWeight.normal)), 198 | ]), 199 | ), 200 | ])), 201 | ); 202 | } 203 | } 204 | -------------------------------------------------------------------------------- /lib/pages/staff.dart: -------------------------------------------------------------------------------- 1 | import 'package:confwebsite2021/data/staff.dart'; 2 | import 'package:confwebsite2021/gen/assets.gen.dart'; 3 | import 'package:confwebsite2021/responsive_layout_builder.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'package:flutter_gen/gen_l10n/app_localizations.dart'; 6 | import 'package:flutter_svg_provider/flutter_svg_provider.dart'; 7 | import 'package:transparent_image/transparent_image.dart'; 8 | import 'package:url_launcher/url_launcher.dart'; 9 | 10 | class StaffPage extends StatelessWidget { 11 | const StaffPage({Key? key}) : super(key: key); 12 | 13 | @override 14 | Widget build(BuildContext context) { 15 | final appLocalizations = AppLocalizations.of(context)!; 16 | kStaffList.sort((a, b) => (a['name'] ?? '').compareTo(b['name'] ?? '')); 17 | 18 | return Scaffold( 19 | appBar: AppBar( 20 | title: Text(appLocalizations.staff), 21 | ), 22 | body: ResponsiveLayoutBuilder(builder: (context, layout, width) { 23 | return Container( 24 | alignment: Alignment.topCenter, 25 | child: Column( 26 | children: [ 27 | Container( 28 | alignment: Alignment.centerRight, 29 | child: Padding( 30 | padding: const EdgeInsets.all(4), 31 | child: Tooltip( 32 | message: appLocalizations.alphabeticalOrder, 33 | child: Text( 34 | appLocalizations.alphabeticalOrder, 35 | style: const TextStyle( 36 | fontWeight: FontWeight.bold, 37 | ), 38 | ), 39 | ), 40 | ), 41 | ), 42 | Expanded( 43 | child: GridView.extent( 44 | primary: false, 45 | padding: const EdgeInsets.all(24), 46 | crossAxisSpacing: 24, 47 | mainAxisSpacing: 24, 48 | maxCrossAxisExtent: 100, 49 | children: kStaffList 50 | .map( 51 | (e) => StaffItem( 52 | name: e['name'] ?? '', 53 | photo: e['photo'] ?? '', 54 | url: e['url'] ?? '', 55 | ), 56 | ) 57 | .toList(), 58 | ), 59 | ), 60 | ], 61 | )); 62 | }), 63 | ); 64 | } 65 | } 66 | 67 | class StaffItem extends StatelessWidget { 68 | const StaffItem({ 69 | Key? key, 70 | required this.name, 71 | required this.photo, 72 | required this.url, 73 | }) : super(key: key); 74 | final String name; 75 | final String photo; 76 | final String url; 77 | 78 | @override 79 | Widget build(BuildContext context) { 80 | // final image = (photo.isNotEmpty 81 | // ? AssetImage(photo) 82 | // : const Svg(Assets.flutterkaigiLog)) as ImageProvider; 83 | 84 | final image = (photo.isNotEmpty && validUrl(photo) 85 | ? NetworkImage(photo) 86 | : const Svg(Assets.flutterkaigiLogo)) as ImageProvider; 87 | 88 | return InkWell( 89 | onTap: () async { 90 | if (await canLaunch(url)) { 91 | await launch(url); 92 | } 93 | }, 94 | child: Column( 95 | mainAxisAlignment: MainAxisAlignment.center, 96 | children: [ 97 | SizedBox( 98 | height: 64, 99 | width: 64, 100 | child: ClipOval( 101 | child: FadeInImage( 102 | fit: BoxFit.cover, 103 | image: image, 104 | placeholder: MemoryImage(kTransparentImage), 105 | ), 106 | ), 107 | ), 108 | FittedBox(child: Text(name)), 109 | ], 110 | ), 111 | ); 112 | } 113 | 114 | bool validUrl(String url) { 115 | try { 116 | Uri.parse(url); 117 | } on FormatException catch (_) { 118 | return false; 119 | } 120 | return true; 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /lib/pages/teaser.dart: -------------------------------------------------------------------------------- 1 | import 'package:confwebsite2021/gen/assets.gen.dart'; 2 | import 'package:confwebsite2021/responsive_layout_builder.dart'; 3 | import 'package:confwebsite2021/widgets/background.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'package:flutter_countdown_timer/countdown_timer_controller.dart'; 6 | import 'package:flutter_countdown_timer/index.dart'; 7 | import 'package:flutter_svg/flutter_svg.dart'; 8 | import 'package:gap/gap.dart'; 9 | import 'package:just_audio/just_audio.dart'; 10 | import 'package:sprintf/sprintf.dart'; 11 | 12 | class TeaserPage extends StatelessWidget { 13 | const TeaserPage({Key? key}) : super(key: key); 14 | 15 | @override 16 | Widget build(BuildContext context) { 17 | return ResponsiveLayoutBuilder(builder: (context, layout, width) { 18 | return Scaffold( 19 | body: Stack( 20 | children: [ 21 | const _Teaser(), 22 | BackgroundCanvas(size: MediaQuery.of(context).size), 23 | ], 24 | ), 25 | ); 26 | }); 27 | } 28 | } 29 | 30 | var now = DateTime.now(); 31 | var endTime = DateTime.utc(2021, 11, 29, 8, 00, 00).millisecondsSinceEpoch; 32 | // int get endTime { 33 | // if (now.year == 2021 && now.month == 11 && (now.day == 29 || now.day == 30)) { 34 | // return DateTime.utc(now.year, now.month, now.day, 8, 00, 00) 35 | // .millisecondsSinceEpoch; 36 | // } 37 | // return DateTime.utc(2021, 11, 29, 8, 00, 00).millisecondsSinceEpoch; 38 | // } 39 | 40 | class _Teaser extends StatefulWidget { 41 | const _Teaser({Key? key}) : super(key: key); 42 | 43 | @override 44 | State<_Teaser> createState() => _TeaserState(); 45 | } 46 | 47 | class _TeaserState extends State<_Teaser> with SingleTickerProviderStateMixin { 48 | TextStyle get titleTextStyle => const TextStyle(fontSize: 64); 49 | TextStyle get subtitleTextStyle => const TextStyle(fontSize: 36); 50 | TextStyle get timeTextStyle => 51 | const TextStyle(fontSize: 28, color: Color(0xFF174C90)); 52 | 53 | double get logoWidth => 320; 54 | late CountdownTimerController controller; 55 | late AudioPlayer audioPlayer; 56 | 57 | @override 58 | void initState() { 59 | super.initState(); 60 | controller = 61 | CountdownTimerController(endTime: endTime, onEnd: onEnd, vsync: this); 62 | audioPlayer = AudioPlayer(); 63 | audioPlayer.setLoopMode(LoopMode.all); 64 | audioPlayer.setAsset(Assets.music.bensoundDreams); 65 | audioPlayer.play(); 66 | } 67 | 68 | void onEnd() {} 69 | 70 | @override 71 | Widget build(BuildContext context) { 72 | return Center( 73 | child: Column( 74 | mainAxisAlignment: MainAxisAlignment.center, 75 | crossAxisAlignment: CrossAxisAlignment.center, 76 | children: [ 77 | SvgPicture.asset( 78 | Assets.flutterkaigiLogo, 79 | width: logoWidth, 80 | ), 81 | Text('FlutterKaigi', style: titleTextStyle), 82 | const Gap(32), 83 | Center( 84 | child: Text( 85 | '@ONLINE / November 29-30, 2021', 86 | style: subtitleTextStyle, 87 | textAlign: TextAlign.center, 88 | ), 89 | ), 90 | const Gap(32), 91 | CountdownTimer( 92 | controller: controller, 93 | // endTime: endTime, 94 | endWidget: const Center(child: Text('On Live!')), 95 | widgetBuilder: (_, CurrentRemainingTime? time) { 96 | if (time == null) { 97 | return Container(); 98 | } 99 | return Center( 100 | child: Table( 101 | defaultColumnWidth: const IntrinsicColumnWidth(), 102 | children: [ 103 | TableRow(children: [ 104 | Center( 105 | child: Text(sprintf("%02i", [time.days ?? 0]), 106 | style: timeTextStyle)), 107 | const SizedBox(width: 8), 108 | Center( 109 | child: Text(sprintf("%02i", [time.hours ?? 0]), 110 | style: timeTextStyle)), 111 | const SizedBox(width: 8), 112 | Center( 113 | child: Text(sprintf("%02i", [time.min ?? 0]), 114 | style: timeTextStyle)), 115 | const SizedBox(width: 8), 116 | Center( 117 | child: Text(sprintf("%02i", [time.sec ?? 0]), 118 | style: timeTextStyle)), 119 | ]), 120 | const TableRow(children: [ 121 | Center(child: Text('Days')), 122 | SizedBox(width: 16), 123 | Center(child: Text('Hours')), 124 | SizedBox(width: 16), 125 | Center(child: Text('Mins')), 126 | SizedBox(width: 16), 127 | Center(child: Text('Secs')), 128 | ]), 129 | ], 130 | ), 131 | ); 132 | // return Text( 133 | // 'days: [ ${time.days} ], hours: [ ${time.hours} ], min: [ ${time.min} ], sec: [ ${time.sec} ]'); 134 | }, 135 | ), 136 | ], 137 | ), 138 | ); 139 | } 140 | 141 | @override 142 | void dispose() { 143 | controller.dispose(); 144 | audioPlayer.dispose(); 145 | super.dispose(); 146 | } 147 | } 148 | -------------------------------------------------------------------------------- /lib/pages/timetable.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | import 'dart:convert'; 3 | 4 | import 'package:confwebsite2021/entity/timetable_entity.dart'; 5 | import 'package:confwebsite2021/gen/assets.gen.dart'; 6 | import 'package:confwebsite2021/responsive_layout_builder.dart'; 7 | import 'package:confwebsite2021/theme.dart'; 8 | import 'package:confwebsite2021/widgets/background.dart'; 9 | import 'package:flutter/material.dart'; 10 | import 'package:flutter/services.dart'; 11 | import 'package:flutter_gen/gen_l10n/app_localizations.dart'; 12 | import 'package:http/http.dart' as http; 13 | import 'package:intl/intl.dart'; 14 | import 'package:just_audio/just_audio.dart'; 15 | 16 | class TimetablePage extends StatelessWidget { 17 | const TimetablePage({Key? key}) : super(key: key); 18 | 19 | @override 20 | Widget build(BuildContext context) { 21 | return ResponsiveLayoutBuilder(builder: (context, layout, width) { 22 | return Scaffold( 23 | body: Stack( 24 | children: [ 25 | const _Timetable(), 26 | BackgroundCanvas(size: MediaQuery.of(context).size), 27 | ], 28 | ), 29 | ); 30 | }); 31 | } 32 | } 33 | 34 | class _Timetable extends StatefulWidget { 35 | const _Timetable({Key? key}) : super(key: key); 36 | 37 | @override 38 | State<_Timetable> createState() => _TimetableState(); 39 | } 40 | 41 | class _TimetableState extends State<_Timetable> 42 | with SingleTickerProviderStateMixin { 43 | TextStyle get titleTextStyle => const TextStyle(fontSize: 64); 44 | TextStyle get subtitleTextStyle => const TextStyle(fontSize: 36); 45 | late AudioPlayer audioPlayer; 46 | 47 | @override 48 | void initState() { 49 | super.initState(); 50 | audioPlayer = AudioPlayer(); 51 | audioPlayer.setLoopMode(LoopMode.all); 52 | audioPlayer.setAsset(Assets.music.bensoundThelounge); 53 | audioPlayer.play(); 54 | } 55 | 56 | Future> _getFutureValue() async { 57 | var response = await http 58 | .get(Uri.parse('https://fortee.jp/flutterkaigi-2021/api/timetable')); 59 | if (response.statusCode == 200) { 60 | var responseBody = utf8.decode(response.bodyBytes); 61 | return Future.value(TimetableEntity.fromJson(jsonDecode(responseBody)) 62 | .timetable 63 | .where((element) => element.type == 'talk') 64 | .toList()); 65 | } 66 | return Future.value(TimetableEntity.empty().timetable); 67 | } 68 | 69 | @override 70 | Widget build(BuildContext context) { 71 | return FutureBuilder>( 72 | future: _getFutureValue(), 73 | builder: (context, snapshot) { 74 | if (snapshot.connectionState != ConnectionState.done) { 75 | return const Center(child: CircularProgressIndicator()); 76 | } 77 | if (snapshot.hasData) { 78 | return _SlidePage(timetable: snapshot.data!); 79 | // return Text(snapshot.data.toString()); 80 | } else { 81 | return Container(); 82 | } 83 | }, 84 | ); 85 | } 86 | 87 | @override 88 | void dispose() { 89 | audioPlayer.dispose(); 90 | super.dispose(); 91 | } 92 | } 93 | 94 | class _SlidePage extends StatefulWidget { 95 | final List timetable; 96 | 97 | const _SlidePage({ 98 | Key? key, 99 | required this.timetable, 100 | }) : super(key: key); 101 | 102 | @override 103 | State<_SlidePage> createState() => _SlidePageState(); 104 | } 105 | 106 | class _SlidePageState extends State<_SlidePage> { 107 | final PageController _controller = PageController(); 108 | final FocusNode _focusNode = FocusNode(); 109 | Timer? _timer; 110 | 111 | @override 112 | void initState() { 113 | _timer = 114 | Timer.periodic(const Duration(seconds: 20), (_) => toggleSession()); 115 | super.initState(); 116 | } 117 | 118 | @override 119 | void dispose() { 120 | _focusNode.dispose(); 121 | _timer?.cancel(); 122 | super.dispose(); 123 | } 124 | 125 | bool showen = false; 126 | showSession() => setState(() => showen = false); 127 | showSessionList() => setState(() => showen = true); 128 | toggleSession() => setState(() => showen = !showen); 129 | 130 | @override 131 | Widget build(BuildContext context) { 132 | return RawKeyboardListener( 133 | autofocus: true, 134 | focusNode: _focusNode, 135 | onKey: handleKeyEvent, 136 | child: Stack( 137 | children: [ 138 | Padding( 139 | padding: const EdgeInsets.all(48.0), 140 | child: PageView.builder( 141 | controller: _controller, 142 | itemCount: widget.timetable.length, 143 | itemBuilder: (context, index) { 144 | var current = widget.timetable[index]; 145 | var list = widget.timetable 146 | .where((e) => _compareDate(e.startsAt!, current.startsAt!)) 147 | .toList(); 148 | var session = _Session( 149 | key: ValueKey(current.uuid!), timetable: current); 150 | var sessionList = _SessionList( 151 | key: ValueKey(current.startsAt!), 152 | timetable: list, 153 | current: current, 154 | ); 155 | // _current ??= _session; 156 | return AnimatedSwitcher( 157 | duration: const Duration(milliseconds: 2000), 158 | switchInCurve: Curves.ease, 159 | switchOutCurve: Curves.ease, 160 | child: showen ? sessionList : session, 161 | ); 162 | }, 163 | ), 164 | ), 165 | Align( 166 | alignment: Alignment.topLeft, 167 | child: Padding( 168 | padding: const EdgeInsets.all(8.0), 169 | child: Assets.banner.image(height: 50.0), 170 | ), 171 | ), 172 | const Align( 173 | alignment: Alignment.bottomRight, 174 | child: Padding( 175 | padding: EdgeInsets.all(8.0), 176 | child: _Footer(), 177 | ), 178 | ), 179 | Align( 180 | alignment: Alignment.topCenter, 181 | child: InkWell( 182 | child: Padding( 183 | padding: const EdgeInsets.all(16.0), 184 | child: Icon(showen 185 | ? Icons.expand_more_rounded 186 | : Icons.expand_less_rounded), 187 | ), 188 | onTap: toggleSession, 189 | ), 190 | ), 191 | Align( 192 | alignment: Alignment.centerLeft, 193 | child: InkWell( 194 | child: const Padding( 195 | padding: EdgeInsets.all(16.0), 196 | child: Icon(Icons.chevron_left_rounded), 197 | ), 198 | onTap: previousPage, 199 | ), 200 | ), 201 | Align( 202 | alignment: Alignment.centerRight, 203 | child: InkWell( 204 | child: const Padding( 205 | padding: EdgeInsets.all(16.0), 206 | child: Icon(Icons.chevron_right_rounded), 207 | ), 208 | onTap: nextPage, 209 | ), 210 | ), 211 | ], 212 | ), 213 | ); 214 | } 215 | 216 | previousPage() => _controller.previousPage( 217 | duration: const Duration(milliseconds: 600), curve: Curves.ease); 218 | 219 | nextPage() => _controller.nextPage( 220 | duration: const Duration(milliseconds: 600), curve: Curves.ease); 221 | 222 | handleKeyEvent(RawKeyEvent event) { 223 | debugPrint(event.logicalKey.debugName); 224 | if (event.logicalKey == LogicalKeyboardKey.arrowUp) { 225 | showSessionList(); 226 | } else if (event.logicalKey == LogicalKeyboardKey.arrowDown) { 227 | showSession(); 228 | } else if (event.logicalKey == LogicalKeyboardKey.arrowLeft) { 229 | previousPage(); 230 | } else if (event.logicalKey == LogicalKeyboardKey.arrowRight) { 231 | nextPage(); 232 | } else if (event.logicalKey == LogicalKeyboardKey.backspace) { 233 | previousPage(); 234 | } else if (event.logicalKey == LogicalKeyboardKey.space) { 235 | nextPage(); 236 | } 237 | } 238 | 239 | bool _compareDate(String a, String b) { 240 | return DateTime.parse(a).toLocal().day == DateTime.parse(b).toLocal().day; 241 | } 242 | } 243 | 244 | final df = DateFormat.jm(); 245 | speaker(Timetable timetable) { 246 | if (timetable.speaker == null) return ''; 247 | var name = 248 | timetable.speaker!.name != null ? 'by ${timetable.speaker!.name!}' : ''; 249 | var twitter = timetable.speaker!.twitter != null 250 | ? ' / @${timetable.speaker?.twitter!}' 251 | : ''; 252 | return name + twitter; 253 | } 254 | 255 | class _Session extends StatelessWidget { 256 | final Timetable timetable; 257 | 258 | const _Session({Key? key, required this.timetable}) : super(key: key); 259 | 260 | @override 261 | Widget build(BuildContext context) { 262 | final startsAt = df.format(DateTime.parse(timetable.startsAt!).toLocal()); 263 | 264 | return Card( 265 | child: Container( 266 | padding: const EdgeInsets.all(32.0), 267 | // decoration: const BoxDecoration(color: Colors.amber), 268 | alignment: Alignment.centerLeft, 269 | child: Column( 270 | mainAxisSize: MainAxisSize.min, 271 | mainAxisAlignment: MainAxisAlignment.center, 272 | crossAxisAlignment: CrossAxisAlignment.start, 273 | children: [ 274 | Text( 275 | 'Next talk', 276 | style: Theme.of(context).textTheme.headline6, 277 | ), 278 | Text( 279 | startsAt, 280 | style: Theme.of(context).textTheme.headline4, 281 | ), 282 | Text( 283 | timetable.title!, 284 | style: Theme.of(context).textTheme.headline2, 285 | ), 286 | Text( 287 | speaker(timetable), 288 | style: Theme.of(context).textTheme.headline3, 289 | ), 290 | ], 291 | ), 292 | ), 293 | ); 294 | } 295 | } 296 | 297 | class _SessionList extends StatelessWidget { 298 | final List timetable; 299 | final Timetable current; 300 | 301 | const _SessionList({ 302 | Key? key, 303 | required this.timetable, 304 | required this.current, 305 | }) : super(key: key); 306 | 307 | @override 308 | Widget build(BuildContext context) { 309 | return Card( 310 | child: Container( 311 | padding: const EdgeInsets.all(32.0), 312 | alignment: Alignment.centerLeft, 313 | child: ListView.separated( 314 | itemCount: timetable.length + 1, 315 | itemBuilder: (_, index) { 316 | if (index == 0) { 317 | return Text( 318 | 'Today\'s talks', 319 | style: Theme.of(context) 320 | .textTheme 321 | .headline4 322 | ?.copyWith(color: kBlue), 323 | ); 324 | } 325 | var item = timetable[index - 1]; 326 | final startsAt = 327 | df.format(DateTime.parse(item.startsAt!).toLocal()); 328 | 329 | return ListTile( 330 | leading: Text( 331 | startsAt, 332 | style: Theme.of(context).textTheme.headline6, 333 | ), 334 | title: Text( 335 | item.title!, 336 | style: Theme.of(context).textTheme.headline5, 337 | maxLines: 1, 338 | ), 339 | subtitle: Text( 340 | speaker(item), 341 | style: Theme.of(context).textTheme.headline6, 342 | ), 343 | trailing: item.uuid == current.uuid 344 | ? Text( 345 | 'NEXT', 346 | style: Theme.of(context) 347 | .textTheme 348 | .headline6 349 | ?.copyWith(color: kSkyblue), 350 | ) 351 | : null, 352 | ); 353 | }, 354 | separatorBuilder: (context, index) { 355 | var color = 356 | index == 0 || (timetable[index - 1].uuid != current.uuid) 357 | ? null 358 | : kSkyblue; 359 | return Divider(color: color, thickness: 1.0); 360 | }, 361 | ), 362 | ), 363 | ); 364 | } 365 | } 366 | 367 | class _Footer extends StatelessWidget { 368 | const _Footer({Key? key}) : super(key: key); 369 | 370 | @override 371 | Widget build(BuildContext context) { 372 | return FittedBox( 373 | child: Padding( 374 | padding: const EdgeInsets.symmetric(horizontal: 4), 375 | child: Text( 376 | AppLocalizations.of(context)?.acknowledgements ?? '', 377 | style: Theme.of(context).textTheme.headline6, 378 | ), 379 | ), 380 | ); 381 | } 382 | } 383 | -------------------------------------------------------------------------------- /lib/responsive_layout_builder.dart: -------------------------------------------------------------------------------- 1 | /// ref. 2 | /// developer_quest/rpg_layout_builder.dart at master · 2d-inc/developer_quest https://github.com/2d-inc/developer_quest/blob/master/lib/src/rpg_layout_builder.dart 3 | /// 4 | import 'package:flutter/material.dart'; 5 | 6 | /// Once the logic screen pixel width exceeds this number, show the ultrawide 7 | /// layout. 8 | const double ultraWideLayoutThreshold = 1200; 9 | 10 | /// Once the logic screen pixel width exceeds this number, show the wide layout. 11 | const double wideLayoutThreshold = 800; 12 | 13 | /// Layout for the dev_rpg game. 14 | enum ResponsiveLayout { slim, wide, ultrawide } 15 | 16 | /// Signature for a function that builds a widget given an [ResponsiveLayout]. 17 | /// 18 | /// Used by [ResponsiveLayoutBuilder.builder]. 19 | typedef ResponsiveLayoutWidgetBuilder = Widget Function( 20 | BuildContext context, ResponsiveLayout layout, double width); 21 | 22 | /// Builds a widget tree that can depend on the parent widget's width 23 | class ResponsiveLayoutBuilder extends StatelessWidget { 24 | const ResponsiveLayoutBuilder({ 25 | required this.builder, 26 | Key? key, 27 | }) : super(key: key); 28 | 29 | /// Builds the widgets below this widget given this widget's layout width. 30 | final ResponsiveLayoutWidgetBuilder builder; 31 | 32 | Widget _build(BuildContext context, BoxConstraints constraints) { 33 | final mediaWidth = MediaQuery.of(context).size.width; 34 | final layout = mediaWidth >= ultraWideLayoutThreshold 35 | ? ResponsiveLayout.ultrawide 36 | : mediaWidth > wideLayoutThreshold 37 | ? ResponsiveLayout.wide 38 | : ResponsiveLayout.slim; 39 | return builder(context, layout, mediaWidth); 40 | } 41 | 42 | @override 43 | Widget build(BuildContext context) { 44 | return LayoutBuilder(builder: _build); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /lib/router/index.dart: -------------------------------------------------------------------------------- 1 | import 'package:confwebsite2021/pages/index.dart'; 2 | import 'package:confwebsite2021/pages/session.dart'; 3 | import 'package:confwebsite2021/pages/staff.dart'; 4 | import 'package:confwebsite2021/pages/teaser.dart'; 5 | import 'package:confwebsite2021/pages/timetable.dart'; 6 | import 'package:confwebsite2021/router/simple_route.dart'; 7 | import 'package:flutter/material.dart'; 8 | 9 | Route buildRouters(RouteSettings settings) { 10 | switch (settings.name) { 11 | case '/': 12 | return defaultRoute(); 13 | case '/staff': 14 | return staffRoute(); 15 | case '/teaser': 16 | return teaserRoute(); 17 | case '/timetable': 18 | return timetableRoute(); 19 | case '/session': 20 | return sessionRoute(); 21 | default: 22 | return defaultRoute(); 23 | } 24 | } 25 | 26 | SimpleRoute defaultRoute() { 27 | return SimpleRoute( 28 | name: '/', 29 | title: 'FlutterKaigi 2021', 30 | builder: (context) => const TopPage()); 31 | } 32 | 33 | SimpleRoute staffRoute() { 34 | return SimpleRoute( 35 | name: '/staff', title: 'Staff', builder: (context) => const StaffPage()); 36 | } 37 | 38 | SimpleRoute teaserRoute() { 39 | return SimpleRoute( 40 | name: '/teaser', 41 | title: 'Teaser', 42 | builder: (context) => const TeaserPage()); 43 | } 44 | 45 | SimpleRoute sessionRoute() { 46 | return SimpleRoute( 47 | name: '/session', 48 | title: 'Session', 49 | builder: (context) => const SessionPage()); 50 | } 51 | 52 | Route timetableRoute() { 53 | return SimpleRoute( 54 | name: '/timetable', 55 | title: 'Timetable', 56 | builder: (context) => const TimetablePage()); 57 | } 58 | -------------------------------------------------------------------------------- /lib/router/simple_route.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class SimpleRoute extends PageRoute { 4 | final String title; 5 | final WidgetBuilder builder; 6 | 7 | // ignore: sort_constructors_first 8 | SimpleRoute({ 9 | required String name, 10 | required this.title, 11 | required this.builder, 12 | }) : super( 13 | settings: RouteSettings( 14 | name: name, 15 | ), 16 | ); 17 | 18 | @override 19 | Color get barrierColor => Colors.white; 20 | 21 | @override 22 | String get barrierLabel => 'Dismiss'; 23 | 24 | @override 25 | bool get maintainState => false; 26 | 27 | @override 28 | Duration get transitionDuration => const Duration(milliseconds: 250); 29 | 30 | @override 31 | Widget buildPage(BuildContext context, Animation animation, 32 | Animation secondaryAnimation) { 33 | return Title( 34 | title: title, 35 | color: Theme.of(context).primaryColor, 36 | child: builder(context), 37 | ); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /lib/theme.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/foundation.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | // ignore: avoid_classes_with_only_static_members 5 | class AppTheme { 6 | static ThemeData get theme { 7 | // Typography 8 | final originTypography = 9 | (Typography.material2018(platform: defaultTargetPlatform).black).merge( 10 | Typography.material2018(platform: defaultTargetPlatform).dense); 11 | 12 | final textTheme = originTypography.copyWith( 13 | // Button 14 | button: originTypography.button?.merge(const TextStyle( 15 | fontFamily: 'Montserrat-Bold', fontWeight: FontWeight.bold)), 16 | ); 17 | 18 | return ThemeData( 19 | fontFamily: 'Montserrat', 20 | textTheme: textTheme, 21 | primarySwatch: Colors.blue, 22 | backgroundColor: Colors.white, 23 | textButtonTheme: TextButtonThemeData( 24 | style: TextButton.styleFrom( 25 | primary: Colors.black, // text 26 | // enabledMouseCursor: MouseCursor.defer, 27 | ), 28 | ), 29 | elevatedButtonTheme: ElevatedButtonThemeData( 30 | style: ElevatedButton.styleFrom( 31 | onPrimary: Colors.white, // foreground(text) 32 | // enabledMouseCursor: MouseCursor.defer, 33 | ), 34 | ), 35 | ); 36 | } 37 | } 38 | 39 | const kSkyblue = Color(0xFF4ACCEB); 40 | const kBlue = Color(0xFF174C90); 41 | const kRed = Color(0xFFCA2421); 42 | -------------------------------------------------------------------------------- /lib/widgets/background.dart: -------------------------------------------------------------------------------- 1 | import 'dart:math' as math; 2 | 3 | import 'package:flutter/material.dart'; 4 | 5 | final _random = math.Random(); 6 | 7 | class Logo { 8 | Offset position = Offset.zero; 9 | double angle = 0.0; 10 | 11 | final double rotateSpeed = _random.nextDouble() * math.pi * 0.01; 12 | final double speed = _random.nextDouble() * 1 + 0.5; 13 | final double size = _random.nextDouble() * 60 + 30; 14 | 15 | Logo(this.position); 16 | } 17 | 18 | final logos = ValueNotifier>([]); 19 | 20 | class BackgroundCanvas extends StatefulWidget { 21 | const BackgroundCanvas({Key? key, required this.size}) : super(key: key); 22 | 23 | final Size size; 24 | 25 | @override 26 | _BackgroundCanvasState createState() => _BackgroundCanvasState(); 27 | } 28 | 29 | class _BackgroundCanvasState extends State 30 | with SingleTickerProviderStateMixin { 31 | late final _controller = 32 | AnimationController(vsync: this, duration: const Duration(days: 1)) 33 | ..addListener( 34 | () { 35 | final update = [...logos.value]; 36 | for (final logo in update) { 37 | logo.position += Offset(0, -logo.speed); 38 | logo.angle += logo.rotateSpeed; 39 | if (logo.position.dy < widget.size.height / 3) { 40 | final index = logos.value.indexOf(logo); 41 | update[index] = generateLogo(); 42 | } 43 | } 44 | logos.value = update; 45 | }, 46 | ); 47 | 48 | @override 49 | void initState() { 50 | logos.value = List.generate(10, (index) => generateLogo()); 51 | _controller.forward(); 52 | super.initState(); 53 | } 54 | 55 | Logo generateLogo() => Logo(Offset( 56 | widget.size.width * _random.nextDouble(), 57 | widget.size.height, 58 | )); 59 | 60 | @override 61 | Widget build(BuildContext context) { 62 | return ValueListenableBuilder( 63 | valueListenable: logos, 64 | builder: (context, List value, _) => _Background(logos: value), 65 | ); 66 | } 67 | 68 | @override 69 | void dispose() { 70 | _controller.dispose(); 71 | super.dispose(); 72 | } 73 | } 74 | 75 | class _Background extends StatelessWidget { 76 | const _Background({Key? key, required this.logos}) : super(key: key); 77 | 78 | final List logos; 79 | 80 | @override 81 | Widget build(BuildContext context) { 82 | final height = MediaQuery.of(context).size.height; 83 | return Stack( 84 | children: [ 85 | for (final logo in logos) 86 | Positioned( 87 | top: logo.position.dy, 88 | left: logo.position.dx, 89 | child: Opacity( 90 | opacity: (logo.position.dy - height / 3) / height / 3, 91 | child: Transform.rotate( 92 | angle: logo.angle, 93 | child: FlutterLogo( 94 | size: logo.size, 95 | ), 96 | ), 97 | ), 98 | ) 99 | ], 100 | ); 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /lib/widgets/cfs_button.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_gen/gen_l10n/app_localizations.dart'; 4 | import 'package:url_launcher/url_launcher.dart'; 5 | 6 | class CfsButton extends StatelessWidget { 7 | const CfsButton({Key? key}) : super(key: key); 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | final appLocalizations = AppLocalizations.of(context)!; 12 | 13 | return Container( 14 | margin: const EdgeInsets.all(8), 15 | child: Tooltip( 16 | message: appLocalizations.showSchedule, 17 | child: ElevatedButton( 18 | onPressed: () async { 19 | await launch( 20 | 'https://fortee.jp/flutterkaigi-2021/timetable', 21 | webOnlyWindowName: '_blank', 22 | ); 23 | }, 24 | style: ElevatedButton.styleFrom( 25 | shape: const StadiumBorder(), 26 | padding: const EdgeInsets.all(24), 27 | primary: Colors.orange, 28 | onPrimary: Colors.black87, 29 | ), 30 | child: Text( 31 | appLocalizations.schedule, 32 | style: const TextStyle( 33 | color: Colors.white, 34 | fontSize: 20, 35 | ), 36 | ), 37 | ), 38 | ), 39 | ); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /lib/widgets/connpass_button.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_gen/gen_l10n/app_localizations.dart'; 4 | import 'package:url_launcher/url_launcher.dart'; 5 | 6 | class ConnpassButton extends StatelessWidget { 7 | const ConnpassButton({Key? key}) : super(key: key); 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | final appLocalizations = AppLocalizations.of(context)!; 12 | 13 | return Container( 14 | margin: const EdgeInsets.all(8), 15 | child: Tooltip( 16 | message: appLocalizations.openMainEventPage, 17 | child: ElevatedButton( 18 | onPressed: () async { 19 | await launch( 20 | 'https://flutterkaigi.connpass.com/event/226034', 21 | webOnlyWindowName: '_blank', 22 | ); 23 | }, 24 | style: ElevatedButton.styleFrom( 25 | shape: const StadiumBorder(), 26 | padding: const EdgeInsets.all(24), 27 | primary: Colors.deepOrange, 28 | onPrimary: Colors.black87, 29 | ), 30 | child: Text( 31 | appLocalizations.applyMainEvent, 32 | style: const TextStyle( 33 | color: Colors.white, 34 | fontSize: 20, 35 | ), 36 | ), 37 | ), 38 | ), 39 | ); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /lib/widgets/footer.dart: -------------------------------------------------------------------------------- 1 | import 'package:confwebsite2021/router/index.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_gen/gen_l10n/app_localizations.dart'; 4 | import 'package:gap/gap.dart'; 5 | import 'package:styled_text/styled_text.dart'; 6 | import 'package:url_launcher/url_launcher.dart'; 7 | 8 | class Footer extends StatelessWidget { 9 | const Footer({Key? key}) : super(key: key); 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | final appLocalizations = AppLocalizations.of(context)!; 14 | final footerLinks = >[ 15 | { 16 | 'name': appLocalizations.codeOfConduct, 17 | 'url': 18 | 'https://flutterkaigi.github.io/flutterkaigi/Code-of-Conduct.ja.html', 19 | }, 20 | { 21 | 'name': appLocalizations.privacyPolicy, 22 | 'url': 23 | 'https://flutterkaigi.github.io/flutterkaigi/Privacy-Policy.ja.html', 24 | }, 25 | { 26 | 'name': appLocalizations.contactUs, 27 | 'url': 28 | 'https://docs.google.com/forms/d/e/1FAIpQLSemYPFEWpP8594MWI4k3Nz45RJzMS7pz1ufwtnX4t3V7z2TOw/viewform', 29 | }, 30 | ]; 31 | 32 | final footerItem = footerLinks.map((link) { 33 | return _FooterButton( 34 | message: link['name']!, 35 | text: link['name']!, 36 | onPressed: () async { 37 | await launch(link['url']!); 38 | }); 39 | }).toList() 40 | ..add( 41 | _FooterButton( 42 | message: appLocalizations.session, 43 | text: appLocalizations.session, 44 | onPressed: () { 45 | Navigator.of(context).pushNamed(sessionRoute().settings.name!); 46 | }), 47 | ) 48 | ..add( 49 | _FooterButton( 50 | message: appLocalizations.staff, 51 | text: appLocalizations.staff, 52 | onPressed: () { 53 | Navigator.of(context).pushNamed(staffRoute().settings.name!); 54 | }), 55 | ) 56 | ..add( 57 | _FooterButton( 58 | message: appLocalizations.licenses, 59 | text: appLocalizations.licenses, 60 | onPressed: () { 61 | showLicensePage( 62 | context: context, 63 | ); 64 | }), 65 | ) 66 | ..add( 67 | _FooterButton( 68 | message: appLocalizations.teaser, 69 | text: appLocalizations.teaser, 70 | onPressed: () { 71 | Navigator.of(context).pushNamed(teaserRoute().settings.name!); 72 | }), 73 | ) 74 | ..add( 75 | _FooterButton( 76 | message: appLocalizations.interlude, 77 | text: appLocalizations.interlude, 78 | onPressed: () { 79 | Navigator.of(context).pushNamed(timetableRoute().settings.name!); 80 | }), 81 | ); 82 | 83 | return Column( 84 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 85 | children: [ 86 | Wrap( 87 | alignment: WrapAlignment.center, 88 | children: footerItem, 89 | ), 90 | const Gap(8), 91 | _Acknowledgements(appLocalizations: appLocalizations), 92 | const Gap(8), 93 | Text(appLocalizations.copyright), 94 | const Gap(8), 95 | Text(appLocalizations.disclaimer, textAlign: TextAlign.center), 96 | const Gap(4), 97 | StyledText( 98 | text: appLocalizations.trademark, 99 | textAlign: TextAlign.center, 100 | tags: { 101 | 'FlutterLogo': StyledTextWidgetTag( 102 | const FlutterLogo(), 103 | ), 104 | }, 105 | ), 106 | const Gap(32), 107 | ], 108 | ); 109 | } 110 | } 111 | 112 | class _Acknowledgements extends StatelessWidget { 113 | const _Acknowledgements({ 114 | Key? key, 115 | required this.appLocalizations, 116 | }) : super(key: key); 117 | 118 | final AppLocalizations appLocalizations; 119 | 120 | @override 121 | Widget build(BuildContext context) { 122 | return FittedBox( 123 | child: Padding( 124 | padding: const EdgeInsets.symmetric( 125 | horizontal: 4, 126 | vertical: 0, 127 | ), 128 | child: Text( 129 | appLocalizations.acknowledgements, 130 | style: const TextStyle(fontSize: 10), 131 | ), 132 | ), 133 | ); 134 | } 135 | } 136 | 137 | class _FooterButton extends StatelessWidget { 138 | const _FooterButton({ 139 | Key? key, 140 | required this.message, 141 | required this.text, 142 | required this.onPressed, 143 | }) : super(key: key); 144 | 145 | final String message; 146 | final String text; 147 | final VoidCallback? onPressed; 148 | 149 | @override 150 | Widget build(BuildContext context) { 151 | return Tooltip( 152 | message: message, 153 | child: TextButton( 154 | onPressed: onPressed, 155 | child: Text( 156 | text, 157 | textAlign: TextAlign.center, 158 | ), 159 | ), 160 | ); 161 | } 162 | } 163 | -------------------------------------------------------------------------------- /lib/widgets/social.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_svg/flutter_svg.dart'; 4 | import 'package:url_launcher/url_launcher.dart'; 5 | 6 | class LinkModel { 7 | LinkModel(this.name, this.url); 8 | 9 | final String name; 10 | final String url; 11 | } 12 | 13 | class Social extends StatelessWidget { 14 | const Social({Key? key}) : super(key: key); 15 | 16 | @override 17 | Widget build(BuildContext context) { 18 | final socialLinks = >[ 19 | { 20 | 'name': 'twitter_logo', 21 | 'url': 'https://twitter.com/FlutterKaigi', 22 | }, 23 | { 24 | 'name': 'github_logo', 25 | 'url': 'https://github.com/FlutterKaigi', 26 | }, 27 | { 28 | 'name': 'discord_logo', 29 | 'url': 'https://discord.gg/Nr7H8JTJSF', 30 | }, 31 | ]; 32 | 33 | List socialItem() { 34 | return socialLinks.map((link) { 35 | return IconButton( 36 | tooltip: link['url'], 37 | icon: SvgPicture.asset( 38 | '/${link['name']}.svg', 39 | width: 60, 40 | ), 41 | onPressed: () async { 42 | await launch(link['url']!); 43 | }, 44 | mouseCursor: SystemMouseCursors.click, 45 | ); 46 | }).toList(); 47 | } 48 | 49 | return Row( 50 | mainAxisAlignment: MainAxisAlignment.center, 51 | children: [...socialItem()], 52 | ); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /linux/.gitignore: -------------------------------------------------------------------------------- 1 | flutter/ephemeral 2 | -------------------------------------------------------------------------------- /linux/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.10) 2 | project(runner LANGUAGES CXX) 3 | 4 | set(BINARY_NAME "confwebsite2021") 5 | 6 | cmake_policy(SET CMP0063 NEW) 7 | 8 | set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") 9 | 10 | # Configure build options. 11 | if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) 12 | set(CMAKE_BUILD_TYPE "Debug" CACHE 13 | STRING "Flutter build mode" FORCE) 14 | set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS 15 | "Debug" "Profile" "Release") 16 | endif() 17 | 18 | # Compilation settings that should be applied to most targets. 19 | function(APPLY_STANDARD_SETTINGS TARGET) 20 | target_compile_features(${TARGET} PUBLIC cxx_std_14) 21 | target_compile_options(${TARGET} PRIVATE -Wall -Werror) 22 | target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") 23 | target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") 24 | endfunction() 25 | 26 | set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") 27 | 28 | # Flutter library and tool build rules. 29 | add_subdirectory(${FLUTTER_MANAGED_DIR}) 30 | 31 | # System-level dependencies. 32 | find_package(PkgConfig REQUIRED) 33 | pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) 34 | 35 | # Application build 36 | add_executable(${BINARY_NAME} 37 | "main.cc" 38 | "my_application.cc" 39 | "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" 40 | ) 41 | apply_standard_settings(${BINARY_NAME}) 42 | target_link_libraries(${BINARY_NAME} PRIVATE flutter) 43 | target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) 44 | add_dependencies(${BINARY_NAME} flutter_assemble) 45 | 46 | # Generated plugin build rules, which manage building the plugins and adding 47 | # them to the application. 48 | include(flutter/generated_plugins.cmake) 49 | 50 | 51 | # === Installation === 52 | # By default, "installing" just makes a relocatable bundle in the build 53 | # directory. 54 | set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") 55 | if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) 56 | set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) 57 | endif() 58 | 59 | # Start with a clean build bundle directory every time. 60 | install(CODE " 61 | file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") 62 | " COMPONENT Runtime) 63 | 64 | set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") 65 | set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") 66 | 67 | install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" 68 | COMPONENT Runtime) 69 | 70 | install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" 71 | COMPONENT Runtime) 72 | 73 | install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" 74 | COMPONENT Runtime) 75 | 76 | if(PLUGIN_BUNDLED_LIBRARIES) 77 | install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" 78 | DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" 79 | COMPONENT Runtime) 80 | endif() 81 | 82 | # Fully re-copy the assets directory on each build to avoid having stale files 83 | # from a previous install. 84 | set(FLUTTER_ASSET_DIR_NAME "flutter_assets") 85 | install(CODE " 86 | file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") 87 | " COMPONENT Runtime) 88 | install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" 89 | DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) 90 | 91 | # Install the AOT library on non-Debug builds only. 92 | if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") 93 | install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" 94 | COMPONENT Runtime) 95 | endif() 96 | -------------------------------------------------------------------------------- /linux/flutter/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.10) 2 | 3 | set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") 4 | 5 | # Configuration provided via flutter tool. 6 | include(${EPHEMERAL_DIR}/generated_config.cmake) 7 | 8 | # TODO: Move the rest of this into files in ephemeral. See 9 | # https://github.com/flutter/flutter/issues/57146. 10 | 11 | # Serves the same purpose as list(TRANSFORM ... PREPEND ...), 12 | # which isn't available in 3.10. 13 | function(list_prepend LIST_NAME PREFIX) 14 | set(NEW_LIST "") 15 | foreach(element ${${LIST_NAME}}) 16 | list(APPEND NEW_LIST "${PREFIX}${element}") 17 | endforeach(element) 18 | set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) 19 | endfunction() 20 | 21 | # === Flutter Library === 22 | # System-level dependencies. 23 | find_package(PkgConfig REQUIRED) 24 | pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) 25 | pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) 26 | pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) 27 | 28 | set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") 29 | 30 | # Published to parent scope for install step. 31 | set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) 32 | set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) 33 | set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) 34 | set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) 35 | 36 | list(APPEND FLUTTER_LIBRARY_HEADERS 37 | "fl_basic_message_channel.h" 38 | "fl_binary_codec.h" 39 | "fl_binary_messenger.h" 40 | "fl_dart_project.h" 41 | "fl_engine.h" 42 | "fl_json_message_codec.h" 43 | "fl_json_method_codec.h" 44 | "fl_message_codec.h" 45 | "fl_method_call.h" 46 | "fl_method_channel.h" 47 | "fl_method_codec.h" 48 | "fl_method_response.h" 49 | "fl_plugin_registrar.h" 50 | "fl_plugin_registry.h" 51 | "fl_standard_message_codec.h" 52 | "fl_standard_method_codec.h" 53 | "fl_string_codec.h" 54 | "fl_value.h" 55 | "fl_view.h" 56 | "flutter_linux.h" 57 | ) 58 | list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") 59 | add_library(flutter INTERFACE) 60 | target_include_directories(flutter INTERFACE 61 | "${EPHEMERAL_DIR}" 62 | ) 63 | target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") 64 | target_link_libraries(flutter INTERFACE 65 | PkgConfig::GTK 66 | PkgConfig::GLIB 67 | PkgConfig::GIO 68 | ) 69 | add_dependencies(flutter flutter_assemble) 70 | 71 | # === Flutter tool backend === 72 | # _phony_ is a non-existent file to force this command to run every time, 73 | # since currently there's no way to get a full input/output list from the 74 | # flutter tool. 75 | add_custom_command( 76 | OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} 77 | ${CMAKE_CURRENT_BINARY_DIR}/_phony_ 78 | COMMAND ${CMAKE_COMMAND} -E env 79 | ${FLUTTER_TOOL_ENVIRONMENT} 80 | "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" 81 | linux-x64 ${CMAKE_BUILD_TYPE} 82 | ) 83 | add_custom_target(flutter_assemble DEPENDS 84 | "${FLUTTER_LIBRARY}" 85 | ${FLUTTER_LIBRARY_HEADERS} 86 | ) 87 | -------------------------------------------------------------------------------- /linux/flutter/generated_plugin_registrant.cc: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #include "generated_plugin_registrant.h" 8 | 9 | #include 10 | 11 | void fl_register_plugins(FlPluginRegistry* registry) { 12 | g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = 13 | fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); 14 | url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); 15 | } 16 | -------------------------------------------------------------------------------- /linux/flutter/generated_plugin_registrant.h: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #ifndef GENERATED_PLUGIN_REGISTRANT_ 8 | #define GENERATED_PLUGIN_REGISTRANT_ 9 | 10 | #include 11 | 12 | // Registers Flutter plugins. 13 | void fl_register_plugins(FlPluginRegistry* registry); 14 | 15 | #endif // GENERATED_PLUGIN_REGISTRANT_ 16 | -------------------------------------------------------------------------------- /linux/flutter/generated_plugins.cmake: -------------------------------------------------------------------------------- 1 | # 2 | # Generated file, do not edit. 3 | # 4 | 5 | list(APPEND FLUTTER_PLUGIN_LIST 6 | url_launcher_linux 7 | ) 8 | 9 | list(APPEND FLUTTER_FFI_PLUGIN_LIST 10 | ) 11 | 12 | set(PLUGIN_BUNDLED_LIBRARIES) 13 | 14 | foreach(plugin ${FLUTTER_PLUGIN_LIST}) 15 | add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) 16 | target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) 17 | list(APPEND PLUGIN_BUNDLED_LIBRARIES $) 18 | list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) 19 | endforeach(plugin) 20 | 21 | foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) 22 | add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) 23 | list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) 24 | endforeach(ffi_plugin) 25 | -------------------------------------------------------------------------------- /linux/main.cc: -------------------------------------------------------------------------------- 1 | #include "my_application.h" 2 | 3 | int main(int argc, char** argv) { 4 | // Only X11 is currently supported. 5 | // Wayland support is being developed: https://github.com/flutter/flutter/issues/57932. 6 | gdk_set_allowed_backends("x11"); 7 | 8 | g_autoptr(MyApplication) app = my_application_new(); 9 | return g_application_run(G_APPLICATION(app), argc, argv); 10 | } 11 | -------------------------------------------------------------------------------- /linux/my_application.cc: -------------------------------------------------------------------------------- 1 | #include "my_application.h" 2 | 3 | #include 4 | 5 | #include "flutter/generated_plugin_registrant.h" 6 | 7 | struct _MyApplication { 8 | GtkApplication parent_instance; 9 | }; 10 | 11 | G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) 12 | 13 | // Implements GApplication::activate. 14 | static void my_application_activate(GApplication* application) { 15 | GtkWindow* window = 16 | GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); 17 | GtkHeaderBar *header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); 18 | gtk_widget_show(GTK_WIDGET(header_bar)); 19 | gtk_header_bar_set_title(header_bar, "confwebsite2021"); 20 | gtk_header_bar_set_show_close_button(header_bar, TRUE); 21 | gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); 22 | gtk_window_set_default_size(window, 1280, 720); 23 | gtk_widget_show(GTK_WIDGET(window)); 24 | 25 | g_autoptr(FlDartProject) project = fl_dart_project_new(); 26 | 27 | FlView* view = fl_view_new(project); 28 | gtk_widget_show(GTK_WIDGET(view)); 29 | gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); 30 | 31 | fl_register_plugins(FL_PLUGIN_REGISTRY(view)); 32 | 33 | gtk_widget_grab_focus(GTK_WIDGET(view)); 34 | } 35 | 36 | static void my_application_class_init(MyApplicationClass* klass) { 37 | G_APPLICATION_CLASS(klass)->activate = my_application_activate; 38 | } 39 | 40 | static void my_application_init(MyApplication* self) {} 41 | 42 | MyApplication* my_application_new() { 43 | return MY_APPLICATION(g_object_new(my_application_get_type(), nullptr)); 44 | } 45 | -------------------------------------------------------------------------------- /linux/my_application.h: -------------------------------------------------------------------------------- 1 | #ifndef FLUTTER_MY_APPLICATION_H_ 2 | #define FLUTTER_MY_APPLICATION_H_ 3 | 4 | #include 5 | 6 | G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, 7 | GtkApplication) 8 | 9 | /** 10 | * my_application_new: 11 | * 12 | * Creates a new Flutter-based application. 13 | * 14 | * Returns: a new #MyApplication. 15 | */ 16 | MyApplication* my_application_new(); 17 | 18 | #endif // FLUTTER_MY_APPLICATION_H_ 19 | -------------------------------------------------------------------------------- /macos/.gitignore: -------------------------------------------------------------------------------- 1 | # Flutter-related 2 | **/Flutter/ephemeral/ 3 | **/Pods/ 4 | 5 | # Xcode-related 6 | **/xcuserdata/ 7 | -------------------------------------------------------------------------------- /macos/Flutter/Flutter-Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "ephemeral/Flutter-Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /macos/Flutter/Flutter-Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "ephemeral/Flutter-Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /macos/Flutter/GeneratedPluginRegistrant.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | import FlutterMacOS 6 | import Foundation 7 | 8 | import audio_session 9 | import just_audio 10 | import path_provider_macos 11 | import url_launcher_macos 12 | 13 | func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { 14 | AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin")) 15 | JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) 16 | PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) 17 | UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) 18 | } 19 | -------------------------------------------------------------------------------- /macos/Podfile: -------------------------------------------------------------------------------- 1 | platform :osx, '10.11' 2 | 3 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 4 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 5 | 6 | project 'Runner', { 7 | 'Debug' => :debug, 8 | 'Profile' => :release, 9 | 'Release' => :release, 10 | } 11 | 12 | def parse_KV_file(file, separator='=') 13 | file_abs_path = File.expand_path(file) 14 | if !File.exists? file_abs_path 15 | return []; 16 | end 17 | pods_ary = [] 18 | skip_line_start_symbols = ["#", "/"] 19 | File.foreach(file_abs_path) { |line| 20 | next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } 21 | plugin = line.split(pattern=separator) 22 | if plugin.length == 2 23 | podname = plugin[0].strip() 24 | path = plugin[1].strip() 25 | podpath = File.expand_path("#{path}", file_abs_path) 26 | pods_ary.push({:name => podname, :path => podpath}); 27 | else 28 | puts "Invalid plugin specification: #{line}" 29 | end 30 | } 31 | return pods_ary 32 | end 33 | 34 | def pubspec_supports_macos(file) 35 | file_abs_path = File.expand_path(file) 36 | if !File.exists? file_abs_path 37 | return false; 38 | end 39 | File.foreach(file_abs_path) { |line| 40 | return true if line =~ /^\s*macos:/ 41 | } 42 | return false 43 | end 44 | 45 | target 'Runner' do 46 | use_frameworks! 47 | use_modular_headers! 48 | 49 | # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock 50 | # referring to absolute paths on developers' machines. 51 | ephemeral_dir = File.join('Flutter', 'ephemeral') 52 | symlink_dir = File.join(ephemeral_dir, '.symlinks') 53 | symlink_plugins_dir = File.join(symlink_dir, 'plugins') 54 | system("rm -rf #{symlink_dir}") 55 | system("mkdir -p #{symlink_plugins_dir}") 56 | 57 | # Flutter Pods 58 | generated_xcconfig = parse_KV_file(File.join(ephemeral_dir, 'Flutter-Generated.xcconfig')) 59 | if generated_xcconfig.empty? 60 | puts "Flutter-Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first." 61 | end 62 | generated_xcconfig.map { |p| 63 | if p[:name] == 'FLUTTER_FRAMEWORK_DIR' 64 | symlink = File.join(symlink_dir, 'flutter') 65 | File.symlink(File.dirname(p[:path]), symlink) 66 | pod 'FlutterMacOS', :path => File.join(symlink, File.basename(p[:path])) 67 | end 68 | } 69 | 70 | # Plugin Pods 71 | plugin_pods = parse_KV_file('../.flutter-plugins') 72 | plugin_pods.map { |p| 73 | symlink = File.join(symlink_plugins_dir, p[:name]) 74 | File.symlink(p[:path], symlink) 75 | if pubspec_supports_macos(File.join(symlink, 'pubspec.yaml')) 76 | pod p[:name], :path => File.join(symlink, 'macos') 77 | end 78 | } 79 | end 80 | 81 | # Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. 82 | install! 'cocoapods', :disable_input_output_paths => true 83 | -------------------------------------------------------------------------------- /macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 85 | 91 | 92 | 93 | 94 | 96 | 97 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /macos/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /macos/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | import FlutterMacOS 3 | 4 | @NSApplicationMain 5 | class AppDelegate: FlutterAppDelegate { 6 | override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { 7 | return true 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "16x16", 5 | "idiom" : "mac", 6 | "filename" : "app_icon_16.png", 7 | "scale" : "1x" 8 | }, 9 | { 10 | "size" : "16x16", 11 | "idiom" : "mac", 12 | "filename" : "app_icon_32.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "32x32", 17 | "idiom" : "mac", 18 | "filename" : "app_icon_32.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "32x32", 23 | "idiom" : "mac", 24 | "filename" : "app_icon_64.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "128x128", 29 | "idiom" : "mac", 30 | "filename" : "app_icon_128.png", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "size" : "128x128", 35 | "idiom" : "mac", 36 | "filename" : "app_icon_256.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "256x256", 41 | "idiom" : "mac", 42 | "filename" : "app_icon_256.png", 43 | "scale" : "1x" 44 | }, 45 | { 46 | "size" : "256x256", 47 | "idiom" : "mac", 48 | "filename" : "app_icon_512.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "512x512", 53 | "idiom" : "mac", 54 | "filename" : "app_icon_512.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "512x512", 59 | "idiom" : "mac", 60 | "filename" : "app_icon_1024.png", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png -------------------------------------------------------------------------------- /macos/Runner/Configs/AppInfo.xcconfig: -------------------------------------------------------------------------------- 1 | // Application-level settings for the Runner target. 2 | // 3 | // This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the 4 | // future. If not, the values below would default to using the project name when this becomes a 5 | // 'flutter create' template. 6 | 7 | // The application's name. By default this is also the title of the Flutter window. 8 | PRODUCT_NAME = confwebsite2021 9 | 10 | // The application's bundle identifier 11 | PRODUCT_BUNDLE_IDENTIFIER = com.example.confwebsite2021 12 | 13 | // The copyright displayed in application information 14 | PRODUCT_COPYRIGHT = Copyright © 2020 com.example. All rights reserved. 15 | -------------------------------------------------------------------------------- /macos/Runner/Configs/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../Flutter/Flutter-Debug.xcconfig" 2 | #include "Warnings.xcconfig" 3 | -------------------------------------------------------------------------------- /macos/Runner/Configs/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../Flutter/Flutter-Release.xcconfig" 2 | #include "Warnings.xcconfig" 3 | -------------------------------------------------------------------------------- /macos/Runner/Configs/Warnings.xcconfig: -------------------------------------------------------------------------------- 1 | WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings 2 | GCC_WARN_UNDECLARED_SELECTOR = YES 3 | CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES 4 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE 5 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES 6 | CLANG_WARN_PRAGMA_PACK = YES 7 | CLANG_WARN_STRICT_PROTOTYPES = YES 8 | CLANG_WARN_COMMA = YES 9 | GCC_WARN_STRICT_SELECTOR_MATCH = YES 10 | CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES 11 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES 12 | GCC_WARN_SHADOW = YES 13 | CLANG_WARN_UNREACHABLE_CODE = YES 14 | -------------------------------------------------------------------------------- /macos/Runner/DebugProfile.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.cs.allow-jit 8 | 9 | com.apple.security.network.server 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /macos/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(FLUTTER_BUILD_NAME) 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSMinimumSystemVersion 24 | $(MACOSX_DEPLOYMENT_TARGET) 25 | NSHumanReadableCopyright 26 | $(PRODUCT_COPYRIGHT) 27 | NSMainNibFile 28 | MainMenu 29 | NSPrincipalClass 30 | NSApplication 31 | 32 | 33 | -------------------------------------------------------------------------------- /macos/Runner/MainFlutterWindow.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | import FlutterMacOS 3 | 4 | class MainFlutterWindow: NSWindow { 5 | override func awakeFromNib() { 6 | let flutterViewController = FlutterViewController.init() 7 | let windowFrame = self.frame 8 | self.contentViewController = flutterViewController 9 | self.setFrame(windowFrame, display: true) 10 | 11 | RegisterGeneratedPlugins(registry: flutterViewController) 12 | 13 | super.awakeFromNib() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /macos/Runner/Release.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | _fe_analyzer_shared: 5 | dependency: transitive 6 | description: 7 | name: _fe_analyzer_shared 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "31.0.0" 11 | analyzer: 12 | dependency: transitive 13 | description: 14 | name: analyzer 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "2.8.0" 18 | args: 19 | dependency: transitive 20 | description: 21 | name: args 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "2.3.0" 25 | async: 26 | dependency: transitive 27 | description: 28 | name: async 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "2.8.2" 32 | audio_session: 33 | dependency: transitive 34 | description: 35 | name: audio_session 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "0.1.6+1" 39 | boolean_selector: 40 | dependency: transitive 41 | description: 42 | name: boolean_selector 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "2.1.0" 46 | build: 47 | dependency: transitive 48 | description: 49 | name: build 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "2.1.1" 53 | build_config: 54 | dependency: transitive 55 | description: 56 | name: build_config 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "1.0.0" 60 | build_daemon: 61 | dependency: transitive 62 | description: 63 | name: build_daemon 64 | url: "https://pub.dartlang.org" 65 | source: hosted 66 | version: "3.0.1" 67 | build_resolvers: 68 | dependency: transitive 69 | description: 70 | name: build_resolvers 71 | url: "https://pub.dartlang.org" 72 | source: hosted 73 | version: "2.0.5" 74 | build_runner: 75 | dependency: "direct dev" 76 | description: 77 | name: build_runner 78 | url: "https://pub.dartlang.org" 79 | source: hosted 80 | version: "2.1.5" 81 | build_runner_core: 82 | dependency: transitive 83 | description: 84 | name: build_runner_core 85 | url: "https://pub.dartlang.org" 86 | source: hosted 87 | version: "7.2.2" 88 | built_collection: 89 | dependency: transitive 90 | description: 91 | name: built_collection 92 | url: "https://pub.dartlang.org" 93 | source: hosted 94 | version: "5.1.1" 95 | built_value: 96 | dependency: transitive 97 | description: 98 | name: built_value 99 | url: "https://pub.dartlang.org" 100 | source: hosted 101 | version: "8.1.3" 102 | characters: 103 | dependency: transitive 104 | description: 105 | name: characters 106 | url: "https://pub.dartlang.org" 107 | source: hosted 108 | version: "1.2.0" 109 | charcode: 110 | dependency: transitive 111 | description: 112 | name: charcode 113 | url: "https://pub.dartlang.org" 114 | source: hosted 115 | version: "1.3.1" 116 | checked_yaml: 117 | dependency: transitive 118 | description: 119 | name: checked_yaml 120 | url: "https://pub.dartlang.org" 121 | source: hosted 122 | version: "2.0.1" 123 | cli_util: 124 | dependency: transitive 125 | description: 126 | name: cli_util 127 | url: "https://pub.dartlang.org" 128 | source: hosted 129 | version: "0.3.5" 130 | clock: 131 | dependency: transitive 132 | description: 133 | name: clock 134 | url: "https://pub.dartlang.org" 135 | source: hosted 136 | version: "1.1.0" 137 | code_builder: 138 | dependency: transitive 139 | description: 140 | name: code_builder 141 | url: "https://pub.dartlang.org" 142 | source: hosted 143 | version: "4.1.0" 144 | collection: 145 | dependency: transitive 146 | description: 147 | name: collection 148 | url: "https://pub.dartlang.org" 149 | source: hosted 150 | version: "1.16.0" 151 | color: 152 | dependency: transitive 153 | description: 154 | name: color 155 | url: "https://pub.dartlang.org" 156 | source: hosted 157 | version: "3.0.0" 158 | convert: 159 | dependency: transitive 160 | description: 161 | name: convert 162 | url: "https://pub.dartlang.org" 163 | source: hosted 164 | version: "3.0.1" 165 | crypto: 166 | dependency: transitive 167 | description: 168 | name: crypto 169 | url: "https://pub.dartlang.org" 170 | source: hosted 171 | version: "3.0.1" 172 | cupertino_icons: 173 | dependency: "direct main" 174 | description: 175 | name: cupertino_icons 176 | url: "https://pub.dartlang.org" 177 | source: hosted 178 | version: "1.0.4" 179 | dart_style: 180 | dependency: transitive 181 | description: 182 | name: dart_style 183 | url: "https://pub.dartlang.org" 184 | source: hosted 185 | version: "2.2.0" 186 | dartx: 187 | dependency: transitive 188 | description: 189 | name: dartx 190 | url: "https://pub.dartlang.org" 191 | source: hosted 192 | version: "0.8.0" 193 | fake_async: 194 | dependency: transitive 195 | description: 196 | name: fake_async 197 | url: "https://pub.dartlang.org" 198 | source: hosted 199 | version: "1.3.0" 200 | ffi: 201 | dependency: transitive 202 | description: 203 | name: ffi 204 | url: "https://pub.dartlang.org" 205 | source: hosted 206 | version: "1.1.2" 207 | file: 208 | dependency: transitive 209 | description: 210 | name: file 211 | url: "https://pub.dartlang.org" 212 | source: hosted 213 | version: "6.1.2" 214 | fixnum: 215 | dependency: transitive 216 | description: 217 | name: fixnum 218 | url: "https://pub.dartlang.org" 219 | source: hosted 220 | version: "1.0.0" 221 | flutter: 222 | dependency: "direct main" 223 | description: flutter 224 | source: sdk 225 | version: "0.0.0" 226 | flutter_countdown_timer: 227 | dependency: "direct main" 228 | description: 229 | name: flutter_countdown_timer 230 | url: "https://pub.dartlang.org" 231 | source: hosted 232 | version: "4.1.0" 233 | flutter_gen_core: 234 | dependency: transitive 235 | description: 236 | name: flutter_gen_core 237 | url: "https://pub.dartlang.org" 238 | source: hosted 239 | version: "4.1.2" 240 | flutter_gen_runner: 241 | dependency: "direct dev" 242 | description: 243 | name: flutter_gen_runner 244 | url: "https://pub.dartlang.org" 245 | source: hosted 246 | version: "4.1.2" 247 | flutter_lints: 248 | dependency: "direct dev" 249 | description: 250 | name: flutter_lints 251 | url: "https://pub.dartlang.org" 252 | source: hosted 253 | version: "1.0.4" 254 | flutter_localizations: 255 | dependency: "direct main" 256 | description: flutter 257 | source: sdk 258 | version: "0.0.0" 259 | flutter_svg: 260 | dependency: "direct main" 261 | description: 262 | name: flutter_svg 263 | url: "https://pub.dartlang.org" 264 | source: hosted 265 | version: "1.0.3" 266 | flutter_svg_provider: 267 | dependency: "direct main" 268 | description: 269 | name: flutter_svg_provider 270 | url: "https://pub.dartlang.org" 271 | source: hosted 272 | version: "1.0.3" 273 | flutter_test: 274 | dependency: "direct dev" 275 | description: flutter 276 | source: sdk 277 | version: "0.0.0" 278 | flutter_web_plugins: 279 | dependency: transitive 280 | description: flutter 281 | source: sdk 282 | version: "0.0.0" 283 | frontend_server_client: 284 | dependency: transitive 285 | description: 286 | name: frontend_server_client 287 | url: "https://pub.dartlang.org" 288 | source: hosted 289 | version: "2.1.2" 290 | gap: 291 | dependency: "direct main" 292 | description: 293 | name: gap 294 | url: "https://pub.dartlang.org" 295 | source: hosted 296 | version: "2.0.0" 297 | glob: 298 | dependency: transitive 299 | description: 300 | name: glob 301 | url: "https://pub.dartlang.org" 302 | source: hosted 303 | version: "2.0.2" 304 | google_fonts: 305 | dependency: "direct main" 306 | description: 307 | name: google_fonts 308 | url: "https://pub.dartlang.org" 309 | source: hosted 310 | version: "2.1.0" 311 | graphs: 312 | dependency: transitive 313 | description: 314 | name: graphs 315 | url: "https://pub.dartlang.org" 316 | source: hosted 317 | version: "2.1.0" 318 | http: 319 | dependency: transitive 320 | description: 321 | name: http 322 | url: "https://pub.dartlang.org" 323 | source: hosted 324 | version: "0.13.4" 325 | http_multi_server: 326 | dependency: transitive 327 | description: 328 | name: http_multi_server 329 | url: "https://pub.dartlang.org" 330 | source: hosted 331 | version: "3.0.1" 332 | http_parser: 333 | dependency: transitive 334 | description: 335 | name: http_parser 336 | url: "https://pub.dartlang.org" 337 | source: hosted 338 | version: "4.0.0" 339 | intl: 340 | dependency: "direct main" 341 | description: 342 | name: intl 343 | url: "https://pub.dartlang.org" 344 | source: hosted 345 | version: "0.17.0" 346 | io: 347 | dependency: transitive 348 | description: 349 | name: io 350 | url: "https://pub.dartlang.org" 351 | source: hosted 352 | version: "1.0.3" 353 | js: 354 | dependency: transitive 355 | description: 356 | name: js 357 | url: "https://pub.dartlang.org" 358 | source: hosted 359 | version: "0.6.4" 360 | json_annotation: 361 | dependency: transitive 362 | description: 363 | name: json_annotation 364 | url: "https://pub.dartlang.org" 365 | source: hosted 366 | version: "4.4.0" 367 | just_audio: 368 | dependency: "direct main" 369 | description: 370 | name: just_audio 371 | url: "https://pub.dartlang.org" 372 | source: hosted 373 | version: "0.9.20" 374 | just_audio_platform_interface: 375 | dependency: transitive 376 | description: 377 | name: just_audio_platform_interface 378 | url: "https://pub.dartlang.org" 379 | source: hosted 380 | version: "4.1.0" 381 | just_audio_web: 382 | dependency: transitive 383 | description: 384 | name: just_audio_web 385 | url: "https://pub.dartlang.org" 386 | source: hosted 387 | version: "0.4.7" 388 | lints: 389 | dependency: transitive 390 | description: 391 | name: lints 392 | url: "https://pub.dartlang.org" 393 | source: hosted 394 | version: "1.0.1" 395 | logging: 396 | dependency: transitive 397 | description: 398 | name: logging 399 | url: "https://pub.dartlang.org" 400 | source: hosted 401 | version: "1.0.2" 402 | matcher: 403 | dependency: transitive 404 | description: 405 | name: matcher 406 | url: "https://pub.dartlang.org" 407 | source: hosted 408 | version: "0.12.11" 409 | material_color_utilities: 410 | dependency: transitive 411 | description: 412 | name: material_color_utilities 413 | url: "https://pub.dartlang.org" 414 | source: hosted 415 | version: "0.1.4" 416 | meta: 417 | dependency: transitive 418 | description: 419 | name: meta 420 | url: "https://pub.dartlang.org" 421 | source: hosted 422 | version: "1.7.0" 423 | mime: 424 | dependency: transitive 425 | description: 426 | name: mime 427 | url: "https://pub.dartlang.org" 428 | source: hosted 429 | version: "1.0.1" 430 | package_config: 431 | dependency: transitive 432 | description: 433 | name: package_config 434 | url: "https://pub.dartlang.org" 435 | source: hosted 436 | version: "2.0.2" 437 | path: 438 | dependency: transitive 439 | description: 440 | name: path 441 | url: "https://pub.dartlang.org" 442 | source: hosted 443 | version: "1.8.1" 444 | path_drawing: 445 | dependency: transitive 446 | description: 447 | name: path_drawing 448 | url: "https://pub.dartlang.org" 449 | source: hosted 450 | version: "1.0.0" 451 | path_parsing: 452 | dependency: transitive 453 | description: 454 | name: path_parsing 455 | url: "https://pub.dartlang.org" 456 | source: hosted 457 | version: "1.0.0" 458 | path_provider: 459 | dependency: transitive 460 | description: 461 | name: path_provider 462 | url: "https://pub.dartlang.org" 463 | source: hosted 464 | version: "2.0.7" 465 | path_provider_android: 466 | dependency: transitive 467 | description: 468 | name: path_provider_android 469 | url: "https://pub.dartlang.org" 470 | source: hosted 471 | version: "2.0.9" 472 | path_provider_ios: 473 | dependency: transitive 474 | description: 475 | name: path_provider_ios 476 | url: "https://pub.dartlang.org" 477 | source: hosted 478 | version: "2.0.7" 479 | path_provider_linux: 480 | dependency: transitive 481 | description: 482 | name: path_provider_linux 483 | url: "https://pub.dartlang.org" 484 | source: hosted 485 | version: "2.1.2" 486 | path_provider_macos: 487 | dependency: transitive 488 | description: 489 | name: path_provider_macos 490 | url: "https://pub.dartlang.org" 491 | source: hosted 492 | version: "2.0.4" 493 | path_provider_platform_interface: 494 | dependency: transitive 495 | description: 496 | name: path_provider_platform_interface 497 | url: "https://pub.dartlang.org" 498 | source: hosted 499 | version: "2.0.1" 500 | path_provider_windows: 501 | dependency: transitive 502 | description: 503 | name: path_provider_windows 504 | url: "https://pub.dartlang.org" 505 | source: hosted 506 | version: "2.0.4" 507 | petitparser: 508 | dependency: transitive 509 | description: 510 | name: petitparser 511 | url: "https://pub.dartlang.org" 512 | source: hosted 513 | version: "4.4.0" 514 | platform: 515 | dependency: transitive 516 | description: 517 | name: platform 518 | url: "https://pub.dartlang.org" 519 | source: hosted 520 | version: "3.1.0" 521 | plugin_platform_interface: 522 | dependency: transitive 523 | description: 524 | name: plugin_platform_interface 525 | url: "https://pub.dartlang.org" 526 | source: hosted 527 | version: "2.0.2" 528 | pool: 529 | dependency: transitive 530 | description: 531 | name: pool 532 | url: "https://pub.dartlang.org" 533 | source: hosted 534 | version: "1.5.0" 535 | process: 536 | dependency: transitive 537 | description: 538 | name: process 539 | url: "https://pub.dartlang.org" 540 | source: hosted 541 | version: "4.2.4" 542 | pub_semver: 543 | dependency: transitive 544 | description: 545 | name: pub_semver 546 | url: "https://pub.dartlang.org" 547 | source: hosted 548 | version: "2.1.0" 549 | pubspec_parse: 550 | dependency: transitive 551 | description: 552 | name: pubspec_parse 553 | url: "https://pub.dartlang.org" 554 | source: hosted 555 | version: "1.2.0" 556 | rxdart: 557 | dependency: transitive 558 | description: 559 | name: rxdart 560 | url: "https://pub.dartlang.org" 561 | source: hosted 562 | version: "0.27.3" 563 | shelf: 564 | dependency: transitive 565 | description: 566 | name: shelf 567 | url: "https://pub.dartlang.org" 568 | source: hosted 569 | version: "1.2.0" 570 | shelf_web_socket: 571 | dependency: transitive 572 | description: 573 | name: shelf_web_socket 574 | url: "https://pub.dartlang.org" 575 | source: hosted 576 | version: "1.0.1" 577 | sky_engine: 578 | dependency: transitive 579 | description: flutter 580 | source: sdk 581 | version: "0.0.99" 582 | source_span: 583 | dependency: transitive 584 | description: 585 | name: source_span 586 | url: "https://pub.dartlang.org" 587 | source: hosted 588 | version: "1.8.2" 589 | sprintf: 590 | dependency: "direct main" 591 | description: 592 | name: sprintf 593 | url: "https://pub.dartlang.org" 594 | source: hosted 595 | version: "6.0.0" 596 | stack_trace: 597 | dependency: transitive 598 | description: 599 | name: stack_trace 600 | url: "https://pub.dartlang.org" 601 | source: hosted 602 | version: "1.10.0" 603 | stream_channel: 604 | dependency: transitive 605 | description: 606 | name: stream_channel 607 | url: "https://pub.dartlang.org" 608 | source: hosted 609 | version: "2.1.0" 610 | stream_transform: 611 | dependency: transitive 612 | description: 613 | name: stream_transform 614 | url: "https://pub.dartlang.org" 615 | source: hosted 616 | version: "2.0.0" 617 | string_scanner: 618 | dependency: transitive 619 | description: 620 | name: string_scanner 621 | url: "https://pub.dartlang.org" 622 | source: hosted 623 | version: "1.1.0" 624 | styled_text: 625 | dependency: "direct main" 626 | description: 627 | name: styled_text 628 | url: "https://pub.dartlang.org" 629 | source: hosted 630 | version: "5.1.0" 631 | term_glyph: 632 | dependency: transitive 633 | description: 634 | name: term_glyph 635 | url: "https://pub.dartlang.org" 636 | source: hosted 637 | version: "1.2.0" 638 | test_api: 639 | dependency: transitive 640 | description: 641 | name: test_api 642 | url: "https://pub.dartlang.org" 643 | source: hosted 644 | version: "0.4.9" 645 | time: 646 | dependency: transitive 647 | description: 648 | name: time 649 | url: "https://pub.dartlang.org" 650 | source: hosted 651 | version: "2.1.0" 652 | timing: 653 | dependency: transitive 654 | description: 655 | name: timing 656 | url: "https://pub.dartlang.org" 657 | source: hosted 658 | version: "1.0.0" 659 | transparent_image: 660 | dependency: "direct main" 661 | description: 662 | name: transparent_image 663 | url: "https://pub.dartlang.org" 664 | source: hosted 665 | version: "2.0.0" 666 | typed_data: 667 | dependency: transitive 668 | description: 669 | name: typed_data 670 | url: "https://pub.dartlang.org" 671 | source: hosted 672 | version: "1.3.0" 673 | url_launcher: 674 | dependency: "direct dev" 675 | description: 676 | name: url_launcher 677 | url: "https://pub.dartlang.org" 678 | source: hosted 679 | version: "6.0.20" 680 | url_launcher_android: 681 | dependency: transitive 682 | description: 683 | name: url_launcher_android 684 | url: "https://pub.dartlang.org" 685 | source: hosted 686 | version: "6.0.13" 687 | url_launcher_ios: 688 | dependency: transitive 689 | description: 690 | name: url_launcher_ios 691 | url: "https://pub.dartlang.org" 692 | source: hosted 693 | version: "6.0.13" 694 | url_launcher_linux: 695 | dependency: transitive 696 | description: 697 | name: url_launcher_linux 698 | url: "https://pub.dartlang.org" 699 | source: hosted 700 | version: "2.0.2" 701 | url_launcher_macos: 702 | dependency: transitive 703 | description: 704 | name: url_launcher_macos 705 | url: "https://pub.dartlang.org" 706 | source: hosted 707 | version: "2.0.2" 708 | url_launcher_platform_interface: 709 | dependency: transitive 710 | description: 711 | name: url_launcher_platform_interface 712 | url: "https://pub.dartlang.org" 713 | source: hosted 714 | version: "2.0.4" 715 | url_launcher_web: 716 | dependency: transitive 717 | description: 718 | name: url_launcher_web 719 | url: "https://pub.dartlang.org" 720 | source: hosted 721 | version: "2.0.5" 722 | url_launcher_windows: 723 | dependency: transitive 724 | description: 725 | name: url_launcher_windows 726 | url: "https://pub.dartlang.org" 727 | source: hosted 728 | version: "2.0.2" 729 | uuid: 730 | dependency: transitive 731 | description: 732 | name: uuid 733 | url: "https://pub.dartlang.org" 734 | source: hosted 735 | version: "3.0.5" 736 | vector_math: 737 | dependency: transitive 738 | description: 739 | name: vector_math 740 | url: "https://pub.dartlang.org" 741 | source: hosted 742 | version: "2.1.2" 743 | watcher: 744 | dependency: transitive 745 | description: 746 | name: watcher 747 | url: "https://pub.dartlang.org" 748 | source: hosted 749 | version: "1.0.1" 750 | web_socket_channel: 751 | dependency: transitive 752 | description: 753 | name: web_socket_channel 754 | url: "https://pub.dartlang.org" 755 | source: hosted 756 | version: "2.1.0" 757 | win32: 758 | dependency: transitive 759 | description: 760 | name: win32 761 | url: "https://pub.dartlang.org" 762 | source: hosted 763 | version: "2.3.1" 764 | xdg_directories: 765 | dependency: transitive 766 | description: 767 | name: xdg_directories 768 | url: "https://pub.dartlang.org" 769 | source: hosted 770 | version: "0.2.0" 771 | xml: 772 | dependency: transitive 773 | description: 774 | name: xml 775 | url: "https://pub.dartlang.org" 776 | source: hosted 777 | version: "5.3.1" 778 | xmlstream: 779 | dependency: transitive 780 | description: 781 | name: xmlstream 782 | url: "https://pub.dartlang.org" 783 | source: hosted 784 | version: "1.0.0" 785 | yaml: 786 | dependency: transitive 787 | description: 788 | name: yaml 789 | url: "https://pub.dartlang.org" 790 | source: hosted 791 | version: "3.1.0" 792 | sdks: 793 | dart: ">=2.17.0-0 <3.0.0" 794 | flutter: ">=2.5.3" 795 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: confwebsite2021 2 | description: A new Flutter project. 3 | 4 | publish_to: 'none' 5 | 6 | version: 1.0.0+1 7 | 8 | environment: 9 | sdk: '>=2.15.0 <3.0.0' 10 | 11 | dependencies: 12 | cupertino_icons: ^1.0.4 13 | flutter: 14 | sdk: flutter 15 | flutter_localizations: 16 | sdk: flutter 17 | flutter_svg: ^1.0.3 18 | flutter_svg_provider: ^1.0.3 19 | gap: ^2.0.0 20 | intl: ^0.17.0 21 | transparent_image: ^2.0.0 22 | flutter_countdown_timer: ^4.1.0 23 | google_fonts: 24 | sprintf: ^6.0.0 25 | styled_text: ^5.1.0 26 | just_audio: ^0.9.20 27 | 28 | dev_dependencies: 29 | build_runner: 30 | flutter_gen_runner: 31 | flutter_lints: ^1.0.4 32 | flutter_test: 33 | sdk: flutter 34 | url_launcher: ^6.0.20 35 | 36 | flutter: 37 | uses-material-design: true 38 | generate: true 39 | assets: 40 | - assets/ 41 | - assets/photo/ 42 | - assets/music/ 43 | -------------------------------------------------------------------------------- /test/widget_test.dart: -------------------------------------------------------------------------------- 1 | // This is a basic Flutter widget test. 2 | // 3 | // To perform an interaction with a widget in your test, use the WidgetTester 4 | // utility that Flutter provides. For example, you can send tap and scroll 5 | // gestures. You can also use WidgetTester to find child widgets in the widget 6 | // tree, read text, and verify that the values of widget properties are correct. 7 | 8 | import 'package:confwebsite2021/main.dart'; 9 | import 'package:flutter/material.dart'; 10 | import 'package:flutter_test/flutter_test.dart'; 11 | 12 | void main() { 13 | testWidgets('Counter increments smoke test', (WidgetTester tester) async { 14 | // Build our app and trigger a frame. 15 | await tester.pumpWidget(const MyApp()); 16 | 17 | // Verify that our counter starts at 0. 18 | expect(find.text('0'), findsOneWidget); 19 | expect(find.text('1'), findsNothing); 20 | 21 | // Tap the '+' icon and trigger a frame. 22 | await tester.tap(find.byIcon(Icons.add)); 23 | await tester.pump(); 24 | 25 | // Verify that our counter has incremented. 26 | expect(find.text('0'), findsNothing); 27 | expect(find.text('1'), findsOneWidget); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /web/assets/discord_logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/assets/flutter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/web/assets/flutter.png -------------------------------------------------------------------------------- /web/assets/flutterkaigi-navbar_logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 15 | 17 | 37 | 41 | 45 | 49 | 53 | 57 | 61 | 65 | 69 | 73 | 77 | 81 | 85 | 91 | 94 | 97 | 104 | 105 | 106 | 112 | 116 | 117 | -------------------------------------------------------------------------------- /web/assets/flutterkaigi_log.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /web/assets/flutterkaigi_ogp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/web/assets/flutterkaigi_ogp.png -------------------------------------------------------------------------------- /web/assets/github_logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/assets/twitter_logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/assets/twitter_white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 17 | -------------------------------------------------------------------------------- /web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/web/favicon.png -------------------------------------------------------------------------------- /web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/web/icons/Icon-192.png -------------------------------------------------------------------------------- /web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlutterKaigi/2021/3b01485c6908e2ead1ff699a7b1fa2b57e184252/web/icons/Icon-512.png -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 36 | 37 | FlutterKaigi 2021 38 | 39 | 40 | 41 | 44 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /web/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "FlutterKaigi 2021", 3 | "short_name": "FlutterKaigi 2021", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "background_color": "#0175C2", 7 | "theme_color": "#0175C2", 8 | "description": "2021年、Flutterをメインに扱う、日本で初開催の技術カンファレンス。FlutterやDartの深い知見を持つ開発者によるセッションを多数企画します。", 9 | "orientation": "portrait-primary", 10 | "prefer_related_applications": false, 11 | "icons": [ 12 | { 13 | "src": "icons/Icon-192.png", 14 | "sizes": "192x192", 15 | "type": "image/png" 16 | }, 17 | { 18 | "src": "icons/Icon-512.png", 19 | "sizes": "512x512", 20 | "type": "image/png" 21 | } 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /web/service-worker.js: -------------------------------------------------------------------------------- 1 | self.addEventListener('fetch', function(event) {}); 2 | --------------------------------------------------------------------------------