barbican-reset 2.38.0 → 2.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/components/account_title.vue +1 -1
  2. package/components/br_alert.vue +5 -4
  3. package/components/br_button.vue +24 -22
  4. package/components/br_card.vue +102 -0
  5. package/components/br_card_sub_title.vue +12 -0
  6. package/components/br_card_text.vue +3 -0
  7. package/components/br_card_title.vue +3 -0
  8. package/components/br_confirm_done.vue +13 -9
  9. package/components/br_confirm_email.vue +18 -10
  10. package/components/br_container.vue +3 -3
  11. package/components/br_form_row.vue +37 -35
  12. package/components/br_loader.vue +8 -4
  13. package/components/event_summary.vue +1 -1
  14. package/components/fluid_iframe.vue +1 -1
  15. package/components/video_content.vue +1 -1
  16. package/index.js +8 -2
  17. package/package.json +1 -6
  18. package/scss/_atomic.scss +2 -2
  19. package/scss/_br-loader.scss +3 -3
  20. package/scss/_card-deck.scss +1 -1
  21. package/scss/_close-icon.scss +2 -2
  22. package/scss/_footer.scss +1 -1
  23. package/scss/_input.scss +1 -1
  24. package/scss/_klaro.scss +12 -12
  25. package/scss/_main.scss +1 -1
  26. package/scss/card/_membership.scss +1 -1
  27. package/scss/card/_related.scss +2 -2
  28. package/scss/helpers/mixins/_br-alert.scss +1 -1
  29. package/scss/helpers/mixins/_br-card.scss +1 -1
  30. package/scss/helpers/mixins/_br-skiplink.scss +2 -2
  31. package/scss/helpers/mixins/_breakpoints.scss +3 -3
  32. package/scss/helpers/mixins/_content.scss +2 -2
  33. package/scss/helpers/mixins/_festival.scss +2 -2
  34. package/scss/helpers/mixins/_focus.scss +6 -6
  35. package/scss/helpers/mixins/_font.scss +1 -1
  36. package/scss/helpers/mixins/_loading.scss +2 -2
  37. package/scss/helpers/mixins/_table.scss +1 -1
  38. package/scss/helpers/mixins/buttons/_setup.scss +1 -1
  39. package/scss/helpers/mixins/input/_generic.scss +2 -2
  40. package/scss/helpers/mixins/input/_select.scss +1 -1
  41. package/scss/helpers/mixins/input/_text.scss +1 -1
  42. package/scss/helpers/mixins/table/_details.scss +1 -1
  43. package/scss/helpers/mixins/table/_etickets.scss +1 -1
  44. package/scss/helpers/mixins/table/_gifts.scss +1 -1
  45. package/scss/helpers/mixins/table/_orders.scss +1 -1
  46. package/scss/helpers/mixins/table/_preferences.scss +2 -2
  47. package/scss/helpers/mixins/table/_tickets.scss +1 -1
  48. package/scss/helpers/variables/_layout.scss +1 -1
  49. package/scss/helpers/variables/index.scss +16 -1
  50. package/scss/index.scss +1 -1
  51. package/components/card_display.vue +0 -123
  52. package/components/help_row.vue +0 -33
  53. package/components/payment_logo.vue +0 -37
  54. package/components/placeholder.vue +0 -45
  55. package/components/related_card.vue +0 -39
  56. package/components/related_row.vue +0 -34
  57. package/components/related_title.vue +0 -93
  58. package/components/type_text.vue +0 -56
@@ -26,7 +26,7 @@ export default {
26
26
  @mixin title {
27
27
  margin-bottom: 1.25rem;
28
28
 
29
- @include media-breakpoint-up(md) {
29
+ @include medium-up {
30
30
  font-size: $h1-font-size;
31
31
  }
32
32
  }
@@ -5,25 +5,26 @@
5
5
  <div class="title" v-if="title.length > 0 && !toggle">{{ title }}</div>
6
6
  <slot />
7
7
  </span>
8
- <b-button
8
+ <br-button
9
9
  v-if="toggle"
10
10
  variant="exit"
11
11
  :class="getStatus"
12
12
  @click="$emit('close')"
13
13
  >
14
14
  <close-icon :status="getStatus" />
15
- </b-button>
15
+ </br-button>
16
16
  </div>
17
17
  </div>
18
18
  </template>
19
19
 
20
20
  <script>
21
- import { BButton } from "bootstrap-vue";
22
21
  import { CloseIcon } from "barbican-reset/icons/stream";
22
+ import BrButton from "./br_button";
23
+
23
24
  export default {
24
25
  name: "BrAlert",
25
26
  components: {
26
- BButton,
27
+ BrButton,
27
28
  CloseIcon,
28
29
  },
29
30
  computed: {
@@ -1,9 +1,13 @@
1
1
  <template>
2
-
3
2
  <!-- https://dockyard.com/blog/2020/03/02/accessible-loading-indicatorswith-no-extra-elements -->
4
3
 
5
- <b-button @click="$emit('click')" :variant="variant" :type="type" aria-live="polite" :aria-busy="loading">
6
-
4
+ <button
5
+ @click="$emit('click')"
6
+ :aria-busy="loading"
7
+ aria-live="polite"
8
+ :variant="variant"
9
+ :type="type"
10
+ >
7
11
  <remove-ticket v-if="variant === 'remove-ticket'" :state="state">
8
12
  <template v-for="(index, name) in $slots" v-slot:[name]>
9
13
  <slot :name="name" />
@@ -11,7 +15,6 @@
11
15
  </remove-ticket>
12
16
 
13
17
  <template v-else>
14
-
15
18
  <template v-if="state === 'default'">
16
19
  <template v-if="$slots.default">
17
20
  <slot name="default" />
@@ -45,45 +48,44 @@
45
48
  {{ titleCase(state) }}
46
49
  </template>
47
50
  </template>
48
-
49
51
  </template>
50
-
51
- </b-button>
52
+ </button>
52
53
  </template>
53
54
 
54
55
  <script>
55
- import { BButton } from 'bootstrap-vue'
56
- import { RemoveTicket, DotTyping } from './br_button/components'
56
+ import { RemoveTicket, DotTyping } from "./br_button/components";
57
57
 
58
58
  export default {
59
- name: "BrButton",
60
59
  props: {
61
60
  state: {
62
61
  type: String,
63
- default: "default"
62
+ default: "default",
64
63
  },
65
64
  variant: {
66
- type: String
65
+ type: String,
67
66
  },
68
67
  type: {
69
68
  type: String,
70
- default: "button"
71
- }
69
+ default: "button",
70
+ },
72
71
  },
73
72
  methods: {
74
73
  titleCase(str) {
75
- return str.toLowerCase().split(' ').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' ');
76
- }
74
+ return str
75
+ .toLowerCase()
76
+ .split(" ")
77
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
78
+ .join(" ");
79
+ },
77
80
  },
78
81
  computed: {
79
82
  loading() {
80
83
  return this.state === "loading" ? "true" : "false";
81
- }
84
+ },
82
85
  },
83
86
  components: {
84
- BButton,
85
87
  RemoveTicket,
86
- DotTyping
87
- }
88
- }
89
- </script>
88
+ DotTyping,
89
+ },
90
+ };
91
+ </script>
@@ -0,0 +1,102 @@
1
+ <template>
2
+ <div class="card">
3
+ <div v-if="$slots.header" class="card-header">
4
+ <slot name="header"></slot>
5
+ </div>
6
+ <div v-if="$slots.default" class="card-body"><slot></slot></div>
7
+ </div>
8
+ </template>
9
+
10
+ <style lang="scss" scoped>
11
+ .card {
12
+ border: 1px solid hsl(0deg, 0%, 85%);
13
+ background-color: white;
14
+ background-clip: border-box;
15
+ border-radius: 0.375rem;
16
+ flex-direction: column;
17
+ word-wrap: break-word;
18
+ position: relative;
19
+ display: flex;
20
+ min-width: 0;
21
+ }
22
+
23
+ .card[login] .card-header {
24
+ border-bottom: 1px solid hsl(0deg, 0%, 85%);
25
+ padding: 1.5rem 1.75rem 1.25rem;
26
+ justify-content: space-between;
27
+ background-color: transparent;
28
+ align-items: center;
29
+ display: flex;
30
+ }
31
+
32
+ .card[login] .card-body {
33
+ color: rgb(51, 51, 51);
34
+ padding: 1.75rem;
35
+ flex: 1 1 auto;
36
+ }
37
+
38
+ .card[confirm] {
39
+ margin-right: auto;
40
+ text-align: center;
41
+ margin-left: auto;
42
+ max-width: 20rem;
43
+ }
44
+
45
+ .card[confirm] .card-body {
46
+ padding: 1.75rem;
47
+ }
48
+
49
+ .card[block] {
50
+ box-shadow: 0 0 0.5rem rgba(0, 0, 0, 0.1);
51
+ border: none;
52
+ }
53
+
54
+ .card[slim] .card-body {
55
+ padding: 1.25rem;
56
+ }
57
+
58
+ .card[membership] {
59
+ box-shadow: 0 0 0.375rem rgba(89, 89, 89, 0.5);
60
+ background: hsl(0deg, 0%, 20%);
61
+ width: calc(100% - 1rem);
62
+ display: inline-block;
63
+ margin: 0.5rem;
64
+ color: #fff;
65
+ border: none;
66
+ }
67
+
68
+ .card[membership] > .card-body {
69
+ align-items: flex-start;
70
+ row-gap: 0.75rem;
71
+ display: grid;
72
+ }
73
+
74
+ @media only screen and (min-width: 520px) {
75
+ .card[membership] {
76
+ width: 23rem;
77
+ }
78
+
79
+ .card[membership] > .card-body {
80
+ row-gap: 2rem;
81
+ }
82
+ }
83
+
84
+ .card[password] .card-header {
85
+ border-bottom: 1px solid hsl(0deg, 0%, 85%);
86
+ padding: 1.5rem 1.75rem 1.25rem;
87
+ background-color: transparent;
88
+ }
89
+
90
+ .card[password] .card-body {
91
+ padding: 1.75rem;
92
+ }
93
+
94
+ .card[account] {
95
+ margin-top: 2rem;
96
+ margin-bottom: 0;
97
+ }
98
+
99
+ .card[account] > .card-body {
100
+ padding: 2rem;
101
+ }
102
+ </style>
@@ -0,0 +1,12 @@
1
+ <template>
2
+ <h6 class="card-subtitle"><slot></slot></h6>
3
+ </template>
4
+
5
+ <style lang="scss" scoped>
6
+ .card-subtitle {
7
+ color: hsl(0deg, 0%, 35%);
8
+ font-size: 0.875rem;
9
+ font-weight: 400;
10
+ margin: 0;
11
+ }
12
+ </style>
@@ -0,0 +1,3 @@
1
+ <template>
2
+ <p class="card-text"><slot></slot></p>
3
+ </template>
@@ -0,0 +1,3 @@
1
+ <template>
2
+ <h4 class="card-title"><slot></slot></h4>
3
+ </template>
@@ -1,22 +1,26 @@
1
1
  <template>
2
- <b-card confirm done>
2
+ <br-card confirm done>
3
3
  <done-icon />
4
- <b-card-title>Done</b-card-title>
5
- <b-card-text v-if="$slots.default">
4
+ <br-card-title>Done</br-card-title>
5
+ <br-card-text v-if="$slots.default">
6
6
  <slot />
7
- </b-card-text>
8
- </b-card>
7
+ </br-card-text>
8
+ </br-card>
9
9
  </template>
10
10
 
11
11
  <script>
12
- import Animations from 'barbican-reset/animations'
13
- import { DoneIcon } from 'barbican-reset/icons/confirm'
12
+ import BrCard from "./br_card";
13
+ import BrCardTitle from "./br_card_title";
14
+ import BrCardText from "./br_card_text";
15
+
16
+ import Animations from "barbican-reset/animations";
17
+ import { DoneIcon } from "barbican-reset/icons/confirm";
14
18
 
15
19
  export default {
16
20
  mixins: [Animations],
17
- components: { DoneIcon },
21
+ components: { BrCard, BrCardTitle, BrCardText, DoneIcon },
18
22
  mounted() {
19
23
  this.animateDone();
20
24
  },
21
25
  };
22
- </script>
26
+ </script>
@@ -1,25 +1,33 @@
1
1
  <template>
2
- <b-card confirm email>
2
+ <br-card confirm email>
3
3
  <email-icon />
4
- <b-card-title v-if="$slots.title">
4
+ <br-card-title v-if="$slots.title">
5
5
  <slot name="title" />
6
- </b-card-title>
7
- <b-card-text v-if="$slots.default">
6
+ </br-card-title>
7
+ <br-card-text v-if="$slots.default">
8
8
  <slot />
9
- </b-card-text>
10
- </b-card>
9
+ </br-card-text>
10
+ </br-card>
11
11
  </template>
12
12
 
13
13
  <script>
14
- import Animations from 'barbican-reset/animations'
15
- import { EmailIcon } from 'barbican-reset/icons/confirm'
14
+ import BrCard from "./br_card";
15
+ import BrCardTitle from "./br_card_title";
16
+ import BrCardText from "./br_card_text";
17
+
18
+ import Animations from "barbican-reset/animations";
19
+ import { EmailIcon } from "barbican-reset/icons/confirm";
20
+
16
21
  export default {
17
22
  mixins: [Animations],
18
23
  components: {
19
- EmailIcon
24
+ BrCard,
25
+ BrCardTitle,
26
+ BrCardText,
27
+ EmailIcon,
20
28
  },
21
29
  mounted() {
22
30
  this.animateEmail();
23
31
  },
24
32
  };
25
- </script>
33
+ </script>
@@ -65,7 +65,7 @@ export default {
65
65
 
66
66
  &.masthead {
67
67
  box-shadow: 0 0.375rem 0.375rem rgba($black, 0.1);
68
- background-color: $white;
68
+ background-color: $br-white;
69
69
  }
70
70
  }
71
71
 
@@ -77,7 +77,7 @@ export default {
77
77
  padding-bottom: 1.5rem;
78
78
  padding-top: 1.5rem;
79
79
 
80
- @include media-breakpoint-up(sm) {
80
+ @include small-up {
81
81
  padding-bottom: 2.5rem;
82
82
  padding-top: 2.5rem;
83
83
  }
@@ -93,7 +93,7 @@ export default {
93
93
  }
94
94
 
95
95
  &.masthead {
96
- @include media-breakpoint-up(sm) {
96
+ @include small-up {
97
97
  padding-bottom: 3rem;
98
98
  padding-top: 3rem;
99
99
  }
@@ -1,9 +1,11 @@
1
1
  <template>
2
2
  <div class="br-form-row">
3
3
  <label v-if="label" :for="id">
4
- <strong>{{ label }}</strong> <span v-if="label && required">(required)</span><span v-if="label && optional">(optional)</span>
4
+ <strong>{{ label }}</strong>
5
+ <span v-if="label && required">(required)</span
6
+ ><span v-if="label && optional">(optional)</span>
5
7
  </label>
6
- <div :class="[`content`,{ editable },{ label },{ submit },{ radios }]">
8
+ <div :class="[`content`, { editable }, { label }, { submit }, { radios }]">
7
9
  <b-button v-if="editable" variant="input-edit" @click="$emit('edit')">
8
10
  <edit-icon />
9
11
  </b-button>
@@ -13,38 +15,38 @@
13
15
  </template>
14
16
 
15
17
  <script type="text/javascript">
16
- import { BButton } from 'bootstrap-vue'
17
- import { EditIcon } from '../icons/account'
18
- export default {
19
- name: 'BrFormRow',
20
- components: {
21
- BButton,
22
- EditIcon
18
+ import BrButton from "./br_button";
19
+ import { EditIcon } from "../icons/account";
20
+
21
+ export default {
22
+ components: {
23
+ BrButton,
24
+ EditIcon,
25
+ },
26
+ props: {
27
+ label: {
28
+ type: String,
29
+ },
30
+ required: {
31
+ type: Boolean,
32
+ },
33
+ optional: {
34
+ type: Boolean,
35
+ },
36
+ submit: {
37
+ type: Boolean,
38
+ },
39
+ editable: {
40
+ type: Boolean,
41
+ },
42
+ radios: {
43
+ type: Boolean,
23
44
  },
24
- props: {
25
- label: {
26
- type: String
27
- },
28
- required: {
29
- type: Boolean
30
- },
31
- optional: {
32
- type: Boolean
33
- },
34
- submit: {
35
- type: Boolean
36
- },
37
- editable: {
38
- type: Boolean
39
- },
40
- radios: {
41
- type: Boolean
42
- }
45
+ },
46
+ computed: {
47
+ id() {
48
+ return this.label.toLowerCase().split(" ").join("_");
43
49
  },
44
- computed: {
45
- id() {
46
- return this.label.toLowerCase().split(" ").join("_");
47
- }
48
- }
49
- }
50
- </script>
50
+ },
51
+ };
52
+ </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <b-card class="br-loader" no-body>
2
+ <br-card class="br-loader" no-body>
3
3
  <div class="wrap br-loader">
4
4
  <div class="icon br-loader"></div>
5
5
  <div class="icon br-loader"></div>
@@ -8,11 +8,15 @@
8
8
  <div class="icon br-loader"></div>
9
9
  <div class="icon br-loader"></div>
10
10
  </div>
11
- </b-card>
11
+ </br-card>
12
12
  </template>
13
13
 
14
14
  <script>
15
+ import BrCard from "./br_card";
16
+
15
17
  export default {
16
- name: "BrLoader",
18
+ components: {
19
+ BrCard,
20
+ },
17
21
  };
18
- </script>
22
+ </script>
@@ -63,7 +63,7 @@ export default {
63
63
  color: $c-grey-l44;
64
64
  font-weight: 400;
65
65
 
66
- @include media-breakpoint-up(md) {
66
+ @include medium-up {
67
67
  font-size: $h4-font-size;
68
68
  }
69
69
  }
@@ -27,7 +27,7 @@ export default {
27
27
  @import "../scss/helpers";
28
28
 
29
29
  .component {
30
- border-radius: $border-radius-lg;
30
+ border-radius: $br-border-radius-lg;
31
31
  padding-top: 56.25%;
32
32
  position: relative;
33
33
  overflow: hidden;
@@ -73,7 +73,7 @@ export default {
73
73
  <style lang="scss" module>
74
74
 
75
75
  .brightcove {
76
- border-radius: $border-radius-lg;
76
+ border-radius: $br-border-radius-lg;
77
77
  margin-bottom: 2rem;
78
78
  overflow: hidden;
79
79
  }
package/index.js CHANGED
@@ -1,6 +1,10 @@
1
1
  import BrAlert from "./components/br_alert";
2
2
  import BrAnchor from "./components/br_anchor";
3
3
  import BrButton from "./components/br_button";
4
+ import BrCard from "./components/br_card";
5
+ import BrCardText from "./components/br_card_text";
6
+ import BrCardTitle from "./components/br_card_title";
7
+ import BrCardSubTitle from "./components/br_card_sub_title";
4
8
  import BrConfirmDone from "./components/br_confirm_done";
5
9
  import BrConfirmEmail from "./components/br_confirm_email";
6
10
  import BrContainer from "./components/br_container";
@@ -15,7 +19,6 @@ import BrSkiplink from "./components/br_skiplink";
15
19
  import BrWrap from "./components/br_wrap";
16
20
 
17
21
  import AccountTitle from "./components/account_title";
18
- import CardDisplay from "./components/card_display";
19
22
  import EventSummary from "./components/event_summary";
20
23
  import FluidIframe from "./components/fluid_iframe";
21
24
  import HelpRow from "./components/help_row";
@@ -32,6 +35,10 @@ export {
32
35
  BrAlert,
33
36
  BrAnchor,
34
37
  BrButton,
38
+ BrCard,
39
+ BrCardSubTitle,
40
+ BrCardText,
41
+ BrCardTitle,
35
42
  BrConfirmDone,
36
43
  BrConfirmEmail,
37
44
  BrContainer,
@@ -45,7 +52,6 @@ export {
45
52
  BrSkiplink,
46
53
  BrWrap,
47
54
  AccountTitle,
48
- CardDisplay,
49
55
  EventSummary,
50
56
  FluidIframe,
51
57
  HelpRow,
package/package.json CHANGED
@@ -52,7 +52,6 @@
52
52
  "name": "Paul Heading"
53
53
  },
54
54
  "dependencies": {
55
- "bootstrap-vue": "^2.21.2",
56
55
  "express": "^4.19.2",
57
56
  "focus-visible": "^5.2.0",
58
57
  "gsap": "^3.7.1",
@@ -73,9 +72,6 @@
73
72
  "sassdoc": "^2.7.4",
74
73
  "serve-favicon": "^2.5.0"
75
74
  },
76
- "devDependencies": {
77
- "bootstrap": "^5.1.3"
78
- },
79
75
  "description": "A collection of useful scss imports and js scripts, that provide consistent styling and functionality across barbican projects.",
80
76
  "files": [
81
77
  "animations/**/*",
@@ -96,7 +92,6 @@
96
92
  "type": "git",
97
93
  "url": "git+https://bitbucket.org/barbicandev/barbican-reset.git"
98
94
  },
99
- "sass": "scss/index.scss",
100
95
  "scripts": {
101
96
  "serve:patterns": "cd patterns && node index",
102
97
  "watch:patterns": "cd patterns && gulp watch",
@@ -104,5 +99,5 @@
104
99
  "build:patterns": "cd patterns && rm -rf html && pug views --out html"
105
100
  },
106
101
  "style": "dist/css/barbican-reset.css",
107
- "version": "2.38.0"
102
+ "version": "2.40.0"
108
103
  }
package/scss/_atomic.scss CHANGED
@@ -63,7 +63,7 @@ $paddings05: 'padding-top', 'padding-bottom', 'padding-right', 'padding-left';
63
63
  }
64
64
 
65
65
  .border-radius-lg {
66
- border-radius: $border-radius-lg;
66
+ border-radius: $br-border-radius-lg;
67
67
  }
68
68
 
69
69
  .color-orange {
@@ -71,7 +71,7 @@ $paddings05: 'padding-top', 'padding-bottom', 'padding-right', 'padding-left';
71
71
  }
72
72
 
73
73
  .font-size-lg {
74
- font-size: $font-size-lg;
74
+ font-size: $br-font-size-lg;
75
75
  }
76
76
 
77
77
  .font-size-h3 {
@@ -30,13 +30,13 @@ $animation-setup: 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
30
30
 
31
31
  &:before {
32
32
  @include loading-icon;
33
- background-color: $gray-500;
33
+ background-color: $br-gray-500;
34
34
  animation: animation-before $animation-setup;
35
35
  }
36
36
 
37
37
  &:after {
38
38
  @include loading-icon;
39
- background-color: $gray-400;
39
+ background-color: $br-gray-400;
40
40
  animation: animation-after $animation-setup;
41
41
  }
42
42
 
@@ -85,7 +85,7 @@ $animation-setup: 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
85
85
  }
86
86
 
87
87
  25% {
88
- background-color: $gray-300;
88
+ background-color: $br-gray-300;
89
89
  transform: scale(0.75);
90
90
  z-index: 1;
91
91
  }
@@ -18,7 +18,7 @@
18
18
  }
19
19
 
20
20
  .card-img {
21
- border-radius: $border-radius-lg;
21
+ border-radius: $br-border-radius-lg;
22
22
  margin-top: 1rem;
23
23
  }
24
24
  }
@@ -23,12 +23,12 @@
23
23
 
24
24
  &.focus-visible {
25
25
  @include single-box($c-grey-l21);
26
- background-color: $white;
26
+ background-color: $br-white;
27
27
  border-radius: 50%;
28
28
 
29
29
  .outline,
30
30
  .cross {
31
- fill: $white;
31
+ fill: $br-white;
32
32
  }
33
33
 
34
34
  .fill {
package/scss/_footer.scss CHANGED
@@ -1,5 +1,5 @@
1
1
  footer {
2
- color: $white;
2
+ color: $br-white;
3
3
 
4
4
  &:not(.splash) {
5
5
  background-color: $c-grey-l11;
package/scss/_input.scss CHANGED
@@ -16,7 +16,7 @@ input[type='radio'] {
16
16
 
17
17
  input[type='button'],
18
18
  input[type='submit'] {
19
- border-radius: $border-radius-lg;
19
+ border-radius: $br-border-radius-lg;
20
20
  appearance: none;
21
21
  }
22
22