barbican-reset 3.13.0 → 3.16.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 (185) hide show
  1. package/components/AccountTitle.vue +5 -5
  2. package/components/BrCardSubTitle.vue +2 -2
  3. package/components/BrFormBlock.vue +6 -5
  4. package/components/BrFormCheckbox.vue +15 -0
  5. package/components/BrFormCheckboxGroup.vue +33 -0
  6. package/components/BrFormDate.vue +11 -0
  7. package/components/BrFormEdit.vue +38 -0
  8. package/components/BrFormEmail.vue +7 -0
  9. package/components/BrFormFieldset.vue +12 -0
  10. package/components/BrFormInput.vue +84 -0
  11. package/components/BrFormLabel.vue +20 -0
  12. package/components/BrFormPassword.vue +35 -61
  13. package/components/BrFormRadio.vue +15 -0
  14. package/components/BrFormRadioGroup.vue +26 -0
  15. package/components/BrFormRow.vue +53 -67
  16. package/components/BrFormTel.vue +7 -0
  17. package/components/BrFormTextarea.vue +33 -0
  18. package/components/BrFormUpdate.vue +23 -11
  19. package/components/BrFormVisible.vue +23 -0
  20. package/components/EventSummary.vue +22 -26
  21. package/components/FluidIframe.vue +1 -1
  22. package/components/SeeInside.vue +19 -21
  23. package/components/VideoContent.vue +12 -12
  24. package/icons/barbican.vue +5 -6
  25. package/index.js +60 -9
  26. package/mixins/inputs.js +44 -48
  27. package/package.json +13 -7
  28. package/scripts/helpers/compareArrays.js +8 -0
  29. package/scripts/helpers/formatKebabCase.js +11 -0
  30. package/scripts/helpers/logObject.js +5 -0
  31. package/scripts/helpers.js +4 -3
  32. package/scss/__vars/_alerts.scss +6 -0
  33. package/scss/__vars/_columns.scss +9 -0
  34. package/scss/__vars/_layout.scss +15 -0
  35. package/scss/__vars/_typography.scss +11 -0
  36. package/scss/__vars/colors/_brand.scss +13 -0
  37. package/scss/__vars/colors/_docs.scss +11 -0
  38. package/scss/__vars/colors/_grey.scss +10 -0
  39. package/scss/__vars/colors/_status.scss +9 -0
  40. package/scss/_app.scss +0 -2
  41. package/scss/_atomic.scss +5 -28
  42. package/scss/_br-alert.scss +10 -11
  43. package/scss/_br-button.scss +9 -7
  44. package/scss/_br-checkbox.scss +16 -15
  45. package/scss/_br-container.scss +17 -18
  46. package/scss/_br-footer.scss +1 -1
  47. package/scss/_br-form-edit.scss +5 -0
  48. package/scss/_br-form-row.scss +1 -33
  49. package/scss/_br-form-textarea.scss +6 -0
  50. package/scss/_br-form-update.scss +7 -6
  51. package/scss/_br-form-visible.scss +5 -0
  52. package/scss/_br-loader.scss +11 -12
  53. package/scss/_br-promo.scss +3 -3
  54. package/scss/_br-radio.scss +8 -13
  55. package/scss/_br-select.scss +1 -1
  56. package/scss/_br-skiplink.scss +1 -1
  57. package/scss/_br-wrap.scss +4 -6
  58. package/scss/_card-deck.scss +7 -9
  59. package/scss/_city-of-london.scss +1 -1
  60. package/scss/_close-icon.scss +5 -7
  61. package/scss/_form.scss +2 -2
  62. package/scss/_helpers.scss +2 -3
  63. package/scss/_input.scss +8 -16
  64. package/scss/_table.scss +16 -19
  65. package/scss/atomic/_colors.scss +40 -0
  66. package/scss/atomic/_font-sizes.scss +15 -0
  67. package/scss/atomic/_font-weights.scss +7 -0
  68. package/scss/atomic/_margins.scss +23 -0
  69. package/scss/atomic/_min-heights.scss +19 -0
  70. package/scss/atomic/_min-widths.scss +19 -0
  71. package/scss/atomic/{paddings.scss → _paddings.scss} +15 -8
  72. package/scss/atomic/_text-aligns.scss +7 -0
  73. package/scss/card/_account.scss +5 -5
  74. package/scss/card/_block.scss +2 -4
  75. package/scss/card/_confirm.scss +4 -4
  76. package/scss/card/_login.scss +1 -3
  77. package/scss/card/_membership.scss +18 -23
  78. package/scss/card/_password.scss +2 -2
  79. package/scss/card/_related.scss +9 -9
  80. package/scss/card/_slim.scss +2 -2
  81. package/scss/card/_video-help.scss +3 -7
  82. package/scss/card/index.scss +1 -1
  83. package/scss/{helpers/functions → functions}/index.scss +0 -4
  84. package/scss/index.scss +193 -9
  85. package/scss/lists.scss +17 -1
  86. package/scss/{helpers/mixins → mixins}/_basket.scss +1 -1
  87. package/scss/{helpers/mixins → mixins}/_br-alert.scss +11 -14
  88. package/scss/mixins/_br-card.scss +65 -0
  89. package/scss/{helpers/mixins → mixins}/_br-footer.scss +6 -6
  90. package/scss/mixins/_br-form-edit.scss +9 -0
  91. package/scss/mixins/_br-form-row.scss +61 -0
  92. package/scss/{helpers/mixins/_br-form-password.scss → mixins/_br-form-visible.scss} +3 -3
  93. package/scss/mixins/_br-gap.scss +4 -0
  94. package/scss/mixins/_br-skiplink.scss +18 -0
  95. package/scss/{helpers/mixins → mixins}/_city-of-london.scss +1 -1
  96. package/scss/{helpers/mixins → mixins}/_content.scss +12 -13
  97. package/scss/{helpers/mixins → mixins}/_core.scss +9 -6
  98. package/scss/mixins/_festival.scss +49 -0
  99. package/scss/{helpers/mixins → mixins}/_focus.scss +11 -18
  100. package/scss/{helpers/mixins → mixins}/_headings.scss +5 -6
  101. package/scss/{helpers/mixins → mixins}/_loading.scss +2 -3
  102. package/scss/{helpers/mixins → mixins}/account/_orders.scss +1 -1
  103. package/scss/{helpers/mixins → mixins}/buttons/_custom.scss +64 -65
  104. package/scss/mixins/buttons/_outline.scss +54 -0
  105. package/scss/{helpers/mixins → mixins}/buttons/_setup.scss +11 -13
  106. package/scss/{helpers/mixins → mixins}/buttons/_solid.scss +6 -7
  107. package/scss/{helpers/mixins → mixins}/buttons/_spektrix.scss +4 -6
  108. package/scss/mixins/drupal/_br-border-reset.scss +30 -0
  109. package/scss/{helpers/mixins → mixins}/drupal/_br-column.scss +3 -4
  110. package/scss/{helpers/mixins → mixins}/drupal/_br-container.scss +2 -3
  111. package/scss/{helpers/mixins → mixins}/drupal/_br-inner.scss +2 -3
  112. package/scss/{helpers/mixins → mixins}/drupal/_br-search-form.scss +23 -18
  113. package/scss/{helpers/mixins → mixins}/drupal/_br-site-logo.scss +4 -2
  114. package/scss/{helpers/mixins → mixins}/index.scss +2 -2
  115. package/scss/{helpers/mixins → mixins}/input/_generic.scss +15 -14
  116. package/scss/{helpers/mixins → mixins}/input/_radio.scss +1 -1
  117. package/scss/mixins/input/_select.scss +33 -0
  118. package/scss/mixins/input/_status.scss +19 -0
  119. package/scss/{helpers/mixins → mixins}/input/_text.scss +13 -13
  120. package/scss/{helpers/mixins → mixins}/table/_basket.scss +5 -6
  121. package/scss/{helpers/mixins → mixins}/table/_details.scss +9 -12
  122. package/scss/{helpers/mixins → mixins}/table/_etickets.scss +8 -11
  123. package/scss/{helpers/mixins → mixins}/table/_generic.scss +5 -7
  124. package/scss/{helpers/mixins → mixins}/table/_gifts.scss +10 -13
  125. package/scss/{helpers/mixins/table/_simple.scss → mixins/table/_membership.scss} +1 -2
  126. package/scss/{helpers/mixins → mixins}/table/_orders.scss +6 -8
  127. package/scss/{helpers/mixins → mixins}/table/_preferences.scss +10 -14
  128. package/scss/mixins/table/_resale.scss +27 -0
  129. package/scss/{helpers/mixins → mixins}/table/_section.scss +3 -3
  130. package/scss/mixins/table/_simple.scss +9 -0
  131. package/scss/{helpers/mixins → mixins}/table/_tickets.scss +10 -13
  132. package/scss/mixins/table/row/_disabled.scss +20 -0
  133. package/scss/reset.scss +3 -5
  134. package/scss/typography.scss +6 -8
  135. package/components/BrFormCheckbox/Component.vue +0 -52
  136. package/components/BrFormCheckboxGroup/Component.vue +0 -39
  137. package/components/BrFormGroup/Component.vue +0 -15
  138. package/components/BrFormGroup/Demo.vue +0 -26
  139. package/components/BrFormInput/Component.vue +0 -47
  140. package/components/BrFormInputNew.vue +0 -16
  141. package/components/BrFormRadio/Component.vue +0 -40
  142. package/components/BrFormRadioGroup/Component.vue +0 -38
  143. package/components/BrFormTextarea/Component.vue +0 -26
  144. package/css/index.css +0 -4780
  145. package/css/lists.css +0 -12
  146. package/css/reset.css +0 -19
  147. package/css/supreme.css +0 -37
  148. package/css/typography.css +0 -35
  149. package/scss/_br-form-password.scss +0 -5
  150. package/scss/_main.scss +0 -20
  151. package/scss/atomic/font-weights.scss +0 -11
  152. package/scss/atomic/margins.scss +0 -17
  153. package/scss/atomic/min-heights.scss +0 -9
  154. package/scss/atomic/text-aligns.scss +0 -11
  155. package/scss/helpers/mixins/_br-card.scss +0 -68
  156. package/scss/helpers/mixins/_br-form-row.scss +0 -37
  157. package/scss/helpers/mixins/_br-form-update.scss +0 -17
  158. package/scss/helpers/mixins/_br-gap.scss +0 -4
  159. package/scss/helpers/mixins/_br-skiplink.scss +0 -19
  160. package/scss/helpers/mixins/_festival.scss +0 -51
  161. package/scss/helpers/mixins/buttons/_outline.scss +0 -50
  162. package/scss/helpers/mixins/drupal/_br-border-reset.scss +0 -25
  163. package/scss/helpers/mixins/input/_select.scss +0 -36
  164. package/scss/helpers/mixins/input/_status.scss +0 -19
  165. package/scss/helpers/mixins/table/_membership.scss +0 -10
  166. package/scss/helpers/mixins/table/_resale.scss +0 -28
  167. package/scss/helpers/mixins/table/row/_disabled.scss +0 -22
  168. package/scss/helpers/variables/_alerts.scss +0 -9
  169. package/scss/helpers/variables/_columns.scss +0 -9
  170. package/scss/helpers/variables/_layout.scss +0 -26
  171. package/scss/helpers/variables/_typography.scss +0 -33
  172. package/scss/helpers/variables/colors/_brand.scss +0 -102
  173. package/scss/helpers/variables/colors/_docs.scss +0 -12
  174. package/scss/helpers/variables/colors/_grey.scss +0 -6
  175. package/scss/helpers/variables/colors/_llf.scss +0 -10
  176. package/scss/helpers/variables/colors/_status.scss +0 -30
  177. package/scss/helpers/variables/colors/_wgp.scss +0 -5
  178. package/scss/helpers/variables/colors/index.scss +0 -11
  179. package/scss/helpers/variables/index.scss +0 -16
  180. /package/scss/{helpers/mixins → mixins}/_breakpoints.scss +0 -0
  181. /package/scss/{helpers/mixins → mixins}/_buttons.scss +0 -0
  182. /package/scss/{helpers/mixins → mixins}/_input.scss +0 -0
  183. /package/scss/{helpers/mixins → mixins}/_table.scss +0 -0
  184. /package/scss/{helpers/mixins → mixins}/drupal/index.scss +0 -0
  185. /package/scss/{helpers/mixins → mixins}/input/_checkbox.scss +0 -0
@@ -14,20 +14,20 @@ export default {
14
14
  },
15
15
  computed: {
16
16
  styleTitle() {
17
- return this.placeholder ? this.$style.placeholder : this.$style.title;
17
+ return this.placeholder ? this.$style.placeholder : this.$style.title
18
18
  },
19
19
  },
20
- };
20
+ }
21
21
  </script>
22
22
 
23
23
  <style lang="scss" module>
24
- @use "#styles/helpers" as *;
24
+ @use '#styles/helpers' as *;
25
25
 
26
26
  @mixin title {
27
- margin-bottom: 1.25rem;
27
+ margin-bottom: var(--margin-xl);
28
28
 
29
29
  @include medium-up {
30
- font-size: $h1-font-size;
30
+ font-size: var(--font-size-h1);
31
31
  }
32
32
  }
33
33
 
@@ -4,8 +4,8 @@
4
4
 
5
5
  <style lang="scss" scoped>
6
6
  .card-subtitle {
7
- color: hsl(0deg, 0%, 35%);
8
- font-size: 0.875rem;
7
+ color: var(--color-black-50-lighten);
8
+ font-size: var(--font-size-sm);
9
9
  font-weight: 400;
10
10
  margin: 0;
11
11
  }
@@ -5,13 +5,14 @@
5
5
  </template>
6
6
 
7
7
  <style lang="scss" module>
8
- @use "#styles/helpers" as *;
8
+ @use '#styles/helpers' as *;
9
9
 
10
10
  .container {
11
- padding: 0.875rem 0.75rem 0.625rem 0.75rem;
12
- border-left: 0.25rem solid;
13
- background: $c-grey-l96;
14
- margin-bottom: 1rem;
11
+ padding: var(--padding-lg) var(--padding-md) var(--padding-sm) var(--padding-md);
12
+ background: var(--color-black-5-lighten);
13
+ margin-bottom: var(--margin-lg);
14
+ border-left-width: 0.25rem;
15
+ border-left-style: solid;
15
16
  font-weight: bold;
16
17
  }
17
18
  </style>
@@ -0,0 +1,15 @@
1
+ <template>
2
+ <div class="br-checkbox">
3
+ <BrFormInput v-bind="$attrs" type="checkbox">
4
+ <slot />
5
+ </BrFormInput>
6
+ </div>
7
+ </template>
8
+
9
+ <script setup>
10
+ import BrFormInput from '#components/BrFormInput.vue'
11
+
12
+ defineOptions({
13
+ inheritAttrs: false,
14
+ })
15
+ </script>
@@ -0,0 +1,33 @@
1
+ <template>
2
+ <div role="group">
3
+ <BrFormCheckbox
4
+ v-for="(option, index) in options"
5
+ :data-test="option['data-test']"
6
+ :key="'checkbox-option-' + index"
7
+ :disabled="option.disabled"
8
+ :value="option.value"
9
+ v-model="model"
10
+ :name="name">
11
+ <slot v-if="$slots.default" v-bind="option" />
12
+ <template v-else>{{ option.text }}</template>
13
+ </BrFormCheckbox>
14
+ </div>
15
+ </template>
16
+
17
+ <script setup>
18
+ import BrFormCheckbox from '#components/BrFormCheckbox.vue'
19
+
20
+ const model = defineModel()
21
+
22
+ // @name props.options
23
+ // @description {object[]} array of checkbox options data
24
+ // @param {string} [options[]['data-test']] - optional string used in testing
25
+ // @param {boolean} [options[].disabled] - optional boolean for disabling the input
26
+ // @param {boolean | string | number} options[].value - the input value
27
+ // @param {string} options[].text - string displayed inside the input
28
+
29
+ const props = defineProps({
30
+ options: Array,
31
+ name: String,
32
+ })
33
+ </script>
@@ -0,0 +1,11 @@
1
+ <template>
2
+ <BrFormInput v-bind="$attrs" type="date" />
3
+ </template>
4
+
5
+ <script setup>
6
+ import BrFormInput from '#components/BrFormInput.vue'
7
+
8
+ defineOptions({
9
+ inheritAttrs: false,
10
+ })
11
+ </script>
@@ -0,0 +1,38 @@
1
+ <template>
2
+ <div :class="generateClasses">
3
+ <slot />
4
+ <br-button
5
+ @click="$emit('edit')"
6
+ variant="edit-input"
7
+ data-test="edit"
8
+ v-if="active">
9
+ <edit-icon />
10
+ </br-button>
11
+ </div>
12
+ </template>
13
+
14
+ <script>
15
+ import BrButton from '#components/BrButton.vue'
16
+ import EditIcon from '#icons/account/edit.vue'
17
+
18
+ export default {
19
+ props: {
20
+ active: {
21
+ type: Boolean,
22
+ },
23
+ },
24
+ components: {
25
+ BrButton,
26
+ EditIcon,
27
+ },
28
+ computed: {
29
+ generateClasses() {
30
+ let result = ['br-form-edit']
31
+
32
+ if (this.active) result.push('active')
33
+
34
+ return result
35
+ },
36
+ },
37
+ }
38
+ </script>
@@ -0,0 +1,7 @@
1
+ <template>
2
+ <BrFormInput type="email" />
3
+ </template>
4
+
5
+ <script setup>
6
+ import BrFormInput from '#components/BrFormInput.vue'
7
+ </script>
@@ -0,0 +1,12 @@
1
+ <template>
2
+ <fieldset>
3
+ <legend>{{ label }}</legend>
4
+ <slot />
5
+ </fieldset>
6
+ </template>
7
+
8
+ <script setup>
9
+ const props = defineProps({
10
+ label: String,
11
+ })
12
+ </script>
@@ -0,0 +1,84 @@
1
+ <template>
2
+ <input
3
+ :autocomplete="generateAutoComplete"
4
+ :data-test="generateDataTest"
5
+ :type="generateType"
6
+ :id="generateID"
7
+ v-model="model"
8
+ v-bind="$attrs" />
9
+ <label v-if="$slots.default" :for="generateID"><slot /></label>
10
+ </template>
11
+
12
+ <script setup>
13
+ import { computed } from 'vue'
14
+ import formatKebabCase from '#helpers/formatKebabCase'
15
+
16
+ const model = defineModel()
17
+
18
+ const props = defineProps({
19
+ id: String,
20
+ type: String,
21
+ dataTest: String,
22
+ autocomplete: String,
23
+ })
24
+
25
+ defineOptions({
26
+ inheritAttrs: false,
27
+ })
28
+
29
+ // @description Returns either a string or undefined for the "autocomplete" attribute
30
+ // @returns {string | undefined} result - string or undefined based on preceeding conditions
31
+
32
+ const generateAutoComplete = computed(() => {
33
+ let result = undefined
34
+
35
+ if (props.id == 'first-name') result = 'given-name'
36
+
37
+ if (props.id == 'last-name') result = 'family-name'
38
+
39
+ if (props.type == 'email') result = 'email'
40
+
41
+ if (props.autocomplete) result = props.autocomplete
42
+
43
+ return result && formatKebabCase(result)
44
+ })
45
+
46
+ // @description Returns either a string or undefined for the "data-test" attribute
47
+ // @returns {string | undefined} result - string or undefined based on preceeding conditions
48
+
49
+ const generateDataTest = computed(() => {
50
+ let result = undefined
51
+
52
+ if (props.id) result = props.id
53
+
54
+ if (props.dataTest) result = props.dataTest
55
+
56
+ return result && formatKebabCase(result)
57
+ })
58
+
59
+ // @description Returns a string for the "type" attribute
60
+ // @returns {string} result - string based on preceeding conditions
61
+
62
+ const generateType = computed(() => {
63
+ let result = 'text'
64
+
65
+ if (props.type) result = props.type
66
+
67
+ return formatKebabCase(result)
68
+ })
69
+
70
+ // @description Returns a string for the "id" attribute
71
+ // @returns {string} result - string based on preceeding conditions
72
+
73
+ const generateID = computed(() => {
74
+ let result
75
+
76
+ if (props.id) {
77
+ result = props.id
78
+ } else {
79
+ result = 'random-' + Math.ceil(Math.random() * 1000000)
80
+ }
81
+
82
+ return formatKebabCase(result)
83
+ })
84
+ </script>
@@ -0,0 +1,20 @@
1
+ <template>
2
+ <component :is="!disabled ? 'label' : 'div'" :for="!disabled ? id : null" class="br-form-label">
3
+ <strong>
4
+ <slot />
5
+ </strong>
6
+ <span v-if="required"> (required)</span>
7
+ <span v-if="optional"> (optional)</span>
8
+ </component>
9
+ </template>
10
+
11
+ <script setup>
12
+
13
+ const props = defineProps({
14
+ disabled: Boolean,
15
+ required: Boolean,
16
+ optional: Boolean,
17
+ id: String,
18
+ })
19
+
20
+ </script>
@@ -1,67 +1,41 @@
1
1
  <template>
2
- <div class="br-form-password">
3
- <input
2
+ <BrFormVisible
3
+ @visible="showPassword = !showPassword"
4
+ :visible="showPassword">
5
+ <BrFormInput
6
+ :autocomplete="generateAutocomplete"
7
+ :type="generateType"
4
8
  v-bind="$attrs"
5
- :autocomplete="autocomplete"
6
- @input="$emit('update:modelValue', $event.target.value)"
7
- :value="modelValue"
8
- name="password"
9
- :type="type"
10
- required
11
- :id="id"
12
- :data-test="dataTest"
13
- />
14
- <br-button
15
- @click="showPassword = !showPassword"
16
- variant="toggle-password"
17
- data-test="show-password"
18
- >
19
- <span class="sr-only">
20
- {{ showPassword ? "Hide" : "Show" }} password
21
- </span>
22
- <show-password-icon v-if="showPassword" />
23
- <hide-password-icon v-else />
24
- </br-button>
25
- </div>
9
+ required />
10
+ </BrFormVisible>
26
11
  </template>
27
12
 
28
- <script>
29
- import BrButton from "#components/BrButton.vue";
30
- import HidePasswordIcon from "#icons/password/hide.vue";
31
- import ShowPasswordIcon from "#icons/password/show.vue";
13
+ <script setup>
14
+ import { ref, computed } from 'vue'
15
+ import BrFormInput from '#components/BrFormInput.vue'
16
+ import BrFormVisible from '#components/BrFormVisible.vue'
32
17
 
33
- export default {
34
- inheritAttrs: false, // Allow us to put attributes on the input.
35
- emits: ["update:modelValue"],
36
- data() {
37
- return {
38
- password: "",
39
- showPassword: false,
40
- };
41
- },
42
- components: {
43
- HidePasswordIcon,
44
- ShowPasswordIcon,
45
- BrButton,
46
- },
47
- props: {
48
- modelValue: {},
49
- id: {
50
- type: String,
51
- default: "password",
52
- },
53
- dataTest: {
54
- type: String,
55
- default: "password-field",
56
- },
57
- },
58
- computed: {
59
- type() {
60
- return this.showPassword ? "text" : "password";
61
- },
62
- autocomplete() {
63
- return this.showPassword ? "off" : "current-password";
64
- },
65
- },
66
- };
18
+ const props = defineProps({
19
+ toggle: Boolean,
20
+ })
21
+
22
+ defineOptions({
23
+ inheritAttrs: false,
24
+ })
25
+
26
+ let showPassword = ref(false)
27
+
28
+ // @description Returns a string for the "type" attribute based on the showPassword boolean
29
+ // @returns {string} conditional string
30
+
31
+ const generateType = computed(() => {
32
+ return showPassword.value ? 'text' : 'password'
33
+ })
34
+
35
+ // @description Returns a string for the "autocomplete" attribute based on the showPassword boolean
36
+ // @returns {string} conditional string
37
+
38
+ const generateAutocomplete = computed(() => {
39
+ return showPassword.value ? 'off' : 'current-password'
40
+ })
67
41
  </script>
@@ -0,0 +1,15 @@
1
+ <template>
2
+ <div class="br-radio">
3
+ <BrFormInput v-bind="$attrs" type="radio">
4
+ <slot />
5
+ </BrFormInput>
6
+ </div>
7
+ </template>
8
+
9
+ <script setup>
10
+ import BrFormInput from '#components/BrFormInput.vue'
11
+
12
+ defineOptions({
13
+ inheritAttrs: false,
14
+ })
15
+ </script>
@@ -0,0 +1,26 @@
1
+ <template>
2
+ <div role="radiogroup">
3
+ <BrFormRadio
4
+ v-for="(option, index) in options"
5
+ :data-test="option['data-test']"
6
+ :key="'radio-option-' + index"
7
+ :disabled="option.disabled"
8
+ :value="option.value"
9
+ v-model="model"
10
+ :name="name">
11
+ <slot v-if="$slots.default" v-bind="option" />
12
+ <template v-else>{{ option.text }}</template>
13
+ </BrFormRadio>
14
+ </div>
15
+ </template>
16
+
17
+ <script setup>
18
+ import BrFormRadio from '#components/BrFormRadio.vue'
19
+
20
+ const model = defineModel()
21
+
22
+ const props = defineProps({
23
+ options: Array,
24
+ name: String,
25
+ })
26
+ </script>
@@ -1,77 +1,63 @@
1
1
  <template>
2
- <div :class="styleRow">
3
- <template v-if="label">
4
- <label v-if="input_active" :for="generateInputID">
5
- <strong>{{ label }}</strong>
6
- <span v-if="required"> (required)</span>
7
- <span v-if="optional"> (optional)</span>
8
- </label>
9
- <div class="fake-label" v-else>
10
- <strong>
11
- {{ label }}
12
- </strong>
13
- </div>
14
- </template>
15
- <div :class="[`content`, { editable }, { label }, { submit }, { radios }]">
16
- <br-button v-if="editable" variant="input-edit" @click="$emit('edit')">
17
- <edit-icon />
18
- </br-button>
2
+ <div :class="generateClasses">
3
+ <BrFormLabel
4
+ v-if="label"
5
+ :id="generateFor"
6
+ :required="required"
7
+ v-bind="$attrs">
8
+ {{ label }}
9
+ </BrFormLabel>
10
+ <div :class="[`content`, { label }, { submit }, { radios }]">
19
11
  <slot />
20
12
  </div>
21
13
  </div>
22
14
  </template>
23
15
 
24
- <script>
25
- import BrButton from '#components/BrButton.vue'
26
- import EditIcon from '#icons/account/edit.vue'
27
- import mixins from '#mixins/inputs'
16
+ <script setup>
17
+ import { computed } from 'vue'
18
+ import formatKebabCase from '#helpers/formatKebabCase'
19
+ import BrFormLabel from '#components/BrFormLabel.vue'
28
20
 
29
- export default {
30
- mixins: [mixins],
31
- components: {
32
- BrButton,
33
- EditIcon,
34
- },
35
- props: {
36
- label: {
37
- type: String,
38
- },
39
- input_id: {
40
- type: String,
41
- },
42
- input_active: {
43
- type: Boolean,
44
- default: true,
45
- },
46
- required: {
47
- type: Boolean,
48
- },
49
- optional: {
50
- type: Boolean,
51
- },
52
- submit: {
53
- type: Boolean,
54
- },
55
- editable: {
56
- type: Boolean,
57
- },
58
- radios: {
59
- type: Boolean,
60
- },
61
- class: {
62
- type: String,
63
- },
64
- },
65
- computed: {
66
- styleRow() {
67
- let styles = ['br-form-row']
21
+ const props = defineProps({
22
+ label: String,
23
+ id: String,
24
+ required: Boolean,
25
+ submit: Boolean,
26
+ class: String,
27
+ radios: Boolean,
28
+ })
68
29
 
69
- if (this.class) {
70
- styles.push(this.class)
71
- }
30
+ defineOptions({
31
+ inheritAttrs: false,
32
+ })
72
33
 
73
- return styles.join(' ')
74
- },
75
- },
76
- }
34
+ // @description Returns a string array of classnames
35
+ // @returns {string[]} result - contains default classname and optional prop-based classnames
36
+
37
+ const generateClasses = computed(() => {
38
+ let result = ['br-form-row']
39
+
40
+ if (props.class) result.push(props.class)
41
+
42
+ return result
43
+ })
44
+
45
+ // @description Returns either a string or null for the "for" attribute
46
+ // @returns {string | null} result - string or null based on preceeding conditions
47
+
48
+ const generateFor = computed(() => {
49
+ let result = null
50
+
51
+ // return null if there is no label value to click on
52
+
53
+ if (!props.label) return result
54
+
55
+ if (props.label) result = props.label
56
+
57
+ // override label value if a custom id is also set
58
+
59
+ if (props.id) result = props.id
60
+
61
+ return result && formatKebabCase(result)
62
+ })
77
63
  </script>
@@ -0,0 +1,7 @@
1
+ <template>
2
+ <BrFormInput autocomplete="tel" inputmode="tel" type="tel" />
3
+ </template>
4
+
5
+ <script setup>
6
+ import BrFormInput from '#components/BrFormInput.vue'
7
+ </script>
@@ -0,0 +1,33 @@
1
+ <template>
2
+ <textarea
3
+ class="br-form-textarea"
4
+ :id="generateID"
5
+ v-model="value"
6
+ wrap="soft" />
7
+ </template>
8
+
9
+ <script setup>
10
+ import { computed } from 'vue'
11
+ import formatKebabCase from '#helpers/formatKebabCase'
12
+
13
+ const value = defineModel()
14
+
15
+ // @description Returns a string for the "id" attribute
16
+ // @returns {string} result - string based on preceeding conditions
17
+
18
+ const generateID = computed(() => {
19
+ let result
20
+
21
+ if (props.id) {
22
+ result = props.id
23
+ } else {
24
+ result = 'random-' + Math.ceil(Math.random() * 1000000)
25
+ }
26
+
27
+ return formatKebabCase(result)
28
+ })
29
+
30
+ const props = defineProps({
31
+ id: String,
32
+ })
33
+ </script>
@@ -1,18 +1,30 @@
1
1
  <template>
2
- <div class="br-form-update">
3
- <div class="br-form-update--input" data-test="email"><slot /></div>
4
- <br-button @click="$emit('update')" data-test="update">
2
+ <div :class="generateClasses">
3
+ <slot />
4
+ <BrButton v-if="active" @click="emit('update')" data-test="update">
5
5
  update
6
- </br-button>
6
+ </BrButton>
7
7
  </div>
8
8
  </template>
9
9
 
10
- <script>
11
- import BrButton from "#components/BrButton.vue";
10
+ <script setup>
11
+ import { computed } from 'vue'
12
+ import BrButton from '#components/BrButton.vue'
12
13
 
13
- export default {
14
- components: {
15
- BrButton,
16
- },
17
- };
14
+ const props = defineProps({
15
+ active: Boolean,
16
+ })
17
+
18
+ const emit = defineEmits(['update'])
19
+
20
+ // @description Returns a string array of classnames
21
+ // @returns {string[]} result - contains default classname and optional active classname
22
+
23
+ const generateClasses = computed(() => {
24
+ let result = ['br-form-update']
25
+
26
+ if (props.active) result.push('active')
27
+
28
+ return result
29
+ })
18
30
  </script>
@@ -0,0 +1,23 @@
1
+ <template>
2
+ <div class="br-form-visible">
3
+ <slot />
4
+ <BrButton
5
+ @click="$emit('visible')"
6
+ data-test="show-password"
7
+ variant="toggle-password">
8
+ <span class="sr-only">{{ visible ? 'Hide' : 'Show' }} password</span>
9
+ <ShowPasswordIcon v-if="visible" />
10
+ <HidePasswordIcon v-else />
11
+ </BrButton>
12
+ </div>
13
+ </template>
14
+
15
+ <script setup>
16
+ import BrButton from '#components/BrButton.vue'
17
+ import HidePasswordIcon from '#icons/password/hide.vue'
18
+ import ShowPasswordIcon from '#icons/password/show.vue'
19
+
20
+ const props = defineProps({
21
+ visible: Boolean,
22
+ })
23
+ </script>