@bethinkpl/design-system 30.1.2 → 30.3.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 (81) hide show
  1. package/dist/design-system.css +1 -1
  2. package/dist/design-system.js +26585 -272
  3. package/dist/design-system.js.map +1 -1
  4. package/dist/lib/js/components/Buttons/IconButton/IconButton.vue.d.ts +4 -0
  5. package/dist/lib/js/components/Cards/Card/Card.vue.d.ts +2 -0
  6. package/dist/lib/js/components/Cards/CardExpandable/CardExpandable.vue.d.ts +13 -0
  7. package/dist/lib/js/components/Chip/Chip.vue.d.ts +8 -0
  8. package/dist/lib/js/components/DatePickers/DateBox/DateBox.vue.d.ts +4 -0
  9. package/dist/lib/js/components/DatePickers/DatePicker/DatePicker.vue.d.ts +4 -0
  10. package/dist/lib/js/components/DatePickers/DateRangePicker/DateRangePicker.vue.d.ts +4 -0
  11. package/dist/lib/js/components/Drawer/DrawerHeader/DrawerHeader.vue.d.ts +44 -14
  12. package/dist/lib/js/components/Drawer/DrawerListItem/DrawerListItem.vue.d.ts +4 -0
  13. package/dist/lib/js/components/Drawer/DrawerSection/DrawerSection.vue.d.ts +12 -0
  14. package/dist/lib/js/components/Form/Checkbox/Checkbox.consts.d.ts +18 -5
  15. package/dist/lib/js/components/Form/Checkbox/Checkbox.vue.d.ts +31 -461
  16. package/dist/lib/js/components/Form/Checkbox/index.d.ts +2 -0
  17. package/dist/lib/js/components/Form/CheckboxGroupField/CheckboxGroupField.consts.d.ts +9 -0
  18. package/dist/lib/js/components/Form/CheckboxGroupField/CheckboxGroupField.types.d.ts +12 -0
  19. package/dist/lib/js/components/Form/CheckboxGroupField/index.d.ts +1 -0
  20. package/dist/lib/js/components/Form/FormControlLabel/FormControlLabel.consts.d.ts +13 -0
  21. package/dist/lib/js/components/Form/FormControlLabel/FormControlLabel.vue.d.ts +28 -0
  22. package/dist/lib/js/components/Form/FormField/FormField.types.d.ts +1 -0
  23. package/dist/lib/js/components/Form/FormField/FormField.utils.d.ts +2 -2
  24. package/dist/lib/js/components/Form/InputField/useInputFieldWithinForm.d.ts +1 -1
  25. package/dist/lib/js/components/Form/RadioButton/RadioButton.vue.d.ts +4 -0
  26. package/dist/lib/js/components/Headers/OverlayHeader/OverlayHeader.vue.d.ts +8 -0
  27. package/dist/lib/js/components/Headers/SectionHeader/SectionHeader.vue.d.ts +8 -0
  28. package/dist/lib/js/components/Icons/Icon/Icon.consts.d.ts +4 -0
  29. package/dist/lib/js/components/Modal/Modal.vue.d.ts +4 -0
  30. package/dist/lib/js/components/Modals/Modal/Modal.vue.d.ts +8 -0
  31. package/dist/lib/js/components/Modals/ModalDialog/ModalDialog.vue.d.ts +8 -0
  32. package/dist/lib/js/components/Outline/OutlineItem/OutlineItem.vue.d.ts +4 -0
  33. package/dist/lib/js/components/Pagination/Pagination.vue.d.ts +12 -0
  34. package/dist/lib/js/components/ProgressBar/ProgressBar.vue.d.ts +4 -0
  35. package/dist/lib/js/components/ProgressDonutChart/ProgressDonutChart.vue.d.ts +4 -0
  36. package/dist/lib/js/components/RichList/BasicRichListItem/BasicRichListItem.vue.d.ts +69 -469
  37. package/dist/lib/js/components/RichList/RichListItem/RichListItem.vue.d.ts +69 -469
  38. package/dist/lib/js/components/SelectList/SelectListItem/SelectListItem.vue.d.ts +4 -0
  39. package/dist/lib/js/components/SelectList/SelectListItemToggle/SelectListItemToggle.vue.d.ts +4 -0
  40. package/dist/lib/js/components/SelectionTile/SelectionTile.vue.d.ts +29 -1533
  41. package/dist/lib/js/components/Statuses/AccessStatus/AccessStatus.vue.d.ts +4 -0
  42. package/dist/lib/js/components/Statuses/BlockadeStatus/BlockadeStatus.vue.d.ts +4 -0
  43. package/dist/lib/js/components/SurveyQuestions/SurveyQuestionOpenEnded/SurveyQuestionOpenEnded.vue.d.ts +21 -0
  44. package/dist/lib/js/components/SurveyQuestions/SurveyQuestionScale/SurveyQuestionScale.vue.d.ts +21 -0
  45. package/dist/lib/js/components/Switch/Switch.vue.d.ts +4 -0
  46. package/dist/lib/js/components/Tile/Tile.sb.shared.d.ts +4 -0
  47. package/dist/lib/js/components/Toast/Toast.vue.d.ts +9 -0
  48. package/dist/lib/js/components/Toggles/ToggleButton/ToggleButton.vue.d.ts +4 -0
  49. package/dist/lib/js/composables/useFormFieldWithinForm.d.ts +7 -0
  50. package/dist/lib/js/icons/fontawesome.d.ts +4 -0
  51. package/dist/storybook/localhost:8080/node_modules/.vite/deps/@bethinkpl_design-system.js?v=62a0baa6 +7919 -0
  52. package/lib/js/components/Cards/Card/Card.spec.ts +23 -0
  53. package/lib/js/components/Cards/Card/Card.stories.ts +1 -0
  54. package/lib/js/components/Cards/Card/Card.vue +21 -4
  55. package/lib/js/components/Drawer/DrawerHeader/DrawerHeader.vue +13 -13
  56. package/lib/js/components/Form/Checkbox/Checkbox.consts.ts +27 -10
  57. package/lib/js/components/Form/Checkbox/Checkbox.spec.ts +294 -0
  58. package/lib/js/components/Form/Checkbox/Checkbox.stories.ts +60 -19
  59. package/lib/js/components/Form/Checkbox/Checkbox.vue +272 -55
  60. package/lib/js/components/Form/Checkbox/index.ts +2 -0
  61. package/lib/js/components/Form/CheckboxGroupField/CheckboxGroupField.consts.ts +11 -0
  62. package/lib/js/components/Form/CheckboxGroupField/CheckboxGroupField.spec.ts +268 -0
  63. package/lib/js/components/Form/CheckboxGroupField/CheckboxGroupField.stories.ts +92 -0
  64. package/lib/js/components/Form/CheckboxGroupField/CheckboxGroupField.types.ts +13 -0
  65. package/lib/js/components/Form/CheckboxGroupField/CheckboxGroupField.vue +97 -0
  66. package/lib/js/components/Form/CheckboxGroupField/index.ts +1 -0
  67. package/lib/js/components/Form/Form.stories.ts +67 -0
  68. package/lib/js/components/Form/FormControlLabel/FormControlLabel.consts.ts +16 -0
  69. package/lib/js/components/Form/FormControlLabel/FormControlLabel.vue +61 -0
  70. package/lib/js/components/Form/FormField/FormField.types.ts +2 -1
  71. package/lib/js/components/Form/FormField/FormField.utils.ts +14 -10
  72. package/lib/js/components/Form/FormField/FormField.vue +3 -2
  73. package/lib/js/components/Form/InputField/InputField.vue +1 -7
  74. package/lib/js/components/Form/InputField/useInputFieldWithinForm.ts +4 -29
  75. package/lib/js/components/RichList/RichListItem/RichListItem.vue +11 -8
  76. package/lib/js/components/SelectionTile/SelectionTile.vue +64 -95
  77. package/lib/js/composables/useFormFieldWithinForm.ts +26 -0
  78. package/lib/js/composables/useLegacyI18n.ts +0 -1
  79. package/lib/js/icons/fontawesome.ts +8 -0
  80. package/lib/styles/settings/_animations.scss +3 -0
  81. package/package.json +7 -2
@@ -7,21 +7,26 @@
7
7
  '-ds-default': state === SELECTION_TILE_STATE.DEFAULT,
8
8
  '-ds-disabled': state === SELECTION_TILE_STATE.DISABLED,
9
9
  '-ds-loading': isLoading,
10
- '-ds-focused': inputIsFocused && !isLoading,
11
10
  },
12
11
  ]"
13
12
  @click="updateIsSelected(!isSelected)"
14
13
  >
15
14
  <div class="ds-selectionTile__wrapper">
16
- <component
17
- :is="type === SELECTION_TILE_TYPE.RADIO_BUTTON ? 'radio-button' : 'checkbox'"
15
+ <radio-button
16
+ v-if="type === SELECTION_TILE_TYPE.RADIO_BUTTON"
18
17
  :size="SELECTION_CONTROL_SIZE.X_SMALL"
19
18
  :is-selected="isSelected"
20
19
  :state="SELECTION_CONTROL_STATE_MAP[state]"
21
20
  @update:is-selected="updateIsSelected($event)"
22
- @input:focus="onInputFocus"
23
- @input:blur="onInputBlur"
24
21
  />
22
+ <checkbox
23
+ v-else
24
+ :size="CHECKBOX_SIZES.X_SMALL"
25
+ :model-value="isSelected"
26
+ :state="CHECKBOX_STATE_MAP[state]"
27
+ @update:model-value="(value) => updateIsSelected(value !== false)"
28
+ />
29
+
25
30
  <div class="ds-selectionTile__textWrapper">
26
31
  <div class="ds-selectionTile__title">{{ title }}</div>
27
32
 
@@ -102,8 +107,8 @@ $selection-tile-min-height: 48px;
102
107
  display: flex;
103
108
  }
104
109
 
105
- &:hover:not(.-ds-loading),
106
- &.-ds-focused {
110
+ &:focus-within:not(.-ds-loading),
111
+ &:hover:not(.-ds-loading) {
107
112
  background-color: $color-neutral-background-weak-hovered;
108
113
  outline-color: $color-neutral-border-hovered;
109
114
  }
@@ -112,8 +117,8 @@ $selection-tile-min-height: 48px;
112
117
  background-color: $color-primary-background;
113
118
  outline-color: $color-primary-border;
114
119
 
115
- &:hover:not(.-ds-loading),
116
- &.-ds-focused {
120
+ &:focus-within:not(.-ds-loading),
121
+ &:hover:not(.-ds-loading) {
117
122
  background-color: $color-primary-background-hovered;
118
123
  outline-color: $color-primary-border-hovered;
119
124
  }
@@ -153,8 +158,8 @@ $selection-tile-min-height: 48px;
153
158
  }
154
159
  </style>
155
160
 
156
- <script lang="ts">
157
- import { defineAsyncComponent, defineComponent, PropType, toRaw } from 'vue';
161
+ <script setup lang="ts">
162
+ import { computed } from 'vue';
158
163
  import {
159
164
  SELECTION_TILE_STATE,
160
165
  SELECTION_TILE_TYPE,
@@ -166,97 +171,61 @@ import Icon from '../Icons/Icon/Icon.vue';
166
171
  import {
167
172
  SELECTION_CONTROL_SIZE,
168
173
  SELECTION_CONTROL_STATE,
174
+ SelectionControlState,
169
175
  } from '../Form/SelectionControl/SelectionControl.consts';
170
- import SelectionControl from '../Form/SelectionControl/SelectionControl.vue';
176
+ import { CHECKBOX_SIZES, CHECKBOX_STATES, CheckboxState } from '../Form/Checkbox';
177
+ import Checkbox from '../Form/Checkbox/Checkbox.vue';
178
+ import RadioButton from '../Form/RadioButton/RadioButton.vue';
171
179
 
172
- const SELECTION_CONTROL_STATE_MAP = {
180
+ const SELECTION_CONTROL_STATE_MAP: Record<SelectionTileState, SelectionControlState> = {
173
181
  [SELECTION_TILE_STATE.DEFAULT]: SELECTION_CONTROL_STATE.DEFAULT,
174
182
  [SELECTION_TILE_STATE.LOADING]: SELECTION_CONTROL_STATE.LOADING,
175
183
  [SELECTION_TILE_STATE.DISABLED]: SELECTION_CONTROL_STATE.DISABLED,
176
184
  };
177
185
 
178
- export default defineComponent({
179
- name: 'SelectionTile',
180
- components: {
181
- SelectionControl,
182
- Icon,
183
- Checkbox: defineAsyncComponent(() => import('../Form/Checkbox/Checkbox.vue')),
184
- RadioButton: defineAsyncComponent(() => import('../Form/RadioButton/RadioButton.vue')),
185
- },
186
- props: {
187
- type: {
188
- type: String as PropType<SelectionTileType>,
189
- default: SELECTION_TILE_TYPE.RADIO_BUTTON,
190
- validator(type: SelectionTileType) {
191
- return Object.values(SELECTION_TILE_TYPE).includes(type);
192
- },
193
- },
194
- title: {
195
- type: String,
196
- required: true,
197
- },
198
- supportingText: {
199
- type: String,
200
- default: null,
201
- },
202
- icon: {
203
- type: Object,
204
- default: null,
205
- validator(icon: IconItem) {
206
- return Object.values(ICONS).includes(toRaw(icon));
207
- },
208
- },
209
- isSelected: {
210
- type: Boolean,
211
- default: false,
212
- },
213
- state: {
214
- type: String as PropType<SelectionTileState>,
215
- default: SELECTION_TILE_STATE.DEFAULT,
216
- validator(state: SelectionTileState) {
217
- return Object.values(SELECTION_TILE_STATE).includes(state);
218
- },
219
- },
220
- },
221
- // TODO fix me when touching this file
222
- // eslint-disable-next-line vue/require-emit-validator
223
- emits: ['update:is-selected', 'icon-click'],
224
- data() {
225
- return {
226
- ICONS: Object.freeze(ICONS),
227
- ICON_SIZES: Object.freeze(ICON_SIZES),
228
- SELECTION_CONTROL_SIZE: Object.freeze(SELECTION_CONTROL_SIZE),
229
- SELECTION_TILE_STATE: Object.freeze(SELECTION_TILE_STATE),
230
- SELECTION_TILE_TYPE: Object.freeze(SELECTION_TILE_TYPE),
231
- SELECTION_CONTROL_STATE_MAP,
232
- inputIsFocused: false,
233
- };
234
- },
235
- computed: {
236
- isLoading() {
237
- return this.state === SELECTION_TILE_STATE.LOADING;
238
- },
239
- },
240
- methods: {
241
- updateIsSelected(value: boolean) {
242
- if (this.isLoading || this.state === SELECTION_TILE_STATE.DISABLED) {
243
- return;
244
- }
186
+ const CHECKBOX_STATE_MAP: Record<SelectionTileState, CheckboxState> = {
187
+ [SELECTION_TILE_STATE.DEFAULT]: CHECKBOX_STATES.DEFAULT,
188
+ [SELECTION_TILE_STATE.LOADING]: CHECKBOX_STATES.DEFAULT,
189
+ [SELECTION_TILE_STATE.DISABLED]: CHECKBOX_STATES.DISABLED,
190
+ };
245
191
 
246
- this.$emit('update:is-selected', value);
247
- },
248
- onIconClick(event: Event) {
249
- if (!this.isLoading) {
250
- event.stopPropagation();
251
- this.$emit('icon-click');
252
- }
253
- },
254
- onInputFocus() {
255
- this.inputIsFocused = true;
256
- },
257
- onInputBlur() {
258
- this.inputIsFocused = false;
259
- },
260
- },
192
+ // Props
193
+ const {
194
+ type = SELECTION_TILE_TYPE.RADIO_BUTTON,
195
+ supportingText = null,
196
+ icon = null,
197
+ isSelected = false,
198
+ state = SELECTION_TILE_STATE.DEFAULT,
199
+ } = defineProps<{
200
+ type?: SelectionTileType;
201
+ title: string;
202
+ supportingText?: string | null;
203
+ icon?: IconItem | null;
204
+ isSelected?: boolean;
205
+ state?: SelectionTileState;
206
+ }>();
207
+
208
+ const emit = defineEmits<{
209
+ 'update:is-selected': [value: boolean];
210
+ 'icon-click': [];
211
+ }>();
212
+
213
+ const isLoading = computed(() => {
214
+ return state === SELECTION_TILE_STATE.LOADING;
261
215
  });
216
+
217
+ const updateIsSelected = (value: boolean) => {
218
+ if (isLoading.value || state === SELECTION_TILE_STATE.DISABLED) {
219
+ return;
220
+ }
221
+
222
+ emit('update:is-selected', value);
223
+ };
224
+
225
+ const onIconClick = (event: Event) => {
226
+ if (!isLoading.value) {
227
+ event.stopPropagation();
228
+ emit('icon-click');
229
+ }
230
+ };
262
231
  </script>
@@ -0,0 +1,26 @@
1
+ import { inject, MaybeRefOrGetter, ref, Ref, toValue } from 'vue';
2
+ import { FormContextKey, useField } from 'vee-validate';
3
+
4
+ export function useFormFieldWithinForm<T = string>(
5
+ name: MaybeRefOrGetter<string | undefined>,
6
+ modelValue: Ref<T | undefined>,
7
+ ) {
8
+ const nameValue = toValue(name);
9
+ const form = inject(FormContextKey, null);
10
+
11
+ if (nameValue && !form) {
12
+ throw new Error(
13
+ `Field with name "${name}" must be used within a component that provides a FormContext, e.g. by using useForm()`,
14
+ );
15
+ }
16
+
17
+ const field = nameValue ? useField<Array<string>>(nameValue, undefined) : null;
18
+
19
+ const value = field ? field.value : modelValue;
20
+
21
+ return {
22
+ field,
23
+ value,
24
+ errors: field?.errors ?? ref<Array<string>>([]),
25
+ };
26
+ }
@@ -16,7 +16,6 @@ export const useLegacyI18n = (): IUseLegacyI18n => {
16
16
  throw new Error('useLegacyI18n must be called within a Vue component');
17
17
  }
18
18
 
19
- // @ts-expect-error
20
19
  const t = internalInstance.root.proxy.$t;
21
20
 
22
21
  return {
@@ -151,6 +151,7 @@ import { faSquare } from '@fortawesome/pro-regular-svg-icons/faSquare';
151
151
  import { faSquareCaretRight } from '@fortawesome/pro-regular-svg-icons/faSquareCaretRight';
152
152
  import { faSquareCheck } from '@fortawesome/pro-regular-svg-icons/faSquareCheck';
153
153
  import { faSquareList } from '@fortawesome/pro-regular-svg-icons/faSquareList';
154
+ import { faSquareMinus } from '@fortawesome/pro-regular-svg-icons/faSquareMinus';
154
155
  import { faStar } from '@fortawesome/pro-regular-svg-icons/faStar';
155
156
  import { faTag } from '@fortawesome/pro-regular-svg-icons/faTag';
156
157
  import { faTags } from '@fortawesome/pro-regular-svg-icons/faTags';
@@ -225,6 +226,9 @@ import { faChevronLeft as falChevronLeft } from '@fortawesome/pro-light-svg-icon
225
226
  import { faChevronRight as falChevronRight } from '@fortawesome/pro-light-svg-icons/faChevronRight';
226
227
 
227
228
  import { faSpinnerThird as fadSpinnerThird } from '@fortawesome/pro-duotone-svg-icons/faSpinnerThird';
229
+ import { faSquareMinus as fadSquareMinus } from '@fortawesome/duotone-regular-svg-icons/faSquareMinus';
230
+ import { faSquare as fadSquare } from '@fortawesome/duotone-regular-svg-icons/faSquare';
231
+ import { faSquareCheck as fadSquareCheck } from '@fortawesome/pro-duotone-svg-icons/faSquareCheck';
228
232
 
229
233
  import { faFacebook } from '@fortawesome/free-brands-svg-icons/faFacebook';
230
234
  import { faUserGear } from '@fortawesome/pro-regular-svg-icons/faUserGear';
@@ -441,6 +445,7 @@ export const FONTAWESOME_ICONS = {
441
445
  FA_SQUARE_CHECK: faSquareCheck,
442
446
  FA_SQUARE_LIST_SOLID: fasSquareList,
443
447
  FA_SQUARE_LIST: faSquareList,
448
+ FA_SQUARE_MINUS: faSquareMinus,
444
449
  FA_SQUARE: faSquare,
445
450
  FA_STAR_SOLID: fasStar,
446
451
  FA_STAR: faStar,
@@ -470,6 +475,9 @@ export const FONTAWESOME_ICONS = {
470
475
  FA_WINDOW_MAXIMIZE: faWindowMaximize,
471
476
  FA_XMARK: faXmark,
472
477
  FAD_SPINNER_THIRD: fadSpinnerThird,
478
+ FAD_SQUARE_MINUS: fadSquareMinus,
479
+ FAD_SQUARE: fadSquare,
480
+ FAD_SQUARE_CHECK: fadSquareCheck,
473
481
  } as const;
474
482
 
475
483
  export function initialize() {
@@ -19,3 +19,6 @@
19
19
  }
20
20
 
21
21
  $default-transition-time: 0.3s;
22
+
23
+ // see https://cubic-bezier.com/#.23,1,.32,1
24
+ $default-cubic-bezier-transition: all $default-transition-time cubic-bezier(0.23, 1, 0.32, 1) 0ms;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bethinkpl/design-system",
3
- "version": "30.1.2",
3
+ "version": "30.3.0",
4
4
  "description": "Bethink universe design-system",
5
5
  "repository": {
6
6
  "type": "git",
@@ -41,6 +41,7 @@
41
41
  "synchronizeTypography": "npx ts-node tools/importers/SynchronizeTypographyTokens.ts"
42
42
  },
43
43
  "devDependencies": {
44
+ "@fortawesome/duotone-regular-svg-icons": "7.0.1",
44
45
  "@fortawesome/fontawesome-svg-core": "7.0.1",
45
46
  "@fortawesome/free-brands-svg-icons": "7.0.1",
46
47
  "@fortawesome/pro-duotone-svg-icons": "7.0.1",
@@ -53,6 +54,7 @@
53
54
  "@storybook/addon-controls": "^8.3.4",
54
55
  "@storybook/addon-designs": "^8.0.3",
55
56
  "@storybook/addon-docs": "^8.3.4",
57
+ "@storybook/addon-essentials": "8.6.14",
56
58
  "@storybook/addon-storysource": "^8.3.4",
57
59
  "@storybook/addon-viewport": "^8.3.4",
58
60
  "@storybook/vue3": "^8.3.4",
@@ -60,6 +62,7 @@
60
62
  "@types/node": "^17.0.9",
61
63
  "@typescript-eslint/eslint-plugin": "8.45.0",
62
64
  "@typescript-eslint/parser": "8.45.0",
65
+ "@vee-validate/zod": "4.15.1",
63
66
  "@vitejs/plugin-vue": "^5.1.4",
64
67
  "@vitest/coverage-c8": "0.33.0",
65
68
  "@vitest/ui": "3.1.4",
@@ -100,11 +103,13 @@
100
103
  "vue-popperjs": "github:bethinkpl/vue-popper#df07fdb562d604fad966f0e8d6db1fc48febad6e",
101
104
  "vue-tsc": "2.2.10",
102
105
  "wait-for-expect": "^3.0.2",
103
- "yaml-eslint-parser": "^1.3.0"
106
+ "yaml-eslint-parser": "^1.3.0",
107
+ "zod": "4.1.12"
104
108
  },
105
109
  "dependencies": {
106
110
  "@primevue/themes": "4.0.0-rc.3",
107
111
  "primevue": "4.0.0-rc.3",
112
+ "reka-ui": "2.6.0",
108
113
  "vee-validate": "4.15.1",
109
114
  "vue-component-type-helpers": "2.2.10"
110
115
  },