From e5c599a54bb0ff8f1804c0123ece8b6d3292735a Mon Sep 17 00:00:00 2001 From: Nam Bui Date: Tue, 17 Nov 2020 01:45:11 +0700 Subject: [PATCH 01/12] [BEAM-11219][Website revamp] Development of All about Apache Beam component (#13331) * Implemented About social media component * Review: refactored social icons component & added licenses to svg icons --- .../www/site/assets/icons/extensive-icon.svg | 26 +++ website/www/site/assets/icons/github-icon.svg | 29 ++++ .../site/assets/icons/open-source-icon.svg | 31 ++++ .../www/site/assets/icons/portable-icon.svg | 27 ++++ .../www/site/assets/icons/twitter-icon.svg | 30 ++++ .../www/site/assets/icons/unified-icon.svg | 26 +++ .../www/site/assets/icons/youtube-icon.svg | 23 +++ website/www/site/assets/scss/_global.sass | 1 - .../scss/{_pillars.sass => _media.scss} | 31 +--- website/www/site/assets/scss/_pillars.scss | 151 ++++++++++++++++++ website/www/site/assets/scss/_typography.scss | 54 +++++++ website/www/site/assets/scss/_vars.sass | 3 + website/www/site/assets/scss/main.scss | 4 +- website/www/site/data/en/pillars.yaml | 10 +- website/www/site/data/en/pillars_social.yaml | 21 +++ website/www/site/i18n/home/en.yaml | 2 - website/www/site/i18n/home/pillars/en.yaml | 16 ++ website/www/site/layouts/index.html | 28 ++-- website/www/site/layouts/partials/head.html | 2 +- .../partials/pillars/pillars-item.html | 23 +++ .../partials/pillars/pillars-social.html | 19 +++ 21 files changed, 511 insertions(+), 46 deletions(-) create mode 100644 website/www/site/assets/icons/extensive-icon.svg create mode 100644 website/www/site/assets/icons/github-icon.svg create mode 100644 website/www/site/assets/icons/open-source-icon.svg create mode 100644 website/www/site/assets/icons/portable-icon.svg create mode 100644 website/www/site/assets/icons/twitter-icon.svg create mode 100644 website/www/site/assets/icons/unified-icon.svg create mode 100644 website/www/site/assets/icons/youtube-icon.svg rename website/www/site/assets/scss/{_pillars.sass => _media.scss} (63%) create mode 100644 website/www/site/assets/scss/_pillars.scss create mode 100644 website/www/site/assets/scss/_typography.scss create mode 100644 website/www/site/data/en/pillars_social.yaml create mode 100644 website/www/site/i18n/home/pillars/en.yaml create mode 100644 website/www/site/layouts/partials/pillars/pillars-item.html create mode 100644 website/www/site/layouts/partials/pillars/pillars-social.html diff --git a/website/www/site/assets/icons/extensive-icon.svg b/website/www/site/assets/icons/extensive-icon.svg new file mode 100644 index 000000000000..76e680da8216 --- /dev/null +++ b/website/www/site/assets/icons/extensive-icon.svg @@ -0,0 +1,26 @@ + + + + + + + + + diff --git a/website/www/site/assets/icons/github-icon.svg b/website/www/site/assets/icons/github-icon.svg new file mode 100644 index 000000000000..ba80c8261586 --- /dev/null +++ b/website/www/site/assets/icons/github-icon.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + diff --git a/website/www/site/assets/icons/open-source-icon.svg b/website/www/site/assets/icons/open-source-icon.svg new file mode 100644 index 000000000000..d6afab7898e8 --- /dev/null +++ b/website/www/site/assets/icons/open-source-icon.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + diff --git a/website/www/site/assets/icons/portable-icon.svg b/website/www/site/assets/icons/portable-icon.svg new file mode 100644 index 000000000000..77189163e141 --- /dev/null +++ b/website/www/site/assets/icons/portable-icon.svg @@ -0,0 +1,27 @@ + + + + + + + + + + diff --git a/website/www/site/assets/icons/twitter-icon.svg b/website/www/site/assets/icons/twitter-icon.svg new file mode 100644 index 000000000000..e23e8210ae5b --- /dev/null +++ b/website/www/site/assets/icons/twitter-icon.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + diff --git a/website/www/site/assets/icons/unified-icon.svg b/website/www/site/assets/icons/unified-icon.svg new file mode 100644 index 000000000000..6dc75d26e576 --- /dev/null +++ b/website/www/site/assets/icons/unified-icon.svg @@ -0,0 +1,26 @@ + + + + + + + + + diff --git a/website/www/site/assets/icons/youtube-icon.svg b/website/www/site/assets/icons/youtube-icon.svg new file mode 100644 index 000000000000..3cf47d8631f5 --- /dev/null +++ b/website/www/site/assets/icons/youtube-icon.svg @@ -0,0 +1,23 @@ + + + + + + diff --git a/website/www/site/assets/scss/_global.sass b/website/www/site/assets/scss/_global.sass index db0deb28e9de..a4dd35517e26 100644 --- a/website/www/site/assets/scss/_global.sass +++ b/website/www/site/assets/scss/_global.sass @@ -25,7 +25,6 @@ body .body background: #fff - max-width: 1440px margin: 0 auto padding-top: 130px diff --git a/website/www/site/assets/scss/_pillars.sass b/website/www/site/assets/scss/_media.scss similarity index 63% rename from website/www/site/assets/scss/_pillars.sass rename to website/www/site/assets/scss/_media.scss index 220e7ce8c6a0..b1146a520163 100644 --- a/website/www/site/assets/scss/_pillars.sass +++ b/website/www/site/assets/scss/_media.scss @@ -14,30 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -.pillars - margin: $pad-xl 0 - text-align: center - - .pillars__title - +type-h2 - margin-bottom: $pad - - .pillars__cols - +type-body - +md - display: flex - justify-content: center - - .pillars__cols__col - .pillars__cols__col__title - font-weight: 600 - margin-bottom: $pad/2 - - .pillars__cols__col__body - max-width: 350px - margin: 0 auto $pad-sm - - +md - padding: 0 $pad - margin: 0 auto + +$mobile: 640px; +$tablet: 1280px; +$fullhd: 1920px; diff --git a/website/www/site/assets/scss/_pillars.scss b/website/www/site/assets/scss/_pillars.scss new file mode 100644 index 000000000000..47c95d19ba0e --- /dev/null +++ b/website/www/site/assets/scss/_pillars.scss @@ -0,0 +1,151 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@import "media"; + +.pillars { + padding: $pad-l $pad; + + .pillars-title { + @extend .component-title; + + text-align: center; + border: none; + } + + .pillars-content { + display: grid; + grid-template-columns: 443px 443px; + grid-gap: 50px 89px; + justify-content: center; + margin-top: 84px; + + .pillars-item { + display: flex; + align-items: center; + + .pillars-item-icon { + margin-right: 47px; + } + + .pillars-item-description { + width: 100%; + max-width: 284px; + + .pillars-item-header { + @extend .component-header; + } + + .pillars-item-text { + @extend .component-text; + } + } + } + } + + .pillars-social { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + margin-top: 117px; + + .pillars-social-icons { + display: flex; + align-items: center; + margin-bottom: 45px; + + svg { + height: 41px; + width: auto; + } + + #about-twitter-icon { + height: 45px; + } + + a { + filter: grayscale(100%); + opacity: 0.7; + + &:hover { + filter: grayscale(0); + opacity: 1; + } + } + + .pillars-youtube-icon { + margin: 0 80px; + } + } + + .pillars-social-text { + @extend .component-text; + max-width: 285px; + } + } +} + +@media (max-width: $tablet) { + .pillars { + padding: $pad-md $pad-s; + + .pillars-content { + grid-template-columns: 330px; + grid-column-gap: 47px; + margin-top: 62px; + + .pillars-item { + align-items: flex-start; + + .pillars-item-icon { + margin-right: 17px; + margin-top: 12px; + } + + svg { + width: 64px; + height: 64px; + } + } + } + + .pillars-social { + margin-top: 91px; + + .pillars-social-icons { + svg { + height: 34px; + width: auto; + } + + #about-twitter-icon { + height: 37px; + } + + a { + filter: none; + opacity: 1; + } + + .pillars-youtube-icon { + margin: 0 60px; + } + } + } + } +} diff --git a/website/www/site/assets/scss/_typography.scss b/website/www/site/assets/scss/_typography.scss new file mode 100644 index 000000000000..d093140ace72 --- /dev/null +++ b/website/www/site/assets/scss/_typography.scss @@ -0,0 +1,54 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + @import "media"; + +.component-title { + font-size: 36px; + font-weight: normal; + font-style: normal; + line-height: 1.1; + letter-spacing: normal; + color: $color-gray; +} + +.component-header { + font-size: 22px; + font-weight: 500; + font-style: normal; + line-height: 1.45; + letter-spacing: 0.43px; + color: $color-gray; +} + +.component-text { + font-size: 16px; + font-weight: normal; + font-style: normal; + line-height: 1.63; + letter-spacing: 0.43px; + color: $color-gray; +} + +@media (max-width: $tablet) { + .component-title { + font-size: 28px; + } + .component-header { + font-weight: normal; + } +} \ No newline at end of file diff --git a/website/www/site/assets/scss/_vars.sass b/website/www/site/assets/scss/_vars.sass index a5dd998b14c2..6a98df42306a 100644 --- a/website/www/site/assets/scss/_vars.sass +++ b/website/www/site/assets/scss/_vars.sass @@ -20,10 +20,13 @@ $color-dark: #37424B $color-white: #FFF $color-light-gray: #F7F7F7 $color-dark-gray: #555 +$color-gray: #333333 $pad-sm: 15px +$pad-s: 24px $pad: 30px $pad-md: 60px +$pad-l: 84px $pad-xl: 100px $box-shadow: 0px 3px 20px 0 rgba(0,0,0,0.075) diff --git a/website/www/site/assets/scss/main.scss b/website/www/site/assets/scss/main.scss index a2983ad59473..8007760cbbbd 100644 --- a/website/www/site/assets/scss/main.scss +++ b/website/www/site/assets/scss/main.scss @@ -24,6 +24,8 @@ @import "_type.sass"; @import "_global.sass"; @import "_navbar.sass"; +@import "_typography.scss"; +@import "_media.scss"; // Components. @import "_button.sass"; @@ -36,7 +38,7 @@ @import "_header.sass"; @import "_hero.sass"; @import "_logos.sass"; -@import "_pillars.sass"; +@import "_pillars.scss"; @import "_section-nav.sass"; @import "_page-nav.sass"; @import "_table-wrapper.sass"; diff --git a/website/www/site/data/en/pillars.yaml b/website/www/site/data/en/pillars.yaml index d2138bdd8b38..de864bcaaac8 100644 --- a/website/www/site/data/en/pillars.yaml +++ b/website/www/site/data/en/pillars.yaml @@ -12,7 +12,13 @@ - title: Unified body: Use a single programming model for both batch and streaming use cases. -- title: Portable - body: Execute pipelines on multiple execution environments. + icon: icons/unified-icon.svg - title: Extensible body: Write and share new SDKs, IO connectors, and transformation libraries. + icon: icons/extensive-icon.svg +- title: Portable + body: Execute pipelines on multiple execution environments. + icon: icons/portable-icon.svg +- title: Open Source + body: Use a single programming model for both batch and streaming use cases. + icon: icons/open-source-icon.svg diff --git a/website/www/site/data/en/pillars_social.yaml b/website/www/site/data/en/pillars_social.yaml new file mode 100644 index 000000000000..2ed3ff6c03a9 --- /dev/null +++ b/website/www/site/data/en/pillars_social.yaml @@ -0,0 +1,21 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +- name: pillars-github-icon + icon: icons/github-icon.svg + url: https://github.com/apache/beam +- name: pillars-youtube-icon + icon: icons/youtube-icon.svg + url: https://www.youtube.com/channel/UChNnb_YO_7B0HlW6FhAXZZQ +- name: pillars-twitter-icon + icon: icons/twitter-icon.svg + url: https://twitter.com/apachebeam \ No newline at end of file diff --git a/website/www/site/i18n/home/en.yaml b/website/www/site/i18n/home/en.yaml index cbb3f23a78c3..43a3fea9bbc8 100644 --- a/website/www/site/i18n/home/en.yaml +++ b/website/www/site/i18n/home/en.yaml @@ -28,8 +28,6 @@ translation: "Go Quickstart" - id: home-hero-blog-title translation: "The latest from the blog" -- id: home-pillars-title - translation: "All about Apache Beam" - id: home-logos-title translation: "Works with" - id: home-cards-title diff --git a/website/www/site/i18n/home/pillars/en.yaml b/website/www/site/i18n/home/pillars/en.yaml new file mode 100644 index 000000000000..ab8a6d1ff002 --- /dev/null +++ b/website/www/site/i18n/home/pillars/en.yaml @@ -0,0 +1,16 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +- id: home-pillars-title + translation: "All about Apache Beam" +- id: home-pillars-social-text + translation: "Check out our social media to learn more about the community!" \ No newline at end of file diff --git a/website/www/site/layouts/index.html b/website/www/site/layouts/index.html index e1f69be4c2f2..f173e4103a71 100644 --- a/website/www/site/layouts/index.html +++ b/website/www/site/layouts/index.html @@ -57,23 +57,27 @@ {{ end }} {{ define "pillars-section" }} -
-
+
+

{{ T "home-pillars-title" }} -

-
+ +
{{ $data := index $.Site.Data .Site.Language.Lang }} {{ range $pillar := $data.pillars }} -
-
- {{ $pillar.title }} -
-
- {{ $pillar.body }} -
-
+ {{ partial "pillars/pillars-item" (dict "logo" $pillar.icon "header" $pillar.title "text" $pillar.body) }} {{ end }}
+
+
+ {{ $data := index $.Site.Data .Site.Language.Lang }} + {{ range $pillars_social := $data.pillars_social }} + {{ partial "pillars/pillars-social" (dict "icon" $pillars_social.icon "url" $pillars_social.url "name" $pillars_social.name) }} + {{ end }} +
+

+ {{ T "home-pillars-social-text" }} +

+
{{ end }} diff --git a/website/www/site/layouts/partials/head.html b/website/www/site/layouts/partials/head.html index 1430d9ad4dfa..b3773320be6d 100644 --- a/website/www/site/layouts/partials/head.html +++ b/website/www/site/layouts/partials/head.html @@ -17,7 +17,7 @@ {{ if .Title }}{{ .Title }}{{ else }}{{ .Site.Title }}{{ end }} - + {{ $scssMain := "scss/main.scss"}} {{ if .Site.IsServer }} diff --git a/website/www/site/layouts/partials/pillars/pillars-item.html b/website/www/site/layouts/partials/pillars/pillars-item.html new file mode 100644 index 000000000000..84be04b0edbf --- /dev/null +++ b/website/www/site/layouts/partials/pillars/pillars-item.html @@ -0,0 +1,23 @@ +{{/* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. See accompanying LICENSE file. +*/}} + +
+
+ {{ with resources.Get .logo }} + {{ .Content | safeHTML }} + {{ end }} +
+
+
{{ .header | markdownify }}
+

{{ .text | markdownify }}

+
+
diff --git a/website/www/site/layouts/partials/pillars/pillars-social.html b/website/www/site/layouts/partials/pillars/pillars-social.html new file mode 100644 index 000000000000..76f6a5099a36 --- /dev/null +++ b/website/www/site/layouts/partials/pillars/pillars-social.html @@ -0,0 +1,19 @@ +{{/* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. See accompanying LICENSE file. +*/}} + + \ No newline at end of file From 1f790fcd92e66a808cf2099aa86adeaa2bf1c5ab Mon Sep 17 00:00:00 2001 From: Nam Bui Date: Wed, 25 Nov 2020 07:27:51 +0700 Subject: [PATCH 02/12] [BEAM-11182][Website revamp] Implemented Stay up to date with Beam and Changed Works with components (#13406) * Implemented About social media component * Implemented About social media component * Implemented Stay up to date component * Updated supported integrations component * Review: Added comments --- .../www/site/assets/icons/calendar-icon.svg | 23 ++ website/www/site/assets/scss/_calendar.scss | 238 ++++++++++++++++++ .../assets/scss/{_logos.sass => _logos.scss} | 73 ++++-- website/www/site/assets/scss/_typography.scss | 48 +++- website/www/site/assets/scss/_vars.sass | 3 + website/www/site/assets/scss/main.scss | 3 +- website/www/site/data/en/calendar_events.yaml | 27 ++ website/www/site/i18n/home/calendar/en.yaml | 44 ++++ website/www/site/i18n/home/en.yaml | 2 - website/www/site/i18n/home/logos/en.yaml | 14 ++ website/www/site/layouts/_default/baseof.html | 1 + website/www/site/layouts/index.html | 73 +++++- .../partials/calendar/calendar-events.html | 33 +++ .../partials/pillars/pillars-social.html | 2 +- 14 files changed, 555 insertions(+), 29 deletions(-) create mode 100644 website/www/site/assets/icons/calendar-icon.svg create mode 100644 website/www/site/assets/scss/_calendar.scss rename website/www/site/assets/scss/{_logos.sass => _logos.scss} (50%) create mode 100644 website/www/site/data/en/calendar_events.yaml create mode 100644 website/www/site/i18n/home/calendar/en.yaml create mode 100644 website/www/site/i18n/home/logos/en.yaml create mode 100644 website/www/site/layouts/partials/calendar/calendar-events.html diff --git a/website/www/site/assets/icons/calendar-icon.svg b/website/www/site/assets/icons/calendar-icon.svg new file mode 100644 index 000000000000..1aa91dd4d3f8 --- /dev/null +++ b/website/www/site/assets/icons/calendar-icon.svg @@ -0,0 +1,23 @@ + + + + + + diff --git a/website/www/site/assets/scss/_calendar.scss b/website/www/site/assets/scss/_calendar.scss new file mode 100644 index 000000000000..69e2bf81a291 --- /dev/null +++ b/website/www/site/assets/scss/_calendar.scss @@ -0,0 +1,238 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@import "media"; + +.calendar { + padding: $pad-l $pad; + + .calendar-title { + @extend .component-title; + + text-align: center; + } + + .calendar-content { + display: flex; + justify-content: center; + align-items: flex-start; + margin-top: 84px; + + a { + text-decoration: none; + } + + // Left card + .calendar-card-big { + width: 100%; + max-width: 381px; + height: 468px; + border-radius: 16px; + box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.16), + 0 4px 4px 0 rgba(0, 0, 0, 0.06); + background-color: $color-white; + padding: 32px 24px; + transition: 0.2s; + + .calendar-card-big-title { + @extend .component-large-header; + + margin-top: 48px; + margin-bottom: 24px; + } + } + + .calendar-card-big-left:hover { + box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.24), + 0 4px 6px 0 rgba(0, 0, 0, 0.24); + } + + // Middle cards + .calendar-card-box { + margin: 0 37px; + min-height: 468px; + display: flex; + flex-direction: column; + justify-content: space-between; + + .calendar-card-small { + width: 100%; + max-width: 381px; + height: 216px; + border-radius: 16px; + box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.16), + 0 4px 4px 0 rgba(0, 0, 0, 0.06); + background-color: $color-white; + padding: 32px 24px; + transition: 0.2s; + + .calendar-card-small-title { + @extend .component-small-header; + + margin-top: 40px; + margin-bottom: 12px; + } + } + + .calendar-card-small:hover { + box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.24), + 0 4px 6px 0 rgba(0, 0, 0, 0.24); + } + } + + // Right card + .calendar-card-big-right { + .calendar-card-event-title { + @extend .component-header; + } + + .calendar-card-events { + margin-top: 30px; + margin-bottom: 70px; + + .calendar-event { + display: flex; + padding: 14px; + + .calendar-event-icon { + margin-right: 12px; + } + + .calendar-event-description { + .calendar-event-title { + @extend .component-label; + } + + .calendar-event-place { + @extend .component-tag; + } + + .calendar-event-time { + @extend .component-tag; + } + } + } + + .calendar-event:hover { + background-color: rgba(196, 196, 196, 0.16); + border-radius: 16px; + } + + :last-child { + margin-bottom: 0; + } + } + + .calendar-card-events-button { + width: 115px; + height: 36px; + border-radius: 100px; + background-color: $color-sun; + border: none; + outline: none; + float: right; + + span { + @extend .component-label; + + font-size: 14px; + color: $color-white; + } + } + + button:hover { + opacity: 0.84; + } + } + } +} + +// Category for left and middle cards +.calendar-category { + display: flex; + justify-content: space-between; + + .calendar-category-tag { + @extend .component-tag; + + font-size: 14px; + font-weight: 500; + text-transform: uppercase; + } + + .calendar-category-date { + @extend .component-tag; + } +} + +// Author for left and middle cards +.calendar-card-author { + @extend .component-tag; +} + +@media (max-width: $tablet) { + .calendar { + padding: $pad-md $pad-s; + + .calendar-content { + flex-direction: column; + align-items: center; + margin-top: 64px; + + .calendar-card-big { + max-width: 327px; + height: 356px; + padding: 32px 20px; + + .calendar-card-big-title { + margin-top: 35px; + margin-bottom: 16px; + } + } + + .calendar-card-box { + margin: 24px 0px; + min-height: 456px; + + .calendar-card-small { + max-width: 327px; + height: 216px; + padding: 24px 20px; + + .calendar-card-small-title { + margin-top: 30px; + margin-bottom: 10px; + width: 280px; + } + } + } + + .calendar-card-big-right { + height: 404px; + + .calendar-card-events { + margin-top: 20px; + margin-bottom: 15px; + + .calendar-event { + padding: 14px 5px; + } + } + } + } + } +} diff --git a/website/www/site/assets/scss/_logos.sass b/website/www/site/assets/scss/_logos.scss similarity index 50% rename from website/www/site/assets/scss/_logos.sass rename to website/www/site/assets/scss/_logos.scss index fd0f6f30058c..33cd632d1fb8 100644 --- a/website/www/site/assets/scss/_logos.sass +++ b/website/www/site/assets/scss/_logos.scss @@ -15,22 +15,57 @@ * limitations under the License. */ -.logos - text-align: center - margin: $pad-xl 0 - - .logos__title - +type-h2 - margin-bottom: $pad-md - - .logos__logos - display: flex - justify-content: center - - .logos__logos__logo - line-height: 0 - margin: 0 $pad - +md - margin: 0 $pad-md - img - max-height: 70px +@import "media"; + +.logos { + padding: $pad-l $pad; + + .logos-title { + @extend .component-title; + + text-align: center; + } + + .logos-logos { + display: flex; + justify-content: space-between; + width: 100%; + max-width: 1111px; + margin: 70px auto 60px; + + .logos-logo { + line-height: 0; + + img { + max-height: 70px; + } + } + } +} + +@media (max-width: $tablet) { + .logos { + padding: $pad-md $pad-s; + + .logos-logos { + max-width: 360px; + flex-wrap: wrap; + justify-content: center; + margin: 50px auto 20px; + + .logos-logo { + margin-right: 60px; + margin-bottom: 50px; + + img { + max-height: 45px; + } + } + + :nth-child(3), + :last-child { + margin-right: 0; + } + } + } +} diff --git a/website/www/site/assets/scss/_typography.scss b/website/www/site/assets/scss/_typography.scss index d093140ace72..99eacfe4ca04 100644 --- a/website/www/site/assets/scss/_typography.scss +++ b/website/www/site/assets/scss/_typography.scss @@ -23,6 +23,17 @@ font-style: normal; line-height: 1.1; letter-spacing: normal; + margin: 0; + color: $color-gray; +} + +.component-large-header { + font-size: 30px; + font-weight: 500; + font-style: normal; + line-height: 1.4; + letter-spacing: normal; + margin: 0; color: $color-gray; } @@ -32,6 +43,17 @@ font-style: normal; line-height: 1.45; letter-spacing: 0.43px; + margin: 0; + color: $color-gray; +} + +.component-small-header { + font-size: 18px; + font-weight: 500; + font-style: normal; + line-height: 1.56; + letter-spacing: 0.43px; + margin: 0; color: $color-gray; } @@ -41,14 +63,36 @@ font-style: normal; line-height: 1.63; letter-spacing: 0.43px; + margin: 0; color: $color-gray; } +.component-label { + font-size: 16px; + font-weight: bold; + font-stretch: normal; + font-style: normal; + line-height: 1.5; + letter-spacing: 0.43px; + margin: 0; + color: $color-gray; +} + +.component-tag { + font-size: 16px; + font-weight: normal; + font-style: normal; + line-height: 1.63; + letter-spacing: 0.43px; + margin: 0; + color: $color-smoke; +} + @media (max-width: $tablet) { .component-title { font-size: 28px; } - .component-header { - font-weight: normal; + .component-large-header { + font-size: 24px; } } \ No newline at end of file diff --git a/website/www/site/assets/scss/_vars.sass b/website/www/site/assets/scss/_vars.sass index 6a98df42306a..df4276a042b1 100644 --- a/website/www/site/assets/scss/_vars.sass +++ b/website/www/site/assets/scss/_vars.sass @@ -21,6 +21,9 @@ $color-white: #FFF $color-light-gray: #F7F7F7 $color-dark-gray: #555 $color-gray: #333333 +$color-smoke: #8C8B8E +$color-sun: #F26628 +$color-silver: #C4C4C4 $pad-sm: 15px $pad-s: 24px diff --git a/website/www/site/assets/scss/main.scss b/website/www/site/assets/scss/main.scss index 8007760cbbbd..e4075a1fe51a 100644 --- a/website/www/site/assets/scss/main.scss +++ b/website/www/site/assets/scss/main.scss @@ -37,8 +37,9 @@ @import "_graphic.sass"; @import "_header.sass"; @import "_hero.sass"; -@import "_logos.sass"; +@import "_logos.scss"; @import "_pillars.scss"; @import "_section-nav.sass"; @import "_page-nav.sass"; @import "_table-wrapper.sass"; +@import "_calendar.scss"; \ No newline at end of file diff --git a/website/www/site/data/en/calendar_events.yaml b/website/www/site/data/en/calendar_events.yaml new file mode 100644 index 000000000000..865542f9c637 --- /dev/null +++ b/website/www/site/data/en/calendar_events.yaml @@ -0,0 +1,27 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +- title: This is the title + place: Data Con LA + time: 2020/02/21 + icon: icons/calendar-icon.svg + url: # +- title: This is the title + place: Data Con LA + time: 2020/02/21 + icon: icons/calendar-icon.svg + url: # +- title: This is the title + place: Data Con LA + time: 2020/02/21 + icon: icons/calendar-icon.svg + url: # \ No newline at end of file diff --git a/website/www/site/i18n/home/calendar/en.yaml b/website/www/site/i18n/home/calendar/en.yaml new file mode 100644 index 000000000000..948854e1a09d --- /dev/null +++ b/website/www/site/i18n/home/calendar/en.yaml @@ -0,0 +1,44 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# TODO: +# Placeholder texts should be updated later +- id: home-calendar-title + translation: "Stay up to date with Beam" +- id: home-calendar-category-tag-first + translation: "Category" +- id: home-calendar-category-date-first + translation: "2020/02/21" +- id: home-calendar-card-title-first + translation: "Performance-Driven Runtime Type Checking for the Python SDK" +- id: home-calendar-card-author-first + translation: "Saavan Nanavati" +- id: home-calendar-category-tag-second + translation: "Category" +- id: home-calendar-category-date-second + translation: "2020/02/21" +- id: home-calendar-card-title-second + translation: "Performance-Driven Runtime Type Checking for the Python SDK" +- id: home-calendar-card-author-second + translation: "Saavan Nanavati" +- id: home-calendar-category-tag-third + translation: "Category" +- id: home-calendar-category-date-third + translation: "2020/02/21" +- id: home-calendar-card-title-third + translation: "Performance-Driven Runtime Type Checking for the Python SDK" +- id: home-calendar-card-author-third + translation: "Saavan Nanavati" +- id: home-calendar-card-events-title + translation: "Upcoming events" +- id: home-calendar-card-events-button + translation: "SEE MORE" diff --git a/website/www/site/i18n/home/en.yaml b/website/www/site/i18n/home/en.yaml index 43a3fea9bbc8..8a1ac53eecf8 100644 --- a/website/www/site/i18n/home/en.yaml +++ b/website/www/site/i18n/home/en.yaml @@ -28,8 +28,6 @@ translation: "Go Quickstart" - id: home-hero-blog-title translation: "The latest from the blog" -- id: home-logos-title - translation: "Works with" - id: home-cards-title translation: "Testimonials" - id: home-cards-body diff --git a/website/www/site/i18n/home/logos/en.yaml b/website/www/site/i18n/home/logos/en.yaml new file mode 100644 index 000000000000..7ed599a42ab5 --- /dev/null +++ b/website/www/site/i18n/home/logos/en.yaml @@ -0,0 +1,14 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +- id: home-logos-title + translation: "Supported runners" \ No newline at end of file diff --git a/website/www/site/layouts/_default/baseof.html b/website/www/site/layouts/_default/baseof.html index f8fbfb6c04b1..6c245c51ac9f 100644 --- a/website/www/site/layouts/_default/baseof.html +++ b/website/www/site/layouts/_default/baseof.html @@ -21,6 +21,7 @@ {{ block "hero-section" . }}{{ end }} {{ block "pillars-section" . }}{{ end }} {{ block "graphic-section" . }}{{ end }} + {{ block "calendar-section" . }}{{ end }} {{ block "logos-section" . }}{{ end }} {{ block "cards-section" . }}{{ end }} {{ block "ctas-section" . }}{{ end }} diff --git a/website/www/site/layouts/index.html b/website/www/site/layouts/index.html index f173e4103a71..bbfdf71b9132 100644 --- a/website/www/site/layouts/index.html +++ b/website/www/site/layouts/index.html @@ -89,14 +89,79 @@

{{ end }} +{{/* + TODO: + This is the implementation of the design. + The event sync functionality will be implemented when we have the event page. +*/}} +{{ define "calendar-section" }} + +{{ end }} + {{ define "logos-section" }} -
-
+
+
{{ T "home-logos-title" }}
-
+
{{ range $logo := $.Site.Data.works_with }} - \ No newline at end of file +
From 140a9139328ac7a87b9291aaa16bee5724009842 Mon Sep 17 00:00:00 2001 From: Nam Bui Date: Tue, 8 Dec 2020 09:08:25 +0700 Subject: [PATCH 03/12] [Website revamp][11179 - 11180 - 11183] Implemented Quotes component, Header and Navbar (#13439) * Implemented About social media component * Implemented Quotes component * Implemented Hero component * Changed Navbar component * Added license * Review changes * Review changes --- build.gradle | 3 + .../site/assets/icons/install-button-icon.svg | 22 +++ .../site/assets/icons/navbar-arrow-icon.svg | 23 +++ .../icons/navbar-documentation-icon.svg | 22 +++ website/www/site/assets/icons/quote-icon.svg | 22 +++ website/www/site/assets/scss/_calendar.scss | 2 +- website/www/site/assets/scss/_cards.sass | 69 ------- website/www/site/assets/scss/_global.sass | 7 +- website/www/site/assets/scss/_graphic.sass | 2 + .../www/site/assets/scss/_hero-mobile.scss | 62 +++++++ website/www/site/assets/scss/_hero.sass | 156 ---------------- website/www/site/assets/scss/_hero.scss | 128 +++++++++++++ .../www/site/assets/scss/_keen-slider.scss | 40 ++++ .../www/site/assets/scss/_navbar-desktop.scss | 174 ++++++++++++++++++ .../{_navbar.sass => _navbar-mobile.sass} | 17 +- website/www/site/assets/scss/_quotes.scss | 151 +++++++++++++++ .../www/site/assets/scss/_section-nav.sass | 4 +- website/www/site/assets/scss/_typography.scss | 47 ++++- website/www/site/assets/scss/_vars.sass | 4 + website/www/site/assets/scss/main.scss | 12 +- website/www/site/data/en/quotes.yaml | 23 +++ website/www/site/i18n/home/en.yaml | 4 - .../en/cards.yaml => i18n/home/hero/en.yaml} | 14 +- website/www/site/i18n/home/quotes/en.yaml | 14 ++ website/www/site/i18n/navbar/en.yaml | 4 +- website/www/site/layouts/_default/baseof.html | 4 +- website/www/site/layouts/index.html | 121 +++++------- website/www/site/layouts/partials/header.html | 58 +++++- .../site/layouts/partials/hooks/body-end.html | 17 ++ .../layouts/partials/quotes/quote-mobile.html | 21 +++ .../site/layouts/partials/quotes/quote.html | 21 +++ .../site/static/images/quote-paypal-logo.png | Bin 0 -> 16047 bytes .../www/site/static/js/hero/hero-desktop.js | 21 +++ .../www/site/static/js/hero/hero-mobile.js | 21 +++ .../site/static/js/hero/lottie-light.min.js | 18 ++ website/www/site/static/js/keen-slider.min.js | 15 ++ website/www/site/static/js/quotes-slider.js | 42 +++++ website/www/site/static/js/section-nav.js | 2 +- 38 files changed, 1050 insertions(+), 337 deletions(-) create mode 100644 website/www/site/assets/icons/install-button-icon.svg create mode 100644 website/www/site/assets/icons/navbar-arrow-icon.svg create mode 100644 website/www/site/assets/icons/navbar-documentation-icon.svg create mode 100644 website/www/site/assets/icons/quote-icon.svg delete mode 100644 website/www/site/assets/scss/_cards.sass create mode 100644 website/www/site/assets/scss/_hero-mobile.scss delete mode 100644 website/www/site/assets/scss/_hero.sass create mode 100644 website/www/site/assets/scss/_hero.scss create mode 100644 website/www/site/assets/scss/_keen-slider.scss create mode 100644 website/www/site/assets/scss/_navbar-desktop.scss rename website/www/site/assets/scss/{_navbar.sass => _navbar-mobile.sass} (87%) create mode 100644 website/www/site/assets/scss/_quotes.scss create mode 100644 website/www/site/data/en/quotes.yaml rename website/www/site/{data/en/cards.yaml => i18n/home/hero/en.yaml} (60%) create mode 100644 website/www/site/i18n/home/quotes/en.yaml create mode 100644 website/www/site/layouts/partials/hooks/body-end.html create mode 100644 website/www/site/layouts/partials/quotes/quote-mobile.html create mode 100644 website/www/site/layouts/partials/quotes/quote.html create mode 100644 website/www/site/static/images/quote-paypal-logo.png create mode 100644 website/www/site/static/js/hero/hero-desktop.js create mode 100644 website/www/site/static/js/hero/hero-mobile.js create mode 100644 website/www/site/static/js/hero/lottie-light.min.js create mode 100644 website/www/site/static/js/keen-slider.min.js create mode 100644 website/www/site/static/js/quotes-slider.js diff --git a/build.gradle b/build.gradle index 15d1dd0d22fb..c836cea30c43 100644 --- a/build.gradle +++ b/build.gradle @@ -82,6 +82,9 @@ rat { "website/www/site/themes", "website/www/yarn.lock", "website/www/package.json", + "website/www/site/static/js/hero/lottie-light.min.js", + "website/www/site/static/js/keen-slider.min.js", + "website/www/site/assets/scss/_keen-slider.scss", // Ignore ownership files "ownership/**/*", diff --git a/website/www/site/assets/icons/install-button-icon.svg b/website/www/site/assets/icons/install-button-icon.svg new file mode 100644 index 000000000000..39c3ffcfbd31 --- /dev/null +++ b/website/www/site/assets/icons/install-button-icon.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/website/www/site/assets/icons/navbar-arrow-icon.svg b/website/www/site/assets/icons/navbar-arrow-icon.svg new file mode 100644 index 000000000000..78724e930331 --- /dev/null +++ b/website/www/site/assets/icons/navbar-arrow-icon.svg @@ -0,0 +1,23 @@ + + + + + + diff --git a/website/www/site/assets/icons/navbar-documentation-icon.svg b/website/www/site/assets/icons/navbar-documentation-icon.svg new file mode 100644 index 000000000000..11c165b0feba --- /dev/null +++ b/website/www/site/assets/icons/navbar-documentation-icon.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/website/www/site/assets/icons/quote-icon.svg b/website/www/site/assets/icons/quote-icon.svg new file mode 100644 index 000000000000..0a32eea254ad --- /dev/null +++ b/website/www/site/assets/icons/quote-icon.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/website/www/site/assets/scss/_calendar.scss b/website/www/site/assets/scss/_calendar.scss index 69e2bf81a291..c78c16081571 100644 --- a/website/www/site/assets/scss/_calendar.scss +++ b/website/www/site/assets/scss/_calendar.scss @@ -209,7 +209,7 @@ min-height: 456px; .calendar-card-small { - max-width: 327px; + width: 327px; height: 216px; padding: 24px 20px; diff --git a/website/www/site/assets/scss/_cards.sass b/website/www/site/assets/scss/_cards.sass deleted file mode 100644 index a1562d0dde1d..000000000000 --- a/website/www/site/assets/scss/_cards.sass +++ /dev/null @@ -1,69 +0,0 @@ -/*! - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -.cards - background-image: url(../images/cards_bg.svg) - background-size: cover - background-repeat: no-repeat - background-position: top - text-align: center - margin-bottom: $pad*2 - - .cards__title - +type-h2 - color: #fff - padding-top: $pad-md - margin-bottom: $pad - - .cards__body - max-width: 550px - +type-body - margin: 0 auto - - .cards__cards - margin-bottom: $pad*2 - +md - display: flex - justify-content: center - align-items: center - - .cards__cards__card - background: #fff - box-shadow: $box-shadow - max-width: 300px - margin: 0 auto $pad - padding: $pad*1.5 - +md - margin: 0 $pad/2 - - .cards__cards__card__body - margin-bottom: $pad - +type-h3 - - .cards__cards__card__user - display: flex - justify-content: center - align-items: center - - .cards__cards__card__user__icon - border-radius: 100% - background: #efefef - width: 40px - height: 40px - - .cards__cards__card__user__name - margin-left: $pad/2 diff --git a/website/www/site/assets/scss/_global.sass b/website/www/site/assets/scss/_global.sass index a4dd35517e26..2410e0d64693 100644 --- a/website/www/site/assets/scss/_global.sass +++ b/website/www/site/assets/scss/_global.sass @@ -26,7 +26,6 @@ body .body background: #fff margin: 0 auto - padding-top: 130px &:not(.body--index) .body__contained @@ -67,4 +66,8 @@ body .container-main-content padding: 0 20px - position: relative \ No newline at end of file + position: relative + margin-top: 85px + + @media (min-width: $tablet) + margin-top: 0 \ No newline at end of file diff --git a/website/www/site/assets/scss/_graphic.sass b/website/www/site/assets/scss/_graphic.sass index f01c72a12528..cd171f7db00b 100644 --- a/website/www/site/assets/scss/_graphic.sass +++ b/website/www/site/assets/scss/_graphic.sass @@ -16,6 +16,8 @@ */ .graphic + padding: $pad-l $pad + .graphic__image text-align: center line-height: 0 diff --git a/website/www/site/assets/scss/_hero-mobile.scss b/website/www/site/assets/scss/_hero-mobile.scss new file mode 100644 index 000000000000..343c279f4c90 --- /dev/null +++ b/website/www/site/assets/scss/_hero-mobile.scss @@ -0,0 +1,62 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@import "media"; + +.hero-mobile { + position: relative; + margin-bottom: 0; + display: none; + + .hero-content { + position: absolute; + z-index: 1; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + text-align: center; + width: 100%; + max-width: 506px; + + h3 { + @extend .hero-title; + + text-transform: uppercase; + margin: 0 auto 16px auto; + } + + h1 { + @extend .hero-heading; + + width: 300px; + margin: 0 auto 24px auto; + } + + h2 { + @extend .hero-subheading; + + width: 300px; + margin: 0 auto; + } + } +} + +@media (max-width: $mobile) { + .hero-mobile { + display: inherit; + } +} diff --git a/website/www/site/assets/scss/_hero.sass b/website/www/site/assets/scss/_hero.sass deleted file mode 100644 index 63c22b9282a5..000000000000 --- a/website/www/site/assets/scss/_hero.sass +++ /dev/null @@ -1,156 +0,0 @@ -/*! - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -.hero-bg - background-image: url(../images/hero_bg_flat.svg) - background-repeat: no-repeat - background-size: cover - background-position: top center - margin-top: -50px - +md - background-size: 100% - padding-bottom: $pad - -.hero - padding-top: $pad-xl - margin-bottom: $pad-md - position: relative - z-index: 1 - +md - padding-top: $pad-sm - margin-bottom: $pad-xl - - .hero__content - position: relative - z-index: 1 - - .hero__image - bottom: 0 - content: '' - left: 0 - line-height: 0 - position: absolute - right: 0 - top: 0 - z-index: 0 - img - position: absolute - bottom: 0 - width: 100% - - .hero__title - +type-h1 - color: #fff - max-width: 500px - margin: 0 auto $pad - text-align: center - +md - margin: 0 0 $pad - text-align: left - - .hero__ctas - text-align: center - margin-bottom: $pad-md - +md - margin-bottom: 0 - text-align: left - - &--first - margin-bottom: $pad - +md - margin-bottom: $pad-sm - - .hero__subtitle - +type-h3 - color: #fff - max-width: 540px - margin: 0 auto $pad - font-weight: $font-weight-semibold - text-align: center - +md - margin: 0 0 $pad-md - text-align: left - - .hero__blog - .hero__blog__title - +type-h4 - font-weight: $font-weight-bold - margin-bottom: $pad - text-align: center - +md - color: #fff - text-align: left - margin-bottom: $pad/2 - - .hero__blog__cards - +md - display: flex - margin: 0 -10px - - .hero__blog__cards__card - background-color: #fff - color: inherit - box-shadow: $box-shadow - padding: 20px - display: block - transition: transform 300ms ease, box-shadow 300ms ease - position: relative - max-width: 300px - margin: 0 auto $pad - +md - margin: 0 10px - - &:before - background-image: url(../images/card_border.svg) - background-position: top - background-repeat: no-repeat - background-size: cover - content: ' ' - display: block - height: 2px - position: absolute - width: 100% - left: 0 - top: 0 - - &:hover - text-decoration: none - transform: translateY(-8px) - box-shadow: $box-shadow-hover - - .hero__blog__cards__card__title - +type-body - margin-bottom: $pad - - .hero__blog__cards__card__date - +type-body-sm - font-weight: $font-weight-semibold - text-transform: uppercase - letter-spacing: 1px - - .hero__cols - +md - display: flex - min-height: 500px - - .hero__cols__col - width: 50% - display: flex - align-items: flex-end - - &:first-child - align-items: center diff --git a/website/www/site/assets/scss/_hero.scss b/website/www/site/assets/scss/_hero.scss new file mode 100644 index 000000000000..e204d1bf015d --- /dev/null +++ b/website/www/site/assets/scss/_hero.scss @@ -0,0 +1,128 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@import "media"; + +.hero-desktop { + position: relative; + margin-bottom: 0; + width: 100%; + height: 100%; + display: inherit; + margin-top: -30px; + + .hero-content { + position: absolute; + z-index: 1; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + text-align: center; + + h3 { + @extend .hero-title; + + text-transform: uppercase; + margin: 0 auto 24px auto; + } + + h1 { + @extend .hero-heading; + width: 506px; + + margin: 0 auto 36px auto; + } + + h2 { + @extend .hero-subheading; + + width: 344px; + margin: 0 auto 56px auto; + } + + a { + text-decoration: none; + } + + button { + width: 184px; + height: 46px; + padding: 15px 28px 15px 26px; + border-radius: 100px; + box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.16), + 0 4px 4px 0 rgba(0, 0, 0, 0.06); + background-color: $color-white; + display: flex; + align-items: center; + justify-content: center; + margin: 0 auto; + border: none; + outline: none; + + span { + text-transform: uppercase; + font-size: 14px; + font-weight: bold; + letter-spacing: 0.6px; + color: $color-sun; + } + } + + button:hover { + background-color: $color-white; + box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.24), + 0 4px 6px 0 rgba(0, 0, 0, 0.24); + } + + button:focus { + box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.16), + 0 4px 4px 0 rgba(0, 0, 0, 0.06); + } + } +} + +@media (max-width: $tablet) { + .hero-desktop { + margin-top: 70px; + + .hero-content { + h3 { + margin: 0 auto 16px auto; + } + + h1 { + width: 300px; + margin: 0 auto 24px auto; + } + + h2 { + width: 300px; + margin: 0 auto; + } + + button { + display: none; + } + } + } +} + +@media (max-width: $mobile) { + .hero-desktop { + display: none; + } +} diff --git a/website/www/site/assets/scss/_keen-slider.scss b/website/www/site/assets/scss/_keen-slider.scss new file mode 100644 index 000000000000..08a4326e0042 --- /dev/null +++ b/website/www/site/assets/scss/_keen-slider.scss @@ -0,0 +1,40 @@ +/** + * keen-slider 5.3.2 + * The HTML touch slider carousel with the most native feeling you will get. + * https://keen-slider.io + * Copyright 2020-2020 Eric Beyer + * License: MIT + * Released on: 2020-11-10 + */ + +/*# sourceMappingURL=keen-slider.min.css.map */ +// This is pulled from "https://cdn.jsdelivr.net/npm/keen-slider@5.3.2/keen-slider.min.css" to serve the consistency +.keen-slider { + display: flex; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-touch-callout: none; + -khtml-user-select: none; + touch-action: pan-y; + -webkit-tap-highlight-color: transparent; +} +.keen-slider, +.keen-slider__slide { + overflow: hidden; + position: relative; +} +.keen-slider__slide { + width: 100%; + min-height: 100%; +} +.keen-slider[data-keen-slider-v] { + flex-wrap: wrap; +} +.keen-slider[data-keen-slider-v] .keen-slider__slide { + width: 100%; +} +.keen-slider[data-keen-slider-moves] * { + pointer-events: none; +} diff --git a/website/www/site/assets/scss/_navbar-desktop.scss b/website/www/site/assets/scss/_navbar-desktop.scss new file mode 100644 index 000000000000..57eb63350808 --- /dev/null +++ b/website/www/site/assets/scss/_navbar-desktop.scss @@ -0,0 +1,174 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@import "media"; + +.navigation-bar-mobile { + display: none; +} + +.navigation-bar-desktop { + display: flex; + height: 96px; + width: 100%; + align-items: center; + justify-content: space-between; + margin-bottom: 30px; + box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.06); + background-color: $color-white; + z-index: 10000; // just to make sure that navbar always on top of other elements + + a { + @extend .component-text; + + color: $color-dark-gray; + letter-spacing: 0.2; + margin-right: 56px; + text-decoration: none; + cursor: pointer; + } + + .navbar-logo { + margin-left: 58px; + + img { + width: 88px; + } + } + + .navbar-links { + display: flex; + align-items: center; + justify-content: space-between; + z-index: 10000; + + :last-child { + margin-right: 0; + } + + .navbar-link { + display: inline-block; + position: relative; + margin-bottom: 2px; + } + + .navbar-link::before { + transition: 0.3; + content: ""; + position: absolute; + background-color: $color-sun; + height: 0%; + width: 100%; + bottom: 0px; + border-radius: 5px; + } + + .navbar-link:hover::before { + height: 2px; + } + + .navbar-dropdown-documentation { + list-style-type: none; + + .dropdown-toggle { + margin: 0; + } + + ul { + width: 209px; + left: -25%; + text-align: center; + border: none; + box-shadow: none; + padding-top: 34px; + padding-bottom: 0; + + a { + @extend .component-text; + } + } + } + } + + .navbar-dropdown-apache { + margin-right: 90px; + list-style-type: none; + + .dropdown-toggle { + margin: 0; + } + + ul { + width: 209px; + left: 70%; + transform: translateX(-50%); + text-align: center; + border: none; + box-shadow: none; + padding-top: 35px; + padding-bottom: 0; + + a { + @extend .component-text; + + margin-right: 0 !important; + } + } + + .arrow-icon { + position: absolute; + top: 3px; + right: -30px; + } + } + + .navbar-dropdown-apache:hover { + .arrow-icon { + opacity: 0.84; + } + } + + .navbar-dropdown { + .dropdown-menu > li > a { + &:hover, + &:focus { + text-decoration: none; + color: $color-dropdown-link-hover-text; + background-color: $color-dropdown-link-hover-bg; + } + } + } + + .dropdown:hover .dropdown-menu { + display: block; + margin-top: 0; + } +} + +@media (max-width: $tablet) { + .navigation-bar-desktop { + display: none; + } + + .navigation-bar-mobile { + display: block; + } + + .page-nav { + margin-top: 30px; + } +} \ No newline at end of file diff --git a/website/www/site/assets/scss/_navbar.sass b/website/www/site/assets/scss/_navbar-mobile.sass similarity index 87% rename from website/www/site/assets/scss/_navbar.sass rename to website/www/site/assets/scss/_navbar-mobile.sass index f4b4ea6bcae7..762b5e517b9a 100644 --- a/website/www/site/assets/scss/_navbar.sass +++ b/website/www/site/assets/scss/_navbar-mobile.sass @@ -23,6 +23,7 @@ .navbar-header margin-left: $pad + float: none .navbar-brand +md @@ -40,16 +41,17 @@ color: $color-dark-gray .navbar-toggle - float: left + margin-right: 24px .icon-bar - background-color: $color-dark-gray + background-color: $color-sun + height: 3px - @media (max-width: $ak-breakpoint-lg) + @media (max-width: $tablet) display: block .navbar-container - @media (max-width: $ak-breakpoint-lg) + @media (max-width: $tablet) background-color: $color-white bottom: 0 min-height: 100vh @@ -59,12 +61,13 @@ top: 0 transition: transform 100ms linear width: calc(100% - 32px) + right: 0 .navbar-nav > li width: 100% &.closed - transform: translateX(-100%) + transform: translateX(100%) &.open transform: translateX(0) @@ -78,7 +81,7 @@ top: 0 transition: opacity 200ms - @media (max-width: $ak-breakpoint-lg) + @media (max-width: $tablet) display: block &.closed @@ -89,6 +92,6 @@ opacity: 0.5 width: 100% - @media (max-width: $ak-breakpoint-lg) + @media (max-width: $tablet) .navbar-right margin-right: -15px diff --git a/website/www/site/assets/scss/_quotes.scss b/website/www/site/assets/scss/_quotes.scss new file mode 100644 index 000000000000..6d59798289f0 --- /dev/null +++ b/website/www/site/assets/scss/_quotes.scss @@ -0,0 +1,151 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@import "media"; + +.quotes { + padding: $pad-l $pad; + background-color: $color-medium-gray; + + .quotes-title { + @extend .component-title; + + text-align: center; + border: none; + } + + .quotes-desktop { + display: flex; + justify-content: center; + + .quote-card { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + width: 100%; + max-width: 381px; + height: 474px; + margin: 86px 36px 0 0; + padding: 55px 20px 24px 20px; + border-radius: 16px; + background-color: $color-white; + box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.16), + 0 4px 4px 0 rgba(0, 0, 0, 0.06); + margin-right: 36px; + + .quote-text { + @extend .component-quote; + + margin: 108px 0 20px 0; + } + + img { + width: 172px; + } + } + + :last-child { + margin-right: 0; + } + } + + // Sliding feature is only displayed on mobile version + .keen-slider { + display: none; + } + + .dots { + display: none; + } + + .keen-slider { + width: 327px; + margin: 0 auto; + border-radius: 16px; + background-color: $color-white; + box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.16), + 0 4px 4px 0 rgba(0, 0, 0, 0.06); + + .keen-slider__slide { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + width: 100%; + max-width: 327px; + height: 468px; + padding: 55px 24px 24px 24px; + + .quote-text { + @extend .component-quote; + + margin: 108px 0 20px 0; + } + + img { + width: 172px; + } + } + } + + .dots { + display: none; + padding: 10px 0; + justify-content: center; + margin-top: 46px; + } + + .dot { + border: none; + width: 13px; + height: 13px; + background: $color-smoke; + border-radius: 50%; + margin: 0 5px; + padding: 4px; + cursor: pointer; + } + + .dot:focus { + outline: none; + } + + .dot--active { + background: $color-sun; + } +} + +@media (max-width: $tablet) { + .quotes { + .quotes-title { + margin-bottom: 64px; + } + + .quotes-desktop { + display: none; + } + + .keen-slider { + display: flex; + } + + .dots { + display: flex; + } + } +} diff --git a/website/www/site/assets/scss/_section-nav.sass b/website/www/site/assets/scss/_section-nav.sass index 61aff9f462ea..d8c4ed195b83 100644 --- a/website/www/site/assets/scss/_section-nav.sass +++ b/website/www/site/assets/scss/_section-nav.sass @@ -97,7 +97,7 @@ @media (max-width: $ak-breakpoint-lg) background-color: $color-light-gray bottom: 0 - left: 0 + right: 0 max-width: 256px position: fixed top: 0 @@ -110,7 +110,7 @@ overflow-y: auto &.closed - transform: translateX(-100%) + transform: translateX(100%) &.open transform: translateX(0) diff --git a/website/www/site/assets/scss/_typography.scss b/website/www/site/assets/scss/_typography.scss index 99eacfe4ca04..807619cadd05 100644 --- a/website/www/site/assets/scss/_typography.scss +++ b/website/www/site/assets/scss/_typography.scss @@ -14,8 +14,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - @import "media"; + +@import "media"; .component-title { font-size: 36px; @@ -88,6 +88,44 @@ color: $color-smoke; } +.component-quote { + font-size: 20px; + font-weight: normal; + font-stretch: normal; + font-style: italic; + line-height: 1.44; + letter-spacing: 0.43px; + text-align: center; + color: $color-gray; +} + +.hero-title { + font-size: 16px; + font-weight: normal; + font-style: normal; + line-height: 1.88; + letter-spacing: 0.8px; + color: $color-white; +} + +.hero-heading { + font-size: 46px; + font-weight: 500; + font-style: normal; + line-height: 1; + letter-spacing: normal; + color: $color-white; +} + +.hero-subheading { + font-size: 20px; + font-weight: normal; + font-style: normal; + line-height: 1.44; + letter-spacing: normal; + color: $color-white; +} + @media (max-width: $tablet) { .component-title { font-size: 28px; @@ -95,4 +133,7 @@ .component-large-header { font-size: 24px; } -} \ No newline at end of file + .hero-heading { + font-size: 32px; + } +} diff --git a/website/www/site/assets/scss/_vars.sass b/website/www/site/assets/scss/_vars.sass index df4276a042b1..626313d993b2 100644 --- a/website/www/site/assets/scss/_vars.sass +++ b/website/www/site/assets/scss/_vars.sass @@ -24,6 +24,10 @@ $color-gray: #333333 $color-smoke: #8C8B8E $color-sun: #F26628 $color-silver: #C4C4C4 +$color-medium-gray: #FBFBFB + +$color-dropdown-link-hover-text: #E65D21 +$color-dropdown-link-hover-bg: #FFEDE5 $pad-sm: 15px $pad-s: 24px diff --git a/website/www/site/assets/scss/main.scss b/website/www/site/assets/scss/main.scss index e4075a1fe51a..b40befd414cd 100644 --- a/website/www/site/assets/scss/main.scss +++ b/website/www/site/assets/scss/main.scss @@ -20,26 +20,28 @@ // Globals. @import "_vars.sass"; +@import "_media.scss"; @import "_breakpoints.sass"; @import "_type.sass"; @import "_global.sass"; -@import "_navbar.sass"; +@import "_navbar-mobile.sass"; @import "_typography.scss"; -@import "_media.scss"; // Components. @import "_button.sass"; // Modules. -@import "_cards.sass"; @import "_ctas.sass"; @import "_footer.sass"; @import "_graphic.sass"; @import "_header.sass"; -@import "_hero.sass"; +@import "_hero.scss"; +@import "_hero-mobile.scss"; @import "_logos.scss"; @import "_pillars.scss"; @import "_section-nav.sass"; @import "_page-nav.sass"; @import "_table-wrapper.sass"; -@import "_calendar.scss"; \ No newline at end of file +@import "_calendar.scss"; +@import "_quotes.scss"; +@import "navbar-desktop.scss"; \ No newline at end of file diff --git a/website/www/site/data/en/quotes.yaml b/website/www/site/data/en/quotes.yaml new file mode 100644 index 000000000000..537171a7d4c2 --- /dev/null +++ b/website/www/site/data/en/quotes.yaml @@ -0,0 +1,23 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# TODO: +# Placeholder texts should be updated later +- text: A framework that delivers the flexibility and advanced functionality our customers need. + icon: icons/quote-icon.svg + logoUrl: images/quote-paypal-logo.png +- text: A framework that delivers the flexibility and advanced functionality our customers need. + icon: icons/quote-icon.svg + logoUrl: images/quote-paypal-logo.png +- text: A framework that delivers the flexibility and advanced functionality our customers need. + icon: icons/quote-icon.svg + logoUrl: images/quote-paypal-logo.png \ No newline at end of file diff --git a/website/www/site/i18n/home/en.yaml b/website/www/site/i18n/home/en.yaml index 8a1ac53eecf8..6ae87c04f465 100644 --- a/website/www/site/i18n/home/en.yaml +++ b/website/www/site/i18n/home/en.yaml @@ -10,10 +10,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -- id: home-hero-title - translation: "Apache Beam: An advanced unified programming model" -- id: home-hero-subtitle - translation: "Implement batch and streaming data processing jobs that run on any execution engine." - id: home-learn-more translation: "Learn more" - id: home-try-beam diff --git a/website/www/site/data/en/cards.yaml b/website/www/site/i18n/home/hero/en.yaml similarity index 60% rename from website/www/site/data/en/cards.yaml rename to website/www/site/i18n/home/hero/en.yaml index a2981e7fba86..85f4728d86be 100644 --- a/website/www/site/data/en/cards.yaml +++ b/website/www/site/i18n/home/hero/en.yaml @@ -10,9 +10,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -- quote: "A framework that delivers the flexibility and advanced functionality our customers need." - name: –Talend -- quote: "Apache Beam has powerful semantics that solve real-world challenges of stream processing." - name: –PayPal -- quote: "Apache Beam represents a principled approach for analyzing data streams." - name: –data Artisans +- id: home-hero-title + translation: Introducing Apache Beam +- id: home-hero-heading + translation: An advanced unified programming model +- id: home-hero-subheading + translation: Implement batch and streaming data processing jobs that run on any execution engine. +- id: home-hero-button + translation: Install Beam diff --git a/website/www/site/i18n/home/quotes/en.yaml b/website/www/site/i18n/home/quotes/en.yaml new file mode 100644 index 000000000000..95c8e85b6453 --- /dev/null +++ b/website/www/site/i18n/home/quotes/en.yaml @@ -0,0 +1,14 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +- id: home-quotes-title + translation: "They tried it out" \ No newline at end of file diff --git a/website/www/site/i18n/navbar/en.yaml b/website/www/site/i18n/navbar/en.yaml index fd22c3a73821..ae6255e50683 100644 --- a/website/www/site/i18n/navbar/en.yaml +++ b/website/www/site/i18n/navbar/en.yaml @@ -16,10 +16,12 @@ translation: "Get Started" - id: nav-documentation translation: "Documentation" +- id: nav-documentation-general + translation: "General" - id: nav-languages translation: "Languages" - id: nav-runners - translation: "RUNNERS" + translation: "Runners" - id: nav-roadmap translation: "Roadmap" - id: nav-contribute diff --git a/website/www/site/layouts/_default/baseof.html b/website/www/site/layouts/_default/baseof.html index 6c245c51ac9f..b8b6e26cdfd9 100644 --- a/website/www/site/layouts/_default/baseof.html +++ b/website/www/site/layouts/_default/baseof.html @@ -22,10 +22,12 @@ {{ block "pillars-section" . }}{{ end }} {{ block "graphic-section" . }}{{ end }} {{ block "calendar-section" . }}{{ end }} + {{ block "quotes-section" . }}{{ end }} + {{ block "quotes-mobile-section" . }}{{ end }} {{ block "logos-section" . }}{{ end }} - {{ block "cards-section" . }}{{ end }} {{ block "ctas-section" . }}{{ end }}
{{ partial "footer.html" . }} + {{ partial "hooks/body-end.html"}} diff --git a/website/www/site/layouts/index.html b/website/www/site/layouts/index.html index bbfdf71b9132..4f7f0a536587 100644 --- a/website/www/site/layouts/index.html +++ b/website/www/site/layouts/index.html @@ -11,47 +11,28 @@ */}} {{ define "hero-section" }} -
-
-
- -
-
-
- {{ T "home-hero-blog-title" }} -
-
- - {{ range ( where site.RegularPages "Section" "blog" | first 3 ) }} - -
{{ .Title }}
-
{{ .Date.Format "Jan 2, 2006" }}
-
- {{ end }} - -
-
-
-
+
+ +
+
+
+

{{ T "home-hero-title" }}

+

{{ T "home-hero-heading" }}

+

{{ T "home-hero-subheading" }}

{{ end }} @@ -154,6 +135,32 @@

{{ end }} +{{ define "quotes-section" }} +
+
+ {{ T "home-quotes-title" }} +
+ +
+ {{ $data := index $.Site.Data .Site.Language.Lang }} + {{ range $quote := $data.quotes }} + {{ partial "quotes/quote.html" (dict "icon" $quote.icon "text" $quote.text "logoUrl" $quote.logoUrl) }} + {{ end }} +
+ + {{/* + The id "my-keen-slider" and "dots" should be named as defaults to make the external library (Keen Slider) works well + */}} +
+ {{ $data := index $.Site.Data .Site.Language.Lang }} + {{ range $quote := $data.quotes }} + {{ partial "quotes/quote-mobile.html" (dict "icon" $quote.icon "text" $quote.text "logoUrl" $quote.logoUrl) }} + {{ end }} +
+
+
+{{ end }} + {{ define "logos-section" }}
@@ -169,38 +176,6 @@

{{ end }} -{{ define "cards-section" }} -
-
-
- {{ T "home-cards-title" }} -
-
- {{ $data := index $.Site.Data .Site.Language.Lang }} - {{ range $card := $data.cards }} -
-
- {{ $card.quote }} -
-
- {{/* TODO: Implement icons (Original comment from Jekyll) -
-
- */}} -
- {{ $card.name }} -
-
-
- {{ end }} -
-
- {{ T "home-cards-body" }} {{ T "home-contribute" }} {{ T "home-section" }}. -
-
-
-{{ end }} - {{ define "ctas-section" }}
diff --git a/website/www/site/layouts/partials/header.html b/website/www/site/layouts/partials/header.html index 73c9867acffc..af8417087c20 100644 --- a/website/www/site/layouts/partials/header.html +++ b/website/www/site/layouts/partials/header.html @@ -10,18 +10,18 @@ limitations under the License. See accompanying LICENSE file. */}} -
@@ -97,28 +118,44 @@ - + + diff --git a/website/www/site/layouts/partials/section-menu/en/community.html b/website/www/site/layouts/partials/section-menu/en/community.html index cbefd010143a..2034d12c8b62 100644 --- a/website/www/site/layouts/partials/section-menu/en/community.html +++ b/website/www/site/layouts/partials/section-menu/en/community.html @@ -9,7 +9,6 @@ See the License for the specific language governing permissions and limitations under the License. See accompanying LICENSE file. */}} -
  • Community
  • Integrations
  • Contact Us
  • @@ -31,3 +30,4 @@ width="14" height="14" alt="External link to Beam roster"> + diff --git a/website/www/site/layouts/shortcodes/community/list_with_icons.html b/website/www/site/layouts/shortcodes/community/list_with_icons.html new file mode 100644 index 000000000000..fe0ca575c210 --- /dev/null +++ b/website/www/site/layouts/shortcodes/community/list_with_icons.html @@ -0,0 +1,28 @@ +{{/* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. See accompanying LICENSE file. + */}} + +{{ $data := index $.Site.Data .Site.Language.Lang (.Get 0) }} +
    + {{ range $item := $data }} +
    +
    + {{ with resources.Get .icon }} + {{ .Content | safeHTML }} + {{ end }} +
    +
    +

    {{ .title }}

    +

    {{ .body | safeHTML }}

    +
    +
    + {{ end }} +
    diff --git a/website/www/site/layouts/shortcodes/community/table_with_icons.html b/website/www/site/layouts/shortcodes/community/table_with_icons.html new file mode 100644 index 000000000000..d136493e2c1f --- /dev/null +++ b/website/www/site/layouts/shortcodes/community/table_with_icons.html @@ -0,0 +1,53 @@ +{{/* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. See accompanying LICENSE file. +*/}} +{{ $data := index $.Site.Data .Site.Language.Lang (.Get 0) }} +{{ range $list := $data }} +
    + + + {{ range $item := $list.columns }} + + {{ end }} + + {{ range $item := $list.data }} + + + + + + {{ end }} +
    {{ . }}
    +
    + {{ with resources.Get .icon }} + {{ .Content | safeHTML }} + {{ end }} +

    {{.purpose | safeHTML}}

    +
    +
    + + {{ if .contact.add }} + {{ .contact.add }} + {{end}} + {{.contact.email}} + +
    + {{ range .actions }} + {{ if .link }} + {{.action |safeHTML }} + {{ else }} + {{ .action | safeHTML }} + {{end}} + {{ end }} +
    +
    +
    +{{ end }} diff --git a/website/www/site/static/images/beam_logo_navbar_mobile.png b/website/www/site/static/images/beam_logo_navbar_mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..bbc0ffe0edc7c0e4ad580dfe1eec876788db4c39 GIT binary patch literal 1497 zcmV;~1t$85P)r3AFqT;zTe&Qm#9nL31Mu6mYIZIcA=-_46qPFTiu)V7Q76wNCrUEnx{R8RB$gW68hsN{g3Ss zSak3OWH86k>`<2GU=>57!)6zG;d#D<60rcB+7u4o*6>dH1SM#TKzQf+{)f4yDS{m(V=on8G4t}o3sFg zjPZ3b#I`U|Tsyy|aqKEu`;LKuaFzwZs&bN`w9RU4&ga@9iNr=~`A$ZHM13tw9UER6 z?%RwIX%5!b2$^Q)q&KoK5!j8uF7XRwQX=* zauGzDrD4xfBp>dF@yL1}Yc8z>SypZs2;ph6>OugdQL{SjQe!jNH>f=yQmYlUELMaU z{JmxqdK2_S7s};*&^t6=>oW?Vq2M0E4*Gezm9QQVYgU7Wi;*T^f)yd}X&$7g6<>4I z(Xs2{Rb8HD?UF-a>6M4mw4rCA=4{sGx@MNO%W0;eQ99Zw_L=jmOutqM%4Si+>~=A) znmRPwuK_C+45B(G-W-H8-?j_LU@Cy-xtdjt59;Om;QbkQeKTQL^A2a!xS$8wN4`h( zuecBD)v?}Guj=wl!gAIAD|@UtUtE_OuEHLhLUq_e^$3sb*_z@=Ma!uH2O7?rmF;0m zwj5SfnD|fGgkw8q!To0rfAQ*Aj++Las=A-8{bu6#u(ewPtE%*lAsgnf4eO)}cS=Q= z6ae!G_xE_Y^u~3l9|f>bScgX`^Elg40*)$vax^TCQhU#q&8@e6mp>k5e8aGhuY=0& zj9b>2r@aUoyhu2sOvnQz$Nu2Q@rhk89Do&dZsY%$0*MY*#2z zuvz6Q%RW}ptv|D+!ijqusAJpGmbSFzDwcl%tBM(%g<%ci00000NkvXXu0mjfa?Z!q literal 0 HcmV?d00001 diff --git a/website/www/site/static/js/section-nav.js b/website/www/site/static/js/section-nav.js index 1d40720f2202..34b3d59add23 100644 --- a/website/www/site/static/js/section-nav.js +++ b/website/www/site/static/js/section-nav.js @@ -101,15 +101,23 @@ $(document).ready(function () { var sectionNavHeight = $(sectionNavEl).height(); var mainContent = $(".container-main-content"); - mainContent.css({"min-height": sectionNavHeight}); - sectionNavEl.css({"max-height": mainContent.css("height")}); - + $(window).load(function () { + var url = window.location.href; + var links = $("." + idSectionNav+' a'); + for(var i = 0; i < links.length; i++){ + if(links[i].classList.contains('underline')) + links[i].removeClass('underline'); + } + for(var i = 0; i < links.length; i++){ + if(url.includes(links[i].href)) + links[i].classList.add('underline'); + } + }); $(window).resize(function () { if ($(window).width() > CONST.DESKTOP_BREAKPOINT) { var sectionNavHeight = $(sectionNavEl).height(); - $(".container-main-content").css({"min-height": sectionNavHeight}); } else { - $(".container-main-content").css({"min-height": ''}); + $(".container-main-content").css({"min-height": '100vh'}); } }); @@ -133,9 +141,20 @@ $(document).ready(function () { $("." + _self.idNavMask).click(function (el) { $("." + _self.idNavMask).removeClass(CONST.OPEN_CLASS); $("." + _self.idContainer).removeClass(CONST.OPEN_CLASS); + $("body").removeClass("fixedPosition"); + if (_self.hasSectionNav) { + $("." + _self.idSectionNav).removeClass(CONST.OPEN_CLASS); + $("body").removeClass("fixedPosition"); + } + }); + $("#closeMenu").click(function (el) { + $("." + _self.idNavMask).removeClass(CONST.OPEN_CLASS); + $("." + _self.idContainer).removeClass(CONST.OPEN_CLASS); + $("body").removeClass("fixedPosition"); if (_self.hasSectionNav) { $("." + _self.idSectionNav).removeClass(CONST.OPEN_CLASS); + $("body").removeClass("fixedPosition"); } }); @@ -166,7 +185,7 @@ $(document).ready(function () { "classNameContainer": "navbar-container", "classNameSectionNav": "section-nav", "classNameBackCTA": "section-nav-back", - "classNameCTA": "navbar-toggle", + "classNameCTA": "menu-open", "classNameMask": "navbar-mask", "classNameNavItemTitleCollapsible": "section-nav-item--collapsible span", "classNameNavItemCollapsible": ".section-nav-item--collapsible", From ec621f9243cffc458450388529e1d4ec08fd07c4 Mon Sep 17 00:00:00 2001 From: Jakub-Sadowski Date: Wed, 3 Feb 2021 19:08:08 +0100 Subject: [PATCH 05/12] [BEAM-11518-11509-11470][Website revamp] Implemented searchbar, join beam page and navigations (#13718) * init * fix * delete node modules * hero fix on mobiles * delete code_samples * changes' * Add copy to join beam * delete whitespace * fix * fix list * join beam * update copy of join bema * fix * Update website/www/site/content/en/community/join-beam.md Co-authored-by: Brian Hulette * Update website/www/site/data/en/join_beam.yaml Co-authored-by: Brian Hulette * Update website/www/site/data/en/join_beam.yaml Co-authored-by: Brian Hulette * Update website/www/site/data/en/join_beam.yaml Co-authored-by: Brian Hulette * Update website/www/site/data/en/join_beam.yaml Co-authored-by: Brian Hulette * Update website/www/site/data/en/join_beam.yaml Co-authored-by: Brian Hulette Co-authored-by: Brian Hulette --- website/www/site/assets/icons/close-icon.svg | 22 + website/www/site/assets/icons/edit-icon.svg | 22 + website/www/site/assets/icons/search-icon.svg | 22 + website/www/site/assets/scss/_global.sass | 88 ++- .../www/site/assets/scss/_hero-mobile.scss | 4 +- website/www/site/assets/scss/_lists.scss | 534 +++++++++--------- website/www/site/assets/scss/_media.scss | 8 +- .../www/site/assets/scss/_navbar-mobile.sass | 6 +- website/www/site/assets/scss/_page-nav.sass | 62 -- website/www/site/assets/scss/_page-nav.scss | 103 ++++ website/www/site/assets/scss/_search.scss | 124 ++-- .../www/site/assets/scss/_section-nav.scss | 144 +++++ website/www/site/assets/scss/main.scss | 6 +- .../site/content/en/community/join-beam.md | 46 ++ website/www/site/data/en/join_beam.yaml | 29 + website/www/site/layouts/partials/head.html | 24 +- .../partials/section-menu/en/community.html | 1 + .../community/join_beam_columns.html | 44 ++ .../site/static/images/arrow-expandable.svg | 22 + .../www/site/static/images/ellipse-mobile.svg | 22 + website/www/site/static/images/ellipse.svg | 22 + .../www/site/static/js/hero/hero-mobile.js | 6 +- website/www/site/static/js/page-nav.js | 70 ++- website/www/site/static/js/section-nav.js | 4 +- 24 files changed, 1022 insertions(+), 413 deletions(-) create mode 100644 website/www/site/assets/icons/close-icon.svg create mode 100644 website/www/site/assets/icons/edit-icon.svg create mode 100644 website/www/site/assets/icons/search-icon.svg delete mode 100644 website/www/site/assets/scss/_page-nav.sass create mode 100644 website/www/site/assets/scss/_page-nav.scss create mode 100644 website/www/site/assets/scss/_section-nav.scss create mode 100644 website/www/site/content/en/community/join-beam.md create mode 100644 website/www/site/data/en/join_beam.yaml create mode 100644 website/www/site/layouts/shortcodes/community/join_beam_columns.html create mode 100644 website/www/site/static/images/arrow-expandable.svg create mode 100644 website/www/site/static/images/ellipse-mobile.svg create mode 100644 website/www/site/static/images/ellipse.svg diff --git a/website/www/site/assets/icons/close-icon.svg b/website/www/site/assets/icons/close-icon.svg new file mode 100644 index 000000000000..7a07561031f1 --- /dev/null +++ b/website/www/site/assets/icons/close-icon.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/website/www/site/assets/icons/edit-icon.svg b/website/www/site/assets/icons/edit-icon.svg new file mode 100644 index 000000000000..0832bba986b7 --- /dev/null +++ b/website/www/site/assets/icons/edit-icon.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/website/www/site/assets/icons/search-icon.svg b/website/www/site/assets/icons/search-icon.svg new file mode 100644 index 000000000000..d01a19658e8e --- /dev/null +++ b/website/www/site/assets/icons/search-icon.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/website/www/site/assets/scss/_global.sass b/website/www/site/assets/scss/_global.sass index 5d8367e45a7c..9c62feea862d 100644 --- a/website/www/site/assets/scss/_global.sass +++ b/website/www/site/assets/scss/_global.sass @@ -26,17 +26,22 @@ body .body background: #fff margin: 0 auto - + .no__padding + padding: 0 &:not(.body--index) .body__contained @media (max-width: $ak-breakpoint-lg) padding: 0 padding: 0 30px max-width: 1280px - + figure img width: 100% + .center + margin: 0 auto + .content-up + margin-top: -20px !important .section &:not(.section--wide) @@ -52,6 +57,20 @@ body a color: $color-brand +.body__section-no-nav + margin-left: 256px + //width: calc(100% - 380px) + + > [id]:before + content: '' + display: block + height: 82px // fixed header height + margin: -82px 0 0 // negative fixed header height + + @media (max-width: $ak-breakpoint-lg) + margin-left: 0 + width: 100% + .body__section-nav margin-left: 256px width: calc(100% - 492px) @@ -69,11 +88,70 @@ body .container-main-content @media (max-width: $ak-breakpoint-lg) padding: 0 24px - + min-height: 100vh padding: 0 22px position: relative background-color: #fff - margin-top: 85px + margin-top: 64px - @media (min-width: $tablet) + @media (min-width: $tablet) margin-top: 0 +.desktop + @media (max-width: $ak-breakpoint-lg) + display: none !important +.mobile + display: none + @media (max-width: $ak-breakpoint-lg) + display: block + +.code-snippet, pre + background:rgba(255, 109, 0, 0.03) !important + border-radius: 8px + border-top-left-radius: 0; + border: solid 0.6px #ff6d05 + font-family: Menlo + font-size: 16px + font-weight: normal + line-height: 1.63 + letter-spacing: 0.43px + padding: 24px + max-width: 848px + position: relative + + pre + border: none + padding: 0 + margin-top: 36px + a + float: right + margin-left: 12px + img + &:hover + opacity: 0.7 + filter: alpha(opacity=70) + cursor: pointer + +.snippet + max-width: 848px + margin-bottom: 40px + .git-link + float: right + font-size: 16px + font-weight: normal + line-height: 1.63 + letter-spacing: 0.43px + color: #8c8b8e + .without_switcher + border-top-left-radius: 8px + pre + background: initial !important + +table + margin-top: 24px + margin-bottom: 24px + th + min-width: 80px + padding-right: 12px + +.underline + text-decoration: underline diff --git a/website/www/site/assets/scss/_hero-mobile.scss b/website/www/site/assets/scss/_hero-mobile.scss index 343c279f4c90..b3db3d1cd4b9 100644 --- a/website/www/site/assets/scss/_hero-mobile.scss +++ b/website/www/site/assets/scss/_hero-mobile.scss @@ -21,7 +21,9 @@ position: relative; margin-bottom: 0; display: none; - + width: 100%; + height: calc(100% - 96px); + min-height: 300px; .hero-content { position: absolute; z-index: 1; diff --git a/website/www/site/assets/scss/_lists.scss b/website/www/site/assets/scss/_lists.scss index c2bdc03d6ef6..38763e5fd33c 100644 --- a/website/www/site/assets/scss/_lists.scss +++ b/website/www/site/assets/scss/_lists.scss @@ -14,272 +14,284 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@import "media"; + @import "media"; -.arrow-list { - margin-top: 26px; - h3 { - max-width: 555px; - } - ul { - font-size: 16px; - font-weight: normal; - line-height: 1.63; - letter-spacing: 0.43px; - position: relative; - padding-left: 26px; - li::marker { - content: "\2192"; - color: #ff6d05; - font-size: 24px; - } - li { - list-style-type: none; - list-style-position: outside; - padding-left: 8px; - margin-bottom: -2px; - } - li:last-of-type { - margin-bottom: 25px; - } - } - figure { - width: 112px; - height: 112px; - margin-top: 64px; - } - a { - color: #333333; - } -} + .arrow-list { + margin-top: 26px; + h3 { + max-width: 555px; + } + ul { + font-size: 16px; + font-weight: normal; + line-height: 1.63; + letter-spacing: 0.43px; + position: relative; + padding-left: 26px; + li::marker { + content: "\2192"; + color: #ff6d05; + font-size: 24px; + } + li { + list-style-type: none; + list-style-position: outside; + padding-left: 8px; + margin-bottom: -2px; + } + li:last-of-type { + margin-bottom: 25px; + } + } + figure { + width: 112px; + height: 112px; + margin-top: 64px; + } + a { + color: #333333; + } + } -.arrow-list-header { - color: #333333; - text-decoration: none; - display: flex; - max-height: 40px; - margin-bottom: 74px; - &:hover { - cursor: default; - text-decoration: none; - } - @media (max-width: $mobile) { - margin-bottom: 50px; - &:hover { - cursor: pointer; - text-decoration: underline; - } - h2 { - font-size: 24px; - line-height: 1.25; - font-weight: 500; - letter-spacing: normal; - margin-top: 46px; - } - } - figure { - margin-top: 40px; - margin-right: 5px; - width: auto; - height: auto; - @media (min-width: $mobile) { - display: none; - } - img { - width: 18px; - height: 18px; - padding-right: 16px; - transform: rotate(-90deg); - } - } -} -.rotate { - img { - transform: rotate(0deg) !important; - margin-top: 10px; - } -} -.list { - margin-top: 32px; - max-width: 640px; -} -.icon-list { - .list-item { - display: flex; - margin-bottom: 38px; - position: relative; + .arrow-list-header { + color: #333333; + text-decoration: none; + display: flex; + max-height: 40px; + margin-bottom: 74px; + &:hover { + cursor: default; + text-decoration: none; + } + @media (max-width: $mobile) { + margin-bottom: 50px; + &:hover { + cursor: pointer; + text-decoration: underline; + } + h2 { + font-size: 24px; + line-height: 1.25; + font-weight: 500; + letter-spacing: normal; + margin-top: 46px; + } + } + figure { + margin-top: 40px; + margin-right: 5px; + width: auto; + height: auto; + @media (min-width: $mobile) { + display: none; + } + img { + width: 18px; + height: 18px; + padding-right: 16px; + transform: rotate(-90deg); + } + } + } + .rotate { + img { + transform: rotate(0deg) !important; + margin-top: 10px; + } + } + .icon-list { + .list-item { + display: flex; + margin-bottom: 8px; + position: relative; + @media (max-width: $tablet) { + margin-bottom: 43px; + } + img { + position: absolute; + top: 7px; + z-index: 2; + } + .reverse { + transform: rotate(-180deg); + } - img { - position: absolute; - top: 7px; - z-index: 2; - } - .reverse { - transform: rotate(-180deg); - } + .cirkle { + width: 24px; + height: 24px; + background: #ff6d05; + border-radius: 50%; + text-align: center; + z-index: 5; + position: relative; + i { + vertical-align: bottom; + color: #fff; + } + } + .list-item-icon { + width: 44px; + height: 44px; + display: block; + margin-right: 25px; + } + .list-item-header { + font-size: 22px; + font-weight: 500; + letter-spacing: normal; + line-height: 1.36; + margin-top: 10px; + a { + color: #333333; + } + @media (max-width: $mobile) { + font-weight: 500; + } + } + .list-item-description { + @media (max-width: $mobile) { + position: absolute; + left: 55px; + } + } + } + .pillars-item { + display: flex; + align-items: center; + margin-bottom: 14px; + .pillars-item-icon { + margin-right: 28px; + } - .cirkle { - width: 24px; - height: 24px; - background: #ff6d05; - border-radius: 50%; - text-align: center; - z-index: 5; - position: relative; - i { - vertical-align: bottom; - color: #fff; - } - } - .list-item-icon { - width: 44px; - height: 44px; - display: block; - margin-right: 25px; - } - .list-item-header { - font-size: 22px; - font-weight: 500; - letter-spacing: normal; - line-height: 1.36; - margin-top: 10px; - a { - color: #333333; - } - @media (max-width: $mobile) { - font-weight: 500; - } - } - .list-item-description { - @media (max-width: $mobile) { - position: absolute; - left: 55px; - } - } - } - .pillars-item { - display: flex; - align-items: center; - margin-bottom: 14px; - .pillars-item-icon { - margin-right: 28px; - } + .pillars-item-description { + width: 100%; + max-width: 684px; - .pillars-item-description { - width: 100%; - max-width: 684px; + .pillars-item-header { + font-size: 16px; + font-weight: bold; + line-height: 1.2; + letter-spacing: 0.43px; + margin-bottom: 6px; + margin-top: 10px; + } - .pillars-item-header { - font-size: 16px; - font-weight: bold; - line-height: 1.2; - letter-spacing: 0.43px; - margin-bottom: 6px; - margin-top: 10px; - } + .pillars-item-text { + font-size: 14px; + font-weight: normal; + line-height: 1.57; + letter-spacing: 0.43px; + } + } + } + } + .documentation-list { + padding-left: 12px; + display: flex; + flex-direction: row; + justify-content: space-between; + flex-wrap: wrap; + max-width: 895px; + .row { + display: flex; + flex-direction: column; + margin-top: 63px; + @media (max-width: $mobile) { + max-width: 260px; + } - .pillars-item-text { - font-size: 14px; - font-weight: normal; - line-height: 1.57; - letter-spacing: 0.43px; - } - } - } -} -.documentation-list { - padding-left: 12px; - display: flex; - flex-direction: row; - justify-content: space-between; - flex-wrap: wrap; - max-width: 895px; - .row { - display: flex; - flex-direction: column; - margin-top: 63px; - @media (max-width: $mobile) { - max-width: 260px; - } + .item-icon { + height: 93px; + max-width: 260px; + display: flex; + align-items: center; + @media (max-width: $mobile) { + justify-content: center; + } + } + a { + font-size: 16px; + font-weight: bold; + line-height: 1.63; + letter-spacing: 0.43px; + color: #333333; + } + .item-description { + max-width: 260px; + margin-right: 32px; + margin-top: 20px; + @media (max-width: $mobile) { + margin-right: 0; + width: auto; + } + } + } + } + .sdks { + max-width: 635px; + .column { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + } + .row { + margin-top: 48px; + .item-description { + margin-right: 0; + } + } + } + .collapsable-list { + margin: 52px 0; + a { + font-size: 14px; + font-weight: bold; + font-stretch: normal; + font-style: normal; + line-height: 1.14; + letter-spacing: 0.6px; + color: #f26628; + } + li { + a { + font-size: 16px; + line-height: 1.63; + letter-spacing: 0.43px; + color: #333333; + } + } + } + .mobile-column { + @media (max-width: $mobile) { + flex-direction: column; + align-items: center; + text-align: center; + } + } + .margin-50 { + margin-top: 50px; + } + @media (min-width: 768px) { + .arrow-list { + .collapse.dont-collapse-sm { + display: block; + height: auto !important; + visibility: visible; + } + } + } + .beam-list { + margin-top: 32px; + .beam-title { + margin-bottom: 4px; + font-weight: bold; + } + .beam-description { + margin: 0; + font-size: 14px; + line-height: 22px; + height: 44px; + } + } - .item-icon { - height: 93px; - max-width: 260px; - display: flex; - align-items: center; - @media (max-width: $mobile) { - justify-content: center; - } - } - a { - font-size: 16px; - font-weight: bold; - line-height: 1.63; - letter-spacing: 0.43px; - color: #333333; - } - .item-description { - max-width: 260px; - margin-right: 32px; - margin-top: 20px; - @media (max-width: $mobile) { - margin-right: 0; - width: auto; - } - } - } -} -.sdks { - max-width: 635px; - .column { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - } - .row { - margin-top: 48px; - .item-description { - margin-right: 0; - } - } -} -.collapsable-list { - margin: 52px 0; - a { - font-size: 14px; - font-weight: bold; - font-stretch: normal; - font-style: normal; - line-height: 1.14; - letter-spacing: 0.6px; - color: #f26628; - } - li { - a { - font-size: 16px; - line-height: 1.63; - letter-spacing: 0.43px; - color: #333333; - } - } -} -.mobile-column { - @media (max-width: $mobile) { - flex-direction: column; - align-items: center; - text-align: center; - } -} -.margin-50 { - margin-top: 50px; -} -@media (min-width: 768px) { - .arrow-list { - .collapse.dont-collapse-sm { - display: block; - height: auto !important; - visibility: visible; - } - } -} diff --git a/website/www/site/assets/scss/_media.scss b/website/www/site/assets/scss/_media.scss index b1146a520163..0365663590e7 100644 --- a/website/www/site/assets/scss/_media.scss +++ b/website/www/site/assets/scss/_media.scss @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -$mobile: 640px; -$tablet: 1280px; -$fullhd: 1920px; + + $mobile: 640px; + $tablet: 1024px; + $fullhd: 1920px; diff --git a/website/www/site/assets/scss/_navbar-mobile.sass b/website/www/site/assets/scss/_navbar-mobile.sass index 198ced5f9443..4c9a2a528808 100644 --- a/website/www/site/assets/scss/_navbar-mobile.sass +++ b/website/www/site/assets/scss/_navbar-mobile.sass @@ -25,9 +25,9 @@ .navbar-nav > li > a text-transform: uppercase .navbar-link - font-size: 16px - font-weight: 500 - line-height: normal + font-size: 16px; + font-weight: 500; + line-height: normal; letter-spacing: normal .navbar-header float: none diff --git a/website/www/site/assets/scss/_page-nav.sass b/website/www/site/assets/scss/_page-nav.sass deleted file mode 100644 index 542a4222b20a..000000000000 --- a/website/www/site/assets/scss/_page-nav.sass +++ /dev/null @@ -1,62 +0,0 @@ -/*! - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -.page-nav - border-left: 3px solid $color-brand - overflow-y: auto - max-height: calc(100vh - 130px) - padding: 0 15px - position: fixed - width: 240px - - li - display: block - width: 100% - - a - color: $color-dark - display: block - font-size: 12px - padding: 5px - - span - font-size: 12 - - ul - padding-left: 20px - - .nav - > li.active - a - text-decoration: underline - - @media (max-width: $ak-breakpoint-lg) - margin-top: 0 - max-height: initial - right: 0 - padding: 0 30px - position: relative - width: 100% - - #TableOfContents - > ul - padding-left: 0 - margin-bottom: 0 - ul - padding-left: 20 - ul - display: none diff --git a/website/www/site/assets/scss/_page-nav.scss b/website/www/site/assets/scss/_page-nav.scss new file mode 100644 index 000000000000..579da31f2b54 --- /dev/null +++ b/website/www/site/assets/scss/_page-nav.scss @@ -0,0 +1,103 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + @import "media"; + +.page-nav { + overflow-y: auto; + max-height: calc(100vh - 130px); + position: fixed; + width: 248px; + margin-left: 30px; + li { + display: block; + width: 100%; + min-height: 36px; + a { + color: #37424b; + display: block; + font-size: 12px; + padding: 5px; + letter-spacing: .43px; + } + span { + font-size: 12px; + } + ul { + padding-left: 20px; + } + } + .nav { + img { + height: 14px; + width: 10px; + vertical-align: text-bottom; + transition: .3s; + margin-right: 8px; + } + .rotate { + transform: rotate(-90deg); + transition: .3s; + } + >li { + padding: 0 15px; + border-left: 3px solid #d8d8d8; + } + .chosen { + position: relative; + ::before { + content: ''; + position: absolute; + top: -1px; + left: -18px; + height: 100%; + min-height: 36px; + border-left: 3px solid #ff6d05; + } + a { + text-decoration: underline; + font-weight: 500; + } + } + .active .chosen ::before { + left: -38px; + } + } + #TableOfContents>ul { + margin-bottom: 0; + } +} + +.page-nav .nav>li>:hover { + border-radius: 8px +} + +.page-nav .nav>li>ul>li>:hover { + border-radius: 8px; + background-color: #f2f2f2; + text-decoration: none +} + +@media(max-width: $ak-breakpoint-lg) { + .page-nav { + margin-top: 0; + max-height: initial; + right: 0; + padding: 0 30px; + position: relative; + width: 100% + } +} diff --git a/website/www/site/assets/scss/_search.scss b/website/www/site/assets/scss/_search.scss index a035df1566eb..3da3c40fdb00 100644 --- a/website/www/site/assets/scss/_search.scss +++ b/website/www/site/assets/scss/_search.scss @@ -12,70 +12,70 @@ limitations under the License. */ .searchBar { - width: 297px; - margin-right: 30px; - display: flex; - align-items: center; - table { - margin: 0; - } - div { - padding: 0; - svg { - padding-top: 2px; - } - } - .gsc-search-button { - display: none; - } - #__gcse_1 { - max-width: 213px; - } - .gsib_b { - display: none; - } - .gsc-input-box { - border-radius: 100px; - background-color: #f1f1f2; - table { - margin: 0; - } - input { - background-color: #f1f1f2; - min-width: 213px; - font-size: 12px; - font-weight: 400; - line-height: 1.83; - letter-spacing: normal; - } - } + width: 297px; + margin-right: 30px; + display: flex; + align-items: center; + table { + margin: 0; + } + div { + padding: 0; + svg { + padding-top: 2px; + } + } + .gsc-search-button { + display: none; + } + #__gcse_1 { + max-width: 213px; + } + .gsib_b { + display: none; + } + .gsc-input-box { + border-radius: 100px; + background-color: #f1f1f2; + table { + margin: 0; + } + input { + background-color: #f1f1f2; + min-width: 213px; + font-size: 12px; + font-weight: 400; + line-height: 1.83; + letter-spacing: normal; + } + } } .disappear { - display: none !important; + display: none !important; } .searchBar-mobile { - width: 100%; - table { - margin: 0; - } - .gsc-input-box { - border-radius: 100px; - max-height: 36px; - background-color: #f1f1f2; - padding-top: 2px; - input { - background-color: #f1f1f2; - transform: translateY(-2px); - } - } - .gsc-search-button { - background-color: #fff; - border: none; - svg { - fill: #ff6d00; - } - &:focus { - background-color: #fff; - } - } + width: 100%; + table { + margin: 0; + } + .gsc-input-box { + border-radius: 100px; + max-height: 36px; + background-color: #f1f1f2; + padding-top: 2px; + input { + background-color: #f1f1f2; + transform: translateY(-2px); + } + } + .gsc-search-button { + background-color: #fff; + border: none; + svg { + fill: #ff6d00; + } + &:focus { + background-color: #fff; + } + } } diff --git a/website/www/site/assets/scss/_section-nav.scss b/website/www/site/assets/scss/_section-nav.scss new file mode 100644 index 000000000000..8e1e897285e8 --- /dev/null +++ b/website/www/site/assets/scss/_section-nav.scss @@ -0,0 +1,144 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +.section-nav { + max-width: 250px; + position: absolute; + width: 100%; + overflow-y: auto; + background-color: #fbfbfb; + border-radius: 8px; + .section-nav-list-main-title { + margin-top: 33px; + } + .section-nav-back { + padding: 23px 0 23px 31px; + background-color: #fbfbfb; + &:before { + height: 18px; + color: #ff6d00; + } + } + nav { + padding: 15px; + ul { + list-style: none; + } + li { + margin-bottom: 5px; + &:last-child { + margin-bottom: 0; + } + } + .section-nav-list { + padding-left: 16px; + } + a { + font-size: 12px; + color: #757575; + font-weight: 500; + line-height: 1.83; + letter-spacing: .43px; + } + .active { + text-decoration: underline; + border-radius: 8px; + background-color: #f2f2f2; + } + } + .expanded { + >span { + &:before { + transform: rotate(90deg); + } + } + } +} +.section-nav-back { + display: none; + padding: 15px; +} +.section-nav-list-title { + display: block; + font-size: 12px; + position: relative; + margin-bottom: 5px; + font-weight: 700; + line-height: 1.83; + letter-spacing: .43px; +} +.section-nav-list-title--collapsible { + cursor: pointer; +} +.section-nav-list-main-title { + display: block; + font-size: 18px; + font-weight: 700; + line-height: normal; + letter-spacing: 1px; + margin-bottom: 32px; + text-transform: uppercase; +} +.section-nav-item--collapsible { + cursor: pointer; + .section-nav-list { + display: none; + } + span { + &:before { + content: ""; + position: absolute; + top: 4px; + left: -16px; + border-style: solid; + border-width: 5px 0 5px 8px; + border-color: transparent transparent transparent #ff6d00; + transform: rotate(0deg); + transition: .3s; + } + } +} +@media (max-width:1024px) { + .section-nav { + nav { + background-color: #fff; + max-height: 100vh; + height: calc(100vh - 44px); + overflow-y: auto; + } + background-color: #f7f7f7; + bottom: 0; + right: 0; + max-width: 303px; + position: fixed; + top: 0; + transition: transform 100ms linear; + transition: transform 100ms linear, -webkit-transform 100ms linear, -o-transform 100ms linear; + width: calc(100% - 72px); + border-radius: 0; + z-index: 10000; + padding: 0; + } + .section-nav-back { + display: block; + } + .section-nav.closed { + transform: translateX(100%); + } + .section-nav.open { + transform: translateX(0); + } +} diff --git a/website/www/site/assets/scss/main.scss b/website/www/site/assets/scss/main.scss index b38b7e8a9736..654adbcdd637 100644 --- a/website/www/site/assets/scss/main.scss +++ b/website/www/site/assets/scss/main.scss @@ -39,11 +39,11 @@ @import "_hero-mobile.scss"; @import "_logos.scss"; @import "_pillars.scss"; -@import "_section-nav.sass"; -@import "_page-nav.sass"; +@import "_section-nav.scss"; +@import "_page-nav.scss"; @import "_table-wrapper.scss"; @import "_calendar.scss"; -@import "_lists.scss"; @import "_quotes.scss"; @import "_navbar-desktop.scss"; +@import "_lists.scss"; @import "_search.scss"; diff --git a/website/www/site/content/en/community/join-beam.md b/website/www/site/content/en/community/join-beam.md new file mode 100644 index 000000000000..db65498f1307 --- /dev/null +++ b/website/www/site/content/en/community/join-beam.md @@ -0,0 +1,46 @@ +--- +title: "Join Beam Community" +aliases: + - /community/ + - /use/issue-tracking/ + - /use/mailing-lists/ + - /get-started/support/ +--- + + + +# Join Beam Community! + +We’re so glad you want to join the Apache Beam community. Here’s a pathway you can follow to help you get started. This is not the only way to join, but it’s the recommended progression so you’re successful at reaching your objectives. + +## Join the Conversation + +{{< community/join_beam_columns number-of-data="0" >}} + +## Contribute to the Project + +{{< community/join_beam_columns number-of-data="1" >}} + +## Become a committer + +{{< community/join_beam_columns number-of-data="2" >}} + +## Become a PMC member + +{{< community/join_beam_columns number-of-data="3" >}} + +## Still have questions? + +Send us a note at user@beam.apache.org OR mention @ApacheBeam on Twitter OR ask us in the #beam slack channel. We look forward to seeing you in the community! diff --git a/website/www/site/data/en/join_beam.yaml b/website/www/site/data/en/join_beam.yaml new file mode 100644 index 000000000000..380b4d92b1ff --- /dev/null +++ b/website/www/site/data/en/join_beam.yaml @@ -0,0 +1,29 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +- list: + - { title: Mailing Lists, description: 'Join the official Apache Beam user and developer mailing lists. Learn how here' } + - { title: Slack Channel, description: 'For real-time communication, join us on the #beam channel in the ASF workspace.' } + - { title: Twitter account, description: 'Follow @ApacheBeam on Twitter for the most recent news on the project and community!' } + - { title: YouTube channel, description: 'Follow our YouTube channel for the latest training and use cases.' } + - { title: StackOverflow, description: 'Ask your Beam questions in StackOverflow using the apache-beam tag.' } + - { title: Events, description: 'Follow our calendar in the homepage which has the latest events organized by the community.' } +- list: + - { title: Read our Contribution Guide and Policies, description: 'Get familiar with our contribution guide and policies.' } + - { title: Create a Jira account, description: 'Create a Jira account and send an email to dev@beam.apache.org to request comitter permissions.' } + - { title: Find an area to contribute, description: 'Beam recognizes code and non-code contributions. Check out this Jira board for some inspiration.' } + - { title: Contribute, description: 'To contribute code, you need to sign an Individual Contributor License Agreement (ICLA). Learn more here.' } + - { title: Stay engaged!, description: Finds ways to stay engaged in the project and community and help us shape it’s strategy and vision. } +- list: + - { title: Learn about Apache Beam Committers, description: 'Read how to become a committer to learn about ways to get nominated for committership.' } +- list: + - { title: Learn about the Project Management Committee (PMC), description: 'The Project Management Committee (PMC) is the highest recognition in Apache projects. If you’re interested in becoming part of it, learn more about it here.' } diff --git a/website/www/site/layouts/partials/head.html b/website/www/site/layouts/partials/head.html index c017268175e8..06862d76a911 100644 --- a/website/www/site/layouts/partials/head.html +++ b/website/www/site/layouts/partials/head.html @@ -1,4 +1,4 @@ -{{/* +{{/* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at @@ -9,16 +9,16 @@ See the License for the specific language governing permissions and limitations under the License. See accompanying LICENSE file. */}} - + {{ if .Title }}{{ .Title }}{{ else }}{{ .Site.Title }}{{ end }} - + - + {{ $scssMain := "scss/main.scss"}} {{ if .Site.IsServer }} {{ $css := resources.Get $scssMain | toCSS (dict "enableSourceMap" true) | postCSS }} @@ -45,7 +45,7 @@ - + \ No newline at end of file + + + + diff --git a/website/www/site/layouts/partials/section-menu/en/community.html b/website/www/site/layouts/partials/section-menu/en/community.html index 2034d12c8b62..cd5104ea4313 100644 --- a/website/www/site/layouts/partials/section-menu/en/community.html +++ b/website/www/site/layouts/partials/section-menu/en/community.html @@ -10,6 +10,7 @@ limitations under the License. See accompanying LICENSE file. */}}
  • Community
  • +
  • Join Beam Communnity
  • Integrations
  • Contact Us
  • Policies
  • diff --git a/website/www/site/layouts/shortcodes/community/join_beam_columns.html b/website/www/site/layouts/shortcodes/community/join_beam_columns.html new file mode 100644 index 000000000000..bc0d7a091d91 --- /dev/null +++ b/website/www/site/layouts/shortcodes/community/join_beam_columns.html @@ -0,0 +1,44 @@ +{{/* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. See accompanying LICENSE file. + */}} + {{ $index := .Get "number-of-data" }} + {{ $data := index $.Site.Data .Site.Language.Lang }} +
    + {{ range $i, $array := $data.join_beam }} + {{ if eq ( int $index) $i }} +
    + {{ $count := len $array.list }} + {{ range $index, $item := $array.list }} +
    +
    +
    + +
    + {{ if ne $index (sub $count 1) }} + {{ if modBool $index 2 }} + elipse icon + elipse icon + {{ else }} + elipse icon + elipse icon + {{ end }} + {{ end }} +
    +
    +

    {{ .title | markdownify }}

    +

    {{ .description | safeHTML }}

    +
    +
    + {{ end }} +
    + {{ end }} + {{ end }} +
    diff --git a/website/www/site/static/images/arrow-expandable.svg b/website/www/site/static/images/arrow-expandable.svg new file mode 100644 index 000000000000..6bcef73bfa12 --- /dev/null +++ b/website/www/site/static/images/arrow-expandable.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/website/www/site/static/images/ellipse-mobile.svg b/website/www/site/static/images/ellipse-mobile.svg new file mode 100644 index 000000000000..015a1720ee9f --- /dev/null +++ b/website/www/site/static/images/ellipse-mobile.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/website/www/site/static/images/ellipse.svg b/website/www/site/static/images/ellipse.svg new file mode 100644 index 000000000000..5e0b429aeca9 --- /dev/null +++ b/website/www/site/static/images/ellipse.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/website/www/site/static/js/hero/hero-mobile.js b/website/www/site/static/js/hero/hero-mobile.js index 979a5ec9dccc..eb6641988c65 100644 --- a/website/www/site/static/js/hero/hero-mobile.js +++ b/website/www/site/static/js/hero/hero-mobile.js @@ -9,9 +9,9 @@ // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. - -var animationData = {"v":"5.7.1","fr":30,"ip":0,"op":120,"w":375,"h":462,"nm":"opt2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":24,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-5,"s":[62.997],"e":[20]},{"t":77}],"ix":10},"p":{"a":0,"k":[1635.5,319,0],"ix":2},"a":{"a":0,"k":[1228.201,-1.163,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[72.266,-33.656],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":82,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-5,"s":[-35],"e":[-20]},{"t":56}],"ix":10},"p":{"a":0,"k":[-2082.5,375,0],"ix":2},"a":{"a":0,"k":[-1078.126,-3.829,0],"ix":1},"s":{"a":0,"k":[154.688,135.77,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.341176470588,0.043137254902,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-5.792,59.506],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 7","sr":1,"ks":{"o":{"a":0,"k":66,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-5,"s":[-53],"e":[-34]},{"t":76}],"ix":10},"p":{"a":0,"k":[-1990.5,983,0],"ix":2},"a":{"a":0,"k":[-1078.126,-3.829,0],"ix":1},"s":{"a":0,"k":[154.688,135.77,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-5.792,59.506],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":24,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-6,"s":[-46],"e":[20]},{"t":67}],"ix":10},"p":{"a":0,"k":[1117.5,959,0],"ix":2},"a":{"a":0,"k":[1171.735,-35.884,0],"ix":1},"s":{"a":0,"k":[100,78.683,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[72.266,-33.656],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":20,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[0.759]},"t":-5,"s":[2],"e":[-27]},{"t":56}],"ix":10},"p":{"a":0,"k":[-484.5,1051,0],"ix":2},"a":{"a":0,"k":[-1078.126,-3.829,0],"ix":1},"s":{"a":0,"k":[154.688,135.77,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-5.792,59.506],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape Layer 8","sr":1,"ks":{"o":{"a":0,"k":66,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-7,"s":[2],"e":[-43]},{"t":56}],"ix":10},"p":{"a":0,"k":[-542.5,1281,0],"ix":2},"a":{"a":0,"k":[-1078.126,-3.829,0],"ix":1},"s":{"a":0,"k":[154.688,81.692,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-152.112,163.925],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":9,"ty":1,"nm":"Orange Solid 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[187.5,231,0],"ix":2},"a":{"a":0,"k":[741.5,447,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"sw":1483,"sh":894,"sc":"#ff570b","ip":0,"op":720,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":1,"nm":"Medium Orange Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[187.5,231,0],"ix":2},"a":{"a":0,"k":[741.5,447,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"sw":1483,"sh":894,"sc":"#f87924","ip":0,"op":720,"st":0,"bm":0}],"markers":[]}; - +height = screen.height - 96; +width = screen.width; +var animationData = {"v":"5.7.1","fr":30,"ip":0,"op":120,"w":width,"h":height,"nm":"opt2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":24,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-5,"s":[62.997],"e":[20]},{"t":77}],"ix":10},"p":{"a":0,"k":[1649,406,0],"ix":2},"a":{"a":0,"k":[1228.201,-1.163,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[72.266,-33.656],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":82,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-5,"s":[-35],"e":[-20]},{"t":56}],"ix":10},"p":{"a":0,"k":[-1947,378,0],"ix":2},"a":{"a":0,"k":[-1078.126,-3.829,0],"ix":1},"s":{"a":0,"k":[154.688,135.77,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.341176470588,0.043137254902,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-5.792,59.506],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 7","sr":1,"ks":{"o":{"a":0,"k":66,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-5,"s":[-53],"e":[-34]},{"t":76}],"ix":10},"p":{"a":0,"k":[-1857,994,0],"ix":2},"a":{"a":0,"k":[-1078.126,-3.829,0],"ix":1},"s":{"a":0,"k":[154.688,135.77,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-5.792,59.506],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":24,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-6,"s":[-46],"e":[20]},{"t":67}],"ix":10},"p":{"a":0,"k":[1119,1224,0],"ix":2},"a":{"a":0,"k":[1171.735,-35.884,0],"ix":1},"s":{"a":0,"k":[100,78.683,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[72.266,-33.656],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":20,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[0.759]},"t":-5,"s":[2],"e":[-27]},{"t":56}],"ix":10},"p":{"a":0,"k":[-463,1308,0],"ix":2},"a":{"a":0,"k":[-1078.126,-3.829,0],"ix":1},"s":{"a":0,"k":[154.688,135.77,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-5.792,59.506],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape Layer 8","sr":1,"ks":{"o":{"a":0,"k":66,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-7,"s":[2],"e":[-43]},{"t":56}],"ix":10},"p":{"a":0,"k":[-505,1530,0],"ix":2},"a":{"a":0,"k":[-1078.126,-3.829,0],"ix":1},"s":{"a":0,"k":[154.688,81.692,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-152.112,163.925],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":9,"ty":1,"nm":"Orange Solid 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[207,448,0],"ix":2},"a":{"a":0,"k":[741.5,447,0],"ix":1},"s":{"a":0,"k":[152,152,100],"ix":6}},"ao":0,"sw":1483,"sh":894,"sc":"#ff570b","ip":0,"op":720,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":1,"nm":"Medium Orange Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[207,448,0],"ix":2},"a":{"a":0,"k":[741.5,447,0],"ix":1},"s":{"a":0,"k":[152,152,100],"ix":6}},"ao":0,"sw":1483,"sh":894,"sc":"#f87924","ip":0,"op":720,"st":0,"bm":0}],"markers":[]} var animation = bodymovin.loadAnimation({ container: document.getElementById("hero-mobile"), renderer: "svg", diff --git a/website/www/site/static/js/page-nav.js b/website/www/site/static/js/page-nav.js index 1e8f6eaa1843..c31a1bd60867 100644 --- a/website/www/site/static/js/page-nav.js +++ b/website/www/site/static/js/page-nav.js @@ -17,9 +17,33 @@ $(document).ready(function() { var CONST = { DESKTOP_BREAKPOINT: 1024, - PAGENAV_WIDTH: 240 + PAGENAV_WIDTH: 248 + }; + function checkList () { + var items = $(".page-nav > #TableOfContents li"); + if (items && items.length > 0) { + for(var i=0; i a',items[i]).length>0){ + if(!items[i].querySelector('a').getAttribute('aria-expanded') || items[i].querySelector('a').getAttribute('aria-expanded') == 'false'){ + items[i].classList.add('chosen'); + } + } + } + } + if($('#TableOfContents .active').length === 0 || $('#TableOfContents .chosen').length===0){ + if($('#TableOfContents li').first().children('a').length === 0){ + $('#TableOfContents li').first().children('ul').children('li')[0].classList.add('chosen'); + $('#TableOfContents li')[0].classList.add('active'); + } + else + $('#TableOfContents li')[0].classList.add('chosen'); + } + } }; - return { "idPageNav": idPageNav, "idMainContainer": idMainContainer, @@ -39,6 +63,14 @@ $(document).ready(function() { left: 0 }); } + if($('#TableOfContents .active').length === 0){ + if($('#TableOfContents li').first().children('a').length === 0){ + $('#TableOfContents li').first().children('ul').children('li')[0].classList.add('chosen'); + $('#TableOfContents li')[0].classList.add('active'); + } + else + $('#TableOfContents li')[0].classList.add('chosen'); + } }, "bindEvents": function() { @@ -48,10 +80,44 @@ $(document).ready(function() { _self.setPageNav(); }); }, + "setActiveItemClassEvent": function () { + $("." + idSectionNav + " a").click(function (e) { + var currentItem = document.querySelector(classNavActiveItem); + if (currentItem) + currentItem.classList.remove(CONST.ACTIVE_CLASS); + e.target.classList.add(CONST.ACTIVE_CLASS); + }); + }, + + "displayActiveItem": function () { + document.querySelector(".page-nav > #TableOfContents").addEventListener('click', function(){ + setTimeout(checkList,50) + }); + document.addEventListener('scroll', checkList); + var items = $(".page-nav > #TableOfContents li"); + var img = document.createElement("img"); + img.src = "/images/arrow-expandable.svg"; + img.classList="rotate"; + for(i=0; i Date: Wed, 3 Feb 2021 21:23:43 +0100 Subject: [PATCH 06/12] [BEAM-11466-11465-11464-11463-11462][Website revamp] Implemented footer, button bar, calendar, blog, blog post and documentation page (#13596) * all changes * added calendar * fix list order * fix calendar * external links * minor fix * changes without content * add license * Update website/www/site/static/js/calendar.js Co-authored-by: Brian Hulette * last changes * filtering fix * content update * fix todos * fix todos * Update website/www/site/layouts/index.html Co-authored-by: Brian Hulette * fixes * resolved conflict * icons * add copy * typo: * fixed blog * fixed icons on homepage * fix * icons fix Co-authored-by: Brian Hulette --- .../www/site/assets/icons/commercial-icon.svg | 29 ++ .../become a commiter/beam-logo-icon.svg | 46 +++ .../become a commiter/code-icon.svg | 22 ++ .../become a commiter/diamond-icon.svg | 39 +++ .../become a commiter/file-icon.svg | 23 ++ .../become a commiter/messages-icon.svg | 28 ++ .../become a commiter/tool-icon.svg | 22 ++ .../icons/documentation/runners/beam-icon.svg | 28 ++ .../documentation/runners/dataflow-icon.svg | 28 ++ .../documentation/runners/flink-icon.svg | 28 ++ .../icons/documentation/runners/nemo-icon.svg | 28 ++ .../documentation/runners/samza-icon.svg | 28 ++ .../documentation/runners/spark-icon.svg | 28 ++ .../icons/documentation/sdks/go-icon.svg | 28 ++ .../icons/documentation/sdks/java-icon.svg | 28 ++ .../icons/documentation/sdks/python-icon.svg | 28 ++ .../www/site/assets/icons/extensible-icon.svg | 26 ++ .../www/site/assets/icons/extensive-icon.svg | 26 -- .../site/assets/icons/open_source-icon.svg | 28 ++ website/www/site/assets/scss/_blog.scss | 238 ++++++++++++++ website/www/site/assets/scss/_calendar.scss | 92 ++++-- website/www/site/assets/scss/_ctas.sass | 62 +++- website/www/site/assets/scss/_footer.sass | 65 +++- website/www/site/assets/scss/_global.sass | 1 + website/www/site/assets/scss/_graphic.sass | 29 -- website/www/site/assets/scss/_graphic.scss | 91 ++++++ website/www/site/assets/scss/_layout.scss | 292 +++++++++--------- website/www/site/assets/scss/_lists.scss | 7 +- website/www/site/assets/scss/_quotes.scss | 10 +- website/www/site/assets/scss/main.scss | 5 +- website/www/site/config.toml | 2 +- .../site/content/en/documentation/_index.md | 14 +- .../site/data/en/documentation_runners.yaml | 34 ++ .../www/site/data/en/documentation_sdks.yaml | 18 ++ website/www/site/data/en/graphic.yaml | 22 ++ website/www/site/data/en/quotes.yaml | 16 +- website/www/site/i18n/blog/en.yaml | 11 +- website/www/site/i18n/footer/en.yaml | 2 +- website/www/site/i18n/home/calendar/en.yaml | 31 +- website/www/site/i18n/home/en.yaml | 18 +- website/www/site/layouts/_default/baseof.html | 8 +- website/www/site/layouts/blog/baseof.html | 2 +- website/www/site/layouts/blog/list.html | 132 ++++++-- website/www/site/layouts/blog/single.html | 76 ++++- .../site/layouts/documentation/baseof.html | 2 +- website/www/site/layouts/index.html | 174 +++++++---- .../partials/documentation/icon-row.html | 27 ++ website/www/site/layouts/partials/footer.html | 121 ++++---- website/www/site/layouts/partials/head.html | 3 + .../shortcodes/documentation/runners.html | 45 +++ .../shortcodes/documentation/sdks.html | 18 ++ .../site/static/images/arrow-icon_list.svg | 22 ++ .../static/images/beam_logo_navbar_mobile.png | Bin 1497 -> 1517 bytes website/www/site/static/images/code-icon.svg | 22 ++ .../images/community/beam-logo-icon.svg | 46 +++ .../static/images/community/diamond-icon.svg | 39 +++ .../static/images/community/messages-icon.svg | 28 ++ website/www/site/static/images/copy-icon.svg | 23 ++ website/www/site/static/images/elipse.svg | 22 ++ .../www/site/static/images/github-icon.svg | 29 ++ website/www/site/static/images/info_icon.svg | 23 ++ .../images/logos/full-color/nameless/eBay.png | Bin 0 -> 90243 bytes .../images/logos/full-color/nameless/klio.png | Bin 0 -> 9212 bytes .../logos/full-color/nameless/mozilla.png | Bin 0 -> 1879 bytes .../static/images/logos/powered-by/eBay.png | Bin 0 -> 90243 bytes .../static/images/logos/powered-by/goga.png | Bin 0 -> 44510 bytes .../static/images/logos/powered-by/klio.png | Bin 0 -> 9212 bytes .../images/logos/powered-by/mozilla.png | Bin 0 -> 1879 bytes .../static/images/logos/powered-by/neo4j.png | Bin 0 -> 82744 bytes .../static/images/logos/powered-by/oriel.png | Bin 0 -> 76963 bytes .../images/logos/powered-by/ricardo.png | Bin 0 -> 25264 bytes .../static/images/logos/powered-by/scio.png | Bin 0 -> 28972 bytes .../static/images/logos/runners/flink.png | Bin 4584 -> 18374 bytes .../static/images/logos/runners/spark.png | Bin 2701 -> 11275 bytes .../static/images/logos/sdks/python-logo.png | Bin 0 -> 8870 bytes .../www/site/static/images/model-ellipse.svg | 22 ++ .../static/images/model-processing-icon.svg | 45 +++ .../site/static/images/model-sinks-icon.svg | 23 ++ .../site/static/images/model-sources-icon.svg | 25 ++ website/www/site/static/images/run-icon.svg | 22 ++ website/www/site/static/js/calendar.js | 21 ++ .../www/site/static/js/categories-filter.js | 292 ++++++++++++++++++ 82 files changed, 2431 insertions(+), 482 deletions(-) create mode 100644 website/www/site/assets/icons/commercial-icon.svg create mode 100644 website/www/site/assets/icons/contributor/become a commiter/beam-logo-icon.svg create mode 100644 website/www/site/assets/icons/contributor/become a commiter/code-icon.svg create mode 100644 website/www/site/assets/icons/contributor/become a commiter/diamond-icon.svg create mode 100644 website/www/site/assets/icons/contributor/become a commiter/file-icon.svg create mode 100644 website/www/site/assets/icons/contributor/become a commiter/messages-icon.svg create mode 100644 website/www/site/assets/icons/contributor/become a commiter/tool-icon.svg create mode 100644 website/www/site/assets/icons/documentation/runners/beam-icon.svg create mode 100644 website/www/site/assets/icons/documentation/runners/dataflow-icon.svg create mode 100644 website/www/site/assets/icons/documentation/runners/flink-icon.svg create mode 100644 website/www/site/assets/icons/documentation/runners/nemo-icon.svg create mode 100644 website/www/site/assets/icons/documentation/runners/samza-icon.svg create mode 100644 website/www/site/assets/icons/documentation/runners/spark-icon.svg create mode 100644 website/www/site/assets/icons/documentation/sdks/go-icon.svg create mode 100644 website/www/site/assets/icons/documentation/sdks/java-icon.svg create mode 100644 website/www/site/assets/icons/documentation/sdks/python-icon.svg create mode 100644 website/www/site/assets/icons/extensible-icon.svg delete mode 100644 website/www/site/assets/icons/extensive-icon.svg create mode 100644 website/www/site/assets/icons/open_source-icon.svg create mode 100644 website/www/site/assets/scss/_blog.scss delete mode 100644 website/www/site/assets/scss/_graphic.sass create mode 100644 website/www/site/assets/scss/_graphic.scss create mode 100644 website/www/site/data/en/documentation_runners.yaml create mode 100644 website/www/site/data/en/documentation_sdks.yaml create mode 100644 website/www/site/data/en/graphic.yaml create mode 100644 website/www/site/layouts/partials/documentation/icon-row.html create mode 100644 website/www/site/layouts/shortcodes/documentation/runners.html create mode 100644 website/www/site/layouts/shortcodes/documentation/sdks.html create mode 100644 website/www/site/static/images/arrow-icon_list.svg create mode 100644 website/www/site/static/images/code-icon.svg create mode 100644 website/www/site/static/images/community/beam-logo-icon.svg create mode 100644 website/www/site/static/images/community/diamond-icon.svg create mode 100644 website/www/site/static/images/community/messages-icon.svg create mode 100644 website/www/site/static/images/copy-icon.svg create mode 100644 website/www/site/static/images/elipse.svg create mode 100644 website/www/site/static/images/github-icon.svg create mode 100644 website/www/site/static/images/info_icon.svg create mode 100644 website/www/site/static/images/logos/full-color/nameless/eBay.png create mode 100644 website/www/site/static/images/logos/full-color/nameless/klio.png create mode 100644 website/www/site/static/images/logos/full-color/nameless/mozilla.png create mode 100644 website/www/site/static/images/logos/powered-by/eBay.png create mode 100644 website/www/site/static/images/logos/powered-by/goga.png create mode 100644 website/www/site/static/images/logos/powered-by/klio.png create mode 100644 website/www/site/static/images/logos/powered-by/mozilla.png create mode 100644 website/www/site/static/images/logos/powered-by/neo4j.png create mode 100644 website/www/site/static/images/logos/powered-by/oriel.png create mode 100644 website/www/site/static/images/logos/powered-by/ricardo.png create mode 100644 website/www/site/static/images/logos/powered-by/scio.png create mode 100644 website/www/site/static/images/logos/sdks/python-logo.png create mode 100644 website/www/site/static/images/model-ellipse.svg create mode 100644 website/www/site/static/images/model-processing-icon.svg create mode 100644 website/www/site/static/images/model-sinks-icon.svg create mode 100644 website/www/site/static/images/model-sources-icon.svg create mode 100644 website/www/site/static/images/run-icon.svg create mode 100644 website/www/site/static/js/calendar.js create mode 100644 website/www/site/static/js/categories-filter.js diff --git a/website/www/site/assets/icons/commercial-icon.svg b/website/www/site/assets/icons/commercial-icon.svg new file mode 100644 index 000000000000..916237de46cc --- /dev/null +++ b/website/www/site/assets/icons/commercial-icon.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + diff --git a/website/www/site/assets/icons/contributor/become a commiter/beam-logo-icon.svg b/website/www/site/assets/icons/contributor/become a commiter/beam-logo-icon.svg new file mode 100644 index 000000000000..587667d29cc9 --- /dev/null +++ b/website/www/site/assets/icons/contributor/become a commiter/beam-logo-icon.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/www/site/assets/icons/contributor/become a commiter/code-icon.svg b/website/www/site/assets/icons/contributor/become a commiter/code-icon.svg new file mode 100644 index 000000000000..338acf8e8de1 --- /dev/null +++ b/website/www/site/assets/icons/contributor/become a commiter/code-icon.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/website/www/site/assets/icons/contributor/become a commiter/diamond-icon.svg b/website/www/site/assets/icons/contributor/become a commiter/diamond-icon.svg new file mode 100644 index 000000000000..50930d56bf94 --- /dev/null +++ b/website/www/site/assets/icons/contributor/become a commiter/diamond-icon.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/www/site/assets/icons/contributor/become a commiter/file-icon.svg b/website/www/site/assets/icons/contributor/become a commiter/file-icon.svg new file mode 100644 index 000000000000..a198565b15a4 --- /dev/null +++ b/website/www/site/assets/icons/contributor/become a commiter/file-icon.svg @@ -0,0 +1,23 @@ + + + + + + diff --git a/website/www/site/assets/icons/contributor/become a commiter/messages-icon.svg b/website/www/site/assets/icons/contributor/become a commiter/messages-icon.svg new file mode 100644 index 000000000000..0f710d68e9f6 --- /dev/null +++ b/website/www/site/assets/icons/contributor/become a commiter/messages-icon.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/website/www/site/assets/icons/contributor/become a commiter/tool-icon.svg b/website/www/site/assets/icons/contributor/become a commiter/tool-icon.svg new file mode 100644 index 000000000000..46e30c82ab1a --- /dev/null +++ b/website/www/site/assets/icons/contributor/become a commiter/tool-icon.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/website/www/site/assets/icons/documentation/runners/beam-icon.svg b/website/www/site/assets/icons/documentation/runners/beam-icon.svg new file mode 100644 index 000000000000..a28c653d9d2b --- /dev/null +++ b/website/www/site/assets/icons/documentation/runners/beam-icon.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/website/www/site/assets/icons/documentation/runners/dataflow-icon.svg b/website/www/site/assets/icons/documentation/runners/dataflow-icon.svg new file mode 100644 index 000000000000..8bf98f238451 --- /dev/null +++ b/website/www/site/assets/icons/documentation/runners/dataflow-icon.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/website/www/site/assets/icons/documentation/runners/flink-icon.svg b/website/www/site/assets/icons/documentation/runners/flink-icon.svg new file mode 100644 index 000000000000..40c77f112dc1 --- /dev/null +++ b/website/www/site/assets/icons/documentation/runners/flink-icon.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/website/www/site/assets/icons/documentation/runners/nemo-icon.svg b/website/www/site/assets/icons/documentation/runners/nemo-icon.svg new file mode 100644 index 000000000000..d6ddbc517578 --- /dev/null +++ b/website/www/site/assets/icons/documentation/runners/nemo-icon.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/website/www/site/assets/icons/documentation/runners/samza-icon.svg b/website/www/site/assets/icons/documentation/runners/samza-icon.svg new file mode 100644 index 000000000000..4627df1be7bf --- /dev/null +++ b/website/www/site/assets/icons/documentation/runners/samza-icon.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/website/www/site/assets/icons/documentation/runners/spark-icon.svg b/website/www/site/assets/icons/documentation/runners/spark-icon.svg new file mode 100644 index 000000000000..61ee67f363ef --- /dev/null +++ b/website/www/site/assets/icons/documentation/runners/spark-icon.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/website/www/site/assets/icons/documentation/sdks/go-icon.svg b/website/www/site/assets/icons/documentation/sdks/go-icon.svg new file mode 100644 index 000000000000..46f43820bb3a --- /dev/null +++ b/website/www/site/assets/icons/documentation/sdks/go-icon.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/website/www/site/assets/icons/documentation/sdks/java-icon.svg b/website/www/site/assets/icons/documentation/sdks/java-icon.svg new file mode 100644 index 000000000000..a2991e307ca3 --- /dev/null +++ b/website/www/site/assets/icons/documentation/sdks/java-icon.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/website/www/site/assets/icons/documentation/sdks/python-icon.svg b/website/www/site/assets/icons/documentation/sdks/python-icon.svg new file mode 100644 index 000000000000..f539aa3a62aa --- /dev/null +++ b/website/www/site/assets/icons/documentation/sdks/python-icon.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/website/www/site/assets/icons/extensible-icon.svg b/website/www/site/assets/icons/extensible-icon.svg new file mode 100644 index 000000000000..02ba07c0ccd1 --- /dev/null +++ b/website/www/site/assets/icons/extensible-icon.svg @@ -0,0 +1,26 @@ + + + + + + + + + diff --git a/website/www/site/assets/icons/extensive-icon.svg b/website/www/site/assets/icons/extensive-icon.svg deleted file mode 100644 index 76e680da8216..000000000000 --- a/website/www/site/assets/icons/extensive-icon.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - diff --git a/website/www/site/assets/icons/open_source-icon.svg b/website/www/site/assets/icons/open_source-icon.svg new file mode 100644 index 000000000000..1505a32429e5 --- /dev/null +++ b/website/www/site/assets/icons/open_source-icon.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/website/www/site/assets/scss/_blog.scss b/website/www/site/assets/scss/_blog.scss new file mode 100644 index 000000000000..e6c1ad567008 --- /dev/null +++ b/website/www/site/assets/scss/_blog.scss @@ -0,0 +1,238 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + @import "media"; + + .blog-content { + //padding: 0 24px 0 24px; + margin-top: 64px; + .tf-filter-item { + display: none !important; + } + h2 { + text-align: center; + margin-bottom: 70px !important; + padding-top: 57px; + } + + .category-buttons { + display: flex; + align-items: center; + justify-content: center; + + flex-wrap: wrap-reverse; + margin: 0 auto; + margin-bottom: 80px; + + @media (max-width: $tablet) { + max-width: 100%; + flex-wrap: wrap; + } + + .category-button { + margin: 0 6px 12px 6px; + padding: 10px 20px; + border-radius: 100px; + background-color: #f6f6f6; + text-transform: uppercase; + border: 0; + font-weight: bold; + line-height: 1.14; + letter-spacing: 0.6px; + &:focus { + outline: 0; + } + &:hover { + background-color: #f2804d; + color: #fff; + } + } + + .active { + background-color: #f26628; + color: #fff; + &:hover { + background-color: #f2804d; + } + } + } + .category-buttons_poweredBy { + justify-content: flex-start; + margin-top: 84px; + } + .restricted { + max-width: 60%; + @media (max-width: $mobile) { + max-width: 100%; + } + } + } + .load-button { + padding: 15px 51px 15px 52px; + border-radius: 100px; + background-color: #f26628; + text-transform: uppercase; + font-weight: bold; + line-height: normal; + letter-spacing: 0.39px; + color: #ffffff; + border: 0; + margin-top: 104px; + width: 184px; + height: 46px; + &:hover { + background-color: #f2804d; + } + } + + .posts-list { + display: flex; + flex-wrap: wrap; + justify-content: space-around; + + .show-item { + display: inline-block !important; + } + + @media (max-width: $tablet) { + justify-content: space-evenly; + } + .post-card { + width: 381px; + height: 468px; + padding: 24px 24px 128.9px; + border-radius: 16px; + box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.16), + 0 4px 4px 0 rgba(0, 0, 0, 0.06); + background-color: #ffffff; + margin-bottom: 36px; + color: #333333; + overflow: hidden; + + &:hover { + text-decoration: none; + box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.24), + 0 4px 6px 0 rgba(0, 0, 0, 0.24); + } + @media (max-width: $tablet) { + width: 327px; + height: 216px; + padding: 24px 20px; + margin-bottom: 24px; + display: flex; + flex-direction: column; + justify-content: space-between; + } + + .post-title { + font-size: 24px; + font-weight: 500; + line-height: 1.25; + letter-spacing: normal; + margin-bottom: 24px; + overflow: hidden; + -webkit-box-orient: vertical; + @media (max-width: $tablet) { + font-size: 18px; + font-weight: normal; + line-height: 1.6; + letter-spacing: 0.43px; + } + } + + .post-summary { + overflow: hidden; + line-height: 1.57; + letter-spacing: 0.43px; + display: -webkit-box; + -webkit-line-clamp: 9; + -webkit-box-orient: vertical; + @media (max-width: $tablet) { + display: none; + } + } + } + } + .post-info { + display: flex; + justify-content: space-between; + font-size: 16px; + font-weight: 500; + line-height: 1.63; + letter-spacing: 0.43px; + color: #8c8b8e; + margin-bottom: 38px; + @media (max-width: $tablet) { + margin-bottom: 0; + } + p { + text-transform: uppercase; + } + } + .post-category { + font-size: 14px; + font-weight: normal; + margin-top: 8px; + } + .post { + .post-content { + max-width: 853px; + margin: 0 auto; + margin-bottom: 120px; + padding-top: 55px; + @media (max-width: $tablet) { + padding: 35px 24px; + word-break: break-word; + margin-top: 85px; + } + } + + .post-header { + border-bottom: 2px solid rgba(255, 109, 5, 0.24); + margin-bottom: 24px; + padding-bottom: 26px; + } + .post-card { + width: 381px; + height: 216px; + padding: 24px; + display: flex; + flex-direction: column; + justify-content: space-between; + @media (max-width: $tablet) { + width: 327px; + height: 216px; + padding: 24px 19.2px 24.7px 20px; + } + } + .post-info { + margin: 0; + p { + font-size: 14px; + font-weight: bold; + line-height: normal; + letter-spacing: 2px; + } + } + .post-title { + margin-bottom: 12px !important; + font-size: 18px !important; + line-height: 1.6 !important; + letter-spacing: 0.43px !important; + text-overflow: ellipsis; + max-height: 4.8em; + } + } diff --git a/website/www/site/assets/scss/_calendar.scss b/website/www/site/assets/scss/_calendar.scss index c78c16081571..824c0312d8e9 100644 --- a/website/www/site/assets/scss/_calendar.scss +++ b/website/www/site/assets/scss/_calendar.scss @@ -56,11 +56,13 @@ } } - .calendar-card-big-left:hover { - box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.24), - 0 4px 6px 0 rgba(0, 0, 0, 0.24); + .calendar-card-big-left { + padding: 0 !important; + &:hover { + box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.24), + 0 4px 6px 0 rgba(0, 0, 0, 0.24); + } } - // Middle cards .calendar-card-box { margin: 0 37px; @@ -68,23 +70,64 @@ display: flex; flex-direction: column; justify-content: space-between; - - .calendar-card-small { - width: 100%; - max-width: 381px; + .show-item { + display: inline-block; + } + .post-card { + width: 381px; height: 216px; + padding: 24px; border-radius: 16px; box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.16), 0 4px 4px 0 rgba(0, 0, 0, 0.06); - background-color: $color-white; - padding: 32px 24px; - transition: 0.2s; - - .calendar-card-small-title { - @extend .component-small-header; + background-color: #ffffff; + margin-bottom: 36px; + color: #333333; + overflow: hidden; + display: flex; + flex-direction: column; + justify-content: space-between; + @media (max-width: $tablet) { + width: 327px; + height: 216px; + padding: 24px 19.2px 24.7px 20px; + margin-bottom: 24px; + } + &:hover { + text-decoration: none; + box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.24), + 0 4px 6px 0 rgba(0, 0, 0, 0.24); + } - margin-top: 40px; + .post-title { + font-size: 18px; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.43px; margin-bottom: 12px; + text-overflow: ellipsis; + word-wrap: break-word; + overflow: hidden; + max-height: 4.8em; + + @media (max-width: $tablet) { + font-size: 18px; + font-weight: normal; + line-height: 1.6; + letter-spacing: 0.43px; + } + } + + .post-summary { + overflow: hidden; + line-height: 1.57; + letter-spacing: 0.43px; + display: -webkit-box; + -webkit-line-clamp: 9; + -webkit-box-orient: vertical; + @media (max-width: $tablet) { + display: none; + } } } @@ -103,7 +146,17 @@ .calendar-card-events { margin-top: 30px; margin-bottom: 70px; - + .calendar-desktop { + @media (max-width: $tablet) { + display: none; + } + } + .calendar-mobile { + display: none; + @media (max-width: $tablet) { + display: block; + } + } .calendar-event { display: flex; padding: 14px; @@ -191,7 +244,7 @@ .calendar-content { flex-direction: column; align-items: center; - margin-top: 64px; + margin-top: 70px; .calendar-card-big { max-width: 327px; @@ -205,11 +258,12 @@ } .calendar-card-box { - margin: 24px 0px; + margin-bottom: 0; + margin-top: 24px; min-height: 456px; .calendar-card-small { - width: 327px; + max-width: 327px; height: 216px; padding: 24px 20px; diff --git a/website/www/site/assets/scss/_ctas.sass b/website/www/site/assets/scss/_ctas.sass index 325d4f1b07cc..d334a8834a1f 100644 --- a/website/www/site/assets/scss/_ctas.sass +++ b/website/www/site/assets/scss/_ctas.sass @@ -16,13 +16,59 @@ */ .ctas - text-align: center - margin: $pad-xl 0 + display: flex + justify-content: center + align-items: center + width: 100% + height: 96px + position: fixed + z-index: 1020 + bottom: 0 + box-shadow: 0 -4px 16px 0 rgba(0, 0, 0, 0.06); + background-color: #ffffff + margin-top: -5px - .ctas__ctas - &--top - margin-bottom: $pad + @media (max-width: $ak-breakpoint-lg) + flex-wrap: nowrap + width: auto + justify-content: flex-start + left: 0 + right: 0 + overflow-y: hidden + overflow-x: auto - .ctas__title - +type-h2 - margin-bottom: $pad + + &_row + margin: 0 0 0 91px + max-width: 184px + transform: translate3d(0px, 0px, 0px) + &:first-of-type + margin: 0 + @media (max-width: $ak-breakpoint-lg) + margin-left: 24px + &:first-of-type + margin-left: 24px + + &_button + width: 184px + height: 46px + border-radius: 100px + background-color: #f26628 + font-size: 14px + font-weight: bold + line-height: normal + letter-spacing: 0.39px + color: #ffffff + text-transform: uppercase + display: flex + align-items: center + justify-content: center + + img + margin-right: 12px + height: 20px + width: 20px + &:hover + text-decoration: none + color: #ffffff + background-color: #f2804d diff --git a/website/www/site/assets/scss/_footer.sass b/website/www/site/assets/scss/_footer.sass index a52ba8d115a5..ce99da118e58 100644 --- a/website/www/site/assets/scss/_footer.sass +++ b/website/www/site/assets/scss/_footer.sass @@ -17,34 +17,32 @@ .footer background: $color-dark - padding: 40px 0 - margin-top: 70px + padding-top: 40px + margin-top: 128px @at-root .body--index & margin-top: 0 color: #fff .footer__contained +contained - + padding: 0 30px a color: #fff .footer__cols display: flex justify-content: space-around + @media (max-width: $ak-breakpoint-lg) + display: block + .footer__cols__col__logos + padding-right: 120px + @media (max-width: $ak-breakpoint-lg) + display: flex .footer__cols__col padding: 5px box-sizing: border-box - &:first-child - +md - width: 20% - - &--md - +md - width: 20% - .footer__cols__col__title color: #fff font-weight: $font-weight-bold @@ -55,7 +53,46 @@ .footer__cols__col__logo margin-bottom: $pad + @media (max-width: $ak-breakpoint-lg) + margin-right: 50px + + .footer__flex_mobile + display: flex + flex-direction: row + justify-content: space-between + @media (max-width: $ak-breakpoint-lg) + flex-direction: column + + .wrapper-grid + display: grid + padding-bottom: 30px + grid-template-columns: repeat(4, 1fr) + grid-gap: 52px + grid-auto-rows: minmax(200px, auto) + @media (max-width: $ak-breakpoint-lg) + grid-template-columns: repeat(2, 1fr) + + .footer-wrapper + padding: 0 56px + @media (max-width: $ak-breakpoint-lg) + padding: 0 + + .footer__bottom + line-height: 1.57 + letter-spacing: 0.43px + color: #bfbfbf + padding-bottom: 38px + padding-right: 25px + margin-right: 76px + a + color: #bfbfbf + @media (max-width: $ak-breakpoint-lg) + padding-bottom: 77px + padding-right: 0 + margin-right: 0 - .footer__bottom - margin-top: $pad-md - text-align: center +.main-padding + padding-bottom: 48px + background: #37424B; + @media (max-width: $ak-breakpoint-lg) + padding-bottom: 100px diff --git a/website/www/site/assets/scss/_global.sass b/website/www/site/assets/scss/_global.sass index 9c62feea862d..fbc02977971b 100644 --- a/website/www/site/assets/scss/_global.sass +++ b/website/www/site/assets/scss/_global.sass @@ -122,6 +122,7 @@ body border: none padding: 0 margin-top: 36px + background: initial !important a float: right margin-left: 12px diff --git a/website/www/site/assets/scss/_graphic.sass b/website/www/site/assets/scss/_graphic.sass deleted file mode 100644 index cd171f7db00b..000000000000 --- a/website/www/site/assets/scss/_graphic.sass +++ /dev/null @@ -1,29 +0,0 @@ -/*! - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -.graphic - padding: $pad-l $pad - - .graphic__image - text-align: center - line-height: 0 - - img - max-width: 100% - margin: 0 auto - max-height: 500px - border: 1px solid #efefef diff --git a/website/www/site/assets/scss/_graphic.scss b/website/www/site/assets/scss/_graphic.scss new file mode 100644 index 000000000000..336f1f422516 --- /dev/null +++ b/website/www/site/assets/scss/_graphic.scss @@ -0,0 +1,91 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +@import "media"; + +.graphic { + text-align: center; + h2 { + @extend .component-title; + } + .images { + max-width: 868px; + margin: 0 auto; + height: 60px; + } + .margin { + margin-top: 84px; + margin-bottom: 84px; + @media (max-width: $mobile) { + margin-top: 0; + margin-bottom: 64px; + } + } + .row { + display: flex; + justify-content: space-between; + @media (max-width: $mobile) { + flex-direction: column; + align-items: center; + } + .logos-row { + display: flex; + align-items: center; + margin-top: 20px; + max-height: 73px; + @media (max-width: $mobile) { + margin-top: 64px; + } + img { + height: auto; + width: 112px; + } + } + .first_logo { + margin-right: 18px; + } + .column { + display: flex; + flex-direction: column; + align-items: center; + max-width: 306px; + + h4 { + margin-top: 32px; + } + .more { + margin-top: 32px; + font-size: 14px; + font-weight: bold; + line-height: 16px; + letter-spacing: 0.6px; + color: #f26628; + } + } + .icon { + width: 34px; + height: 44px; + margin-top: 16px; + @media (max-width: $mobile) { + margin-top: 64px; + } + } + img { + max-width: 306px; + height: 42px; + } + } +} diff --git a/website/www/site/assets/scss/_layout.scss b/website/www/site/assets/scss/_layout.scss index 0c3b1c3132d0..9f8f2b4de15b 100644 --- a/website/www/site/assets/scss/_layout.scss +++ b/website/www/site/assets/scss/_layout.scss @@ -16,241 +16,235 @@ * Site header */ .site-header { - border-top: 5px solid $grey-color-dark; - border-bottom: 1px solid $grey-color-light; - min-height: 56px; + border-top: 5px solid $grey-color-dark; + border-bottom: 1px solid $grey-color-light; + min-height: 56px; - // Positioning context for the mobile navigation icon - position: relative; + // Positioning context for the mobile navigation icon + position: relative; } .site-title { - font-size: 26px; - font-weight: 300; - line-height: 56px; - letter-spacing: -1px; - margin-bottom: 0; - float: left; - - &, - &:visited { - color: $grey-color-dark; - } + font-size: 26px; + font-weight: 300; + line-height: 56px; + letter-spacing: -1px; + margin-bottom: 0; + float: left; + + &, + &:visited { + color: $grey-color-dark; + } } .site-nav { - float: right; - line-height: 56px; + float: right; + line-height: 56px; - .menu-icon { - display: none; - } + .menu-icon { + display: none; + } - .page-link { - color: $text-color; - line-height: $base-line-height; + .page-link { + color: $text-color; + line-height: $base-line-height; - // Gaps between nav items, but not on the last one - &:not(:last-child) { - margin-right: 20px; - } + // Gaps between nav items, but not on the last one + &:not(:last-child) { + margin-right: 20px; } + } - @include media-query($on-palm) { - position: absolute; - top: 9px; - right: $spacing-unit / 2; - background-color: $background-color; - border: 1px solid $grey-color-light; - border-radius: 5px; - text-align: right; - - .menu-icon { - display: block; - float: right; - width: 36px; - height: 26px; - line-height: 0; - padding-top: 10px; - text-align: center; - - > svg { - width: 18px; - height: 15px; - - path { - fill: $grey-color-dark; - } - } - } + @include media-query($on-palm) { + position: absolute; + top: 9px; + right: $spacing-unit / 2; + background-color: $background-color; + border: 1px solid $grey-color-light; + border-radius: 5px; + text-align: right; - .trigger { - clear: both; - display: none; - } - - &:hover .trigger { - display: block; - padding-bottom: 5px; + .menu-icon { + display: block; + float: right; + width: 36px; + height: 26px; + line-height: 0; + padding-top: 10px; + text-align: center; + + > svg { + width: 18px; + height: 15px; + + path { + fill: $grey-color-dark; } + } + } - .page-link { - display: block; - padding: 5px 10px; + .trigger { + clear: both; + display: none; + } - &:not(:last-child) { - margin-right: 0; - } - margin-left: 20px; - } + &:hover .trigger { + display: block; + padding-bottom: 5px; } -} + .page-link { + display: block; + padding: 5px 10px; + &:not(:last-child) { + margin-right: 0; + } + margin-left: 20px; + } + } +} /** - * Site footer - */ + * Site footer + */ .site-footer { - border-top: 1px solid $grey-color-light; - padding: $spacing-unit 0; + border-top: 1px solid $grey-color-light; + padding: $spacing-unit 0; } .footer-heading { - font-size: 18px; - margin-bottom: $spacing-unit / 2; + font-size: 18px; + margin-bottom: $spacing-unit / 2; } .contact-list, .social-media-list { - list-style: none; - margin-left: 0; + list-style: none; + margin-left: 0; } .footer-col-wrapper { - font-size: 15px; - color: $grey-color; - margin-left: -$spacing-unit / 2; - @extend %clearfix; + font-size: 15px; + color: $grey-color; + margin-left: -$spacing-unit / 2; + @extend %clearfix; } .footer-col { - float: left; - margin-bottom: $spacing-unit / 2; - padding-left: $spacing-unit / 2; + float: left; + margin-bottom: $spacing-unit / 2; + padding-left: $spacing-unit / 2; } .footer-col-1 { - width: -webkit-calc(35% - (#{$spacing-unit} / 2)); - width: calc(35% - (#{$spacing-unit} / 2)); + width: -webkit-calc(35% - (#{$spacing-unit} / 2)); + width: calc(35% - (#{$spacing-unit} / 2)); } .footer-col-2 { - width: -webkit-calc(20% - (#{$spacing-unit} / 2)); - width: calc(20% - (#{$spacing-unit} / 2)); + width: -webkit-calc(20% - (#{$spacing-unit} / 2)); + width: calc(20% - (#{$spacing-unit} / 2)); } .footer-col-3 { - width: -webkit-calc(45% - (#{$spacing-unit} / 2)); - width: calc(45% - (#{$spacing-unit} / 2)); + width: -webkit-calc(45% - (#{$spacing-unit} / 2)); + width: calc(45% - (#{$spacing-unit} / 2)); } @include media-query($on-laptop) { - .footer-col-1, - .footer-col-2 { - width: -webkit-calc(50% - (#{$spacing-unit} / 2)); - width: calc(50% - (#{$spacing-unit} / 2)); - } + .footer-col-1, + .footer-col-2 { + width: -webkit-calc(50% - (#{$spacing-unit} / 2)); + width: calc(50% - (#{$spacing-unit} / 2)); + } - .footer-col-3 { - width: -webkit-calc(100% - (#{$spacing-unit} / 2)); - width: calc(100% - (#{$spacing-unit} / 2)); - } + .footer-col-3 { + width: -webkit-calc(100% - (#{$spacing-unit} / 2)); + width: calc(100% - (#{$spacing-unit} / 2)); + } } @include media-query($on-palm) { - .footer-col { - float: none; - width: -webkit-calc(100% - (#{$spacing-unit} / 2)); - width: calc(100% - (#{$spacing-unit} / 2)); - } + .footer-col { + float: none; + width: -webkit-calc(100% - (#{$spacing-unit} / 2)); + width: calc(100% - (#{$spacing-unit} / 2)); + } } - - /** - * Page content - */ + * Page content + */ .page-content { - padding: $spacing-unit 0; + padding: $spacing-unit 0; } .page-heading { - font-size: 20px; + font-size: 20px; } .post-list { - margin-left: 0; - list-style: none; + margin-left: 0; + list-style: none; - > li { - margin-bottom: $spacing-unit; - } + > li { + margin-bottom: $spacing-unit; + } } .post-meta { - font-size: $small-font-size; - color: $grey-color; + font-size: $small-font-size; + color: $grey-color; } .post-link { - display: block; - font-size: 24px; + display: block; + font-size: 24px; } - - /** - * Posts - */ + * Posts + */ .post-header { - margin-bottom: $spacing-unit; + margin-bottom: $spacing-unit; } .post-title { - font-size: 42px; - letter-spacing: -1px; - line-height: 1; + font-size: 42px; + letter-spacing: -1px; + line-height: 1; - @include media-query($on-laptop) { - font-size: 36px; - } + @include media-query($on-laptop) { + font-size: 36px; + } } .post-content { - margin-bottom: $spacing-unit; + margin-bottom: $spacing-unit; - h2 { - font-size: 32px; + h2 { + font-size: 32px; - @include media-query($on-laptop) { - font-size: 28px; - } + @include media-query($on-laptop) { + font-size: 28px; } + } - h3 { - font-size: 26px; + h3 { + font-size: 26px; - @include media-query($on-laptop) { - font-size: 22px; - } + @include media-query($on-laptop) { + font-size: 22px; } + } - h4 { - font-size: 20px; + h4 { + font-size: 20px; - @include media-query($on-laptop) { - font-size: 18px; - } + @include media-query($on-laptop) { + font-size: 18px; } + } } diff --git a/website/www/site/assets/scss/_lists.scss b/website/www/site/assets/scss/_lists.scss index 38763e5fd33c..b175081e1e25 100644 --- a/website/www/site/assets/scss/_lists.scss +++ b/website/www/site/assets/scss/_lists.scss @@ -50,6 +50,7 @@ } a { color: #333333; + text-decoration: underline; } } @@ -99,6 +100,10 @@ margin-top: 10px; } } + .list { + margin-top: 32px; + max-width: 640px; + } .icon-list { .list-item { display: flex; @@ -191,7 +196,7 @@ flex-direction: row; justify-content: space-between; flex-wrap: wrap; - max-width: 895px; + max-width: 855px; .row { display: flex; flex-direction: column; diff --git a/website/www/site/assets/scss/_quotes.scss b/website/www/site/assets/scss/_quotes.scss index 6d59798289f0..31ef263ae789 100644 --- a/website/www/site/assets/scss/_quotes.scss +++ b/website/www/site/assets/scss/_quotes.scss @@ -55,7 +55,8 @@ } img { - width: 172px; + max-height: 118px; + max-width: 320px; } } @@ -63,7 +64,7 @@ margin-right: 0; } } - + // Sliding feature is only displayed on mobile version .keen-slider { display: none; @@ -135,13 +136,16 @@ .quotes-title { margin-bottom: 64px; } - + h2 { + margin-bottom: 0 !important; + } .quotes-desktop { display: none; } .keen-slider { display: flex; + width: 100%; } .dots { diff --git a/website/www/site/assets/scss/main.scss b/website/www/site/assets/scss/main.scss index 654adbcdd637..81181e2cab8c 100644 --- a/website/www/site/assets/scss/main.scss +++ b/website/www/site/assets/scss/main.scss @@ -33,7 +33,7 @@ // Modules. @import "_ctas.sass"; @import "_footer.sass"; -@import "_graphic.sass"; +@import "_graphic.scss"; @import "_header.sass"; @import "_hero.scss"; @import "_hero-mobile.scss"; @@ -44,6 +44,7 @@ @import "_table-wrapper.scss"; @import "_calendar.scss"; @import "_quotes.scss"; -@import "_navbar-desktop.scss"; +@import "_blog.scss"; @import "_lists.scss"; +@import "_navbar-desktop.scss"; @import "_search.scss"; diff --git a/website/www/site/config.toml b/website/www/site/config.toml index b7e6b831d04c..add55d7b4d12 100644 --- a/website/www/site/config.toml +++ b/website/www/site/config.toml @@ -37,7 +37,7 @@ pygmentsUseClassic = false # See https://help.farbox.com/pygments.html pygmentsStyle = "tango" -summaryLength = "unlimited" +summaryLength = "30" canonifyURLs = true diff --git a/website/www/site/content/en/documentation/_index.md b/website/www/site/content/en/documentation/_index.md index ffd6c21e7989..36812d53b630 100644 --- a/website/www/site/content/en/documentation/_index.md +++ b/website/www/site/content/en/documentation/_index.md @@ -4,6 +4,7 @@ aliases: - /learn/ - /docs/learn/ --- + + + + diff --git a/website/www/site/static/images/beam_logo_navbar_mobile.png b/website/www/site/static/images/beam_logo_navbar_mobile.png index bbc0ffe0edc7c0e4ad580dfe1eec876788db4c39..51a3bd91ad5994713cd9130fb5fdd7bbce7405f9 100644 GIT binary patch delta 1463 zcmV;o1xWhY3+)S#7YZ&21^@s6v5??%ks&pIf=NU{RCodHSX*oqRT%!xnVH?~Zo6!0 zq1=KsVnU+CfC@olBr!&e2__oF7#=Xu_`nMfK0_aTkoaU`e1Ld~MqhYC5K$t1;XxB) zLs9_&xh%AWvb}7(?au8SzL_m;*|d8Zwmj{ZoY~pknK|G2=D&P1KodJFFN%$Dlkbiqc_piifS1#j`knMr=Hf_ln*9#d@(5M?4 z%Gdg=J%vN5Lzhm}bE-rH7(2S8-m@J3n-cCb4pf_m2c@k50cl9_QnFPX_YQ10eChQK zanuMC5g`q3))1B8de)g*>VWZ zWVS09Tc;r3x&wdrbvQ2!!CyHEEmXyGV{!4`=>8{m)-q3IWfwz0+(?u7(|}{#s4lhLa6*R+1c2B;Ep}eH}zc7qB@4-&+ZFz7^(w>2D$A z9BI?Ui{I@)9K9%_@njjWBFWKG+L!Gl*2>RLj&&RdU(Vm#%FesNO^K5(BRn`#EL58|5?NK87Dj@zX`5q& zBM3DP*JFmb{O%)^4^-I*?m#*W73lSF&$d8&>}95yB`jlduz%Iv;cD~NP4;L%#M`&} zpgKAzT%t-3I#fXbG7fSFA+OrGT=OJT|kN?>SWYfZ#=wm@uuuqs|AW{D53?^(SW zOF~xBN#$AGM_KIs$~h|I0*S2&n6DCRx5;=pd$=?fDxuSLT5Nba=uWB zjjR?0S_e%};B$?0gej@_?{MWLix#t*4~T9aa9Gca9L^ZOPq2Iy!zQsPyxi=rqM7lh z{n^8nkCB6C7FRVuG-ZPs6n%$B<$Q7sQYt6`RZVpa0f;xH}#%?@Y(4ClXP zB|}D;e3#GVWEq5ntMs{Q#cK&3Yq$`f%KLtJZ&hByx#5ze1LuDi+R?$9V8&%gI0y-s zAu;LrKXyI(XE20>>t375K{p!43s=&*KhSz?0L zFgxzqzvY$NxBXOpbYIOc$V#YN*#JF3TJ+R@{K1|gS(_8#wPO=aG|@yk?g3eJANK=R R`&$42002ovPDHLkV1hL9yaoUO delta 1443 zcmV;U1zh^=3)u^h7YZ*31^@s6ddxG{ks&pIZb?KzRCodHm|JKZRT#(r=giFBvdy+h zZPRE?s#0hRDrzl=6s>3rf{G%dB8U$vA{HNfQZS&8A}aVGN~xeecquK2l@=jB*@{&Z zTE(X6C25-`-R%{Sle1ZYcJ+R~P`{O?46 z0RsPlG`y)AfKr3AFqT;zU#6V6jPSeqwcuPMOks76{t*KtQY72EyG^S2w3 z#-l}|c`NnPJp0RVoh+;|-WW+jj-(-T3EG>e2Yl=5&iu3NejK((%V5tJ$?qk5soh?h z$ND^+vj*JL1Rm~$K9RfxJeiU&(kDL=7rN$Uh7}rrI;iF)>@Q>MBzOk0uM1dz)dO|+ zO4uh8&^~`1Qkw)Wdkl2!dyxH))e4ZIX*EI1=cUt{4@!ZPZD7!2i*3qGIOBs5X(wnpZgpBcZF~qho zQCvH}rE%;kTKkTHfpC@u!K!kSptQ|uY|iJ}B8kLCYWYq^f<%3PElV96UK;M(j1XxK z*47A_X6B?fx$~!3U&}Wch&{;qp|8G{St>q_5NQfl6%syh9XzheXF9cQa9nZ`M4F{x z&r&2G?uYTndLC;otpr(CZWsvRX|n1<0Hjf~I_*+pGuSt%Js(o56}2o@gctn1W)pf7 z^h6iR<$cgQG+*m~GYX)g;2y#b`gyvQupSU=R)d9$ktSe*6(R3w9;B!hUvt#avFqVg zU7lv`l0#tWm50-`p=Y7yY}VzvW|pLfJb}_G-IyBp_ z0V@>@qBnpKSt>gD?2{TX+CGhtYN^A2a!xS$8wN4`h(uecBD z)v?}Guj=wl!gAIAD|@UtUtE_OuEHLhLUq_e^$3sb*_z@=Ma!uH2O7?rmF;0mwj5Sf znD|fGgkw8q!To0rfAQ*Aj++Las=A-8{bu6#u(ewPtE%*lAsgnf4eO)}cS=Q=6ae!G z_xE_Y^u~36s2>HeP*{gYDf2knQ38%CesVM{j#7Kimd&lVeV0ETWqiZ1kFSHu?u=X3 zn5Vr68oWq2qfE#HCCC2Y$MK0>FC2gsb#CMTnB$z0$5ynO3(w4Tg + + + + diff --git a/website/www/site/static/images/community/beam-logo-icon.svg b/website/www/site/static/images/community/beam-logo-icon.svg new file mode 100644 index 000000000000..587667d29cc9 --- /dev/null +++ b/website/www/site/static/images/community/beam-logo-icon.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/www/site/static/images/community/diamond-icon.svg b/website/www/site/static/images/community/diamond-icon.svg new file mode 100644 index 000000000000..50930d56bf94 --- /dev/null +++ b/website/www/site/static/images/community/diamond-icon.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/www/site/static/images/community/messages-icon.svg b/website/www/site/static/images/community/messages-icon.svg new file mode 100644 index 000000000000..0f710d68e9f6 --- /dev/null +++ b/website/www/site/static/images/community/messages-icon.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/website/www/site/static/images/copy-icon.svg b/website/www/site/static/images/copy-icon.svg new file mode 100644 index 000000000000..6ca68a74562d --- /dev/null +++ b/website/www/site/static/images/copy-icon.svg @@ -0,0 +1,23 @@ + + + + + + diff --git a/website/www/site/static/images/elipse.svg b/website/www/site/static/images/elipse.svg new file mode 100644 index 000000000000..5e0b429aeca9 --- /dev/null +++ b/website/www/site/static/images/elipse.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/website/www/site/static/images/github-icon.svg b/website/www/site/static/images/github-icon.svg new file mode 100644 index 000000000000..f5429eb423dc --- /dev/null +++ b/website/www/site/static/images/github-icon.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + diff --git a/website/www/site/static/images/info_icon.svg b/website/www/site/static/images/info_icon.svg new file mode 100644 index 000000000000..1828e45fcd90 --- /dev/null +++ b/website/www/site/static/images/info_icon.svg @@ -0,0 +1,23 @@ + + + + + + diff --git a/website/www/site/static/images/logos/full-color/nameless/eBay.png b/website/www/site/static/images/logos/full-color/nameless/eBay.png new file mode 100644 index 0000000000000000000000000000000000000000..95df6eb4b2d45c3952cb1d85ddf1726180236d3a GIT binary patch literal 90243 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 MmA&PaO`gB}59!|cJpcdz literal 0 HcmV?d00001 diff --git a/website/www/site/static/images/logos/full-color/nameless/klio.png b/website/www/site/static/images/logos/full-color/nameless/klio.png new file mode 100644 index 0000000000000000000000000000000000000000..2ddab743d9b401cf4fcbcdecb0abb7a3272e3e8b GIT binary patch literal 9212 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 MmA&PaO`gB}59!|cJpcdz literal 0 HcmV?d00001 diff --git a/website/www/site/static/images/logos/powered-by/goga.png b/website/www/site/static/images/logos/powered-by/goga.png new file mode 100644 index 0000000000000000000000000000000000000000..278d4190ccf83f5fb5b94dd26b305a19b3f2dc90 GIT binary patch literal 44510 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 z zt7v_&)ZdBkp+jm;?Yh5xJg~_${A4n&^dip4sWYPPjFnGTL{FqJ9B8NrjD(HWWlY7( znqkVu(G<9(uNrDG-HytxT)^r3%sE2%+_Kl$CQ1!~S5M;5JD9akRJ!UwkeL5wQeKbr z<{iJ6{^>JEf?Vf<6UHycybPISXDpaEy1pUDt?L7aLtw#zVJK;A;(2)_CnJ8tId^v^ zX;R9G0{E?wooE%U!{J>Jg{fR{8Co3A=1K@LV&Wh27~JEk2Or(r@vBHp)uDN)&Phw7^7hv-?(1AcAhLfzG~Hr>27vB^nHCF< zf)QEPfGS&pdU8D9=cIq)!Dw-y_1HId!)$ppGx%kmNci+cd?wDBLpR3(H6dffz=<7MvG$k&>=N1xO5vNTa1qgKV0|JT5xx#>uAxk`fNY zPx@cdUWbXYV8##XhODwJf_^vq5BWfu0e*K$deFZKf?gjxU3N` zWS59}yfRQ44wMB7WPM_doK-gBO1C#-CJM&Q5HTeix|~tF=wTXqx;^v}bU@A)2-8&A zVnEI)`@9)w?135$G)hAxTM@xq*znfvK%w4{*tz25o9ljFZ~eQvDDhhyhZQxx05ms2 zX*UP}j9k=@>CUFJYgh54Lj8p8s4c{pFC% z^2@RI^@m!0S&-#>voOfst}GO%U8I4W8=oJl6GYz+_GDq@&V|7QGkVdLWTMSgBuTvu zheWKt;G^z3&ZxVqU1HX}Y48V+-hN2@2=HJ1=~@}Lt<75@Mb&PJv?XeB1^XC41?`eSsYwEN z))!1c@vrnkt7Gg7t~iz`K|gu3v{&_(+d!}xwRjFoEIM-Ks@Qtzq7f2UJ-zC>3xhD! z{@2suMqwShN2*Q(wlyKFlpe{>&>Iw~6Bt-TXF^Ljls8F6h{qjmSE^6zebL0{miirp z{>03T0wL^E%*L#FV(e8EtqK6khnJ1=-k5lsq#QbS{vuy+Dil&6S)K@c)q(TB@Ar_i zMj*G?UE>a+abWOtGkQxM%c@HFUG^V86Xz_DE(-#~;XHoDCdd@L1u_ho{qRKNkEoIR zaTUP8;9|FjN&Kp<@9vC^Y#rg$&WH|oq6qQNmY6-Pos!THu_zM|WU1(uc58g8D>2B! z$G1Y#WFKw~l5C9y`EwF=h}SgjXS&+IN7T3th2kns!L850jS1{3S9rMK8{o;I=w5}L z)l)IZ{jhWNm*US@N812CnTP^;#;4{Qbg9Pj9CarKJ$j!JFXS~69@Ik z6wTh6AXNUwZ5V)sb5Uo^+ZkGFO03Do(*AwE!{)q3-2R7IK`P&_X)=(rH+Y=WvB3#D zWFJ;ChOeQ`8+UWc2l%|Pm}eP|5Vz=Qv~Q(nl?ManC6Jwyy2D!OwfcioFZA31J-5O1 z&0+ZZuYJj*o1>1-mO`b6m?a6`^Hr+ym`;ikApDML8AP){(s=CeW2vkyS6Dcwqw3u<#;UFV@{TcpO4h}2HY@qJwq~AU% zI8*mNp`q-tQ-u@u$$1@+?gya%#?prOrq4zvcS#_B9|tKr=9U}n>h;?H`7BAO$L$)? z^6ItL%>?`OCmG4JkYM2Ddm0Mr8BOLHr^Y=7T9vMso|^hU1vhfZi7Fsyws1Y{M2mfR z7R6U)F14N1QIhw=hq+k1HP~0 zj`fz;-0jFEUMKB;o4d>@w+__DPmP5}Ibg{=Fi8YpXk>@r&_gQ!MXxuHVr|pKQ~yfr zM+@U_PmHJ4Enau~4aD!UMQJMgD7Ko4oKO=J(eWqs&7>}2(A;jw{C%MM@B31+7XTjG z1mx7LN&Z&}7BgwXVq^ZW^6P`{r>j|#MZ$2*?cguWA?F)}iW2a007_3HA-cDR&_5&Lh<)NWD(MH)mF_ujHH zoc?SM^sDG{FH;DkPN<@5iemxz`YIV+KG)@=U@5`ZU=ffLIGC3whRb-R%@zDBn;Anv z3dgbak!=Qqj#F`~%5vB`#)O^O>||*p0@=(_y&d_M1F03( zAR%y>6@W?)=CL|VrMEeaIllH-@mlS5c?0rG`@);QH&PMLSiD_ z&2(B3`(#_z7CmkXdDh^ulwo;E%p-kEsCcIWSFcF-o?)q&;NI*U=2Cn&V{$hr;5&gE zG>oQSmCFD3`8T1R_dQcL#pZs}dgX`pg7>Q{rSm)NWhs8~PXT{Xw{nMM$p!kdPc{Q3 zB=2dH)q;*%T#@9orHk3BQ!YpWxMA2UR@Gb_+>JB%vK*X_HLswl?F^oI?xvgL^MatL zx^4m?qV6%6u7DYu508%T9is)8XdJ^TBuQhxciwG_s;9wf(3xb+8&;Yn4sDAM@?K{8 zJ{4;#$J`-~@hgsIYOKh=k}RK*)Mqr+YEHbMlu)8o!;`mkW?GqUA07<%vu3867thor=@Bh+2O;5oW4#xJFP8!$3gfa~G7Hu`)kPKMV&fP#Jags0MY}=XZe^@^&i`C`lHVs6T|17`G(*>uI}K!lfr+oaNwevDOd8pWWOAcxJb?+6zH3z^fc@y zjRhrdQfG8B-<`kKIsbBVqPr~7qg~J5Iqb<5I@sP8s-jkdi5MAn{*XSTGt!hw`fhtZ zuaPe?LZY^UygQfQIjkXVa4hgA2_^=%gUl}|~h9{}k<(FGj%+(3cV&}MQ zXYWmLjDN>a%YK>fMnJ;1p@cQYzslj@7*zxmNoDA01LoLTuk7TnE?-A{0S-3b<*$2h z&vQmp3_O^MsKWvz<6e|7{q@yXe9ufaZZqe-fBKEpIye0D{eIZ=!SL;DbP#G9X6)+L z&A!L-6j8rXY6&?{$1qk2S=#usD5y^}5H+*0$^OzeNWC;7w^=a!!%PzZs+S6un2j2 zZvG-}qghpXpcNO15hwR?!;&$tfxS3t?nYgzCV6lp(X~Hs;WA|Z*7@eVvDAk>{FMxi z--`&!U8V{WY<-f$9jH%^(^?$n6jrgl709@25rqyT+WKbs_yT0>wrbVl#WOxYLBNO% zltC=Fi^;^;eQ67LlAhl%!Dy+=@1z=tIKlj+zi|^+H4N7#b(RnHHkGs|s5YnhuN02{ z%Kfz0*Vaz`MJveN`m625_6F?w`ZLmINGWsWSHu67EEG0lI~m&=b|cS6XYigY^v)L% zzeb!>-g8@X?ZaxWmZ~Lj$d(92(p8fXG6`PQAC~;^j#*dj7jn{NXh9|5eCXeNvCzM~ zPt)D=LF2pg73kj~S0RC=Ao*WBP=rI!eTC<+)cuz;UUQgo4fsLBvz5K&`u(CWFRNch zoSDXJ;Ze;H>$|uD9~--swEU#`0sntj|953EVdqk~`rT1LkifSe6pqQOTMa$hMD13R zC~@LoXsYre*|B~u@IO%hkZ%r#x_1sxzk|6xh@a?1i(>Qqzh?nNxJ&8na`1i8Nb|~w z&}u%=7;|02S}rLqbTZa#4S?VI8dwa+tk?b!_2T*urtL>;5gVHAc|(fEPJA2odjR`qM9J3kX9)pxp_X&3&sJNPnPobjtazC;K@`;X7~`6z;ilQ&}S z(Ouk(QCAO1(ucy4z-m(2F$A2iH=)qw8T4jig5qz!g3p29LQvXyK7*qOj7E&jYSrRE zkw}TRHv3&jHgFn4Q59gtqL}yg_xfuzXhC2sAXrEt4qxDUq#J#1v67x_So(^#96H#$ zn$q?#=cj|f)Y-Ab%0IPCsQ*LLRfWaX1X(NucPGIuxNGpi-8B##1_|zgpuyeUWpHC8WUJ&T#XNk z7mc@Fui*~vrLjJqdPBLGeGJLJ4|f1YvN$&qwHY>Ot~Log_HWhf2XVT*8InRX@wY64 zs-cJsx+B5jYTEEAdsD}IqT-L(L2>fRd|!4YPV{n)ItRh-rY6f=3?6M9?SM6m7?OS; zUi!ydK4v-&6rDbhR5AWm4Z=@Wg2QdfB1u`sX!H?n);hdtF`5{!6H>!_gdox1v2r?F zYr>;6={cn?Ord6hbF5fIrNH$eUzX3tcwSAPwk{vGzti~zW0O)h%F;NSb2CVT=C%9H zbsdNr-FE-=8SSoss+J4Q(2cpI{l($wkx4f1V`a-EH$v^5+PwmLXgmGyge#$SNE27r0DYH7tKfaGc%8ygsgDL+!HFLYjsPq8j2(x6E4$JE zvc>;m?P2+C)%Iy^irk>6WT{chQ!enelfxS>1Pi{2+5{`AuCnOF&{}jRopRjgy@V)jn}Fn@Df?*_)r*u)B8Gnt8X z;iz(q>eW0K=;zGXt>_fF+c6cP>!Qy$rQ57jdavp-IP(W0Y9=S!1zEM%IM%(uRsEZ- z=8);HC%-eI_SU{N-pGCFW&hb8(i`s{}F(tnu1zYagqxY~nv zFkZtLBCrSKwTnN_G_%bquA#Q2P${;Fyk@C9ojcn)M~9RCUR=bWzZ8+7ir+28;lVbu zSJ>_(5&r%BO5zghTXOq|`DQt>AR^@UTL9nQc6P^!GJZh{8u&?BaKb-JTjC^`BciX}2Bav=e`gVtiGdC$PV38gN=0{C zLtVKU=91qWgCCW76M2DIqrY0H{8LImWi9`8=jTSc;qKZYmqSd?*Hgr>v=C*4Fc6gr zrfDz@7tx{o1?kg6Hg%-_sM~FgQh1Tg2p{BXg|9rwII^@I$P4XiZustSb$G3^Fc|rFAW-m;1PT45Iy6s9nN% zh7__VPNFlg`K<)m>Tz*PEQelvkv%JzhBMJu*^jAs`&@C}KQz4N~ zr(#y+2)RC9-uORx=!jsD8{Ll6MjbF*GN08lnA80M?V|lzo2kvP?}Z~-q4yhH`bWn% ztOJ>z98{_sgu8}jZ;qu;(f|xY6)9Eby@ZgcZ+C4X>a&8c z(7C7~{tqA7FeT3`OquGvgj%3B?Q_K{B0WhafL#t)trv$FIu=-}G5!m9jMQ5rHhKmo zQh-Z0o$IPu`?oXmis^rGH~soe^!XOPVi|)TjKX`EQD!*oh#1eEaz!4M7m$~;!7H%d zJvcOd?K;00@?|D_j7Q}3?)sgNCMzPBdAY*R z5DP_}xQ2)vF&=TAwJUNYDK+QyJ;f8MKkGB|aykUgv}SyJ(|d@^(z*2-8{#}rjAy`P z>k)#%B35DsVIt(gsX=l}Wd90(;_`?~&JsZAr7Y0nL6T@tj6g6g7=7Km!6~4jYN9dm zAtn`>B&`+Oql6Eb`vRR)_RHOIVbBiu2{7J=vSYgsN*dgT^*A|A$7DqBKFC8G^{+{K z!E1_G)NZ(!@zqb|U)_~?Trh3unE>mmv?!H5IK4hxtoyQYFns9JT-uWU$RRRV#~Ckc z-j;S#5iTzYZ-wmKhd_47?98C%b3L^jg{UO%k|^8sDkZ*7*nq^+GBqCF#I7d#rjU2;2#}{VaL$^jg;+=)Sqok`sj=ecdE9>mlmIBA&6^1aO zrMHhKHKg4S^wB2nFT{moatNfhk{Hsev3bC5T$sAf0%sLoUNlFJNcU`5_;_bl9oY~2 zAz?9*0RiAj?Idai+^x@n!Sb)q;ru;L)5+VBTgUO$HG{DX|9hgFx}!%51g$8947tpy z;djbB)A6ehwb3kIin9>k9#tVuvBucl9fqo)t*)eT}K9-VuFPT!XDepQbA z9Ria{L5G1LOr*`6ZZj{Ztv91mmrymc3EOj_@mKkqqpfdp!1_=KPW0|L@H~lPTEp>F zCTHZ&zeRQ5j=qu0LPITTwfBm?=E4exmm$|3c^glHs2k9==Xtb&pY=^4AejaB-^2GP z%hJiXJ=mm5k-#wXg(%1PQtI4UCzk6oZ_}}F(~mD)QJ6H~k|taBdJJ!6&=L}nge&JS z%zVFC{pK&J7r8|ygc=l_PLjZ>DJR?KcV>LOVdc@lShD8fb6}iiEF5v=Apc=PzulYj zZa;oC($X);kj=b`6aH)Z)w!U}2fc8sBvmIse0 z0!WX?)Hz&f`H8Mf2Dx#86~Muj`}A^ThVhRpL>;hvBgT$Eu&pB>f-C~r(V*J8g`TDg z+#lN7$2Hr#ZvR@YCOJ!P*#V?%8m_R2!M)wr|03*~Tq=;eoVi;39U_)o2BM*cLv&Bx zg+}FyXUc!C^`Vi>sU#z8G(%jaRN_z7R*&1L>{Kxrgo~U(YFi+@B%%t3D7nzAH^zHd zV#}RyD^YE68oH5TxPQARD3wNG8b^%=27+q5m%4$NwiFEG7x5)%My_KG|7^rTCRiL7 zgk!ezX|ga49S)zvb%95jcY5}VnDJUv9l5iQb2ebo5vpI=n@Ig>fWQK~QSqBSj2ml# z)*7Ry?T#9-YGowSh{hd>R)0-+X|!zDCmzEbA|3Eft3=d!l$2?E zXH!$cEbFOd0*S>UP4wJp4PmYotGrGOhlR6G8P)4@skqTfYe(Z7Gj*XBx$C>Orvx6C z#~h|+YXAuUd|4KzHWV|m+huKUT#yn>#bKlZQ;KZ^UpHbyjueQkVClRzhO+4jYZMCs zCgs0?o$Y`PHDezfTLK_}oQ$RvsNv?w^&84|m5a%D}N=JaK7R?(-HrLgHLU%!9~Vwqw0FD~t{tjzVSXccuTuutbHXlyHW%CK2Iv zt(xBK?^0mgDO@RS33gI3m)pSj_ZsP+nZo6C$Cg${RpuHaZCc6NMF#3eR?r!q@o1q( zGYq!Cn;_FMFfxX@YMtsWK69UPsVii!eJzSS%s?bbPL$PbVv|88sZFQ{PHX4n=5$2L z&h|q8qk%XXJU#*Gdk!cO>}&U*os~m}A_`<@XKCxK#86gB%j8U>1(($ik<8T=$fi#f zry`0ItLsv7^Em!obJJ?tj2y9qR=4Pc5CeIeiikcsn$%#JJM^SPT&7k93WGiSBA~4#DQS-n==mavVYls(FMCDKf zlbyB{8RMuWOaCaDwA(Z*y4^1;K&aFOn9EJO>$h>~lT-Mx7s7IM3FNf^cSLZyOFj-^;EI-@ zK+XPxtKB4;i?KiCm1nD|J_7Ikz=;jQjiOQSxR#N7at1M{PuZl=O%*AD>)VVaXM0D{ z50lpwpKDPTPyB&ce>JF4Wm6F672j;CU%MsJgqDR%t^HRkP)6&C*b-htBXORcMZ4b3 znQNtpv;|5l9z}rhQB!e*++a24jAvv- zCEH~uyJp)>TiI|$uv?rWMj7VXq`^2%D$?LQ9IK+EzKa8)wMk$+ML~~K*@xwsb9|5@ zsKgkFH(i@I7=086g7ZwK{Y3#^a3HCQkH;jf-ZukBQqvx}1MU@3^*JI zJ}XiXI!Z``M;I9Sff@slJvA$q$0vKSpjf$z^AF9_jbUR2=I6eM<@g#)h>`Qqiz~Xba zt?y3xS)HN;(-|~=?ODoR_x2Ef9Z!VdKOb8|hvJqWMv@#?Hu^dZeSJNDc?rFD)`Aw* z>Nwzd!RY%d(Uem)H3nt3l)W3tQx+v?fQ)!zkO1o*7#8srODak=yWumpy3fmHst;aZTw0Rle2I+^4d)hD6GYX#_RpkfM+p$D9^^R|3VvYY3thwdf*vmy zf=$2}@uzM+r66WeropJiOZs8HDWw1+}+yON4AdidChk&ce@>v2JO1fOB z^kqOy15K+~HVWz&nw}Wemyi*)!8=N@N3*lYb!#^47q);Cb~FN5*y2!FJXWprzq$B~ zBR(YtJ4P^0AcxP=Xnd}zWo+`Cd^@)ts?eXt-Ke~r{@CqT`?zk*O8la9M3;L$3ZQv^i{w8^4EKrKH(6R`x>S6W+s!XX z(WAFGs`^?*62Ic}LJK{Q6~8@#+(0?jUDltdo20@r$T@DzB%+`xWRl5b1RPGk4W*9_aJZqn znL9DNa=)?T^(EzRw1b0HYvwP1`F#qf*#jQdd9rgM_BcIQujpV`qHPcfktt=cs3_rY zlfSiZYs!0UykfKk!D8|quAAVC3)v}tSTm$Ss`#IdZ0ZW5N{N%)2S!D|7tgZGhh*&q z)X*s;9JmC>j(>R;Odd4pc=`?#M5|W0GDe`%3Jrbvt5~fOii2BtOdlxYjzn5hfb(tN zua=Hdg`|is)4zz|vxZJF`S**uD<@=R1W<^3eSh(EWR}gBJ@Z}Wvm%4og;M1z3~pl)g3av`JB=%CDSupqlupoj6xT z!)=#2xmQ=}h^&@mR5!IbhW@yZA^!b)4uKbrr}d-SwKUQ%FDy37>Lg=n3-XdMqDmT~ z#7SXw4XrG}EJ3_z%xxUb1`P!zX`!=u`2*2!Z1tF$pZb&XPdF~All1n@d?7gqWF*Sw zlv>E)gy=?6JMs@mQAkTGU>&|cck;-dZk}!&>ISBuBHr%5ag$z*-sb)cs`to1d{QqZ zH!I&r9FUZ<-x)#q72rl<`$#S!tYV+y$Gy5?U;keM*tdu+zM;p8>cb1BD>gCUwo8N# zHZ)pTlFsLL{7qsL8fFaR(*ICMbmrUn~E( z&C^6O^!_*wivqkh zu`6~3QA@hg?CM#7S|gz%UB$FuNDD;yLqLlz;#B#Hnm zvTQ$u`(Ke;new$l;&#|NV{C=$aZ=qv^1bh3G3$!_A6iwQ39RVrQAZ=RAT7Z819-h( z2`217S7GvWi6~INljHu_|L-4*hs#_cC?h9Vqjcag1d-n-#~*z)qyz$gkS z-F{wKM^=ff;wS}c5d!oEJmUGOf0Nqzt`Ek;LjQrg_!60cF0G|#=l_TUd2JlJtIqCXliw0%syyxaMfla0w?XBBdA_RO$L0ar*C=egL{D#LPdM30flU(<}oPP`ZoBk-LrA4o{ltNGr z*F9kG-X8R>$9i=few z5hk0|NSjyB#05Aohk9)vkzpxky~{q1OEYOdG3=6?H`4QEb>}U6wRjvNGok@MR4MgR z#(S*5t&@O=JMY+4y-JK~txPL~EbtVR`^;*vBQM5Y>lQdDlR$)yF_MUav z2xjJ>f>t<`OUp=OQh=4C!L#!uCC3%XLcflmRI5sq*i;u8CHHk-TA3#w5#QyfmG$LvGFMUTp^xsG)jX=@StllMgen{p!il43d_2&KG-=LaT}H3WrV1^}*w;?}Hxre-yW7U^%BDV{l;}QB+fpZE zPmG*T&{Q9b`YsUkZJHj2BQSyiCls*@-kXq&QHDA z4c$;!xQAt57}An%r#C>qm>h>i=ki}idDt8T=MpJ6kY-tD9i;zdGJhy<`y#12vw}&~ zDi1Bl5{89}3^JB6!WVjLXgLgsNU@aXOu>$`9=et!#QT)7>O+~!$Ho-NNPSabV9`?Y za*Uh^2~nbS`|Yyi@VN5?JwU-5yt;DBwREeIDF;&ca2Lb)MJ-Nh5-jn**R%_N2@NOw2>N)Pn zXiH1_P`C34!wR0v2<<-J+_+X z2y@s-raMY+Hl5yv3>SSSlfD&L|Ap#E>G?r<99ny1ECi`f{dkLG1#DKIE{`G2@7Md~ zCBRp0vHO?DMD61C<{xIDIe3Fe(yFs29$6c&HLqjFTaV}Wn=j$|>}EePJveSdzam0N z7Gg#Fx)?{*6|z!_1h>?jmG(;ID8Z#UL~YO!>+ z%GQ}`u-wb&;Cri8?0~$m0Mk)xif^weKfgqg?`1enLQ>Srah(tziNtxew_o8WZtxxQx}V^*OKLL%Ul% zZi#u$ko#m+8EQP1@2;MnDi{v$BKtE>cJ{g8I^ckyjH`Jbq9gNr#I4eS zU78s${4<9pflHjMywI2Y?CLmK!DU;(KWc~;{L=u|AgeDT(Uf3>oxhT>z#*j z#TMz-WA~Hs+kB=$36v?~7G|g2D|VG`BP1c5T;qOhV^bEM;ewJ#447QUW|9z*tnFZLuoI+6Qg$%F$K`Q|wNKGczS;>D8G>Sm*`)e=k6ZxFzYHOXDz{WB%8} z$0$Q`!Vhu*=WHd*oyL|E|mPg!Yg ztEP-HdYPIUC?@xCcZV4koAF_Rho~*AL~3WJ05Gkbl+6weU>Umnn!I%4rKp}Pn&-w9 zgOuAPn2t{E`wyguQ9`RnYEO5ABxxMxauEiR#4if!S?)8ppT2c_oj(D*V3Rg|*<5_V zdRPov0oCW5Pot}as*i#3q@1_A-m}}!bqTY|9j*;Loa-<y#~%Cq5ma~|9wK)T#PF_UFmgGbJqe@=y2i$y`H6n-uhKc`Ot@J_!xASt74}-A$VUC6i_5}I?X(qB0~YtuJ+cj7v{Gam~;x@1B1AYBF= zJ!#AMHAU!}i;8H9K0C7y+86TDzeWyB^^KY>vM^bBd_n`y4Sd}TaRVO()gw<<>kEIN(8|8`ybM^i_&@%)mbN|4OR2l3$Ag(I*wtRNVd3zScZQG1 zfY|skz2eKg(dN~MI#V0kkL^dm+2lLih1hrtv)gn<`~MOd*|oGF78x19VU+kyaw|IN zGgs;hIJ0X~B1pw21c!HC4$o|~!t;c7Qhr1DdT;#P@%9WRaa|9)tLwWXYbYy&1_Eg6 zmfCqe>jbtnIaqrhp#I`BJ5$yf!0{G4Mt>=|1kTKh|7v8a6cIqVZY6;xhUGOfCK5Sj zzJ`2uaVOlL$eb5f+pa75+Uo|nF;7^-ko#7{Uy>kps{3ssfWmAqcj;dKI%=Qj(5{UN z_Eo2z2%|zOAG0ZCa@l-VdI|Pxn;1n$hJ;Oe+?wodPm=8NSgVpFGMc!iMLIxU^32(w0g3L-hn+)wAz@cTB7|g_#Y&{MT3+~*x~tZtY`J*FrUE2 z=$7Z=#3(>c`Qq#o@Qxap=?Ibjx&bI7uB{5@kb(#%?97rgvMlH6TBh1m+FAR9yECQ0 z`9>_cS3|aA@vC3Ku8>dzM(<5ME??lum7$F2nG7ZqKiO5GGD?NbtMT&Ch>yVN`+-zE z)S-)ZK^jxn$z|b`)?st{=J{pXkunZUK9$2+Ggd4=R3}yCN195SEK3gKo@^Q(txDx`|rs+}12~al6PppI)M5!5- zNJmG&$0li(;?pa%S$9cIqEf7g=jwKTjkk_%`WFUkh7e47EXq0Dok@2zlXN{`BBexu zunPO22y(E_^F6*nyCsX^1nLZ59{2zD&&NswMFSFg605_aipA|&-8FJOc6nMV^!0+w z>IK~&WyvPvy*Ia6{soI$SJZbTyE3MyBhsf&Q|v2Vz=ZIsFF@}NuznFB=aQI!E1@}t zDr{7N0J#WM3pPzFj&%%R5GComRG{pG^RJ@?bM25ylT6onEfPSr#pSUM;T{^Fz`)ZIb@L52_lM$8TIs6`hYO9P{!;v! z`^|RngMp=1@eBIWRbu0UmU`mW@_W1?mU<$~qmd0>8>lLd0|VWyit;iO?9Ki6U+%gKz0zXB*w%Jt|_V zG(XV_VxrTxk|GFVJjIXTKBCd`U;FGc*eO`z*S~_E_UQdLe^5QXxVW3;*SqmLY6kd< zg8=NcC`pC6yPlixcdLNh34?+0qy4k(u7Z3@KoZ_&Gp(g6?>{qKjW%S&V`(l>9^=}Z`s+P;b5y+r8fG+B z3}ttM2%{t)x-|s>Hb*8utEbz)2z#JEFuipsEF&!ce~WejK$o1foz@z8q%@U_bbzWA zlJk0AVx^`P*hP;UV$xB+W&EJZzjt{2OE(J{x5DK@W<+qUAcG z@-paCBf-sIz0)|Z2Q=kQEd3+Eed`tJYpYGDa;bhnBaK$7)a`8N=jX16ah-voXh9cT zm3J%Q{rOH(EBz73N_7ao*?h^nN@CMim^Ql12a^}(etHZE``q~WceJ47moliWTDqoC zaYbXPG#!F6|9-@wZU~@*q#bJWm;wMstbABt>3V9-Y-Tt~!5kJz8g1!67SCmd%od{{ zl=IRInA5~|Dghvy6g4%!-NNYi$ymXRUj8YKBy(G;#?%4vwI0kuw$_Q_&Ue=E)5pdJ zp#%Jv%D07DrBI8SzjNsxQcC;3fFg@IwWu85mttdw-NkeKNKioJX9v8YFiI`~rFFU% zbezPgn{$=tFrY1WF!m0@zDw`l#-R;)q+)Bq_d8@3y(&HtKJ|!U1)H>!Dn7Cv+KA_J zNh^z-{o!foCaj6E5wI+6mE1aGzcC|e?uxS=w+jNi2JXYr_}SnY=gq=#zTYwR$>=WV zfhDip4bhzTS z+VWX8u0`yTt~_IpYH{H763ge{mW29coYd4xNkjsP~3Eud=^zrkVA0&e~ zNN2{uDK)c@>0jho2tGDnB1Yza4Fov==fdRi@7_>`j7$D(nk_Wceonc=oHzHJr;PJv zckS9q@q=5}9#UCZ`@9Nv7bV?BQ{UOd$Jdpe^FehYi)|Fq8w>pK&o_X?#+odDtx(rQ z^c=o>B%rt-E~hu4QlIk;NP9;W&CU&}1*1S@Sv%T zw;9!D<)hA2(qesKZMMm=ptBnacfWWNF-Ma?=YcRobdf0RZ5uxR5_vI1^naVI9;JLh z$s7;W`ETx=(lY-d|H#UfKpAL`olPHTeU+~SKq746QO===+JfIQDj?iO;rG=QS z7MnEBX5H}g^Gw5L>QPAr!VT(mNtEx+YK0%30@G1#0ssgQuNB_}SkfM`srm9Q7T1Uh z8}~t2cBbs6nuER{xF5R7OGO>HSC>Z<%`yvf%mvYuf1#Ty6EC_@W%;kk%xP*C97we3 zd~Y(?_%A)1Y^(H=cF4@KH!8Tm1^8|k4`&yX0Yz$+_wv1A`8Ml-ljB@ZJK4&81X7{l zkU-TtYiTtDQv}V$LhlB}y-ok;s<++9m)GOV#YWyQGsG{L`k~|u-e01=CIGq505s*Z z;3SQ;8KIS#%R>^BDq^el-DaO<+g;K86Roqw{5n_Druvuvj_0q%ZeAkJl?26oXw3`B5bY1b4mtvkyo> z!Hp7Nz>Xr@xoJquS(vDjgJcEV8QNLy$xhkM_;*+4V|@tsUCY8Tf;0#_wQJZu-&n3_ zGv@*O2WZp{b7-I5pH@KaD%s#|o%M?;C*SoD4s!mFAFv;UD(5;trFAY`-(J~qnFfv84$nUn1Y6Vj7H z?Pt0~S<0+V-=l5(6;_K3Y|aX!(8l_Sn#MMG!5cv8>sXsA;I8J9LnYoL<~0)**8hn^ zJ$y~0(zfCK*t_>pNBF=&ly3QjW}DJ4l^>p}JZZF6R6>MIa;as)x1=+UXjd1*Q{eOG<_XU z!_S}|3b=b_YOk7FJ+paWyJw;)b|TecBue>mcWPPGFl)_YzHvbe7l>u5fJ48)=q|4%3dHIVn^>;OeCaf zE~ELh^+dWQlyoz1R#EX{-2LG17vPAy;uccl{&Lw6943wxp*qXdypr?F6e!c%@T)E! z*Coo1hYu4^H?g{OzcAC2TFKH>4KECGz5#8Z5EoY_AnOOp$*G*;UhHL;!7a_~D zsV`MZd8j2Wim}sz@#GD-Eu-C*DD-?baCKW9X$20524$Tr*==?Oy^ZHJkhD-xP@f$z z&gcHen(LkMnYl)m@wEU-907LuY`@0F1YUqypt_ERb_z;6TqK52T{4)LW5JrCBZNv% z8WdbfYB_wky&*Fg+g$d4OHm}vYze$*MvBgRjB298%;6u11h?>KUb>q3hG@^1Gg2o0 zm8h}hS?_f>E$D2Hzl>Chu51? zKP-*pD{4->{`H9GaD4yk+M2r+s-~82-ym|6?-Bhle~*MIDw&#g$wq%=HwBvZmP2!$ zEiSNMoQ;FNkTYqkw;u_Xk`T5+zsI{&Sy`{pu_n#^<9DWDq~86Jon21L|?f4i3XyXT>>=SFWdQ#TnE;f-{7G$PfS z4es>jM{@r5-#xlE8=$4J&qm-5Z%V~%us$bu&-o8+r*{Oq$&O60=N8p_X<3?LpdL({ z-F9Qv4y1Kt)XO6k6;qfye>{li@(@ZHEJqk}p9_1QXTE*hzad+vuVfr}PJMZM-0ZnY zza`=0a3^Vzze_8=3`Fb{1acrg>D-3+Z$Q6b&jq)+klt_8r+1pkzg#0tR;^Bd`uwqt zOk>6Js%Iw}B;w2jKv!jYZr=|bpcjU?P5fi|(2&(?oM7)Kg_)_13l|D7&ySk2u zSCyLQ2|uKI3!2j;+*m}~12{ht6B0T@QosI@4*$OF%bSpneR{fm&@OkXAe&?U%Lkyr z4Coc1vi!XaV1CP7On~pw^ouP|uMti`jZqW$s;PZ6;`z7EH>_MEc6MO&J)D&`=Jwfl(?m?skQP4H7^-9|Phu1YrD_ve6Bf~-ql0%Oa<+4+Bl69C4VyY* z!9}S~ZucB!qL7Iux0wY_oK;DDd|5?lp`-csZ;f-E7y6v8-$O0POD(#7#`HHUPD&?+ zY2*!D zO#vrrp*V3wl`O-D@(kGxvp-O14%xLWSse6lK6`K7WEhdC0Z~ffKzcb=hwk? zpNy{D9mZyAz>RNW%2^=Ni!*6WjLE7QNsM7M=>rOTW?_oFzK&?~+uQ9gZrSRS_Uq?d zmo1;RC8HI-z$dCi9I1!|h87wFbpw)BVQezlC2KqX^f`XI;j?CaC8aw;3{%tLdc~IY zDx?|Rg-wT_^o>}}v>MIs;c!wBLQ;;f;#e?sg(yu{`&Z3A)4rZ;4FqshvT(_IT6Z!8 z&f)}DmIo7eJyym}YLT=O)&^mANRo((n@X+D%wkDH3u65FilW!3zpfX{7gFtCmm(tc z*}r4~On)o_3Q@vI^o$NJB`SfSprgYPu)p}VeXtdS<9CL0uz6q@JZbG%jNhq6iu>cq z07uw6-4N?QSS!lfrDiYrjH>GQ57L#VH#OG3-OME$?cmF4KI)Vez8}q$3un-5lFE}q zcf3Mv@!PK-*45U8{(TzV;)eO~x{=uPF;4m|S~uV_s{$-=_Qis$>bGKHc)=$Vog2Y_ zPXi1Y&NBbnr&LYgAD>}0yZV%OSM)i9WF>ThT4QYduN2I{ObvZn`N>O^8TQp# zAxorK*p(3_RnS28l3q`${fQjz*<=cIQhyR&!9?k!2kv1+I1M4{;kwF@6i`~s@a6c% zH5UHqaR=GUt7EE8E1==eo6@{9+~<+Er{!4iiZb1zTo`}10l#f1dV)q3NQoKn3HXgR zR9=BbLO4f~y8I7%>!#B(Di(IsOq?tzJci+-i1ND}q*k&iI{KS2S%Y=;HuUb*_XLKx+QyH$Us3UY26|2NPlu7t7@Ec z5*74@*9w7Sfg{Ic5bnjxUc0KwWPAEtQEit`{yM`(Khph0WMPGy+akR>VE)W+ENGC` z#GE7B^9R^U)e2BU4_Cc~9AbvHcMa0Ab36vZq7m{IoLV_0flMb$0ew)^$*jl>p}9() z`d~Cz?807Jw8z2~qc)OtMjdK)rsYXb*7SbeYdpIChO}sU>{Tqq({aUiBsI$l>l6x3 z#6!#k)1wi8*QYJsyYnso)v2_RH^2Uur#>| z->bcFU`)!`BYyWwCv}2bQkxNSQHee|Osi0xQFNICbH}VkV5Kn@X#z{{SdpnLL!7s8 z?!>V2W2*Qg5t_8l=VZ}3ClQ&dUrwU!W|clzxM|2sYr0Y+FyE&Gjb83rUX*s_g{^cd zyh`1*v`$*#A!IdV`$U7DtV_j0ewiVtvj#}%LCMy@O|uzM&yq{lz2+W@#x|d zjq`{&O7+1w%%@i$D?&on*d)n(*~I#iX8)jnZESrf1X(uq*(X6GkZ#A)h@6$>RH(w$ za3L+NE{qVM@>+7fk|iH2XL>OFg5UHzwwtN^ZSUw$ps9d7^2?83fAP@<+v~UqgXz3cyb`?QdU3pS=-WMV`w+(@Y zOT7NZfbNYht5L~ZQ6&G6P2tqQnRihHEr6~XGO5D4Dtj@rCuTo${i;qE!)Q!#tX1Iyko~@QbmWAu2rzB z$bVPN#B42=T2G$Z;PK}7ee3PMnT6uCzV7U2L2vh1jCAQYLNODbkg@~gJuH+=o>-pb zoXu<;?El0*QOfRLh>${sB(lJPAX8nr1{nWa)M@7v5H*8 zv6=$23K-T`s~i2(N~52BU-8JE^mbHI5kUE?W$BHfDfS21pbwkD{6Y>%_a9)l?of|n z3#JY>0N@7*v2$1Qt*m)BqKw?sD?ziq%A)`XA7IMmqiY{z3_u@la0 z52cp^>U?g3f=ONSDyXE``8#*N8P5^zKAjJ0^2aPp={S{KGAb{|nlh3EHF<>=p>Wp- zI48J2s7;xw!;P6*eNE~T`R|WYuC!K+Hlu+@1cV?x@hG-opwwqGn)oJb{l1@n&hq9% zC|arB9K;lVz<@2tD(PYUq(Jny)p2>SU6kMlF}Sbi@9#=;Usk`7@eIzaF?>YuD>lz>rlS)XTh7?;G(tyUBT9l3%D-}M z{CF_OsA`Ov<;7Y>vMI%*@K9Cn2wuDi&^@kPfwET%MUn8l#HtvBb{OEZM6Oz=}i?_);S5^Oojr( z)VRsUjmUWkT1*uz2zl{ZOj}#AzrRudg0epp7;Y~(ibgHVn!YSSc6foiOAyeCP~>j- zOaH+{e#S0ZNd4Y9$yPuJvPTZDpNg+LJUq`Eg~xZ(7}A3` zWd^=Zf8xj`*p6ySF2q%cWS$3+DmsI9w|jy1TU%VFu9O_yCQ+Z6?i9wDt?L!~X2yk9 zI$p~G*xHL>0akgQs_mDu=5`F%46= zWu@2uCp3#b#KMrKK2!2!jFbzHhA=>cR8Q<|vev7~9TV<|hFitOza9>U9$6Rl`V~tuBzi@6BNPbqE2?XO`TY!xMsE;7x|Bjl z7!6@lBk~vv&&asgC@x4-1M8#3AvG1hreb0d>B-S5wVu80IG{TZDz?b)G4bu*ybo?o zZx1|O4&uz5f=E#VS2(UI$kGh|7iKEFg+ozDwL9ld_X`fS*rSvH4c^c|H2~s=NDIb# z3;ulYB)BohxG4&i)|aHtmf@-bo?5#SW2*Z{P2IM2dyFo3!y&b0-Rcs+S_)Tox=K)@uE^m@=BjlgizufKE+L?ai z>pn*~!?E^HU;j=u!y9WR_(4W^dj2Jy2mnmalNBAu3|TF>zN|a-asD(Cf^8&yqIu1Di#@DGN}#1s$# zBn@V)Z~kE1%*VrD_;e}5TN?`Vh1f$}yhtd@8I zvbr1~t^)^T7CF-fP^$Kfrh=!ApTZbJZyHrpw-t0N1Sy3x(!%~75x4kwF z)*68+DOCzmJUaF|R`{Uo^&NdOLV1Z7D(BJj6QKfso2Gbc>yry5A|%o^GQ2_k{q1%g zW-grP2Xm*o=lMS{WKS3TV!cv$T{z<u3)mt%R@7c% ze*;Z8$duduBj9`i9Ngqd&;+>F|0(IJ0^(?zEwTi654O0wgb-YUJBzzR&<}SBwz#{y z2Zs>c-Ge&>2@u>N+{u6UWuCUDyQaIU>$tqb!-SWB^vOAh9k*4{3pFH&NRXI~vZc z#&urQud>Zfm>FqfH3c)~AEl`B;3s!5jg>}5=KVnL?25Hcd9ih0(`a0@@sekrVuyN8 z^4%)Z_GS!KdAj|jRR}q}s(tCq+4+&0zkZe;V$E?xPxXXO^|4KIL{obv5CXR44-i&h z&cbZSFOSFOsHLWJEHGcY^lr-0h7KUv!|$d)C6fR>JiM(nxYdk7QSLDX(6_q`3G!sV4cp`pU_OaEbv z`T4U)f(8y?6>qNa3TsmO6KSWGOD4-A#t1p9r>}b`;wvAes=?WD1>$89H&VQtF83Rk zKk-?cy0C--2-co^Ul{}Y-wvQcypVR-nfoeRui1A?&azm7SH>gYCe{vt03@JhB2chx z;n}vW67U*PS?!%8%yL0d7jP7Sx=N9)32i7i53|(0;E$p`d6^AW6FLoF*yKi{Ca_H) z!y5!y!)|B69t`fi;D_mV70~nC?;mGHk|H>{;U6&whxJt#1)BOe@~JxgbblRN`1<{h zUR!{W4xLWL*vf%(2iHB^6i=KPTdp{Fjw`^5<2LbD2852OKj`9Oy6k zxtmPGt9tFkc7Cm}CHm7A<8Ypkd6w)Xn#A!GPs370`Im_6ccYQ6jh{y*UC9gV3o;fs zDVB_RL#M?w%g<68aGwQ)O+5Eus{|L@RF2TMN?xQEgDzei@8H<)!teAtC~p_KG3gedh_~- zUOD)JK}JYz9o<;ovihT{54Cx1)+rViQf5oo=c2I73$)TAXKlr+f`pLDt*wngfkgzM z`5|3;=LUa}^nqbd#t^3@-$W^c#HXT2(v3iHg=k7_Ur~S@#Q#9uxn-?Ncj~vGfZa*c z;iHJ`C*@PPuv~h0GmH8Cm@Q(u_FPB9LtM-$i!u;@Oaw6E=gfsx5EzTt<1qg3)u_6{;*? zDvGpbeDe=|a|^e~;e2ooGwC^iyeNgngZF(J@v1$NaerL}5_W9hV>sA*Jr~obknT*p znom`)!QSV;r~R9nuOx4a%1)68ev(a-o~M#$tVx5b>F5zix31*Q*ANBC!;7&O)PD%p z0LXPZJ4gU@z`hJ#-f6?CmrRG!ITiX7(H~%%Q3*z^c%lGdoJV=qNKmW~S@#|+E{rZ- zkS`FFr#|br<+1eo&E3boJK`sut^D#^@9VL@@$NnO#`QJI&I*6S2P%cu_m&c9Y3Ppx z)^V1q3^>pRswHy*mr(`HXchv%%`1=)vDk^uChug4Pb)9ESF>oU)8JSw>ZtYWClabG z#ceCRLM8^1tXJMi+S4m;A?w^z(hCvqG3G`>rGA=!UY&oC`0wT9Q3X0B&Si zd-YEP4Vk=k3A#elkW-5@>0ZrzdgQQ5RN0KeNshCq{fDBHwPg|pjf{+!hH#n$4KWeT z-Dlb36B5r$^ntt4M@z> zp;JY<6TP;Jq+S3z_xlS2r>>n`bD)jc6jdsPV6$0bDUjLo{eUsMx;yx?gG6S0@%kN% zKVQX$&b<&kw&*~y=1k?F%3P7c!R&u#7xX?N4}`Z4-_F&vai!<~cJo_r-TC}_{7+yV zr_hATPGdF_4q=*Gs69_Rhh<9|6{tdP0yqaC;Rd|1<|+&fUdMln3H|kK0FgL9%MUo` z-IUd9e!+Xv*hRyEiXrCo$RQvs%g{IqW;=SWhy32`dqDeUY>bNz`6bKnrjp|SB;Ea@ zCEecHB5yI7?cC)%JU^QI{LTM1lgv{S*!&ekTL+1+=zK}T1y1ua0D;B)-TWo!AN>U3 z4+ro{K@%7Y?Hx6s!|HpLFkS6LU(YMb7g;9c5RO%fuJG9mNU!>ipRfThxtbx6E0cI@ zb$ZjTpM$%!1YfDc7F-$2eA!=o@NCm3{iCz?LtiF9!!O@M{qDAe?ke)W+B0cNiLRlm zXGj((E!SeLX7CcMAps;53kcwjt=@k#1!&A(@G~)!ooJp&L=T?fTb|nu4>U$a-jah* z83+jjc7mbbJyHJ28Wth{qcc|Q`otDdGJAgW@phtQ+2z+M)+nlH!tR561(V{11ManX z9x2*8dp`7J3bhO0FVhF0_H?Tywn|_VSq3xdZ;qst`1Ro+p%LFaOZ;OySbrHT>vUpd zjeX+4iw1KHvVB{)w1nD60Iu1rCW(JuFgEFyIvs5oFh+4E%X^FcF1sp(yM}rV8>S>U zLFN2BoQLy2KKELACwHrx3}1%T^imBg`=(W%vbvi7@Oe1_hLQ0h-q~ACwKl%T&0md$6CXhYzj&Rv|^`<5*B7<4ppLn zO7+Ud0s?VRCzdaK*#QSDcHGyQ*n+X-=Ci|Q>adJTIHPgBFDi4^cN+Jv@)lzVs$NehCLHDT%DFlE}srJUzUMN!P0F;eL=%cf% zIvr{mbFgEv?>9DS8fW%kkzO!m%k7imNm;+PeP8ns4iyriL88*3zM?5#ixn?|kY zqPMJqry6_eDy2eEz@0_K`n#Fe_57FqM`z22@l25`;pYc>N3)~zgk3GMrv3*F4OkjC zf;G8(l?aq#zbopmiHt>C6hozRe0EId{}9bPRB8qvzZ}LHSVBNd7tZ~%l{qG*T2vr` zs9qA#5&|G`nM*n{_ZK^X_rtC{K`Yicz)Y$r&RONMN~tmI2o5TS1BeN1q0-3ndiJe{ zy-#Bqw=ZB@UGnIh~bYNGkShtS4Pa+`PY+hcw3A{wz{0epvB)O zWCNt1EUH<}Jdy&el=|mxk&xLwIyAz@Jom&=Q`8=3FKm3CYvE{@OEds2C`cW066Z>= zW=PrT0sRB+#mmOq!bu1(dmhp3{b+iDAY&T~P7RI5|J5IT>6T^oJeb~kHTn{DnggM> zv|sEfzYXx%vODSTzT_E+$8kV9+>24*QBW|Z`md&`RuD9%>`ROy#X_muGAoPzVZQ(f ziTchcjX<`$YcqlW0a!mV{sCA)jP8~;#9TS@TI;V-qbwGv%o!!w_|kebiRO7?tD-^~ z<5KoO0es*>IHy9`;f%~-V{x2*Q#u;|Rx!UOr&p4xEP^U^E$$J67{%;v%kbMv?eqH{ zBM+ZYN2pt4=hJCYck@>b|4@7il|hl~r~_NR=;92~1sywP*;M>8tjRIhd=#o+WmuHb zQZZ(>vZJ` zGTQv%ab6iWUhO4cqsYbSAxuQ-t1qKQg+^QB8bz3%2$x^&^35!CL@5#^k@E=#hJYZ( zmHgI~jrnv^_b%UBjtGO#RKl70AE+aWHs&De73GMI%!}#1Tt@u*skY8N+NvfeVl69h zDj=%1^_&ptUlDhp>*a%u=~48YWI4ljg3uL)D*7tg`Hbf3k($kt-CvjOABCzhk&I1o zR70+j2Yw@CiD+=XVxD%Mj3;dvZvHaeAZ<2!TJ|X1^1JYeb7TsWEYzzmoTj_8G~Kj= z3yVQuQd((OUW*-9o~w+&GUdyaWWg>ix@KT&Jx~Cs3Sc)(YOtyhkjUdonc9O>*XMTr z2oW=vkenN1J8O^!P)*H?`}4UtfU{EV!3uMQ4*Ju83`Vl7l-J2U>PdJVW+wG z(*#4BwX4UbqYDs!j`btP`B}ev_^&n1Yem~b`p$=(KMkaAvB)oC8s>2gT~2Ug$k>u42B%>;$z^nu;5s&&uPCIyK>mJ(!J+U zpG>m*dEcPJB%jVoa6YTdS+nH^@73^rtr$c{BRv=V6Hjwai7GsW=Lb9c*SbV-3J6LE z=wE9a0Zg$yYW+V-Bf-3oP#!fQMgX^%P`|Fj>HE-nLu{0p?>nF9HVfQfQrwbZ!MHBN z^~L3Gj}s9-Am1IIY!@mFcw3`j#Y1GKuq=AZVcKG>TzWw025YW6%|e0>t`f-lqLk-Q zS5i@z3Uo|7dk}yvtdez$6=#UI1u#HiLSz1_&MSsMX@7?e=TzrWL&L&4Fj^FX+;wpp zOKD1vZRFk31l3uzWxeV3P6q1$j^(WhpLq5UG&5xEFMRskEhcO#4Kmwn=e^=)JG2gK zQ$s)ezB_dPJ|X{R%%%Eepse8GUH!co*D-g1?{F7ng>(N_`vWI0jJ&Rm-?7;iRQTCW|g0LYt<0Cbk;Vufex`(Tf~ zr$0adsxh$cFdl7YZ3#V`2C=j*Xv81DEq;!7+n(tl68eb;jfuBjuYi}QnL3w`w~ppv zk8Cj|G<=jA@aetM_1>r#Hi;7h6`N!-an#PxM@&qcCRkZi3U8j>8Za)tVh2nYY#q(( z9=|eO*$MM(DsUuwvyPX}GJa|0hw;iIZ*pk3QSm!O_*B zQC*HetJ@_Lp%wd>IDy&oUE;)NFGcD*}!^DGiqRy_=nFM% z$&IsxSF$Vbc)|SFUIg0=zD(NR)hi#vdoQ*#LtXDP-qbX8?%|RG6$?|Ypdjs_nA>Xc z0F1#nb>_I@=8F-Et=pLLwUdsy>U+nD#My$kKlRG?a`7*i#W&LkZ5ipU9A8Vw^juaC zocO(yCz_M(mnEA%#}A7>U^m`7)!XH*`iytAt$oo)R%j)hk+=IhqG-~bH-wxHbBqQ1 zY1v6MnT$heo)km+TS4(y*eEkm1cSzYwyJk(zK8~|2n{v+Tb|=q>w(%m`;d3*0^7)8 z-YU1T`ct0FB_nO8F23JTo%2dOMtBh+C0!k5F?1n%7nw@1*fc=nWpj;O5A~IF3rT5V zl_e|t_4}}}8?%k~hX{ZC_1(4ios1K zk*_$A1J2_%UEb7BcujZTQL{?8i5=ZKb1%R&4Cl4o2lSwCP*gaYgohOCyh-R z{{JlgOOmE{m}ng5aa_8qNVSJKH2?UC%W&~$lwafe^@Zb&PWQ!h%Eg*WXHqiXyC5rl zdDig$`ot#Gs?I`KZc3ZtJ&+*U&%EG^J>r0)nY8nV|K`rz+;Qn`3C(n(&jS2>ryVe# zoZoFI%AIrcC}Bko)Rv_7?`RW8539h~n6ftJh7Zmczrg2p4u6gpd|SCc{o+R6aZ1`^ zsGT>sl-Aeq)nwn`L!R}^>Gy9*6dfos@+tW<23=MtOeoB&D^hM>Mlr(8>=W@d)#>ex z)IQQi=5g(r$Uiw%98)}>B6j1jJ(jpJSO+#P80K00$nnX0TCiqLF+x0khWx^Sv}b0> zohe~WnY!?krs2bR_EOUX<{}vClCJ~2pG|Ap3Uixe!jjpe!=c`iGCk9l z*4($C<8bpM+A7`qU>2t=#gEPv2^isfS3O~>=)e{++&Ojur6kCaKHdKn zuAQ7nWtZFy9ofPC`Elm>zWPp9^A!={^(!1^KXZgnfEEs=q9fQgXXZkv&-<`%M+#rZ;89vbH1m@ZdGk#N?bCF%~loHyIu1B`?HAz z3@%MG``6p5;u&n7@FWcJ&%krk8bTKv zv?9@4_B3cV{5OEG4(Iku;sMchg)-tGwbc;o4ferV5vzs2t z<3f|JQ%95nJ5iaSGIWx!MTUCq?AJ%qSn@I26nXbu&_t4t{fzhtEPZ`yhu__zPEU^t=C(2gM0QOhi@*tyQ}5~ zViSTCd%~~EbvNd}ce+D&`@wcxb`APJF3MkjM~<_kA75KVq9C=9el`Px|c z6dnIJ8oc#(@8P#6+Pc)X>de`Uzis4y`YECO4U7~}G4qXaHVG8nILx5YaQETgN|KPg zKp_WG-O5$9AqkiODKR75!TY{Sk0!v8qVmhzhdzEC_P=J+^j!%2qd9YyYZV6hIk-d` z>jvX&S%U1;Biec0s3CyOQ=LZ9RWZ0=zC?e~R1hO@dSU;By!$aM{?-W{*sHa1G>n}kEHwnk^$2=I1 z$2b00yUK7+ocQf1xyTLTXS9m)|Kf`T=#Gd_k#e96{|?#oT4H+cuW5I7=lOx3Y-?Iu zs&lGt+(ky&-#H3}fCp6=im)Tau@2nItkFH;J!i{$sEfP+Y3Jupig`p}tT_!FIJ$gK zh)y2vh<(?2VZ%h>f=~6k1axcood^CiJWUNAAA#2V zfzu7q0EiECha@Sw9z7lOkY#*IpHKw7`0m;y{8)0*wTDuv1w(HuG$Mrgwy0^*X(0H* zt@a8NxKXUDncpK>Dul6QAtOM#@sVzvQP7HK=Ax4Sg z2aQd}_$|D_@YkMXJF1M{1CUdDk}M1ix{j=*n8xHz8`pj#)|#^&f)duTR`0QJn8(fX zC)F+K=k=6wo`&- zy9k$uHj1CVP~A8vp00HSbArYu`0ktkg8C8ulyX%7hlmBPAH}(+0=bug&S~lWYq`6Nv z@X!|gM{ThDkXr+_pNu;7ln+?0L=*T2p#^odzf#Q%B+lA&T2^qYRDKfR zT@UcU&Z*1sgFHoqonM~L&z=W1+t%dW_1{ma>2>O>Bz8P*o2%LS_7k1UQf*kIJIIK6 zNc>_`zmPv;k;?F6lVdcOaiNOlV)mb5>$08hN=hv`hm$Za^ zzpqe^2{U!n+?FVOqJ(o7RaKMH2?~Uw{gMuJ|LerRNVih2qyl(jSUDYDy!>~i*TqjA zkZVO`RLsARh;QC4YbS0UAOF|VFKvPAftDLAXBGNBSlUzLLbBpES)|sizz_9lw+YD_ z1YgtkEM20-SBy*2@($%xQLhU%*#GGqL!mp}l^|D6q zZ#7`svBu_~vGW0F0SWvUbmW_=z^dExd1=bsXC-z#9GIQl!Jj;)w*vqPpiUs!T2l72O-{NXAaX$@ zeuY4i=SMJt8osMAp|}O{4ck&-VpK5J)(AlAd~42l41FL@_u3M|G`LO)-kY( zkj%)|K|@R5M~?Ax=c#Oyiq5NK(+nl0KKA5oUj7_)VBc{5G5=QA~SPgrBcJZn|8Yi@5G^HE-P z$>GYf&T>;hiEWX9-yFWuH)r6(`hPFydhIpq?i!W2)O@#zc%cZlF%XZ9g`Q+8DrRx_ zots!xYJg6P1{3>Myo&836QsI)9;nyl>+t>6)y^p+?-##n^%%RprvG)F?|E#%cP%l^J@ z6h+@YQ^%QUiuc&lFQNf?ejo#4=?ky2$SHzs&k|Df`68H7xVpz#bXe3fH({b#_fDa8 z>HG*iyX3%g{^jpp-ljveU#rzG45Uruxi9%dU~y~^W+9qs81t$73l)L12Qr*0tXOhB zO+=_FA_v9{EP=Q7$csMD#|JBim#95Be)-AEQm;P-OR=4M6Nn3AB$PlZvCG~)(xo#ZfO1rG881GdB=xGcFS*c}ehDcXojH8jaH>)Y`UAJ@2*TaY`~5g()zJEW$Ph*An78wLJtRv-pJVh})9__8_*jiS)8#=?1al?Uvb8zO#lFDusLuw5=3Sjuc4Og_*{>;i(`; zxOk!HKKx4v^Iu;6Uc)vE?{H*2=JWpM!Fg`g{ou7>x-j*CunQ?teIA!q^c)1#jz2>J zappx@({K$@Ox@ie;2j+Yfl&~G@KpYD7-Lo(u4x--URLTxT! z1}-Bul?PKrM1nvlx6qN9LIOD$!!=hO!buXRvKa*HO9a++hdg3}?mV4rbq!uhux4Qd zn6ihJRuY9Kut}S9e1?-&xRfb8-T4T0_z}ymZ<5(X-wRkQN5r~jF6w^$Uq#B2V@t>( zVrm2yagc_OloJ}y5XO9K>{%Y%q3Yi@@uaO|(gj5DGp4_^@i-I0QdQWQrfHouij)Pn zL6h}VzzV2mS}yXLxPxCN9dJdj-Yo2C2A_iJbi^bI)ezKs0?XheK-4H^L@aRdRPU1U zjo-}%hc>)0=STh3|4-{&g7C-V>e6zogdCrXm<({hzOoLCgTMl>sqqtwR_?u6lUOt{ zLmvH{dLchkWq4NZeczkk;gXWUaoVAiKFYrdg>pA5{7n2h;dQ+(xf{Mo6Ot>>`c70s z)d-b^w7fy=Ad!@E(9)7v5h4xsBf*|3r*{N=Voi zGnKM*Wb}#TA_j$;wYz;lxot!!{dLwMZMnW}b?JM~j989aggJUSttz;gAUX`^09inK ztPv%{ybu|d4$4Ux?4_v)F_Gm5xxi~4e4NSPDL5W&$npI8ZEB~@^q-|lmtEdo4}RBd zt(KA+m3{U=cJ(nNY=wxC5c9x@;|C{-!oe-RWiXN2Wp5hO5g^n#nZtIVo9Pji7sGC<>X(3Cva`llO-$_MVYX)5$IK7K-P>! z4*9$c2O$=8w7DoRD;3WU&tiLW0frdEzXqV0W@iQYLeF;>lO$8PbbME?%}V_xF&fN# z6Q$-Z97#{0nVKC} zT^LH^2uBF2Bq@?}5JZUfs^E9ReysunvRk1xDnt5pH$9d84SslHb|N7Ubu66y{5A!=mIBco| zJJ#1hm;)t#i1c4Ram-Wnh4|U-hM;k~sK_wxP>s5dRMg{X_~Epe7Y4HET$vRl+b{Ms zXoFy7sDDTSRwa6G;(SE)81i8cU%vJZdHes~QO^(x@5v z#>}fUt0ePaBl|YL|7`jyz8b*P{OaRgru9?<&_@{I02liIk2a1s5w$(92dof18W`Xw ME2Sh^D{dV8e*@}Y+5i9m literal 0 HcmV?d00001 diff --git a/website/www/site/static/images/logos/powered-by/klio.png b/website/www/site/static/images/logos/powered-by/klio.png new file mode 100644 index 0000000000000000000000000000000000000000..2ddab743d9b401cf4fcbcdecb0abb7a3272e3e8b GIT binary patch literal 9212 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

      HK}4I*s=jJ!x=mF{w6OEj3Tw>`LiX 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 EAIa6IDgXcg literal 0 HcmV?d00001 diff --git a/website/www/site/static/images/logos/powered-by/oriel.png b/website/www/site/static/images/logos/powered-by/oriel.png new file mode 100644 index 0000000000000000000000000000000000000000..e158bbcbd448648a6f99ffc0f3b8bfd8b2ec0b7d GIT binary patch literal 76963 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

      )9Ro`=^_`js#ueHlz0_-WQI66oP?DMdvd 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 z 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

      u+V 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 Jyy@`t{{SS!p8Ws- literal 0 HcmV?d00001 diff --git a/website/www/site/static/images/logos/powered-by/scio.png b/website/www/site/static/images/logos/powered-by/scio.png new file mode 100644 index 0000000000000000000000000000000000000000..cb9c0737c6b1ce61cc08c29d18f2ce99fdd558d8 GIT binary patch literal 28972 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 e{a9)~(1S2|YVRg56M@ekf|M21tf&T}wv-iOO literal 0 HcmV?d00001 diff --git a/website/www/site/static/images/logos/runners/flink.png b/website/www/site/static/images/logos/runners/flink.png index e847bfa2337ba6e8a9c975bbc7887423bf331aa8..33d51a8fbb84bbe5ede32cf421475f5e641d1db3 100644 GIT binary patch literal 18374 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 V0+pN$6lr&Ua=i+3B02{A^*^{La_j&A literal 4584 zcmY*dcQ_p0wjIMLqf3+oF(wF6MlXXAjOZnZF4~OV>uAw?B7!K0Jm?tAZi-#%yWeb!!U@AK!0(b7;P2j2w)0044jC8YMv$$w)Hi3xA^6U`~V zn*+~7TTu>BF~GEW6Ogzn8F~N!6kq=u-WzTT#v6d4ovwkWfw~&p%EgJ#0_9?f=EFF- z-k<>hDGdC^bwYbuKrl{@&K_`#H1r*n3XWjZ8o6Ee75~ z2JTNykM9MZp5(a&<87-(e|*XHfUVc>e)5)#$fYSQC+Qy6F#B>>?6>rJCr;9^BNFaf zbT1(t@B(>=!5Te_SX2GExUnesr(edjS-g?|XmaZC?xWn|k7!>}K@t$pLJdt_*`pwt zXncJ0<#)Rea6Z@HC$BM+sf|rD!LvqXr~&K3>Rzd&7=inU&XPb1Ze3GQtRTlDZTi#^ zul-&jp(GnKNjR%g_vF<<`Ehj@(Zs>KW%Ada@-2wz7-mEtue;^D-AkPF)_j8tQE+KT zkMRjps{CQQHRo+@Dzo&+?%smsEk&8&?BBj$n!Kv1%gUE>wm#Ql-YXg*n6d*&Aurs+ z$%U1sX=Nllb&b$L;OiymDY(a={x!DG3>*>J5P zLU%XXY+PNcVb&C{V-aPgnxG4xdLSngqfxO0OTQvuJ>~UMEp|}|-Gm19WJck=NP1wC zD06xK+AL_`^xF>e=Lp^a^juAfHG}ap>xOfJzW9L<8bRehi2a7{| z>>}6ql9rtZ!yCui^_0jtQn6Za4T;N}t{~gyvlf}AR=Uwh?C5EhvKli$s5)tlv^-%D z*O2TTBC|lqird3t`-8q}m?E&xkJtIt0+OjSW0_~(Vm&N2=Xbtt&1#-3c;0S&Lz^qm zzVzH2zk}VujkjA=o!x4|rO~M)tI253wnpKp(yQB30iJik?WK#=<(B-v2tLf=iE92IVe1D)sL|M8lC3)VXq6b>rC5`4C8RSbn0$R^q zo%BztGNrBuM*1?|0l=Ev#_O6-Ckq+9^Y&@quZlVoWR>8kVcT=s9s&ARqhh7+;8UNw zT_hA&35 za!PT?Jxab8#zOY!B#`o+Y{~i(cIzP7L9+v)701UQb~usUG|Qk# z_XwUIij>12Ou6go!>QHmC~xKvc3=SH%VY_WaoY{Ki^cE$#UzvUHq3^PIS7wE2(9jS zXLQ-?6O(HMcHU z;^VXF+YPv1o{S96;J2@$HfstGG*3UDhD*w4R2%Yn^qLf^%-D4}&?*87HAx=>Zd;8LPs=gt%6I{GN5GAFu=hV;q zL2sRilAJPWQIEk?)EytUII0)?r)4#+E^2Y`)Ft3gddgcpEw)z!2hfK} z!t;8-c_w*HI8ZGf8?~ay%G^RwT}DhVXeSDMcBV4O{K@BfzHief6v8;yd)Qw2+M~08 zrBCI9p_@!2N!mOK=Fj=wnMx{=01CmeMJ*+5_q<36 z-7~?Qo?mCy@2e+=MCYSB-xO`g1qNEs#f00L3gf(o4a&)oKV<^31K{aMNL`0R$%d%l-b)> z;(NT`jT+khTFMuF8XzvWL%#G8+%^;DLCh~(k^U+f+aCrJu

      @RIX^dTdMCT8k?0O z*+EkU_^%Rii$u!(-m+<+`HePTq=keCIYNRFaT^Ia9QD)4e7y+L(cX|$+ax|`Bltd?Qggx9$I4U^8i*F^!)6krrsH6 zY8}6uuI)FwW^FIEb;0`4DmmgY9aMaKr0hiqy2B}Bte}Vk>VS;#Wp>ys9yxc|oSA6s$9$gG=Y3wlCrluZ2BBI@)t@-k$v@0lDlG<0 z4F|xcZWA?7PagB=O3e3#qzWpGS%`|_f6VqJ`LZ2T707Ig8EP0VVVXxq6`K%}^@iJL z;F~0pN$8q`#41>NMV}BbpWt}OL>CE7Rd27ca7dcq6Ns(PtjgbA>bWk3)@w^Q?;RoBI(Fq z#IimegBW$mMa>f3n>2N7#`)Va>SU{5A4^2)*O@S_qMmX&LbcI?M1YB=o(k^8u82Rm0b0SMBz$-Hag( z!sWK>_h@#|?I*!TPeOzHNk|!1Y&`6AnC)3+=dYJP3SR*XW3RknLf{vGXS!DgO&ue4-_pzxBh-R!pMW19#|H}O6 zTKSK%0vKhXOOpidwN}!eY`_VdZc~6(p*Z%ds}e=83TY7fSx*vUa`rNR zUD{yEg)W!3s(I*Q0-Lq%i@>y4qfLJex08YJ#p{5NrN!mw^YYVy77tDuY&8!LlD|do zWvuG0Z{)Xjx45&YHFJD-aQBBv(;o}K^fKNaEH6?k+1_!bO@$E0E&5<`2WBG!BD8s6 zxUGwH6<!qg(V+dRK5Xk$+A@DJj#Tt`TU7&RgR%|~= zBt(mFn&vzhC|f;>g`{K7NWQNmU0-cfnzf7!i%g$(nZ{MA;)ShwK-osN#}@Z-uq*?= z2H_G|=wwEsnD)U#Q+>Q&Pp;|_v~l+wJjESE{V$su18egi3U~w zBn_~+O0e^xAI{>7)j$mJqICMw6dcU2{+N+<=8wM`+rAD1HWp&@Qz}*>_72nd_alXT zy^DV-1cwjPIJt5-)9Z6+9R8$A^tuMp!lC>o!YAjg!BA z)nmxyZk9=7dJF1jc)8>Y-Nks~{nPaA6kslVa`)vmNP=(`MTzT-Q9^E@xcw$ha zr)^t!awe+1Ywjv14sAbwk!26@+Q0dE$~c1)9=-jX-)q^7Vxo3?dbdRX;NqPodyr> z?mQ;3BK;t|Mk{%EWMj>o#zXc30+aHe)^GX+-T)etJ7gU z>LnvlJjeI!%Zcf_R+aYAW}?MM3QNjFH2Z!?r!6Az<6u9F8^?WieLRd!*LsDU z`xe%|d*ZMwa_G+{#zb<%!Iq+D_kze?bWP&}eXLI-a2Dw-Jq(#HOvv|R0?x(c5PjKH z;}|EVaA_&~TwxS3hC&2V{eJdvaSRIEvRVsA(d-0V>iVHR)W@Ef2g?=&Er_pFro`^b7nfu~D9$yQ-?kmzy z1>4GN;nT+6)Ck1s{D&39AiBF2MqA$)SN0^?@f#0OR{v?dulY6I|?wq3Ec}2@TY0X(@ zx)roqjdG)jyhy%G>={e_lwCwwJIr8jJV+m>-<$jqIo3+EpuKR757lb2;}v}D{P+7s MSwRC?A!i=?FClts7ytkO diff --git a/website/www/site/static/images/logos/runners/spark.png b/website/www/site/static/images/logos/runners/spark.png index 113c316e9d91e21b78518fdd85bb9efa53be1a54..f39302913cb2632e7239c69565cae20a4d448872 100644 GIT binary patch literal 11275 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 B3_t(? literal 2701 zcmY*bc|6oxAO0zX81A(dVvwB~GmLdc_UvS-VX{n2_8DfzwJ#xYvy?4cgUFU_g-B=; z(qel_lHnSRa8V*lyrX;H`@Zk_e9rlP&vTyhJm2s6>!jG(oaf;Z;Q|1F$K1@=o*6Zn z^9%<&a|Nwz3NZt#w}G_*05oQt+{dyp_h3&mdusrQkOhFaL;%=jLU9ZL2vG%q&mI7v zlLr98K}GEskjw+lATwtYQ>o`@vg9a%L;--s+1C+GMq69ycoG63STDjA93(6-h{*;3 zWS9;!4aAYL;IO~|JV_@ECH0e`!_1Fhs1*1oh3t=#LR;H`jR-^>7y(g-s7mQ^fx%!T z(d(*?y|L-v*O@z%lng+d{_|{lTvk*$X8_=! zm>U~7qB&PDoea1$CV2R1Z6o%ZOyJTjp^t(Fr65Vsj1+u#Mbc7y;qui~INSn(X@T8n zXX8M;cB_8jB?=1;FbjfXW!rHgDUY6XZlv|SkEmhQC4$Gpe$pqj8CS_|j=Sp2PWcwczwUH8q3PUl z<+`a<5X+d^dU$Vsb!UdZN}3U_%g{&ztyHK=@#k!dj+@91j^mXPkoBkSKW`XsV}m`r z@U%A+bEz7YG_IL%N)zk#F`qKbpPQ99k^4uI?_ff$oyE0#rmSgl6#dpyk0W754_VxD zjzN>oLf+Q&@7GG*R;f%42;vrs6%mK#`fb6RWsJaD8$O1-}2+dAG0&#g8O_! zPj1|w5=!Ghs^m@A8eCt^cM5*({-D&Gmoc&bK-1feP@NJzof!IPWMXt##x1$gNKI{1#)lQBI)7&+5G{HyRhEpUPrDr+ z)ZArcCvaJe|6)-n+A&S$?d5^xuGd2#Qyx8cID zhLF~WtnWGE8E$e%!IEkCH1&P-~I7JIHg<|CWM_yo3EuQjq zFRrhnzRF}Pww6g}J-?K6*;Cg6f`Bd6KU2OYhdB`>DriMbr0=~eoD&8Lp^2F>9em;Sv=q)Jy`}+l=odG}xQJ(S zt&B464cq$K(D$a7tgwUm+=>yd*^Ta!ds+#ezEeFS(i4h=^M47v=Uj~NYa ztG7oDepG6=GihDrzUq0v>Q*@-GW~{SD`Dl_Tnc!a6ldv?b}lC> zZ?o$rtURZYikGxidtVF+_bTVl{l!Z+Tq6DWX#Z$WrwYAP`p<=Y*<<^{JLz^ds|<>3 zU&p{fhKI5T7N6K;#A|jX!fGla-PT_MbaEiAC5>%={}*VB8f&a>gqh)6iwwF;<&aMp z+fI#E^mVw~f_y|GZ(ZLlglcy+4xQI;XFdFF^)kOwy?$BV_N|%o8=_(vq&3S8tqRg> zNv->)#jFZo?rlb8q1d@fljoeOue9%)m1KJAMHck_NVM2;up8KPMmh0O>O@4sL;Iz9 zt6mS~_rADfPsRF)c?`}@&QdyT|EQfwm}ok#YK3{suP@o>2pl`LAU3Jb$x`9-Ms1)^ zLqrSH_9O#CH1%TBu*8*v8n**691zxAujJZ_2Dww>Uy`Zp18vUz(?;f>1n!(KVVk59 z@sAT&nrbK<~WToLXxiG6_pk`&rd2Q z(U5hvnW3Qf_gT9XR%i1)+-DUc4s<(~)`lA}uZ+slSn6nTTUm4z&hO2lPu94MX#?7N zT|iNO6!&da=GFYPZFMC3U_BNhe)a4#MsL zTv=0!p+vLbLgsn=rpcDZpM#|Z#CP+7k%`^qHS89y67~5)?BQ+{78oABwygbdlg~E` zd0e+DN_L08^CnGo+J@*#{dn1M8p6Kkkh-mwJvzX+uwQ6?ez8p?cJ_3ImV)qTUchzx zb_WkMi-Y0mU{QC^yynI!nz2g}R^z5C*A2SOM31?*;MXXHES%7Tmrmt!Tw%K9Il>N|p|PE=;2$Q!V&RWUu`wDxJt8c*c-PidhMLInrie@39o14PP}6~DtJi~OJsR$r22 z1X^9`XMMX!+bx diff --git a/website/www/site/static/images/logos/sdks/python-logo.png b/website/www/site/static/images/logos/sdks/python-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..aec7e448fcc06d6592a814f8eba3a5010e9db74c GIT binary patch literal 8870 zcmV;XB3a#uP)O002@51^@s6eld{000009a7bBm000&x z000&x0ZCFM@Bjb+0drDELIAGL9O(c600d`2O+f$vv5yPSyt_(O zDi9*ALW;PsC9S9myd+4X^1w^9qXbu6JfIbof|uYOAqh!#l{B($tC{I@^8e@FJw2

      -There are lots of opportunities to contribute: +There are lots of opportunities to contribute. You can for example: - - ask or answer questions on [user@beam.apache.org](/community/contact-us/) or +- ask or answer questions on [user@beam.apache.org](/community/contact-us/) or [stackoverflow](https://stackoverflow.com/questions/tagged/apache-beam) - review proposed design ideas on [dev@beam.apache.org](/community/contact-us/) - improve the documentation @@ -49,17 +57,22 @@ There are lots of opportunities to contribute: https://cwiki.apache.org/confluence/display/BEAM/Contributor+FAQ) - organize local meetups of users or contributors to Apache Beam -Most importantly, if you have an idea of how to contribute, then do it! +
      + + + +
      + Below is a tutorial for contributing code to Beam, covering our tools and typical process in detail. ### Prerequisites -To contribute code, you need - - a GitHub account - a Linux, macOS, or Microsoft Windows development environment with Java JDK 8 installed - [Docker](https://www.docker.com/) installed for some tasks including building worker containers and testing this website @@ -71,6 +84,8 @@ To contribute code, you need Agreement](https://www.apache.org/licenses/icla.pdf) (ICLA) to the Apache Software Foundation (ASF). + + To install these in a Debian-based distribution: ``` @@ -127,8 +142,7 @@ script which is part of the Beam repo: 1. Assign the issue to yourself. To get the permission to do so, email the [dev@ mailing list](/community/contact-us) to introduce yourself and to be added as a contributor in the Beam issue tracker including your - ASF Jira Username. For example [this welcome email]( - https://lists.apache.org/thread.html/e6018c2aaf7dc7895091434295e5b0fafe192b975e3e3761fcf0cda7@%3Cdev.beam.apache.org%3E). + ASF Jira Username. For example [this welcome email](https://lists.apache.org/thread.html/e6018c2aaf7dc7895091434295e5b0fafe192b975e3e3761fcf0cda7@%3Cdev.beam.apache.org%3E). 1. If your change is large or it is your first change, it is a good idea to [discuss it on the dev@ mailing list](/community/contact-us/). 1. For large changes create a design doc @@ -233,6 +247,8 @@ script which is part of the Beam repo: all commits in the PR during merge, however if a PR has a mixture of independent changes that should not be squashed, and fixup commits, then the PR author should help squashing fixup commits to maintain a clean commmit history. +
      + ## When will my change show up in an Apache Beam release? Apache Beam makes minor releases every 6 weeks. Apache Beam has a diff --git a/website/www/site/content/en/contribute/attributes.md b/website/www/site/content/en/contribute/attributes.md new file mode 100644 index 000000000000..27598eb58a9b --- /dev/null +++ b/website/www/site/content/en/contribute/attributes.md @@ -0,0 +1,66 @@ +--- +title: "Attributes of a Beam community member" +layout: "arrow_template" +--- + + + +# Attributes of a Beam community member + +{{< figure src="/images/community/messages-icon.svg" >}} + +## Knows, upholds, and reinforces the Beam community’s practices + +- They have a proven commitment to the project +- They share their intentions with the community +- They accept and integrate community feedback in their plans, designs, code, etc. +- They earnestly try to make Beam better with their contributions + +In particular, if a code contributor: + +- They earnestly try to make Beam better with their own code +- They earnestly try to make Beam better with code review +- They accept and integrate feedback on their code +- They know, follow, and enforce Beam’s practices while reviewing/merging code - style, documentation, testing, backward compatibility, etc. + +{{< figure src="/images/community/beam-logo-icon.svg" >}} + +## Knows, upholds, and reinforces the Apache Software Foundation code of conduct + +In particular, we manifestly strive to: + +- Be open +- Be empathetic +- Be welcoming +- Be friendly +- Be patient +- Be collaborative +- Be inquisitive +- Be careful in the words that they choose + +[To learn more see the ASF documentation.](https://httpd.apache.org/docs/) + +{{< figure src="/images/community/diamond-icon.svg" >}} + +## Knows, upholds, and reinforces the responsibilities of an Apache Software Foundation committer + +- They help create a product that will outlive the interest of any particular volunteer (including themselves) +- They grow and maintain the health of the Apache community +- They help out with surrounding work, such as the website & documentation +- They help users +- They can be trusted to decide when code is ready for release, or when to ask someone else to make the judgment +- They can be trusted to decide when to merge code (if a code contributor) or when to ask someone else to make the judgment + +[To learn more see the ASF documentation.](https://httpd.apache.org/docs/) diff --git a/website/www/site/content/en/contribute/become-a-committer.md b/website/www/site/content/en/contribute/become-a-committer.md index 5d86beb471e0..822ee62a56c4 100644 --- a/website/www/site/content/en/contribute/become-a-committer.md +++ b/website/www/site/content/en/contribute/become-a-committer.md @@ -1,6 +1,7 @@ --- title: "Become A Committer" --- + -# Become a Committer - -An Apache Beam -[committer](https://www.apache.org/foundation/how-it-works.html#committers) has -write access to the repository for merging pull requests, but you don't have -to be a code contributor to become a committer. Becoming a committer means that -you have the project's trust. Read the [ASF -documentation](https://www.apache.org/dev/committers.html#committer-responsibilities) -for more about being a committer in the Apache Software Foundation. - -The [PMC](https://www.apache.org/foundation/how-it-works.html#pmc-members) -makes someone a committer via nomination, discussion, and then majority vote. -We use data from as many sources as possible to inform our reasoning. Here are -some examples: - - - [dev@ archives](https://lists.apache.org/list.html?dev@beam.apache.org) and [statistics](https://lists.apache.org/trends.html?dev@beam.apache.org) - - [user@ archives](https://lists.apache.org/list.html?user@beam.apache.org) and [statistics](https://lists.apache.org/trends.html?user@beam.apache.org) - - [`apache-beam` StackOverflow tag](https://stackoverflow.com/questions/tagged/apache-beam) - - Git metrics for [Beam](https://github.com/apache/beam/graphs/contributors) - - Code reviews given and received on - [Beam](https://github.com/apache/beam/pulls) - - Clear areas of ownership (a runner, a DSL, IO connector, documentation, - etc.) - - Public events - - Firsthand PMC testimonials - -The PMC has assembled the following set of guidelines for becoming a committer. - -## An Apache Beam committer... - -### Takes many forms - -There are many actions other than coding that build the trust we place in a -committer - code review, design discussion, user support, community outreach, improving -infrastructure, documentation, project management, etc. - -### Knows, upholds, and reinforces the Apache Software Foundation code of conduct +# Become a Beam Committer -See the [ASF -documentation](https://www.apache.org/foundation/policies/conduct.html). In -particular, they manifestly strive to: +An Apache Beam [committer](https://www.apache.org/foundation/how-it-works.html#committers) takes many forms. There are many actions other than coding that build the trust we place in a committer - code review, design discussion, user support, community outreach, improving infrastructure, documentation, project management, etc. - - Be open - - Be empathetic - - Be welcoming - - Be friendly - - Be patient - - Be collaborative - - Be inquisitive - - Be careful in the words that they choose +### What does it mean being a commiter? -### Knows, upholds, and reinforces the responsibilities of an Apache Software Foundation committer +An Apache Beam committer has write access to the repository for merging pull requests, but you don’t have to be a code contributor to become a committer. Becoming a committer means that you have the project’s trust. Read the [ASF documentation](https://www.apache.org/dev/committers.html#committer-responsibilities) for more about being a committer in the Apache Software Foundation. -See the [ASF documentation](https://www.apache.org/dev/committers.html#committer-responsibilities). +The [PMC](https://www.apache.org/foundation/how-it-works.html#pmc-members) makes someone a committer via nomination, discussion, and then majority vote. We use data from as many sources as possible to inform our reasoning. - - They help create a product that will outlive the interest of any particular - volunteer (including themselves) - - They grow and maintain the health of the Apache community - - They help out with surrounding work, such as the website & documentation - - They help users - - They can be trusted to decide when code is ready for release, or when to ask - someone else to make the judgment - - They can be trusted to decide when to merge code (if a code contributor) or - when to ask someone else to make the judgment +### Different Ways you can contribute +Everyone is welcome to join and contribute to the project in many ways, not only with code contributions. Things like asking questions, reporting bugs, proposing new features, improving documentation or the website, organizing events or writing blog posts, are also welcome and recognized. -### Knows, upholds, and reinforces the Beam community’s practices +{{< contributor/list_with_icons ways_of_contribution >}} - - They have a proven commitment to the project - - They share their intentions with the community - - They accept and integrate community feedback in their plans, designs, - code, etc. - - They earnestly try to make Beam better with their contributions - - In particular, if a code contributor: - - They earnestly try to make Beam better with their own code - - They earnestly try to make Beam better with code review - - They accept and integrate feedback on their code - - They know, follow, and enforce Beam’s practices while - reviewing/merging code - style, documentation, testing, backward - compatibility, etc. +### What are the traits of an Apache Beam Committer? +{{< contributor/row_of_traits committer_traits >}} diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/cogroupbykey.md b/website/www/site/content/en/documentation/transforms/python/aggregation/cogroupbykey.md index f80c3b20affe..d5dac4ed9d73 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/cogroupbykey.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/cogroupbykey.md @@ -38,7 +38,7 @@ Then, we apply `CoGroupByKey` to join both `PCollection`s using their keys. `CoGroupByKey` expects a dictionary of named keyed `PCollection`s, and produces elements joined by their keys. The values of each output element are dictionaries where the names correspond to the input dictionary, with lists of all the values found for that key. -{{< highlight py >}} +{{< highlight language="py" py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/cogroupbykey.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/cogroupbykey.py" cogroupbykey >}} {{< /highlight >}} @@ -50,9 +50,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/cogroupbykey_test.py" plants >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/cogroupbykey.py" >}} - ## Related transforms * [CombineGlobally](/documentation/transforms/python/aggregation/combineglobally) to combine elements. diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/combineglobally.md b/website/www/site/content/en/documentation/transforms/python/aggregation/combineglobally.md index 53e2fc0bdb3f..ab25dca7b683 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/combineglobally.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/combineglobally.md @@ -36,7 +36,7 @@ Then, we apply `CombineGlobally` in multiple ways to combine all the elements in We define a function `get_common_items` which takes an `iterable` of sets as an input, and calculates the intersection (common items) of those sets. -{{< highlight py >}} +{{< highlight language="py" py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" combineglobally_function >}} {{< /highlight >}} @@ -48,14 +48,11 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally_test.py" common_items >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" >}} - ### Example 2: Combining with a lambda function We can also use lambda functions to simplify **Example 1**. -{{< highlight py >}} +{{< highlight language="py" py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" combineglobally_lambda >}} {{< /highlight >}} @@ -67,9 +64,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally_test.py" common_items >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" >}} - ### Example 3: Combining with multiple arguments You can pass functions with multiple arguments to `CombineGlobally`. @@ -77,7 +71,7 @@ They are passed as additional positional arguments or keyword arguments to the f In this example, the lambda function takes `sets` and `exclude` as arguments. -{{< highlight py >}} +{{< highlight language="py" py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" combineglobally_multiple_arguments >}} {{< /highlight >}} @@ -89,9 +83,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally_test.py" common_items_with_exceptions >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" >}} - ### Example 4: Combining with side inputs as singletons If the `PCollection` has a single value, such as the average from another computation, @@ -100,7 +91,7 @@ passing the `PCollection` as a *singleton* accesses that value. In this example, we pass a `PCollection` the value `'🥕'` as a singleton. We then use that value to exclude specific items. -{{< highlight py >}} +{{< highlight language="py" py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" combineglobally_side_inputs_singleton >}} {{< /highlight >}} @@ -112,16 +103,13 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally_test.py" common_items_with_exceptions >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" >}} - ### Example 5: Combining with side inputs as iterators If the `PCollection` has multiple values, pass the `PCollection` as an *iterator*. This accesses elements lazily as they are needed, so it is possible to iterate over large `PCollection`s that won't fit into memory. -{{< highlight py >}} +{{< highlight language="py" py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" combineglobally_side_inputs_iter >}} {{< /highlight >}} @@ -133,9 +121,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally_test.py" common_items_with_exceptions >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" >}} - > **Note**: You can pass the `PCollection` as a *list* with `beam.pvalue.AsList(pcollection)`, > but this requires that all the elements fit into memory. @@ -146,7 +131,7 @@ Each element must be a `(key, value)` pair. Note that all the elements of the `PCollection` must fit into memory for this. If the `PCollection` won't fit into memory, use `beam.pvalue.AsIter(pcollection)` instead. -{{< highlight py >}} +{{< highlight language="py" py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" combineglobally_side_inputs_dict >}} {{< /highlight >}} @@ -158,9 +143,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally_test.py" custom_common_items >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" >}} - ### Example 7: Combining with a `CombineFn` The more general way to combine elements, and the most flexible, is with a class that inherits from `CombineFn`. @@ -179,7 +161,7 @@ The more general way to combine elements, and the most flexible, is with a class * [`CombineFn.extract_output()`](https://beam.apache.org/releases/pydoc/current/apache_beam.transforms.core.html#apache_beam.transforms.core.CombineFn.extract_output): It allows to do additional calculations before extracting a result. -{{< highlight py >}} +{{< highlight language="py" py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" combineglobally_combinefn >}} {{< /highlight >}} @@ -191,9 +173,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally_test.py" percentages >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineglobally.py" >}} - ## Related transforms You can use the following combiner transforms: diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/combineperkey.md b/website/www/site/content/en/documentation/transforms/python/aggregation/combineperkey.md index cc6ffd1e1273..196fcd62450d 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/combineperkey.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/combineperkey.md @@ -38,7 +38,7 @@ We use the function [`sum`](https://docs.python.org/3/library/functions.html#sum) which takes an `iterable` of numbers and adds them together. -{{< highlight py >}} +{{< highlight language="py" py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" combineperkey_simple >}} {{< /highlight >}} @@ -50,14 +50,11 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey_test.py" total >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" >}} - ### Example 2: Combining with a function We define a function `saturated_sum` which takes an `iterable` of numbers and adds them together, up to a predefined maximum number. -{{< highlight py >}} +{{< highlight language="py" py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" combineperkey_function >}} {{< /highlight >}} @@ -69,14 +66,11 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey_test.py" saturated_total >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" >}} - ### Example 3: Combining with a lambda function We can also use lambda functions to simplify **Example 2**. -{{< highlight py >}} +{{< highlight language="py" py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" combineperkey_lambda >}} {{< /highlight >}} @@ -88,9 +82,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey_test.py" saturated_total >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" >}} - ### Example 4: Combining with multiple arguments You can pass functions with multiple arguments to `CombinePerKey`. @@ -98,7 +89,7 @@ They are passed as additional positional arguments or keyword arguments to the f In this example, the lambda function takes `values` and `max_value` as arguments. -{{< highlight py >}} +{{< highlight language="py" py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" combineperkey_multiple_arguments >}} {{< /highlight >}} @@ -110,9 +101,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey_test.py" saturated_total >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" >}} - ### Example 5: Combining with side inputs as singletons If the `PCollection` has a single value, such as the average from another computation, @@ -121,7 +109,7 @@ passing the `PCollection` as a *singleton* accesses that value. In this example, we pass a `PCollection` the value `8` as a singleton. We then use that value as the `max_value` for our saturated sum. -{{< highlight py >}} +{{< highlight language="py" py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" combineperkey_side_inputs_singleton >}} {{< /highlight >}} @@ -133,16 +121,13 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey_test.py" saturated_total >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" >}} - ### Example 6: Combining with side inputs as iterators If the `PCollection` has multiple values, pass the `PCollection` as an *iterator*. This accesses elements lazily as they are needed, so it is possible to iterate over large `PCollection`s that won't fit into memory. -{{< highlight py >}} +{{< highlight language="py" py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" combineperkey_side_inputs_iter >}} {{< /highlight >}} @@ -154,9 +139,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey_test.py" bounded_total >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" >}} - > **Note**: You can pass the `PCollection` as a *list* with `beam.pvalue.AsList(pcollection)`, > but this requires that all the elements fit into memory. @@ -167,7 +149,7 @@ Each element must be a `(key, value)` pair. Note that all the elements of the `PCollection` must fit into memory for this. If the `PCollection` won't fit into memory, use `beam.pvalue.AsIter(pcollection)` instead. -{{< highlight py >}} +{{< highlight language="py" py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" combineperkey_side_inputs_dict >}} {{< /highlight >}} @@ -179,9 +161,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey_test.py" bounded_total >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" >}} - ### Example 8: Combining with a `CombineFn` The more general way to combine elements, and the most flexible, is with a class that inherits from `CombineFn`. @@ -200,7 +179,7 @@ The more general way to combine elements, and the most flexible, is with a class * [`CombineFn.extract_output()`](https://beam.apache.org/releases/pydoc/current/apache_beam.transforms.core.html#apache_beam.transforms.core.CombineFn.extract_output): It allows to do additional calculations before extracting a result. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" combineperkey_combinefn >}} {{< /highlight >}} @@ -212,9 +191,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey_test.py" average >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combineperkey.py" >}} - ## Related transforms You can use the following combiner transforms: diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/combinevalues.md b/website/www/site/content/en/documentation/transforms/python/aggregation/combinevalues.md index c231e116ff9b..24d88e4f08e0 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/combinevalues.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/combinevalues.md @@ -39,7 +39,7 @@ We use the function [`sum`](https://docs.python.org/3/library/functions.html#sum) which takes an `iterable` of numbers and adds them together. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" combinevalues_simple >}} {{< /highlight >}} @@ -51,9 +51,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues_test.py" total >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" >}} - ### Example 2: Combining with a function We want the sum to be bounded up to a maximum value, so we use @@ -61,7 +58,7 @@ We want the sum to be bounded up to a maximum value, so we use We define a function `saturated_sum` which takes an `iterable` of numbers and adds them together, up to a predefined maximum number. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" combinevalues_function >}} {{< /highlight >}} @@ -73,14 +70,11 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues_test.py" saturated_total >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" >}} - ### Example 3: Combining with a lambda function We can also use lambda functions to simplify **Example 2**. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" combinevalues_lambda >}} {{< /highlight >}} @@ -92,9 +86,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues_test.py" saturated_total >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" >}} - ### Example 4: Combining with multiple arguments You can pass functions with multiple arguments to `CombineValues`. @@ -102,7 +93,7 @@ They are passed as additional positional arguments or keyword arguments to the f In this example, the lambda function takes `values` and `max_value` as arguments. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" combinevalues_multiple_arguments >}} {{< /highlight >}} @@ -114,9 +105,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues_test.py" saturated_total >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" >}} - ### Example 5: Combining with side inputs as singletons If the `PCollection` has a single value, such as the average from another computation, @@ -125,7 +113,7 @@ passing the `PCollection` as a *singleton* accesses that value. In this example, we pass a `PCollection` the value `8` as a singleton. We then use that value as the `max_value` for our saturated sum. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" combinevalues_side_inputs_singleton >}} {{< /highlight >}} @@ -137,16 +125,13 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues_test.py" saturated_total >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" >}} - ### Example 6: Combining with side inputs as iterators If the `PCollection` has multiple values, pass the `PCollection` as an *iterator*. This accesses elements lazily as they are needed, so it is possible to iterate over large `PCollection`s that won't fit into memory. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" combinevalues_side_inputs_iter >}} {{< /highlight >}} @@ -158,9 +143,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues_test.py" bounded_total >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" >}} - > **Note**: You can pass the `PCollection` as a *list* with `beam.pvalue.AsList(pcollection)`, > but this requires that all the elements fit into memory. @@ -171,7 +153,7 @@ Each element must be a `(key, value)` pair. Note that all the elements of the `PCollection` must fit into memory for this. If the `PCollection` won't fit into memory, use `beam.pvalue.AsIter(pcollection)` instead. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" combinevalues_side_inputs_dict >}} {{< /highlight >}} @@ -183,9 +165,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues_test.py" bounded_total >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" >}} - ### Example 8: Combining with a `CombineFn` The more general way to combine elements, and the most flexible, is with a class that inherits from `CombineFn`. @@ -204,7 +183,7 @@ The more general way to combine elements, and the most flexible, is with a class * [`CombineFn.extract_output()`](https://beam.apache.org/releases/pydoc/current/apache_beam.transforms.core.html#apache_beam.transforms.core.CombineFn.extract_output): It allows to do additional calculations before extracting a result. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" combinevalues_combinefn >}} {{< /highlight >}} @@ -216,9 +195,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues_test.py" percentages_per_season >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/combinevalues.py" >}} - ## Related transforms You can use the following combiner transforms: @@ -230,4 +206,4 @@ You can use the following combiner transforms: * [Top](/documentation/transforms/python/aggregation/top) * [Sample](/documentation/transforms/python/aggregation/sample) -{{< button-pydoc path="apache_beam.transforms.core" class="CombineValues" >}} \ No newline at end of file +{{< button-pydoc path="apache_beam.transforms.core" class="CombineValues" >}} diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/count.md b/website/www/site/content/en/documentation/transforms/python/aggregation/count.md index f4d332ed2fc9..5aa6e1b8252f 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/count.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/count.md @@ -32,7 +32,7 @@ Then, we apply `Count` to get the total number of elements in different ways. We use `Count.Globally()` to count *all* elements in a `PCollection`, even if there are duplicate elements. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/count.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/count.py" count_globally >}} {{< /highlight >}} @@ -44,14 +44,11 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/count_test.py" total_elements >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/count.py" >}} - ### Example 2: Counting elements for each key We use `Count.PerKey()` to count the elements for each unique key in a `PCollection` of key-values. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/count.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/count.py" count_per_key >}} {{< /highlight >}} @@ -63,14 +60,11 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/count_test.py" total_elements_per_key >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/count.py" >}} - ### Example 3: Counting all unique elements We use `Count.PerElement()` to count the only the unique elements in a `PCollection`. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/count.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/count.py" count_per_element >}} {{< /highlight >}} @@ -82,9 +76,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/count_test.py" total_unique_elements >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/count.py" >}} - ## Related transforms N/A diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/distinct.md b/website/www/site/content/en/documentation/transforms/python/aggregation/distinct.md index e0abca48ee7a..08db6bd987c5 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/distinct.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/distinct.md @@ -29,7 +29,7 @@ In the following example, we create a pipeline with two `PCollection`s of produc We use `Distinct` to get rid of duplicate elements, which outputs a `PCollection` of all the unique elements. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/distinct.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/distinct.py" distinct >}} {{< /highlight >}} @@ -41,9 +41,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/distinct_test.py" unique_elements >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/distinct.py" >}} - ## Related transforms * [Count](/documentation/transforms/python/aggregation/count) counts the number of elements within each aggregation. diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/groupby.md b/website/www/site/content/en/documentation/transforms/python/aggregation/groupby.md index ad6c17b8ec3f..df281bdabe0a 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/groupby.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/groupby.md @@ -32,7 +32,7 @@ In the following example, we create a pipeline with a `PCollection` of fruits. We use `GroupBy` to group all fruits by the first letter of their name. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" groupby_expr >}} {{< /highlight >}} @@ -44,13 +44,9 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" groupby_expr_result >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" >}} - - We can group by a composite key consisting of multiple properties if desired. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" groupby_two_exprs >}} {{< /highlight >}} @@ -65,10 +61,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" groupby_two_exprs_result >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" >}} - - In the case that the property one wishes to group by is an attribute, a string may be passed to `GroupBy` in the place of a callable expression. For example, suppose I have the following data @@ -79,7 +71,7 @@ suppose I have the following data We can then do -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" groupby_attr >}} {{< /highlight >}} @@ -91,12 +83,9 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" groupby_attr_result >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" >}} - It is possible to mix and match attributes and expressions, for example -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" groupby_attr_expr >}} {{< /highlight >}} @@ -108,9 +97,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" groupby_attr_expr_result >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" >}}. - ## Aggregation Grouping is often used in conjunction with aggregation, and the @@ -122,7 +108,7 @@ by, and finally a field name in which to store the result. For example, suppose one wanted to compute the amount of each fruit to buy. One could write -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" simple_aggregate >}} {{< /highlight >}} @@ -134,13 +120,10 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" simple_aggregate_result >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" >}}. - Similar to the parameters in `GroupBy`, one can also aggregate multiple fields and by expressions. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" expr_aggregate >}} {{< /highlight >}} @@ -152,13 +135,10 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" expr_aggregate_result >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" >}}. - One can, of course, aggregate the same field multiple times as well. This example also illustrates a global grouping, as the grouping key is empty. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" global_aggregate >}} {{< /highlight >}} @@ -170,10 +150,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" global_aggregate_result >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupby_test.py" >}}. - - ## Related transforms * [CombinePerKey](/documentation/transforms/python/aggregation/combineperkey) for combining with a single CombineFn. diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/groupbykey.md b/website/www/site/content/en/documentation/transforms/python/aggregation/groupbykey.md index f313e9d0dbf4..06ff183f833b 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/groupbykey.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/groupbykey.md @@ -32,7 +32,7 @@ In the following example, we create a pipeline with a `PCollection` of produce k We use `GroupByKey` to group all the produce for each season. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupbykey.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupbykey.py" groupbykey >}} {{< /highlight >}} @@ -44,9 +44,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupbykey_test.py" produce_counts >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupbykey.py" >}} - ## Related transforms * [GroupBy](/documentation/transforms/python/aggregation/groupby) for grouping by arbitrary properties of the elements. diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/groupintobatches.md b/website/www/site/content/en/documentation/transforms/python/aggregation/groupintobatches.md index d9917fd5ae4b..a7c9cd9b2348 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/groupintobatches.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/groupintobatches.md @@ -29,7 +29,7 @@ In the following example, we create a pipeline with a `PCollection` of produce b We use `GroupIntoBatches` to get fixed-sized batches for every key, which outputs a list of elements for every key. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupintobatches.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupintobatches.py" groupintobatches >}} {{< /highlight >}} @@ -41,9 +41,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupintobatches_test.py" batches_with_keys >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/groupintobatches.py" >}} - ## Related transforms diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/latest.md b/website/www/site/content/en/documentation/transforms/python/aggregation/latest.md index f9692b10f73a..613858c44752 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/latest.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/latest.md @@ -33,7 +33,7 @@ We use `Latest` to get the element with the latest timestamp from the `PCollecti We use `Latest.Globally()` to get the element with the latest timestamp in the entire `PCollection`. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/latest.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/latest.py" latest_globally >}} {{< /highlight >}} @@ -45,14 +45,11 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/latest_test.py" latest_element >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/latest.py" >}} - ### Example 2: Latest elements for each key We use `Latest.PerKey()` to get the elements with the latest timestamp for each key in a `PCollection` of key-values. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/latest.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/latest.py" latest_per_key >}} {{< /highlight >}} @@ -64,9 +61,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/latest_test.py" latest_elements_per_key >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/latest.py" >}} - ## Related transforms * [Sample](/documentation/transforms/python/aggregation/sample) randomly takes some number of elements in a collection. diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/max.md b/website/www/site/content/en/documentation/transforms/python/aggregation/max.md index 7769b814517c..37210888226c 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/max.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/max.md @@ -32,7 +32,7 @@ Then, we get the element with the maximum value in different ways. We use `Combine.Globally()` to get the maximum element from the *entire* `PCollection`. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/max.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/max.py" max_globally >}} {{< /highlight >}} @@ -44,14 +44,11 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/max_test.py" max_element >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/max.py" >}} - ### Example 2: Maximum elements for each key We use `Combine.PerKey()` to get the maximum element for each unique key in a `PCollection` of key-values. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/max.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/max.py" max_per_key >}} {{< /highlight >}} @@ -63,9 +60,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/max_test.py" elements_with_max_value_per_key >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/max.py" >}} - ## Related transforms * [CombineGlobally](/documentation/transforms/python/aggregation/combineglobally) diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/mean.md b/website/www/site/content/en/documentation/transforms/python/aggregation/mean.md index 69fa5ade447d..76a2d0082ed1 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/mean.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/mean.md @@ -34,7 +34,7 @@ Then, we get the element with the average value in different ways. We use `Mean.Globally()` to get the average of the elements from the *entire* `PCollection`. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/mean.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/mean.py" mean_globally >}} {{< /highlight >}} @@ -46,14 +46,11 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/mean_test.py" mean_element >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/mean.py" >}} - ### Example 2: Mean of elements for each key We use `Mean.PerKey()` to get the average of the elements for each unique key in a `PCollection` of key-values. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/mean.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/mean.py" mean_per_key >}} {{< /highlight >}} @@ -65,9 +62,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/mean_test.py" elements_with_mean_value_per_key >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/mean.py" >}} - ## Related transforms * [CombineGlobally](/documentation/transforms/python/aggregation/combineglobally) diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/min.md b/website/www/site/content/en/documentation/transforms/python/aggregation/min.md index 8f385d20af69..62f9d15d4904 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/min.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/min.md @@ -32,7 +32,7 @@ Then, we get the element with the minimum value in different ways. We use `Combine.Globally()` to get the minimum element from the *entire* `PCollection`. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/min.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/min.py" min_globally >}} {{< /highlight >}} @@ -44,14 +44,11 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/min_test.py" min_element >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/min.py" >}} - ### Example 2: Minimum elements for each key We use `Combine.PerKey()` to get the minimum element for each unique key in a `PCollection` of key-values. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/min.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/min.py" min_per_key >}} {{< /highlight >}} @@ -63,9 +60,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/min_test.py" elements_with_min_value_per_key >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/min.py" >}} - ## Related transforms * [CombineGlobally](/documentation/transforms/python/aggregation/combineglobally) diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/sample.md b/website/www/site/content/en/documentation/transforms/python/aggregation/sample.md index 33fc8f60235b..bd822ea89d4e 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/sample.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/sample.md @@ -34,7 +34,7 @@ Then, we get a random sample of elements in different ways. We use `Sample.FixedSizeGlobally()` to get a fixed-size random sample of elements from the *entire* `PCollection`. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/sample.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/sample.py" sample_fixed_size_globally >}} {{< /highlight >}} @@ -46,14 +46,11 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/sample_test.py" sample >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/sample.py" >}} - ### Example 2: Sample elements for each key We use `Sample.FixedSizePerKey()` to get fixed-size random samples for each unique key in a `PCollection` of key-values. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/sample.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/sample.py" sample_fixed_size_per_key >}} {{< /highlight >}} @@ -65,9 +62,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/sample_test.py" samples_per_key >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/sample.py" >}} - ## Related transforms * [Top](/documentation/transforms/python/aggregation/top) finds the largest or smallest element. diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/sum.md b/website/www/site/content/en/documentation/transforms/python/aggregation/sum.md index a9aef38d4c21..9ceda5cbb084 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/sum.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/sum.md @@ -32,7 +32,7 @@ Then, we get the sum of all the element values in different ways. We use `Combine.Globally()` to get sum of all the element values from the *entire* `PCollection`. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/sum.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/sum.py" sum_globally >}} {{< /highlight >}} @@ -44,14 +44,11 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/sum_test.py" total >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/sum.py" >}} - ### Example 2: Sum of the elements for each key We use `Combine.PerKey()` to get the sum of all the element values for each unique key in a `PCollection` of key-values. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/sum.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/sum.py" sum_per_key >}} {{< /highlight >}} @@ -63,9 +60,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/sum_test.py" totals_per_key >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/sum.py" >}} - ## Related transforms * [CombineGlobally](/documentation/transforms/python/aggregation/combineglobally) diff --git a/website/www/site/content/en/documentation/transforms/python/aggregation/top.md b/website/www/site/content/en/documentation/transforms/python/aggregation/top.md index 419c0f81fb58..8c93499d049b 100644 --- a/website/www/site/content/en/documentation/transforms/python/aggregation/top.md +++ b/website/www/site/content/en/documentation/transforms/python/aggregation/top.md @@ -34,7 +34,7 @@ Then, we get the largest or smallest elements in different ways. We use `Top.Largest()` to get the largest elements from the *entire* `PCollection`. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" top_largest >}} {{< /highlight >}} @@ -46,14 +46,11 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top_test.py" largest_elements >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" >}} - ### Example 2: Largest elements for each key We use `Top.LargestPerKey()` to get the largest elements for each unique key in a `PCollection` of key-values. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" top_largest_per_key >}} {{< /highlight >}} @@ -65,14 +62,11 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top_test.py" largest_elements_per_key >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" >}} - ### Example 3: Smallest elements from a PCollection We use `Top.Smallest()` to get the smallest elements from the *entire* `PCollection`. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" top_smallest >}} {{< /highlight >}} @@ -84,14 +78,11 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top_test.py" smallest_elements >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" >}} - ### Example 4: Smallest elements for each key We use `Top.SmallestPerKey()` to get the smallest elements for each unique key in a `PCollection` of key-values. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" top_smallest_per_key >}} {{< /highlight >}} @@ -103,9 +94,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top_test.py" smallest_elements_per_key >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" >}} - ### Example 5: Custom elements from a PCollection We use `Top.Of()` to get elements with customized rules from the *entire* `PCollection`. @@ -113,7 +101,7 @@ We use `Top.Of()` to get elements with customized rules from the *entire* `PColl You can change how the elements are compared with `key`. By default you get the largest elements, but you can get the smallest by setting `reverse=True`. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" top_of >}} {{< /highlight >}} @@ -125,9 +113,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top_test.py" shortest_elements >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" >}} - ### Example 6: Custom elements for each key We use `Top.PerKey()` to get elements with customized rules for each unique key in a `PCollection` of key-values. @@ -135,7 +120,7 @@ We use `Top.PerKey()` to get elements with customized rules for each unique key You can change how the elements are compared with `key`. By default you get the largest elements, but you can get the smallest by setting `reverse=True`. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" top_per_key >}} {{< /highlight >}} @@ -147,9 +132,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/aggregation/top_test.py" shortest_elements_per_key >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/aggregation/top.py" >}} - ## Related transforms * [Sample](/documentation/transforms/python/aggregation/sample) to combine elements. Takes samples of the elements in a collection. diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/filter.md b/website/www/site/content/en/documentation/transforms/python/elementwise/filter.md index 3f602441932b..3b1b46e35239 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/filter.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/filter.md @@ -36,7 +36,7 @@ Then, we apply `Filter` in multiple ways to filter out produce by their duration We define a function `is_perennial` which returns `True` if the element's duration equals `'perennial'`, and `False` otherwise. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" notebook="examples/notebooks/documentation/transforms/python/elementwise/filter" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" filter_function >}} {{< /highlight >}} @@ -48,15 +48,12 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter_test.py" perennials >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/filter" >}} - ### Example 2: Filtering with a lambda function We can also use lambda functions to simplify **Example 1**. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/filter" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" filter_lambda >}} {{< /highlight >}} @@ -68,10 +65,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter_test.py" perennials >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/filter" >}} - ### Example 3: Filtering with multiple arguments You can pass functions with multiple arguments to `Filter`. @@ -79,7 +72,8 @@ They are passed as additional positional arguments or keyword arguments to the f In this example, `has_duration` takes `plant` and `duration` as arguments. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/filter" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" filter_multiple_arguments >}} {{< /highlight >}} @@ -91,10 +85,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter_test.py" perennials >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/filter" >}} - ### Example 4: Filtering with side inputs as singletons If the `PCollection` has a single value, such as the average from another computation, @@ -103,7 +93,8 @@ passing the `PCollection` as a *singleton* accesses that value. In this example, we pass a `PCollection` the value `'perennial'` as a singleton. We then use that value to filter out perennials. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/filter" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" filter_side_inputs_singleton >}} {{< /highlight >}} @@ -115,17 +106,14 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter_test.py" perennials >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/filter" >}} - ### Example 5: Filtering with side inputs as iterators If the `PCollection` has multiple values, pass the `PCollection` as an *iterator*. This accesses elements lazily as they are needed, so it is possible to iterate over large `PCollection`s that won't fit into memory. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/filter" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" filter_side_inputs_iter >}} {{< /highlight >}} @@ -137,10 +125,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter_test.py" valid_plants >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/filter" >}} - > **Note**: You can pass the `PCollection` as a *list* with `beam.pvalue.AsList(pcollection)`, > but this requires that all the elements fit into memory. @@ -151,7 +135,8 @@ Each element must be a `(key, value)` pair. Note that all the elements of the `PCollection` must fit into memory for this. If the `PCollection` won't fit into memory, use `beam.pvalue.AsIter(pcollection)` instead. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/filter" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" filter_side_inputs_dict >}} {{< /highlight >}} @@ -163,10 +148,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter_test.py" perennials >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/filter.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/filter" >}} - ## Related transforms * [FlatMap](/documentation/transforms/python/elementwise/flatmap) behaves the same as `Map`, but for diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/flatmap.md b/website/www/site/content/en/documentation/transforms/python/elementwise/flatmap.md index 7c7baa117b76..15648b986e2f 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/flatmap.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/flatmap.md @@ -37,7 +37,8 @@ where each of the output `iterable`'s elements is an element of the resulting `P We use the function `str.split` which takes a single `str` element and outputs a `list` of `str`s. This pipeline splits the input element using whitespaces, creating a list of zero or more elements. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" flatmap_simple >}} {{< /highlight >}} @@ -49,15 +50,12 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_test.py" plants >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} - ### Example 2: FlatMap with a function We define a function `split_words` which splits an input `str` element using the delimiter `','` and outputs a `list` of `str`s. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" flatmap_function >}} {{< /highlight >}} @@ -69,17 +67,14 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_test.py" plants >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} - ### Example 3: FlatMap with a lambda function For this example, we want to flatten a `PCollection` of lists of `str`s into a `PCollection` of `str`s. Each input element is already an `iterable`, where each element is what we want in the resulting `PCollection`. We use a lambda function that returns the same input element it received. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" flatmap_lambda >}} {{< /highlight >}} @@ -91,17 +86,14 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_test.py" plants >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} - ### Example 4: FlatMap with a generator For this example, we want to flatten a `PCollection` of lists of `str`s into a `PCollection` of `str`s. We use a generator to iterate over the input list and yield each of the elements. Each yielded result in the generator is an element in the resulting `PCollection`. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" flatmap_generator >}} {{< /highlight >}} @@ -113,16 +105,13 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_test.py" plants >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} - ### Example 5: FlatMapTuple for key-value pairs If your `PCollection` consists of `(key, value)` pairs, you can use `FlatMapTuple` to unpack them into different function arguments. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" flatmap_tuple >}} {{< /highlight >}} @@ -134,10 +123,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_test.py" plants >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} - ### Example 6: FlatMap with multiple arguments You can pass functions with multiple arguments to `FlatMap`. @@ -145,7 +130,8 @@ They are passed as additional positional arguments or keyword arguments to the f In this example, `split_words` takes `text` and `delimiter` as arguments. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" flatmap_multiple_arguments >}} {{< /highlight >}} @@ -157,10 +143,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_test.py" plants >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} - ### Example 7: FlatMap with side inputs as singletons If the `PCollection` has a single value, such as the average from another computation, @@ -169,7 +151,8 @@ passing the `PCollection` as a *singleton* accesses that value. In this example, we pass a `PCollection` the value `','` as a singleton. We then use that value as the delimiter for the `str.split` method. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" flatmap_side_inputs_singleton >}} {{< /highlight >}} @@ -181,17 +164,14 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_test.py" plants >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} - ### Example 8: FlatMap with side inputs as iterators If the `PCollection` has multiple values, pass the `PCollection` as an *iterator*. This accesses elements lazily as they are needed, so it is possible to iterate over large `PCollection`s that won't fit into memory. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" flatmap_side_inputs_iter >}} {{< /highlight >}} @@ -203,10 +183,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_test.py" valid_plants >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} - > **Note**: You can pass the `PCollection` as a *list* with `beam.pvalue.AsList(pcollection)`, > but this requires that all the elements fit into memory. @@ -217,7 +193,8 @@ Each element must be a `(key, value)` pair. Note that all the elements of the `PCollection` must fit into memory for this. If the `PCollection` won't fit into memory, use `beam.pvalue.AsIter(pcollection)` instead. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" flatmap_side_inputs_dict >}} {{< /highlight >}} @@ -229,10 +206,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap_test.py" valid_plants >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/flatmap.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/flatmap" >}} - ## Related transforms * [Filter](/documentation/transforms/python/elementwise/filter) is useful if the function is just diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/keys.md b/website/www/site/content/en/documentation/transforms/python/elementwise/keys.md index 1bfac3bb94ce..d30717d3e814 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/keys.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/keys.md @@ -28,7 +28,8 @@ Takes a collection of key-value pairs and returns the key of each element. In the following example, we create a pipeline with a `PCollection` of key-value pairs. Then, we apply `Keys` to extract the keys and discard the values. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/keys.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/keys" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/keys.py" keys >}} {{< /highlight >}} @@ -40,10 +41,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/keys_test.py" icons >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/keys.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/keys" >}} - ## Related transforms * [KvSwap](/documentation/transforms/python/elementwise/kvswap) swaps the key and value of each element. diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/kvswap.md b/website/www/site/content/en/documentation/transforms/python/elementwise/kvswap.md index 259fe8902587..3c3a25518c82 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/kvswap.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/kvswap.md @@ -29,7 +29,8 @@ which has each key and value swapped. In the following example, we create a pipeline with a `PCollection` of key-value pairs. Then, we apply `KvSwap` to swap the keys and values. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/kvswap.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/kvswap" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/kvswap.py" kvswap >}} {{< /highlight >}} @@ -41,10 +42,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/kvswap_test.py" plants >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/kvswap.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/kvswap" >}} - ## Related transforms * [Keys](/documentation/transforms/python/elementwise/keys) for extracting the key of each component. diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/map.md b/website/www/site/content/en/documentation/transforms/python/elementwise/map.md index a6f3bdab9f52..d31bbabea2e2 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/map.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/map.md @@ -35,7 +35,8 @@ Then, we apply `Map` in multiple ways to transform every element in the `PCollec We use the function `str.strip` which takes a single `str` element and outputs a `str`. It strips the input element's whitespaces, including newlines and tabs. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" map_simple >}} {{< /highlight >}} @@ -47,15 +48,12 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_test.py" plants >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} - ### Example 2: Map with a function We define a function `strip_header_and_newline` which strips any `'#'`, `' '`, and `'\n'` characters from each element. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" map_function >}} {{< /highlight >}} @@ -67,15 +65,12 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_test.py" plants >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} - ### Example 3: Map with a lambda function We can also use lambda functions to simplify **Example 2**. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" map_lambda >}} {{< /highlight >}} @@ -87,10 +82,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_test.py" plants >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} - ### Example 4: Map with multiple arguments You can pass functions with multiple arguments to `Map`. @@ -98,7 +89,8 @@ They are passed as additional positional arguments or keyword arguments to the f In this example, `strip` takes `text` and `chars` as arguments. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" map_multiple_arguments >}} {{< /highlight >}} @@ -110,16 +102,13 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_test.py" plants >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} - ### Example 5: MapTuple for key-value pairs If your `PCollection` consists of `(key, value)` pairs, you can use `MapTuple` to unpack them into different function arguments. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" map_tuple >}} {{< /highlight >}} @@ -131,10 +120,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_test.py" plants >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} - ### Example 6: Map with side inputs as singletons If the `PCollection` has a single value, such as the average from another computation, @@ -143,7 +128,8 @@ passing the `PCollection` as a *singleton* accesses that value. In this example, we pass a `PCollection` the value `'# \n'` as a singleton. We then use that value as the characters for the `str.strip` method. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" map_side_inputs_singleton >}} {{< /highlight >}} @@ -155,17 +141,14 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_test.py" plants >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} - ### Example 7: Map with side inputs as iterators If the `PCollection` has multiple values, pass the `PCollection` as an *iterator*. This accesses elements lazily as they are needed, so it is possible to iterate over large `PCollection`s that won't fit into memory. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" map_side_inputs_iter >}} {{< /highlight >}} @@ -177,10 +160,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_test.py" plants >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} - > **Note**: You can pass the `PCollection` as a *list* with `beam.pvalue.AsList(pcollection)`, > but this requires that all the elements fit into memory. @@ -191,7 +170,8 @@ Each element must be a `(key, value)` pair. Note that all the elements of the `PCollection` must fit into memory for this. If the `PCollection` won't fit into memory, use `beam.pvalue.AsIter(pcollection)` instead. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" map_side_inputs_dict >}} {{< /highlight >}} @@ -203,10 +183,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/map_test.py" plant_details >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/map.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/map" >}} - ## Related transforms * [FlatMap](/documentation/transforms/python/elementwise/flatmap) behaves the same as `Map`, but for diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/pardo.md b/website/www/site/content/en/documentation/transforms/python/elementwise/pardo.md index 16089701b5fd..5021e577a4c4 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/pardo.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/pardo.md @@ -41,7 +41,8 @@ which stores the `delimiter` as an object field. The `process` method is called once per element, and it can yield zero or more output elements. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/pardo.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/pardo" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/pardo.py" pardo_dofn >}} {{}} @@ -53,10 +54,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/pardo_test.py" plants >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/pardo.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/pardo" >}} - ### Example 2: ParDo with timestamp and window information In this example, we add new parameters to the `process` method to bind parameter values at runtime. @@ -70,7 +67,8 @@ In this example, we add new parameters to the `process` method to bind parameter [`apache_beam.transforms.window.*Window`](https://beam.apache.org/releases/pydoc/current/apache_beam.transforms.window.html) object. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/pardo.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/pardo" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/pardo.py" pardo_dofn_params >}} {{}} @@ -82,10 +80,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/pardo_test.py" dofn_params >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/pardo.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/pardo" >}} - ### Example 3: ParDo with DoFn methods A [`DoFn`](https://beam.apache.org/releases/pydoc/current/apache_beam.transforms.core.html#apache_beam.transforms.core.DoFn) @@ -131,7 +125,8 @@ starts and finishes with `start_bundle` and `finish_bundle`. Note that `teardown` is called as a *best effort* and is *not guaranteed*. For example, if the worker crashes, `teardown` might not be called. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/pardo.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/pardo" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/pardo.py" pardo_dofn_methods >}} {{}} @@ -143,10 +138,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/pardo_test.py" results >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/pardo.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/pardo" >}} - > *Known issues:* > > * [[BEAM-7885]](https://issues.apache.org/jira/browse/BEAM-7885) diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/partition.md b/website/www/site/content/en/documentation/transforms/python/elementwise/partition.md index 05897053455e..fbfe8a99ac52 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/partition.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/partition.md @@ -46,7 +46,8 @@ and it must return an integer in the range `0` to `num_partitions-1`. In the following example, we have a known list of durations. We partition the `PCollection` into one `PCollection` for every duration type. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/partition" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition.py" partition_function >}} {{< /highlight >}} @@ -58,15 +59,12 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition_test.py" partitions >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/partition" >}} - ### Example 2: Partition with a lambda function We can also use lambda functions to simplify **Example 1**. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/partition" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition.py" partition_lambda >}} {{< /highlight >}} @@ -78,10 +76,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition_test.py" partitions >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/partition" >}} - ### Example 3: Partition with multiple arguments You can pass functions with multiple arguments to `Partition`. @@ -114,7 +108,8 @@ identify the partition index to which that bucket corresponds. This `split_dataset` function is generic enough to support any number of partitions by any ratio. You might want to adapt the bucket assignment to use a more appropriate or randomized hash for your dataset. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/partition" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition.py" partition_multiple_arguments >}} {{< /highlight >}} @@ -126,10 +121,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition_test.py" train_test >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/partition.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/partition" >}} - ## Related transforms * [Filter](/documentation/transforms/python/elementwise/filter) is useful if the function is just diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/regex.md b/website/www/site/content/en/documentation/transforms/python/elementwise/regex.md index c31fa452e571..6947fd18252a 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/regex.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/regex.md @@ -61,7 +61,8 @@ To match until the end of the string, add `'$'` at the end of the regular expres To start matching at any point instead of the beginning of the string, use [`Regex.find(regex)`](#example-4-regex-find). -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" regex_matches >}} {{< /highlight >}} @@ -73,10 +74,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_test.py" plants_matches >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} - ### Example 2: Regex match with all groups `Regex.all_matches` keeps only the elements that match the regular expression, @@ -90,7 +87,8 @@ To match until the end of the string, add `'$'` at the end of the regular expres To start matching at any point instead of the beginning of the string, use [`Regex.find_all(regex, group=Regex.ALL, outputEmpty=False)`](#example-5-regex-find-all). -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" regex_all_matches >}} {{< /highlight >}} @@ -102,10 +100,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_test.py" plants_all_matches >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} - ### Example 3: Regex match into key-value pairs `Regex.matches_kv` keeps only the elements that match the regular expression, @@ -120,7 +114,8 @@ To match until the end of the string, add `'$'` at the end of the regular expres To start matching at any point instead of the beginning of the string, use [`Regex.find_kv(regex, keyGroup)`](#example-6-regex-find-as-key-value-pairs). -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" regex_matches_kv >}} {{< /highlight >}} @@ -132,10 +127,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_test.py" plants_matches_kv >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} - ### Example 4: Regex find `Regex.find` keeps only the elements that match the regular expression, @@ -150,7 +141,8 @@ To match until the end of the string, add `'$'` at the end of the regular expres If you need to match from the start only, consider using [`Regex.matches(regex)`](#example-1-regex-match). -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" regex_find >}} {{< /highlight >}} @@ -162,10 +154,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_test.py" plants_matches >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} - ### Example 5: Regex find all `Regex.find_all` returns a list of all the matches of the regular expression, @@ -180,7 +168,8 @@ To match until the end of the string, add `'$'` at the end of the regular expres If you need to match all groups from the start only, consider using [`Regex.all_matches(regex)`](#example-2-regex-match-with-all-groups). -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" regex_find_all >}} {{< /highlight >}} @@ -192,10 +181,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_test.py" plants_find_all >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} - ### Example 6: Regex find as key-value pairs `Regex.find_kv` returns a list of all the matches of the regular expression, @@ -211,7 +196,8 @@ To match until the end of the string, add `'$'` at the end of the regular expres If you need to match as key-value pairs from the start only, consider using [`Regex.matches_kv(regex)`](#example-3-regex-match-into-key-value-pairs). -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" regex_find_kv >}} {{< /highlight >}} @@ -223,10 +209,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_test.py" plants_find_kv >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} - ### Example 7: Regex replace all `Regex.replace_all` returns the string with all the occurrences of the regular expression replaced by another string. @@ -234,7 +216,8 @@ You can also use [backreferences](https://docs.python.org/3/library/re.html?highlight=backreference#re.sub) on the `replacement`. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" regex_replace_all >}} {{< /highlight >}} @@ -246,10 +229,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_test.py" plants_replace_all >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} - ### Example 8: Regex replace first `Regex.replace_first` returns the string with the first occurrence of the regular expression replaced by another string. @@ -257,7 +236,8 @@ You can also use [backreferences](https://docs.python.org/3/library/re.html?highlight=backreference#re.sub) on the `replacement`. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" regex_replace_first >}} {{< /highlight >}} @@ -269,16 +249,13 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_test.py" plants_replace_first >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} - ### Example 9: Regex split `Regex.split` returns the list of strings that were delimited by the specified regular expression. The argument `outputEmpty` is set to `False` by default, but can be set to `True` to keep empty items in the output list. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" regex_split >}} {{< /highlight >}} @@ -290,10 +267,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex_test.py" plants_split >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/regex.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/regex" >}} - ## Related transforms * [FlatMap](/documentation/transforms/python/elementwise/flatmap) behaves the same as `Map`, but for diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/tostring.md b/website/www/site/content/en/documentation/transforms/python/elementwise/tostring.md index 2409524dcd2d..4b3d79acada0 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/tostring.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/tostring.md @@ -35,7 +35,8 @@ expect their input elements to be strings. The following example converts a `(key, value)` pair into a string delimited by `','`. You can specify a different delimiter using the `delimiter` argument. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/tostring.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/tostring" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/tostring.py" tostring_kvs >}} {{< /highlight >}} @@ -47,16 +48,13 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/tostring_test.py" plants >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/tostring.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/tostring" >}} - ### Example 2: Elements to string The following example converts a dictionary into a string. The string output will be equivalent to `str(element)`. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/tostring.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/tostring" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/tostring.py" tostring_element >}} {{< /highlight >}} @@ -68,10 +66,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/tostring_test.py" plant_lists >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/tostring.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/tostring" >}} - ### Example 3: Iterables to string The following example converts an iterable, in this case a list of strings, @@ -79,7 +73,8 @@ into a string delimited by `','`. You can specify a different delimiter using the `delimiter` argument. The string output will be equivalent to `iterable.join(delimiter)`. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/tostring.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/tostring" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/tostring.py" tostring_iterables >}} {{< /highlight >}} @@ -91,10 +86,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/tostring_test.py" plants_csv >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/tostring.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/tostring" >}} - ## Related transforms * [Map](/documentation/transforms/python/elementwise/map) applies a simple 1-to-1 mapping function over each element in the collection diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/values.md b/website/www/site/content/en/documentation/transforms/python/elementwise/values.md index 90f706ee8c7d..63e324c10eb4 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/values.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/values.md @@ -28,7 +28,8 @@ Takes a collection of key-value pairs, and returns the value of each element. In the following example, we create a pipeline with a `PCollection` of key-value pairs. Then, we apply `Values` to extract the values and discard the keys. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/values.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/values" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/values.py" values >}} {{< /highlight >}} @@ -40,10 +41,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/values_test.py" plants >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/values.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/values" >}} - ## Related transforms * [Keys](/documentation/transforms/python/elementwise/keys) for extracting the key of each component. diff --git a/website/www/site/content/en/documentation/transforms/python/elementwise/withtimestamps.md b/website/www/site/content/en/documentation/transforms/python/elementwise/withtimestamps.md index 6fa4702ee636..51c9c64abc23 100644 --- a/website/www/site/content/en/documentation/transforms/python/elementwise/withtimestamps.md +++ b/website/www/site/content/en/documentation/transforms/python/elementwise/withtimestamps.md @@ -33,7 +33,8 @@ The elements themselves often already contain a timestamp field. [Unix timestamp](https://en.wikipedia.org/wiki/Unix_time) in the form of seconds. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/withtimestamps" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps.py" withtimestamps_event_time >}} {{< /highlight >}} @@ -45,10 +46,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps_test.py" plant_timestamps >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/withtimestamps" >}} - To convert from a [`time.struct_time`](https://docs.python.org/3/library/time.html#time.struct_time) to `unix_time` you can use @@ -75,7 +72,8 @@ If each element has a chronological number, these numbers can be used as a [logical clock](https://en.wikipedia.org/wiki/Logical_clock). These numbers have to be converted to a *"seconds"* equivalent, which can be especially important depending on your windowing and late data rules. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/withtimestamps" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps.py" withtimestamps_logical_clock >}} {{< /highlight >}} @@ -87,10 +85,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps_test.py" plant_events >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/withtimestamps" >}} - ### Example 3: Timestamp by processing time If the elements do not have any time data available, you can also use the current processing time for each element. @@ -99,7 +93,8 @@ Workers might have time deltas, so using this method is not a reliable way to do By using processing time, there is no way of knowing if data is arriving late because the timestamp is attached when the element *enters* into the pipeline. -{{< highlight py >}} +{{< highlight language="py" file="sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps.py" + notebook="examples/notebooks/documentation/transforms/python/elementwise/withtimestamps" >}} {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps.py" withtimestamps_processing_time >}} {{< /highlight >}} @@ -111,10 +106,6 @@ Output: {{< code_sample "sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps_test.py" plant_processing_times >}} {{< /highlight >}} -{{< buttons-code-snippet - py="sdks/python/apache_beam/examples/snippets/transforms/elementwise/withtimestamps.py" - notebook="examples/notebooks/documentation/transforms/python/elementwise/withtimestamps" >}} - ## Related transforms * [Reify](/documentation/transforms/python/elementwise/reify) converts between explicit and implicit forms of Beam values. diff --git a/website/www/site/data/en/committer_traits.yaml b/website/www/site/data/en/committer_traits.yaml new file mode 100644 index 000000000000..e8f551d048de --- /dev/null +++ b/website/www/site/data/en/committer_traits.yaml @@ -0,0 +1,21 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +- body: { text: To learn more see the ASF documentation., link: https://www.apache.org/foundation/policies/conduct.html } + bolded: Knows, upholds, and reinforces the Apache Software Foundation code of conduct. + icon: icons/contributor/become a committer/messages-icon.svg +- body: { text: To learn more see the ASF documentation., link: https://infra.apache.org/committers.html#committer-responsibilities } + bolded: Knows, upholds, and reinforces the responsibilities of an Apache Software Foundation committer. + icon: icons/contributor/become a committer/beam-logo-icon.svg +- body: { text: To learn more see our best practices!, link: https://beam.apache.org/contribute/attributes/ } + bolded: Knows, upholds, and reinforces the Beam community’s practices. + icon: icons/contributor/become a committer/diamond-icon.svg diff --git a/website/www/site/data/en/ways_of_contribution.yaml b/website/www/site/data/en/ways_of_contribution.yaml new file mode 100644 index 000000000000..ccf870682608 --- /dev/null +++ b/website/www/site/data/en/ways_of_contribution.yaml @@ -0,0 +1,28 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +- title: Code contributions + body: "Ways you can contribute code to the project include:" + list: + - Building a new feature like a new IO connector or PTransform + - Fixing a Bug + - Sharing a code example or template with the community + - Testing a release candidate + icon: icons/contributor/become a committer/code-icon.svg +- title: Non-code contributions + body: "Non-code contributions are ways to add value to the projects outside code, here are some examples of things that you can contribute:" + list: + - Organize a meetup + - Give a talk about Beam at a conference + - Update a typo in the documentation + - Write a blog post with useful tips about Beam + icon: icons/contributor/become a committer/file-icon.svg diff --git a/website/www/site/layouts/contribute/arrow_template.html b/website/www/site/layouts/contribute/arrow_template.html new file mode 100644 index 000000000000..5cada00e4436 --- /dev/null +++ b/website/www/site/layouts/contribute/arrow_template.html @@ -0,0 +1,40 @@ +{{/* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. See accompanying LICENSE file. +*/}} + + + + + {{ partial "head.html" . }} + + + {{ partial "header.html" . }} +
      +
      + + +
      + + + +
      + {{ .Content }} +
      +
      +{{ partial "footer.html" . }} + + diff --git a/website/www/site/layouts/partials/head.html b/website/www/site/layouts/partials/head.html index 60b103fac646..4e3c6032d717 100644 --- a/website/www/site/layouts/partials/head.html +++ b/website/www/site/layouts/partials/head.html @@ -40,6 +40,8 @@ + + diff --git a/website/www/site/layouts/partials/header.html b/website/www/site/layouts/partials/header.html index aff72e8fdc3e..6aa4a54ffd63 100644 --- a/website/www/site/layouts/partials/header.html +++ b/website/www/site/layouts/partials/header.html @@ -122,7 +122,7 @@ diff --git a/website/www/site/layouts/shortcodes/buttons-code-snippet.html b/website/www/site/layouts/shortcodes/buttons-code-snippet.html deleted file mode 100644 index 875cf1219e68..000000000000 --- a/website/www/site/layouts/shortcodes/buttons-code-snippet.html +++ /dev/null @@ -1,32 +0,0 @@ -{{/* - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. See accompanying LICENSE file. -*/}} - -{{ $colab_logo := "https://github.com/googlecolab/open_in_colab/raw/master/images/icon32.png" }} -{{ $github_logo := "https://www.tensorflow.org/images/GitHub-Mark-32px.png" }} - -{{ $ctx := . }} -{{ with (.Get "py") }} - {{ with ($ctx.Get "notebook") }} - - -
      - Run code now Run code now -
      - {{ end }} - - -
      - View source code View source code -
      -{{ end }} - -




      diff --git a/website/www/site/layouts/shortcodes/contributor/list_with_icons.html b/website/www/site/layouts/shortcodes/contributor/list_with_icons.html new file mode 100644 index 000000000000..f6c9735b7541 --- /dev/null +++ b/website/www/site/layouts/shortcodes/contributor/list_with_icons.html @@ -0,0 +1,18 @@ +{{/* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. See accompanying LICENSE file. + */}} + + {{ $data := index $.Site.Data .Site.Language.Lang (.Get 0) }} +
      + {{ range $item := $data }} + {{ partial "pillars/pillars-item" (dict "logo" .icon "header" .title "text" .body "list" .list) }} + {{ end }} +
      diff --git a/website/www/site/layouts/shortcodes/contributor/row_of_traits.html b/website/www/site/layouts/shortcodes/contributor/row_of_traits.html new file mode 100644 index 000000000000..7cf112a17530 --- /dev/null +++ b/website/www/site/layouts/shortcodes/contributor/row_of_traits.html @@ -0,0 +1,18 @@ +{{/* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. See accompanying LICENSE file. + */}} + + {{ $data := index $.Site.Data .Site.Language.Lang (.Get 0) }} +
      + {{ range $item := $data }} + {{ partial "traits/traits-item" (dict "logo" .icon "text" .body "bolded" .bolded) }} + {{ end }} +
      diff --git a/website/www/site/layouts/shortcodes/highlight.html b/website/www/site/layouts/shortcodes/highlight.html index 7e3533ef45fb..9f0bb2252703 100644 --- a/website/www/site/layouts/shortcodes/highlight.html +++ b/website/www/site/layouts/shortcodes/highlight.html @@ -12,20 +12,50 @@ {{ $content := (trim .Inner "\n\r") | htmlUnescape | safeHTML }} {{ $ctx := . }} -{{ with (.Get "class") }} -

      0;k~jZ!{>Apx)kcyo{g!#M|F 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 literal 0 HcmV?d00001 diff --git a/website/www/site/static/images/model-ellipse.svg b/website/www/site/static/images/model-ellipse.svg new file mode 100644 index 000000000000..b9c8e39d7c8c --- /dev/null +++ b/website/www/site/static/images/model-ellipse.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/website/www/site/static/images/model-processing-icon.svg b/website/www/site/static/images/model-processing-icon.svg new file mode 100644 index 000000000000..ee9950ddced8 --- /dev/null +++ b/website/www/site/static/images/model-processing-icon.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/www/site/static/images/model-sinks-icon.svg b/website/www/site/static/images/model-sinks-icon.svg new file mode 100644 index 000000000000..c814061153c7 --- /dev/null +++ b/website/www/site/static/images/model-sinks-icon.svg @@ -0,0 +1,23 @@ + + + + + + diff --git a/website/www/site/static/images/model-sources-icon.svg b/website/www/site/static/images/model-sources-icon.svg new file mode 100644 index 000000000000..2fc344867d3b --- /dev/null +++ b/website/www/site/static/images/model-sources-icon.svg @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/website/www/site/static/images/run-icon.svg b/website/www/site/static/images/run-icon.svg new file mode 100644 index 000000000000..f976e01a31e3 --- /dev/null +++ b/website/www/site/static/images/run-icon.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/website/www/site/static/js/calendar.js b/website/www/site/static/js/calendar.js new file mode 100644 index 000000000000..7c5588ca9f6d --- /dev/null +++ b/website/www/site/static/js/calendar.js @@ -0,0 +1,21 @@ +// Licensed under the Apache License, Version 2.0 (the 'License'); you may not +// use this file except in compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an 'AS IS' BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. + +$(document).ready(function() { + function setSize() { + var height = $('.calendar-card-big-right').height(); + var width = $('.calendar-card-big-right').width(); + $('#calendar').height = height-100; + $('#calendar').width = width-100; + } + setSize(); +}); diff --git a/website/www/site/static/js/categories-filter.js b/website/www/site/static/js/categories-filter.js new file mode 100644 index 000000000000..339ceb4bd7c5 --- /dev/null +++ b/website/www/site/static/js/categories-filter.js @@ -0,0 +1,292 @@ +// Licensed under the Apache License, Version 2.0 (the 'License'); you may not +// use this file except in compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an 'AS IS' BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. + +/** + * Copyright (c) + * @name 'Hugo Tags Filter' + * @version 1.2.2 + * @license MIT + * @author PointyFar + */ + +class CategoriesFilter { + constructor(config) { + var defaultFilters = [ + { + name: 'categories', + prefix: 'category-', + buttonClass: 'category-button', + allSelector: '#selectAllAuthors', + attrName: 'data-categories', + } + ] + this.FILTERS = (config && config.filters) ? config.filters : defaultFilters; + this.showItemClass = (config && config.showItemClass) ? config.showItemClass : "tf-show"; + this.activeButtonClass = (config && config.activeButtonClass) ? config.activeButtonClass : "active"; + this.filterItemClass = (config && config.filterItemClass) ? config.filterItemClass : "tf-filter-item"; + this.populateCount = (config && config.populateCount) ? config.populateCount : false; + this.setDisabledButtonClass = (config && config.setDisabledButtonClass) ? config.setDisabledButtonClass : false; + this.longList = 1; + this.numberToView = (config && config.numberToView) ? config.numberToView : 6; + this.filterItems = document.getElementsByClassName(this.filterItemClass); + this.numberOfItems = 0; + this.filterValues = {}; + for( var i = 0; i < this.FILTERS.length; i++) { + this.FILTERS[i]['buttonTotal'] = document.getElementsByClassName(this.FILTERS[i]['buttonClass']).length; + this.FILTERS[i]['selected'] = []; + this.FILTERS[i]['values'] = []; + var fv = document.getElementsByClassName(this.FILTERS[i]['buttonClass']); + + /** + * Build index of all filter values and their counts + */ + this.filterValues[this.FILTERS[i]['name']] = []; + for( var j = 0; j < fv.length; j++ ){ + var v = fv[j].id.replace(this.FILTERS[i]["prefix"], ''); + this.filterValues[this.FILTERS[i]['name']][v] = {count:0, selected:0}; + } + } + this.showCheck(this.FILTERS[0]['name'], true); + } + + initFilterCount(fvc, isInitial){ + + /** + * Initialise count = selected + */ + if(isInitial) { + for( var k in fvc ) { + for( var x = 0; x < this.filterItems.length; x++) { + var attrs = this.getAttrs(k, this.filterItems[x]); + if(attrs !== undefined){ + for(var l = 0; l 0 + }); + return response; + } + catch{ + return elem.getAttribute('data-'+ attr ) + .filter(function(el){ + return el.length > 0 + }); + }} +} + + + showAll(filter) { + for( var i = 0; i < this.FILTERS.length; i++) { + if(filter) { + if(this.FILTERS[i]['name'] === filter) { + this.FILTERS[i]['selected'] = []; + } + } else { + this.FILTERS[i]['selected'] = []; + } + } + this.showCheck(filter) + } + + checkFilter(tag, tagType) { + /* Selects clicked button.*/ + var selectedBtn = document.querySelector(`#${tagType}${tag}`); + this.numberOfItems=0; + for ( var i = 0; i < this.FILTERS.length; i++ ) { + if ( this.FILTERS[i]['prefix'] === tagType ) { + if ( this.FILTERS[i]['selected'].indexOf(tag) >= 0 || selectedBtn.classList.contains(this.activeButtonClass)) { + /* already selected, deselect tag */ + this.FILTERS[i]['selected'].splice(tag,1); + this.delClassIfPresent(selectedBtn, this.activeButtonClass); + } else { + /* add tag to selected list */ + this.FILTERS[i]['selected'].push(tag); + this.addClassIfMissing(selectedBtn, this.activeButtonClass); + } + //this.delClassIfPresent(document.querySelector(this.FILTERS[i]['allSelector']), this.activeButtonClass); + this.showCheck(this.FILTERS[i]['name']); + } + } + this.checkButton(); + + } + checkButton(){ + var button = document.getElementById("load-button"); + if( this.numberOfItems>this.numberToView*this.longList ){ + this.delClassIfPresent(button, this.filterItemClass); + } + else{ + this.addClassIfMissing(button, this.filterItemClass); + } + } + showMore(){ + this.longList ++; + this.numberOfItems = 0; + } + resetCount(){ + this.longList = 1; + } + /** + * showCheck - Applies "show" class to items containing selected tags + */ + showCheck(filter, isInitial) { + + /* If no tags/licenses selected, or all tags selected, SHOW ALL and DESELECT ALL BUTTONS. */ + for ( var i = 0; i < this.FILTERS.length; i++ ) { + if( this.FILTERS[i]['name'] === filter ) { + if( (this.FILTERS[i]['selected'].length === 0) || + (this.FILTERS[i]['selected'].length === this.FILTERS[i]['buttonTotal']) ) + { + var iBtns = document.getElementsByClassName(this.FILTERS[i]['buttonClass']); + for ( var j = 0; j < iBtns.length; j++ ) { + this.delClassIfPresent(iBtns[j], this.activeButtonClass) + } + //this.addClassIfMissing(document.querySelector(this.FILTERS[i]['allSelector']), this.activeButtonClass) + } + } + } + for ( var i = 0; i < this.filterItems.length; i++ ) { + /* First remove "show" class */ + this.delClassIfPresent(this.filterItems[i], this.showItemClass); + + var visibility = 0; + /* show item only if visibility is true for all filters */ + for ( var j = 0; j < this.FILTERS.length; j++ ) { + if ( this.checkVisibility(this.FILTERS[j]['selected'], this.filterItems[i].getAttribute(this.FILTERS[j]['attrName'])) ) { + visibility++; + } + } + /* Then check if "show" class should be applied */ + if ( visibility === this.FILTERS.length ) { + + if ( !this.filterItems[i].classList.contains(this.showItemClass) ) { + this.numberOfItems++; + if(this.numberOfItems<=this.numberToView*this.longList) + this.addClassIfMissing(this.filterItems[i], this.showItemClass); + } + + } + } + this.checkButton(); + this.checkButtonCounts(isInitial) + } + + + checkButtonCounts(isInitial){ + this.filterValues = this.initFilterCount(this.filterValues, isInitial); + this.populateCounters(this.filterValues); + + } + + + /** + * checkVisibility - Tests if attribute is included in list. + */ + checkVisibility(list, dataAttr) { + /* Returns TRUE if list is empty or attribute is in list */ + if (list.length > 0) { + for(var v = 0; v < list.length; v++){ + if(dataAttr){ + try{ + var arr = dataAttr.split(" ") + .filter(function(el){return el.length > 0}); + } + catch{ + var arr = dataAttr.filter(function(el){return el.length > 0}); + } + + if(arr.indexOf(list[v]) >=0 ) { + return true + } + } + else + return false + } + return false + } else { + return true + } + } + + addClassIfMissing(el, cn) { + if(!el.classList.contains(cn)) { + el.classList.add(cn); + } + } + + delClassIfPresent(el, cn) { + if(el.classList.contains(cn)) { + el.classList.remove(cn) + } + } +} + +window['CategoriesFilter'] = CategoriesFilter; From 9b65c6626513b2b640d7d93e12bfb239e21fdc0e Mon Sep 17 00:00:00 2001 From: Brian Hulette Date: Thu, 4 Feb 2021 10:07:10 -0800 Subject: [PATCH 07/12] Update website/www/site/data/en/pillars.yaml --- website/www/site/data/en/pillars.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/www/site/data/en/pillars.yaml b/website/www/site/data/en/pillars.yaml index de864bcaaac8..ad3c04484f5d 100644 --- a/website/www/site/data/en/pillars.yaml +++ b/website/www/site/data/en/pillars.yaml @@ -15,7 +15,7 @@ icon: icons/unified-icon.svg - title: Extensible body: Write and share new SDKs, IO connectors, and transformation libraries. - icon: icons/extensive-icon.svg + icon: icons/extensible-icon.svg - title: Portable body: Execute pipelines on multiple execution environments. icon: icons/portable-icon.svg From a566b4e20913186a134a86a19120cd4d99957da5 Mon Sep 17 00:00:00 2001 From: Jakub-Sadowski Date: Fri, 5 Feb 2021 17:28:07 +0100 Subject: [PATCH 08/12] [BEAM-11424-11423-11368][Website revamp] Implemented contribution guide, become a committer pages and twitter feed (#13565) * contribution-guide * become a committer and twitter * fix * update files * add license * whitespaces * committer not commiter * uppercase * arrow-list template * fix double right navigation * delete br's * delete duplicated class * changes * fix typo * update content * newer copy * delete content * statics * content * content updated * fix typography: * fix of content * fix * content fix * highlight change * fix contribution * fix navbar * content update * fixes * change div * Update website/www/site/data/en/committer_traits.yaml Co-authored-by: Brian Hulette * Update website/www/site/layouts/shortcodes/highlight.html Co-authored-by: Brian Hulette Co-authored-by: Brian Hulette --- .../become a committer/beam-logo-icon.svg | 46 ++ .../become a committer/code-icon.svg | 22 + .../become a committer/diamond-icon.svg | 39 ++ .../become a committer/file-icon.svg | 23 + .../become a committer/messages-icon.svg | 28 ++ .../become a committer/tool-icon.svg | 22 + website/www/site/assets/scss/_global.sass | 4 +- website/www/site/assets/scss/_lists.scss | 8 +- .../www/site/assets/scss/_navbar-desktop.scss | 353 ++++++++-------- .../assets/scss/_syntax-highlighting.scss | 379 ++++++++++++++--- .../www/site/assets/scss/_toggler-nav.scss | 2 +- website/www/site/assets/scss/_traits.scss | 49 +++ website/www/site/assets/scss/_typography.scss | 340 +++++++-------- .../site/assets/scss/capability-matrix.scss | 396 ++++++++++++------ website/www/site/assets/scss/main.scss | 1 + .../www/site/content/en/contribute/_index.md | 46 +- .../site/content/en/contribute/attributes.md | 66 +++ .../en/contribute/become-a-committer.md | 83 +--- .../python/aggregation/cogroupbykey.md | 5 +- .../python/aggregation/combineglobally.md | 35 +- .../python/aggregation/combineperkey.md | 40 +- .../python/aggregation/combinevalues.md | 42 +- .../transforms/python/aggregation/count.md | 15 +- .../transforms/python/aggregation/distinct.md | 5 +- .../transforms/python/aggregation/groupby.md | 38 +- .../python/aggregation/groupbykey.md | 5 +- .../python/aggregation/groupintobatches.md | 5 +- .../transforms/python/aggregation/latest.md | 10 +- .../transforms/python/aggregation/max.md | 10 +- .../transforms/python/aggregation/mean.md | 10 +- .../transforms/python/aggregation/min.md | 10 +- .../transforms/python/aggregation/sample.md | 10 +- .../transforms/python/aggregation/sum.md | 10 +- .../transforms/python/aggregation/top.md | 30 +- .../transforms/python/elementwise/filter.md | 41 +- .../transforms/python/elementwise/flatmap.md | 63 +-- .../transforms/python/elementwise/keys.md | 7 +- .../transforms/python/elementwise/kvswap.md | 7 +- .../transforms/python/elementwise/map.md | 56 +-- .../transforms/python/elementwise/pardo.md | 21 +- .../python/elementwise/partition.md | 21 +- .../transforms/python/elementwise/regex.md | 63 +-- .../transforms/python/elementwise/tostring.md | 21 +- .../transforms/python/elementwise/values.md | 7 +- .../python/elementwise/withtimestamps.md | 21 +- .../www/site/data/en/committer_traits.yaml | 21 + .../site/data/en/ways_of_contribution.yaml | 28 ++ .../layouts/contribute/arrow_template.html | 40 ++ website/www/site/layouts/partials/head.html | 2 + website/www/site/layouts/partials/header.html | 2 +- .../partials/pillars/pillars-item.html | 7 + .../layouts/partials/traits/traits-item.html | 23 + .../shortcodes/buttons-code-snippet.html | 32 -- .../contributor/list_with_icons.html | 18 + .../shortcodes/contributor/row_of_traits.html | 18 + .../site/layouts/shortcodes/highlight.html | 50 ++- .../images/logos/runners/gray-logos-1.svg | 28 ++ .../static/images/logos/sdks/java-gray.svg | 28 ++ .../static/images/logos/sdks/python-gray.svg | 28 ++ .../www/site/static/js/copy-to-clipboard.js | 42 ++ website/www/site/static/js/expandable-list.js | 38 ++ 61 files changed, 1793 insertions(+), 1127 deletions(-) create mode 100644 website/www/site/assets/icons/contributor/become a committer/beam-logo-icon.svg create mode 100644 website/www/site/assets/icons/contributor/become a committer/code-icon.svg create mode 100644 website/www/site/assets/icons/contributor/become a committer/diamond-icon.svg create mode 100644 website/www/site/assets/icons/contributor/become a committer/file-icon.svg create mode 100644 website/www/site/assets/icons/contributor/become a committer/messages-icon.svg create mode 100644 website/www/site/assets/icons/contributor/become a committer/tool-icon.svg create mode 100644 website/www/site/assets/scss/_traits.scss create mode 100644 website/www/site/content/en/contribute/attributes.md create mode 100644 website/www/site/data/en/committer_traits.yaml create mode 100644 website/www/site/data/en/ways_of_contribution.yaml create mode 100644 website/www/site/layouts/contribute/arrow_template.html create mode 100644 website/www/site/layouts/partials/traits/traits-item.html delete mode 100644 website/www/site/layouts/shortcodes/buttons-code-snippet.html create mode 100644 website/www/site/layouts/shortcodes/contributor/list_with_icons.html create mode 100644 website/www/site/layouts/shortcodes/contributor/row_of_traits.html create mode 100644 website/www/site/static/images/logos/runners/gray-logos-1.svg create mode 100644 website/www/site/static/images/logos/sdks/java-gray.svg create mode 100644 website/www/site/static/images/logos/sdks/python-gray.svg create mode 100644 website/www/site/static/js/copy-to-clipboard.js create mode 100644 website/www/site/static/js/expandable-list.js diff --git a/website/www/site/assets/icons/contributor/become a committer/beam-logo-icon.svg b/website/www/site/assets/icons/contributor/become a committer/beam-logo-icon.svg new file mode 100644 index 000000000000..587667d29cc9 --- /dev/null +++ b/website/www/site/assets/icons/contributor/become a committer/beam-logo-icon.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/www/site/assets/icons/contributor/become a committer/code-icon.svg b/website/www/site/assets/icons/contributor/become a committer/code-icon.svg new file mode 100644 index 000000000000..338acf8e8de1 --- /dev/null +++ b/website/www/site/assets/icons/contributor/become a committer/code-icon.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/website/www/site/assets/icons/contributor/become a committer/diamond-icon.svg b/website/www/site/assets/icons/contributor/become a committer/diamond-icon.svg new file mode 100644 index 000000000000..50930d56bf94 --- /dev/null +++ b/website/www/site/assets/icons/contributor/become a committer/diamond-icon.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/www/site/assets/icons/contributor/become a committer/file-icon.svg b/website/www/site/assets/icons/contributor/become a committer/file-icon.svg new file mode 100644 index 000000000000..a198565b15a4 --- /dev/null +++ b/website/www/site/assets/icons/contributor/become a committer/file-icon.svg @@ -0,0 +1,23 @@ + + + + + + diff --git a/website/www/site/assets/icons/contributor/become a committer/messages-icon.svg b/website/www/site/assets/icons/contributor/become a committer/messages-icon.svg new file mode 100644 index 000000000000..0f710d68e9f6 --- /dev/null +++ b/website/www/site/assets/icons/contributor/become a committer/messages-icon.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/website/www/site/assets/icons/contributor/become a committer/tool-icon.svg b/website/www/site/assets/icons/contributor/become a committer/tool-icon.svg new file mode 100644 index 000000000000..46e30c82ab1a --- /dev/null +++ b/website/www/site/assets/icons/contributor/become a committer/tool-icon.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/website/www/site/assets/scss/_global.sass b/website/www/site/assets/scss/_global.sass index fbc02977971b..773b4048840a 100644 --- a/website/www/site/assets/scss/_global.sass +++ b/website/www/site/assets/scss/_global.sass @@ -144,8 +144,8 @@ body color: #8c8b8e .without_switcher border-top-left-radius: 8px - pre - background: initial !important + pre + background: initial !important table margin-top: 24px diff --git a/website/www/site/assets/scss/_lists.scss b/website/www/site/assets/scss/_lists.scss index b175081e1e25..5e7587711f90 100644 --- a/website/www/site/assets/scss/_lists.scss +++ b/website/www/site/assets/scss/_lists.scss @@ -56,7 +56,7 @@ .arrow-list-header { color: #333333; - text-decoration: none; + text-decoration: none !important; display: flex; max-height: 40px; margin-bottom: 74px; @@ -284,6 +284,11 @@ height: auto !important; visibility: visible; } + .collapsing { + position:relative; + height:unset !important; + overflow:hidden; + } } } .beam-list { @@ -299,4 +304,3 @@ height: 44px; } } - diff --git a/website/www/site/assets/scss/_navbar-desktop.scss b/website/www/site/assets/scss/_navbar-desktop.scss index d3eb4e9832f3..826fcbe97e83 100644 --- a/website/www/site/assets/scss/_navbar-desktop.scss +++ b/website/www/site/assets/scss/_navbar-desktop.scss @@ -15,182 +15,177 @@ * limitations under the License. */ -@import "media"; - -.navigation-bar-mobile { - display: none; - .arrow-icon { - display: flex; - align-items: baseline; - margin-left: 10px; - } -} -.nav-tabs { - border-bottom: none; -} -.navigation-bar-desktop { - display: flex; - height: 96px; - width: 100%; - align-items: center; - margin-bottom: 30px; - box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.06); - background-color: $color-white; - z-index: 10000; // just to make sure that navbar always on top of other elements - - #iconsBar { - display: flex; - } - - a { - @extend .component-text; - font-weight: 500; - color: $color-dark-gray; - letter-spacing: 0.2px; - line-height: 1.63; - margin-right: 39px; - text-decoration: none; - cursor: pointer; - } - - .navbar-logo { - margin-left: 58px; - margin-bottom: 4px; - img { - width: 88px; - } - } - .navbar-bar-left { - display: flex; - justify-content: space-between; - width: 100%; - } - .navbar-links { - display: flex; - align-items: center; - justify-content: space-between; - z-index: 10000; - :last-child { - margin-right: 0; - } - - .navbar-link { - display: inline-block; - position: relative; - margin-bottom: 2px; - } - - .navbar-link::before { - transition: 0.3; - content: ""; - position: absolute; - background-color: $color-sun; - height: 0%; - width: 100%; - bottom: 0px; - border-radius: 5px; - } - - .navbar-link:hover::before { - height: 2px; - } - - .navbar-dropdown-documentation { - list-style-type: none; - - .dropdown-toggle { - margin: 0; - } - - ul { - width: 209px; - left: -25%; - text-align: center; - border: none; - box-shadow: none; - padding-top: 34px; - padding-bottom: 0; - border-radius: 0; - li { - height: 36px; - } - a { - @extend .component-text; - line-height: 1.63; - letter-spacing: 0.2px; - } - } - } - } - - .navbar-dropdown-apache { - margin-right: 90px; - list-style-type: none; - - .dropdown-toggle { - margin: 0; - } - - ul { - width: 209px; - left: 70%; - transform: translateX(-50%); - text-align: center; - border: none; - box-shadow: none; - padding-top: 35px; - padding-bottom: 0; - border-radius: 0; - li { - height: 36px; - } - a { - @extend .component-text; - - margin-right: 0 !important; - } - } - - .arrow-icon { - position: absolute; - top: 3px; - right: -30px; - } - } - - .navbar-dropdown-apache:hover { - .arrow-icon { - opacity: 0.84; - } - } - - .navbar-dropdown { - .dropdown-menu > li > a { - &:hover, - &:focus { - text-decoration: none; - color: $color-dropdown-link-hover-text; - background-color: $color-dropdown-link-hover-bg; - } - } - } - - .dropdown:hover .dropdown-menu { - display: block; - margin-top: 0; - } -} - -@media (max-width: $tablet) { - .navigation-bar-desktop { - display: none; - } - - .navigation-bar-mobile { - display: block; - } - - .page-nav { - margin-top: 30px; - } -} + @import "media"; + + .navigation-bar-mobile { + display: none; + .arrow-icon { + display: flex; + align-items: baseline; + margin-left: 10px; + } + } + .nav-tabs { + border-bottom: none; + } + .navigation-bar-desktop { + display: flex; + height: 96px; + width: 100%; + align-items: center; + margin-bottom: 30px; + box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.06); + background-color: $color-white; + z-index: 10000; // just to make sure that navbar always on top of other elements + + #iconsBar { + display: flex; + } + + a { + @extend .component-text; + font-weight: 500; + color: $color-dark-gray; + letter-spacing: 0.2px; + line-height: 1.63; + margin-right: 39px; + text-decoration: none; + cursor: pointer; + } + + .navbar-logo { + margin-left: 58px; + margin-bottom: 4px; + img { + width: 88px; + } + } + .navbar-bar-left { + display: flex; + justify-content: space-between; + width: 100%; + } + .navbar-links { + display: flex; + align-items: center; + justify-content: space-between; + z-index: 10000; + :last-child { + margin-right: 0; + } + + .navbar-link { + display: inline-block; + position: relative; + margin-bottom: 2px; + } + + .navbar-link::before { + transition: 0.3; + content: ""; + position: absolute; + background-color: $color-sun; + height: 0%; + width: 100%; + bottom: 0px; + border-radius: 5px; + } + + .navbar-link:hover::before { + height: 2px; + } + + .navbar-dropdown-documentation { + list-style-type: none; + ul { + width: 209px; + left: -25%; + text-align: center; + border: none; + box-shadow: none; + padding-top: 34px; + padding-bottom: 0; + border-radius: 0; + li { + height: 36px; + } + a { + @extend .component-text; + line-height: 1.63; + letter-spacing: 0.2px; + } + } + } + } + + .navbar-dropdown-apache { + margin-right: 90px; + list-style-type: none; + + .dropdown-toggle { + margin: 0; + } + + ul { + width: 209px; + left: 70%; + transform: translateX(-50%); + text-align: center; + border: none; + box-shadow: none; + padding-top: 35px; + padding-bottom: 0; + border-radius: 0; + li { + height: 36px; + } + a { + @extend .component-text; + + margin-right: 0 !important; + } + } + + .arrow-icon { + position: absolute; + top: 3px; + right: -30px; + } + } + + .navbar-dropdown-apache:hover { + .arrow-icon { + opacity: 0.84; + } + } + + .navbar-dropdown { + .dropdown-menu > li > a { + &:hover, + &:focus { + text-decoration: none; + color: $color-dropdown-link-hover-text; + background-color: $color-dropdown-link-hover-bg; + } + } + } + + .dropdown:hover .dropdown-menu { + display: block; + margin-top: 0; + } + } + + @media (max-width: $tablet) { + .navigation-bar-desktop { + display: none; + } + + .navigation-bar-mobile { + display: block; + } + + .page-nav { + margin-top: 30px; + } + } diff --git a/website/www/site/assets/scss/_syntax-highlighting.scss b/website/www/site/assets/scss/_syntax-highlighting.scss index ed9f27c32c9a..2d12caf37be6 100644 --- a/website/www/site/assets/scss/_syntax-highlighting.scss +++ b/website/www/site/assets/scss/_syntax-highlighting.scss @@ -16,71 +16,203 @@ * Syntax highlighting styles */ .highlight { - background: #fff; + //background: #fff; - .chroma { - background: #eef; - } + .chroma { + background: #eef; + } - .c { color: #998; font-style: italic } // Comment - .err { color: #a61717 } // Error - .k { font-weight: bold } // Keyword - .o { font-weight: bold } // Operator - .cm { color: #998; font-style: italic } // Comment.Multiline - .cp { color: #999; font-weight: bold } // Comment.Preproc - .c1 { color: #998; font-style: italic } // Comment.Single - .cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special - .gd { color: #000; background-color: #fdd } // Generic.Deleted - .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific - .ge { font-style: italic } // Generic.Emph - .gr { color: #a00 } // Generic.Error - .gh { color: #999 } // Generic.Heading - .gi { color: #000; background-color: #dfd } // Generic.Inserted - .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific - .go { color: #888 } // Generic.Output - .gp { color: #555 } // Generic.Prompt - .gs { font-weight: bold } // Generic.Strong - .gu { color: #aaa } // Generic.Subheading - .gt { color: #a00 } // 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: #458; font-weight: bold } // Keyword.Type - .m { color: #099 } // Literal.Number - .s { color: #d14 } // Literal.String - .na { color: #008080 } // Name.Attribute - .nb { color: #0086B3 } // Name.Builtin - .nc { color: #458; font-weight: bold } // Name.Class - .no { color: #008080 } // Name.Constant - .ni { color: #800080 } // Name.Entity - .ne { color: #900; font-weight: bold } // Name.Exception - .nf { color: #900; font-weight: bold } // Name.Function - .nn { color: #555 } // Name.Namespace - .nt { color: #000080 } // Name.Tag - .nv { color: #008080 } // Name.Variable - .ow { font-weight: bold } // Operator.Word - .w { color: #bbb } // Text.Whitespace - .mf { color: #099 } // Literal.Number.Float - .mh { color: #099 } // Literal.Number.Hex - .mi { color: #099 } // Literal.Number.Integer - .mo { color: #099 } // 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: #999 } // Name.Builtin.Pseudo - .vc { color: #008080 } // Name.Variable.Class - .vg { color: #008080 } // Name.Variable.Global - .vi { color: #008080 } // Name.Variable.Instance - .il { color: #099 } // Literal.Number.Integer.Long + .c { + color: #998; + font-style: italic; + } // Comment + .err { + color: #a61717; + } // Error + .k { + font-weight: bold; + } // Keyword + .o { + font-weight: bold; + } // Operator + .cm { + color: #998; + font-style: italic; + } // Comment.Multiline + .cp { + color: #999; + font-weight: bold; + } // Comment.Preproc + .c1 { + color: #998; + font-style: italic; + } // Comment.Single + .cs { + color: #999; + font-weight: bold; + font-style: italic; + } // Comment.Special + .gd { + color: #000; + background-color: #fdd; + } // Generic.Deleted + .gd .x { + color: #000; + background-color: #faa; + } // Generic.Deleted.Specific + .ge { + font-style: italic; + } // Generic.Emph + .gr { + color: #a00; + } // Generic.Error + .gh { + color: #999; + } // Generic.Heading + .gi { + color: #000; + background-color: #dfd; + } // Generic.Inserted + .gi .x { + color: #000; + background-color: #afa; + } // Generic.Inserted.Specific + .go { + color: #888; + } // Generic.Output + .gp { + color: #555; + } // Generic.Prompt + .gs { + font-weight: bold; + } // Generic.Strong + .gu { + color: #aaa; + } // Generic.Subheading + .gt { + color: #a00; + } // 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: #458; + font-weight: bold; + } // Keyword.Type + .m { + color: #099; + } // Literal.Number + .s { + color: #d14; + } // Literal.String + .na { + color: #008080; + } // Name.Attribute + .nb { + color: #0086b3; + } // Name.Builtin + .nc { + color: #458; + font-weight: bold; + } // Name.Class + .no { + color: #008080; + } // Name.Constant + .ni { + color: #800080; + } // Name.Entity + .ne { + color: #900; + font-weight: bold; + } // Name.Exception + .nf { + color: #900; + font-weight: bold; + } // Name.Function + .nn { + color: #555; + } // Name.Namespace + .nt { + color: #000080; + } // Name.Tag + .nv { + color: #008080; + } // Name.Variable + .ow { + font-weight: bold; + } // Operator.Word + .w { + color: #bbb; + } // Text.Whitespace + .mf { + color: #099; + } // Literal.Number.Float + .mh { + color: #099; + } // Literal.Number.Hex + .mi { + color: #099; + } // Literal.Number.Integer + .mo { + color: #099; + } // 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: #999; + } // Name.Builtin.Pseudo + .vc { + color: #008080; + } // Name.Variable.Class + .vg { + color: #008080; + } // Name.Variable.Global + .vi { + color: #008080; + } // Name.Variable.Instance + .il { + color: #099; + } // Literal.Number.Integer.Long } .highlighter-custom { @@ -103,3 +235,124 @@ pre { background: #eef; } +[class*="-switcher"] { + ul { + li { + margin-bottom:0 !important; + padding-left: 0 !important; + &:hover { + cursor: pointer; + } + a { + border: none; + margin-right: 0; + color: #333; + text-decoration: none; + &:hover { + background-color: #f2804d; + color: #fff; + } + } + &::before { + display: none; + } + } + li.active { + color: #fff; + a { + background-color: #ff6d05; + color: #fff; + border: none; + } + } + } +} +.language-switcher { + ul.nav-tabs { + padding-left: 0; + border:0; + li { + &:hover { + cursor: pointer; + } + a { + border: none; + margin-right: 0; + color: #333; + &:hover { + background-color: #f2804d; + color: #fff; + } + } + &::before { + display: none; + } + } + li.active { + color: #fff; + a { + background-color: #ff6d05; + color: #fff; + border: none; + } + } + } +} +nav.version-switcher { + ul { + li { + &:hover { + cursor: pointer; + } + a { + border: none; + margin-right: 0; + color: #333; + &:hover { + background-color: #f2804d; + color: #fff; + } + } + &::before { + display: none; + } + } + li.active { + color: #fff; + a { + background-color: #ff6d05; + color: #fff; + border: none; + } + } + } +} +nav.runner-switcher { + ul { + li { + &:hover { + cursor: pointer; + } + a { + border: none; + margin-right: 0; + color: #333; + &:hover { + background-color: #f2804d; + color: #fff; + } + } + &::before { + display: none; + } + } + li.active { + color: #fff; + a { + background-color: #ff6d05; + color: #fff; + border: none; + } + } + } +} diff --git a/website/www/site/assets/scss/_toggler-nav.scss b/website/www/site/assets/scss/_toggler-nav.scss index 34ed4e81e1ce..0cc6ba4f2a61 100644 --- a/website/www/site/assets/scss/_toggler-nav.scss +++ b/website/www/site/assets/scss/_toggler-nav.scss @@ -26,7 +26,7 @@ nav.language-switcher { background-color: #f8f8f8; &.active { - background-color: #222c37; + background-color: #ff6d05; color: #fff; } } diff --git a/website/www/site/assets/scss/_traits.scss b/website/www/site/assets/scss/_traits.scss new file mode 100644 index 000000000000..3e74b8d9831d --- /dev/null +++ b/website/www/site/assets/scss/_traits.scss @@ -0,0 +1,49 @@ +/** + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +@import "media"; +.row_of_traits { + display: flex; + justify-content: space-between; + flex-direction: row; + .traits-item { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; + margin-top: 64px; + .traits-item-icon { + width: 112px; + height: 112px; + margin-bottom: 48px; + } + .traits-item-description { + max-width: 228px; + text-align: center; + font-size: 14px; + line-height: 1.57; + letter-spacing: .43px; + .font-weight-bold { + font-weight: 700; + } + a{ + color: #333333; + } + } + } +} +@media (max-width: $mobile) { + .row_of_traits { + flex-direction: column; + } +} diff --git a/website/www/site/assets/scss/_typography.scss b/website/www/site/assets/scss/_typography.scss index a4d8877f3199..f030747f70a5 100644 --- a/website/www/site/assets/scss/_typography.scss +++ b/website/www/site/assets/scss/_typography.scss @@ -15,187 +15,187 @@ * limitations under the License. */ -@import "media"; + @import "media"; -.component-title { - font-size: 36px; - font-weight: 500; - font-style: normal; - line-height: 1.1; - letter-spacing: normal; - margin: 0; - color: $color-gray; -} + .component-title { + font-size: 36px; + font-weight: 500; + font-style: normal; + line-height: 1.1; + letter-spacing: normal; + margin: 0; + color: $color-gray; + } -.component-large-header { - font-size: 30px; - font-weight: 500; - font-style: normal; - line-height: 1.4; - letter-spacing: normal; - margin: 0; - color: $color-gray; -} + .component-large-header { + font-size: 30px; + font-weight: 500; + font-style: normal; + line-height: 1.4; + letter-spacing: normal; + margin: 0; + color: $color-gray; + } -.component-header { - font-size: 22px; - font-weight: 500; - font-style: normal; - line-height: 1.45; - letter-spacing: 0.43px; - margin: 0; - color: $color-gray; -} + .component-header { + font-size: 22px; + font-weight: 500; + font-style: normal; + line-height: 1.45; + letter-spacing: 0.43px; + margin: 0; + color: $color-gray; + } -.component-small-header { - font-size: 18px; - font-weight: 500; - font-style: normal; - line-height: 1.56; - letter-spacing: 0.43px; - margin: 0; - color: $color-gray; -} + .component-small-header { + font-size: 18px; + font-weight: 500; + font-style: normal; + line-height: 1.56; + letter-spacing: 0.43px; + margin: 0; + color: $color-gray; + } -.component-text { - font-size: 16px; - font-weight: normal; - font-style: normal; - line-height: 1.63; - letter-spacing: 0.43px; - margin: 0; - color: $color-gray; -} + .component-text { + font-size: 16px; + font-weight: normal; + font-style: normal; + line-height: 1.63; + letter-spacing: 0.43px; + margin: 0; + color: $color-gray; + } -.component-label { - font-size: 16px; - font-weight: bold; - font-stretch: normal; - font-style: normal; - line-height: 1.5; - letter-spacing: 0.43px; - margin: 0; - color: $color-gray; -} + .component-label { + font-size: 16px; + font-weight: bold; + font-stretch: normal; + font-style: normal; + line-height: 1.5; + letter-spacing: 0.43px; + margin: 0; + color: $color-gray; + } -.component-tag { - font-size: 16px; - font-weight: normal; - font-style: normal; - line-height: 1.63; - letter-spacing: 0.43px; - margin: 0; - color: $color-smoke; -} + .component-tag { + font-size: 16px; + font-weight: normal; + font-style: normal; + line-height: 1.63; + letter-spacing: 0.43px; + margin: 0; + color: $color-smoke; + } -.component-quote { - font-size: 20px; - font-weight: normal; - font-stretch: normal; - font-style: italic; - line-height: 1.44; - letter-spacing: 0.43px; - text-align: center; - color: $color-gray; -} + .component-quote { + font-size: 20px; + font-weight: normal; + font-stretch: normal; + font-style: italic; + line-height: 1.44; + letter-spacing: 0.43px; + text-align: center; + color: $color-gray; + } -.hero-title { - font-size: 16px; - font-weight: normal; - font-style: normal; - line-height: 1.88; - letter-spacing: 0.8px; - color: $color-white; -} + .hero-title { + font-size: 16px; + font-weight: normal; + font-style: normal; + line-height: 1.88; + letter-spacing: 0.8px; + color: $color-white; + } -.hero-heading { - font-size: 46px; - font-weight: 500; - font-style: normal; - line-height: 1; - letter-spacing: normal; - color: $color-white; -} + .hero-heading { + font-size: 46px; + font-weight: 500; + font-style: normal; + line-height: 1; + letter-spacing: normal; + color: $color-white; + } -.hero-subheading { - font-size: 20px; - font-weight: normal; - font-style: normal; - line-height: 1.44; - letter-spacing: normal; - color: $color-white; -} + .hero-subheading { + font-size: 20px; + font-weight: normal; + font-style: normal; + line-height: 1.44; + letter-spacing: normal; + color: $color-white; + } -@media (max-width: $tablet) { - .component-title { - font-size: 28px; - line-height: 1.29; - } - .component-large-header { - font-size: 24px; - } -} + @media (max-width: $tablet) { + .component-title { + font-size: 28px; + line-height: 1.29; + } + .component-large-header { + font-size: 24px; + } + } -h1 { - font-size: 36px; - font-weight: 500; - line-height: 1.1; - letter-spacing: normal; - margin-bottom: 24px; - margin-top: 64px; -} -h2 { - font-size: 30px; - font-weight: 500; - line-height: 1.2; - letter-spacing: normal; - margin-bottom: 24px; - margin-top: 56px; -} -h3 { - font-size: 24px; - font-weight: 500; - line-height: 1.25; - letter-spacing: normal; - margin-bottom: 16px; - margin-top: 48px; -} -h4 { - font-size: 22px; - font-weight: 500; - line-height: 1.36; - letter-spacing: normal; - margin-bottom: 12px; - margin-top: 48px; -} -h5 { - font-size: 18px; - font-weight: 500; - line-height: 1.6; - letter-spacing: 0.43px; - margin-bottom: 12px; - margin-top: 32px; -} -h6 { - font-size: 16px; - font-weight: bold; - line-height: 1.2; - letter-spacing: 0.43px; - margin-bottom: 12px; - margin-top: 32px; -} + h1 { + font-size: 36px; + font-weight: 500; + line-height: 1.1; + letter-spacing: normal; + margin-bottom: 24px; + margin-top: 64px; + } + h2 { + font-size: 30px; + font-weight: 500; + line-height: 1.2; + letter-spacing: normal; + margin-bottom: 24px; + margin-top: 56px; + } + h3 { + font-size: 24px; + font-weight: 500; + line-height: 1.25; + letter-spacing: normal; + margin-bottom: 16px; + margin-top: 48px; + } + h4 { + font-size: 22px; + font-weight: 500; + line-height: 1.36; + letter-spacing: normal; + margin-bottom: 12px; + margin-top: 48px; + } + h5 { + font-size: 18px; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.43px; + margin-bottom: 12px; + margin-top: 32px; + } + h6 { + font-size: 16px; + font-weight: bold; + line-height: 1.2; + letter-spacing: 0.43px; + margin-bottom: 12px; + margin-top: 32px; + } -p { - font-size: 16px; - font-weight: normal; - line-height: 1.63; - letter-spacing: 0.43px; -} -.hero-heading { - font-size: 32px; -} -li { - font-size: 16px; - letter-spacing: 0.43px; - line-height: 1.63; -} + p { + font-size: 16px; + font-weight: normal; + line-height: 1.63; + letter-spacing: 0.43px; + } + .hero-heading { + font-size: 32px; + } + li { + font-size: 16px; + letter-spacing: 0.43px; + line-height: 1.63; + } diff --git a/website/www/site/assets/scss/capability-matrix.scss b/website/www/site/assets/scss/capability-matrix.scss index 6bd629ada529..d5e5fc348aae 100644 --- a/website/www/site/assets/scss/capability-matrix.scss +++ b/website/www/site/assets/scss/capability-matrix.scss @@ -11,131 +11,285 @@ See the License for the specific language governing permissions and limitations under the License. */ +@import "media"; -/* What/Where/When/How colors. */ -.wwwh-what-dark { - color:#ca1; - font-weight:bold; - font-style:italic; +.back-button { + font-size: 14px; + font-weight: 700; + padding-left: 15px; + line-height: 1.14; + letter-spacing: 0.6px; + color: #f26628; + text-transform: uppercase; + &:hover { + color: #f2804d; + } + i { + width: 26px; + } } -.wwwh-where-dark { - color:#37d; - font-weight:bold; - font-style:italic; -} +.information-container { + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row; + margin-bottom: 84px; -.wwwh-when-dark { - color:#6a4; - font-weight:bold; - font-style:italic; + @media (max-width: $mobile) { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + } + table { + margin: 0; + } + .read-tables { + table-layout: fixed; + position: relative; + th:first-of-type { + width: 22px; + min-width: 22px; + } + span { + font-weight: 500; + } + } + .second-container { + width: 270px; + margin-left: 100px; + @media (max-width: $mobile) { + margin-left: 0; + } + h5 { + margin-bottom: 22px; + } + .row { + display: -webkit-box; + display: flex; + margin-left: 0; + } + .box { + width: 71px; + height: 24px; + margin-bottom: 10px; + text-align: center; + margin-right: 10px; + } + .white { + border: solid 1px #f6f6f6; + background-color: #fff; + } + .partial { + border: solid 1px #d8d8d8; + background-color: #f9f9f9; + } + .gray { + border: solid 1px #bcbcbc; + background-color: #e1e0e0; + } + } + .border-left { + border-left: 3px solid #ff6d05; + padding: 7px; + font-size: 12px; + font-weight: 500; + line-height: 1.83; + letter-spacing: 0.43px; + } + .border-right { + transform: rotate(270deg); + height: 80px; + text-align: center; + padding: 0 !important; + width: 25px !important; + font-size: 12px; + font-weight: 500; + font-stretch: normal; + font-style: normal; + line-height: 1.57; + letter-spacing: 0.43px; + position: absolute; + top: 55px; + left: 24px; + } + .border-top { + border-top: 3px solid #ff6d05; + font-size: 14px; + font-weight: 400; + font-stretch: normal; + font-style: normal; + line-height: 1.57; + letter-spacing: 0.43px; + td { + width: 162px; + padding: 7px; + } + } } - -.wwwh-how-dark { - color:#b55; - font-weight:bold; - font-style:italic; +.table-container { + display: -webkit-box; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row; + margin-bottom: 32px; + table { + margin: 0; + } + .big-right { + max-width: 1240px; + } + .table-right { + overflow-x: scroll; + padding: 1px; + scrollbar-width: none; + &::-webkit-scrollbar { + width: 0; + background: 0 0; + } + } + .table-headers { + overflow-x: scroll; + border-spacing: 0; + border: solid 1px #d8d8d8; + border-bottom: none; + mix-blend-mode: multiply; + -ms-overflow-style: none; + scrollbar-width: none; + &::-webkit-scrollbar { + width: 0; + background: 0 0; + } + table { + height: 48px; + table-layout: fixed; + width: 710px; + th { + text-align: center; + width: 142px; + font-size: 12px; + font-weight: 500; + line-height: normal; + letter-spacing: normal; + padding-left: 10px; + @media (max-width: $mobile) { + width: 73px; + } + } + } + } + .big-headers table th { + width: 249px; + } + .table-center { + overflow-x: scroll; + border-spacing: 0; + border: solid 1px #d8d8d8; + border-collapse: separate; + transform: rotateX(180deg); + padding-bottom: 8px; + scrollbar-color: #ff6d00; + &::-webkit-scrollbar { + height: 8px; + width: 25px !important; + } + &::-webkit-scrollbar-track { + background-color: #efeded; + background-clip: content-box; + } + &::-webkit-scrollbar-thumb { + border-radius: 8px; + height: 6px !important; + background-color: #ff6d00; + } + table { + transform: rotateX(180deg); + border-collapse: separate; + table-layout: fixed; + width: 710px; + th, + td { + width: 142px; + height: 48px; + font-size: 12px; + font-weight: 500; + line-height: normal; + letter-spacing: normal; + border: 1px solid #fff; + @media (max-width: 640px) { + width: 73px; + } + } + } + } + .big-center { + table { + tr { + vertical-align: baseline; + th, + td { + width: 249px; + height: 352px; + padding: 6px; + font-weight: 400; + p { + font-size: 12px; + font-weight: 500; + line-height: normal; + letter-spacing: normal; + margin: 0; + } + } + } + } + } + .table-left table { + width: 142px; + @media (max-width: 640px) { + width: 73px; + } + tr:first-child th { + height: 83px; + border: none; + @media (max-width: $mobile) { + height: 119px; + } + @-moz-document url-prefix() { + height: 77px; + } + } + th { + height: 48px; + font-size: 12px; + font-weight: 500; + line-height: normal; + letter-spacing: normal; + border: solid 1px #f6f6f6; + border-right: none; + padding: 6px; + } + } + .big-left table { + text-align: start; + tr { + vertical-align: baseline; + } + th { + height: 352px; + } + } } - -/* Capability matrix general sizing, alignment etc. */ -table.cap { - border-spacing: 0px; - border-collapse: collapse; - padding: 2px; -} - -td.cap { - border-width: 1px; - border-style:solid; - vertical-align:text-top; - padding:0.5ex; -} - -th.cap, tr.cap, table.cap { - border-width: 1px; - border-style:solid; - vertical-align:text-top; - padding:0.5ex; -} - -td.cap-blank { - padding:10px; -} - -/* Capability matrix blog-post sizing, alignment etc. */ -table.cap-summary { - border-spacing: 0px; - border-collapse: collapse; - padding: 2px; - width:600px; -} - -td.cap-summary { - border-width: 1px; - border-style:solid; - vertical-align:text-top; - padding:0.5ex; -} - -th.cap-summary, tr.cap-summary, table.cap-summary { - border-width: 1px; - border-style:solid; - vertical-align:text-top; - padding:0.5ex; -} - -td.cap-summary-blank { - padding:10px; -} - -/* Capability matrix semantic coloring. */ -th.color-metadata, td.color-metadata { - background-color:#fff; - border-color:#fff; - color:#000; -} - -th.color-capability { - background-color:#333; - border-color:#222; -} - -th.color-platform { - background-color:#333; - border-color:#222; -} - -td.color-blank { - background-color:#fff; - color:#fff; -} - -/* Capability matrix semantic formatting */ -th.format-category { - vertical-align:text-top; - font-size:20px; - text-align:center; -} - -th.format-capability { - text-align:right; - white-space:nowrap; -} - -th.format-platform { - text-align:center; -} - -/* Capability matrix expand/collapse details toggle. */ -div.cap-toggle { - border-color:#000; - color:#000; - padding-top:1.5ex; - border-style:solid; - border-width:0px; - text-align:center; - cursor:pointer; - position:absolute; - font-size:16px; - font-weight:normal; +#table-link { + margin-bottom: 84px; + font-size: 14px; + font-weight: 700; + line-height: 1.14; + letter-spacing: 0.6px; + color: #f26628; + text-transform: uppercase; + &:hover { + text-decoration: none; + color: #f2804d; + } } diff --git a/website/www/site/assets/scss/main.scss b/website/www/site/assets/scss/main.scss index 81181e2cab8c..dfddc141600c 100644 --- a/website/www/site/assets/scss/main.scss +++ b/website/www/site/assets/scss/main.scss @@ -46,5 +46,6 @@ @import "_quotes.scss"; @import "_blog.scss"; @import "_lists.scss"; +@import "_traits.scss"; @import "_navbar-desktop.scss"; @import "_search.scss"; diff --git a/website/www/site/content/en/contribute/_index.md b/website/www/site/content/en/contribute/_index.md index 333039f39a4f..a3a6c972d5bf 100644 --- a/website/www/site/content/en/contribute/_index.md +++ b/website/www/site/content/en/contribute/_index.md @@ -1,12 +1,15 @@ --- title: "Beam Contribution Guide" +type: "contribute" +layout: "arrow_template" aliases: - - /contribution-guide/ - - /contribute/contribution-guide/ - - /docs/contribute/ - - /contribute/source-repository/ - - /contribute/design-principles/ + - /contribution-guide/ + - /contribute/contribution-guide/ + - /docs/contribute/ + - /contribute/source-repository/ + - /contribute/design-principles/ --- + -# Apache Beam Contribution Guide +# Contribution guide + + -If you have questions, please [reach out to the Beam community](/contribute/get-help). +

      - {{ with ($ctx.Get "lang") }} +{{ $language := .Get 0 }} +{{ $file := .Get "file" }} +{{ $notebook := .Get "notebook" }} +{{ with (.Get "language") }} +
      +
      + {{ with $file }} + {{ with $notebook }} + + + + {{ end }} + + + + + + + {{ else }} + + + + {{ end }} {{ highlight $content . "" }} - {{ else }} - {{ highlight $content "" "" }} - {{ end }} +
      {{ else }} - {{ with (.Get 0) }} -
      - {{ highlight $content . "" }} + {{ with $language }} +
      +
      + + + + {{ highlight $content . "" }} +
      {{ else }} - {{ highlight $content "" "" }} +
      +
      + + + + {{ highlight $content "" "" }} +
      +
      {{ end }} {{ end }} diff --git a/website/www/site/static/images/logos/runners/gray-logos-1.svg b/website/www/site/static/images/logos/runners/gray-logos-1.svg new file mode 100644 index 000000000000..3b81db34b391 --- /dev/null +++ b/website/www/site/static/images/logos/runners/gray-logos-1.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/website/www/site/static/images/logos/sdks/java-gray.svg b/website/www/site/static/images/logos/sdks/java-gray.svg new file mode 100644 index 000000000000..4fe438f0a632 --- /dev/null +++ b/website/www/site/static/images/logos/sdks/java-gray.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/website/www/site/static/images/logos/sdks/python-gray.svg b/website/www/site/static/images/logos/sdks/python-gray.svg new file mode 100644 index 000000000000..8a1c59c83955 --- /dev/null +++ b/website/www/site/static/images/logos/sdks/python-gray.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/website/www/site/static/js/copy-to-clipboard.js b/website/www/site/static/js/copy-to-clipboard.js new file mode 100644 index 000000000000..fad14d02e82c --- /dev/null +++ b/website/www/site/static/js/copy-to-clipboard.js @@ -0,0 +1,42 @@ +// Licensed under the Apache License, Version 2.0 (the 'License'); you may not +// use this file except in compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an 'AS IS' BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. + +$(document).ready(function() { + function copy() { + $(".copy").click(function(){ + var text=$(this).siblings()[$(this).siblings().length-1].childNodes[0].innerHTML; + const el=document.createElement('textarea'); + el.value=text;document.body.appendChild(el); + el.select();document.execCommand('copy'); + document.body.removeChild(el); + alert('copied to clipboard'); + }) + $(".just-copy").click(function(){ + var text=$(this).parent().siblings()[0].innerHTML; + const el=document.createElement('textarea'); + el.value=text;document.body.appendChild(el); + el.select();document.execCommand('copy'); + document.body.removeChild(el); + alert('copied to clipboard'); + }) + } + let code = document.querySelectorAll('pre'), + copyIcon = document.createElement('span'); + copyIcon.innerHTML = ''; + + code.forEach((hl) => { + if( !hl.parentElement.classList.contains('code-snippet') && !hl.parentElement.classList.contains('highlight')) { + hl.prepend(copyIcon.cloneNode([true])); + } + }) + copy(); +}); diff --git a/website/www/site/static/js/expandable-list.js b/website/www/site/static/js/expandable-list.js new file mode 100644 index 000000000000..740ad8fd1405 --- /dev/null +++ b/website/www/site/static/js/expandable-list.js @@ -0,0 +1,38 @@ +// Licensed under the Apache License, Version 2.0 (the 'License'); you may not +// use this file except in compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an 'AS IS' BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. + +$(document).ready(function() { + function expandable(){ + function stop(){ + var w = $(window).width(); + $('.arrow-list-header').click(function(e){ + if (w <= 768) { + e.preventDefault(); + e.stopPropagation(); + } + }) + } + } + $(window).resize(function(){ + stop(); + }); + function rotate() { + $(".arrow-list-header").click(function(){ + $(this).find('figure').toggleClass('rotate'); + }); + $('#apache-dropdown').click(function(){ + $(this).find('span').toggleClass('rotate'); + }); + } + rotate(); + expandable(); +}); From 02140aea7016332d6ce11a2fb930d27d7411127f Mon Sep 17 00:00:00 2001 From: Jakub-Sadowski Date: Fri, 5 Feb 2021 18:18:08 +0100 Subject: [PATCH 09/12] [BEAM-11618-11619-11605-11468-][Website revamp]Implemented capability matrix, powered by, beam practises, feedback component (#13858) * init * missing content * search styles * add link to feedback * content update * examples update * fix powered by * add page * fix * fix logos * add capability * change of sdks * Update website/www/site/layouts/partials/feedback.html Co-authored-by: Brian Hulette * Update website/www/site/data/en/powered-by.yaml Co-authored-by: Brian Hulette * fix content * fix matrix * Update website/www/site/data/en/powered-by.yaml Co-authored-by: Brian Hulette * basics * fix * fix hero component: * fix mobile * fix navigation * navbar fix Co-authored-by: Brian Hulette --- website/www/site/assets/scss/_blog.scss | 5 + .../site/assets/scss/_capability-matrix.scss | 334 ++++++++++ website/www/site/assets/scss/_lists.scss | 24 +- .../www/site/assets/scss/_navbar-desktop.scss | 14 + website/www/site/assets/scss/_pillars.scss | 2 +- website/www/site/assets/scss/_powered_by.scss | 196 ++++++ .../www/site/assets/scss/_section-nav.sass | 115 ---- website/www/site/assets/scss/main.scss | 9 +- .../site/content/en/community/powered-by.md | 27 - .../content/en/contribute/runner-guide.md | 177 ------ .../site/content/en/documentation/basics.md | 193 ++++++ .../en/documentation/runners/basics.md | 193 ++++++ .../_index.md} | 19 +- ...features-not-yet-part-of-the-beam-model.md | 21 + .../bounded-splittable-dofn-support-status.md | 21 + .../how-do-refinements-relate.md | 21 + ...nbounded-splittable-dofn-support-status.md | 21 + .../what-is-being-computed.md | 21 + .../when-in-processing-time.md | 21 + .../capability-matrix/where-in-event-time.md | 21 + .../content/en/get-started/beam-overview.md | 12 +- .../www/site/content/en/powered-by/_index.md | 24 + .../en/powered-by/commercial/_index.md | 19 + .../content/en/powered-by/commercial/eBay.md | 22 + .../content/en/powered-by/commercial/goga.md | 22 + .../en/powered-by/commercial/mozilla.md | 22 + .../content/en/powered-by/commercial/neo4j.md | 23 + .../content/en/powered-by/commercial/oriel.md | 23 + .../en/powered-by/commercial/ricardo.md | 23 + .../en/powered-by/open-source/_index.md | 17 + .../content/en/powered-by/open-source/klio.md | 22 + .../content/en/powered-by/open-source/scio.md | 20 + website/www/site/data/capability_matrix.yaml | 70 ++- .../site/data/capability_matrix_snapshot.yaml | 40 +- website/www/site/data/en/pillars.yaml | 2 +- website/www/site/data/en/powered-by.yaml | 20 + website/www/site/i18n/blog/en.yaml | 5 +- website/www/site/i18n/capability/en.yaml | 16 + website/www/site/i18n/feedback/en.yaml | 19 + website/www/site/i18n/powered-by/en.yaml | 16 + .../www/site/layouts/commercial/baseof.html | 35 ++ website/www/site/layouts/commercial/list.html | 111 ++++ .../www/site/layouts/commercial/single.html | 30 + .../www/site/layouts/community/baseof.html | 1 + .../layouts/contribute/arrow_template.html | 1 + .../www/site/layouts/contribute/baseof.html | 1 + .../site/layouts/documentation/baseof.html | 1 + .../www/site/layouts/get-started/baseof.html | 1 + .../www/site/layouts/open-source/baseof.html | 35 ++ .../www/site/layouts/open-source/list.html | 111 ++++ .../www/site/layouts/open-source/single.html | 30 + .../layouts/partials/cards/powered-by.html | 25 + .../documentation/capability-matrix-row.html | 39 ++ .../www/site/layouts/partials/feedback.html | 22 + website/www/site/layouts/partials/head.html | 2 +- .../partials/section-menu/en/community.html | 1 - .../partials/section-menu/en/contribute.html | 1 + .../section-menu/en/documentation.html | 571 +++++++++--------- .../partials/section-menu/en/get-started.html | 27 +- .../partials/section-menu/en/powered-by.html | 16 + website/www/site/layouts/powered-by/main.html | 36 ++ website/www/site/layouts/roadmap/baseof.html | 1 + .../site/layouts/runners/arrow_template.html | 41 ++ website/www/site/layouts/runners/baseof.html | 1 + .../layouts/runners/capability-template.html | 26 + website/www/site/layouts/security/baseof.html | 8 +- .../documentation/capability-matrix-big.html | 74 +++ .../capability-matrix-single.html | 102 ++++ .../shortcodes/documentation/sdks.html | 9 +- .../powered-by/powered-by-cards.html | 18 + website/www/site/static/js/fix-menu.js | 1 - .../www/site/static/js/hero/hero-mobile.js | 36 +- 72 files changed, 2594 insertions(+), 712 deletions(-) create mode 100644 website/www/site/assets/scss/_capability-matrix.scss create mode 100644 website/www/site/assets/scss/_powered_by.scss delete mode 100644 website/www/site/assets/scss/_section-nav.sass delete mode 100644 website/www/site/content/en/community/powered-by.md create mode 100644 website/www/site/content/en/documentation/basics.md create mode 100644 website/www/site/content/en/documentation/runners/basics.md rename website/www/site/content/en/documentation/runners/{capability-matrix.md => capability-matrix/_index.md} (55%) create mode 100644 website/www/site/content/en/documentation/runners/capability-matrix/additional-common-features-not-yet-part-of-the-beam-model.md create mode 100644 website/www/site/content/en/documentation/runners/capability-matrix/bounded-splittable-dofn-support-status.md create mode 100644 website/www/site/content/en/documentation/runners/capability-matrix/how-do-refinements-relate.md create mode 100644 website/www/site/content/en/documentation/runners/capability-matrix/unbounded-splittable-dofn-support-status.md create mode 100644 website/www/site/content/en/documentation/runners/capability-matrix/what-is-being-computed.md create mode 100644 website/www/site/content/en/documentation/runners/capability-matrix/when-in-processing-time.md create mode 100644 website/www/site/content/en/documentation/runners/capability-matrix/where-in-event-time.md create mode 100644 website/www/site/content/en/powered-by/_index.md create mode 100644 website/www/site/content/en/powered-by/commercial/_index.md create mode 100644 website/www/site/content/en/powered-by/commercial/eBay.md create mode 100644 website/www/site/content/en/powered-by/commercial/goga.md create mode 100644 website/www/site/content/en/powered-by/commercial/mozilla.md create mode 100644 website/www/site/content/en/powered-by/commercial/neo4j.md create mode 100644 website/www/site/content/en/powered-by/commercial/oriel.md create mode 100644 website/www/site/content/en/powered-by/commercial/ricardo.md create mode 100644 website/www/site/content/en/powered-by/open-source/_index.md create mode 100644 website/www/site/content/en/powered-by/open-source/klio.md create mode 100644 website/www/site/content/en/powered-by/open-source/scio.md create mode 100644 website/www/site/data/en/powered-by.yaml create mode 100644 website/www/site/i18n/capability/en.yaml create mode 100644 website/www/site/i18n/feedback/en.yaml create mode 100644 website/www/site/i18n/powered-by/en.yaml create mode 100644 website/www/site/layouts/commercial/baseof.html create mode 100644 website/www/site/layouts/commercial/list.html create mode 100644 website/www/site/layouts/commercial/single.html create mode 100644 website/www/site/layouts/open-source/baseof.html create mode 100644 website/www/site/layouts/open-source/list.html create mode 100644 website/www/site/layouts/open-source/single.html create mode 100644 website/www/site/layouts/partials/cards/powered-by.html create mode 100644 website/www/site/layouts/partials/documentation/capability-matrix-row.html create mode 100644 website/www/site/layouts/partials/feedback.html create mode 100644 website/www/site/layouts/partials/section-menu/en/powered-by.html create mode 100644 website/www/site/layouts/powered-by/main.html create mode 100644 website/www/site/layouts/runners/arrow_template.html create mode 100644 website/www/site/layouts/runners/capability-template.html create mode 100644 website/www/site/layouts/shortcodes/documentation/capability-matrix-big.html create mode 100644 website/www/site/layouts/shortcodes/documentation/capability-matrix-single.html create mode 100644 website/www/site/layouts/shortcodes/powered-by/powered-by-cards.html diff --git a/website/www/site/assets/scss/_blog.scss b/website/www/site/assets/scss/_blog.scss index e6c1ad567008..697cc8b84a31 100644 --- a/website/www/site/assets/scss/_blog.scss +++ b/website/www/site/assets/scss/_blog.scss @@ -69,10 +69,15 @@ } } } + .category-buttons_center { + max-width: 872px; + margin:initial; + } .category-buttons_poweredBy { justify-content: flex-start; margin-top: 84px; } + .restricted { max-width: 60%; @media (max-width: $mobile) { diff --git a/website/www/site/assets/scss/_capability-matrix.scss b/website/www/site/assets/scss/_capability-matrix.scss new file mode 100644 index 000000000000..4f0d16b6114f --- /dev/null +++ b/website/www/site/assets/scss/_capability-matrix.scss @@ -0,0 +1,334 @@ +/** + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +@import "media"; + +.back-button { + font-size: 14px; + font-weight: 700; + padding-left: 15px; + line-height: 1.14; + letter-spacing: .6px; + color: #f26628; + text-transform: uppercase; + &:hover { + color: #f2804d; + } + i { + width: 26px; + } +} + +.information-container { + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row; + margin-bottom: 84px; + + @media(max-width:$mobile) { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + } + table { + margin: 0; + } + .read-tables { + table-layout: fixed; + position: relative; + th:first-of-type { + width: 22px; + min-width: 22px; + } + span { + font-weight: 500; + } + } + .second-container { + width: 270px; + margin-left: 100px; + @media(max-width:$mobile) { + margin-left: 0; + } + h5 { + margin-bottom: 22px; + } + .row { + display: -webkit-box; + display: flex; + margin-left: 0; + } + .box { + width: 71px; + height: 24px; + margin-bottom: 10px; + text-align: center; + margin-right: 10px; + } + .white { + border: solid 1px #f6f6f6; + background-color: #fff; + } + .partial { + border: solid 1px #d8d8d8; + background-color: #f9f9f9; + } + .gray { + border: solid 1px #bcbcbc; + background-color: #e1e0e0; + } + } + .border-left { + border-left: 3px solid #ff6d05; + padding: 7px; + font-size: 12px; + font-weight: 500; + line-height: 1.83; + letter-spacing: .43px; + } + .border-right { + transform: rotate(270deg); + height: 80px; + text-align: center; + padding: 0 !important; + width: 25px !important; + font-size: 12px; + font-weight: 500; + font-stretch: normal; + font-style: normal; + line-height: 1.57; + letter-spacing: .43px; + position: absolute; + top: 55px; + left: 24px; + } + .border-top { + border-top: 3px solid #ff6d05; + font-size: 14px; + font-weight: 400; + font-stretch: normal; + font-style: normal; + line-height: 1.57; + letter-spacing: .43px; + td { + width: 162px; + padding: 7px; + } + } +} +.table-container { + display: -webkit-box; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row; + margin-bottom: 32px; + table { + margin: 0; + } + .big-right { + max-width: 1240px; + } + .table-right { + overflow-x: scroll; + padding: 1px; + scrollbar-width: none; + &::-webkit-scrollbar { + width: 0; + background: 0 0; + } + } + .table-headers { + overflow-x: scroll; + border-spacing: 0; + border: solid 1px #d8d8d8; + border-bottom: none; + mix-blend-mode: multiply; + -ms-overflow-style: none; + scrollbar-width: none; + scroll-behavior: auto; + &::-webkit-scrollbar { + width: 0; + background: 0 0; + } + table { + height: 48px; + table-layout: fixed; + width: 710px; + th { + text-align: center; + width: 142px; + font-size: 12px; + font-weight: 500; + line-height: normal; + letter-spacing: normal; + padding-left: 10px; + @media(max-width: $mobile) { + width: 73px; + } + } + } + } + .big-headers table th { + width: 249px; + } + .table-center { + overflow-x: scroll; + border-spacing: 0; + border: solid 1px #d8d8d8; + border-collapse: separate; + transform: rotateX(180deg); + padding-bottom: 8px; + scrollbar-color: #ff6d00; + scroll-behavior: auto; + &::-webkit-scrollbar { + height: 8px; + width: 25px !important; + } + &::-webkit-scrollbar-track { + background-color: #efeded; + background-clip: content-box; + } + &::-webkit-scrollbar-thumb { + border-radius: 8px; + height: 6px !important; + background-color: #ff6d00; + } + table { + transform: rotateX(180deg); + border-collapse: separate; + table-layout: fixed; + width: 710px; + th, td { + width: 142px; + height: 48px; + font-size: 12px; + font-weight: 500; + line-height: normal; + letter-spacing: normal; + border: 1px solid #fff; + @media(max-width:640px) { + width: 73px; + } + } + } + } + .big-center { + table { + tr { + vertical-align: baseline; + th,td { + width: 249px; + height: 352px; + padding: 6px; + font-weight: 400; + p { + font-size: 12px; + font-weight: 500; + line-height: normal; + letter-spacing: normal; + margin: 0; + } + } + } + } + } + .table-left table { + width: 142px; + @media(max-width:640px) { + width: 73px; + } + tr:first-child th { + height: 83px; + border: none; + @media(max-width: $mobile) { + height: 119px; + } + @-moz-document url-prefix() { + height: 77px; + } + } + th { + height: 48px; + font-size: 12px; + font-weight: 500; + line-height: normal; + letter-spacing: normal; + border: solid 1px #f6f6f6; + border-right: none; + padding: 6px; + } + } + .big-left table { + text-align: start; + tr { + vertical-align: baseline; + } + th { + height: 352px; + } + } +} +#table-link { + margin-bottom: 84px; + font-size: 14px; + font-weight: 700; + line-height: 1.14; + letter-spacing: .6px; + color: #f26628; + text-transform: uppercase; + &:hover { + text-decoration: none; + color: #f2804d; + } +} + +[class*=-switcher], +.language-switcher, +nav.version-switcher, +nav.runner-switcher { + ul li{ + margin-bottom: 0 !important; + border: 1px solid #ff6d05; + border-top-left-radius: 6px; + border-top-right-radius: 6px; + border-bottom: none; + padding-left: 0 !important; + &:hover { + cursor: pointer + } + a { + border: none; + margin-right: 0; + color: #333; + &:hover { + background-color: #f2804d; + } + } + .active { + color: #fff; + a { + background-color: #ff6d05; + color: #fff; + border: none + } + } + ::before { + display: none + } + } +} +#copy:hover { + cursor: pointer +} diff --git a/website/www/site/assets/scss/_lists.scss b/website/www/site/assets/scss/_lists.scss index 5e7587711f90..c4a34910c67e 100644 --- a/website/www/site/assets/scss/_lists.scss +++ b/website/www/site/assets/scss/_lists.scss @@ -220,6 +220,7 @@ line-height: 1.63; letter-spacing: 0.43px; color: #333333; + text-decoration: none; } .item-description { max-width: 260px; @@ -233,19 +234,16 @@ } } .sdks { - max-width: 635px; - .column { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - } - .row { - margin-top: 48px; - .item-description { - margin-right: 0; - } - } + max-width: 855px; + .item-description { + font-size: 16px; + font-weight: bold; + line-height: 1.63; + letter-spacing: 0.43px; + a{ + text-decoration: none; + } + } } .collapsable-list { margin: 52px 0; diff --git a/website/www/site/assets/scss/_navbar-desktop.scss b/website/www/site/assets/scss/_navbar-desktop.scss index 826fcbe97e83..3ec381905fa1 100644 --- a/website/www/site/assets/scss/_navbar-desktop.scss +++ b/website/www/site/assets/scss/_navbar-desktop.scss @@ -51,6 +51,10 @@ margin-right: 39px; text-decoration: none; cursor: pointer; + @media(max-width: 1273px){ + font-size: 14px; + margin-right: 18px; + } } .navbar-logo { @@ -113,6 +117,10 @@ @extend .component-text; line-height: 1.63; letter-spacing: 0.2px; + @media(max-width: 1273px){ + font-size: 14px; + margin-right: 5px; + } } } } @@ -158,6 +166,12 @@ opacity: 0.84; } } + .dropdown-menu{ + @media(max-width: 1273px){ + width: 132px !important; + left: -14% !important; + } + } .navbar-dropdown { .dropdown-menu > li > a { diff --git a/website/www/site/assets/scss/_pillars.scss b/website/www/site/assets/scss/_pillars.scss index 47c95d19ba0e..4ba7a01895d7 100644 --- a/website/www/site/assets/scss/_pillars.scss +++ b/website/www/site/assets/scss/_pillars.scss @@ -100,7 +100,7 @@ } } -@media (max-width: $tablet) { +@media (max-width: $ak-breakpoint-lg) { .pillars { padding: $pad-md $pad-s; diff --git a/website/www/site/assets/scss/_powered_by.scss b/website/www/site/assets/scss/_powered_by.scss new file mode 100644 index 000000000000..2a2f67d78a37 --- /dev/null +++ b/website/www/site/assets/scss/_powered_by.scss @@ -0,0 +1,196 @@ +/* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. See accompanying LICENSE file. + */ + .powered_by { + display: flex; + flex-wrap: wrap; + margin-top: 74px; + .powered-card { + width: 417px; + height: 413px; + padding: 33px 26px 32px; + border-radius: 16px; + -webkit-box-shadow: 0 4px 16px 0 rgba(0, 0, 0, .16), 0 4px 4px 0 rgba(0, 0, 0, .06); + box-shadow: 0 4px 16px 0 rgba(0, 0, 0, .16), 0 4px 4px 0 rgba(0, 0, 0, .06); + background-color: #fff; + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + justify-content: space-between; + margin-right: 20px; + margin-bottom: 20px; + overflow: hidden; + &:hover { + text-decoration: none; + -webkit-box-shadow: 0 4px 20px 0 rgba(0, 0, 0, .24), 0 4px 6px 0 rgba(0, 0, 0, .24); + box-shadow: 0 4px 20px 0 rgba(0, 0, 0, .24), 0 4px 6px 0 rgba(0, 0, 0, .24); + } + .load-button { + margin-top: 0; + } + .powered-summary { + font-size: 14px; + font-weight: 400; + line-height: 1.57; + letter-spacing: .43px; + color: #333; + } + .powered-title { + color: #333; + } + } +} +.powered-icon { + width: 153px; + height: 153px; + margin: 0 auto; + svg { + width: 100%; + height: 100%; + } +} +.use_cases { + display: flex; + flex-direction: column; + .use-card { + width: 872px; + max-width: 100%; + height: 278px; + padding: 33px 33px 24px 37px; + border-radius: 16px; + -webkit-box-shadow: 0 4px 16px 0 rgba(0, 0, 0, .16), 0 4px 4px 0 rgba(0, 0, 0, .06); + box-shadow: 0 4px 16px 0 rgba(0, 0, 0, .16), 0 4px 4px 0 rgba(0, 0, 0, .06); + background-color: #fff; + display: flex; + margin-bottom: 36px; + &:hover { + text-decoration: none; + -webkit-box-shadow: 0 4px 20px 0 rgba(0, 0, 0, .24), 0 4px 6px 0 rgba(0, 0, 0, .24); + box-shadow: 0 4px 20px 0 rgba(0, 0, 0, .24), 0 4px 6px 0 rgba(0, 0, 0, .24); + } + a { + color: #333; + &:hover { + text-decoration: none; + } + } + .use-icon { + display: flex; + align-items: center; + height: 100%; + margin-right: 48px; + svg, img { + width: 153px; + } + } + .use-body { + display: flex; + width: calc(100% - 200px); + flex-direction: column; + justify-content: space-between; + .use-category { + margin-bottom: 16px; + font-size: 14px; + font-weight: 700; + line-height: normal; + letter-spacing: 2px; + text-align: left; + color: #8c8b8e; + text-transform: uppercase; + } + .read-link { + text-align: end; + color: #f26628; + font-weight: 700; + line-height: 1.14; + letter-spacing: .6px; + } + .use-summary { + max-height: 109px; + display: -webkit-box; + overflow: hidden; + -webkit-line-clamp: 4; + -webkit-box-orient: vertical; + } + h5 { + margin-top: 0; + } + } + } + .remove { + display: none; + } + .show-item { + display: flex; + } +} +.feedback { + text-align: center; + position: relative; + padding-top: 56px; + margin-top: 48px; + h3 { + max-width: 100%; + } + .update { + color: #8c8b8e; + float: right; + position: absolute; + top: 0; + right: 0; + } + .load-button { + margin-top: 56px; + padding: 15px 31px; + a{ + color: #fff; + text-decoration: none; + } + } + .description { + max-width: 465px; + margin: 0 auto; + margin-top: 24px; + } +} +@media (max-width: $mobile) { + .powered_by { + justify-content: center; + .powered-card { + width: 327px; + margin-right: 0; + } + } + .use_cases { + align-items: center; + .use-card { + width: 327px; + height: 650px; + padding: 27px 25px 24px; + flex-direction: column; + align-items: center; + .use-icon { + margin-right: 0; + height: 153px; + margin-bottom: 32px; + } + .use-body { + width: 100%; + height: 100%; + .use-summary { + max-height: 234px; + -webkit-line-clamp: 9; + } + } + } + } +} diff --git a/website/www/site/assets/scss/_section-nav.sass b/website/www/site/assets/scss/_section-nav.sass deleted file mode 100644 index 0712b6acec56..000000000000 --- a/website/www/site/assets/scss/_section-nav.sass +++ /dev/null @@ -1,115 +0,0 @@ -/*! - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -.section-nav - max-width: 250px - position: fixed - width: 100% - overflow-y: auto - background-color: #F7F7F7 - - nav - padding: 15px - max-height: calc(100vh - 130px) - - ul - list-style: none - - li - margin-bottom: 5px - - &:last-child - margin-bottom: 0 - - .section-nav-list - padding-left: 16px - - a - font-size: 12px - - @media (max-width: $ak-breakpoint-lg) - background-color: $color-white - max-height: 100vh - - .active - text-decoration: underline - color: #0f3556 - - &-back - display: none - padding: 15px - - @media (max-width: $ak-breakpoint-lg) - display: block - - &-list-title - display: block - font-size: 12px - position: relative - margin-bottom: 5px - - &--collapsible - cursor: pointer - - &-list-main-title - display: block - font-size: 12px - font-weight: bold - margin-bottom: 15px - text-transform: uppercase - - &-item--collapsible - cursor: pointer - - .section-nav-list - display: none - - span:before - content: "" - position: absolute - top: 2px - left: -16px - border-style: solid - border-width: 5px 0 5px 8px - border-color: transparent transparent transparent #3371e3 - transform: rotate(0deg) - transition: 0.3s - - .expanded - > span:before - transform: rotate(90deg) - - - @media (max-width: $ak-breakpoint-lg) - background-color: $color-light-gray - bottom: 0 - right: 0 - max-width: 256px - position: fixed - top: 0 - transition: transform 100ms linear - width: calc(100% - 32px) - z-index: 10000 - - nav - height: calc(100vh - 44px) - overflow-y: auto - - &.closed - transform: translateX(100%) - - &.open - transform: translateX(0) diff --git a/website/www/site/assets/scss/main.scss b/website/www/site/assets/scss/main.scss index dfddc141600c..b72b4085c72a 100644 --- a/website/www/site/assets/scss/main.scss +++ b/website/www/site/assets/scss/main.scss @@ -14,7 +14,7 @@ // Legacy. @import "bootstrap"; -@import "capability-matrix"; +@import "_capability-matrix"; @import "_syntax-highlighting"; @import "_toggler-nav"; @@ -39,13 +39,14 @@ @import "_hero-mobile.scss"; @import "_logos.scss"; @import "_pillars.scss"; -@import "_section-nav.scss"; -@import "_page-nav.scss"; +@import "_navbar-desktop.scss"; @import "_table-wrapper.scss"; @import "_calendar.scss"; +@import "_section-nav.scss"; +@import "_page-nav.scss"; @import "_quotes.scss"; @import "_blog.scss"; @import "_lists.scss"; @import "_traits.scss"; -@import "_navbar-desktop.scss"; @import "_search.scss"; +@import "_powered_by.scss"; diff --git a/website/www/site/content/en/community/powered-by.md b/website/www/site/content/en/community/powered-by.md deleted file mode 100644 index dd45ece15b4b..000000000000 --- a/website/www/site/content/en/community/powered-by.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: 'Powered by Apache Beam' ---- - -# Projects and Products Powered by Apache Beam - -To add yourself to the list, please open a [pull request](https://github.com/apache/beam/edit/master/website/www/site/content/en/community/powered_by.md) adding your organization name, URL, a list of which Beam components you are using, and a short description of your use case. - -* **[Cloud Dataflow](https://cloud.google.com/dataflow):** Google Cloud Dataflow is a fully managed service for executing - Apache Beam pipelines within the Google Cloud Platform ecosystem. -* **[TensorFlow Extended (TFX)](https://www.tensorflow.org/tfx):** TensorFlow Extended (TFX) is an end-to-end platform - for deploying production ML pipelines. -* **[Apache Hop (incubating)](http://hop.apache.org):** Hop provides a complete data orchestration (ETL / DI) toolset with visual pipeline development. It supports execution on the main Apache Beam runners. - - diff --git a/website/www/site/content/en/contribute/runner-guide.md b/website/www/site/content/en/contribute/runner-guide.md index 57457a68fa8b..6bc65ecd6eb5 100644 --- a/website/www/site/content/en/contribute/runner-guide.md +++ b/website/www/site/content/en/contribute/runner-guide.md @@ -27,183 +27,6 @@ Topics covered: {{< toc >}} -## Basics of the Beam model - -Suppose you have a data processing engine that can pretty easily process graphs -of operations. You want to integrate it with the Beam ecosystem to get access -to other languages, great event time processing, and a library of connectors. -You need to know the core vocabulary: - - * [_Pipeline_](#pipeline) - A pipeline is a graph of transformations that a user constructs - that defines the data processing they want to do. - * [_PCollection_](#pcollections) - Data being processed in a pipeline is part of a PCollection. - * [_PTransforms_](#ptransforms) - The operations executed within a pipeline. These are best - thought of as operations on PCollections. - * _SDK_ - A language-specific library for pipeline authors (we often call them - "users" even though we have many kinds of users) to build transforms, - construct their pipelines and submit them to a runner - * _Runner_ - You are going to write a piece of software called a runner that - takes a Beam pipeline and executes it using the capabilities of your data - processing engine. - -These concepts may be very similar to your processing engine's concepts. Since -Beam's design is for cross-language operation and reusable libraries of -transforms, there are some special features worth highlighting. - -### Pipeline - -A pipeline in Beam is a graph of PTransforms operating on PCollections. A -pipeline is constructed by a user in their SDK of choice, and makes its way to -your runner either via the SDK directly or via the Runner API's (forthcoming) -RPC interfaces. - -### PTransforms - -In Beam, a PTransform can be one of the five primitives or it can be a -composite transform encapsulating a subgraph. The primitives are: - - * [_Read_](#implementing-the-read-primitive) - parallel connectors to external - systems - * [_ParDo_](#implementing-the-pardo-primitive) - per element processing - * [_GroupByKey_](#implementing-the-groupbykey-and-window-primitive) - - aggregating elements per key and window - * [_Flatten_](#implementing-the-flatten-primitive) - union of PCollections - * [_Window_](#implementing-the-window-primitive) - set the windowing strategy - for a PCollection - -When implementing a runner, these are the operations you need to implement. -Composite transforms may or may not be important to your runner. If you expose -a UI, maintaining some of the composite structure will make the pipeline easier -for a user to understand. But the result of processing is not changed. - -### PCollections - -A PCollection is an unordered bag of elements. Your runner will be responsible -for storing these elements. There are some major aspects of a PCollection to -note: - -#### Bounded vs Unbounded - -A PCollection may be bounded or unbounded. - - - _Bounded_ - it is finite and you know it, as in batch use cases - - _Unbounded_ - it may be never end, you don't know, as in streaming use cases - -These derive from the intuitions of batch and stream processing, but the two -are unified in Beam and bounded and unbounded PCollections can coexist in the -same pipeline. If your runner can only support bounded PCollections, you'll -need to reject pipelines that contain unbounded PCollections. If your -runner is only really targeting streams, there are adapters in our support code -to convert everything to APIs targeting unbounded data. - -#### Timestamps - -Every element in a PCollection has a timestamp associated with it. - -When you execute a primitive connector to some storage system, that connector -is responsible for providing initial timestamps. Your runner will need to -propagate and aggregate timestamps. If the timestamp is not important, as with -certain batch processing jobs where elements do not denote events, they will be -the minimum representable timestamp, often referred to colloquially as -"negative infinity". - -#### Watermarks - -Every PCollection has to have a watermark that estimates how complete the -PCollection is. - -The watermark is a guess that "we'll never see an element with an earlier -timestamp". Sources of data are responsible for producing a watermark. Your -runner needs to implement watermark propagation as PCollections are processed, -merged, and partitioned. - -The contents of a PCollection are complete when a watermark advances to -"infinity". In this manner, you may discover that an unbounded PCollection is -finite. - -#### Windowed elements - -Every element in a PCollection resides in a window. No element resides in -multiple windows (two elements can be equal except for their window, but they -are not the same). - -When elements are read from the outside world they arrive in the global window. -When they are written to the outside world, they are effectively placed back -into the global window (any writing transform that doesn't take this -perspective probably risks data loss). - -A window has a maximum timestamp, and when the watermark exceeds this plus -user-specified allowed lateness the window is expired. All data related -to an expired window may be discarded at any time. - -#### Coder - -Every PCollection has a coder, a specification of the binary format of the elements. - -In Beam, the user's pipeline may be written in a language other than the -language of the runner. There is no expectation that the runner can actually -deserialize user data. So the Beam model operates principally on encoded data - -"just bytes". Each PCollection has a declared encoding for its elements, called -a coder. A coder has a URN that identifies the encoding, and may have -additional sub-coders (for example, a coder for lists may contain a coder for -the elements of the list). Language-specific serialization techniques can, and -frequently are used, but there are a few key formats - such as key-value pairs -and timestamps - that are common so your runner can understand them. - -#### Windowing Strategy - -Every PCollection has a windowing strategy, a specification of essential -information for grouping and triggering operations. - -The details will be discussed below when we discuss the -[Window](#implementing-the-window-primitive) primitive, which sets up the -windowing strategy, and -[GroupByKey](#implementing-the-groupbykey-and-window-primitive) primitive, -which has behavior governed by the windowing strategy. - -### User-Defined Functions (UDFs) - -Beam has seven varieties of user-defined function (UDF). A Beam pipeline -may contain UDFs written in a language other than your runner, or even multiple -languages in the same pipeline (see the [Runner API](#the-runner-api)) so the -definitions are language-independent (see the [Fn API](#the-fn-api)). - -The UDFs of Beam are: - - * _DoFn_ - per-element processing function (used in ParDo) - * _WindowFn_ - places elements in windows and merges windows (used in Window - and GroupByKey) - * _Source_ - emits data read from external sources, including initial and - dynamic splitting for parallelism (used in Read) - * _ViewFn_ - adapts a materialized PCollection to a particular interface (used - in side inputs) - * _WindowMappingFn_ - maps one element's window to another, and specifies - bounds on how far in the past the result window will be (used in side - inputs) - * _CombineFn_ - associative and commutative aggregation (used in Combine and - state) - * _Coder_ - encodes user data; some coders have standard formats and are not really UDFs - -The various types of user-defined functions will be described further alongside -the primitives that use them. - -### Runner - -The term "runner" is used for a couple of things. It generally refers to the -software that takes a Beam pipeline and executes it somehow. Often, this is the -translation code that you write. It usually also includes some customized -operators for your data processing engine, and is sometimes used to refer to -the full stack. - -A runner has just a single method `run(Pipeline)`. From here on, I will often -use code font for proper nouns in our APIs, whether or not the identifiers -match across all SDKs. - -The `run(Pipeline)` method should be asynchronous and results in a -PipelineResult which generally will be a job descriptor for your data -processing engine, providing methods for checking its status, canceling it, and -waiting for it to terminate. - ## Implementing the Beam Primitives Aside from encoding and persisting data - which presumably your engine already diff --git a/website/www/site/content/en/documentation/basics.md b/website/www/site/content/en/documentation/basics.md new file mode 100644 index 000000000000..bccd2b989886 --- /dev/null +++ b/website/www/site/content/en/documentation/basics.md @@ -0,0 +1,193 @@ +--- +title: "Basics of the Beam model" +--- + + +# Basics of the Beam model + +Suppose you have a data processing engine that can pretty easily process graphs +of operations. You want to integrate it with the Beam ecosystem to get access +to other languages, great event time processing, and a library of connectors. +You need to know the core vocabulary: + + * [_Pipeline_](#pipeline) - A pipeline is a graph of transformations that a user constructs + that defines the data processing they want to do. + * [_PCollection_](#pcollections) - Data being processed in a pipeline is part of a PCollection. + * [_PTransforms_](#ptransforms) - The operations executed within a pipeline. These are best + thought of as operations on PCollections. + * _SDK_ - A language-specific library for pipeline authors (we often call them + "users" even though we have many kinds of users) to build transforms, + construct their pipelines and submit them to a runner + * _Runner_ - You are going to write a piece of software called a runner that + takes a Beam pipeline and executes it using the capabilities of your data + processing engine. + +These concepts may be very similar to your processing engine's concepts. Since +Beam's design is for cross-language operation and reusable libraries of +transforms, there are some special features worth highlighting. + +### Pipeline + +A pipeline in Beam is a graph of PTransforms operating on PCollections. A +pipeline is constructed by a user in their SDK of choice, and makes its way to +your runner either via the SDK directly or via the Runner API's (forthcoming) +RPC interfaces. + +### PTransforms + +In Beam, a PTransform can be one of the five primitives or it can be a +composite transform encapsulating a subgraph. The primitives are: + + * [_Read_](#implementing-the-read-primitive) - parallel connectors to external + systems + * [_ParDo_](#implementing-the-pardo-primitive) - per element processing + * [_GroupByKey_](#implementing-the-groupbykey-and-window-primitive) - + aggregating elements per key and window + * [_Flatten_](#implementing-the-flatten-primitive) - union of PCollections + * [_Window_](#implementing-the-window-primitive) - set the windowing strategy + for a PCollection + +When implementing a runner, these are the operations you need to implement. +Composite transforms may or may not be important to your runner. If you expose +a UI, maintaining some of the composite structure will make the pipeline easier +for a user to understand. But the result of processing is not changed. + +### PCollections + +A PCollection is an unordered bag of elements. Your runner will be responsible +for storing these elements. There are some major aspects of a PCollection to +note: + +#### Bounded vs Unbounded + +A PCollection may be bounded or unbounded. + + - _Bounded_ - it is finite and you know it, as in batch use cases + - _Unbounded_ - it may be never end, you don't know, as in streaming use cases + +These derive from the intuitions of batch and stream processing, but the two +are unified in Beam and bounded and unbounded PCollections can coexist in the +same pipeline. If your runner can only support bounded PCollections, you'll +need to reject pipelines that contain unbounded PCollections. If your +runner is only really targeting streams, there are adapters in our support code +to convert everything to APIs targeting unbounded data. + +#### Timestamps + +Every element in a PCollection has a timestamp associated with it. + +When you execute a primitive connector to some storage system, that connector +is responsible for providing initial timestamps. Your runner will need to +propagate and aggregate timestamps. If the timestamp is not important, as with +certain batch processing jobs where elements do not denote events, they will be +the minimum representable timestamp, often referred to colloquially as +"negative infinity". + +#### Watermarks + +Every PCollection has to have a watermark that estimates how complete the +PCollection is. + +The watermark is a guess that "we'll never see an element with an earlier +timestamp". Sources of data are responsible for producing a watermark. Your +runner needs to implement watermark propagation as PCollections are processed, +merged, and partitioned. + +The contents of a PCollection are complete when a watermark advances to +"infinity". In this manner, you may discover that an unbounded PCollection is +finite. + +#### Windowed elements + +Every element in a PCollection resides in a window. No element resides in +multiple windows (two elements can be equal except for their window, but they +are not the same). + +When elements are read from the outside world they arrive in the global window. +When they are written to the outside world, they are effectively placed back +into the global window (any writing transform that doesn't take this +perspective probably risks data loss). + +A window has a maximum timestamp, and when the watermark exceeds this plus +user-specified allowed lateness the window is expired. All data related +to an expired window may be discarded at any time. + +#### Coder + +Every PCollection has a coder, a specification of the binary format of the elements. + +In Beam, the user's pipeline may be written in a language other than the +language of the runner. There is no expectation that the runner can actually +deserialize user data. So the Beam model operates principally on encoded data - +"just bytes". Each PCollection has a declared encoding for its elements, called +a coder. A coder has a URN that identifies the encoding, and may have +additional sub-coders (for example, a coder for lists may contain a coder for +the elements of the list). Language-specific serialization techniques can, and +frequently are used, but there are a few key formats - such as key-value pairs +and timestamps - that are common so your runner can understand them. + +#### Windowing Strategy + +Every PCollection has a windowing strategy, a specification of essential +information for grouping and triggering operations. + +The details will be discussed below when we discuss the +[Window](#implementing-the-window-primitive) primitive, which sets up the +windowing strategy, and +[GroupByKey](#implementing-the-groupbykey-and-window-primitive) primitive, +which has behavior governed by the windowing strategy. + +### User-Defined Functions (UDFs) + +Beam has seven varieties of user-defined function (UDF). A Beam pipeline +may contain UDFs written in a language other than your runner, or even multiple +languages in the same pipeline (see the [Runner API](#the-runner-api)) so the +definitions are language-independent (see the [Fn API](#the-fn-api)). + +The UDFs of Beam are: + + * _DoFn_ - per-element processing function (used in ParDo) + * _WindowFn_ - places elements in windows and merges windows (used in Window + and GroupByKey) + * _Source_ - emits data read from external sources, including initial and + dynamic splitting for parallelism (used in Read) + * _ViewFn_ - adapts a materialized PCollection to a particular interface (used + in side inputs) + * _WindowMappingFn_ - maps one element's window to another, and specifies + bounds on how far in the past the result window will be (used in side + inputs) + * _CombineFn_ - associative and commutative aggregation (used in Combine and + state) + * _Coder_ - encodes user data; some coders have standard formats and are not really UDFs + +The various types of user-defined functions will be described further alongside +the primitives that use them. + +### Runner + +The term "runner" is used for a couple of things. It generally refers to the +software that takes a Beam pipeline and executes it somehow. Often, this is the +translation code that you write. It usually also includes some customized +operators for your data processing engine, and is sometimes used to refer to +the full stack. + +A runner has just a single method `run(Pipeline)`. From here on, I will often +use code font for proper nouns in our APIs, whether or not the identifiers +match across all SDKs. + +The `run(Pipeline)` method should be asynchronous and results in a +PipelineResult which generally will be a job descriptor for your data +processing engine, providing methods for checking its status, canceling it, and +waiting for it to terminate. diff --git a/website/www/site/content/en/documentation/runners/basics.md b/website/www/site/content/en/documentation/runners/basics.md new file mode 100644 index 000000000000..bccd2b989886 --- /dev/null +++ b/website/www/site/content/en/documentation/runners/basics.md @@ -0,0 +1,193 @@ +--- +title: "Basics of the Beam model" +--- + + +# Basics of the Beam model + +Suppose you have a data processing engine that can pretty easily process graphs +of operations. You want to integrate it with the Beam ecosystem to get access +to other languages, great event time processing, and a library of connectors. +You need to know the core vocabulary: + + * [_Pipeline_](#pipeline) - A pipeline is a graph of transformations that a user constructs + that defines the data processing they want to do. + * [_PCollection_](#pcollections) - Data being processed in a pipeline is part of a PCollection. + * [_PTransforms_](#ptransforms) - The operations executed within a pipeline. These are best + thought of as operations on PCollections. + * _SDK_ - A language-specific library for pipeline authors (we often call them + "users" even though we have many kinds of users) to build transforms, + construct their pipelines and submit them to a runner + * _Runner_ - You are going to write a piece of software called a runner that + takes a Beam pipeline and executes it using the capabilities of your data + processing engine. + +These concepts may be very similar to your processing engine's concepts. Since +Beam's design is for cross-language operation and reusable libraries of +transforms, there are some special features worth highlighting. + +### Pipeline + +A pipeline in Beam is a graph of PTransforms operating on PCollections. A +pipeline is constructed by a user in their SDK of choice, and makes its way to +your runner either via the SDK directly or via the Runner API's (forthcoming) +RPC interfaces. + +### PTransforms + +In Beam, a PTransform can be one of the five primitives or it can be a +composite transform encapsulating a subgraph. The primitives are: + + * [_Read_](#implementing-the-read-primitive) - parallel connectors to external + systems + * [_ParDo_](#implementing-the-pardo-primitive) - per element processing + * [_GroupByKey_](#implementing-the-groupbykey-and-window-primitive) - + aggregating elements per key and window + * [_Flatten_](#implementing-the-flatten-primitive) - union of PCollections + * [_Window_](#implementing-the-window-primitive) - set the windowing strategy + for a PCollection + +When implementing a runner, these are the operations you need to implement. +Composite transforms may or may not be important to your runner. If you expose +a UI, maintaining some of the composite structure will make the pipeline easier +for a user to understand. But the result of processing is not changed. + +### PCollections + +A PCollection is an unordered bag of elements. Your runner will be responsible +for storing these elements. There are some major aspects of a PCollection to +note: + +#### Bounded vs Unbounded + +A PCollection may be bounded or unbounded. + + - _Bounded_ - it is finite and you know it, as in batch use cases + - _Unbounded_ - it may be never end, you don't know, as in streaming use cases + +These derive from the intuitions of batch and stream processing, but the two +are unified in Beam and bounded and unbounded PCollections can coexist in the +same pipeline. If your runner can only support bounded PCollections, you'll +need to reject pipelines that contain unbounded PCollections. If your +runner is only really targeting streams, there are adapters in our support code +to convert everything to APIs targeting unbounded data. + +#### Timestamps + +Every element in a PCollection has a timestamp associated with it. + +When you execute a primitive connector to some storage system, that connector +is responsible for providing initial timestamps. Your runner will need to +propagate and aggregate timestamps. If the timestamp is not important, as with +certain batch processing jobs where elements do not denote events, they will be +the minimum representable timestamp, often referred to colloquially as +"negative infinity". + +#### Watermarks + +Every PCollection has to have a watermark that estimates how complete the +PCollection is. + +The watermark is a guess that "we'll never see an element with an earlier +timestamp". Sources of data are responsible for producing a watermark. Your +runner needs to implement watermark propagation as PCollections are processed, +merged, and partitioned. + +The contents of a PCollection are complete when a watermark advances to +"infinity". In this manner, you may discover that an unbounded PCollection is +finite. + +#### Windowed elements + +Every element in a PCollection resides in a window. No element resides in +multiple windows (two elements can be equal except for their window, but they +are not the same). + +When elements are read from the outside world they arrive in the global window. +When they are written to the outside world, they are effectively placed back +into the global window (any writing transform that doesn't take this +perspective probably risks data loss). + +A window has a maximum timestamp, and when the watermark exceeds this plus +user-specified allowed lateness the window is expired. All data related +to an expired window may be discarded at any time. + +#### Coder + +Every PCollection has a coder, a specification of the binary format of the elements. + +In Beam, the user's pipeline may be written in a language other than the +language of the runner. There is no expectation that the runner can actually +deserialize user data. So the Beam model operates principally on encoded data - +"just bytes". Each PCollection has a declared encoding for its elements, called +a coder. A coder has a URN that identifies the encoding, and may have +additional sub-coders (for example, a coder for lists may contain a coder for +the elements of the list). Language-specific serialization techniques can, and +frequently are used, but there are a few key formats - such as key-value pairs +and timestamps - that are common so your runner can understand them. + +#### Windowing Strategy + +Every PCollection has a windowing strategy, a specification of essential +information for grouping and triggering operations. + +The details will be discussed below when we discuss the +[Window](#implementing-the-window-primitive) primitive, which sets up the +windowing strategy, and +[GroupByKey](#implementing-the-groupbykey-and-window-primitive) primitive, +which has behavior governed by the windowing strategy. + +### User-Defined Functions (UDFs) + +Beam has seven varieties of user-defined function (UDF). A Beam pipeline +may contain UDFs written in a language other than your runner, or even multiple +languages in the same pipeline (see the [Runner API](#the-runner-api)) so the +definitions are language-independent (see the [Fn API](#the-fn-api)). + +The UDFs of Beam are: + + * _DoFn_ - per-element processing function (used in ParDo) + * _WindowFn_ - places elements in windows and merges windows (used in Window + and GroupByKey) + * _Source_ - emits data read from external sources, including initial and + dynamic splitting for parallelism (used in Read) + * _ViewFn_ - adapts a materialized PCollection to a particular interface (used + in side inputs) + * _WindowMappingFn_ - maps one element's window to another, and specifies + bounds on how far in the past the result window will be (used in side + inputs) + * _CombineFn_ - associative and commutative aggregation (used in Combine and + state) + * _Coder_ - encodes user data; some coders have standard formats and are not really UDFs + +The various types of user-defined functions will be described further alongside +the primitives that use them. + +### Runner + +The term "runner" is used for a couple of things. It generally refers to the +software that takes a Beam pipeline and executes it somehow. Often, this is the +translation code that you write. It usually also includes some customized +operators for your data processing engine, and is sometimes used to refer to +the full stack. + +A runner has just a single method `run(Pipeline)`. From here on, I will often +use code font for proper nouns in our APIs, whether or not the identifiers +match across all SDKs. + +The `run(Pipeline)` method should be asynchronous and results in a +PipelineResult which generally will be a job descriptor for your data +processing engine, providing methods for checking its status, canceling it, and +waiting for it to terminate. diff --git a/website/www/site/content/en/documentation/runners/capability-matrix.md b/website/www/site/content/en/documentation/runners/capability-matrix/_index.md similarity index 55% rename from website/www/site/content/en/documentation/runners/capability-matrix.md rename to website/www/site/content/en/documentation/runners/capability-matrix/_index.md index 52cfd34aaa24..2897829ec9ec 100644 --- a/website/www/site/content/en/documentation/runners/capability-matrix.md +++ b/website/www/site/content/en/documentation/runners/capability-matrix/_index.md @@ -1,6 +1,7 @@ --- type: runners title: "Apache Beam Capability Matrix" +layout: arrow_template aliases: - /learn/runners/capability-matrix/ - /capability-matrix/ @@ -22,21 +23,17 @@ limitations under the License. # Beam Capability Matrix Apache Beam provides a portable API layer for building sophisticated data-parallel processing pipelines that may be executed across a diversity of execution engines, or runners. The core concepts of this layer are based upon the Beam Model (formerly referred to as the [Dataflow Model](https://www.vldb.org/pvldb/vol8/p1792-Akidau.pdf)), and implemented to varying degrees in each Beam runner. To help clarify the capabilities of individual runners, we've created the capability matrix below. -Individual capabilities have been grouped by their corresponding What / Where / When / How question: +Individual capabilities have been grouped by their corresponding What / Where / When / How question: -- What results are being calculated? -- Where in event time? -- When in processing time? -- How do refinements of results relate? +- What results are being calculated? +- Where in event time? +- When in processing time? +- How do refinements of results relate? -For more details on the What / Where / When / How breakdown of concepts, we recommend reading through the Streaming 102 post on O'Reilly Radar. +For more details on the What / Where / When / How breakdown of concepts, we recommend reading through the Streaming 102 post on O'Reilly Radar. Note that in the future, we intend to add additional tables beyond the current set, for things like runtime characterstics (e.g. at-least-once vs exactly-once), performance, etc. -{{< capability-matrix-common >}} - -{{< capability-matrix cap-data="capability-matrix" cap-style="cap-summary" cap-view="summary" cap-other-view="full" cap-toggle-details=1 cap-display="block" >}} +{{< documentation/capability-matrix-single cap-data="capability-matrix" cap-style="cap-summary" cap-view="summary" cap-toggle-details=1 cap-display="block" >}} - -{{< capability-matrix cap-data="capability-matrix" cap-style="cap" cap-view="full" cap-other-view="summary" cap-toggle-details=0 cap-display="none" >}} diff --git a/website/www/site/content/en/documentation/runners/capability-matrix/additional-common-features-not-yet-part-of-the-beam-model.md b/website/www/site/content/en/documentation/runners/capability-matrix/additional-common-features-not-yet-part-of-the-beam-model.md new file mode 100644 index 000000000000..525e3def6f86 --- /dev/null +++ b/website/www/site/content/en/documentation/runners/capability-matrix/additional-common-features-not-yet-part-of-the-beam-model.md @@ -0,0 +1,21 @@ +--- +type: runners +title: "Additional common features not yet part of the Beam model" +layout: "capability-template" +--- + + + +{{< documentation/capability-matrix-big cap-data="capability-matrix" cap-view="full" cap-index=6 >}} diff --git a/website/www/site/content/en/documentation/runners/capability-matrix/bounded-splittable-dofn-support-status.md b/website/www/site/content/en/documentation/runners/capability-matrix/bounded-splittable-dofn-support-status.md new file mode 100644 index 000000000000..0163d270dae5 --- /dev/null +++ b/website/www/site/content/en/documentation/runners/capability-matrix/bounded-splittable-dofn-support-status.md @@ -0,0 +1,21 @@ +--- +type: runners +title: "Bounded Splittable DoFn Support Status" +layout: "capability-template" +--- + + + +{{< documentation/capability-matrix-big cap-data="capability-matrix" cap-view="full" cap-index=1 >}} diff --git a/website/www/site/content/en/documentation/runners/capability-matrix/how-do-refinements-relate.md b/website/www/site/content/en/documentation/runners/capability-matrix/how-do-refinements-relate.md new file mode 100644 index 000000000000..7e5fd22e62aa --- /dev/null +++ b/website/www/site/content/en/documentation/runners/capability-matrix/how-do-refinements-relate.md @@ -0,0 +1,21 @@ +--- +type: runners +title: "How do refinements relate?" +layout: "capability-template" +--- + + + +{{< documentation/capability-matrix-big cap-data="capability-matrix" cap-view="full" cap-index=5 >}} diff --git a/website/www/site/content/en/documentation/runners/capability-matrix/unbounded-splittable-dofn-support-status.md b/website/www/site/content/en/documentation/runners/capability-matrix/unbounded-splittable-dofn-support-status.md new file mode 100644 index 000000000000..9a1395b4cdf2 --- /dev/null +++ b/website/www/site/content/en/documentation/runners/capability-matrix/unbounded-splittable-dofn-support-status.md @@ -0,0 +1,21 @@ +--- +type: runners +title: "Unbounded Splittable DoFn Support Status" +layout: "capability-template" +--- + + + +{{< documentation/capability-matrix-big cap-data="capability-matrix" cap-view="full" cap-index=2 >}} diff --git a/website/www/site/content/en/documentation/runners/capability-matrix/what-is-being-computed.md b/website/www/site/content/en/documentation/runners/capability-matrix/what-is-being-computed.md new file mode 100644 index 000000000000..cb15ebaea1d4 --- /dev/null +++ b/website/www/site/content/en/documentation/runners/capability-matrix/what-is-being-computed.md @@ -0,0 +1,21 @@ +--- +type: runners +title: "What is being computed?" +layout: "capability-template" +--- + + + +{{< documentation/capability-matrix-big cap-data="capability-matrix" cap-view="full" cap-index=0 >}} diff --git a/website/www/site/content/en/documentation/runners/capability-matrix/when-in-processing-time.md b/website/www/site/content/en/documentation/runners/capability-matrix/when-in-processing-time.md new file mode 100644 index 000000000000..a6b319501059 --- /dev/null +++ b/website/www/site/content/en/documentation/runners/capability-matrix/when-in-processing-time.md @@ -0,0 +1,21 @@ +--- +type: runners +title: "When in processing time?" +layout: "capability-template" +--- + + + +{{< documentation/capability-matrix-big cap-data="capability-matrix" cap-view="full" cap-index=4 >}} diff --git a/website/www/site/content/en/documentation/runners/capability-matrix/where-in-event-time.md b/website/www/site/content/en/documentation/runners/capability-matrix/where-in-event-time.md new file mode 100644 index 000000000000..cf8c5c7cbee3 --- /dev/null +++ b/website/www/site/content/en/documentation/runners/capability-matrix/where-in-event-time.md @@ -0,0 +1,21 @@ +--- +type: runners +title: "Where in event time?" +layout: "capability-template" +--- + + + +{{< documentation/capability-matrix-big cap-data="capability-matrix" cap-view="full" cap-index=3 >}} diff --git a/website/www/site/content/en/get-started/beam-overview.md b/website/www/site/content/en/get-started/beam-overview.md index 40aacb01bc37..946d87177455 100644 --- a/website/www/site/content/en/get-started/beam-overview.md +++ b/website/www/site/content/en/get-started/beam-overview.md @@ -44,13 +44,13 @@ The Beam Pipeline Runners translate the data processing pipeline you define with Beam currently supports the following runners: - [Direct Runner](/documentation/runners/direct) -- [Apache Flink Runner](/documentation/runners/flink) ![Apache Flink logo](/images/logos/runners/flink.png) +- [Apache Flink Runner](/documentation/runners/flink) Apache Flink logo - [Apache Nemo Runner](/documentation/runners/nemo) -- [Apache Samza Runner](/documentation/runners/samza) Apache Samza logo -- [Apache Spark Runner](/documentation/runners/spark) ![Apache Spark logo](/images/logos/runners/spark.png) -- [Google Cloud Dataflow Runner](/documentation/runners/dataflow) ![Google Cloud Dataflow logo](/images/logos/runners/dataflow.png) -- [Hazelcast Jet Runner](/documentation/runners/jet) ![Hazelcast Jet logo](/images/logos/runners/jet.png) -- [Twister2 Runner](/documentation/runners/twister2) ![Twister2 logo](/images/logos/runners/twister2.png) +- [Apache Samza Runner](/documentation/runners/samza) Apache Samza logo +- [Apache Spark Runner](/documentation/runners/spark) Apache Spark logo +- [Google Cloud Dataflow Runner](/documentation/runners/dataflow) Google Cloud Dataflow logo +- [Hazelcast Jet Runner](/documentation/runners/jet) Hazelcast Jet logo +- [Twister2 Runner](/documentation/runners/twister2) Twister2 logo **Note:** You can always execute your pipeline locally for testing and debugging purposes. diff --git a/website/www/site/content/en/powered-by/_index.md b/website/www/site/content/en/powered-by/_index.md new file mode 100644 index 000000000000..92836bef00c0 --- /dev/null +++ b/website/www/site/content/en/powered-by/_index.md @@ -0,0 +1,24 @@ +--- +title: "Projects and Products Powered by Apache Beam" +layout: main +--- + + + +# Projects and Products Powered by Apache Beam + +To add yourself to the list, please open a pull request adding your organization name, URL, a list of which Beam components you are using, and a short description of your use case. + +{{< powered-by/powered-by-cards powered-by >}} diff --git a/website/www/site/content/en/powered-by/commercial/_index.md b/website/www/site/content/en/powered-by/commercial/_index.md new file mode 100644 index 000000000000..d3c86cacc178 --- /dev/null +++ b/website/www/site/content/en/powered-by/commercial/_index.md @@ -0,0 +1,19 @@ +--- +title: "Commercial projects" +type: commercial +icon: images/github-icon.svg +--- + + diff --git a/website/www/site/content/en/powered-by/commercial/eBay.md b/website/www/site/content/en/powered-by/commercial/eBay.md new file mode 100644 index 000000000000..feae3418fa93 --- /dev/null +++ b/website/www/site/content/en/powered-by/commercial/eBay.md @@ -0,0 +1,22 @@ +--- +title: "Feature Powered by Apache Beam - Beyond Lambda" +type: commercial +categories: + - Online & Traditional Retail +icon: /images/logos/powered-by/eBay.png +--- + + +eBay is an American e-commerce company that provides business-to-consumer and consumer-to-consumer sales through the online website. They build feature pipelines with Apache Beam: unify feature extraction and selection in online and offline, speed up E2E iteration for model training, evaluation and serving, support different types (streaming, runtime, batch) of features, etc. eBay leverages Apache Beam for the streaming feature SDK as a foundation to integrate with Kafka, Hadoop, Flink, Airflow and others in eBay. diff --git a/website/www/site/content/en/powered-by/commercial/goga.md b/website/www/site/content/en/powered-by/commercial/goga.md new file mode 100644 index 000000000000..ad83555b3f7b --- /dev/null +++ b/website/www/site/content/en/powered-by/commercial/goga.md @@ -0,0 +1,22 @@ +--- +title: "Beam and Geocoding" +type: commercial +categories: + - Machine Learning +icon: /images/logos/powered-by/goga.png +--- + + +GOGA Data Analysis and Consulting is a company based in Japan that specializes in analytics of geospatial and mapping data. They use Apache Beam and Cloud Dataflow for a smooth data transformation process for analytical purposes. This use case focuses on handling multiple extractions, geocoding, and insertion process by wrangling and requesting API call of each data based on the location provided. diff --git a/website/www/site/content/en/powered-by/commercial/mozilla.md b/website/www/site/content/en/powered-by/commercial/mozilla.md new file mode 100644 index 000000000000..5ee0dfd4f550 --- /dev/null +++ b/website/www/site/content/en/powered-by/commercial/mozilla.md @@ -0,0 +1,22 @@ +--- +title: "The Nitty-Gritty of Moving Data with Beam" +type: commercial +categories: + - Enterprise +icon: /images/logos/powered-by/mozilla.png +--- + + +Mozilla is the non-profit Firefox browser. This use case focuses on complexity that comes from moving data from one system to another safely, modeling data as it passes from one transform to another, handling errors, testing the system, and organizing the code to make the pipeline configurable for different source and destination systems in their open source codebase for ingesting telemetry data from Firefox clients. diff --git a/website/www/site/content/en/powered-by/commercial/neo4j.md b/website/www/site/content/en/powered-by/commercial/neo4j.md new file mode 100644 index 000000000000..0f9f8500757c --- /dev/null +++ b/website/www/site/content/en/powered-by/commercial/neo4j.md @@ -0,0 +1,23 @@ +--- +title: "Beam visual pipeline development with Hop" +type: commercial +categories: + - BI & Analytics +icon: /images/logos/powered-by/neo4j.png +--- + + +Neo4j is a graph database management system that leverages data relationships between data records to enable fast queries. They use Apache Beam support in Kettle to do everything and more in project Hop. The various Apache Beam runners are now directly supported as Hop pipeline engines. +[Apache Hop (incubating)](http://hop.apache.org): Hop provides a complete data orchestration (ETL / DI) toolset with visual pipeline development. It supports execution on the main Apache Beam runners. diff --git a/website/www/site/content/en/powered-by/commercial/oriel.md b/website/www/site/content/en/powered-by/commercial/oriel.md new file mode 100644 index 000000000000..0827c3f2bc91 --- /dev/null +++ b/website/www/site/content/en/powered-by/commercial/oriel.md @@ -0,0 +1,23 @@ +--- +title: "From Apache Beam to Leukemia early detection" +type: commercial +categories: + - Machine Learning +icon: /images/logos/powered-by/oriel.png +--- + + +Oriel Research Therapeutics (ORT) is a startup company in the greater Boston area that provides early detection services for +multiple medical conditions, utilizing cutting edge Artificial Intelligence technologies and Next Generation Sequencing (NGS). ORT utilizes Apache Beam pipelines to process over 1 million samples of genomics and clinical information. The processed data is used by ORT in detecting Leukemia, Sepsis and other medical conditions. diff --git a/website/www/site/content/en/powered-by/commercial/ricardo.md b/website/www/site/content/en/powered-by/commercial/ricardo.md new file mode 100644 index 000000000000..09e34c53ed3a --- /dev/null +++ b/website/www/site/content/en/powered-by/commercial/ricardo.md @@ -0,0 +1,23 @@ +--- +title: "Four Apache Technologies Combined for Fun and Profit" +type: commercial +categories: + - Online & Traditional Retail +icon: /images/logos/powered-by/ricardo.png +--- + + +Ricardo, the largest online marketplace in Switzerland, uses Apache Beam to stream-process platform data and enables the +Data Intelligence team to provide scalable data integration, analytics, and smart services. diff --git a/website/www/site/content/en/powered-by/open-source/_index.md b/website/www/site/content/en/powered-by/open-source/_index.md new file mode 100644 index 000000000000..bae5f3a50cbb --- /dev/null +++ b/website/www/site/content/en/powered-by/open-source/_index.md @@ -0,0 +1,17 @@ +--- +title: "Open source projects" +type: open-source +--- + diff --git a/website/www/site/content/en/powered-by/open-source/klio.md b/website/www/site/content/en/powered-by/open-source/klio.md new file mode 100644 index 000000000000..9c45ba1efaa2 --- /dev/null +++ b/website/www/site/content/en/powered-by/open-source/klio.md @@ -0,0 +1,22 @@ +--- +title: "Klio" +type: open-source +categories: + - Open Source Projects Powered by Apache Beam +icon: /images/logos/powered-by/klio.png +--- + + +Developed at Spotify and built on top of Apache Beam for Python, Klio is an open source framework that lets researchers and engineers build smarter data pipelines for processing audio and other media files, easily and at scale. diff --git a/website/www/site/content/en/powered-by/open-source/scio.md b/website/www/site/content/en/powered-by/open-source/scio.md new file mode 100644 index 000000000000..549b5bbbab8e --- /dev/null +++ b/website/www/site/content/en/powered-by/open-source/scio.md @@ -0,0 +1,20 @@ +--- +title: "Scio" +type: open-source +categories: + - Open Source Projects Powered by Apache Beam +icon: /images/logos/powered-by/scio.png +--- + diff --git a/website/www/site/data/capability_matrix.yaml b/website/www/site/data/capability_matrix.yaml index dacddee82022..9b10feba3017 100644 --- a/website/www/site/data/capability_matrix.yaml +++ b/website/www/site/data/capability_matrix.yaml @@ -44,10 +44,12 @@ capability-matrix: categories: - description: What is being computed? anchor: what - color-b: "ca1" - color-y: "ec3" - color-p: "fe5" - color-n: "ddd" + color-y: "fff" + color-yb: "f6f6f6" + color-p: "f9f9f9" + color-pb: "d8d8d8" + color-n: "e1e0e0" + color-nb: "bcbcbc" rows: - name: ParDo values: @@ -573,10 +575,12 @@ capability-matrix: l3: "" - description: Bounded Splittable DoFn Support Status anchor: what - color-b: "ca1" - color-y: "ec3" - color-p: "fe5" - color-n: "ddd" + color-y: "fff" + color-yb: "f6f6f6" + color-p: "f9f9f9" + color-pb: "d8d8d8" + color-n: "e1e0e0" + color-nb: "bcbcbc" rows: - name: Base values: @@ -870,10 +874,12 @@ capability-matrix: l3: - description: Unbounded Splittable DoFn Support Status anchor: what - color-b: "ca1" - color-y: "ec3" - color-p: "fe5" - color-n: "ddd" + color-y: "fff" + color-yb: "f6f6f6" + color-p: "f9f9f9" + color-pb: "d8d8d8" + color-n: "e1e0e0" + color-nb: "bcbcbc" rows: - name: Base values: @@ -1167,10 +1173,12 @@ capability-matrix: l3: - description: Where in event time? anchor: where - color-b: "37d" - color-y: "59f" - color-p: "8cf" - color-n: "ddd" + color-y: "fff" + color-yb: "f6f6f6" + color-p: "f9f9f9" + color-pb: "d8d8d8" + color-n: "e1e0e0" + color-nb: "bcbcbc" rows: - name: Global windows values: @@ -1525,10 +1533,12 @@ capability-matrix: - description: When in processing time? anchor: when - color-b: "6a4" - color-y: "8c6" - color-p: "ae8" - color-n: "ddd" + color-y: "fff" + color-yb: "f6f6f6" + color-p: "f9f9f9" + color-pb: "d8d8d8" + color-n: "e1e0e0" + color-nb: "bcbcbc" rows: - name: Configurable triggering values: @@ -1941,10 +1951,12 @@ capability-matrix: - description: How do refinements relate? anchor: how - color-b: "b55" - color-y: "d77" - color-p: "faa" - color-n: "ddd" + color-y: "fff" + color-yb: "f6f6f6" + color-p: "f9f9f9" + color-pb: "d8d8d8" + color-n: "e1e0e0" + color-nb: "bcbcbc" rows: - name: Discarding values: @@ -2101,10 +2113,12 @@ capability-matrix: l3: "" - description: Additional common features not yet part of the Beam model anchor: misc - color-b: "aaa" - color-y: "bbb" - color-p: "ccc" - color-n: "ddd" + color-y: "fff" + color-yb: "f6f6f6" + color-p: "f9f9f9" + color-pb: "d8d8d8" + color-n: "e1e0e0" + color-nb: "bcbcbc" rows: - name: Drain values: diff --git a/website/www/site/data/capability_matrix_snapshot.yaml b/website/www/site/data/capability_matrix_snapshot.yaml index 74f5601c5e2a..9da8a705fc2c 100644 --- a/website/www/site/data/capability_matrix_snapshot.yaml +++ b/website/www/site/data/capability_matrix_snapshot.yaml @@ -23,10 +23,12 @@ capability-matrix-snapshot: categories: - description: What is being computed? anchor: what - color-b: "ca1" - color-y: "ec3" - color-p: "fe5" - color-n: "ddd" + color-y: "fff" + color-yb: "f6f6f6" + color-p: "f9f9f9" + color-pb: "d8d8d8" + color-n: "e1e0e0" + color-nb: "bcbcbc" rows: - name: ParDo values: @@ -202,10 +204,12 @@ capability-matrix-snapshot: - description: Where in event time? anchor: where - color-b: "37d" - color-y: "59f" - color-p: "8cf" - color-n: "ddd" + color-y: "fff" + color-yb: "f6f6f6" + color-p: "f9f9f9" + color-pb: "d8d8d8" + color-n: "e1e0e0" + color-nb: "bcbcbc" rows: - name: Global windows values: @@ -342,10 +346,12 @@ capability-matrix-snapshot: - description: When in processing time? anchor: when - color-b: "6a4" - color-y: "8c6" - color-p: "ae8" - color-n: "ddd" + color-y: "fff" + color-yb: "f6f6f6" + color-p: "f9f9f9" + color-pb: "d8d8d8" + color-n: "e1e0e0" + color-nb: "bcbcbc" rows: - name: Configurable triggering values: @@ -503,10 +509,12 @@ capability-matrix-snapshot: - description: How do refinements relate? anchor: how - color-b: "b55" - color-y: "d77" - color-p: "faa" - color-n: "ddd" + color-y: "fff" + color-yb: "f6f6f6" + color-p: "f9f9f9" + color-pb: "d8d8d8" + color-n: "e1e0e0" + color-nb: "bcbcbc" rows: - name: Discarding values: diff --git a/website/www/site/data/en/pillars.yaml b/website/www/site/data/en/pillars.yaml index ad3c04484f5d..f6e0d2383b89 100644 --- a/website/www/site/data/en/pillars.yaml +++ b/website/www/site/data/en/pillars.yaml @@ -12,7 +12,7 @@ - title: Unified body: Use a single programming model for both batch and streaming use cases. - icon: icons/unified-icon.svg + icon: icons/unified-icon.svg - title: Extensible body: Write and share new SDKs, IO connectors, and transformation libraries. icon: icons/extensible-icon.svg diff --git a/website/www/site/data/en/powered-by.yaml b/website/www/site/data/en/powered-by.yaml new file mode 100644 index 000000000000..be4df14da1ec --- /dev/null +++ b/website/www/site/data/en/powered-by.yaml @@ -0,0 +1,20 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +- title: Commercial projects + body: Learn how these companies use Apache Beam to make their work easier. + icon: /icons/commercial-icon.svg + link: /powered-by/commercial +- title: Open source projects + body: Find other open source projects that use Apache Beam. + icon: /icons/open_source-icon.svg + link: /powered-by/open-source diff --git a/website/www/site/i18n/blog/en.yaml b/website/www/site/i18n/blog/en.yaml index 4bd552811c3f..98492abf9a2a 100644 --- a/website/www/site/i18n/blog/en.yaml +++ b/website/www/site/i18n/blog/en.yaml @@ -12,6 +12,9 @@ - id: blog-title translation: "Blog" - +- id: blog-subtitle + translation: "This is the blog for the Apache Beam project. This blog contains news and updates for the project." +- id: blog-readmore + translation: "Read more" - id: blog-loadmore translation: "Load more" diff --git a/website/www/site/i18n/capability/en.yaml b/website/www/site/i18n/capability/en.yaml new file mode 100644 index 000000000000..24d608145865 --- /dev/null +++ b/website/www/site/i18n/capability/en.yaml @@ -0,0 +1,16 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +- id: capability-back + translation: "back to collapsed details" +- id: capability-go-big + translation: "SEE DETAILS AND FULL VERSION HERE." diff --git a/website/www/site/i18n/feedback/en.yaml b/website/www/site/i18n/feedback/en.yaml new file mode 100644 index 000000000000..70b9dbfbc135 --- /dev/null +++ b/website/www/site/i18n/feedback/en.yaml @@ -0,0 +1,19 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +- id: feedback-title + translation: "Have you found everything you were looking for?" +- id: feedback-description + translation: "Was it all useful and clear? Is there anything that you would like to change? Let us know!" +- id: feedback-button + translation: "SEND FEEDBACK" + diff --git a/website/www/site/i18n/powered-by/en.yaml b/website/www/site/i18n/powered-by/en.yaml new file mode 100644 index 000000000000..8cd24f3a7f81 --- /dev/null +++ b/website/www/site/i18n/powered-by/en.yaml @@ -0,0 +1,16 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +- id: powered-read + translation: "READ MORE" +- id: powered-check + translation: "CHECK OUT" diff --git a/website/www/site/layouts/commercial/baseof.html b/website/www/site/layouts/commercial/baseof.html new file mode 100644 index 000000000000..05d15d4f133b --- /dev/null +++ b/website/www/site/layouts/commercial/baseof.html @@ -0,0 +1,35 @@ +{{/* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. See accompanying LICENSE file. +*/}} + + + + + {{ partial "head.html" . }} + + + {{ partial "header.html" . }} +
      +
      + + +
      +
      + {{ block "main" . }}{{ end }} +
      +
      + {{ partial "footer.html" . }} + + diff --git a/website/www/site/layouts/commercial/list.html b/website/www/site/layouts/commercial/list.html new file mode 100644 index 000000000000..a6e004286f1c --- /dev/null +++ b/website/www/site/layouts/commercial/list.html @@ -0,0 +1,111 @@ +{{/* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. See accompanying LICENSE file. +*/}} + +{{ define "main" }} +
      +

      Commercial Projects

      +

      Check out how the commercial projects are using Apache Beam.

      + {{ $pages := .Pages }} + {{ $.Scratch.Set "categories" (slice ) }} + {{ $.Scratch.Set "noCategories" 0 }} + + {{ range .Pages}} + {{ with .Params.categories }} + {{ if eq ( printf "%T" . ) "string" }} + {{ if ( not ( in ($.Scratch.Get "categories") . ) ) }} + {{ $.Scratch.Add "categories" . }} + {{ end }} + {{ else if eq ( printf "%T" . ) "[]string" }} + {{ range . }} + {{ if ( not ( in ($.Scratch.Get "categories") . ) ) }} + {{ $.Scratch.Add "categories" . }} + {{ end }} + {{ end }} + {{ end }} + {{ else }} + {{ $.Scratch.Add "noCategories" 1 }} + {{ end }} + {{ end }} + +
      + {{ range $.Scratch.Get "categories" }} + + {{ end }} + {{ if gt ( $.Scratch.Get "noCategories") 0 }} + + {{ end }} +
      + +
      +
      + +
      + +
      + + + +{{ end }} diff --git a/website/www/site/layouts/commercial/single.html b/website/www/site/layouts/commercial/single.html new file mode 100644 index 000000000000..622281e374ca --- /dev/null +++ b/website/www/site/layouts/commercial/single.html @@ -0,0 +1,30 @@ +{{/* +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. See accompanying LICENSE file. +*/}} + +{{ define "main" }} +
      +
      + +
      +

      {{ .Title }}

      +
      + +
      + {{ .Content }} +
      +
      +
      +{{ end }} diff --git a/website/www/site/layouts/community/baseof.html b/website/www/site/layouts/community/baseof.html index f6b0664dd3d4..e62571d5ecb9 100644 --- a/website/www/site/layouts/community/baseof.html +++ b/website/www/site/layouts/community/baseof.html @@ -33,6 +33,7 @@
      {{ .Content }} + {{ partial "feedback.html" . }}
      {{ partial "footer.html" . }} diff --git a/website/www/site/layouts/contribute/arrow_template.html b/website/www/site/layouts/contribute/arrow_template.html index 5cada00e4436..45b6431b8726 100644 --- a/website/www/site/layouts/contribute/arrow_template.html +++ b/website/www/site/layouts/contribute/arrow_template.html @@ -33,6 +33,7 @@
      {{ .Content }} + {{ partial "feedback.html" . }}
      {{ partial "footer.html" . }} diff --git a/website/www/site/layouts/contribute/baseof.html b/website/www/site/layouts/contribute/baseof.html index 141cdfba5b71..b07f0ea7331e 100644 --- a/website/www/site/layouts/contribute/baseof.html +++ b/website/www/site/layouts/contribute/baseof.html @@ -33,6 +33,7 @@
      {{ .Content }} + {{ partial "feedback.html" . }}
    {{ partial "footer.html" . }} diff --git a/website/www/site/layouts/documentation/baseof.html b/website/www/site/layouts/documentation/baseof.html index 12e7005afb9a..9568c5fde3db 100644 --- a/website/www/site/layouts/documentation/baseof.html +++ b/website/www/site/layouts/documentation/baseof.html @@ -33,6 +33,7 @@
    {{ .Content }} + {{ partial "feedback.html" . }}
    {{ partial "footer.html" . }} diff --git a/website/www/site/layouts/get-started/baseof.html b/website/www/site/layouts/get-started/baseof.html index 5640611272f1..99025b379285 100644 --- a/website/www/site/layouts/get-started/baseof.html +++ b/website/www/site/layouts/get-started/baseof.html @@ -33,6 +33,7 @@
    {{ .Content }} + {{ partial "feedback.html" . }}
    {{ partial "footer.html" . }} diff --git a/website/www/site/layouts/open-source/baseof.html b/website/www/site/layouts/open-source/baseof.html new file mode 100644 index 000000000000..05d15d4f133b --- /dev/null +++ b/website/www/site/layouts/open-source/baseof.html @@ -0,0 +1,35 @@ +{{/* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. See accompanying LICENSE file. +*/}} + + + + + {{ partial "head.html" . }} + + + {{ partial "header.html" . }} +
    +
    + + +
    +
    + {{ block "main" . }}{{ end }} +
    +
    + {{ partial "footer.html" . }} + + diff --git a/website/www/site/layouts/open-source/list.html b/website/www/site/layouts/open-source/list.html new file mode 100644 index 000000000000..53655658c125 --- /dev/null +++ b/website/www/site/layouts/open-source/list.html @@ -0,0 +1,111 @@ +{{/* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. See accompanying LICENSE file. +*/}} + +{{ define "main" }} +
    +

    Open Source Projects

    +

    Check out how the open source projects are using Apache Beam.

    + {{ $pages := .Pages }} + {{ $.Scratch.Set "categories" (slice ) }} + {{ $.Scratch.Set "noCategories" 0 }} + + {{ range .Pages}} + {{ with .Params.categories }} + {{ if eq ( printf "%T" . ) "string" }} + {{ if ( not ( in ($.Scratch.Get "categories") . ) ) }} + {{ $.Scratch.Add "categories" . }} + {{ end }} + {{ else if eq ( printf "%T" . ) "[]string" }} + {{ range . }} + {{ if ( not ( in ($.Scratch.Get "categories") . ) ) }} + {{ $.Scratch.Add "categories" . }} + {{ end }} + {{ end }} + {{ end }} + {{ else }} + {{ $.Scratch.Add "noCategories" 1 }} + {{ end }} + {{ end }} + +
    + {{ range $.Scratch.Get "categories" }} + + {{ end }} + {{ if gt ( $.Scratch.Get "noCategories") 0 }} + + {{ end }} +
    + +
    +
    + +
    + +
    + + + +{{ end }} diff --git a/website/www/site/layouts/open-source/single.html b/website/www/site/layouts/open-source/single.html new file mode 100644 index 000000000000..622281e374ca --- /dev/null +++ b/website/www/site/layouts/open-source/single.html @@ -0,0 +1,30 @@ +{{/* +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. See accompanying LICENSE file. +*/}} + +{{ define "main" }} +
    +
    + +
    +

    {{ .Title }}

    +
    + +
    + {{ .Content }} +
    +
    +
    +{{ end }} diff --git a/website/www/site/layouts/partials/cards/powered-by.html b/website/www/site/layouts/partials/cards/powered-by.html new file mode 100644 index 000000000000..e2c7f5ef693f --- /dev/null +++ b/website/www/site/layouts/partials/cards/powered-by.html @@ -0,0 +1,25 @@ +{{/* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. See accompanying LICENSE file. + */}} + diff --git a/website/www/site/layouts/partials/documentation/capability-matrix-row.html b/website/www/site/layouts/partials/documentation/capability-matrix-row.html new file mode 100644 index 000000000000..d502c9d4426c --- /dev/null +++ b/website/www/site/layouts/partials/documentation/capability-matrix-row.html @@ -0,0 +1,39 @@ +{{/* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. See accompanying LICENSE file. + */}} + +{{ if or (eq .type "blog") (eq .type "summary") }} +
    + + {{ if eq .val.l1 "Yes" }} + ✓ + {{ else if eq .val.l1 "Partially" }} + ~ + {{ else }} + ✕ + {{ end }} + +
    + {{ else if eq .type "full" }} + + {{ if and (ne .val.l2 "") (ne .val.l1 "") }} +

    {{ .val.l1 }} : {{ .val.l2 }}

    + {{ else }} +

    {{ .val.l1 }}

    + {{ end }} + {{ with .val.jira }} +
    + ({{ . }}) + {{ end }} +
    +
    + {{ .val.l3 }} + {{ end }} diff --git a/website/www/site/layouts/partials/feedback.html b/website/www/site/layouts/partials/feedback.html new file mode 100644 index 000000000000..cfc236032f58 --- /dev/null +++ b/website/www/site/layouts/partials/feedback.html @@ -0,0 +1,22 @@ +{{/* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. See accompanying LICENSE file. + */}} + + diff --git a/website/www/site/layouts/partials/head.html b/website/www/site/layouts/partials/head.html index 4e3c6032d717..8030193120b0 100644 --- a/website/www/site/layouts/partials/head.html +++ b/website/www/site/layouts/partials/head.html @@ -49,8 +49,8 @@ - + diff --git a/website/www/site/layouts/shortcodes/documentation/capability-matrix-single.html b/website/www/site/layouts/shortcodes/documentation/capability-matrix-single.html new file mode 100644 index 000000000000..604624a28816 --- /dev/null +++ b/website/www/site/layouts/shortcodes/documentation/capability-matrix-single.html @@ -0,0 +1,102 @@ +{{/* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. See accompanying LICENSE file. +*/}} +{{ $cap_view := .Get "cap-view" }} +{{ $cap_data := index $.Site.Data.capability_matrix (.Get "cap-data") }} +{{ if eq (.Get "cap-data") "capability-matrix-snapshot" }} + {{ $cap_data = index $.Site.Data.capability_matrix_snapshot (.Get "cap-data") }} +{{ end }} + + +
    +
    +
    How to read the tables
    + + + + + + + + + +
    Tools we are comparing
    Properties + Does this tool have this property?Yes/Partially/No +
    +
    +
    +
    What do those signs mean?
    +
    +
    +
    Yes
    +
    +
    +
    ~
    +
    Partially
    +
    +
    +
    +
    No
    +
    +
    +
    +{{ range $category := $cap_data.categories }} +

    {{ $category.description }}

    +
    +
    + + + + + {{ range $row := $category.rows }} + + + + {{ end }} +
    {{ $row.name }}
    +
    +
    +
    + + + {{ range $column := $cap_data.columns }} + + {{ end }} + +
    {{ $column.name }}
    +
    +
    + + {{ range $row := $category.rows }} + + {{ range $val := $row.values }} + + {{ end }} + + {{ end }} +
    + {{ partial "documentation/capability-matrix-row" (dict "type" $cap_view "val" $val) }} +
    +
    +
    +
    + {{ T "capability-go-big" }} +{{ end }} + + diff --git a/website/www/site/layouts/shortcodes/documentation/sdks.html b/website/www/site/layouts/shortcodes/documentation/sdks.html index 1ed294b2c7e5..57e7a35cb130 100644 --- a/website/www/site/layouts/shortcodes/documentation/sdks.html +++ b/website/www/site/layouts/shortcodes/documentation/sdks.html @@ -11,8 +11,11 @@ */}} {{ $data := index $.Site.Data .Site.Language.Lang }} -
    +
    {{ range $item := $data.documentation_sdks }} - {{ partial "documentation/icon-row" (dict "logo" .icon "header" .name "text" .description) }} - {{ end }} +
    + {{ .name.text | markdownify }} +

    {{ .text | safeHTML }}

    +
    + {{ end }}
    diff --git a/website/www/site/layouts/shortcodes/powered-by/powered-by-cards.html b/website/www/site/layouts/shortcodes/powered-by/powered-by-cards.html new file mode 100644 index 000000000000..fdfd841811ca --- /dev/null +++ b/website/www/site/layouts/shortcodes/powered-by/powered-by-cards.html @@ -0,0 +1,18 @@ +{{/* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. See accompanying LICENSE file. + */}} + + {{ $data := index $.Site.Data .Site.Language.Lang (.Get 0) }} +
    + {{ range $item := $data }} + {{ partial "cards/powered-by" (dict "title" .title "body" .body "icon" .icon "link" .link) }} + {{ end }} +
    diff --git a/website/www/site/static/js/fix-menu.js b/website/www/site/static/js/fix-menu.js index b74aa0c8fc65..eeb4298ae501 100644 --- a/website/www/site/static/js/fix-menu.js +++ b/website/www/site/static/js/fix-menu.js @@ -71,6 +71,5 @@ $(document).ready(function() { } } - FixMenu({"classNameMenu":"section-nav"}).init(); FixMenu({ "classNameMenu":"page-nav" }).init(); }); diff --git a/website/www/site/static/js/hero/hero-mobile.js b/website/www/site/static/js/hero/hero-mobile.js index eb6641988c65..212e984214ea 100644 --- a/website/www/site/static/js/hero/hero-mobile.js +++ b/website/www/site/static/js/hero/hero-mobile.js @@ -9,13 +9,31 @@ // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. -height = screen.height - 96; -width = screen.width; -var animationData = {"v":"5.7.1","fr":30,"ip":0,"op":120,"w":width,"h":height,"nm":"opt2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":24,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-5,"s":[62.997],"e":[20]},{"t":77}],"ix":10},"p":{"a":0,"k":[1649,406,0],"ix":2},"a":{"a":0,"k":[1228.201,-1.163,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[72.266,-33.656],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":82,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-5,"s":[-35],"e":[-20]},{"t":56}],"ix":10},"p":{"a":0,"k":[-1947,378,0],"ix":2},"a":{"a":0,"k":[-1078.126,-3.829,0],"ix":1},"s":{"a":0,"k":[154.688,135.77,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.341176470588,0.043137254902,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-5.792,59.506],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 7","sr":1,"ks":{"o":{"a":0,"k":66,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-5,"s":[-53],"e":[-34]},{"t":76}],"ix":10},"p":{"a":0,"k":[-1857,994,0],"ix":2},"a":{"a":0,"k":[-1078.126,-3.829,0],"ix":1},"s":{"a":0,"k":[154.688,135.77,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-5.792,59.506],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":24,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-6,"s":[-46],"e":[20]},{"t":67}],"ix":10},"p":{"a":0,"k":[1119,1224,0],"ix":2},"a":{"a":0,"k":[1171.735,-35.884,0],"ix":1},"s":{"a":0,"k":[100,78.683,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[72.266,-33.656],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":20,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[0.759]},"t":-5,"s":[2],"e":[-27]},{"t":56}],"ix":10},"p":{"a":0,"k":[-463,1308,0],"ix":2},"a":{"a":0,"k":[-1078.126,-3.829,0],"ix":1},"s":{"a":0,"k":[154.688,135.77,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-5.792,59.506],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape Layer 8","sr":1,"ks":{"o":{"a":0,"k":66,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-7,"s":[2],"e":[-43]},{"t":56}],"ix":10},"p":{"a":0,"k":[-505,1530,0],"ix":2},"a":{"a":0,"k":[-1078.126,-3.829,0],"ix":1},"s":{"a":0,"k":[154.688,81.692,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-152.112,163.925],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":9,"ty":1,"nm":"Orange Solid 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[207,448,0],"ix":2},"a":{"a":0,"k":[741.5,447,0],"ix":1},"s":{"a":0,"k":[152,152,100],"ix":6}},"ao":0,"sw":1483,"sh":894,"sc":"#ff570b","ip":0,"op":720,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":1,"nm":"Medium Orange Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[207,448,0],"ix":2},"a":{"a":0,"k":[741.5,447,0],"ix":1},"s":{"a":0,"k":[152,152,100],"ix":6}},"ao":0,"sw":1483,"sh":894,"sc":"#f87924","ip":0,"op":720,"st":0,"bm":0}],"markers":[]} -var animation = bodymovin.loadAnimation({ - container: document.getElementById("hero-mobile"), - renderer: "svg", - loop: false, - autoplay: true, - animationData: animationData, +var height = window.innerHeight- 96; +var width = window.innerWidth; +if(height<900 && height>200 && width<800 && width>200&& $("#hero-mobile svg").length===0){ + var animationData = {"v":"5.7.1","fr":30,"ip":0,"op":120,"w":width,"h":height,"nm":"opt2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":24,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-5,"s":[62.997],"e":[20]},{"t":77}],"ix":10},"p":{"a":0,"k":[1649,406,0],"ix":2},"a":{"a":0,"k":[1228.201,-1.163,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[72.266,-33.656],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":82,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-5,"s":[-35],"e":[-20]},{"t":56}],"ix":10},"p":{"a":0,"k":[-1947,378,0],"ix":2},"a":{"a":0,"k":[-1078.126,-3.829,0],"ix":1},"s":{"a":0,"k":[154.688,135.77,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.341176470588,0.043137254902,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-5.792,59.506],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 7","sr":1,"ks":{"o":{"a":0,"k":66,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-5,"s":[-53],"e":[-34]},{"t":76}],"ix":10},"p":{"a":0,"k":[-1857,994,0],"ix":2},"a":{"a":0,"k":[-1078.126,-3.829,0],"ix":1},"s":{"a":0,"k":[154.688,135.77,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-5.792,59.506],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":24,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-6,"s":[-46],"e":[20]},{"t":67}],"ix":10},"p":{"a":0,"k":[1119,1224,0],"ix":2},"a":{"a":0,"k":[1171.735,-35.884,0],"ix":1},"s":{"a":0,"k":[100,78.683,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[72.266,-33.656],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":20,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[0.759]},"t":-5,"s":[2],"e":[-27]},{"t":56}],"ix":10},"p":{"a":0,"k":[-463,1308,0],"ix":2},"a":{"a":0,"k":[-1078.126,-3.829,0],"ix":1},"s":{"a":0,"k":[154.688,135.77,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-5.792,59.506],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape Layer 8","sr":1,"ks":{"o":{"a":0,"k":66,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-7,"s":[2],"e":[-43]},{"t":56}],"ix":10},"p":{"a":0,"k":[-505,1530,0],"ix":2},"a":{"a":0,"k":[-1078.126,-3.829,0],"ix":1},"s":{"a":0,"k":[154.688,81.692,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-152.112,163.925],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":9,"ty":1,"nm":"Orange Solid 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[207,448,0],"ix":2},"a":{"a":0,"k":[741.5,447,0],"ix":1},"s":{"a":0,"k":[152,152,100],"ix":6}},"ao":0,"sw":1483,"sh":894,"sc":"#ff570b","ip":0,"op":720,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":1,"nm":"Medium Orange Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[207,448,0],"ix":2},"a":{"a":0,"k":[741.5,447,0],"ix":1},"s":{"a":0,"k":[152,152,100],"ix":6}},"ao":0,"sw":1483,"sh":894,"sc":"#f87924","ip":0,"op":720,"st":0,"bm":0}],"markers":[]} + var animation = bodymovin.loadAnimation({ + container: document.getElementById("hero-mobile"), + renderer: "svg", + loop: false, + autoplay: true, + animationData: animationData, + }); +} +$(window).resize(function(){ + height = window.innerHeight - 96; + width = window.innerWidth; + if(height<900 && height>200 && width<800 && width>200 && $("#hero-mobile svg").length===0){ + animationData = {"v":"5.7.1","fr":30,"ip":0,"op":120,"w":width,"h":height,"nm":"opt2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":24,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-5,"s":[62.997],"e":[20]},{"t":77}],"ix":10},"p":{"a":0,"k":[1649,406,0],"ix":2},"a":{"a":0,"k":[1228.201,-1.163,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[72.266,-33.656],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":82,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-5,"s":[-35],"e":[-20]},{"t":56}],"ix":10},"p":{"a":0,"k":[-1947,378,0],"ix":2},"a":{"a":0,"k":[-1078.126,-3.829,0],"ix":1},"s":{"a":0,"k":[154.688,135.77,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.341176470588,0.043137254902,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-5.792,59.506],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 7","sr":1,"ks":{"o":{"a":0,"k":66,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-5,"s":[-53],"e":[-34]},{"t":76}],"ix":10},"p":{"a":0,"k":[-1857,994,0],"ix":2},"a":{"a":0,"k":[-1078.126,-3.829,0],"ix":1},"s":{"a":0,"k":[154.688,135.77,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-5.792,59.506],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":24,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-6,"s":[-46],"e":[20]},{"t":67}],"ix":10},"p":{"a":0,"k":[1119,1224,0],"ix":2},"a":{"a":0,"k":[1171.735,-35.884,0],"ix":1},"s":{"a":0,"k":[100,78.683,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[72.266,-33.656],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":20,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[0.759]},"t":-5,"s":[2],"e":[-27]},{"t":56}],"ix":10},"p":{"a":0,"k":[-463,1308,0],"ix":2},"a":{"a":0,"k":[-1078.126,-3.829,0],"ix":1},"s":{"a":0,"k":[154.688,135.77,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-5.792,59.506],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape Layer 8","sr":1,"ks":{"o":{"a":0,"k":66,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.22],"y":[1]},"t":-7,"s":[2],"e":[-43]},{"t":56}],"ix":10},"p":{"a":0,"k":[-505,1530,0],"ix":2},"a":{"a":0,"k":[-1078.126,-3.829,0],"ix":1},"s":{"a":0,"k":[154.688,81.692,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[2315.531,506.688],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76862745098,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-152.112,163.925],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6,"op":714,"st":-6,"bm":0},{"ddd":0,"ind":9,"ty":1,"nm":"Orange Solid 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[207,448,0],"ix":2},"a":{"a":0,"k":[741.5,447,0],"ix":1},"s":{"a":0,"k":[152,152,100],"ix":6}},"ao":0,"sw":1483,"sh":894,"sc":"#ff570b","ip":0,"op":720,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":1,"nm":"Medium Orange Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[207,448,0],"ix":2},"a":{"a":0,"k":[741.5,447,0],"ix":1},"s":{"a":0,"k":[152,152,100],"ix":6}},"ao":0,"sw":1483,"sh":894,"sc":"#f87924","ip":0,"op":720,"st":0,"bm":0}],"markers":[]} + animation = bodymovin.loadAnimation({ + container: document.getElementById("hero-mobile"), + renderer: "svg", + loop: false, + autoplay: true, + animationData: animationData, + }); +} }); + + From 67508d0ce82ac1f793e03cfcc98bc9b9dc28ccff Mon Sep 17 00:00:00 2001 From: Brian Hulette Date: Fri, 5 Feb 2021 09:20:13 -0800 Subject: [PATCH 10/12] Remove website/www/site/content/en/documentation/runners/basics.md --- .../en/documentation/runners/basics.md | 193 ------------------ 1 file changed, 193 deletions(-) delete mode 100644 website/www/site/content/en/documentation/runners/basics.md diff --git a/website/www/site/content/en/documentation/runners/basics.md b/website/www/site/content/en/documentation/runners/basics.md deleted file mode 100644 index bccd2b989886..000000000000 --- a/website/www/site/content/en/documentation/runners/basics.md +++ /dev/null @@ -1,193 +0,0 @@ ---- -title: "Basics of the Beam model" ---- - - -# Basics of the Beam model - -Suppose you have a data processing engine that can pretty easily process graphs -of operations. You want to integrate it with the Beam ecosystem to get access -to other languages, great event time processing, and a library of connectors. -You need to know the core vocabulary: - - * [_Pipeline_](#pipeline) - A pipeline is a graph of transformations that a user constructs - that defines the data processing they want to do. - * [_PCollection_](#pcollections) - Data being processed in a pipeline is part of a PCollection. - * [_PTransforms_](#ptransforms) - The operations executed within a pipeline. These are best - thought of as operations on PCollections. - * _SDK_ - A language-specific library for pipeline authors (we often call them - "users" even though we have many kinds of users) to build transforms, - construct their pipelines and submit them to a runner - * _Runner_ - You are going to write a piece of software called a runner that - takes a Beam pipeline and executes it using the capabilities of your data - processing engine. - -These concepts may be very similar to your processing engine's concepts. Since -Beam's design is for cross-language operation and reusable libraries of -transforms, there are some special features worth highlighting. - -### Pipeline - -A pipeline in Beam is a graph of PTransforms operating on PCollections. A -pipeline is constructed by a user in their SDK of choice, and makes its way to -your runner either via the SDK directly or via the Runner API's (forthcoming) -RPC interfaces. - -### PTransforms - -In Beam, a PTransform can be one of the five primitives or it can be a -composite transform encapsulating a subgraph. The primitives are: - - * [_Read_](#implementing-the-read-primitive) - parallel connectors to external - systems - * [_ParDo_](#implementing-the-pardo-primitive) - per element processing - * [_GroupByKey_](#implementing-the-groupbykey-and-window-primitive) - - aggregating elements per key and window - * [_Flatten_](#implementing-the-flatten-primitive) - union of PCollections - * [_Window_](#implementing-the-window-primitive) - set the windowing strategy - for a PCollection - -When implementing a runner, these are the operations you need to implement. -Composite transforms may or may not be important to your runner. If you expose -a UI, maintaining some of the composite structure will make the pipeline easier -for a user to understand. But the result of processing is not changed. - -### PCollections - -A PCollection is an unordered bag of elements. Your runner will be responsible -for storing these elements. There are some major aspects of a PCollection to -note: - -#### Bounded vs Unbounded - -A PCollection may be bounded or unbounded. - - - _Bounded_ - it is finite and you know it, as in batch use cases - - _Unbounded_ - it may be never end, you don't know, as in streaming use cases - -These derive from the intuitions of batch and stream processing, but the two -are unified in Beam and bounded and unbounded PCollections can coexist in the -same pipeline. If your runner can only support bounded PCollections, you'll -need to reject pipelines that contain unbounded PCollections. If your -runner is only really targeting streams, there are adapters in our support code -to convert everything to APIs targeting unbounded data. - -#### Timestamps - -Every element in a PCollection has a timestamp associated with it. - -When you execute a primitive connector to some storage system, that connector -is responsible for providing initial timestamps. Your runner will need to -propagate and aggregate timestamps. If the timestamp is not important, as with -certain batch processing jobs where elements do not denote events, they will be -the minimum representable timestamp, often referred to colloquially as -"negative infinity". - -#### Watermarks - -Every PCollection has to have a watermark that estimates how complete the -PCollection is. - -The watermark is a guess that "we'll never see an element with an earlier -timestamp". Sources of data are responsible for producing a watermark. Your -runner needs to implement watermark propagation as PCollections are processed, -merged, and partitioned. - -The contents of a PCollection are complete when a watermark advances to -"infinity". In this manner, you may discover that an unbounded PCollection is -finite. - -#### Windowed elements - -Every element in a PCollection resides in a window. No element resides in -multiple windows (two elements can be equal except for their window, but they -are not the same). - -When elements are read from the outside world they arrive in the global window. -When they are written to the outside world, they are effectively placed back -into the global window (any writing transform that doesn't take this -perspective probably risks data loss). - -A window has a maximum timestamp, and when the watermark exceeds this plus -user-specified allowed lateness the window is expired. All data related -to an expired window may be discarded at any time. - -#### Coder - -Every PCollection has a coder, a specification of the binary format of the elements. - -In Beam, the user's pipeline may be written in a language other than the -language of the runner. There is no expectation that the runner can actually -deserialize user data. So the Beam model operates principally on encoded data - -"just bytes". Each PCollection has a declared encoding for its elements, called -a coder. A coder has a URN that identifies the encoding, and may have -additional sub-coders (for example, a coder for lists may contain a coder for -the elements of the list). Language-specific serialization techniques can, and -frequently are used, but there are a few key formats - such as key-value pairs -and timestamps - that are common so your runner can understand them. - -#### Windowing Strategy - -Every PCollection has a windowing strategy, a specification of essential -information for grouping and triggering operations. - -The details will be discussed below when we discuss the -[Window](#implementing-the-window-primitive) primitive, which sets up the -windowing strategy, and -[GroupByKey](#implementing-the-groupbykey-and-window-primitive) primitive, -which has behavior governed by the windowing strategy. - -### User-Defined Functions (UDFs) - -Beam has seven varieties of user-defined function (UDF). A Beam pipeline -may contain UDFs written in a language other than your runner, or even multiple -languages in the same pipeline (see the [Runner API](#the-runner-api)) so the -definitions are language-independent (see the [Fn API](#the-fn-api)). - -The UDFs of Beam are: - - * _DoFn_ - per-element processing function (used in ParDo) - * _WindowFn_ - places elements in windows and merges windows (used in Window - and GroupByKey) - * _Source_ - emits data read from external sources, including initial and - dynamic splitting for parallelism (used in Read) - * _ViewFn_ - adapts a materialized PCollection to a particular interface (used - in side inputs) - * _WindowMappingFn_ - maps one element's window to another, and specifies - bounds on how far in the past the result window will be (used in side - inputs) - * _CombineFn_ - associative and commutative aggregation (used in Combine and - state) - * _Coder_ - encodes user data; some coders have standard formats and are not really UDFs - -The various types of user-defined functions will be described further alongside -the primitives that use them. - -### Runner - -The term "runner" is used for a couple of things. It generally refers to the -software that takes a Beam pipeline and executes it somehow. Often, this is the -translation code that you write. It usually also includes some customized -operators for your data processing engine, and is sometimes used to refer to -the full stack. - -A runner has just a single method `run(Pipeline)`. From here on, I will often -use code font for proper nouns in our APIs, whether or not the identifiers -match across all SDKs. - -The `run(Pipeline)` method should be asynchronous and results in a -PipelineResult which generally will be a job descriptor for your data -processing engine, providing methods for checking its status, canceling it, and -waiting for it to terminate. From 10328bcfe9dfca122ec1000a8b0e0bcb0d95480d Mon Sep 17 00:00:00 2001 From: Brian Hulette Date: Tue, 16 Feb 2021 16:05:49 -0800 Subject: [PATCH 11/12] Fix committer trait links --- website/www/site/data/en/committer_traits.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/www/site/data/en/committer_traits.yaml b/website/www/site/data/en/committer_traits.yaml index e8f551d048de..b9c83621f3fd 100644 --- a/website/www/site/data/en/committer_traits.yaml +++ b/website/www/site/data/en/committer_traits.yaml @@ -10,12 +10,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -- body: { text: To learn more see the ASF documentation., link: https://www.apache.org/foundation/policies/conduct.html } +- body: { text: "Learn more.", link: /contribute/attributes#knows-upholds-and-reinforces-the-apache-software-foundation-code-of-conduct } bolded: Knows, upholds, and reinforces the Apache Software Foundation code of conduct. icon: icons/contributor/become a committer/messages-icon.svg -- body: { text: To learn more see the ASF documentation., link: https://infra.apache.org/committers.html#committer-responsibilities } +- body: { text: "Learn more.", link: /contribute/attributes#knows-upholds-and-reinforces-the-responsibilities-of-an-apache-software-foundation-committer } bolded: Knows, upholds, and reinforces the responsibilities of an Apache Software Foundation committer. icon: icons/contributor/become a committer/beam-logo-icon.svg -- body: { text: To learn more see our best practices!, link: https://beam.apache.org/contribute/attributes/ } +- body: { text: "Learn more.", link: /contribute/attributes/#knows-upholds-and-reinforces-the-beam-communitys-practices } bolded: Knows, upholds, and reinforces the Beam community’s practices. icon: icons/contributor/become a committer/diamond-icon.svg From 5a6620ddff91a4bf15d56eaedcbbac6f1d7c5f30 Mon Sep 17 00:00:00 2001 From: Brian Hulette Date: Mon, 22 Feb 2021 11:08:08 -0800 Subject: [PATCH 12/12] Revert 'become a committer' changes, remove 'attributes' page. --- .../site/content/en/contribute/attributes.md | 66 --------------- .../en/contribute/become-a-committer.md | 83 ++++++++++++++++--- .../partials/section-menu/en/contribute.html | 1 - 3 files changed, 72 insertions(+), 78 deletions(-) delete mode 100644 website/www/site/content/en/contribute/attributes.md diff --git a/website/www/site/content/en/contribute/attributes.md b/website/www/site/content/en/contribute/attributes.md deleted file mode 100644 index 27598eb58a9b..000000000000 --- a/website/www/site/content/en/contribute/attributes.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: "Attributes of a Beam community member" -layout: "arrow_template" ---- - - - -# Attributes of a Beam community member - -{{< figure src="/images/community/messages-icon.svg" >}} - -## Knows, upholds, and reinforces the Beam community’s practices - -- They have a proven commitment to the project -- They share their intentions with the community -- They accept and integrate community feedback in their plans, designs, code, etc. -- They earnestly try to make Beam better with their contributions - -In particular, if a code contributor: - -- They earnestly try to make Beam better with their own code -- They earnestly try to make Beam better with code review -- They accept and integrate feedback on their code -- They know, follow, and enforce Beam’s practices while reviewing/merging code - style, documentation, testing, backward compatibility, etc. - -{{< figure src="/images/community/beam-logo-icon.svg" >}} - -## Knows, upholds, and reinforces the Apache Software Foundation code of conduct - -In particular, we manifestly strive to: - -- Be open -- Be empathetic -- Be welcoming -- Be friendly -- Be patient -- Be collaborative -- Be inquisitive -- Be careful in the words that they choose - -[To learn more see the ASF documentation.](https://httpd.apache.org/docs/) - -{{< figure src="/images/community/diamond-icon.svg" >}} - -## Knows, upholds, and reinforces the responsibilities of an Apache Software Foundation committer - -- They help create a product that will outlive the interest of any particular volunteer (including themselves) -- They grow and maintain the health of the Apache community -- They help out with surrounding work, such as the website & documentation -- They help users -- They can be trusted to decide when code is ready for release, or when to ask someone else to make the judgment -- They can be trusted to decide when to merge code (if a code contributor) or when to ask someone else to make the judgment - -[To learn more see the ASF documentation.](https://httpd.apache.org/docs/) diff --git a/website/www/site/content/en/contribute/become-a-committer.md b/website/www/site/content/en/contribute/become-a-committer.md index 822ee62a56c4..5d86beb471e0 100644 --- a/website/www/site/content/en/contribute/become-a-committer.md +++ b/website/www/site/content/en/contribute/become-a-committer.md @@ -1,7 +1,6 @@ --- title: "Become A Committer" --- - -# Become a Beam Committer +# Become a Committer + +An Apache Beam +[committer](https://www.apache.org/foundation/how-it-works.html#committers) has +write access to the repository for merging pull requests, but you don't have +to be a code contributor to become a committer. Becoming a committer means that +you have the project's trust. Read the [ASF +documentation](https://www.apache.org/dev/committers.html#committer-responsibilities) +for more about being a committer in the Apache Software Foundation. + +The [PMC](https://www.apache.org/foundation/how-it-works.html#pmc-members) +makes someone a committer via nomination, discussion, and then majority vote. +We use data from as many sources as possible to inform our reasoning. Here are +some examples: + + - [dev@ archives](https://lists.apache.org/list.html?dev@beam.apache.org) and [statistics](https://lists.apache.org/trends.html?dev@beam.apache.org) + - [user@ archives](https://lists.apache.org/list.html?user@beam.apache.org) and [statistics](https://lists.apache.org/trends.html?user@beam.apache.org) + - [`apache-beam` StackOverflow tag](https://stackoverflow.com/questions/tagged/apache-beam) + - Git metrics for [Beam](https://github.com/apache/beam/graphs/contributors) + - Code reviews given and received on + [Beam](https://github.com/apache/beam/pulls) + - Clear areas of ownership (a runner, a DSL, IO connector, documentation, + etc.) + - Public events + - Firsthand PMC testimonials + +The PMC has assembled the following set of guidelines for becoming a committer. + +## An Apache Beam committer... + +### Takes many forms + +There are many actions other than coding that build the trust we place in a +committer - code review, design discussion, user support, community outreach, improving +infrastructure, documentation, project management, etc. + +### Knows, upholds, and reinforces the Apache Software Foundation code of conduct -An Apache Beam [committer](https://www.apache.org/foundation/how-it-works.html#committers) takes many forms. There are many actions other than coding that build the trust we place in a committer - code review, design discussion, user support, community outreach, improving infrastructure, documentation, project management, etc. +See the [ASF +documentation](https://www.apache.org/foundation/policies/conduct.html). In +particular, they manifestly strive to: -### What does it mean being a commiter? + - Be open + - Be empathetic + - Be welcoming + - Be friendly + - Be patient + - Be collaborative + - Be inquisitive + - Be careful in the words that they choose -An Apache Beam committer has write access to the repository for merging pull requests, but you don’t have to be a code contributor to become a committer. Becoming a committer means that you have the project’s trust. Read the [ASF documentation](https://www.apache.org/dev/committers.html#committer-responsibilities) for more about being a committer in the Apache Software Foundation. +### Knows, upholds, and reinforces the responsibilities of an Apache Software Foundation committer -The [PMC](https://www.apache.org/foundation/how-it-works.html#pmc-members) makes someone a committer via nomination, discussion, and then majority vote. We use data from as many sources as possible to inform our reasoning. +See the [ASF documentation](https://www.apache.org/dev/committers.html#committer-responsibilities). -### Different Ways you can contribute -Everyone is welcome to join and contribute to the project in many ways, not only with code contributions. Things like asking questions, reporting bugs, proposing new features, improving documentation or the website, organizing events or writing blog posts, are also welcome and recognized. + - They help create a product that will outlive the interest of any particular + volunteer (including themselves) + - They grow and maintain the health of the Apache community + - They help out with surrounding work, such as the website & documentation + - They help users + - They can be trusted to decide when code is ready for release, or when to ask + someone else to make the judgment + - They can be trusted to decide when to merge code (if a code contributor) or + when to ask someone else to make the judgment -{{< contributor/list_with_icons ways_of_contribution >}} +### Knows, upholds, and reinforces the Beam community’s practices -### What are the traits of an Apache Beam Committer? + - They have a proven commitment to the project + - They share their intentions with the community + - They accept and integrate community feedback in their plans, designs, + code, etc. + - They earnestly try to make Beam better with their contributions + - In particular, if a code contributor: + - They earnestly try to make Beam better with their own code + - They earnestly try to make Beam better with code review + - They accept and integrate feedback on their code + - They know, follow, and enforce Beam’s practices while + reviewing/merging code - style, documentation, testing, backward + compatibility, etc. -{{< contributor/row_of_traits committer_traits >}} diff --git a/website/www/site/layouts/partials/section-menu/en/contribute.html b/website/www/site/layouts/partials/section-menu/en/contribute.html index d276460e8e5b..8cae5b106464 100644 --- a/website/www/site/layouts/partials/section-menu/en/contribute.html +++ b/website/www/site/layouts/partials/section-menu/en/contribute.html @@ -13,7 +13,6 @@
  • Contribute
  • Get started contributing
  • Get Help
  • -
  • Attributes of a Beam community member
  • Technical Docs