@seamly/web-ui 22.1.0-beta.1 → 22.2.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 (50) hide show
  1. package/build/dist/lib/components.js +429 -180
  2. package/build/dist/lib/components.js.map +1 -1
  3. package/build/dist/lib/components.min.js +1 -1
  4. package/build/dist/lib/components.min.js.LICENSE.txt +2 -2
  5. package/build/dist/lib/components.min.js.map +1 -1
  6. package/build/dist/lib/hooks.js +84 -19
  7. package/build/dist/lib/hooks.js.map +1 -1
  8. package/build/dist/lib/hooks.min.js +1 -1
  9. package/build/dist/lib/hooks.min.js.map +1 -1
  10. package/build/dist/lib/index.debug.js +38 -38
  11. package/build/dist/lib/index.debug.min.js +1 -1
  12. package/build/dist/lib/index.debug.min.js.map +1 -1
  13. package/build/dist/lib/index.js +462 -193
  14. package/build/dist/lib/index.js.map +1 -1
  15. package/build/dist/lib/index.min.js +1 -1
  16. package/build/dist/lib/index.min.js.LICENSE.txt +2 -2
  17. package/build/dist/lib/index.min.js.map +1 -1
  18. package/build/dist/lib/standalone.js +539 -216
  19. package/build/dist/lib/standalone.js.map +1 -1
  20. package/build/dist/lib/standalone.min.js +1 -1
  21. package/build/dist/lib/standalone.min.js.LICENSE.txt +1 -1
  22. package/build/dist/lib/standalone.min.js.map +1 -1
  23. package/build/dist/lib/style-guide.js +557 -190
  24. package/build/dist/lib/style-guide.js.map +1 -1
  25. package/build/dist/lib/style-guide.min.js +1 -1
  26. package/build/dist/lib/style-guide.min.js.LICENSE.txt +2 -2
  27. package/build/dist/lib/style-guide.min.js.map +1 -1
  28. package/build/dist/lib/styles-default-implementation.js +1 -1
  29. package/build/dist/lib/styles.css +1 -1
  30. package/build/dist/lib/styles.js +1 -1
  31. package/build/dist/lib/utils.js +459 -190
  32. package/build/dist/lib/utils.js.map +1 -1
  33. package/build/dist/lib/utils.min.js +1 -1
  34. package/build/dist/lib/utils.min.js.LICENSE.txt +1 -1
  35. package/build/dist/lib/utils.min.js.map +1 -1
  36. package/package.json +28 -28
  37. package/src/javascripts/api/index.ts +13 -1
  38. package/src/javascripts/domains/config/slice.ts +2 -1
  39. package/src/javascripts/domains/forms/selectors.ts +6 -8
  40. package/src/javascripts/domains/forms/slice.ts +1 -1
  41. package/src/javascripts/domains/translations/components/options-dialog/translation-option.tsx +3 -1
  42. package/src/javascripts/domains/translations/components/options-dialog/translation-options.tsx +62 -35
  43. package/src/javascripts/domains/translations/slice.ts +8 -1
  44. package/src/javascripts/lib/engine/index.tsx +3 -1
  45. package/src/javascripts/style-guide/states.js +47 -0
  46. package/src/javascripts/ui/components/entry/text-entry/hooks.ts +2 -2
  47. package/src/javascripts/ui/components/form-controls/wrapper.tsx +13 -3
  48. package/src/stylesheets/5-components/_input.scss +0 -5
  49. package/src/stylesheets/5-components/_options.scss +2 -2
  50. package/src/stylesheets/5-components/_translation-options.scss +23 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seamly/web-ui",
3
- "version": "22.1.0-beta.1",
3
+ "version": "22.2.0",
4
4
  "main": "build/dist/lib/index.js",
5
5
  "types": "build/src/javascripts/index.d.ts",
6
6
  "module": "",
@@ -24,24 +24,24 @@
24
24
  "dependencies": {
25
25
  "@reduxjs/toolkit": "^1.9.5",
26
26
  "@ultraq/icu-message-formatter": "^0.12.0",
27
- "core-js": "^3.30.2",
27
+ "core-js": "^3.31.1",
28
28
  "deep-keys": "^0.5.0",
29
- "focus-trap": "^7.4.3",
29
+ "focus-trap": "^7.5.2",
30
30
  "include-media": "^2.0.0",
31
31
  "js-cookie": "^3.0.5",
32
32
  "minivents": "^2.2.1",
33
- "phoenix": "^1.7.3",
34
- "react-redux": "^8.0.7"
33
+ "phoenix": "^1.7.6",
34
+ "react-redux": "^8.1.1"
35
35
  },
36
36
  "devDependencies": {
37
- "@babel/core": "^7.22.1",
38
- "@babel/plugin-transform-react-jsx": "^7.22.3",
39
- "@babel/plugin-transform-runtime": "^7.22.4",
40
- "@babel/preset-env": "^7.22.4",
41
- "@babel/preset-react": "^7.22.3",
42
- "@babel/preset-typescript": "^7.21.5",
43
- "@babel/runtime-corejs3": "^7.22.3",
44
- "@playwright/test": "^1.34.3",
37
+ "@babel/core": "^7.22.6",
38
+ "@babel/plugin-transform-react-jsx": "^7.22.5",
39
+ "@babel/plugin-transform-runtime": "^7.22.6",
40
+ "@babel/preset-env": "^7.22.6",
41
+ "@babel/preset-react": "^7.22.5",
42
+ "@babel/preset-typescript": "^7.22.5",
43
+ "@babel/runtime-corejs3": "^7.22.6",
44
+ "@playwright/test": "^1.35.1",
45
45
  "@seamly/doc-site": "^2.0.0",
46
46
  "@seamly/eslint-config": "^2.3.0",
47
47
  "@seamly/prettier-config": "^2.2.0",
@@ -52,52 +52,52 @@
52
52
  "@types/core-js": "^2.5.5",
53
53
  "@types/jest": "^29.5.2",
54
54
  "@types/phoenix": "^1.6.0",
55
- "@typescript-eslint/eslint-plugin": "^5.59.8",
56
- "@typescript-eslint/parser": "^5.59.8",
57
- "babel-jest": "^29.5.0",
55
+ "@typescript-eslint/eslint-plugin": "^5.61.0",
56
+ "@typescript-eslint/parser": "^5.61.0",
57
+ "babel-jest": "^29.6.0",
58
58
  "babel-loader": "^9.1.2",
59
59
  "babel-plugin-istanbul": "^6.1.1",
60
60
  "babel-plugin-react-remove-properties": "^0.3.0",
61
61
  "copy-webpack-plugin": "^11.0.0",
62
62
  "debug": "^4.3.4",
63
- "eslint": "^8.41.0",
63
+ "eslint": "^8.44.0",
64
64
  "eslint-config-prettier": "^8.8.0",
65
65
  "eslint-import-resolver-alias": "^1.1.2",
66
66
  "eslint-import-resolver-typescript": "^3.5.5",
67
67
  "eslint-plugin-filenames": "^1.3.2",
68
68
  "eslint-plugin-import": "^2.27.5",
69
- "eslint-plugin-jest": "^27.2.1",
69
+ "eslint-plugin-jest": "^27.2.2",
70
70
  "eslint-plugin-prettier": "^4.2.1",
71
71
  "eslint-plugin-react": "^7.32.2",
72
72
  "eslint-plugin-react-hooks": "^4.6.0",
73
73
  "file-loader": "^6.2.0",
74
74
  "fork-ts-checker-webpack-plugin": "^8.0.0",
75
- "glob": "^10.2.6",
75
+ "glob": "^10.3.1",
76
76
  "husky": "^8.0.3",
77
77
  "ignore-loader": "^0.1.2",
78
78
  "isomorphic-unfetch": "^4.0.2",
79
- "jest": "^29.5.0",
80
- "jest-environment-jsdom": "^29.5.0",
79
+ "jest": "^29.6.0",
80
+ "jest-environment-jsdom": "^29.6.0",
81
81
  "jest-watch-typeahead": "^2.2.2",
82
82
  "mini-css-extract-plugin": "^2.7.6",
83
83
  "nyc": "^15.1.0",
84
84
  "playwright-test-coverage": "^1.2.12",
85
85
  "postcss": "^8.4.24",
86
86
  "preact": "^10.15.1",
87
- "preact-render-to-string": "^6.0.3",
87
+ "preact-render-to-string": "^6.1.0",
88
88
  "prettier": "^2.8.8",
89
89
  "raw-loader": "^4.0.2",
90
90
  "rimraf": "^5.0.1",
91
91
  "start-server-and-test": "^2.0.0",
92
92
  "style-loader": "^3.3.3",
93
- "stylelint": "^15.6.2",
94
- "ts-loader": "^9.4.3",
95
- "typescript": "^5.0.4",
93
+ "stylelint": "^15.10.1",
94
+ "ts-loader": "^9.4.4",
95
+ "typescript": "^5.1.6",
96
96
  "url-loader": "^4.1.1",
97
- "webpack": "^5.85.0",
97
+ "webpack": "^5.88.1",
98
98
  "webpack-bundle-analyzer": "^4.9.0",
99
- "webpack-cli": "^5.1.1",
100
- "webpack-dev-server": "^4.15.0",
99
+ "webpack-cli": "^5.1.4",
100
+ "webpack-dev-server": "^4.15.1",
101
101
  "webpack-merge": "^5.9.0"
102
102
  },
103
103
  "resolutions": {
@@ -608,7 +608,19 @@ export class API {
608
608
  return
609
609
  }
610
610
 
611
- this.send('context', payload, false)
611
+ // Destructure the server locale from the payload
612
+ const { locale: _, ...restPayload } = payload
613
+ const configLocale = this.#config.context?.locale
614
+
615
+ this.send(
616
+ 'context',
617
+ {
618
+ // Only send locale if explicitly set in the config.
619
+ ...(configLocale ? { locale: configLocale } : {}),
620
+ ...restPayload,
621
+ },
622
+ false,
623
+ )
612
624
  }
613
625
 
614
626
  #getEnvironment() {
@@ -103,6 +103,7 @@ export const configSlice = createSlice({
103
103
  agentParticipant,
104
104
  userParticipant,
105
105
  startChatIcon,
106
+ locale,
106
107
  },
107
108
  },
108
109
  ) => {
@@ -110,7 +111,7 @@ export const configSlice = createSlice({
110
111
  type: 'message',
111
112
  payload,
112
113
  }))
113
-
114
+ state.context.locale = locale
114
115
  state.agentParticipant = agentParticipant
115
116
  state.userParticipant = userParticipant
116
117
  state.startChatIcon = startChatIcon
@@ -1,14 +1,14 @@
1
1
  import { createSelector } from '@reduxjs/toolkit'
2
+ import type { RootState } from 'domains/store'
2
3
 
3
- export const getState = ({ forms }) => forms
4
+ const getState = ({ forms }: RootState) => forms
4
5
 
5
6
  export const getFormById = createSelector(
6
- getState,
7
- (_, { formId }) => formId,
7
+ [getState, (_, { formId }): string => formId],
8
8
  (forms, formId) => forms[formId],
9
9
  )
10
10
 
11
- export const getFormControlsByFormId = createSelector(
11
+ const getFormControlsByFormId = createSelector(
12
12
  getFormById,
13
13
  (form) => form?.controls || {},
14
14
  )
@@ -26,13 +26,11 @@ export const getFormValuesByFormId = createSelector(
26
26
  )
27
27
 
28
28
  export const getControlValueByName = createSelector(
29
- getFormControlsByFormId,
30
- (_, { name }) => name,
29
+ [getFormControlsByFormId, (_, { name }): string => name],
31
30
  (controls, name) => controls[name]?.value,
32
31
  )
33
32
 
34
33
  export const getControlTouchedByName = createSelector(
35
- getFormControlsByFormId,
36
- (_, { name }) => name,
34
+ [getFormControlsByFormId, (_, { name }): string => name],
37
35
  (controls, name) => controls[name]?.touched,
38
36
  )
@@ -2,7 +2,7 @@ import { createSlice } from '@reduxjs/toolkit'
2
2
  import { resetApp } from 'domains/app/actions'
3
3
  import { ControlState } from 'domains/forms/forms.types'
4
4
 
5
- const initialFormState = {
5
+ const initialFormState: Record<string, ControlState> = {
6
6
  controls: {},
7
7
  }
8
8
 
@@ -8,6 +8,7 @@ type TranslationOptionProps = {
8
8
  description?: string
9
9
  onChange: () => void
10
10
  id: string
11
+ itemClassName?: string
11
12
  }
12
13
 
13
14
  const TranslationOption: FC<TranslationOptionProps> = ({
@@ -16,6 +17,7 @@ const TranslationOption: FC<TranslationOptionProps> = ({
16
17
  description,
17
18
  onChange,
18
19
  id,
20
+ itemClassName,
19
21
  }) => {
20
22
  const onKeyDown = (e: KeyboardEvent) => {
21
23
  if (e.code === 'Space' || e.code === 'Enter') {
@@ -26,7 +28,7 @@ const TranslationOption: FC<TranslationOptionProps> = ({
26
28
 
27
29
  return (
28
30
  <li
29
- className={className('translation-options__item')}
31
+ className={className([itemClassName, 'translation-options__item'])}
30
32
  aria-selected={checked}
31
33
  role="option"
32
34
  tabIndex={0}
@@ -1,5 +1,4 @@
1
- import { FC } from 'preact/compat'
2
- import { useMemo } from 'preact/hooks'
1
+ import { FC, useMemo } from 'preact/compat'
3
2
  import { useConfig } from 'domains/config/hooks'
4
3
  import { useI18n } from 'domains/i18n/hooks'
5
4
  import TranslationOption from 'domains/translations/components/options-dialog/translation-option'
@@ -15,6 +14,9 @@ type TranslationOptionsProps = {
15
14
  describedById?: string
16
15
  }
17
16
 
17
+ const isChecked = (language, currentLocale, isOriginal): boolean =>
18
+ currentLocale === language.locale || (!currentLocale && isOriginal)
19
+
18
20
  const TranslationOptions: FC<TranslationOptionsProps> = ({
19
21
  onChange,
20
22
  describedById,
@@ -28,29 +30,45 @@ const TranslationOptions: FC<TranslationOptionsProps> = ({
28
30
  const { languages, currentLocale, enableTranslations, disableTranslations } =
29
31
  useTranslations()
30
32
 
31
- const handleChange =
32
- ({ locale }: Language) =>
33
- () => {
34
- if (locale === currentLocale || defaultLocale === locale) {
35
- disableTranslations()
36
- } else {
37
- enableTranslations(locale)
38
- }
39
-
40
- onChange()
41
- focusContainer()
33
+ const handleChange = (locale: Language['locale']) => () => {
34
+ if (locale === currentLocale || defaultLocale === locale) {
35
+ disableTranslations()
36
+ } else {
37
+ enableTranslations(locale)
42
38
  }
43
39
 
44
- const sortedLanguages = useMemo(() => {
45
- return [...languages].sort((a, b) => {
46
- if (a.locale === defaultLocale) return -1
47
- if (b.locale === defaultLocale) return 1
40
+ onChange()
41
+ focusContainer()
42
+ }
43
+
44
+ const { primaryLanguages, remainingLanguages } = useMemo(
45
+ () =>
46
+ languages.reduce(
47
+ (acc, language) => {
48
+ const isOriginal = language.locale === defaultLocale
49
+ const checked = isChecked(language, currentLocale, isOriginal)
50
+
51
+ if (language.locale !== defaultLocale) {
52
+ acc.remainingLanguages.push({ ...language, checked, isOriginal })
53
+ }
54
+
55
+ const selectedIdx = acc.remainingLanguages.findIndex(
56
+ (l) => l.locale === currentLocale,
57
+ )
48
58
 
49
- return a.nativeName.localeCompare(b.nativeName, undefined, {
50
- sensitivity: 'base',
51
- })
52
- })
53
- }, [languages, defaultLocale])
59
+ if (isOriginal || (checked && selectedIdx > 4)) {
60
+ acc.primaryLanguages.push({ ...language, checked, isOriginal })
61
+ }
62
+
63
+ return acc
64
+ },
65
+ {
66
+ primaryLanguages: [],
67
+ remainingLanguages: [],
68
+ },
69
+ ),
70
+ [currentLocale, defaultLocale, languages],
71
+ )
54
72
 
55
73
  return (
56
74
  <ul
@@ -59,23 +77,32 @@ const TranslationOptions: FC<TranslationOptionsProps> = ({
59
77
  tabIndex={-1}
60
78
  className={className('translation-options')}
61
79
  >
62
- {sortedLanguages.map((language, idx) => {
63
- const isOriginal = idx === 0
64
-
65
- const checked =
66
- currentLocale === language.locale || (!currentLocale && isOriginal)
67
-
68
- return (
80
+ {primaryLanguages.map(
81
+ ({ locale, nativeName, checked, isOriginal }, idx) => (
69
82
  <TranslationOption
70
- key={language.locale}
71
- id={language.locale}
72
- label={language.nativeName}
83
+ key={locale}
84
+ id={locale}
85
+ label={nativeName}
73
86
  checked={checked}
74
87
  description={isOriginal && t('translations.settings.original')}
75
- onChange={handleChange(language)}
88
+ onChange={handleChange(locale)}
89
+ itemClassName={className({
90
+ 'translation-options__item--original': isOriginal,
91
+ 'translation-options__item--selected': checked && idx !== 0,
92
+ })}
76
93
  />
77
- )
78
- })}
94
+ ),
95
+ )}
96
+ {remainingLanguages.map(({ locale, nativeName, checked, isOriginal }) => (
97
+ <TranslationOption
98
+ key={locale}
99
+ id={locale}
100
+ label={nativeName}
101
+ checked={checked}
102
+ description={isOriginal && t('translations.settings.original')}
103
+ onChange={handleChange(locale)}
104
+ />
105
+ ))}
79
106
  </ul>
80
107
  )
81
108
  }
@@ -100,7 +100,14 @@ export const translationSlice = createSlice({
100
100
  if (!feature) return
101
101
 
102
102
  state.isAvailable = feature.enabled === true
103
- state.languages = feature.languages
103
+ state.languages = [...feature.languages].sort((a, b) => {
104
+ if (a.locale === payload.locale) return -1
105
+ if (b.locale === payload.locale) return 1
106
+
107
+ return a.nativeName.localeCompare(b.nativeName, undefined, {
108
+ sensitivity: 'base',
109
+ })
110
+ })
104
111
  })
105
112
  .addCase(setHistory, (state, { payload }) => {
106
113
  state.translationProposal = payload.translationProposal
@@ -85,7 +85,9 @@ export default class Engine {
85
85
  await store.dispatch(initializeConfig())
86
86
  try {
87
87
  const { locale } = await store.dispatch(initializeApp()).unwrap()
88
- await store.dispatch(setLocale(locale))
88
+ if (locale) {
89
+ await store.dispatch(setLocale(locale))
90
+ }
89
91
  } catch (rejectedValueOrSerializedError) {
90
92
  // nothing to do
91
93
  }
@@ -1644,6 +1644,53 @@ const standardState = {
1644
1644
  ],
1645
1645
  },
1646
1646
  },
1647
+ translationsActiveLarge: {
1648
+ category: categoryKeys.translations,
1649
+ headingText: 'Show translations active (large list)',
1650
+ description: '',
1651
+ ...baseState,
1652
+ config: {
1653
+ ...baseState.config,
1654
+ context: {
1655
+ ...baseState.context,
1656
+ locale: 'nl',
1657
+ },
1658
+ },
1659
+ translations: {
1660
+ ...translationsSlice,
1661
+ currentLocale: 'lv',
1662
+ isActive: true,
1663
+ isAvailable: true,
1664
+ languages: [
1665
+ { locale: 'nl', nativeName: 'Dutch' },
1666
+ { locale: 'en', nativeName: 'English' },
1667
+ { locale: 'ar', nativeName: 'Arabic' },
1668
+ { locale: 'bg', nativeName: 'Bulgarian' },
1669
+ { locale: 'zh', nativeName: 'Chinese' },
1670
+ { locale: 'cs', nativeName: 'Czech' },
1671
+ { locale: 'da', nativeName: 'Danish' },
1672
+ { locale: 'et', nativeName: 'Estonian' },
1673
+ { locale: 'fi', nativeName: 'Finnish' },
1674
+ { locale: 'fr', nativeName: 'French' },
1675
+ { locale: 'de-informal', nativeName: 'German' },
1676
+ { locale: 'el', nativeName: 'Greek' },
1677
+ { locale: 'hu', nativeName: 'Hungarian' },
1678
+ { locale: 'it', nativeName: 'Italian' },
1679
+ { locale: 'ja', nativeName: 'Japanese' },
1680
+ { locale: 'lv', nativeName: 'Latvian' },
1681
+ { locale: 'pl', nativeName: 'Polish' },
1682
+ { locale: 'ro', nativeName: 'Romanian' },
1683
+ { locale: 'ru', nativeName: 'Russian' },
1684
+ { locale: 'sk', nativeName: 'Slovak' },
1685
+ { locale: 'sl', nativeName: 'Slovenian' },
1686
+ { locale: 'es-informal', nativeName: 'Spanish' },
1687
+ { locale: 'sv', nativeName: 'Swedish' },
1688
+ { locale: 'ti', nativeName: 'Tigrinya' },
1689
+ { locale: 'tr', nativeName: 'Turkish' },
1690
+ { locale: 'uk', nativeName: 'Ukrainian' },
1691
+ ],
1692
+ },
1693
+ },
1647
1694
  translationsFullConversation: {
1648
1695
  category: categoryKeys.translations,
1649
1696
  headingText: 'Show translated messages',
@@ -82,8 +82,8 @@ export const useEntryTextTranslation = (controlName: ControlState['name']) => {
82
82
  [t, hasCharacterLimit, characterLimit, text?.label],
83
83
  )
84
84
 
85
- const labelClass: string = useMemo(
86
- () => (text?.label ? 'input__label' : 'visually-hidden'),
85
+ const labelClass = useMemo(
86
+ () => (text?.label ? 'label' : 'visually-hidden'),
87
87
  [text?.label],
88
88
  )
89
89
 
@@ -1,11 +1,21 @@
1
+ import { FC } from 'preact/compat'
1
2
  import { className } from 'lib/css'
2
3
  import Error from './error'
3
4
 
4
- const FormControlWrapper = ({
5
+ type FormControlWrapperProps = {
6
+ contentHint: string
7
+ id: string
8
+ labelText: string
9
+ labelClass: string
10
+ validity: boolean
11
+ errorText: unknown
12
+ }
13
+
14
+ const FormControlWrapper: FC<FormControlWrapperProps> = ({
5
15
  contentHint,
6
16
  id,
7
17
  labelText,
8
- labelClass = className('label'),
18
+ labelClass,
9
19
  validity,
10
20
  errorText,
11
21
  children,
@@ -24,7 +34,7 @@ const FormControlWrapper = ({
24
34
  <Error id={`${id}-error`} error={!validity && errorText} />
25
35
 
26
36
  <div className={className('form-control__wrapper')}>
27
- <label htmlFor={id} className={labelClass}>
37
+ <label htmlFor={id} className={className(labelClass)}>
28
38
  {labelText}
29
39
  </label>
30
40
  {children}
@@ -25,11 +25,6 @@
25
25
  width: 100%;
26
26
  }
27
27
 
28
- .#{$n}-input__label {
29
- font-size: $fontsize-medium;
30
- font-weight: $fontweight-bold;
31
- }
32
-
33
28
  .#{$n}-input__text {
34
29
  appearance: none;
35
30
  flex-grow: 4;
@@ -215,9 +215,9 @@
215
215
  &:last-child::after {
216
216
  content: '';
217
217
  display: block;
218
- flex: 0 0 $spacer;
218
+ flex: 0 0 $spacer * 0.5;
219
219
  width: 100%;
220
- height: $spacer;
220
+ height: $spacer * 0.5;
221
221
  }
222
222
  }
223
223
 
@@ -1,7 +1,6 @@
1
1
  .#{$n}-translation-options {
2
2
  display: flex;
3
3
  flex-direction: column;
4
- gap: $spacer * 0.25;
5
4
  width: 100%;
6
5
  margin: 0;
7
6
 
@@ -10,12 +9,33 @@
10
9
  list-style: none;
11
10
  }
12
11
 
12
+ .#{$n}-translation-options__item--selected {
13
+ margin-bottom: $spacer * 0.5;
14
+
15
+ &::after {
16
+ content: '';
17
+ display: block;
18
+ position: absolute;
19
+ bottom: $spacer * -0.5;
20
+ flex: 0 0 100%;
21
+ width: 100%;
22
+ height: 1px;
23
+ border-bottom: 1px solid $grey-b;
24
+ }
25
+
26
+ + .#{$n}-translation-options__item {
27
+ margin-top: $spacer * 0.5;
28
+ }
29
+ }
30
+
13
31
  .#{$n}-translation-options__item {
14
32
  display: flex;
33
+ position: relative;
34
+ flex-flow: row wrap;
15
35
  align-items: center;
16
36
  gap: $spacer * 0.5;
17
37
  width: 100%;
18
- padding: calc($spacer * 0.25) 0;
38
+ padding: $spacer * 0.5 0;
19
39
  color: $brand3;
20
40
  font-size: $fontsize-small;
21
41
  font-weight: $fontweight-bold;
@@ -25,7 +45,7 @@
25
45
  outline: -webkit-focus-ring-color auto 1px;
26
46
  }
27
47
 
28
- > span {
48
+ span {
29
49
  margin-left: -0.5em;
30
50
  }
31
51