diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index e225384..0000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: deploy - -on: - push: - branches: - - jekyll - -jobs: - github-pages: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - with: - token: ${{ secrets.GH_PAGES_GITHUB_TOKEN }} - ref: jekyll - - name: setup-ruby - uses: ruby/setup-ruby@v1 - with: - os: ubuntu-latest - ruby-version: '3.1.2' - bundler-cache: true - - name: jekyll build - run: bundle exec jekyll build - - name: deploy to gh-pages - run: | - cd ./_site - git init - git config user.name grupyblumenau - git config user.email grupyblumenau@gmail.com - git add . && git commit -m "Deploy github-pages" - git remote add origin https://rtancman:${{ secrets.GH_PAGES_GITHUB_TOKEN }}@github.com/pythonbnu/pythonbnu.github.io.git - git push origin master -f \ No newline at end of file diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 7af275f..0000000 --- a/.gitignore +++ /dev/null @@ -1,69 +0,0 @@ -_site -.DS_Store -*.swp -.sass-cache -.vscode - -*.gem -*.rbc -/.config -/coverage/ -/InstalledFiles -/pkg/ -/spec/reports/ -/spec/examples.txt -/test/tmp/ -/test/version_tmp/ -/tmp/ - -# Used by dotenv library to load environment variables. -# .env - -# Ignore Byebug command history file. -.byebug_history - -## Specific to RubyMotion: -.dat* -.repl_history -build/ -*.bridgesupport -build-iPhoneOS/ -build-iPhoneSimulator/ - -## Specific to RubyMotion (use of CocoaPods): -# -# We recommend against adding the Pods directory to your .gitignore. However -# you should judge for yourself, the pros and cons are mentioned at: -# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control -# -# vendor/Pods/ - -## Documentation cache and generated files: -/.yardoc/ -/_yardoc/ -/doc/ -/rdoc/ - -## Environment normalization: -/.bundle/ -/vendor/bundle -/lib/bundler/man/ - -# for a library or gem, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# Gemfile.lock -# .ruby-version -# .ruby-gemset - -# unless supporting rvm < 1.11.0 or doing something fancy, ignore this: -.rvmrc - -# Used by RuboCop. Remote config files pulled in from inherit_from directive. -# .rubocop-https?--* - -.sass-cache/ -.jekyll-cache/ -.jekyll-metadata -# Ignore folders generated by Bundler -.bundle/ -vendor/ diff --git a/.ruby-version b/.ruby-version deleted file mode 100644 index 6ebad14..0000000 --- a/.ruby-version +++ /dev/null @@ -1 +0,0 @@ -3.1.2 \ No newline at end of file diff --git a/Gemfile b/Gemfile deleted file mode 100644 index 63a4bd8..0000000 --- a/Gemfile +++ /dev/null @@ -1,32 +0,0 @@ -source 'https://rubygems.org' - -ruby "3.1.2" - -# Happy Jekylling! -gem 'jekyll', '~> 4.2', '>= 4.2.2' - -gem 'minima', '~> 2.5', '>= 2.5.1' -gem 'html-proofer', '~> 4.4' -gem 'rouge' -gem 'webrick', '~> 1.7' - -#gem "github-pages", group: :jekyll_plugins - -# If you have any plugins, put them here! -group :jekyll_plugins do - gem 'jekyll-theme-clean-blog', '~> 4.0', '>= 4.0.12' - gem 'jekyll-redirect-from', '~> 0.16.0' - gem 'jekyll-feed', '~> 0.16.0' - gem 'jekyll-paginate', '~> 1.1.0' - gem 'jekyll-youtube', '~> 1.0' - gem 'jekyll-giphy', '~> 1.0' - gem 'jekyll-gist', '~> 1.5' - gem 'jekyll-archives', '~> 2.2', '>= 2.2.1' -end - -# Windows does not include zoneinfo files, so bundle the tzinfo-data gem -gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] - -# Performance-booster for watching directories on Windows -gem 'wdm', '~> 0.1.0' if Gem.win_platform? - diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index 3ec051b..0000000 --- a/Gemfile.lock +++ /dev/null @@ -1,138 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - addressable (2.8.1) - public_suffix (>= 2.0.2, < 6.0) - colorator (1.1.0) - concurrent-ruby (1.1.10) - em-websocket (0.5.3) - eventmachine (>= 0.12.9) - http_parser.rb (~> 0) - ethon (0.15.0) - ffi (>= 1.15.0) - eventmachine (1.2.7) - faraday (2.5.2) - faraday-net_http (>= 2.0, < 3.1) - ruby2_keywords (>= 0.0.4) - faraday-net_http (3.0.0) - ffi (1.15.5) - forwardable-extended (2.6.0) - html-proofer (4.4.0) - addressable (~> 2.3) - mercenary (~> 0.3) - nokogiri (~> 1.13) - parallel (~> 1.10) - rainbow (~> 3.0) - typhoeus (~> 1.3) - yell (~> 2.0) - zeitwerk (~> 2.5) - http_parser.rb (0.8.0) - i18n (1.12.0) - concurrent-ruby (~> 1.0) - jekyll (4.2.2) - addressable (~> 2.4) - colorator (~> 1.0) - em-websocket (~> 0.5) - i18n (~> 1.0) - jekyll-sass-converter (~> 2.0) - jekyll-watch (~> 2.0) - kramdown (~> 2.3) - kramdown-parser-gfm (~> 1.0) - liquid (~> 4.0) - mercenary (~> 0.4.0) - pathutil (~> 0.9) - rouge (~> 3.0) - safe_yaml (~> 1.0) - terminal-table (~> 2.0) - jekyll-archives (2.2.1) - jekyll (>= 3.6, < 5.0) - jekyll-feed (0.16.0) - jekyll (>= 3.7, < 5.0) - jekyll-giphy (1.0.0) - jekyll-gist (1.5.0) - octokit (~> 4.2) - jekyll-paginate (1.1.0) - jekyll-redirect-from (0.16.0) - jekyll (>= 3.3, < 5.0) - jekyll-sass-converter (2.2.0) - sassc (> 2.0.1, < 3.0) - jekyll-seo-tag (2.8.0) - jekyll (>= 3.8, < 5.0) - jekyll-theme-clean-blog (4.0.12) - jekyll (>= 3.8.5) - jekyll-watch (2.2.1) - listen (~> 3.0) - jekyll-youtube (1.0.0) - jekyll - kramdown (2.4.0) - rexml - kramdown-parser-gfm (1.1.0) - kramdown (~> 2.0) - liquid (4.0.3) - listen (3.7.1) - rb-fsevent (~> 0.10, >= 0.10.3) - rb-inotify (~> 0.9, >= 0.9.10) - mercenary (0.4.0) - minima (2.5.1) - jekyll (>= 3.5, < 5.0) - jekyll-feed (~> 0.9) - jekyll-seo-tag (~> 2.1) - nokogiri (1.16.2-x86_64-darwin) - racc (~> 1.4) - nokogiri (1.16.2-x86_64-linux) - racc (~> 1.4) - octokit (4.25.1) - faraday (>= 1, < 3) - sawyer (~> 0.9) - parallel (1.22.1) - pathutil (0.16.2) - forwardable-extended (~> 2.6) - public_suffix (5.0.0) - racc (1.7.3) - rainbow (3.1.1) - rb-fsevent (0.11.2) - rb-inotify (0.10.1) - ffi (~> 1.0) - rexml (3.2.5) - rouge (3.30.0) - ruby2_keywords (0.0.5) - safe_yaml (1.0.5) - sassc (2.4.0) - ffi (~> 1.9) - sawyer (0.9.2) - addressable (>= 2.3.5) - faraday (>= 0.17.3, < 3) - terminal-table (2.0.0) - unicode-display_width (~> 1.1, >= 1.1.1) - typhoeus (1.4.0) - ethon (>= 0.9.0) - unicode-display_width (1.8.0) - webrick (1.7.0) - yell (2.2.2) - zeitwerk (2.6.0) - -PLATFORMS - x86_64-darwin-21 - x86_64-linux - -DEPENDENCIES - html-proofer (~> 4.4) - jekyll (~> 4.2, >= 4.2.2) - jekyll-archives (~> 2.2, >= 2.2.1) - jekyll-feed (~> 0.16.0) - jekyll-giphy (~> 1.0) - jekyll-gist (~> 1.5) - jekyll-paginate (~> 1.1.0) - jekyll-redirect-from (~> 0.16.0) - jekyll-theme-clean-blog (~> 4.0, >= 4.0.12) - jekyll-youtube (~> 1.0) - minima (~> 2.5, >= 2.5.1) - rouge - tzinfo-data - webrick (~> 1.7) - -RUBY VERSION - ruby 3.1.2p20 - -BUNDLED WITH - 2.3.22 diff --git a/_config.yml b/_config.yml deleted file mode 100644 index 1ea724e..0000000 --- a/_config.yml +++ /dev/null @@ -1,71 +0,0 @@ -# Site -name: "Grupy Blumenau" -author: "Grupy Blumenau" -description: "Comunidade Python de Blumenau" -meta_description: "Grupy Blumenau é uma comunidade de usuários da linguagem e do ecossistema Python em Blumenau, Santa Catarina." -logo: 'assets/images/python-logo.png' -pythonbrasillogo: 'assets/images/python-brasil-logo.svg' -favicon: 'assets/images/favicon.ico' -baseurl: "" -url: "https://blumenau.sc.python.org.br" -cdn_url: "https://pythonbnu.github.io" -twitter_username: pythonbnu -github_username: pythonbnu -facebook_username: pythonbnu -linkedin_username: pythonbnu -facebook_app_id: 'XXXXXX' -google_analytics: 'UA-131796064-1' -disqus: 'pythonbnu' -mailchimp-list: 'XXXX' -facebook: https://www.facebook.com/pythonbnu -twitter: https://www.twitter.com/pythonbnu -github: https://github.com/pythonbnu -slack: https://hackerspaceblumenau.slack.com/messages/C6U70HXK4 -instagram: https://www.instagram.com/grupyblumenau -linkedin: https://www.linkedin.com/company/grupy-blumenau -facebook_group: https://www.facebook.com/groups/185266825299444/ -discord: -whatsapp: -youtube: https://www.youtube.com/channel/UCpYa4wTH1bg_pvsHFw9FImQ -telegram: https://t.me/GruPyBnu -hackerspaceblumenau: http://www.hackerspaceblumenau.org/ - -# Authors -authors: - pythonbnu: - name: Grupy Blumenau - display_name: Grupy Blumenau - gravatar: c51b9112603be8fd51b7a85175eee1ca - email: grupyblumenau@gmail.com - web: https://blumenau.sc.python.org.br - twitter: https://twitter.com/pythonbnu - description: "Grupy Blumenau é uma comunidade de usuários da linguagem e do ecossistema Python em Blumenau, Santa Catarina." - john: - name: John - display_name: John - gravatar: b1cc14991db7a456fcd761680bbc8f81 - email: wowthemesnet@gmail.com - web: https://www.wowthemes.net - twitter: https://twitter.com/wowthemesnet - description: "This is the author box. Write a short description of the author here. You are currently previewing Mediumish demo, a Jekyll template compatible with Github pages." - -# Plugins -plugins: - - jekyll-paginate - - jekyll-archives - -# Archives -jekyll-archives: - enabled: - - categories - layout: archive - permalinks: - category: '/:name/' - -# Pagination -paginate: 6 -paginate_path: /page:num/ - -# Other -markdown: kramdown -highlighter: rouge \ No newline at end of file diff --git a/_includes/activities.html b/_includes/activities.html deleted file mode 100644 index 64a2c82..0000000 --- a/_includes/activities.html +++ /dev/null @@ -1,24 +0,0 @@ -
-
- -

Comunidade

-

Nos comunicamos via redes sociais e encontros presenciais.

- Participe -
-
-
- -

Encontros

-

Promovemos encontros regulares com palestras, lightning talks e #horaextra.

- Saiba mais -
-
-
-
- -

Empresas

-

Empresas de Blumenau promovem e usam JS para resolver problemas em domínios variados.

- Confira -
-
-
\ No newline at end of file diff --git a/_includes/disqus.html b/_includes/disqus.html deleted file mode 100644 index af4d871..0000000 --- a/_includes/disqus.html +++ /dev/null @@ -1,14 +0,0 @@ -
-
- - - comments powered by Disqus -
diff --git a/_includes/featuredbox.html b/_includes/featuredbox.html deleted file mode 100644 index 9d399a5..0000000 --- a/_includes/featuredbox.html +++ /dev/null @@ -1,44 +0,0 @@ - -{% assign author = site.authors[post.author] %} -
-
-
-
-
- -
-
-
-
-
-
-

{{ post.title }}

-

{{ post.excerpt | strip_html | truncatewords:25 }}

-
- -
-
-
-
-
-
- \ No newline at end of file diff --git a/_includes/footer.html b/_includes/footer.html deleted file mode 100644 index 8999c95..0000000 --- a/_includes/footer.html +++ /dev/null @@ -1,93 +0,0 @@ - \ No newline at end of file diff --git a/_includes/headerbanner.html b/_includes/headerbanner.html deleted file mode 100644 index c658ec0..0000000 --- a/_includes/headerbanner.html +++ /dev/null @@ -1,6 +0,0 @@ -
-
- -

A comunidade Grupy Blumenau reune grupos de usuários em todo o Vale do Itajaí interessados em difundir e divulgar a linguagem de programação.

-
-
\ No newline at end of file diff --git a/_includes/mainheading.html b/_includes/mainheading.html deleted file mode 100644 index b0d198a..0000000 --- a/_includes/mainheading.html +++ /dev/null @@ -1,4 +0,0 @@ -
-

{{ site.name }}

-

{{ site.description }}

-
\ No newline at end of file diff --git a/_includes/menu.html b/_includes/menu.html deleted file mode 100644 index 2b9c744..0000000 --- a/_includes/menu.html +++ /dev/null @@ -1,97 +0,0 @@ - \ No newline at end of file diff --git a/_includes/newsletter.html b/_includes/newsletter.html deleted file mode 100644 index 7a7871c..0000000 --- a/_includes/newsletter.html +++ /dev/null @@ -1,13 +0,0 @@ - -
-
- {{site.title}}   Never miss a story from us, subscribe to our newsletter -
-
- - -
-
-
-
\ No newline at end of file diff --git a/_includes/pagination.html b/_includes/pagination.html deleted file mode 100644 index 922a402..0000000 --- a/_includes/pagination.html +++ /dev/null @@ -1,25 +0,0 @@ -{% if paginator.total_pages > 1 %} - -{% endif %} \ No newline at end of file diff --git a/_includes/postbox.html b/_includes/postbox.html deleted file mode 100644 index 1344c0a..0000000 --- a/_includes/postbox.html +++ /dev/null @@ -1,32 +0,0 @@ - -{% assign author = site.authors[post.author] %} - -
-
- -
-

{{ post.title }}

-

{{ post.excerpt | strip_html | truncatewords:30 }}

-
- -
-
- \ No newline at end of file diff --git a/_includes/projects.html b/_includes/projects.html deleted file mode 100644 index 8103a08..0000000 --- a/_includes/projects.html +++ /dev/null @@ -1,32 +0,0 @@ -
-
-
-

O que estamos fazendo?

-
-
-
-
-
- -

Github

-

Acesse o nosso github e ajude a contribuir com projetos da nossa comunidade.

-
-
- -

Blog

-

Nosso blog é colaborativo e usamos o Jekyll como gerador de site estático. Confira nossos posts e contribua também pelo github.

-
-
- -

Youtube

-

Nosso canal no youtube sobre meetups, entrevistas e videos da comunidade. Acesse por aqui.

-
-
- -

Eventos

-

Buscamos realizar encontros e eventos em Blumenau. Se na sua empresa ainda não rolou, que tal levantar esta bandeira?

-
-
-
-
-
\ No newline at end of file diff --git a/_includes/share.html b/_includes/share.html deleted file mode 100644 index b58fec0..0000000 --- a/_includes/share.html +++ /dev/null @@ -1,34 +0,0 @@ -
-

- Share -

- - {% if page.comments != false %} -
-
- - {% endif %} -
\ No newline at end of file diff --git a/_layouts/archive.html b/_layouts/archive.html deleted file mode 100644 index f9400ae..0000000 --- a/_layouts/archive.html +++ /dev/null @@ -1,15 +0,0 @@ ---- -layout: default -title: Archive ---- - -
-
-

Conteúdos sobre '{{ page.title }}'

-
-
- {% for post in page.posts %} - {% include postbox.html %} - {% endfor %} -
-
\ No newline at end of file diff --git a/_layouts/base.html b/_layouts/base.html deleted file mode 100644 index 1ef0ede..0000000 --- a/_layouts/base.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - {{ page.title }} - {% if page.description %}{% endif %} - - - - - {% if jekyll.environment == 'production' %} - - - - {% endif %} - - {% capture layout %}{% if page.layout %}layout-{{ page.layout }}{% endif %}{% endcapture %} - - {{ content }} - - - - - - - - diff --git a/_layouts/default.html b/_layouts/default.html deleted file mode 100644 index 70a980c..0000000 --- a/_layouts/default.html +++ /dev/null @@ -1,13 +0,0 @@ ---- -layout: base ---- -{% include menu.html %} - -
-
-
- {{ content }} -
-
- {% include footer.html %} -
\ No newline at end of file diff --git a/_layouts/page.html b/_layouts/page.html deleted file mode 100644 index 6f8bb6c..0000000 --- a/_layouts/page.html +++ /dev/null @@ -1,25 +0,0 @@ ---- -layout: default ---- - - -
-
-

{{ page.title }}

-
- -
- {{content}} -
- - {% if page.comments == true %} - -
-
- {% include disqus.html %} -
-
- - {% endif %} - -
\ No newline at end of file diff --git a/_layouts/post.html b/_layouts/post.html deleted file mode 100644 index 31398a8..0000000 --- a/_layouts/post.html +++ /dev/null @@ -1,115 +0,0 @@ ---- -layout: default -disqus: false -archive: false -post_class: post-template ---- - - -
-
- - -
- {% include share.html %} -
- - - - {% assign author = site.authors[page.author] %} - -
-
- - - {% if page.author %} -
-
- {{ author.display_name }} -
-
- {{ author.display_name }} - {{ author.description }} -
-
- {% endif %} - - -

{{ page.title }}

- -
- - - {% if page.image %}{{ page.title }}{% endif %} - - - -
- {{content}} -
- - -

- - - {% if page.last_modified_at %} - (Updated: ) - {% endif %} - -

- - - - - - - - - -
- - -
-
- - - - - -{% if page.comments != false %} -
-
-
- {% include disqus.html %} -
-
-
-{% endif %} - \ No newline at end of file diff --git a/_posts/2017/2017-08-26-encontro-grupy-blumenau.md b/_posts/2017/2017-08-26-encontro-grupy-blumenau.md deleted file mode 100644 index 5b95efa..0000000 --- a/_posts/2017/2017-08-26-encontro-grupy-blumenau.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -layout: post -title: "I Encontro do GruPy Blumenau" -description: "Encontro da Comunidade Python de Blumenau" -author: pythonbnu -categories: [ encontros ] -image: assets/images/encontro-1-grupy-blumenau.jpg ---- - -Dia 26 de Agosto de 2017 vai rolar I Encontro do GruPy Blumenau no Instituto Gene Blumenau das 14:00hs até às 18:00hs, Rua Antônio da Veiga, 105 - Victor Konder, Blumenau SC. - -Link de inscrição: https://www.meetup.com/hackerspaceblumenau/events/242455530/ - - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - - -Grande abraço! - -#forcapython \ No newline at end of file diff --git a/_posts/2019/2019-01-05-segundo-encontro-grupy-blumenau.md b/_posts/2019/2019-01-05-segundo-encontro-grupy-blumenau.md deleted file mode 100644 index 9c38c18..0000000 --- a/_posts/2019/2019-01-05-segundo-encontro-grupy-blumenau.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -layout: post -title: "II Encontro do GruPy Blumenau" -description: "II Encontro da Comunidade Python de Blumenau" -author: pythonbnu -categories: [ encontros ] -image: assets/images/encontro-2-grupy-blumenau.jpg ---- - - -No dia 29 de Janeiro teremos mais um meetup da comunidade GruPy Blumenau! O encontro será na FURB, na R. Antônio da Veiga, 140 - Victor Konder, Blumenau - SC. - -O evento vai ocorrer na sala S-427, Bloco S, na FURB. Neste encontro vamos realizar um Dojo utilizando Python como linguagem para solução. A ideia é retomar as atividades e conhecer os pythonistas que estão por Blumenau. - -Se você não conhece o Câmpus 1 (em frente ao Giassi), essa figura pode lhe ajudar: - -FURB Mapa do Campus - -Outra dica é entrar ali pelo Bloco A (passarela da Antônio da Veiga) e perguntar direções no Balcão de informações logo na entrada. - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - - -Grande abraço! - -#forcapython \ No newline at end of file diff --git a/_posts/2019/2019-01-31-dojo-problema-notas-e-moedas.md b/_posts/2019/2019-01-31-dojo-problema-notas-e-moedas.md deleted file mode 100644 index 04a74ed..0000000 --- a/_posts/2019/2019-01-31-dojo-problema-notas-e-moedas.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -layout: post -title: "Dojo Problema: Notas e Moedas" -description: "No segundo encontro do grupy rolou um dojo em Python." -author: pythonbnu -categories: [ dojo ] -image: assets/images/dojo-grupy-problema-notas-e-moedas-participantes.jpg ---- - -No primeiro dojo de 2019 do GruPy Blumenau resolvemos um problema que foi ["Notas e Moedas"](https://www.urionlinejudge.com.br/judge/pt/problems/view/1021). O evento aconteuceu na FURB com muitos participantes. A solução deste problema você pode ver em nosso [github](https://github.com/pythonbnu/dojo/tree/master/2019_01_29). Veja as imagens abaixo: - -Participantes resolvendo o problema no Dojo Grupy -Participantes resolvendo o problema no Dojo Grupy - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcapython \ No newline at end of file diff --git a/_posts/2019/2019-01-31-terceiro-encontro-grupy-blumenau.md b/_posts/2019/2019-01-31-terceiro-encontro-grupy-blumenau.md deleted file mode 100644 index d86a98b..0000000 --- a/_posts/2019/2019-01-31-terceiro-encontro-grupy-blumenau.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -layout: post -title: "III Encontro do GruPy Blumenau" -description: "III Encontro da Comunidade Python de Blumenau" -author: pythonbnu -categories: [ encontros ] -image: assets/images/encontro-3-grupy-blumenau.jpg ---- - -No dia 19 de Fevereiro teremos mais um meetup da comunidade GruPy Blumenau! O encontro será na FURB, na R. Antônio da Veiga, 140 - Victor Konder, Blumenau - SC. - -Neste encontro o assunto será sobre **Serverless utilizando AWS Lambda + Python** com a talk do Raffael Tancman. - -Explicaremos como realizar o setup do seu código Python no AWS Lambda. Vamos desmistificar o serviço da Amazon e explicar uma forma de organizar os seus lambdas utilizando o Apex.run e falar sobre as pegadinhas em utilizar Python neste serviço. - -[Faça a sua inscrição clicando aqui!](https://www.meetup.com/hackerspaceblumenau/events/258556228/) - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - - -Grande abraço! - -#forcapython \ No newline at end of file diff --git a/_posts/2019/2019-02-19-quarto-encontro-grupy-blumenau.md b/_posts/2019/2019-02-19-quarto-encontro-grupy-blumenau.md deleted file mode 100644 index d82105d..0000000 --- a/_posts/2019/2019-02-19-quarto-encontro-grupy-blumenau.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -layout: post -title: "IV Encontro do GruPy Blumenau" -description: "IV Encontro da Comunidade Python de Blumenau" -author: pythonbnu -categories: [ encontros ] -image: assets/images/encontro-4-grupy-blumenau.jpg -hidden: false ---- - -No dia 23 de Março teremos mais um meetup da comunidade GruPy Blumenau! O encontro será na FURB, na R. Antônio da Veiga, 140 - Victor Konder, Blumenau - SC. - -Neste encontro vai rolar um workshop de Python onde iremos praticar os principais recursos da linguagem. - -Workshop prático para iniciantes na linguagem python - -Nesse workshop prático vamos apresentar a linguagem python e o seu ecossistema. -Os temas cobertos durante o workshop são: -- A linguagem python (focado em python 3+), mas demonstrando algumas das novidades -- Sobre a linguagem: comandos básicos, estruturas básicas -- Pacotes disponíveis nas bibliotecas padrões do python -- Como instalar pacotes/bibliotecas e gerenciar ambientes virtuais - -O foco do workshop é para iniciantes na linguagem, mas se você já tem experiência pode comparecer para compartilhar suas ideias e ajudar as demais pessoas que estão aprendendo. - -Vamos iniciar às 9h até às 12h (dependendo dos exercícios), mas teremos uma pausa de 30 minutos para café. - -[Clique neste link para a sua inscrição.](https://www.meetup.com/hackerspaceblumenau/events/259512011/?_xtd=gatlbWFpbF9jbGlja9oAJDE0NTgxZmM2LTFjYTUtNDAyZi04Y2VlLTAzYTM5MmZhOWM1OA) - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcapython \ No newline at end of file diff --git a/_posts/2019/2019-02-19-serverless-com-aws-python-no-grupy-blumenau.md b/_posts/2019/2019-02-19-serverless-com-aws-python-no-grupy-blumenau.md deleted file mode 100644 index 535c533..0000000 --- a/_posts/2019/2019-02-19-serverless-com-aws-python-no-grupy-blumenau.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -layout: post -title: "Serverless com AWS + Python no III Encontro do GruPy Blumenau" -description: "No III Encontro do GruPy Blumenau tivemos uma palestra do Raffael Tancman sobre Serverless com AWS + Python." -author: pythonbnu -categories: [ talks ] -image: assets/images/encontro-3-grupy-blumenau-foto-comunidade.jpg ---- - - -No III Encontro do GruPy que aconteceu na FURB tivemos uma palestra sobre Serverless. Nesta apresentação Raffael Tancman falou sobre: - -- O que é o AWS Lambda? -- AWS Lambda console web -- awscli + Lambda -- Utilizando pacotes Python + awscli + Lambda -- Apex.run + Lambda -- Pegadinhas Python + Lambda - -Link da Palestra: [https://docs.google.com/presentation/d/1Llg7FlConLPKPQEM67b2-x7vy_f2KtwLDq2PQ32uGdc/edit?usp=sharing](https://docs.google.com/presentation/d/1Llg7FlConLPKPQEM67b2-x7vy_f2KtwLDq2PQ32uGdc/edit?usp=sharing) - -Site do palestrante: [https://www.rtancman.com.br/](https://www.rtancman.com.br/) - -Fotos: - -Participantes do III Econtro do Grupy - -Foto da palestra - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - - -Grande abraço! - -#forcapython \ No newline at end of file diff --git a/_posts/2019/2019-03-24-quinto-encontro-grupy-blumenau.md b/_posts/2019/2019-03-24-quinto-encontro-grupy-blumenau.md deleted file mode 100644 index 6e0d142..0000000 --- a/_posts/2019/2019-03-24-quinto-encontro-grupy-blumenau.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -layout: post -title: "V Encontro do GruPy Blumenau" -description: "V Encontro da Comunidade Python de Blumenau" -author: pythonbnu -categories: [ encontros ] -image: assets/images/encontro-5-grupy-blumenau.jpg -hidden: false ---- - -No dia 16 de Abril teremos mais um meetup da comunidade GruPy Blumenau! O encontro será na FURB, na R. Antônio da Veiga, 140 - Victor Konder, Blumenau - SC. - -Veja a grade do evento: - -- 19:00 - 19:20 Lightning talks -- 19:20 - 20:50 Dojo -- 20:55 - 21:00 Encerramento / Foto oficial - -Faça a sua inscrição pelo meetup [https://www.meetup.com/hackerspaceblumenau/events/260525133/](https://www.meetup.com/hackerspaceblumenau/events/260525133/) - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcapython \ No newline at end of file diff --git a/_posts/2019/2019-03-24-workshop-pratico-para-iniciantes-na-linguagem-python-no-grupy-blumenau.md b/_posts/2019/2019-03-24-workshop-pratico-para-iniciantes-na-linguagem-python-no-grupy-blumenau.md deleted file mode 100644 index 8130001..0000000 --- a/_posts/2019/2019-03-24-workshop-pratico-para-iniciantes-na-linguagem-python-no-grupy-blumenau.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -layout: post -title: "Workshop prático para iniciantes na linguagem Python" -description: "No IV Encontro do GruPy Blumenau tivemos um workshop prático para iniciantes na linguagem Python." -author: pythonbnu -categories: [ workshops ] -image: assets/images/encontro-23-03-2019/iv_encontro_grupyblumenau_galera_1.jpg ---- - - -No V Encontro do GruPy que aconteceu na FURB tivemos um Workshop prático para iniciantes na linguagem Python. Contamos com a ajuda dos 3 integrantes da comunidade para dar esse workshop que foram: - -- Júlio César Batista -- Patrícia Gonsalves -- Raffael Tancman - -Link para o material do worshop: [https://github.com/pythonbnu/workshop-python-iniciante](https://github.com/pythonbnu/workshop-python-iniciante) - -Fotos: -Participantes do IV Econtro do Grupy - -Participantes do IV Econtro do Grupy - -Foto do Workshop prático para iniciantes na linguagem Python - -Foto do Workshop prático para iniciantes na linguagem Python - -Foto do Workshop prático para iniciantes na linguagem Python - -Foto do Workshop prático para iniciantes na linguagem Python - -Foto do Workshop prático para iniciantes na linguagem Python - -Foto do Workshop prático para iniciantes na linguagem Python - -Foto do Workshop prático para iniciantes na linguagem Python - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - - -Grande abraço! -#forcapython \ No newline at end of file diff --git a/_posts/2019/2019-04-17-dojo-a-unica-chance.md b/_posts/2019/2019-04-17-dojo-a-unica-chance.md deleted file mode 100644 index 8a77297..0000000 --- a/_posts/2019/2019-04-17-dojo-a-unica-chance.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -layout: post -title: "Dojo Problema: A Única Chance" -description: "No Segundo dojo de 2019 do GruPy Blumenau resolvemos um problema que foi 'A Única Chance'." -author: pythonbnu -categories: [ dojo ] -image: assets/images/dojo/dojo-grupy-problema-a-unica-chance-participantes.jpg ---- - -No Segundo dojo de 2019 do GruPy Blumenau resolvemos um problema que foi ["A Única Chance"](https://www.urionlinejudge.com.br/judge/pt/problems/view/2496). O evento aconteuceu na FURB e a solução deste problema você pode ver em nosso [github](https://github.com/pythonbnu/dojo/tree/master/2019_04_16). - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcapython \ No newline at end of file diff --git a/_posts/2019/2019-04-18-sexto-encontro-grupy-blumenau.md b/_posts/2019/2019-04-18-sexto-encontro-grupy-blumenau.md deleted file mode 100644 index cf5b3cb..0000000 --- a/_posts/2019/2019-04-18-sexto-encontro-grupy-blumenau.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -layout: post -title: "VI Encontro do GruPy Blumenau" -description: "VI Encontro da Comunidade Python de Blumenau" -author: pythonbnu -categories: [ encontros ] -image: assets/images/encontro-6-grupy-blumenau.jpg ---- - -No dia 18 de Maio teremos mais um meetup da comunidade GruPy Blumenau! O encontro será na FURB, na R. Antônio da Veiga, 140 - Victor Konder, Blumenau - SC. - -[Faça a sua inscrição pelo Meetup clicando aqui!!!](https://www.meetup.com/hackerspaceblumenau/events/260967562/) - -Você também pode submeter a sua proposta de palestras ou workshop para o nosso encontro pelo Speakerfight: - -[https://speakerfight.com/events/vi-encontro-do-grupy-blumenau-maio2019/](https://speakerfight.com/events/vi-encontro-do-grupy-blumenau-maio2019/) - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcapython \ No newline at end of file diff --git a/_posts/2019/2019-05-01-grupy-na-semana-academica-de-computacao-furb-blumenau.md b/_posts/2019/2019-05-01-grupy-na-semana-academica-de-computacao-furb-blumenau.md deleted file mode 100644 index 3ad138e..0000000 --- a/_posts/2019/2019-05-01-grupy-na-semana-academica-de-computacao-furb-blumenau.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -layout: post -title: "GruPy na Semana acadêmica de computação da FURB 2019" -description: "Nossa participação na Semana acadêmica de computação da FURB 2019 dando workshop e palestra." -author: pythonbnu -categories: [ encontros ] -image: assets/images/semana-academica-de-computacao-furb-2019-04/foto-galera-palestra-por-que-python.jpg ---- - -No dia 29/04/2019 e 30/04/2019 rolou a Semana acadêmica de computação da FURB. O GruPy participou deste evento dando um workshop de Python para iniciantes e uma palestra com o tema "Por que Python?". O worshop aconteceu na manhã do dia 29/04 com uma duração de 2hs. Já a palestra aconteceu no dia 30/04 na parte da noite. - -O material do workshop é aberto e temos um repositório no github que você pode conferir [aqui](https://github.com/pythonbnu/workshop-python-iniciante). Neste workshop tivemos a participação dos alunos da FURB e da comunidade os representantes foram Júlio César Batista e Raffael Tancman. - -Sobre a palestra, Patrícia Gonsalves e Raffael Tancman incentivaram os alunos da FURB e convidados para iniciarem a sua jornada na comunidade de Python passando pela história da linguagem, características, comunidade e o mercado de trabalho. Você pode acessar a apresentação [clicando neste link](https://docs.google.com/presentation/d/1WQWPi_H44KaxVjjLWtV6fzdkIlTqRcFK6Y1_LQ5uODg/edit?usp=sharing). - -Veja as fotos da nossa participação: - -Participantes do Workshop na FURB - -Participantes do Workshop na FURB foto 2 - -Participantes da Palestra na FURB - -Palestrantes do GruPy na FURB - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcapython \ No newline at end of file diff --git a/_posts/2019/2019-05-01-grupy-no-flisol-blumenau.md b/_posts/2019/2019-05-01-grupy-no-flisol-blumenau.md deleted file mode 100644 index f606a34..0000000 --- a/_posts/2019/2019-05-01-grupy-no-flisol-blumenau.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -layout: post -title: "GruPy Blumenau no FLISoL Blumenau 2019" -description: "Nossa participação no FLISoL Blumenau 2019" -author: pythonbnu -categories: [ encontros ] -image: assets/images/flisol-2019/grupy-flisol-2019.jpg ---- - -No dia 27/04/2019 nós participamos da [edição de 2019 do FLISoL Blumenau](http://www.hackerspaceblumenau.org/flisol/) organizada pelo [Hackerspace Blumenau](www.hackerspaceblumenau.org/). - -A nossa participação foi com uma oficina de 2h sobre os conceitos da linguagem python. -O material você pode conferir [aqui](https://github.com/pythonbnu/workshop-python-iniciante). - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcapython \ No newline at end of file diff --git a/_posts/2019/2019-05-24-talks-do-sexto-encontro-grupy-blumenau.md b/_posts/2019/2019-05-24-talks-do-sexto-encontro-grupy-blumenau.md deleted file mode 100644 index 640e6bf..0000000 --- a/_posts/2019/2019-05-24-talks-do-sexto-encontro-grupy-blumenau.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -layout: post -title: "Palestras do VI Encontro do GruPy Blumenau" -description: "Veja como foram as palestras do VI Encontro do GruPy Blumenau onde falamos sobre Crawlers, Python3 e Graphql." -author: pythonbnu -categories: [ talks ] -image: assets/images/encontro-18-05-2019/comunidade.jpg ---- - - -No VI Encontro do GruPy que aconteceu na FURB tivemos uma série de palestras na nossa grade com os seguintes assuntos: - -- "Coletando dados da web com web scraping" por Julio -- "Python 3 Funcional: É uma boa escolha?" por Artur Bizon -- "Aprendendo GraphQL na pratica com living code" por Marcos - -Todo conteúdo foi gravado e esta disponível no [Youtube em nosso canal.](https://www.youtube.com/channel/UCpYa4wTH1bg_pvsHFw9FImQ) - -Videos: - - - - - - - -Fotos: - -Participantes do VI Econtro do Grupy - -Foto da palestra - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - - -Grande abraço! - -#forcapython \ No newline at end of file diff --git a/_posts/2019/2019-06-18-dojo-faixa-de-letras.md b/_posts/2019/2019-06-18-dojo-faixa-de-letras.md deleted file mode 100644 index dd67ba1..0000000 --- a/_posts/2019/2019-06-18-dojo-faixa-de-letras.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -layout: post -title: "Dojo Problema: Faixa de Letras" -description: "No terceiro dojo de 2019 do GruPy Blumenau resolvemos um problema que foi 'Faixa de Letras'." -author: pythonbnu -categories: [ dojo ] -image: assets/images/dojo/dojo-grupy-faixa-de-letras.jpg ---- - -No terceiro dojo de 2019 do GruPy Blumenau resolvemos um problema que foi ["Faixa de Letras"](https://www.urionlinejudge.com.br/judge/pt/problems/view/1276). O evento aconteuceu na FURB e a solução deste problema você pode ver em nosso [github](https://github.com/pythonbnu/dojo/tree/master/2019_06_18). - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcapython \ No newline at end of file diff --git a/_posts/2019/2019-06-21-oitavo-encontro-grupy-blumenau.md b/_posts/2019/2019-06-21-oitavo-encontro-grupy-blumenau.md deleted file mode 100644 index 5d1afa5..0000000 --- a/_posts/2019/2019-06-21-oitavo-encontro-grupy-blumenau.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -layout: post -title: "VIII Encontro do GruPy Blumenau - Workshop de Django" -description: "VIII Encontro da Comunidade Python de Blumenau vamos ter um workshop no framework web Django" -author: pythonbnu -categories: [ encontros ] -image: /assets/images/canvas/tutorial-django-encontro-8-grupy-blumenau.png ---- - -No dia 20 de Julho teremos mais um meetup da comunidade GruPy Blumenau! O encontro será na FURB, na R. Antônio da Veiga, 140 - Victor Konder, Blumenau - SC. - -Neste encontro vai rolar um workshop de Django para criar um Blog. - - -Faça a sua inscrição pelo Meetup: -[https://www.meetup.com/hackerspaceblumenau/events/262638110/](https://www.meetup.com/hackerspaceblumenau/events/262638110/) - -Workshop de Django vai ser feito com o material da comunidade [djangogirls](https://tutorial.djangogirls.org/pt/) onde iremos apresentar o framework e construir um blog passando pelos principais recursos do framework. - -Os temas cobertos durante o workshop são: - -- A linguagem python (focado em python 3+), mas demonstrando algumas das novidades -- Como instalar pacotes/bibliotecas e gerenciar ambientes virtuais -- Funcionalidades do Django - -O foco do workshop é para iniciantes em Django, mas se você já tem experiência pode comparecer para compartilhar suas ideias e ajudar as demais pessoas que estão aprendendo. - -Vamos iniciar às 9h até às 12h, mas teremos uma pausa de 30 minutos para café. - -VIII Encontro do GruPy Blumenau - Workshop de Django - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcapython \ No newline at end of file diff --git a/_posts/2019/2019-07-21-nono-encontro-grupy-blumenau.md b/_posts/2019/2019-07-21-nono-encontro-grupy-blumenau.md deleted file mode 100644 index 0a60ccc..0000000 --- a/_posts/2019/2019-07-21-nono-encontro-grupy-blumenau.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -layout: post -title: "IX Encontro do GruPy Blumenau" -description: "XI Encontro da Comunidade Python de Blumenau vamos ter um dia recheado de palestras" -author: pythonbnu -categories: [ encontros ] -image: /assets/images/canvas/submissao-de-palestras-encontro-9-grupy-blumenau.png ---- - -IX Encontro do GruPy Blumenau - -No dia 31 de Agosto teremos mais um meetup da comunidade GruPy Blumenau! - -A ideia desse encontro é organizar palestras de +/- 45 minutos e ter um espaço para mais duas palestras curtas de +/- 15 minutos. - -Por favor, mencione a duração da sua palestra ao enviar a proposta. - -O encontro será no Campus 1 da FURB (sala à definir). - -Submeta sua proposta de palestra até dia 20/08/2019 pelo speakerfight - [https://speakerfight.com/events/ix-encontro-do-grupy-blumenau/](https://speakerfight.com/events/ix-encontro-do-grupy-blumenau/) - -Compartilhe o seu conhecimento conosco! - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcapython \ No newline at end of file diff --git a/_posts/2019/2019-07-21-veja-como-foi-o-tuturial-de-django-no-oitavo-encontro.md b/_posts/2019/2019-07-21-veja-como-foi-o-tuturial-de-django-no-oitavo-encontro.md deleted file mode 100644 index 743bdaa..0000000 --- a/_posts/2019/2019-07-21-veja-como-foi-o-tuturial-de-django-no-oitavo-encontro.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -layout: post -title: "Veja como foi o tutorial de Django no VIII Encontro" -description: "Participação da comunidade no tutorial de Django no VIII Encontro do GruPy Blumenau." -author: pythonbnu -categories: [ tutoriais ] -image: /assets/images/encontros/2019/07/tutorial-django/tutorial-django-comunidade.png ---- - -No dia 20/07/2019 tivemos um tutorial de Django utilizando o material da comunidade [DjangoGirls](https://djangogirls.org/). - -Link da Apresentação: [https://docs.google.com/presentation/d/1ExVB1JIo6JxWTBpF2gaCbe80QVT-I7_ZBOGXGwCkNz0/edit?usp=sharing](https://docs.google.com/presentation/d/1ExVB1JIo6JxWTBpF2gaCbe80QVT-I7_ZBOGXGwCkNz0/edit?usp=sharing) - -Veja as fotos da nossa participação: - -Participantes do tutorial na FURB - -Brindes do tutorial na FURB - -Tutorial de Django na FURB - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcapython \ No newline at end of file diff --git a/_posts/2019/2019-08-22-python-nas-empresas-edicao-hbsis.md b/_posts/2019/2019-08-22-python-nas-empresas-edicao-hbsis.md deleted file mode 100644 index 7754c94..0000000 --- a/_posts/2019/2019-08-22-python-nas-empresas-edicao-hbsis.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -layout: post -title: "Python nas Empresas - Edição HBSIS" -description: "Evento para que a comunidade conheça as empresas da região além de fazer networking, trocar experiências realizando palestras e debates." -author: pythonbnu -categories: [ encontros ] -image: /assets/images/encontros/2019/08/python-nas-empresas/python-nas-empresas.png ---- - -No dia 22 de Agosto tivemos a primeira edição em Blumenau do "Python nas Empresas" na HBSIS. Este evento tem como missão o networking e para que a comunidade conheça as empresas da região. - -Tivemos 2 palestras que foram: -- ["GruPy Blumenau & Hackerspace" e "Por que Python?" por Raffael Tancman](https://docs.google.com/presentation/d/1vYHcvmJrEfhxnhhg70am4TO04C9EyisJCRNS3ITg_Ew/edit?usp=sharing) -- "Qpid Proton e Python na HBSIS" por Fabiano Modos - -

Assista abaixo como foi o evento:

- - - -

Veja as fotos do evento:

- -Participantes do Python nas Empresas - Edição HBSIS - -Participantes do Python nas Empresas - Edição HBSIS - -Participantes do Python nas Empresas - Edição HBSIS - -Participantes do Python nas Empresas - Edição HBSIS - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcapython \ No newline at end of file diff --git a/_posts/2019/2019-08-31-veja-como-foi-o-nono-encontro-grupy-blumenau.md b/_posts/2019/2019-08-31-veja-como-foi-o-nono-encontro-grupy-blumenau.md deleted file mode 100644 index acb240e..0000000 --- a/_posts/2019/2019-08-31-veja-como-foi-o-nono-encontro-grupy-blumenau.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -layout: post -title: "Veja como foi o IX Encontro do GruPy Blumenau" -description: "XI Encontro da Comunidade Python de Blumenau contou com palestras de Python e generators, Deploy Blue/Green na AWS com Python e Graphql & Python." -author: pythonbnu -categories: [ encontros ] -image: /assets/images/encontros/2019/08/ix-grupy/ix-grupy-palestra13.jpg ---- - -Neste encontro que aconteceu na FURB no dia 31/08/2019 tivemos muito networking e conhecimento. - -Tivemos 2 palestras que foram: -- "Python e generators" por Julio César Batista -- "Automatizando deploy blue/green na AWS com Python" por Daniel Bastos -- ["Python & Graphql" por Raffael Tancman](https://docs.google.com/presentation/d/1-vXFdpoqsG6aJmnh91KYnNUXwF8nG5R-T4uZcPvAjM4/edit?usp=sharing) - -

Veja as fotos do evento:

- -Participantes do XI Encontro da Comunidade Python de Blumenau - -Participantes do XI Encontro da Comunidade Python de Blumenau - -Participantes do XI Encontro da Comunidade Python de Blumenau - -Participantes do XI Encontro da Comunidade Python de Blumenau - -Participantes do XI Encontro da Comunidade Python de Blumenau - -Participantes do XI Encontro da Comunidade Python de Blumenau - -Participantes do XI Encontro da Comunidade Python de Blumenau - -Participantes do XI Encontro da Comunidade Python de Blumenau - -Participantes do XI Encontro da Comunidade Python de Blumenau - -Participantes do XI Encontro da Comunidade Python de Blumenau - -Participantes do XI Encontro da Comunidade Python de Blumenau - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcapython \ No newline at end of file diff --git a/_posts/2019/2019-09-18-decimo-encontro-grupy-blumenau.md b/_posts/2019/2019-09-18-decimo-encontro-grupy-blumenau.md deleted file mode 100644 index d4033a8..0000000 --- a/_posts/2019/2019-09-18-decimo-encontro-grupy-blumenau.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -layout: post -title: "X Encontro do GruPy Blumenau" -description: "X Encontro da Comunidade Python de Blumenau" -author: pythonbnu -categories: [ encontros ] -image: assets/images/encontros/2019/09/x-grupy/xgrupybanner.png ---- - -No dia 18 de Setembro teremos mais um meetup da comunidade GruPy Blumenau! O encontro será na FURB, na R. Antônio da Veiga, 140 - Victor Konder, Blumenau - SC. -Estaremos na sala S-427, no Bloco S. Esse mapa pode ajudar com a localização dos blocos [http://www.furb.br/web/img/mapas/campus_1.jpg](http://www.furb.br/web/img/mapas/campus_1.jpg) - -[Faça a sua inscrição pelo Meetup clicando aqui!!!](https://www.meetup.com/hackerspaceblumenau/events/264776883/) - - -Neste mês faremos um coding dojo. Para mais informações sobre a ideia de um dojo e como participar, acesse [coding dojo](https://blumenau.sc.python.org.br/coding-dojo). Vamos aprender e praticar juntos! - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcapython \ No newline at end of file diff --git a/_posts/2019/2019-11-12-python-nas-empresas-edicao-linx.md b/_posts/2019/2019-11-12-python-nas-empresas-edicao-linx.md deleted file mode 100644 index 6767df6..0000000 --- a/_posts/2019/2019-11-12-python-nas-empresas-edicao-linx.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -layout: post -title: "Python nas Empresas - Edição Linx" -description: "Evento para que a comunidade conheça as empresas da região além de fazer networking, trocar experiências realizando palestras e debates." -author: pythonbnu -categories: [ encontros ] -image: /assets/images/encontros/2019/11/python-nas-empresas/Linx-Python-nas-empresas.png ---- - -No dia 12 de Novembro tivemos a segunda edição em Blumenau do "Python nas Empresas" na Linx. Este evento tem como missão o networking e para que a comunidade conheça as empresas da região. - -Tivemos 2 palestras que foram: -- "Lições aprendidas em Microserviços" por Diego Neves -- "Construindo serviços em cloud serverless usando Python" por Elton Persike e Paulo Schmidt - -

Veja as fotos do evento:

- -Participantes do Python nas Empresas - Edição Linx - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcapython \ No newline at end of file diff --git a/_posts/2019/2019-11-14-blumenau-dev-day-representante-do-grupy-diego-neves.md b/_posts/2019/2019-11-14-blumenau-dev-day-representante-do-grupy-diego-neves.md deleted file mode 100644 index 467c609..0000000 --- a/_posts/2019/2019-11-14-blumenau-dev-day-representante-do-grupy-diego-neves.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -layout: post -title: "Blumenau Dev Day 2019 - Diego Neves vai representar o GruPy" -description: "Blumenau Dev Day 2019 - Um evento que vai reunir as principais comunidades de Blumenau para um dia de muito conhecimento e network." -author: pythonbnu -categories: [ eventos ] -image: /assets/images/eventos/2019/blumenau-dev-day/blumenaudevday2019.png ---- - -Um evento que vai reunir as principais comunidades de Blumenau para um dia de muito conhecimento e network. - -[CLIQUE AQUI E FAÇA A SUA INSCRIÇÃO!!!](https://www.sympla.com.br/blumenau-dev-day-2019__715489) - -O Diego Neves vai representar a comunidade de Python de Blumenau após ter sido a palestrada mais votada pelo [speakerfight](https://speakerfight.com/events/submissao-de-palestra-sobre-python-para-o-blumenau-dev-day-2019/). - -

Nos ajude a compartilhar este evento:

- -Participantes do Python nas Empresas - Edição Linx - -Fique ligado no [site do evento](http://www.hackerspaceblumenau.org/blumenau-dev-day/) para mais informações! - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#blumenaudevday2019 #grupyblumenau #forcaPython \ No newline at end of file diff --git a/_posts/2020/2020-02-27-decimo-segundo-encontro-grupy-blumenau.md b/_posts/2020/2020-02-27-decimo-segundo-encontro-grupy-blumenau.md deleted file mode 100644 index b51eab0..0000000 --- a/_posts/2020/2020-02-27-decimo-segundo-encontro-grupy-blumenau.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -layout: post -title: "XII Encontro do GruPy Blumenau" -description: "XII Encontro da Comunidade Python de Blumenau" -author: pythonbnu -categories: [ encontros ] -image: /assets/images/encontros/2020/02/encontro-12-grupy-blumenau.png ---- - -No dia 29 de Fevereiro teremos mais um meetup da comunidade GruPy Blumenau! O encontro será na FURB, na R. Antônio da Veiga, 140 - Victor Konder, Blumenau - SC. Estaremos na sala S-427, no Bloco S. Esse mapa pode ajudar com a localização dos blocos http://www.furb.br/web/img/mapas/campus_1.jpg - -[FAÇA A SUA INSCRIÇÃO PELO MEETUP](https://www.meetup.com/hackerspaceblumenau/events/268982806/) - -Veja o que rolou: - -- [Palestra: Graphql e Python](https://docs.google.com/presentation/d/1-vXFdpoqsG6aJmnh91KYnNUXwF8nG5R-T4uZcPvAjM4/edit?usp=sharing) - - Palestrante: Raffael Tancman - - Descrição: Vamos embarcar no mundo da graphql e entender o que é o Graphene. - -- Oficina / Roda de conversa - - - Além da palestra teremos uma roda de conversa sobre a linguagem abordando assuntos que surgirem no dia. Participe e traga as suas dúvidas e questionamentos! - - -

Veja as fotos do evento:

- -Participantes do Encontro de Python -Participantes do Encontro de Python -Participantes do Encontro de Python - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcaPython \ No newline at end of file diff --git a/_posts/2020/2020-03-09-primeiro-pylaides-blumenau.md b/_posts/2020/2020-03-09-primeiro-pylaides-blumenau.md deleted file mode 100644 index 934e8bc..0000000 --- a/_posts/2020/2020-03-09-primeiro-pylaides-blumenau.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -layout: post -title: "1º Encontro Pyladies Blumenau" -description: "1º Encontro Pyladies Blumenau" -author: pythonbnu -categories: [ encontros ] -image: /assets/images/encontros/2020/03/encontro-1-pyladies-blumenau.jpg ---- - -No último dia 07 de março aconteceu o primeiro encontro do Pyladies Blumenau! Viva! -As mulheres presentes no encontro na Serasa Consumidor fizeram uma roda de conversa sobre a vida de desenvolvedora. - -Gostaríamos de parabenizar todas pela iniciativa e dizer que estamos ansiosos para ver quais serão os próximos encontros! - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcaPython diff --git a/_posts/2020/2020-04-29-decimo-terceiro-encontro-grupy-blumenau.md b/_posts/2020/2020-04-29-decimo-terceiro-encontro-grupy-blumenau.md deleted file mode 100644 index 32bdce2..0000000 --- a/_posts/2020/2020-04-29-decimo-terceiro-encontro-grupy-blumenau.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -layout: post -title: "13º Encontro do GruPy Blumenau online" -description: "13º Encontro da Comunidade Python de Blumenau - versão online" -author: pythonbnu -categories: [ encontros ] -image: /assets/images/encontros/2020/03/encontro-13-grupy-blumenau-online.png ---- - -No final de Abril/2020 tivemos a primeira edição online por conta da covid-19. Este evento aconteceu no [meetup](https://www.meetup.com/hackerspaceblumenau/events/270167368/) e com o [link para o evento no youtube](https://youtu.be/-b5qInHvZbU). - -Agenda: - -- "RPA - Automatizando processos de ponta a ponta" - - Palestrante: Junior Westarb - - [Link para o slide](/assets/images/encontros/2020/03/rpa-webinar.pptx) - -- "Querido diario: o projeto do Serenata de Amor para sua cidade!" - - Palestrante: Vanz - - [Link para o slide](/assets/images/encontros/2020/03/querido-diario-o-projeto-do-serenata-para-sua-cidade.pdf) - -

Veja como foi:

- - - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcaPython \ No newline at end of file diff --git a/_posts/2020/2020-05-18-decimo-quarto-encontro-grupy-blumenau.md b/_posts/2020/2020-05-18-decimo-quarto-encontro-grupy-blumenau.md deleted file mode 100644 index 99fa928..0000000 --- a/_posts/2020/2020-05-18-decimo-quarto-encontro-grupy-blumenau.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -layout: post -title: "14º Encontro do GruPy Blumenau online" -description: "14º Encontro da Comunidade Python de Blumenau" -author: pythonbnu -categories: [ encontros ] -image: /assets/images/encontros/2020/05/encontro-14-grupy-blumenau.png ---- - -No dia 27 de Maio tivemos mais um meetup da comunidade GruPy Blumenau! O encontro rolou online por conta da covid-19. - -Agenda: - -- SmartCity - Um novo mundo - - Palestrante: [Diego Neves](https://www.linkedin.com/in/diego-neves-508b76a/) - -- Vim/NeoVim - - Palestrante: [Jônatas Luiz de Oliveira](https://www.linkedin.com/in/jonatasoliveirame/) - - -

Veja como foi:

- - - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcaPython \ No newline at end of file diff --git a/_posts/2020/2020-06-12-decimo-quinto-encontro-grupy-blumenau.md b/_posts/2020/2020-06-12-decimo-quinto-encontro-grupy-blumenau.md deleted file mode 100644 index 96fbac9..0000000 --- a/_posts/2020/2020-06-12-decimo-quinto-encontro-grupy-blumenau.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -layout: post -title: "15º Encontro do GruPy Blumenau online" -description: "15º Encontro da Comunidade Python de Blumenau" -author: pythonbnu -categories: [ encontros ] -image: /assets/images/encontros/2020/06/encontro-15-grupy-blumenau.png ---- - -No dia 24 de Junho tivemos mais um meetup da comunidade GruPy Blumenau! O encontro rolou online por conta da covid-19. - -Agenda: - -- Kubernetes como código Python usando CDK8S - - Palestrante: [Jonathan Schweder](https://www.linkedin.com/in/jaswdr/) - -

Veja como foi:

- - - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcaPython \ No newline at end of file diff --git a/_posts/2020/2020-07-20-decimo-sexto-encontro-grupy-blumenau.md b/_posts/2020/2020-07-20-decimo-sexto-encontro-grupy-blumenau.md deleted file mode 100644 index 4f9abed..0000000 --- a/_posts/2020/2020-07-20-decimo-sexto-encontro-grupy-blumenau.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -layout: post -title: "16º Encontro do GruPy Blumenau online" -description: "16º Encontro da Comunidade Python de Blumenau" -author: pythonbnu -categories: [ encontros ] -image: /assets/images/encontros/2020/07/encontro-16-grupy-blumenau.png ---- - -No dia 29 de Julho tivemos mais um meetup da comunidade GruPy Blumenau! O encontro rolou online por conta da covid-19. - -Agenda: - -- Observability - praquê server isso - Palestrante: Diego Neves / https://www.linkedin.com/in/diego-neves-508b76a/ - -

Veja como foi:

- - - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcaPython \ No newline at end of file diff --git a/_posts/2020/2020-08-15-decimo-setimo-encontro-grupy-blumenau.md b/_posts/2020/2020-08-15-decimo-setimo-encontro-grupy-blumenau.md deleted file mode 100644 index 9197616..0000000 --- a/_posts/2020/2020-08-15-decimo-setimo-encontro-grupy-blumenau.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -layout: post -title: "17º Encontro do GruPy Blumenau online" -description: "17º Encontro da Comunidade Python de Blumenau" -author: pythonbnu -categories: [ encontros ] -image: /assets/images/encontros/2020/08/encontro-17-grupy-blumenau-v2.png ---- - -No dia 27/08/2020 teremos mais um meetup da comunidade GruPy Blumenau! Nosso encontro será online por conta da pandemia. Live no YouTube do Hackerspace Blumenau: https://youtu.be/Py4SqoDr_PE - -Faça a sua inscrição pelo meetup no link https://www.meetup.com/hackerspaceblumenau/events/272745434/ - -Agenda: - -- Ensino Remoto Emergencial de Python -Palestrante: [Fernando Masanori](https://www.linkedin.com/in/fmasanori/) - -

Veja como foi:

- - - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcaPython \ No newline at end of file diff --git a/_posts/2020/2020-08-31-decimo-oitavo-encontro-grupy-blumenau.md b/_posts/2020/2020-08-31-decimo-oitavo-encontro-grupy-blumenau.md deleted file mode 100644 index 5ae2ab4..0000000 --- a/_posts/2020/2020-08-31-decimo-oitavo-encontro-grupy-blumenau.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -layout: post -title: "18º Encontro do GruPy Blumenau online" -description: "18º Encontro da Comunidade Python de Blumenau" -author: pythonbnu -categories: [ encontros ] -image: /assets/images/encontros/2020/09/grupy-18-encontro.png ---- - -No dia 30/09/2020 teremos mais um meetup da comunidade GruPy Blumenau! Nosso encontro será online por conta da pandemia. Live no YouTube do Hackerspace Blumenau: https://youtu.be/Py4SqoDr_PE - -Submeta sua proposta de palestra até dia 15/09/2020 pelo [speakerfight](https://speakerfight.com/events/18o-encontro-do-grupy-blumenau-online/) ou faça a sua inscrição pelo meetup no link https://www.meetup.com/hackerspaceblumenau/events/272959941/ - -Agenda: - -- Palestra: Interface gráfica para seu script Python com Gtk e o Glade (45min) com Michael De Mattos Ortiz ( https://www.linkedin.com/in/michael-de-mattos-ortiz-57690a17a/ ) - -

Veja como foi:

- - - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcaPython \ No newline at end of file diff --git a/_posts/2020/2020-10-28-decimo-nono-encontro-grupy-blumenau.md b/_posts/2020/2020-10-28-decimo-nono-encontro-grupy-blumenau.md deleted file mode 100644 index e3d457b..0000000 --- a/_posts/2020/2020-10-28-decimo-nono-encontro-grupy-blumenau.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -layout: post -title: "19º Encontro do GruPy Blumenau online" -description: "19º Encontro da Comunidade Python de Blumenau" -author: pythonbnu -categories: [ encontros ] -image: /assets/images/encontros/2020/10/grupy-19-encontro.png ---- - -No dia 28/10/2020 rolou mais um meetup da comunidade GruPy Blumenau! O encontro foi online por conta da pandemia. Live no YouTube do Hackerspace Blumenau: https://youtu.be/TE75KM39GTg - - -Agenda: - -- Palestra: Elasticsearch como máquina de busca & Python (45min) com Raffael Tancman (https://www.linkedin.com/in/rtancman/​) - -

Veja como foi:

- - - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcaPython diff --git a/_posts/2020/2020-11-28-vigesimo-encontro-grupy-blumenau.md b/_posts/2020/2020-11-28-vigesimo-encontro-grupy-blumenau.md deleted file mode 100644 index e908113..0000000 --- a/_posts/2020/2020-11-28-vigesimo-encontro-grupy-blumenau.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -layout: post -title: "20º Encontro do GruPy Blumenau online" -description: "20º Encontro da Comunidade Python de Blumenau" -author: pythonbnu -categories: [ encontros ] -image: /assets/images/encontros/2020/11/grupy-20-encontro.png ---- - -Em novembro teremos mais um meetup da comunidade GruPy Blumenau! Nosso encontro será online por conta da pandemia. Live no YouTube do Hackerspace Blumenau: https://youtu.be/Py4SqoDr_PE - -Submeta sua proposta de palestra até dia 20/11/2020 pelo speakerfight. - -Agenda: - -- Palestra 1 (45min) -- Palestra 2 (45min) -- Lightning talk 1 (5min) -- Lightning talk 2 (5min) - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcaPython diff --git a/_posts/2021/2021-02-27-vigesimo-primeiro-encontro-grupy-blumenau.md b/_posts/2021/2021-02-27-vigesimo-primeiro-encontro-grupy-blumenau.md deleted file mode 100644 index 1df78f2..0000000 --- a/_posts/2021/2021-02-27-vigesimo-primeiro-encontro-grupy-blumenau.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -layout: post -title: "21º Encontro do GruPy Blumenau online" -description: "21º Encontro da Comunidade Python de Blumenau" -author: pythonbnu -categories: [ encontros ] -image: /assets/images/encontros/2021/02/grupy-21-encontro.png ---- - -Em fevereiro rolou mais um meetup da comunidade GruPy Blumenau! Nosso encontro será online por conta da pandemia. Live no YouTube do Hackerspace Blumenau: https://youtu.be/Py4SqoDr_PE - -Agenda: - -- Palestra: Data Vis (45min) com Júlio César Batista ( https://www.linkedin.com/in/juliobatista/ ) - -

Veja como foi:

- - - - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcaPython diff --git a/_posts/2021/2021-02-27-vigesimo-segundo-grupy-blumenau.md b/_posts/2021/2021-02-27-vigesimo-segundo-grupy-blumenau.md deleted file mode 100644 index 5733c95..0000000 --- a/_posts/2021/2021-02-27-vigesimo-segundo-grupy-blumenau.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -layout: post -title: "22º Encontro do GruPy Blumenau online" -description: "22º Encontro da Comunidade Python de Blumenau" -author: pythonbnu -categories: [ encontros ] -image: /assets/images/encontros/2021/03/grupy-22-encontro.png ---- - -No dia 25 de Março de 2021 teremos mais um meetup da comunidade GruPy Blumenau! Nosso encontro será online por conta da pandemia. A ideia desse encontro é organizar palestras de +/- 45 minutos e ter um espaço para mais duas palestras curtas de +/- 15 minutos. Por favor, mencione a duração da sua palestra ao enviar a proposta. - -Submeta sua proposta de palestra até dia 25/03/2020 pelo speakerfight [https://speakerfight.com/events/22o-encontro-do-grupy-blumenau-online/](https://speakerfight.com/events/22o-encontro-do-grupy-blumenau-online/) - -Compartilhe o seu conhecimento conosco! - - -Agenda: - -- Palestra 1 (45min) -- Palestra 2 (45min) -- Lightning talk 1 (5min) -- Lightning talk 2 (5min) - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcaPython diff --git a/_posts/2022/2022-11-27-vigesimo-setimo-grupy-blumenau copy.md b/_posts/2022/2022-11-27-vigesimo-setimo-grupy-blumenau copy.md deleted file mode 100644 index 4f32b27..0000000 --- a/_posts/2022/2022-11-27-vigesimo-setimo-grupy-blumenau copy.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -layout: post -title: "27º Encontro do GruPy Blumenau Presencial" -description: "27º Encontro da Comunidade Python de Blumenau" -author: pythonbnu -categories: [ encontros ] -image: /assets/images/encontros/2022/11/grupy-27-encontro.jpg ---- - -O grande momento chegou! Após algum tempo sem encontros presenciais devido à pandemia, no dia 3 de dezembro de 2022, teremos o nosso primeiro encontro presencial! Será o 27º da comunidade de Blumenau. - -A intenção desse encontro é reunir os desenvolvedores da região para discutir assuntos relacionados à tecnologia e Python. Teremos uma palestra de +/- 45 minutos e um espaço para mais duas palestras curtas de +/- 5 minutos. - - -Compartilhe o seu conhecimento conosco! - -**Local:** - -FURB Campus 1, Bloco S, Sala s410 - -**Horário:** - -9h30 AM - - -**Agenda:** - -- Palestra 1 (45min) -- Lightning talk 1 (5min) -- Lightning talk 2 (5min) - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcaPython diff --git a/_posts/2022/2022-12-14-fotos-vigesimo-setimo-grupy-blumenau.md b/_posts/2022/2022-12-14-fotos-vigesimo-setimo-grupy-blumenau.md deleted file mode 100644 index 5d5caf8..0000000 --- a/_posts/2022/2022-12-14-fotos-vigesimo-setimo-grupy-blumenau.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -layout: post -title: "Fotos do 27º Encontro do GruPy Blumenau Presencial" -description: "Veja as fotos do 27º Encontro da Comunidade Python de Blumenau" -author: pythonbnu -categories: [ encontros ] -image: /assets/images/encontros/2022/12/27-encontro-grupyblumenau-galera-1.jpeg ---- - -Veja aqui as fotos do nosso encontro que aconteceu dia 03/12/2022. - -Participantes do 27º Econtro do Grupy - -Foto do Workshop prático para iniciantes na linguagem Python - - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcaPython diff --git a/_posts/2023/2023-01-11-vigesimo-oitavo-grupy-blumenau.md b/_posts/2023/2023-01-11-vigesimo-oitavo-grupy-blumenau.md deleted file mode 100644 index 1af1567..0000000 --- a/_posts/2023/2023-01-11-vigesimo-oitavo-grupy-blumenau.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -layout: post -title: "28º Encontro do GruPy Blumenau Presencial" -description: "28º Encontro da Comunidade Python de Blumenau" -author: pythonbnu -categories: [ encontros ] -image: /assets/images/encontros/2023/01/grupy-28-encontro.jpg ---- - -Feliz ano novo!!! E para iniciar os trabalhos no dia 25 de Janeiro, teremos o nosso primeiro encontro presencial de 2023! Será o 28º da comunidade de Blumenau. - -A intenção desse encontro é reunir os desenvolvedores da região para discutir assuntos relacionados à tecnologia e Python. Teremos uma palestra de +/- 45 minutos e um espaço para mais duas palestras curtas de +/- 5 minutos. Compartilhe o seu conhecimento conosco! - -**Submeta a sua palestra pelo Google Forms no link** - -https://forms.gle/s1MEhQcHSBMb38Jc8 - -**Local:** - -FURB Campus 1, Bloco S, Sala s410 - -**Dia e Horário:** - -25/01/2023 às 18h30 - - -**Agenda:** - -- Palestra 1 (45min) -- Palestra 2 (45min) -- Lightning talk 1 (5min) -- Lightning talk 2 (5min) - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcaPython diff --git a/_posts/2023/2023-03-01-vigesimo-nono-grupy-blumenau.md b/_posts/2023/2023-03-01-vigesimo-nono-grupy-blumenau.md deleted file mode 100644 index cafb104..0000000 --- a/_posts/2023/2023-03-01-vigesimo-nono-grupy-blumenau.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -layout: post -title: "29º Encontro do GruPy Blumenau Presencial" -description: "29º Encontro da Comunidade Python de Blumenau" -author: pythonbnu -categories: [ encontros ] -image: /assets/images/encontros/2023/03/grupy-29-encontro.png ---- - -No dia 01 de Março, teremos o nosso segundo encontro presencial de 2023! Será o 29º \o/ - -A intenção desse encontro é reunir os desenvolvedores da região para discutir assuntos relacionados à tecnologia e Python. Teremos uma palestra de +/- 45 minutos e um espaço para mais duas palestras curtas de +/- 5 minutos. Compartilhe o seu conhecimento conosco! - -**Agenda:** - -- Extração de dados de monolito para microsserviços (45min) - - Palestrante: Guionardo Furlan - - Descrição: Palestra apresentada na Python Sul 2022, sobre a estratégia de extração de dados de um monolito COBOL. - - Categoria: python, microsserviços, integração. - - Dificuldade: Intermediário - -**Local:** FURB Campus 1, Bloco S, Sala s410 - -**Dia e Horário:** 01/03/2023 às 18h30 - -**Inscrições:** https://www.meetup.com/hackerspaceblumenau/events/291816342/ - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcaPython \ No newline at end of file diff --git a/_posts/2023/2023-05-20-trigesimo-grupy-blumenau.md b/_posts/2023/2023-05-20-trigesimo-grupy-blumenau.md deleted file mode 100644 index 949c0a1..0000000 --- a/_posts/2023/2023-05-20-trigesimo-grupy-blumenau.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -layout: post -title: "30º Encontro do GruPy Blumenau Presencial" -description: "30º Encontro da Comunidade Python de Blumenau" -author: pythonbnu -categories: [ encontros ] -image: /assets/images/encontros/2023/05/grupy-30-encontro.png -featured: true -hidden: true ---- - -No dia 20 de Maio teremos o nosso terceiro encontro presencial de 2023! Será o 30º \o/ - -**Agenda:** - -- Worshop (2hs) - - Tema: "Django mão na massa: Como fazer um serviço para oficina do meu cunhado" - - Descrição: Vamos fazer um mão na massa passando pela instalação, CRUD e customização do django admin. Para isto vamos - - construir uma aplicação que gerencia ordem de serviço de uma oficina. - -Organizadores: -- João Paulo Carvalho -- Raffael Tancman - -**Local:** FURB Campus 1, Bloco S, Sala s410 - -**Dia e Horário:** 01/03/2023 às 18h30 - -**Inscrições:** https://www.meetup.com/hackerspaceblumenau/events/293578460/ - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcaPython \ No newline at end of file diff --git a/_posts/2023/2023-05-26-trigesimo-primeiro-grupy-blumenau.md b/_posts/2023/2023-05-26-trigesimo-primeiro-grupy-blumenau.md deleted file mode 100644 index 3f50ce0..0000000 --- a/_posts/2023/2023-05-26-trigesimo-primeiro-grupy-blumenau.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -layout: post -title: "31º Encontro do GruPy Blumenau Presencial" -description: "31º Encontro da Comunidade Python de Blumenau" -author: pythonbnu -categories: [ encontros ] -image: /assets/images/encontros/2023/05/grupy-31-encontro.png -featured: true -hidden: true ---- - -No dia 17 de Junho teremos o nosso quarto encontro presencial de 2023! Será o 31º \o/ - -Submeta aqui a sua palestra para o encontro acessando link https://github.com/pythonbnu/meetups/issues/3 . - -**Local:** FURB Campus 1, Bloco S, Sala s410 - -**Dia e Horário:** 01/03/2023 às 18h30 - -**Inscrições:** https://www.meetup.com/hackerspaceblumenau/events/293791478/ - -Caso você queira se inteirar mais sobre a comunidade de Python, também sugerimos os seguintes links: - - - -Grande abraço! -#forcaPython \ No newline at end of file diff --git a/_sass/_syntax.scss b/_sass/_syntax.scss deleted file mode 100644 index f673b74..0000000 --- a/_sass/_syntax.scss +++ /dev/null @@ -1,64 +0,0 @@ - -.highlight { - background: #ffffff; - .c { color: #999988; font-style: italic } /* Comment */ - .err { color: #a61717; background-color: #e3d2d2 } /* Error */ - .k { font-weight: bold } /* Keyword */ - .o { font-weight: bold } /* Operator */ - .cm { color: #999988; font-style: italic } /* Comment.Multiline */ - .cp { color: #999999; font-weight: bold } /* Comment.Preproc */ - .c1 { color: #999988; font-style: italic } /* Comment.Single */ - .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ - .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ - .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */ - .ge { font-style: italic } /* Generic.Emph */ - .gr { color: #aa0000 } /* Generic.Error */ - .gh { color: #999999 } /* Generic.Heading */ - .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ - .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */ - .go { color: #888888 } /* Generic.Output */ - .gp { color: #555555 } /* Generic.Prompt */ - .gs { font-weight: bold } /* Generic.Strong */ - .gu { color: #aaaaaa } /* Generic.Subheading */ - .gt { color: #aa0000 } /* Generic.Traceback */ - .kc { font-weight: bold } /* Keyword.Constant */ - .kd { font-weight: bold } /* Keyword.Declaration */ - .kp { font-weight: bold } /* Keyword.Pseudo */ - .kr { font-weight: bold } /* Keyword.Reserved */ - .kt { color: #445588; font-weight: bold } /* Keyword.Type */ - .m { color: #009999 } /* Literal.Number */ - .s { color: #d14 } /* Literal.String */ - .na { color: #008080 } /* Name.Attribute */ - .nb { color: #0086B3 } /* Name.Builtin */ - .nc { color: #445588; font-weight: bold } /* Name.Class */ - .no { color: #008080 } /* Name.Constant */ - .ni { color: #800080 } /* Name.Entity */ - .ne { color: #990000; font-weight: bold } /* Name.Exception */ - .nf { color: #990000; font-weight: bold } /* Name.Function */ - .nn { color: #555555 } /* Name.Namespace */ - .nt { color: #000080 } /* Name.Tag */ - .nv { color: #008080 } /* Name.Variable */ - .ow { font-weight: bold } /* Operator.Word */ - .w { color: #bbbbbb } /* Text.Whitespace */ - .mf { color: #009999 } /* Literal.Number.Float */ - .mh { color: #009999 } /* Literal.Number.Hex */ - .mi { color: #009999 } /* Literal.Number.Integer */ - .mo { color: #009999 } /* Literal.Number.Oct */ - .sb { color: #d14 } /* Literal.String.Backtick */ - .sc { color: #d14 } /* Literal.String.Char */ - .sd { color: #d14 } /* Literal.String.Doc */ - .s2 { color: #d14 } /* Literal.String.Double */ - .se { color: #d14 } /* Literal.String.Escape */ - .sh { color: #d14 } /* Literal.String.Heredoc */ - .si { color: #d14 } /* Literal.String.Interpol */ - .sx { color: #d14 } /* Literal.String.Other */ - .sr { color: #009926 } /* Literal.String.Regex */ - .s1 { color: #d14 } /* Literal.String.Single */ - .ss { color: #990073 } /* Literal.String.Symbol */ - .bp { color: #999999 } /* Name.Builtin.Pseudo */ - .vc { color: #008080 } /* Name.Variable.Class */ - .vg { color: #008080 } /* Name.Variable.Global */ - .vi { color: #008080 } /* Name.Variable.Instance */ - .il { color: #009999 } /* Literal.Number.Integer.Long */ -} - diff --git a/_sass/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.eot b/_sass/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.eot deleted file mode 100644 index b93a495..0000000 Binary files a/_sass/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.eot and /dev/null differ diff --git a/_sass/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.svg b/_sass/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.svg deleted file mode 100644 index 94fb549..0000000 --- a/_sass/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.svg +++ /dev/null @@ -1,288 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/_sass/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.ttf b/_sass/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.ttf deleted file mode 100644 index 1413fc6..0000000 Binary files a/_sass/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.ttf and /dev/null differ diff --git a/_sass/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woff b/_sass/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woff deleted file mode 100644 index 9e61285..0000000 Binary files a/_sass/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woff and /dev/null differ diff --git a/_sass/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woff2 b/_sass/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woff2 deleted file mode 100644 index 64539b5..0000000 Binary files a/_sass/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woff2 and /dev/null differ diff --git a/_sass/bootstrap/images/.keep b/_sass/bootstrap/images/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/_sass/bootstrap/javascripts/bootstrap-sprockets.js b/_sass/bootstrap/javascripts/bootstrap-sprockets.js deleted file mode 100644 index 37468b3..0000000 --- a/_sass/bootstrap/javascripts/bootstrap-sprockets.js +++ /dev/null @@ -1,12 +0,0 @@ -//= require ./bootstrap/affix -//= require ./bootstrap/alert -//= require ./bootstrap/button -//= require ./bootstrap/carousel -//= require ./bootstrap/collapse -//= require ./bootstrap/dropdown -//= require ./bootstrap/modal -//= require ./bootstrap/scrollspy -//= require ./bootstrap/tab -//= require ./bootstrap/transition -//= require ./bootstrap/tooltip -//= require ./bootstrap/popover diff --git a/_sass/bootstrap/javascripts/bootstrap.js b/_sass/bootstrap/javascripts/bootstrap.js deleted file mode 100644 index 8066073..0000000 --- a/_sass/bootstrap/javascripts/bootstrap.js +++ /dev/null @@ -1,2408 +0,0 @@ -/*! - * Bootstrap v3.4.0 (https://getbootstrap.com/) - * Copyright 2011-2018 Twitter, Inc. - * Licensed under the MIT license - */ - -if (typeof jQuery === 'undefined') { - throw new Error('Bootstrap\'s JavaScript requires jQuery') -} - -+function ($) { - 'use strict'; - var version = $.fn.jquery.split(' ')[0].split('.') - if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) { - throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4') - } -}(jQuery); - -/* ======================================================================== - * Bootstrap: transition.js v3.4.0 - * https://getbootstrap.com/docs/3.4/javascript/#transitions - * ======================================================================== - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // CSS TRANSITION SUPPORT (Shoutout: https://modernizr.com/) - // ============================================================ - - function transitionEnd() { - var el = document.createElement('bootstrap') - - var transEndEventNames = { - WebkitTransition : 'webkitTransitionEnd', - MozTransition : 'transitionend', - OTransition : 'oTransitionEnd otransitionend', - transition : 'transitionend' - } - - for (var name in transEndEventNames) { - if (el.style[name] !== undefined) { - return { end: transEndEventNames[name] } - } - } - - return false // explicit for ie8 ( ._.) - } - - // https://blog.alexmaccaw.com/css-transitions - $.fn.emulateTransitionEnd = function (duration) { - var called = false - var $el = this - $(this).one('bsTransitionEnd', function () { called = true }) - var callback = function () { if (!called) $($el).trigger($.support.transition.end) } - setTimeout(callback, duration) - return this - } - - $(function () { - $.support.transition = transitionEnd() - - if (!$.support.transition) return - - $.event.special.bsTransitionEnd = { - bindType: $.support.transition.end, - delegateType: $.support.transition.end, - handle: function (e) { - if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) - } - } - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: alert.js v3.4.0 - * https://getbootstrap.com/docs/3.4/javascript/#alerts - * ======================================================================== - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // ALERT CLASS DEFINITION - // ====================== - - var dismiss = '[data-dismiss="alert"]' - var Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.VERSION = '3.4.0' - - Alert.TRANSITION_DURATION = 150 - - Alert.prototype.close = function (e) { - var $this = $(this) - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - selector = selector === '#' ? [] : selector - var $parent = $(document).find(selector) - - if (e) e.preventDefault() - - if (!$parent.length) { - $parent = $this.closest('.alert') - } - - $parent.trigger(e = $.Event('close.bs.alert')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - // detach from parent, fire event then clean up data - $parent.detach().trigger('closed.bs.alert').remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent - .one('bsTransitionEnd', removeElement) - .emulateTransitionEnd(Alert.TRANSITION_DURATION) : - removeElement() - } - - - // ALERT PLUGIN DEFINITION - // ======================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.alert') - - if (!data) $this.data('bs.alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - var old = $.fn.alert - - $.fn.alert = Plugin - $.fn.alert.Constructor = Alert - - - // ALERT NO CONFLICT - // ================= - - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } - - - // ALERT DATA-API - // ============== - - $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: button.js v3.4.0 - * https://getbootstrap.com/docs/3.4/javascript/#buttons - * ======================================================================== - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // BUTTON PUBLIC CLASS DEFINITION - // ============================== - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Button.DEFAULTS, options) - this.isLoading = false - } - - Button.VERSION = '3.4.0' - - Button.DEFAULTS = { - loadingText: 'loading...' - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - var $el = this.$element - var val = $el.is('input') ? 'val' : 'html' - var data = $el.data() - - state += 'Text' - - if (data.resetText == null) $el.data('resetText', $el[val]()) - - // push to event loop to allow forms to submit - setTimeout($.proxy(function () { - $el[val](data[state] == null ? this.options[state] : data[state]) - - if (state == 'loadingText') { - this.isLoading = true - $el.addClass(d).attr(d, d).prop(d, true) - } else if (this.isLoading) { - this.isLoading = false - $el.removeClass(d).removeAttr(d).prop(d, false) - } - }, this), 0) - } - - Button.prototype.toggle = function () { - var changed = true - var $parent = this.$element.closest('[data-toggle="buttons"]') - - if ($parent.length) { - var $input = this.$element.find('input') - if ($input.prop('type') == 'radio') { - if ($input.prop('checked')) changed = false - $parent.find('.active').removeClass('active') - this.$element.addClass('active') - } else if ($input.prop('type') == 'checkbox') { - if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false - this.$element.toggleClass('active') - } - $input.prop('checked', this.$element.hasClass('active')) - if (changed) $input.trigger('change') - } else { - this.$element.attr('aria-pressed', !this.$element.hasClass('active')) - this.$element.toggleClass('active') - } - } - - - // BUTTON PLUGIN DEFINITION - // ======================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.button') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.button', (data = new Button(this, options))) - - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - var old = $.fn.button - - $.fn.button = Plugin - $.fn.button.Constructor = Button - - - // BUTTON NO CONFLICT - // ================== - - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } - - - // BUTTON DATA-API - // =============== - - $(document) - .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { - var $btn = $(e.target).closest('.btn') - Plugin.call($btn, 'toggle') - if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) { - // Prevent double click on radios, and the double selections (so cancellation) on checkboxes - e.preventDefault() - // The target component still receive the focus - if ($btn.is('input,button')) $btn.trigger('focus') - else $btn.find('input:visible,button:visible').first().trigger('focus') - } - }) - .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { - $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: carousel.js v3.4.0 - * https://getbootstrap.com/docs/3.4/javascript/#carousel - * ======================================================================== - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // CAROUSEL CLASS DEFINITION - // ========================= - - var Carousel = function (element, options) { - this.$element = $(element) - this.$indicators = this.$element.find('.carousel-indicators') - this.options = options - this.paused = null - this.sliding = null - this.interval = null - this.$active = null - this.$items = null - - this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) - - this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element - .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) - .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) - } - - Carousel.VERSION = '3.4.0' - - Carousel.TRANSITION_DURATION = 600 - - Carousel.DEFAULTS = { - interval: 5000, - pause: 'hover', - wrap: true, - keyboard: true - } - - Carousel.prototype.keydown = function (e) { - if (/input|textarea/i.test(e.target.tagName)) return - switch (e.which) { - case 37: this.prev(); break - case 39: this.next(); break - default: return - } - - e.preventDefault() - } - - Carousel.prototype.cycle = function (e) { - e || (this.paused = false) - - this.interval && clearInterval(this.interval) - - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - - return this - } - - Carousel.prototype.getItemIndex = function (item) { - this.$items = item.parent().children('.item') - return this.$items.index(item || this.$active) - } - - Carousel.prototype.getItemForDirection = function (direction, active) { - var activeIndex = this.getItemIndex(active) - var willWrap = (direction == 'prev' && activeIndex === 0) - || (direction == 'next' && activeIndex == (this.$items.length - 1)) - if (willWrap && !this.options.wrap) return active - var delta = direction == 'prev' ? -1 : 1 - var itemIndex = (activeIndex + delta) % this.$items.length - return this.$items.eq(itemIndex) - } - - Carousel.prototype.to = function (pos) { - var that = this - var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) - - if (pos > (this.$items.length - 1) || pos < 0) return - - if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" - if (activeIndex == pos) return this.pause().cycle() - - return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) - } - - Carousel.prototype.pause = function (e) { - e || (this.paused = true) - - if (this.$element.find('.next, .prev').length && $.support.transition) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - - this.interval = clearInterval(this.interval) - - return this - } - - Carousel.prototype.next = function () { - if (this.sliding) return - return this.slide('next') - } - - Carousel.prototype.prev = function () { - if (this.sliding) return - return this.slide('prev') - } - - Carousel.prototype.slide = function (type, next) { - var $active = this.$element.find('.item.active') - var $next = next || this.getItemForDirection(type, $active) - var isCycling = this.interval - var direction = type == 'next' ? 'left' : 'right' - var that = this - - if ($next.hasClass('active')) return (this.sliding = false) - - var relatedTarget = $next[0] - var slideEvent = $.Event('slide.bs.carousel', { - relatedTarget: relatedTarget, - direction: direction - }) - this.$element.trigger(slideEvent) - if (slideEvent.isDefaultPrevented()) return - - this.sliding = true - - isCycling && this.pause() - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) - $nextIndicator && $nextIndicator.addClass('active') - } - - var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" - if ($.support.transition && this.$element.hasClass('slide')) { - $next.addClass(type) - if (typeof $next === 'object' && $next.length) { - $next[0].offsetWidth // force reflow - } - $active.addClass(direction) - $next.addClass(direction) - $active - .one('bsTransitionEnd', function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { - that.$element.trigger(slidEvent) - }, 0) - }) - .emulateTransitionEnd(Carousel.TRANSITION_DURATION) - } else { - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger(slidEvent) - } - - isCycling && this.cycle() - - return this - } - - - // CAROUSEL PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.carousel') - var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) - var action = typeof option == 'string' ? option : options.slide - - if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - var old = $.fn.carousel - - $.fn.carousel = Plugin - $.fn.carousel.Constructor = Carousel - - - // CAROUSEL NO CONFLICT - // ==================== - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - - // CAROUSEL DATA-API - // ================= - - var clickHandler = function (e) { - var $this = $(this) - var href = $this.attr('href') - if (href) { - href = href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 - } - - var target = $this.attr('data-target') || href - var $target = $(document).find(target) - - if (!$target.hasClass('carousel')) return - - var options = $.extend({}, $target.data(), $this.data()) - var slideIndex = $this.attr('data-slide-to') - if (slideIndex) options.interval = false - - Plugin.call($target, options) - - if (slideIndex) { - $target.data('bs.carousel').to(slideIndex) - } - - e.preventDefault() - } - - $(document) - .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) - .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) - - $(window).on('load', function () { - $('[data-ride="carousel"]').each(function () { - var $carousel = $(this) - Plugin.call($carousel, $carousel.data()) - }) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: collapse.js v3.4.0 - * https://getbootstrap.com/docs/3.4/javascript/#collapse - * ======================================================================== - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - -/* jshint latedef: false */ - -+function ($) { - 'use strict'; - - // COLLAPSE PUBLIC CLASS DEFINITION - // ================================ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Collapse.DEFAULTS, options) - this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + - '[data-toggle="collapse"][data-target="#' + element.id + '"]') - this.transitioning = null - - if (this.options.parent) { - this.$parent = this.getParent() - } else { - this.addAriaAndCollapsedClass(this.$element, this.$trigger) - } - - if (this.options.toggle) this.toggle() - } - - Collapse.VERSION = '3.4.0' - - Collapse.TRANSITION_DURATION = 350 - - Collapse.DEFAULTS = { - toggle: true - } - - Collapse.prototype.dimension = function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - Collapse.prototype.show = function () { - if (this.transitioning || this.$element.hasClass('in')) return - - var activesData - var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') - - if (actives && actives.length) { - activesData = actives.data('bs.collapse') - if (activesData && activesData.transitioning) return - } - - var startEvent = $.Event('show.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - if (actives && actives.length) { - Plugin.call(actives, 'hide') - activesData || actives.data('bs.collapse', null) - } - - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - .addClass('collapsing')[dimension](0) - .attr('aria-expanded', true) - - this.$trigger - .removeClass('collapsed') - .attr('aria-expanded', true) - - this.transitioning = 1 - - var complete = function () { - this.$element - .removeClass('collapsing') - .addClass('collapse in')[dimension]('') - this.transitioning = 0 - this.$element - .trigger('shown.bs.collapse') - } - - if (!$.support.transition) return complete.call(this) - - var scrollSize = $.camelCase(['scroll', dimension].join('-')) - - this.$element - .one('bsTransitionEnd', $.proxy(complete, this)) - .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) - } - - Collapse.prototype.hide = function () { - if (this.transitioning || !this.$element.hasClass('in')) return - - var startEvent = $.Event('hide.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var dimension = this.dimension() - - this.$element[dimension](this.$element[dimension]())[0].offsetHeight - - this.$element - .addClass('collapsing') - .removeClass('collapse in') - .attr('aria-expanded', false) - - this.$trigger - .addClass('collapsed') - .attr('aria-expanded', false) - - this.transitioning = 1 - - var complete = function () { - this.transitioning = 0 - this.$element - .removeClass('collapsing') - .addClass('collapse') - .trigger('hidden.bs.collapse') - } - - if (!$.support.transition) return complete.call(this) - - this.$element - [dimension](0) - .one('bsTransitionEnd', $.proxy(complete, this)) - .emulateTransitionEnd(Collapse.TRANSITION_DURATION) - } - - Collapse.prototype.toggle = function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - Collapse.prototype.getParent = function () { - return $(document).find(this.options.parent) - .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') - .each($.proxy(function (i, element) { - var $element = $(element) - this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) - }, this)) - .end() - } - - Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { - var isOpen = $element.hasClass('in') - - $element.attr('aria-expanded', isOpen) - $trigger - .toggleClass('collapsed', !isOpen) - .attr('aria-expanded', isOpen) - } - - function getTargetFromTrigger($trigger) { - var href - var target = $trigger.attr('data-target') - || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 - - return $(document).find(target) - } - - - // COLLAPSE PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.collapse') - var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false - if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.collapse - - $.fn.collapse = Plugin - $.fn.collapse.Constructor = Collapse - - - // COLLAPSE NO CONFLICT - // ==================== - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - // COLLAPSE DATA-API - // ================= - - $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { - var $this = $(this) - - if (!$this.attr('data-target')) e.preventDefault() - - var $target = getTargetFromTrigger($this) - var data = $target.data('bs.collapse') - var option = data ? 'toggle' : $this.data() - - Plugin.call($target, option) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: dropdown.js v3.4.0 - * https://getbootstrap.com/docs/3.4/javascript/#dropdowns - * ======================================================================== - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // DROPDOWN CLASS DEFINITION - // ========================= - - var backdrop = '.dropdown-backdrop' - var toggle = '[data-toggle="dropdown"]' - var Dropdown = function (element) { - $(element).on('click.bs.dropdown', this.toggle) - } - - Dropdown.VERSION = '3.4.0' - - function getParent($this) { - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - var $parent = selector && $(document).find(selector) - - return $parent && $parent.length ? $parent : $this.parent() - } - - function clearMenus(e) { - if (e && e.which === 3) return - $(backdrop).remove() - $(toggle).each(function () { - var $this = $(this) - var $parent = getParent($this) - var relatedTarget = { relatedTarget: this } - - if (!$parent.hasClass('open')) return - - if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return - - $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) - - if (e.isDefaultPrevented()) return - - $this.attr('aria-expanded', 'false') - $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget)) - }) - } - - Dropdown.prototype.toggle = function (e) { - var $this = $(this) - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { - // if mobile we use a backdrop because click events don't delegate - $(document.createElement('div')) - .addClass('dropdown-backdrop') - .insertAfter($(this)) - .on('click', clearMenus) - } - - var relatedTarget = { relatedTarget: this } - $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) - - if (e.isDefaultPrevented()) return - - $this - .trigger('focus') - .attr('aria-expanded', 'true') - - $parent - .toggleClass('open') - .trigger($.Event('shown.bs.dropdown', relatedTarget)) - } - - return false - } - - Dropdown.prototype.keydown = function (e) { - if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return - - var $this = $(this) - - e.preventDefault() - e.stopPropagation() - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - if (!isActive && e.which != 27 || isActive && e.which == 27) { - if (e.which == 27) $parent.find(toggle).trigger('focus') - return $this.trigger('click') - } - - var desc = ' li:not(.disabled):visible a' - var $items = $parent.find('.dropdown-menu' + desc) - - if (!$items.length) return - - var index = $items.index(e.target) - - if (e.which == 38 && index > 0) index-- // up - if (e.which == 40 && index < $items.length - 1) index++ // down - if (!~index) index = 0 - - $items.eq(index).trigger('focus') - } - - - // DROPDOWN PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.dropdown') - - if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - var old = $.fn.dropdown - - $.fn.dropdown = Plugin - $.fn.dropdown.Constructor = Dropdown - - - // DROPDOWN NO CONFLICT - // ==================== - - $.fn.dropdown.noConflict = function () { - $.fn.dropdown = old - return this - } - - - // APPLY TO STANDARD DROPDOWN ELEMENTS - // =================================== - - $(document) - .on('click.bs.dropdown.data-api', clearMenus) - .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) - .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) - .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) - .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: modal.js v3.4.0 - * https://getbootstrap.com/docs/3.4/javascript/#modals - * ======================================================================== - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // MODAL CLASS DEFINITION - // ====================== - - var Modal = function (element, options) { - this.options = options - this.$body = $(document.body) - this.$element = $(element) - this.$dialog = this.$element.find('.modal-dialog') - this.$backdrop = null - this.isShown = null - this.originalBodyPad = null - this.scrollbarWidth = 0 - this.ignoreBackdropClick = false - this.fixedContent = '.navbar-fixed-top, .navbar-fixed-bottom' - - if (this.options.remote) { - this.$element - .find('.modal-content') - .load(this.options.remote, $.proxy(function () { - this.$element.trigger('loaded.bs.modal') - }, this)) - } - } - - Modal.VERSION = '3.4.0' - - Modal.TRANSITION_DURATION = 300 - Modal.BACKDROP_TRANSITION_DURATION = 150 - - Modal.DEFAULTS = { - backdrop: true, - keyboard: true, - show: true - } - - Modal.prototype.toggle = function (_relatedTarget) { - return this.isShown ? this.hide() : this.show(_relatedTarget) - } - - Modal.prototype.show = function (_relatedTarget) { - var that = this - var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) - - this.$element.trigger(e) - - if (this.isShown || e.isDefaultPrevented()) return - - this.isShown = true - - this.checkScrollbar() - this.setScrollbar() - this.$body.addClass('modal-open') - - this.escape() - this.resize() - - this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) - - this.$dialog.on('mousedown.dismiss.bs.modal', function () { - that.$element.one('mouseup.dismiss.bs.modal', function (e) { - if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true - }) - }) - - this.backdrop(function () { - var transition = $.support.transition && that.$element.hasClass('fade') - - if (!that.$element.parent().length) { - that.$element.appendTo(that.$body) // don't move modals dom position - } - - that.$element - .show() - .scrollTop(0) - - that.adjustDialog() - - if (transition) { - that.$element[0].offsetWidth // force reflow - } - - that.$element.addClass('in') - - that.enforceFocus() - - var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) - - transition ? - that.$dialog // wait for modal to slide in - .one('bsTransitionEnd', function () { - that.$element.trigger('focus').trigger(e) - }) - .emulateTransitionEnd(Modal.TRANSITION_DURATION) : - that.$element.trigger('focus').trigger(e) - }) - } - - Modal.prototype.hide = function (e) { - if (e) e.preventDefault() - - e = $.Event('hide.bs.modal') - - this.$element.trigger(e) - - if (!this.isShown || e.isDefaultPrevented()) return - - this.isShown = false - - this.escape() - this.resize() - - $(document).off('focusin.bs.modal') - - this.$element - .removeClass('in') - .off('click.dismiss.bs.modal') - .off('mouseup.dismiss.bs.modal') - - this.$dialog.off('mousedown.dismiss.bs.modal') - - $.support.transition && this.$element.hasClass('fade') ? - this.$element - .one('bsTransitionEnd', $.proxy(this.hideModal, this)) - .emulateTransitionEnd(Modal.TRANSITION_DURATION) : - this.hideModal() - } - - Modal.prototype.enforceFocus = function () { - $(document) - .off('focusin.bs.modal') // guard against infinite focus loop - .on('focusin.bs.modal', $.proxy(function (e) { - if (document !== e.target && - this.$element[0] !== e.target && - !this.$element.has(e.target).length) { - this.$element.trigger('focus') - } - }, this)) - } - - Modal.prototype.escape = function () { - if (this.isShown && this.options.keyboard) { - this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { - e.which == 27 && this.hide() - }, this)) - } else if (!this.isShown) { - this.$element.off('keydown.dismiss.bs.modal') - } - } - - Modal.prototype.resize = function () { - if (this.isShown) { - $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) - } else { - $(window).off('resize.bs.modal') - } - } - - Modal.prototype.hideModal = function () { - var that = this - this.$element.hide() - this.backdrop(function () { - that.$body.removeClass('modal-open') - that.resetAdjustments() - that.resetScrollbar() - that.$element.trigger('hidden.bs.modal') - }) - } - - Modal.prototype.removeBackdrop = function () { - this.$backdrop && this.$backdrop.remove() - this.$backdrop = null - } - - Modal.prototype.backdrop = function (callback) { - var that = this - var animate = this.$element.hasClass('fade') ? 'fade' : '' - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate - - this.$backdrop = $(document.createElement('div')) - .addClass('modal-backdrop ' + animate) - .appendTo(this.$body) - - this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { - if (this.ignoreBackdropClick) { - this.ignoreBackdropClick = false - return - } - if (e.target !== e.currentTarget) return - this.options.backdrop == 'static' - ? this.$element[0].focus() - : this.hide() - }, this)) - - if (doAnimate) this.$backdrop[0].offsetWidth // force reflow - - this.$backdrop.addClass('in') - - if (!callback) return - - doAnimate ? - this.$backdrop - .one('bsTransitionEnd', callback) - .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : - callback() - - } else if (!this.isShown && this.$backdrop) { - this.$backdrop.removeClass('in') - - var callbackRemove = function () { - that.removeBackdrop() - callback && callback() - } - $.support.transition && this.$element.hasClass('fade') ? - this.$backdrop - .one('bsTransitionEnd', callbackRemove) - .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : - callbackRemove() - - } else if (callback) { - callback() - } - } - - // these following methods are used to handle overflowing modals - - Modal.prototype.handleUpdate = function () { - this.adjustDialog() - } - - Modal.prototype.adjustDialog = function () { - var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight - - this.$element.css({ - paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', - paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' - }) - } - - Modal.prototype.resetAdjustments = function () { - this.$element.css({ - paddingLeft: '', - paddingRight: '' - }) - } - - Modal.prototype.checkScrollbar = function () { - var fullWindowWidth = window.innerWidth - if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 - var documentElementRect = document.documentElement.getBoundingClientRect() - fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) - } - this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth - this.scrollbarWidth = this.measureScrollbar() - } - - Modal.prototype.setScrollbar = function () { - var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) - this.originalBodyPad = document.body.style.paddingRight || '' - var scrollbarWidth = this.scrollbarWidth - if (this.bodyIsOverflowing) { - this.$body.css('padding-right', bodyPad + scrollbarWidth) - $(this.fixedContent).each(function (index, element) { - var actualPadding = element.style.paddingRight - var calculatedPadding = $(element).css('padding-right') - $(element) - .data('padding-right', actualPadding) - .css('padding-right', parseFloat(calculatedPadding) + scrollbarWidth + 'px') - }) - } - } - - Modal.prototype.resetScrollbar = function () { - this.$body.css('padding-right', this.originalBodyPad) - $(this.fixedContent).each(function (index, element) { - var padding = $(element).data('padding-right') - $(element).removeData('padding-right') - element.style.paddingRight = padding ? padding : '' - }) - } - - Modal.prototype.measureScrollbar = function () { // thx walsh - var scrollDiv = document.createElement('div') - scrollDiv.className = 'modal-scrollbar-measure' - this.$body.append(scrollDiv) - var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth - this.$body[0].removeChild(scrollDiv) - return scrollbarWidth - } - - - // MODAL PLUGIN DEFINITION - // ======================= - - function Plugin(option, _relatedTarget) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.modal') - var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data) $this.data('bs.modal', (data = new Modal(this, options))) - if (typeof option == 'string') data[option](_relatedTarget) - else if (options.show) data.show(_relatedTarget) - }) - } - - var old = $.fn.modal - - $.fn.modal = Plugin - $.fn.modal.Constructor = Modal - - - // MODAL NO CONFLICT - // ================= - - $.fn.modal.noConflict = function () { - $.fn.modal = old - return this - } - - - // MODAL DATA-API - // ============== - - $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { - var $this = $(this) - var href = $this.attr('href') - var target = $this.attr('data-target') || - (href && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 - - var $target = $(document).find(target) - var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) - - if ($this.is('a')) e.preventDefault() - - $target.one('show.bs.modal', function (showEvent) { - if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown - $target.one('hidden.bs.modal', function () { - $this.is(':visible') && $this.trigger('focus') - }) - }) - Plugin.call($target, option, this) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: tooltip.js v3.4.0 - * https://getbootstrap.com/docs/3.4/javascript/#tooltip - * Inspired by the original jQuery.tipsy by Jason Frame - * ======================================================================== - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // TOOLTIP PUBLIC CLASS DEFINITION - // =============================== - - var Tooltip = function (element, options) { - this.type = null - this.options = null - this.enabled = null - this.timeout = null - this.hoverState = null - this.$element = null - this.inState = null - - this.init('tooltip', element, options) - } - - Tooltip.VERSION = '3.4.0' - - Tooltip.TRANSITION_DURATION = 150 - - Tooltip.DEFAULTS = { - animation: true, - placement: 'top', - selector: false, - template: '', - trigger: 'hover focus', - title: '', - delay: 0, - html: false, - container: false, - viewport: { - selector: 'body', - padding: 0 - } - } - - Tooltip.prototype.init = function (type, element, options) { - this.enabled = true - this.type = type - this.$element = $(element) - this.options = this.getOptions(options) - this.$viewport = this.options.viewport && $(document).find($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) - this.inState = { click: false, hover: false, focus: false } - - if (this.$element[0] instanceof document.constructor && !this.options.selector) { - throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') - } - - var triggers = this.options.trigger.split(' ') - - for (var i = triggers.length; i--;) { - var trigger = triggers[i] - - if (trigger == 'click') { - this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) - } else if (trigger != 'manual') { - var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' - var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' - - this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) - this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) - } - } - - this.options.selector ? - (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : - this.fixTitle() - } - - Tooltip.prototype.getDefaults = function () { - return Tooltip.DEFAULTS - } - - Tooltip.prototype.getOptions = function (options) { - options = $.extend({}, this.getDefaults(), this.$element.data(), options) - - if (options.delay && typeof options.delay == 'number') { - options.delay = { - show: options.delay, - hide: options.delay - } - } - - return options - } - - Tooltip.prototype.getDelegateOptions = function () { - var options = {} - var defaults = this.getDefaults() - - this._options && $.each(this._options, function (key, value) { - if (defaults[key] != value) options[key] = value - }) - - return options - } - - Tooltip.prototype.enter = function (obj) { - var self = obj instanceof this.constructor ? - obj : $(obj.currentTarget).data('bs.' + this.type) - - if (!self) { - self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) - $(obj.currentTarget).data('bs.' + this.type, self) - } - - if (obj instanceof $.Event) { - self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true - } - - if (self.tip().hasClass('in') || self.hoverState == 'in') { - self.hoverState = 'in' - return - } - - clearTimeout(self.timeout) - - self.hoverState = 'in' - - if (!self.options.delay || !self.options.delay.show) return self.show() - - self.timeout = setTimeout(function () { - if (self.hoverState == 'in') self.show() - }, self.options.delay.show) - } - - Tooltip.prototype.isInStateTrue = function () { - for (var key in this.inState) { - if (this.inState[key]) return true - } - - return false - } - - Tooltip.prototype.leave = function (obj) { - var self = obj instanceof this.constructor ? - obj : $(obj.currentTarget).data('bs.' + this.type) - - if (!self) { - self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) - $(obj.currentTarget).data('bs.' + this.type, self) - } - - if (obj instanceof $.Event) { - self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false - } - - if (self.isInStateTrue()) return - - clearTimeout(self.timeout) - - self.hoverState = 'out' - - if (!self.options.delay || !self.options.delay.hide) return self.hide() - - self.timeout = setTimeout(function () { - if (self.hoverState == 'out') self.hide() - }, self.options.delay.hide) - } - - Tooltip.prototype.show = function () { - var e = $.Event('show.bs.' + this.type) - - if (this.hasContent() && this.enabled) { - this.$element.trigger(e) - - var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) - if (e.isDefaultPrevented() || !inDom) return - var that = this - - var $tip = this.tip() - - var tipId = this.getUID(this.type) - - this.setContent() - $tip.attr('id', tipId) - this.$element.attr('aria-describedby', tipId) - - if (this.options.animation) $tip.addClass('fade') - - var placement = typeof this.options.placement == 'function' ? - this.options.placement.call(this, $tip[0], this.$element[0]) : - this.options.placement - - var autoToken = /\s?auto?\s?/i - var autoPlace = autoToken.test(placement) - if (autoPlace) placement = placement.replace(autoToken, '') || 'top' - - $tip - .detach() - .css({ top: 0, left: 0, display: 'block' }) - .addClass(placement) - .data('bs.' + this.type, this) - - this.options.container ? $tip.appendTo($(document).find(this.options.container)) : $tip.insertAfter(this.$element) - this.$element.trigger('inserted.bs.' + this.type) - - var pos = this.getPosition() - var actualWidth = $tip[0].offsetWidth - var actualHeight = $tip[0].offsetHeight - - if (autoPlace) { - var orgPlacement = placement - var viewportDim = this.getPosition(this.$viewport) - - placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : - placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : - placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : - placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : - placement - - $tip - .removeClass(orgPlacement) - .addClass(placement) - } - - var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) - - this.applyPlacement(calculatedOffset, placement) - - var complete = function () { - var prevHoverState = that.hoverState - that.$element.trigger('shown.bs.' + that.type) - that.hoverState = null - - if (prevHoverState == 'out') that.leave(that) - } - - $.support.transition && this.$tip.hasClass('fade') ? - $tip - .one('bsTransitionEnd', complete) - .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : - complete() - } - } - - Tooltip.prototype.applyPlacement = function (offset, placement) { - var $tip = this.tip() - var width = $tip[0].offsetWidth - var height = $tip[0].offsetHeight - - // manually read margins because getBoundingClientRect includes difference - var marginTop = parseInt($tip.css('margin-top'), 10) - var marginLeft = parseInt($tip.css('margin-left'), 10) - - // we must check for NaN for ie 8/9 - if (isNaN(marginTop)) marginTop = 0 - if (isNaN(marginLeft)) marginLeft = 0 - - offset.top += marginTop - offset.left += marginLeft - - // $.fn.offset doesn't round pixel values - // so we use setOffset directly with our own function B-0 - $.offset.setOffset($tip[0], $.extend({ - using: function (props) { - $tip.css({ - top: Math.round(props.top), - left: Math.round(props.left) - }) - } - }, offset), 0) - - $tip.addClass('in') - - // check to see if placing tip in new offset caused the tip to resize itself - var actualWidth = $tip[0].offsetWidth - var actualHeight = $tip[0].offsetHeight - - if (placement == 'top' && actualHeight != height) { - offset.top = offset.top + height - actualHeight - } - - var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) - - if (delta.left) offset.left += delta.left - else offset.top += delta.top - - var isVertical = /top|bottom/.test(placement) - var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight - var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' - - $tip.offset(offset) - this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) - } - - Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { - this.arrow() - .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') - .css(isVertical ? 'top' : 'left', '') - } - - Tooltip.prototype.setContent = function () { - var $tip = this.tip() - var title = this.getTitle() - - $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) - $tip.removeClass('fade in top bottom left right') - } - - Tooltip.prototype.hide = function (callback) { - var that = this - var $tip = $(this.$tip) - var e = $.Event('hide.bs.' + this.type) - - function complete() { - if (that.hoverState != 'in') $tip.detach() - if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary. - that.$element - .removeAttr('aria-describedby') - .trigger('hidden.bs.' + that.type) - } - callback && callback() - } - - this.$element.trigger(e) - - if (e.isDefaultPrevented()) return - - $tip.removeClass('in') - - $.support.transition && $tip.hasClass('fade') ? - $tip - .one('bsTransitionEnd', complete) - .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : - complete() - - this.hoverState = null - - return this - } - - Tooltip.prototype.fixTitle = function () { - var $e = this.$element - if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { - $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') - } - } - - Tooltip.prototype.hasContent = function () { - return this.getTitle() - } - - Tooltip.prototype.getPosition = function ($element) { - $element = $element || this.$element - - var el = $element[0] - var isBody = el.tagName == 'BODY' - - var elRect = el.getBoundingClientRect() - if (elRect.width == null) { - // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 - elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) - } - var isSvg = window.SVGElement && el instanceof window.SVGElement - // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3. - // See https://github.com/twbs/bootstrap/issues/20280 - var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset()) - var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } - var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null - - return $.extend({}, elRect, scroll, outerDims, elOffset) - } - - Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { - return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : - placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : - placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : - /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } - - } - - Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { - var delta = { top: 0, left: 0 } - if (!this.$viewport) return delta - - var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 - var viewportDimensions = this.getPosition(this.$viewport) - - if (/right|left/.test(placement)) { - var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll - var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight - if (topEdgeOffset < viewportDimensions.top) { // top overflow - delta.top = viewportDimensions.top - topEdgeOffset - } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow - delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset - } - } else { - var leftEdgeOffset = pos.left - viewportPadding - var rightEdgeOffset = pos.left + viewportPadding + actualWidth - if (leftEdgeOffset < viewportDimensions.left) { // left overflow - delta.left = viewportDimensions.left - leftEdgeOffset - } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow - delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset - } - } - - return delta - } - - Tooltip.prototype.getTitle = function () { - var title - var $e = this.$element - var o = this.options - - title = $e.attr('data-original-title') - || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) - - return title - } - - Tooltip.prototype.getUID = function (prefix) { - do prefix += ~~(Math.random() * 1000000) - while (document.getElementById(prefix)) - return prefix - } - - Tooltip.prototype.tip = function () { - if (!this.$tip) { - this.$tip = $(this.options.template) - if (this.$tip.length != 1) { - throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') - } - } - return this.$tip - } - - Tooltip.prototype.arrow = function () { - return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) - } - - Tooltip.prototype.enable = function () { - this.enabled = true - } - - Tooltip.prototype.disable = function () { - this.enabled = false - } - - Tooltip.prototype.toggleEnabled = function () { - this.enabled = !this.enabled - } - - Tooltip.prototype.toggle = function (e) { - var self = this - if (e) { - self = $(e.currentTarget).data('bs.' + this.type) - if (!self) { - self = new this.constructor(e.currentTarget, this.getDelegateOptions()) - $(e.currentTarget).data('bs.' + this.type, self) - } - } - - if (e) { - self.inState.click = !self.inState.click - if (self.isInStateTrue()) self.enter(self) - else self.leave(self) - } else { - self.tip().hasClass('in') ? self.leave(self) : self.enter(self) - } - } - - Tooltip.prototype.destroy = function () { - var that = this - clearTimeout(this.timeout) - this.hide(function () { - that.$element.off('.' + that.type).removeData('bs.' + that.type) - if (that.$tip) { - that.$tip.detach() - } - that.$tip = null - that.$arrow = null - that.$viewport = null - that.$element = null - }) - } - - - // TOOLTIP PLUGIN DEFINITION - // ========================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.tooltip') - var options = typeof option == 'object' && option - - if (!data && /destroy|hide/.test(option)) return - if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.tooltip - - $.fn.tooltip = Plugin - $.fn.tooltip.Constructor = Tooltip - - - // TOOLTIP NO CONFLICT - // =================== - - $.fn.tooltip.noConflict = function () { - $.fn.tooltip = old - return this - } - -}(jQuery); - -/* ======================================================================== - * Bootstrap: popover.js v3.4.0 - * https://getbootstrap.com/docs/3.4/javascript/#popovers - * ======================================================================== - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // POPOVER PUBLIC CLASS DEFINITION - // =============================== - - var Popover = function (element, options) { - this.init('popover', element, options) - } - - if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') - - Popover.VERSION = '3.4.0' - - Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { - placement: 'right', - trigger: 'click', - content: '', - template: '' - }) - - - // NOTE: POPOVER EXTENDS tooltip.js - // ================================ - - Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) - - Popover.prototype.constructor = Popover - - Popover.prototype.getDefaults = function () { - return Popover.DEFAULTS - } - - Popover.prototype.setContent = function () { - var $tip = this.tip() - var title = this.getTitle() - var content = this.getContent() - - $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) - $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events - this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' - ](content) - - $tip.removeClass('fade top bottom left right in') - - // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do - // this manually by checking the contents. - if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() - } - - Popover.prototype.hasContent = function () { - return this.getTitle() || this.getContent() - } - - Popover.prototype.getContent = function () { - var $e = this.$element - var o = this.options - - return $e.attr('data-content') - || (typeof o.content == 'function' ? - o.content.call($e[0]) : - o.content) - } - - Popover.prototype.arrow = function () { - return (this.$arrow = this.$arrow || this.tip().find('.arrow')) - } - - - // POPOVER PLUGIN DEFINITION - // ========================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.popover') - var options = typeof option == 'object' && option - - if (!data && /destroy|hide/.test(option)) return - if (!data) $this.data('bs.popover', (data = new Popover(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.popover - - $.fn.popover = Plugin - $.fn.popover.Constructor = Popover - - - // POPOVER NO CONFLICT - // =================== - - $.fn.popover.noConflict = function () { - $.fn.popover = old - return this - } - -}(jQuery); - -/* ======================================================================== - * Bootstrap: scrollspy.js v3.4.0 - * https://getbootstrap.com/docs/3.4/javascript/#scrollspy - * ======================================================================== - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // SCROLLSPY CLASS DEFINITION - // ========================== - - function ScrollSpy(element, options) { - this.$body = $(document.body) - this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) - this.options = $.extend({}, ScrollSpy.DEFAULTS, options) - this.selector = (this.options.target || '') + ' .nav li > a' - this.offsets = [] - this.targets = [] - this.activeTarget = null - this.scrollHeight = 0 - - this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) - this.refresh() - this.process() - } - - ScrollSpy.VERSION = '3.4.0' - - ScrollSpy.DEFAULTS = { - offset: 10 - } - - ScrollSpy.prototype.getScrollHeight = function () { - return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) - } - - ScrollSpy.prototype.refresh = function () { - var that = this - var offsetMethod = 'offset' - var offsetBase = 0 - - this.offsets = [] - this.targets = [] - this.scrollHeight = this.getScrollHeight() - - if (!$.isWindow(this.$scrollElement[0])) { - offsetMethod = 'position' - offsetBase = this.$scrollElement.scrollTop() - } - - this.$body - .find(this.selector) - .map(function () { - var $el = $(this) - var href = $el.data('target') || $el.attr('href') - var $href = /^#./.test(href) && $(href) - - return ($href - && $href.length - && $href.is(':visible') - && [[$href[offsetMethod]().top + offsetBase, href]]) || null - }) - .sort(function (a, b) { return a[0] - b[0] }) - .each(function () { - that.offsets.push(this[0]) - that.targets.push(this[1]) - }) - } - - ScrollSpy.prototype.process = function () { - var scrollTop = this.$scrollElement.scrollTop() + this.options.offset - var scrollHeight = this.getScrollHeight() - var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() - var offsets = this.offsets - var targets = this.targets - var activeTarget = this.activeTarget - var i - - if (this.scrollHeight != scrollHeight) { - this.refresh() - } - - if (scrollTop >= maxScroll) { - return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) - } - - if (activeTarget && scrollTop < offsets[0]) { - this.activeTarget = null - return this.clear() - } - - for (i = offsets.length; i--;) { - activeTarget != targets[i] - && scrollTop >= offsets[i] - && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) - && this.activate(targets[i]) - } - } - - ScrollSpy.prototype.activate = function (target) { - this.activeTarget = target - - this.clear() - - var selector = this.selector + - '[data-target="' + target + '"],' + - this.selector + '[href="' + target + '"]' - - var active = $(selector) - .parents('li') - .addClass('active') - - if (active.parent('.dropdown-menu').length) { - active = active - .closest('li.dropdown') - .addClass('active') - } - - active.trigger('activate.bs.scrollspy') - } - - ScrollSpy.prototype.clear = function () { - $(this.selector) - .parentsUntil(this.options.target, '.active') - .removeClass('active') - } - - - // SCROLLSPY PLUGIN DEFINITION - // =========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.scrollspy') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.scrollspy - - $.fn.scrollspy = Plugin - $.fn.scrollspy.Constructor = ScrollSpy - - - // SCROLLSPY NO CONFLICT - // ===================== - - $.fn.scrollspy.noConflict = function () { - $.fn.scrollspy = old - return this - } - - - // SCROLLSPY DATA-API - // ================== - - $(window).on('load.bs.scrollspy.data-api', function () { - $('[data-spy="scroll"]').each(function () { - var $spy = $(this) - Plugin.call($spy, $spy.data()) - }) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: tab.js v3.4.0 - * https://getbootstrap.com/docs/3.4/javascript/#tabs - * ======================================================================== - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // TAB CLASS DEFINITION - // ==================== - - var Tab = function (element) { - // jscs:disable requireDollarBeforejQueryAssignment - this.element = $(element) - // jscs:enable requireDollarBeforejQueryAssignment - } - - Tab.VERSION = '3.4.0' - - Tab.TRANSITION_DURATION = 150 - - Tab.prototype.show = function () { - var $this = this.element - var $ul = $this.closest('ul:not(.dropdown-menu)') - var selector = $this.data('target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - if ($this.parent('li').hasClass('active')) return - - var $previous = $ul.find('.active:last a') - var hideEvent = $.Event('hide.bs.tab', { - relatedTarget: $this[0] - }) - var showEvent = $.Event('show.bs.tab', { - relatedTarget: $previous[0] - }) - - $previous.trigger(hideEvent) - $this.trigger(showEvent) - - if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return - - var $target = $(document).find(selector) - - this.activate($this.closest('li'), $ul) - this.activate($target, $target.parent(), function () { - $previous.trigger({ - type: 'hidden.bs.tab', - relatedTarget: $this[0] - }) - $this.trigger({ - type: 'shown.bs.tab', - relatedTarget: $previous[0] - }) - }) - } - - Tab.prototype.activate = function (element, container, callback) { - var $active = container.find('> .active') - var transition = callback - && $.support.transition - && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) - - function next() { - $active - .removeClass('active') - .find('> .dropdown-menu > .active') - .removeClass('active') - .end() - .find('[data-toggle="tab"]') - .attr('aria-expanded', false) - - element - .addClass('active') - .find('[data-toggle="tab"]') - .attr('aria-expanded', true) - - if (transition) { - element[0].offsetWidth // reflow for transition - element.addClass('in') - } else { - element.removeClass('fade') - } - - if (element.parent('.dropdown-menu').length) { - element - .closest('li.dropdown') - .addClass('active') - .end() - .find('[data-toggle="tab"]') - .attr('aria-expanded', true) - } - - callback && callback() - } - - $active.length && transition ? - $active - .one('bsTransitionEnd', next) - .emulateTransitionEnd(Tab.TRANSITION_DURATION) : - next() - - $active.removeClass('in') - } - - - // TAB PLUGIN DEFINITION - // ===================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.tab') - - if (!data) $this.data('bs.tab', (data = new Tab(this))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.tab - - $.fn.tab = Plugin - $.fn.tab.Constructor = Tab - - - // TAB NO CONFLICT - // =============== - - $.fn.tab.noConflict = function () { - $.fn.tab = old - return this - } - - - // TAB DATA-API - // ============ - - var clickHandler = function (e) { - e.preventDefault() - Plugin.call($(this), 'show') - } - - $(document) - .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) - .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: affix.js v3.4.0 - * https://getbootstrap.com/docs/3.4/javascript/#affix - * ======================================================================== - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // AFFIX CLASS DEFINITION - // ====================== - - var Affix = function (element, options) { - this.options = $.extend({}, Affix.DEFAULTS, options) - - var target = this.options.target === Affix.DEFAULTS.target ? $(this.options.target) : $(document).find(this.options.target) - - this.$target = target - .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) - .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) - - this.$element = $(element) - this.affixed = null - this.unpin = null - this.pinnedOffset = null - - this.checkPosition() - } - - Affix.VERSION = '3.4.0' - - Affix.RESET = 'affix affix-top affix-bottom' - - Affix.DEFAULTS = { - offset: 0, - target: window - } - - Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { - var scrollTop = this.$target.scrollTop() - var position = this.$element.offset() - var targetHeight = this.$target.height() - - if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false - - if (this.affixed == 'bottom') { - if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' - return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' - } - - var initializing = this.affixed == null - var colliderTop = initializing ? scrollTop : position.top - var colliderHeight = initializing ? targetHeight : height - - if (offsetTop != null && scrollTop <= offsetTop) return 'top' - if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' - - return false - } - - Affix.prototype.getPinnedOffset = function () { - if (this.pinnedOffset) return this.pinnedOffset - this.$element.removeClass(Affix.RESET).addClass('affix') - var scrollTop = this.$target.scrollTop() - var position = this.$element.offset() - return (this.pinnedOffset = position.top - scrollTop) - } - - Affix.prototype.checkPositionWithEventLoop = function () { - setTimeout($.proxy(this.checkPosition, this), 1) - } - - Affix.prototype.checkPosition = function () { - if (!this.$element.is(':visible')) return - - var height = this.$element.height() - var offset = this.options.offset - var offsetTop = offset.top - var offsetBottom = offset.bottom - var scrollHeight = Math.max($(document).height(), $(document.body).height()) - - if (typeof offset != 'object') offsetBottom = offsetTop = offset - if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) - if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) - - var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) - - if (this.affixed != affix) { - if (this.unpin != null) this.$element.css('top', '') - - var affixType = 'affix' + (affix ? '-' + affix : '') - var e = $.Event(affixType + '.bs.affix') - - this.$element.trigger(e) - - if (e.isDefaultPrevented()) return - - this.affixed = affix - this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null - - this.$element - .removeClass(Affix.RESET) - .addClass(affixType) - .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') - } - - if (affix == 'bottom') { - this.$element.offset({ - top: scrollHeight - height - offsetBottom - }) - } - } - - - // AFFIX PLUGIN DEFINITION - // ======================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.affix') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.affix', (data = new Affix(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.affix - - $.fn.affix = Plugin - $.fn.affix.Constructor = Affix - - - // AFFIX NO CONFLICT - // ================= - - $.fn.affix.noConflict = function () { - $.fn.affix = old - return this - } - - - // AFFIX DATA-API - // ============== - - $(window).on('load', function () { - $('[data-spy="affix"]').each(function () { - var $spy = $(this) - var data = $spy.data() - - data.offset = data.offset || {} - - if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom - if (data.offsetTop != null) data.offset.top = data.offsetTop - - Plugin.call($spy, data) - }) - }) - -}(jQuery); diff --git a/_sass/bootstrap/javascripts/bootstrap.min.js b/_sass/bootstrap/javascripts/bootstrap.min.js deleted file mode 100644 index 4cd8219..0000000 --- a/_sass/bootstrap/javascripts/bootstrap.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap v3.4.0 (https://getbootstrap.com/) - * Copyright 2011-2018 Twitter, Inc. - * Licensed under the MIT license - */ -if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");!function(t){"use strict";var e=jQuery.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||3this.$items.length-1||t<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){e.to(t)}):i==t?this.pause().cycle():this.slide(idocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&t?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!t?this.scrollbarWidth:""})},s.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},s.prototype.checkScrollbar=function(){var t=window.innerWidth;if(!t){var e=document.documentElement.getBoundingClientRect();t=e.right-Math.abs(e.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},m.prototype.init=function(t,e,i){if(this.enabled=!0,this.type=t,this.$element=g(e),this.options=this.getOptions(i),this.$viewport=this.options.viewport&&g(document).find(g.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var o=this.options.trigger.split(" "),n=o.length;n--;){var s=o[n];if("click"==s)this.$element.on("click."+this.type,this.options.selector,g.proxy(this.toggle,this));else if("manual"!=s){var a="hover"==s?"mouseenter":"focusin",r="hover"==s?"mouseleave":"focusout";this.$element.on(a+"."+this.type,this.options.selector,g.proxy(this.enter,this)),this.$element.on(r+"."+this.type,this.options.selector,g.proxy(this.leave,this))}}this.options.selector?this._options=g.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},m.prototype.getDefaults=function(){return m.DEFAULTS},m.prototype.getOptions=function(t){return(t=g.extend({},this.getDefaults(),this.$element.data(),t)).delay&&"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),t},m.prototype.getDelegateOptions=function(){var i={},o=this.getDefaults();return this._options&&g.each(this._options,function(t,e){o[t]!=e&&(i[t]=e)}),i},m.prototype.enter=function(t){var e=t instanceof this.constructor?t:g(t.currentTarget).data("bs."+this.type);if(e||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e)),t instanceof g.Event&&(e.inState["focusin"==t.type?"focus":"hover"]=!0),e.tip().hasClass("in")||"in"==e.hoverState)e.hoverState="in";else{if(clearTimeout(e.timeout),e.hoverState="in",!e.options.delay||!e.options.delay.show)return e.show();e.timeout=setTimeout(function(){"in"==e.hoverState&&e.show()},e.options.delay.show)}},m.prototype.isInStateTrue=function(){for(var t in this.inState)if(this.inState[t])return!0;return!1},m.prototype.leave=function(t){var e=t instanceof this.constructor?t:g(t.currentTarget).data("bs."+this.type);if(e||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e)),t instanceof g.Event&&(e.inState["focusout"==t.type?"focus":"hover"]=!1),!e.isInStateTrue()){if(clearTimeout(e.timeout),e.hoverState="out",!e.options.delay||!e.options.delay.hide)return e.hide();e.timeout=setTimeout(function(){"out"==e.hoverState&&e.hide()},e.options.delay.hide)}},m.prototype.show=function(){var t=g.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(t);var e=g.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(t.isDefaultPrevented()||!e)return;var i=this,o=this.tip(),n=this.getUID(this.type);this.setContent(),o.attr("id",n),this.$element.attr("aria-describedby",n),this.options.animation&&o.addClass("fade");var s="function"==typeof this.options.placement?this.options.placement.call(this,o[0],this.$element[0]):this.options.placement,a=/\s?auto?\s?/i,r=a.test(s);r&&(s=s.replace(a,"")||"top"),o.detach().css({top:0,left:0,display:"block"}).addClass(s).data("bs."+this.type,this),this.options.container?o.appendTo(g(document).find(this.options.container)):o.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var l=this.getPosition(),h=o[0].offsetWidth,d=o[0].offsetHeight;if(r){var p=s,c=this.getPosition(this.$viewport);s="bottom"==s&&l.bottom+d>c.bottom?"top":"top"==s&&l.top-dc.width?"left":"left"==s&&l.left-ha.top+a.height&&(n.top=a.top+a.height-l)}else{var h=e.left-s,d=e.left+s+i;ha.right&&(n.left=a.left+a.width-d)}return n},m.prototype.getTitle=function(){var t=this.$element,e=this.options;return t.attr("data-original-title")||("function"==typeof e.title?e.title.call(t[0]):e.title)},m.prototype.getUID=function(t){for(;t+=~~(1e6*Math.random()),document.getElementById(t););return t},m.prototype.tip=function(){if(!this.$tip&&(this.$tip=g(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},m.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},m.prototype.enable=function(){this.enabled=!0},m.prototype.disable=function(){this.enabled=!1},m.prototype.toggleEnabled=function(){this.enabled=!this.enabled},m.prototype.toggle=function(t){var e=this;t&&((e=g(t.currentTarget).data("bs."+this.type))||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e))),t?(e.inState.click=!e.inState.click,e.isInStateTrue()?e.enter(e):e.leave(e)):e.tip().hasClass("in")?e.leave(e):e.enter(e)},m.prototype.destroy=function(){var t=this;clearTimeout(this.timeout),this.hide(function(){t.$element.off("."+t.type).removeData("bs."+t.type),t.$tip&&t.$tip.detach(),t.$tip=null,t.$arrow=null,t.$viewport=null,t.$element=null})};var t=g.fn.tooltip;g.fn.tooltip=function e(o){return this.each(function(){var t=g(this),e=t.data("bs.tooltip"),i="object"==typeof o&&o;!e&&/destroy|hide/.test(o)||(e||t.data("bs.tooltip",e=new m(this,i)),"string"==typeof o&&e[o]())})},g.fn.tooltip.Constructor=m,g.fn.tooltip.noConflict=function(){return g.fn.tooltip=t,this}}(jQuery),function(n){"use strict";var s=function(t,e){this.init("popover",t,e)};if(!n.fn.tooltip)throw new Error("Popover requires tooltip.js");s.VERSION="3.4.0",s.DEFAULTS=n.extend({},n.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),((s.prototype=n.extend({},n.fn.tooltip.Constructor.prototype)).constructor=s).prototype.getDefaults=function(){return s.DEFAULTS},s.prototype.setContent=function(){var t=this.tip(),e=this.getTitle(),i=this.getContent();t.find(".popover-title")[this.options.html?"html":"text"](e),t.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof i?"html":"append":"text"](i),t.removeClass("fade top bottom left right in"),t.find(".popover-title").html()||t.find(".popover-title").hide()},s.prototype.hasContent=function(){return this.getTitle()||this.getContent()},s.prototype.getContent=function(){var t=this.$element,e=this.options;return t.attr("data-content")||("function"==typeof e.content?e.content.call(t[0]):e.content)},s.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var t=n.fn.popover;n.fn.popover=function e(o){return this.each(function(){var t=n(this),e=t.data("bs.popover"),i="object"==typeof o&&o;!e&&/destroy|hide/.test(o)||(e||t.data("bs.popover",e=new s(this,i)),"string"==typeof o&&e[o]())})},n.fn.popover.Constructor=s,n.fn.popover.noConflict=function(){return n.fn.popover=t,this}}(jQuery),function(s){"use strict";function n(t,e){this.$body=s(document.body),this.$scrollElement=s(t).is(document.body)?s(window):s(t),this.options=s.extend({},n.DEFAULTS,e),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",s.proxy(this.process,this)),this.refresh(),this.process()}function e(o){return this.each(function(){var t=s(this),e=t.data("bs.scrollspy"),i="object"==typeof o&&o;e||t.data("bs.scrollspy",e=new n(this,i)),"string"==typeof o&&e[o]()})}n.VERSION="3.4.0",n.DEFAULTS={offset:10},n.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},n.prototype.refresh=function(){var t=this,o="offset",n=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),s.isWindow(this.$scrollElement[0])||(o="position",n=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var t=s(this),e=t.data("target")||t.attr("href"),i=/^#./.test(e)&&s(e);return i&&i.length&&i.is(":visible")&&[[i[o]().top+n,e]]||null}).sort(function(t,e){return t[0]-e[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},n.prototype.process=function(){var t,e=this.$scrollElement.scrollTop()+this.options.offset,i=this.getScrollHeight(),o=this.options.offset+i-this.$scrollElement.height(),n=this.offsets,s=this.targets,a=this.activeTarget;if(this.scrollHeight!=i&&this.refresh(),o<=e)return a!=(t=s[s.length-1])&&this.activate(t);if(a&&e=n[t]&&(n[t+1]===undefined||e .active"),n=i&&r.support.transition&&(o.length&&o.hasClass("fade")||!!e.find("> .fade").length);function s(){o.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),t.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),n?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu").length&&t.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),i&&i()}o.length&&n?o.one("bsTransitionEnd",s).emulateTransitionEnd(a.TRANSITION_DURATION):s(),o.removeClass("in")};var t=r.fn.tab;r.fn.tab=e,r.fn.tab.Constructor=a,r.fn.tab.noConflict=function(){return r.fn.tab=t,this};var i=function(t){t.preventDefault(),e.call(r(this),"show")};r(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',i).on("click.bs.tab.data-api",'[data-toggle="pill"]',i)}(jQuery),function(l){"use strict";var h=function(t,e){this.options=l.extend({},h.DEFAULTS,e);var i=this.options.target===h.DEFAULTS.target?l(this.options.target):l(document).find(this.options.target);this.$target=i.on("scroll.bs.affix.data-api",l.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",l.proxy(this.checkPositionWithEventLoop,this)),this.$element=l(t),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};function i(o){return this.each(function(){var t=l(this),e=t.data("bs.affix"),i="object"==typeof o&&o;e||t.data("bs.affix",e=new h(this,i)),"string"==typeof o&&e[o]()})}h.VERSION="3.4.0",h.RESET="affix affix-top affix-bottom",h.DEFAULTS={offset:0,target:window},h.prototype.getState=function(t,e,i,o){var n=this.$target.scrollTop(),s=this.$element.offset(),a=this.$target.height();if(null!=i&&"top"==this.affixed)return n= scrollHeight - offsetBottom)) return 'bottom' - - return false - } - - Affix.prototype.getPinnedOffset = function () { - if (this.pinnedOffset) return this.pinnedOffset - this.$element.removeClass(Affix.RESET).addClass('affix') - var scrollTop = this.$target.scrollTop() - var position = this.$element.offset() - return (this.pinnedOffset = position.top - scrollTop) - } - - Affix.prototype.checkPositionWithEventLoop = function () { - setTimeout($.proxy(this.checkPosition, this), 1) - } - - Affix.prototype.checkPosition = function () { - if (!this.$element.is(':visible')) return - - var height = this.$element.height() - var offset = this.options.offset - var offsetTop = offset.top - var offsetBottom = offset.bottom - var scrollHeight = Math.max($(document).height(), $(document.body).height()) - - if (typeof offset != 'object') offsetBottom = offsetTop = offset - if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) - if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) - - var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) - - if (this.affixed != affix) { - if (this.unpin != null) this.$element.css('top', '') - - var affixType = 'affix' + (affix ? '-' + affix : '') - var e = $.Event(affixType + '.bs.affix') - - this.$element.trigger(e) - - if (e.isDefaultPrevented()) return - - this.affixed = affix - this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null - - this.$element - .removeClass(Affix.RESET) - .addClass(affixType) - .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') - } - - if (affix == 'bottom') { - this.$element.offset({ - top: scrollHeight - height - offsetBottom - }) - } - } - - - // AFFIX PLUGIN DEFINITION - // ======================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.affix') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.affix', (data = new Affix(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.affix - - $.fn.affix = Plugin - $.fn.affix.Constructor = Affix - - - // AFFIX NO CONFLICT - // ================= - - $.fn.affix.noConflict = function () { - $.fn.affix = old - return this - } - - - // AFFIX DATA-API - // ============== - - $(window).on('load', function () { - $('[data-spy="affix"]').each(function () { - var $spy = $(this) - var data = $spy.data() - - data.offset = data.offset || {} - - if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom - if (data.offsetTop != null) data.offset.top = data.offsetTop - - Plugin.call($spy, data) - }) - }) - -}(jQuery); diff --git a/_sass/bootstrap/javascripts/bootstrap/alert.js b/_sass/bootstrap/javascripts/bootstrap/alert.js deleted file mode 100644 index 362b7b5..0000000 --- a/_sass/bootstrap/javascripts/bootstrap/alert.js +++ /dev/null @@ -1,95 +0,0 @@ -/* ======================================================================== - * Bootstrap: alert.js v3.4.0 - * https://getbootstrap.com/docs/3.4/javascript/#alerts - * ======================================================================== - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // ALERT CLASS DEFINITION - // ====================== - - var dismiss = '[data-dismiss="alert"]' - var Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.VERSION = '3.4.0' - - Alert.TRANSITION_DURATION = 150 - - Alert.prototype.close = function (e) { - var $this = $(this) - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - selector = selector === '#' ? [] : selector - var $parent = $(document).find(selector) - - if (e) e.preventDefault() - - if (!$parent.length) { - $parent = $this.closest('.alert') - } - - $parent.trigger(e = $.Event('close.bs.alert')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - // detach from parent, fire event then clean up data - $parent.detach().trigger('closed.bs.alert').remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent - .one('bsTransitionEnd', removeElement) - .emulateTransitionEnd(Alert.TRANSITION_DURATION) : - removeElement() - } - - - // ALERT PLUGIN DEFINITION - // ======================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.alert') - - if (!data) $this.data('bs.alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - var old = $.fn.alert - - $.fn.alert = Plugin - $.fn.alert.Constructor = Alert - - - // ALERT NO CONFLICT - // ================= - - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } - - - // ALERT DATA-API - // ============== - - $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) - -}(jQuery); diff --git a/_sass/bootstrap/javascripts/bootstrap/button.js b/_sass/bootstrap/javascripts/bootstrap/button.js deleted file mode 100644 index 8fdf9dd..0000000 --- a/_sass/bootstrap/javascripts/bootstrap/button.js +++ /dev/null @@ -1,125 +0,0 @@ -/* ======================================================================== - * Bootstrap: button.js v3.4.0 - * https://getbootstrap.com/docs/3.4/javascript/#buttons - * ======================================================================== - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // BUTTON PUBLIC CLASS DEFINITION - // ============================== - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Button.DEFAULTS, options) - this.isLoading = false - } - - Button.VERSION = '3.4.0' - - Button.DEFAULTS = { - loadingText: 'loading...' - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - var $el = this.$element - var val = $el.is('input') ? 'val' : 'html' - var data = $el.data() - - state += 'Text' - - if (data.resetText == null) $el.data('resetText', $el[val]()) - - // push to event loop to allow forms to submit - setTimeout($.proxy(function () { - $el[val](data[state] == null ? this.options[state] : data[state]) - - if (state == 'loadingText') { - this.isLoading = true - $el.addClass(d).attr(d, d).prop(d, true) - } else if (this.isLoading) { - this.isLoading = false - $el.removeClass(d).removeAttr(d).prop(d, false) - } - }, this), 0) - } - - Button.prototype.toggle = function () { - var changed = true - var $parent = this.$element.closest('[data-toggle="buttons"]') - - if ($parent.length) { - var $input = this.$element.find('input') - if ($input.prop('type') == 'radio') { - if ($input.prop('checked')) changed = false - $parent.find('.active').removeClass('active') - this.$element.addClass('active') - } else if ($input.prop('type') == 'checkbox') { - if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false - this.$element.toggleClass('active') - } - $input.prop('checked', this.$element.hasClass('active')) - if (changed) $input.trigger('change') - } else { - this.$element.attr('aria-pressed', !this.$element.hasClass('active')) - this.$element.toggleClass('active') - } - } - - - // BUTTON PLUGIN DEFINITION - // ======================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.button') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.button', (data = new Button(this, options))) - - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - var old = $.fn.button - - $.fn.button = Plugin - $.fn.button.Constructor = Button - - - // BUTTON NO CONFLICT - // ================== - - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } - - - // BUTTON DATA-API - // =============== - - $(document) - .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { - var $btn = $(e.target).closest('.btn') - Plugin.call($btn, 'toggle') - if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) { - // Prevent double click on radios, and the double selections (so cancellation) on checkboxes - e.preventDefault() - // The target component still receive the focus - if ($btn.is('input,button')) $btn.trigger('focus') - else $btn.find('input:visible,button:visible').first().trigger('focus') - } - }) - .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { - $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) - }) - -}(jQuery); diff --git a/_sass/bootstrap/javascripts/bootstrap/carousel.js b/_sass/bootstrap/javascripts/bootstrap/carousel.js deleted file mode 100644 index 020648c..0000000 --- a/_sass/bootstrap/javascripts/bootstrap/carousel.js +++ /dev/null @@ -1,246 +0,0 @@ -/* ======================================================================== - * Bootstrap: carousel.js v3.4.0 - * https://getbootstrap.com/docs/3.4/javascript/#carousel - * ======================================================================== - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // CAROUSEL CLASS DEFINITION - // ========================= - - var Carousel = function (element, options) { - this.$element = $(element) - this.$indicators = this.$element.find('.carousel-indicators') - this.options = options - this.paused = null - this.sliding = null - this.interval = null - this.$active = null - this.$items = null - - this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) - - this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element - .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) - .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) - } - - Carousel.VERSION = '3.4.0' - - Carousel.TRANSITION_DURATION = 600 - - Carousel.DEFAULTS = { - interval: 5000, - pause: 'hover', - wrap: true, - keyboard: true - } - - Carousel.prototype.keydown = function (e) { - if (/input|textarea/i.test(e.target.tagName)) return - switch (e.which) { - case 37: this.prev(); break - case 39: this.next(); break - default: return - } - - e.preventDefault() - } - - Carousel.prototype.cycle = function (e) { - e || (this.paused = false) - - this.interval && clearInterval(this.interval) - - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - - return this - } - - Carousel.prototype.getItemIndex = function (item) { - this.$items = item.parent().children('.item') - return this.$items.index(item || this.$active) - } - - Carousel.prototype.getItemForDirection = function (direction, active) { - var activeIndex = this.getItemIndex(active) - var willWrap = (direction == 'prev' && activeIndex === 0) - || (direction == 'next' && activeIndex == (this.$items.length - 1)) - if (willWrap && !this.options.wrap) return active - var delta = direction == 'prev' ? -1 : 1 - var itemIndex = (activeIndex + delta) % this.$items.length - return this.$items.eq(itemIndex) - } - - Carousel.prototype.to = function (pos) { - var that = this - var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) - - if (pos > (this.$items.length - 1) || pos < 0) return - - if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" - if (activeIndex == pos) return this.pause().cycle() - - return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) - } - - Carousel.prototype.pause = function (e) { - e || (this.paused = true) - - if (this.$element.find('.next, .prev').length && $.support.transition) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - - this.interval = clearInterval(this.interval) - - return this - } - - Carousel.prototype.next = function () { - if (this.sliding) return - return this.slide('next') - } - - Carousel.prototype.prev = function () { - if (this.sliding) return - return this.slide('prev') - } - - Carousel.prototype.slide = function (type, next) { - var $active = this.$element.find('.item.active') - var $next = next || this.getItemForDirection(type, $active) - var isCycling = this.interval - var direction = type == 'next' ? 'left' : 'right' - var that = this - - if ($next.hasClass('active')) return (this.sliding = false) - - var relatedTarget = $next[0] - var slideEvent = $.Event('slide.bs.carousel', { - relatedTarget: relatedTarget, - direction: direction - }) - this.$element.trigger(slideEvent) - if (slideEvent.isDefaultPrevented()) return - - this.sliding = true - - isCycling && this.pause() - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) - $nextIndicator && $nextIndicator.addClass('active') - } - - var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" - if ($.support.transition && this.$element.hasClass('slide')) { - $next.addClass(type) - if (typeof $next === 'object' && $next.length) { - $next[0].offsetWidth // force reflow - } - $active.addClass(direction) - $next.addClass(direction) - $active - .one('bsTransitionEnd', function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { - that.$element.trigger(slidEvent) - }, 0) - }) - .emulateTransitionEnd(Carousel.TRANSITION_DURATION) - } else { - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger(slidEvent) - } - - isCycling && this.cycle() - - return this - } - - - // CAROUSEL PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.carousel') - var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) - var action = typeof option == 'string' ? option : options.slide - - if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - var old = $.fn.carousel - - $.fn.carousel = Plugin - $.fn.carousel.Constructor = Carousel - - - // CAROUSEL NO CONFLICT - // ==================== - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - - // CAROUSEL DATA-API - // ================= - - var clickHandler = function (e) { - var $this = $(this) - var href = $this.attr('href') - if (href) { - href = href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 - } - - var target = $this.attr('data-target') || href - var $target = $(document).find(target) - - if (!$target.hasClass('carousel')) return - - var options = $.extend({}, $target.data(), $this.data()) - var slideIndex = $this.attr('data-slide-to') - if (slideIndex) options.interval = false - - Plugin.call($target, options) - - if (slideIndex) { - $target.data('bs.carousel').to(slideIndex) - } - - e.preventDefault() - } - - $(document) - .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) - .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) - - $(window).on('load', function () { - $('[data-ride="carousel"]').each(function () { - var $carousel = $(this) - Plugin.call($carousel, $carousel.data()) - }) - }) - -}(jQuery); diff --git a/_sass/bootstrap/javascripts/bootstrap/collapse.js b/_sass/bootstrap/javascripts/bootstrap/collapse.js deleted file mode 100644 index d87eee5..0000000 --- a/_sass/bootstrap/javascripts/bootstrap/collapse.js +++ /dev/null @@ -1,212 +0,0 @@ -/* ======================================================================== - * Bootstrap: collapse.js v3.4.0 - * https://getbootstrap.com/docs/3.4/javascript/#collapse - * ======================================================================== - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - -/* jshint latedef: false */ - -+function ($) { - 'use strict'; - - // COLLAPSE PUBLIC CLASS DEFINITION - // ================================ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Collapse.DEFAULTS, options) - this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + - '[data-toggle="collapse"][data-target="#' + element.id + '"]') - this.transitioning = null - - if (this.options.parent) { - this.$parent = this.getParent() - } else { - this.addAriaAndCollapsedClass(this.$element, this.$trigger) - } - - if (this.options.toggle) this.toggle() - } - - Collapse.VERSION = '3.4.0' - - Collapse.TRANSITION_DURATION = 350 - - Collapse.DEFAULTS = { - toggle: true - } - - Collapse.prototype.dimension = function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - Collapse.prototype.show = function () { - if (this.transitioning || this.$element.hasClass('in')) return - - var activesData - var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') - - if (actives && actives.length) { - activesData = actives.data('bs.collapse') - if (activesData && activesData.transitioning) return - } - - var startEvent = $.Event('show.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - if (actives && actives.length) { - Plugin.call(actives, 'hide') - activesData || actives.data('bs.collapse', null) - } - - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - .addClass('collapsing')[dimension](0) - .attr('aria-expanded', true) - - this.$trigger - .removeClass('collapsed') - .attr('aria-expanded', true) - - this.transitioning = 1 - - var complete = function () { - this.$element - .removeClass('collapsing') - .addClass('collapse in')[dimension]('') - this.transitioning = 0 - this.$element - .trigger('shown.bs.collapse') - } - - if (!$.support.transition) return complete.call(this) - - var scrollSize = $.camelCase(['scroll', dimension].join('-')) - - this.$element - .one('bsTransitionEnd', $.proxy(complete, this)) - .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) - } - - Collapse.prototype.hide = function () { - if (this.transitioning || !this.$element.hasClass('in')) return - - var startEvent = $.Event('hide.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var dimension = this.dimension() - - this.$element[dimension](this.$element[dimension]())[0].offsetHeight - - this.$element - .addClass('collapsing') - .removeClass('collapse in') - .attr('aria-expanded', false) - - this.$trigger - .addClass('collapsed') - .attr('aria-expanded', false) - - this.transitioning = 1 - - var complete = function () { - this.transitioning = 0 - this.$element - .removeClass('collapsing') - .addClass('collapse') - .trigger('hidden.bs.collapse') - } - - if (!$.support.transition) return complete.call(this) - - this.$element - [dimension](0) - .one('bsTransitionEnd', $.proxy(complete, this)) - .emulateTransitionEnd(Collapse.TRANSITION_DURATION) - } - - Collapse.prototype.toggle = function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - Collapse.prototype.getParent = function () { - return $(document).find(this.options.parent) - .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') - .each($.proxy(function (i, element) { - var $element = $(element) - this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) - }, this)) - .end() - } - - Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { - var isOpen = $element.hasClass('in') - - $element.attr('aria-expanded', isOpen) - $trigger - .toggleClass('collapsed', !isOpen) - .attr('aria-expanded', isOpen) - } - - function getTargetFromTrigger($trigger) { - var href - var target = $trigger.attr('data-target') - || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 - - return $(document).find(target) - } - - - // COLLAPSE PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.collapse') - var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false - if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.collapse - - $.fn.collapse = Plugin - $.fn.collapse.Constructor = Collapse - - - // COLLAPSE NO CONFLICT - // ==================== - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - // COLLAPSE DATA-API - // ================= - - $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { - var $this = $(this) - - if (!$this.attr('data-target')) e.preventDefault() - - var $target = getTargetFromTrigger($this) - var data = $target.data('bs.collapse') - var option = data ? 'toggle' : $this.data() - - Plugin.call($target, option) - }) - -}(jQuery); diff --git a/_sass/bootstrap/javascripts/bootstrap/dropdown.js b/_sass/bootstrap/javascripts/bootstrap/dropdown.js deleted file mode 100644 index 481e04f..0000000 --- a/_sass/bootstrap/javascripts/bootstrap/dropdown.js +++ /dev/null @@ -1,165 +0,0 @@ -/* ======================================================================== - * Bootstrap: dropdown.js v3.4.0 - * https://getbootstrap.com/docs/3.4/javascript/#dropdowns - * ======================================================================== - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // DROPDOWN CLASS DEFINITION - // ========================= - - var backdrop = '.dropdown-backdrop' - var toggle = '[data-toggle="dropdown"]' - var Dropdown = function (element) { - $(element).on('click.bs.dropdown', this.toggle) - } - - Dropdown.VERSION = '3.4.0' - - function getParent($this) { - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - var $parent = selector && $(document).find(selector) - - return $parent && $parent.length ? $parent : $this.parent() - } - - function clearMenus(e) { - if (e && e.which === 3) return - $(backdrop).remove() - $(toggle).each(function () { - var $this = $(this) - var $parent = getParent($this) - var relatedTarget = { relatedTarget: this } - - if (!$parent.hasClass('open')) return - - if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return - - $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) - - if (e.isDefaultPrevented()) return - - $this.attr('aria-expanded', 'false') - $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget)) - }) - } - - Dropdown.prototype.toggle = function (e) { - var $this = $(this) - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { - // if mobile we use a backdrop because click events don't delegate - $(document.createElement('div')) - .addClass('dropdown-backdrop') - .insertAfter($(this)) - .on('click', clearMenus) - } - - var relatedTarget = { relatedTarget: this } - $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) - - if (e.isDefaultPrevented()) return - - $this - .trigger('focus') - .attr('aria-expanded', 'true') - - $parent - .toggleClass('open') - .trigger($.Event('shown.bs.dropdown', relatedTarget)) - } - - return false - } - - Dropdown.prototype.keydown = function (e) { - if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return - - var $this = $(this) - - e.preventDefault() - e.stopPropagation() - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - if (!isActive && e.which != 27 || isActive && e.which == 27) { - if (e.which == 27) $parent.find(toggle).trigger('focus') - return $this.trigger('click') - } - - var desc = ' li:not(.disabled):visible a' - var $items = $parent.find('.dropdown-menu' + desc) - - if (!$items.length) return - - var index = $items.index(e.target) - - if (e.which == 38 && index > 0) index-- // up - if (e.which == 40 && index < $items.length - 1) index++ // down - if (!~index) index = 0 - - $items.eq(index).trigger('focus') - } - - - // DROPDOWN PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.dropdown') - - if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - var old = $.fn.dropdown - - $.fn.dropdown = Plugin - $.fn.dropdown.Constructor = Dropdown - - - // DROPDOWN NO CONFLICT - // ==================== - - $.fn.dropdown.noConflict = function () { - $.fn.dropdown = old - return this - } - - - // APPLY TO STANDARD DROPDOWN ELEMENTS - // =================================== - - $(document) - .on('click.bs.dropdown.data-api', clearMenus) - .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) - .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) - .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) - .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) - -}(jQuery); diff --git a/_sass/bootstrap/javascripts/bootstrap/modal.js b/_sass/bootstrap/javascripts/bootstrap/modal.js deleted file mode 100644 index 9fbce5d..0000000 --- a/_sass/bootstrap/javascripts/bootstrap/modal.js +++ /dev/null @@ -1,358 +0,0 @@ -/* ======================================================================== - * Bootstrap: modal.js v3.4.0 - * https://getbootstrap.com/docs/3.4/javascript/#modals - * ======================================================================== - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // MODAL CLASS DEFINITION - // ====================== - - var Modal = function (element, options) { - this.options = options - this.$body = $(document.body) - this.$element = $(element) - this.$dialog = this.$element.find('.modal-dialog') - this.$backdrop = null - this.isShown = null - this.originalBodyPad = null - this.scrollbarWidth = 0 - this.ignoreBackdropClick = false - this.fixedContent = '.navbar-fixed-top, .navbar-fixed-bottom' - - if (this.options.remote) { - this.$element - .find('.modal-content') - .load(this.options.remote, $.proxy(function () { - this.$element.trigger('loaded.bs.modal') - }, this)) - } - } - - Modal.VERSION = '3.4.0' - - Modal.TRANSITION_DURATION = 300 - Modal.BACKDROP_TRANSITION_DURATION = 150 - - Modal.DEFAULTS = { - backdrop: true, - keyboard: true, - show: true - } - - Modal.prototype.toggle = function (_relatedTarget) { - return this.isShown ? this.hide() : this.show(_relatedTarget) - } - - Modal.prototype.show = function (_relatedTarget) { - var that = this - var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) - - this.$element.trigger(e) - - if (this.isShown || e.isDefaultPrevented()) return - - this.isShown = true - - this.checkScrollbar() - this.setScrollbar() - this.$body.addClass('modal-open') - - this.escape() - this.resize() - - this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) - - this.$dialog.on('mousedown.dismiss.bs.modal', function () { - that.$element.one('mouseup.dismiss.bs.modal', function (e) { - if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true - }) - }) - - this.backdrop(function () { - var transition = $.support.transition && that.$element.hasClass('fade') - - if (!that.$element.parent().length) { - that.$element.appendTo(that.$body) // don't move modals dom position - } - - that.$element - .show() - .scrollTop(0) - - that.adjustDialog() - - if (transition) { - that.$element[0].offsetWidth // force reflow - } - - that.$element.addClass('in') - - that.enforceFocus() - - var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) - - transition ? - that.$dialog // wait for modal to slide in - .one('bsTransitionEnd', function () { - that.$element.trigger('focus').trigger(e) - }) - .emulateTransitionEnd(Modal.TRANSITION_DURATION) : - that.$element.trigger('focus').trigger(e) - }) - } - - Modal.prototype.hide = function (e) { - if (e) e.preventDefault() - - e = $.Event('hide.bs.modal') - - this.$element.trigger(e) - - if (!this.isShown || e.isDefaultPrevented()) return - - this.isShown = false - - this.escape() - this.resize() - - $(document).off('focusin.bs.modal') - - this.$element - .removeClass('in') - .off('click.dismiss.bs.modal') - .off('mouseup.dismiss.bs.modal') - - this.$dialog.off('mousedown.dismiss.bs.modal') - - $.support.transition && this.$element.hasClass('fade') ? - this.$element - .one('bsTransitionEnd', $.proxy(this.hideModal, this)) - .emulateTransitionEnd(Modal.TRANSITION_DURATION) : - this.hideModal() - } - - Modal.prototype.enforceFocus = function () { - $(document) - .off('focusin.bs.modal') // guard against infinite focus loop - .on('focusin.bs.modal', $.proxy(function (e) { - if (document !== e.target && - this.$element[0] !== e.target && - !this.$element.has(e.target).length) { - this.$element.trigger('focus') - } - }, this)) - } - - Modal.prototype.escape = function () { - if (this.isShown && this.options.keyboard) { - this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { - e.which == 27 && this.hide() - }, this)) - } else if (!this.isShown) { - this.$element.off('keydown.dismiss.bs.modal') - } - } - - Modal.prototype.resize = function () { - if (this.isShown) { - $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) - } else { - $(window).off('resize.bs.modal') - } - } - - Modal.prototype.hideModal = function () { - var that = this - this.$element.hide() - this.backdrop(function () { - that.$body.removeClass('modal-open') - that.resetAdjustments() - that.resetScrollbar() - that.$element.trigger('hidden.bs.modal') - }) - } - - Modal.prototype.removeBackdrop = function () { - this.$backdrop && this.$backdrop.remove() - this.$backdrop = null - } - - Modal.prototype.backdrop = function (callback) { - var that = this - var animate = this.$element.hasClass('fade') ? 'fade' : '' - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate - - this.$backdrop = $(document.createElement('div')) - .addClass('modal-backdrop ' + animate) - .appendTo(this.$body) - - this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { - if (this.ignoreBackdropClick) { - this.ignoreBackdropClick = false - return - } - if (e.target !== e.currentTarget) return - this.options.backdrop == 'static' - ? this.$element[0].focus() - : this.hide() - }, this)) - - if (doAnimate) this.$backdrop[0].offsetWidth // force reflow - - this.$backdrop.addClass('in') - - if (!callback) return - - doAnimate ? - this.$backdrop - .one('bsTransitionEnd', callback) - .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : - callback() - - } else if (!this.isShown && this.$backdrop) { - this.$backdrop.removeClass('in') - - var callbackRemove = function () { - that.removeBackdrop() - callback && callback() - } - $.support.transition && this.$element.hasClass('fade') ? - this.$backdrop - .one('bsTransitionEnd', callbackRemove) - .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : - callbackRemove() - - } else if (callback) { - callback() - } - } - - // these following methods are used to handle overflowing modals - - Modal.prototype.handleUpdate = function () { - this.adjustDialog() - } - - Modal.prototype.adjustDialog = function () { - var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight - - this.$element.css({ - paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', - paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' - }) - } - - Modal.prototype.resetAdjustments = function () { - this.$element.css({ - paddingLeft: '', - paddingRight: '' - }) - } - - Modal.prototype.checkScrollbar = function () { - var fullWindowWidth = window.innerWidth - if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 - var documentElementRect = document.documentElement.getBoundingClientRect() - fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) - } - this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth - this.scrollbarWidth = this.measureScrollbar() - } - - Modal.prototype.setScrollbar = function () { - var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) - this.originalBodyPad = document.body.style.paddingRight || '' - var scrollbarWidth = this.scrollbarWidth - if (this.bodyIsOverflowing) { - this.$body.css('padding-right', bodyPad + scrollbarWidth) - $(this.fixedContent).each(function (index, element) { - var actualPadding = element.style.paddingRight - var calculatedPadding = $(element).css('padding-right') - $(element) - .data('padding-right', actualPadding) - .css('padding-right', parseFloat(calculatedPadding) + scrollbarWidth + 'px') - }) - } - } - - Modal.prototype.resetScrollbar = function () { - this.$body.css('padding-right', this.originalBodyPad) - $(this.fixedContent).each(function (index, element) { - var padding = $(element).data('padding-right') - $(element).removeData('padding-right') - element.style.paddingRight = padding ? padding : '' - }) - } - - Modal.prototype.measureScrollbar = function () { // thx walsh - var scrollDiv = document.createElement('div') - scrollDiv.className = 'modal-scrollbar-measure' - this.$body.append(scrollDiv) - var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth - this.$body[0].removeChild(scrollDiv) - return scrollbarWidth - } - - - // MODAL PLUGIN DEFINITION - // ======================= - - function Plugin(option, _relatedTarget) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.modal') - var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data) $this.data('bs.modal', (data = new Modal(this, options))) - if (typeof option == 'string') data[option](_relatedTarget) - else if (options.show) data.show(_relatedTarget) - }) - } - - var old = $.fn.modal - - $.fn.modal = Plugin - $.fn.modal.Constructor = Modal - - - // MODAL NO CONFLICT - // ================= - - $.fn.modal.noConflict = function () { - $.fn.modal = old - return this - } - - - // MODAL DATA-API - // ============== - - $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { - var $this = $(this) - var href = $this.attr('href') - var target = $this.attr('data-target') || - (href && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 - - var $target = $(document).find(target) - var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) - - if ($this.is('a')) e.preventDefault() - - $target.one('show.bs.modal', function (showEvent) { - if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown - $target.one('hidden.bs.modal', function () { - $this.is(':visible') && $this.trigger('focus') - }) - }) - Plugin.call($target, option, this) - }) - -}(jQuery); diff --git a/_sass/bootstrap/javascripts/bootstrap/popover.js b/_sass/bootstrap/javascripts/bootstrap/popover.js deleted file mode 100644 index f72c32a..0000000 --- a/_sass/bootstrap/javascripts/bootstrap/popover.js +++ /dev/null @@ -1,108 +0,0 @@ -/* ======================================================================== - * Bootstrap: popover.js v3.4.0 - * https://getbootstrap.com/docs/3.4/javascript/#popovers - * ======================================================================== - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // POPOVER PUBLIC CLASS DEFINITION - // =============================== - - var Popover = function (element, options) { - this.init('popover', element, options) - } - - if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') - - Popover.VERSION = '3.4.0' - - Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { - placement: 'right', - trigger: 'click', - content: '', - template: '' - }) - - - // NOTE: POPOVER EXTENDS tooltip.js - // ================================ - - Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) - - Popover.prototype.constructor = Popover - - Popover.prototype.getDefaults = function () { - return Popover.DEFAULTS - } - - Popover.prototype.setContent = function () { - var $tip = this.tip() - var title = this.getTitle() - var content = this.getContent() - - $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) - $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events - this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' - ](content) - - $tip.removeClass('fade top bottom left right in') - - // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do - // this manually by checking the contents. - if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() - } - - Popover.prototype.hasContent = function () { - return this.getTitle() || this.getContent() - } - - Popover.prototype.getContent = function () { - var $e = this.$element - var o = this.options - - return $e.attr('data-content') - || (typeof o.content == 'function' ? - o.content.call($e[0]) : - o.content) - } - - Popover.prototype.arrow = function () { - return (this.$arrow = this.$arrow || this.tip().find('.arrow')) - } - - - // POPOVER PLUGIN DEFINITION - // ========================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.popover') - var options = typeof option == 'object' && option - - if (!data && /destroy|hide/.test(option)) return - if (!data) $this.data('bs.popover', (data = new Popover(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.popover - - $.fn.popover = Plugin - $.fn.popover.Constructor = Popover - - - // POPOVER NO CONFLICT - // =================== - - $.fn.popover.noConflict = function () { - $.fn.popover = old - return this - } - -}(jQuery); diff --git a/_sass/bootstrap/javascripts/bootstrap/scrollspy.js b/_sass/bootstrap/javascripts/bootstrap/scrollspy.js deleted file mode 100644 index 487a9fa..0000000 --- a/_sass/bootstrap/javascripts/bootstrap/scrollspy.js +++ /dev/null @@ -1,172 +0,0 @@ -/* ======================================================================== - * Bootstrap: scrollspy.js v3.4.0 - * https://getbootstrap.com/docs/3.4/javascript/#scrollspy - * ======================================================================== - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // SCROLLSPY CLASS DEFINITION - // ========================== - - function ScrollSpy(element, options) { - this.$body = $(document.body) - this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) - this.options = $.extend({}, ScrollSpy.DEFAULTS, options) - this.selector = (this.options.target || '') + ' .nav li > a' - this.offsets = [] - this.targets = [] - this.activeTarget = null - this.scrollHeight = 0 - - this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) - this.refresh() - this.process() - } - - ScrollSpy.VERSION = '3.4.0' - - ScrollSpy.DEFAULTS = { - offset: 10 - } - - ScrollSpy.prototype.getScrollHeight = function () { - return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) - } - - ScrollSpy.prototype.refresh = function () { - var that = this - var offsetMethod = 'offset' - var offsetBase = 0 - - this.offsets = [] - this.targets = [] - this.scrollHeight = this.getScrollHeight() - - if (!$.isWindow(this.$scrollElement[0])) { - offsetMethod = 'position' - offsetBase = this.$scrollElement.scrollTop() - } - - this.$body - .find(this.selector) - .map(function () { - var $el = $(this) - var href = $el.data('target') || $el.attr('href') - var $href = /^#./.test(href) && $(href) - - return ($href - && $href.length - && $href.is(':visible') - && [[$href[offsetMethod]().top + offsetBase, href]]) || null - }) - .sort(function (a, b) { return a[0] - b[0] }) - .each(function () { - that.offsets.push(this[0]) - that.targets.push(this[1]) - }) - } - - ScrollSpy.prototype.process = function () { - var scrollTop = this.$scrollElement.scrollTop() + this.options.offset - var scrollHeight = this.getScrollHeight() - var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() - var offsets = this.offsets - var targets = this.targets - var activeTarget = this.activeTarget - var i - - if (this.scrollHeight != scrollHeight) { - this.refresh() - } - - if (scrollTop >= maxScroll) { - return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) - } - - if (activeTarget && scrollTop < offsets[0]) { - this.activeTarget = null - return this.clear() - } - - for (i = offsets.length; i--;) { - activeTarget != targets[i] - && scrollTop >= offsets[i] - && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) - && this.activate(targets[i]) - } - } - - ScrollSpy.prototype.activate = function (target) { - this.activeTarget = target - - this.clear() - - var selector = this.selector + - '[data-target="' + target + '"],' + - this.selector + '[href="' + target + '"]' - - var active = $(selector) - .parents('li') - .addClass('active') - - if (active.parent('.dropdown-menu').length) { - active = active - .closest('li.dropdown') - .addClass('active') - } - - active.trigger('activate.bs.scrollspy') - } - - ScrollSpy.prototype.clear = function () { - $(this.selector) - .parentsUntil(this.options.target, '.active') - .removeClass('active') - } - - - // SCROLLSPY PLUGIN DEFINITION - // =========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.scrollspy') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.scrollspy - - $.fn.scrollspy = Plugin - $.fn.scrollspy.Constructor = ScrollSpy - - - // SCROLLSPY NO CONFLICT - // ===================== - - $.fn.scrollspy.noConflict = function () { - $.fn.scrollspy = old - return this - } - - - // SCROLLSPY DATA-API - // ================== - - $(window).on('load.bs.scrollspy.data-api', function () { - $('[data-spy="scroll"]').each(function () { - var $spy = $(this) - Plugin.call($spy, $spy.data()) - }) - }) - -}(jQuery); diff --git a/_sass/bootstrap/javascripts/bootstrap/tab.js b/_sass/bootstrap/javascripts/bootstrap/tab.js deleted file mode 100644 index 79511fc..0000000 --- a/_sass/bootstrap/javascripts/bootstrap/tab.js +++ /dev/null @@ -1,155 +0,0 @@ -/* ======================================================================== - * Bootstrap: tab.js v3.4.0 - * https://getbootstrap.com/docs/3.4/javascript/#tabs - * ======================================================================== - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // TAB CLASS DEFINITION - // ==================== - - var Tab = function (element) { - // jscs:disable requireDollarBeforejQueryAssignment - this.element = $(element) - // jscs:enable requireDollarBeforejQueryAssignment - } - - Tab.VERSION = '3.4.0' - - Tab.TRANSITION_DURATION = 150 - - Tab.prototype.show = function () { - var $this = this.element - var $ul = $this.closest('ul:not(.dropdown-menu)') - var selector = $this.data('target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - if ($this.parent('li').hasClass('active')) return - - var $previous = $ul.find('.active:last a') - var hideEvent = $.Event('hide.bs.tab', { - relatedTarget: $this[0] - }) - var showEvent = $.Event('show.bs.tab', { - relatedTarget: $previous[0] - }) - - $previous.trigger(hideEvent) - $this.trigger(showEvent) - - if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return - - var $target = $(document).find(selector) - - this.activate($this.closest('li'), $ul) - this.activate($target, $target.parent(), function () { - $previous.trigger({ - type: 'hidden.bs.tab', - relatedTarget: $this[0] - }) - $this.trigger({ - type: 'shown.bs.tab', - relatedTarget: $previous[0] - }) - }) - } - - Tab.prototype.activate = function (element, container, callback) { - var $active = container.find('> .active') - var transition = callback - && $.support.transition - && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) - - function next() { - $active - .removeClass('active') - .find('> .dropdown-menu > .active') - .removeClass('active') - .end() - .find('[data-toggle="tab"]') - .attr('aria-expanded', false) - - element - .addClass('active') - .find('[data-toggle="tab"]') - .attr('aria-expanded', true) - - if (transition) { - element[0].offsetWidth // reflow for transition - element.addClass('in') - } else { - element.removeClass('fade') - } - - if (element.parent('.dropdown-menu').length) { - element - .closest('li.dropdown') - .addClass('active') - .end() - .find('[data-toggle="tab"]') - .attr('aria-expanded', true) - } - - callback && callback() - } - - $active.length && transition ? - $active - .one('bsTransitionEnd', next) - .emulateTransitionEnd(Tab.TRANSITION_DURATION) : - next() - - $active.removeClass('in') - } - - - // TAB PLUGIN DEFINITION - // ===================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.tab') - - if (!data) $this.data('bs.tab', (data = new Tab(this))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.tab - - $.fn.tab = Plugin - $.fn.tab.Constructor = Tab - - - // TAB NO CONFLICT - // =============== - - $.fn.tab.noConflict = function () { - $.fn.tab = old - return this - } - - - // TAB DATA-API - // ============ - - var clickHandler = function (e) { - e.preventDefault() - Plugin.call($(this), 'show') - } - - $(document) - .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) - .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) - -}(jQuery); diff --git a/_sass/bootstrap/javascripts/bootstrap/tooltip.js b/_sass/bootstrap/javascripts/bootstrap/tooltip.js deleted file mode 100644 index 223ec0c..0000000 --- a/_sass/bootstrap/javascripts/bootstrap/tooltip.js +++ /dev/null @@ -1,520 +0,0 @@ -/* ======================================================================== - * Bootstrap: tooltip.js v3.4.0 - * https://getbootstrap.com/docs/3.4/javascript/#tooltip - * Inspired by the original jQuery.tipsy by Jason Frame - * ======================================================================== - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // TOOLTIP PUBLIC CLASS DEFINITION - // =============================== - - var Tooltip = function (element, options) { - this.type = null - this.options = null - this.enabled = null - this.timeout = null - this.hoverState = null - this.$element = null - this.inState = null - - this.init('tooltip', element, options) - } - - Tooltip.VERSION = '3.4.0' - - Tooltip.TRANSITION_DURATION = 150 - - Tooltip.DEFAULTS = { - animation: true, - placement: 'top', - selector: false, - template: '', - trigger: 'hover focus', - title: '', - delay: 0, - html: false, - container: false, - viewport: { - selector: 'body', - padding: 0 - } - } - - Tooltip.prototype.init = function (type, element, options) { - this.enabled = true - this.type = type - this.$element = $(element) - this.options = this.getOptions(options) - this.$viewport = this.options.viewport && $(document).find($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) - this.inState = { click: false, hover: false, focus: false } - - if (this.$element[0] instanceof document.constructor && !this.options.selector) { - throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') - } - - var triggers = this.options.trigger.split(' ') - - for (var i = triggers.length; i--;) { - var trigger = triggers[i] - - if (trigger == 'click') { - this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) - } else if (trigger != 'manual') { - var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' - var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' - - this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) - this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) - } - } - - this.options.selector ? - (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : - this.fixTitle() - } - - Tooltip.prototype.getDefaults = function () { - return Tooltip.DEFAULTS - } - - Tooltip.prototype.getOptions = function (options) { - options = $.extend({}, this.getDefaults(), this.$element.data(), options) - - if (options.delay && typeof options.delay == 'number') { - options.delay = { - show: options.delay, - hide: options.delay - } - } - - return options - } - - Tooltip.prototype.getDelegateOptions = function () { - var options = {} - var defaults = this.getDefaults() - - this._options && $.each(this._options, function (key, value) { - if (defaults[key] != value) options[key] = value - }) - - return options - } - - Tooltip.prototype.enter = function (obj) { - var self = obj instanceof this.constructor ? - obj : $(obj.currentTarget).data('bs.' + this.type) - - if (!self) { - self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) - $(obj.currentTarget).data('bs.' + this.type, self) - } - - if (obj instanceof $.Event) { - self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true - } - - if (self.tip().hasClass('in') || self.hoverState == 'in') { - self.hoverState = 'in' - return - } - - clearTimeout(self.timeout) - - self.hoverState = 'in' - - if (!self.options.delay || !self.options.delay.show) return self.show() - - self.timeout = setTimeout(function () { - if (self.hoverState == 'in') self.show() - }, self.options.delay.show) - } - - Tooltip.prototype.isInStateTrue = function () { - for (var key in this.inState) { - if (this.inState[key]) return true - } - - return false - } - - Tooltip.prototype.leave = function (obj) { - var self = obj instanceof this.constructor ? - obj : $(obj.currentTarget).data('bs.' + this.type) - - if (!self) { - self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) - $(obj.currentTarget).data('bs.' + this.type, self) - } - - if (obj instanceof $.Event) { - self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false - } - - if (self.isInStateTrue()) return - - clearTimeout(self.timeout) - - self.hoverState = 'out' - - if (!self.options.delay || !self.options.delay.hide) return self.hide() - - self.timeout = setTimeout(function () { - if (self.hoverState == 'out') self.hide() - }, self.options.delay.hide) - } - - Tooltip.prototype.show = function () { - var e = $.Event('show.bs.' + this.type) - - if (this.hasContent() && this.enabled) { - this.$element.trigger(e) - - var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) - if (e.isDefaultPrevented() || !inDom) return - var that = this - - var $tip = this.tip() - - var tipId = this.getUID(this.type) - - this.setContent() - $tip.attr('id', tipId) - this.$element.attr('aria-describedby', tipId) - - if (this.options.animation) $tip.addClass('fade') - - var placement = typeof this.options.placement == 'function' ? - this.options.placement.call(this, $tip[0], this.$element[0]) : - this.options.placement - - var autoToken = /\s?auto?\s?/i - var autoPlace = autoToken.test(placement) - if (autoPlace) placement = placement.replace(autoToken, '') || 'top' - - $tip - .detach() - .css({ top: 0, left: 0, display: 'block' }) - .addClass(placement) - .data('bs.' + this.type, this) - - this.options.container ? $tip.appendTo($(document).find(this.options.container)) : $tip.insertAfter(this.$element) - this.$element.trigger('inserted.bs.' + this.type) - - var pos = this.getPosition() - var actualWidth = $tip[0].offsetWidth - var actualHeight = $tip[0].offsetHeight - - if (autoPlace) { - var orgPlacement = placement - var viewportDim = this.getPosition(this.$viewport) - - placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : - placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : - placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : - placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : - placement - - $tip - .removeClass(orgPlacement) - .addClass(placement) - } - - var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) - - this.applyPlacement(calculatedOffset, placement) - - var complete = function () { - var prevHoverState = that.hoverState - that.$element.trigger('shown.bs.' + that.type) - that.hoverState = null - - if (prevHoverState == 'out') that.leave(that) - } - - $.support.transition && this.$tip.hasClass('fade') ? - $tip - .one('bsTransitionEnd', complete) - .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : - complete() - } - } - - Tooltip.prototype.applyPlacement = function (offset, placement) { - var $tip = this.tip() - var width = $tip[0].offsetWidth - var height = $tip[0].offsetHeight - - // manually read margins because getBoundingClientRect includes difference - var marginTop = parseInt($tip.css('margin-top'), 10) - var marginLeft = parseInt($tip.css('margin-left'), 10) - - // we must check for NaN for ie 8/9 - if (isNaN(marginTop)) marginTop = 0 - if (isNaN(marginLeft)) marginLeft = 0 - - offset.top += marginTop - offset.left += marginLeft - - // $.fn.offset doesn't round pixel values - // so we use setOffset directly with our own function B-0 - $.offset.setOffset($tip[0], $.extend({ - using: function (props) { - $tip.css({ - top: Math.round(props.top), - left: Math.round(props.left) - }) - } - }, offset), 0) - - $tip.addClass('in') - - // check to see if placing tip in new offset caused the tip to resize itself - var actualWidth = $tip[0].offsetWidth - var actualHeight = $tip[0].offsetHeight - - if (placement == 'top' && actualHeight != height) { - offset.top = offset.top + height - actualHeight - } - - var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) - - if (delta.left) offset.left += delta.left - else offset.top += delta.top - - var isVertical = /top|bottom/.test(placement) - var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight - var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' - - $tip.offset(offset) - this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) - } - - Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { - this.arrow() - .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') - .css(isVertical ? 'top' : 'left', '') - } - - Tooltip.prototype.setContent = function () { - var $tip = this.tip() - var title = this.getTitle() - - $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) - $tip.removeClass('fade in top bottom left right') - } - - Tooltip.prototype.hide = function (callback) { - var that = this - var $tip = $(this.$tip) - var e = $.Event('hide.bs.' + this.type) - - function complete() { - if (that.hoverState != 'in') $tip.detach() - if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary. - that.$element - .removeAttr('aria-describedby') - .trigger('hidden.bs.' + that.type) - } - callback && callback() - } - - this.$element.trigger(e) - - if (e.isDefaultPrevented()) return - - $tip.removeClass('in') - - $.support.transition && $tip.hasClass('fade') ? - $tip - .one('bsTransitionEnd', complete) - .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : - complete() - - this.hoverState = null - - return this - } - - Tooltip.prototype.fixTitle = function () { - var $e = this.$element - if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { - $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') - } - } - - Tooltip.prototype.hasContent = function () { - return this.getTitle() - } - - Tooltip.prototype.getPosition = function ($element) { - $element = $element || this.$element - - var el = $element[0] - var isBody = el.tagName == 'BODY' - - var elRect = el.getBoundingClientRect() - if (elRect.width == null) { - // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 - elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) - } - var isSvg = window.SVGElement && el instanceof window.SVGElement - // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3. - // See https://github.com/twbs/bootstrap/issues/20280 - var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset()) - var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } - var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null - - return $.extend({}, elRect, scroll, outerDims, elOffset) - } - - Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { - return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : - placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : - placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : - /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } - - } - - Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { - var delta = { top: 0, left: 0 } - if (!this.$viewport) return delta - - var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 - var viewportDimensions = this.getPosition(this.$viewport) - - if (/right|left/.test(placement)) { - var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll - var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight - if (topEdgeOffset < viewportDimensions.top) { // top overflow - delta.top = viewportDimensions.top - topEdgeOffset - } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow - delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset - } - } else { - var leftEdgeOffset = pos.left - viewportPadding - var rightEdgeOffset = pos.left + viewportPadding + actualWidth - if (leftEdgeOffset < viewportDimensions.left) { // left overflow - delta.left = viewportDimensions.left - leftEdgeOffset - } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow - delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset - } - } - - return delta - } - - Tooltip.prototype.getTitle = function () { - var title - var $e = this.$element - var o = this.options - - title = $e.attr('data-original-title') - || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) - - return title - } - - Tooltip.prototype.getUID = function (prefix) { - do prefix += ~~(Math.random() * 1000000) - while (document.getElementById(prefix)) - return prefix - } - - Tooltip.prototype.tip = function () { - if (!this.$tip) { - this.$tip = $(this.options.template) - if (this.$tip.length != 1) { - throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') - } - } - return this.$tip - } - - Tooltip.prototype.arrow = function () { - return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) - } - - Tooltip.prototype.enable = function () { - this.enabled = true - } - - Tooltip.prototype.disable = function () { - this.enabled = false - } - - Tooltip.prototype.toggleEnabled = function () { - this.enabled = !this.enabled - } - - Tooltip.prototype.toggle = function (e) { - var self = this - if (e) { - self = $(e.currentTarget).data('bs.' + this.type) - if (!self) { - self = new this.constructor(e.currentTarget, this.getDelegateOptions()) - $(e.currentTarget).data('bs.' + this.type, self) - } - } - - if (e) { - self.inState.click = !self.inState.click - if (self.isInStateTrue()) self.enter(self) - else self.leave(self) - } else { - self.tip().hasClass('in') ? self.leave(self) : self.enter(self) - } - } - - Tooltip.prototype.destroy = function () { - var that = this - clearTimeout(this.timeout) - this.hide(function () { - that.$element.off('.' + that.type).removeData('bs.' + that.type) - if (that.$tip) { - that.$tip.detach() - } - that.$tip = null - that.$arrow = null - that.$viewport = null - that.$element = null - }) - } - - - // TOOLTIP PLUGIN DEFINITION - // ========================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.tooltip') - var options = typeof option == 'object' && option - - if (!data && /destroy|hide/.test(option)) return - if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.tooltip - - $.fn.tooltip = Plugin - $.fn.tooltip.Constructor = Tooltip - - - // TOOLTIP NO CONFLICT - // =================== - - $.fn.tooltip.noConflict = function () { - $.fn.tooltip = old - return this - } - -}(jQuery); diff --git a/_sass/bootstrap/javascripts/bootstrap/transition.js b/_sass/bootstrap/javascripts/bootstrap/transition.js deleted file mode 100644 index a7b7e03..0000000 --- a/_sass/bootstrap/javascripts/bootstrap/transition.js +++ /dev/null @@ -1,59 +0,0 @@ -/* ======================================================================== - * Bootstrap: transition.js v3.4.0 - * https://getbootstrap.com/docs/3.4/javascript/#transitions - * ======================================================================== - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // CSS TRANSITION SUPPORT (Shoutout: https://modernizr.com/) - // ============================================================ - - function transitionEnd() { - var el = document.createElement('bootstrap') - - var transEndEventNames = { - WebkitTransition : 'webkitTransitionEnd', - MozTransition : 'transitionend', - OTransition : 'oTransitionEnd otransitionend', - transition : 'transitionend' - } - - for (var name in transEndEventNames) { - if (el.style[name] !== undefined) { - return { end: transEndEventNames[name] } - } - } - - return false // explicit for ie8 ( ._.) - } - - // https://blog.alexmaccaw.com/css-transitions - $.fn.emulateTransitionEnd = function (duration) { - var called = false - var $el = this - $(this).one('bsTransitionEnd', function () { called = true }) - var callback = function () { if (!called) $($el).trigger($.support.transition.end) } - setTimeout(callback, duration) - return this - } - - $(function () { - $.support.transition = transitionEnd() - - if (!$.support.transition) return - - $.event.special.bsTransitionEnd = { - bindType: $.support.transition.end, - delegateType: $.support.transition.end, - handle: function (e) { - if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) - } - } - }) - -}(jQuery); diff --git a/_sass/bootstrap/scss/_alert.scss b/_sass/bootstrap/scss/_alert.scss deleted file mode 100644 index da2a98a..0000000 --- a/_sass/bootstrap/scss/_alert.scss +++ /dev/null @@ -1,51 +0,0 @@ -// -// Base styles -// - -.alert { - position: relative; - padding: $alert-padding-y $alert-padding-x; - margin-bottom: $alert-margin-bottom; - border: $alert-border-width solid transparent; - @include border-radius($alert-border-radius); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $close-font-size + $alert-padding-x * 2; - - // Adjust close link position - .close { - position: absolute; - top: 0; - right: 0; - padding: $alert-padding-y $alert-padding-x; - color: inherit; - } -} - - -// Alternate styles -// -// Generate contextual modifier classes for colorizing the alert. - -@each $color, $value in $theme-colors { - .alert-#{$color} { - @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level)); - } -} diff --git a/_sass/bootstrap/scss/_badge.scss b/_sass/bootstrap/scss/_badge.scss deleted file mode 100644 index c727ba5..0000000 --- a/_sass/bootstrap/scss/_badge.scss +++ /dev/null @@ -1,54 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - display: inline-block; - padding: $badge-padding-y $badge-padding-x; - font-size: $badge-font-size; - font-weight: $badge-font-weight; - line-height: 1; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius($badge-border-radius); - @include transition($badge-transition); - - @at-root a#{&} { - @include hover-focus { - text-decoration: none; - } - } - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} - -// Pill badges -// -// Make them extra rounded with a modifier to replace v3's badges. - -.badge-pill { - padding-right: $badge-pill-padding-x; - padding-left: $badge-pill-padding-x; - @include border-radius($badge-pill-border-radius); -} - -// Colors -// -// Contextual variations (linked badges get darker on :hover). - -@each $color, $value in $theme-colors { - .badge-#{$color} { - @include badge-variant($value); - } -} diff --git a/_sass/bootstrap/scss/_breadcrumb.scss b/_sass/bootstrap/scss/_breadcrumb.scss deleted file mode 100644 index be30950..0000000 --- a/_sass/bootstrap/scss/_breadcrumb.scss +++ /dev/null @@ -1,41 +0,0 @@ -.breadcrumb { - display: flex; - flex-wrap: wrap; - padding: $breadcrumb-padding-y $breadcrumb-padding-x; - margin-bottom: $breadcrumb-margin-bottom; - list-style: none; - background-color: $breadcrumb-bg; - @include border-radius($breadcrumb-border-radius); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: $breadcrumb-item-padding; - - &::before { - display: inline-block; // Suppress underlining of the separator in modern browsers - padding-right: $breadcrumb-item-padding; - color: $breadcrumb-divider-color; - content: $breadcrumb-divider; - } - } - - // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built - // without `